Truco: Ficheros make, sustitución doble en macros

Truco: Ficheros make, sustitución doble en macros

Postby Antonio Linares » Sun Nov 27, 2011 4:09 pm

Este es un truco que he descubierto recientemente usando la utilidad make de Borland y de Microsoft. Consideremos esta lista:

Code: Select all  Expand view
PRG =          \
.\APPLICAT.PRG \
.\CODE.PRG     \
.\DATABASE.PRG \
.\DEBUG.PRG    \
.\DESIGN.PRG   \
.\INDEX.PRG    \
.\INSPECT.PRG  \
.\MENU.PRG     \
.\OPTIONS.PRG  \
.\PROGRAM.PRG  \
.\PROJECT.PRG  \
.\RECORD.PRG   \
.\REP.PRG      \
.\REPORT.PRG   \
.\RESOURCE.PRG \
.\TOOLBAR.PRG  \
.\TOOLS.PRG    \
.\VISUAL.PRG  


La macro:
OBJ = $(PRG:.PRG=.OBJ)
crea una nueva macro OBJ en donde las ocurrencias .PRG son sustituidas por .OBJ. El truco consiste ahora en crear una nueva macro a partir de esta y realizar otra sustitución:

OBJS = $(OBJ:.\=.\obj\)
reemplazando ".\" con ".\obj\" en la lista.

Ahora podemos usar $(OBJS) para establecer las dependencias del EXE y tambien para enlazar el EXE:
VISUALFW.EXE : $(OBJS) VISUALFW.RES ..\lib\FiveH.lib ..\lib\FiveHC.lib
...
echo $(OBJS), + >> b32.bc

Aqui teneis el fichero make completo, visualfw.mak
Code: Select all  Expand view
#VisualFW Borland make, (c) FiveTech Software 2005-2011

HBDIR=c:\harbour
BCDIR=c:\bcc582
FWDIR=c:\fwh

#change these paths as needed
.path.OBJ = .\obj
.path.PRG = .\
.path.CH  = $(FWDIR)\include;$(HBDIR)\include
.path.C   = .\
.path.rc  = .\

#important: Use Uppercase for filenames extensions!

PRG =          \
.\APPLICAT.PRG \
.\CODE.PRG     \
.\DATABASE.PRG \
.\DEBUG.PRG    \
.\DESIGN.PRG   \
.\INDEX.PRG    \
.\INSPECT.PRG  \
.\MENU.PRG     \
.\OPTIONS.PRG  \
.\PROGRAM.PRG  \
.\PROJECT.PRG  \
.\RECORD.PRG   \
.\REP.PRG      \
.\REPORT.PRG   \
.\RESOURCE.PRG \
.\TOOLBAR.PRG  \
.\TOOLS.PRG    \
.\VISUAL.PRG              

OBJ = $(PRG:.PRG=.OBJ)
OBJS = $(OBJ:.\=.\obj\)

PROJECT    : VISUALFW.EXE

VISUALFW.EXE : $(OBJS) VISUALFW.RES ..\lib\FiveH.lib ..\lib\FiveHC.lib
   echo off
   echo $(BCDIR)\lib\c0w32.obj + > b32.bc
   echo $(OBJS), + >> b32.bc
   echo visualfw.exe, + >> b32.bc
   echo visualfw.map, + >> b32.bc
   echo $(FWDIR)\lib\FiveH.lib $(FWDIR)\lib\FiveHC.lib + >> b32.bc
   echo $(HBDIR)\lib\hbrtl.lib + >> b32.bc
   echo $(HBDIR)\lib\hbvm.lib + >> b32.bc
   echo $(HBDIR)\lib\gtgui.lib + >> b32.bc
   echo $(HBDIR)\lib\hblang.lib + >> b32.bc
   echo $(HBDIR)\lib\hbmacro.lib + >> b32.bc
   echo $(HBDIR)\lib\hbrdd.lib + >> b32.bc
   echo $(HBDIR)\lib\rddntx.lib + >> b32.bc
   echo $(HBDIR)\lib\rddcdx.lib + >> b32.bc
   echo $(HBDIR)\lib\rddfpt.lib + >> b32.bc
   echo $(HBDIR)\lib\hbsix.lib + >> b32.bc
   echo $(HBDIR)\lib\hbdebug.lib + >> b32.bc
   echo $(HBDIR)\lib\hbcommon.lib + >> b32.bc
   echo $(HBDIR)\lib\hbpp.lib + >> b32.bc
   echo $(HBDIR)\lib\hbwin.lib + >> b32.bc
   echo $(HBDIR)\lib\hbcpage.lib + >> b32.bc
   echo $(HBDIR)\lib\hbct.lib + >> b32.bc
   echo $(HBDIR)\lib\hbcplr.lib + >> b32.bc
   echo $(HBDIR)\lib\png.lib + >> b32.bc
   echo $(HBDIR)\lib\hbzlib.lib + >> b32.bc
   echo $(HBDIR)\lib\xhb.lib + >> b32.bc
   
   rem Uncomment these two lines to use Advantage RDD
   rem echo $(HBDIR)\lib\rddads.lib + >> b32.bc
   rem echo $(HBDIR)\lib\Ace32.lib + >> b32.bc

   echo $(BCDIR)\lib\cw32.lib + >> b32.bc
   echo $(BCDIR)\lib\import32.lib + >> b32.bc
   echo $(BCDIR)\lib\psdk\odbc32.lib + >> b32.bc
   echo $(BCDIR)\lib\psdk\nddeapi.lib + >> b32.bc
   echo $(BCDIR)\lib\psdk\iphlpapi.lib + >> b32.bc
   echo $(BCDIR)\lib\psdk\msimg32.lib + >> b32.bc
   echo $(BCDIR)\lib\psdk\psapi.lib + >> b32.bc
   echo $(BCDIR)\lib\psdk\rasapi32.lib, >> b32.bc

   IF EXIST visualfw.res echo visualfw.res >> b32.bc
   $(BCDIR)\bin\ilink32 -Gn -aa -Tpe -s @b32.bc
   del b32.bc

.PRG.OBJ:
  $(HBDIR)\bin\harbour $< /N /W /Oobj\ /I$(FWDIR)\include;$(HBDIR)\include
  $(BCDIR)\bin\bcc32 -c -tWM -I$(HBDIR)\include -oobj\$& obj\$&.c

.C.OBJ:
  echo -c -tWM -D__HARBOUR__ > tmp
  echo -I$(HBDIR)\include;$(FWDIR)\include >> tmp
  $(BCDIR)\bin\bcc32 -oobj\$& @tmp $&.c
  del tmp

VISUALFW.RES : VISUALFW.RC
  $(BCDIR)\bin\brc32.exe -r -I$(BCDIR)\include visualfw.rc


http://basic.phatcode.net/TUT/GDE/NMAKE.HTM#AG
http://web.sau.edu/lilliskevinm/csci240/masmdocs/envtools/26LMAETC16.pdf
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41318
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Truco: Ficheros make, sustitución doble en macros

Postby José Luis Sánchez » Wed Nov 30, 2011 6:27 pm

Hola Antonio,
Estoy intentando usar este ejemplo para construir nuevos makefiles para mis programas y me encuentro con un problema. Mi makefile comienza igual:
Code: Select all  Expand view

#Fivetech Borland make, (c) FiveTech Software 2005-2011

HBDIR=c:\harbour
BCDIR=c:\bcc582
FWDIR=c:\fwh

#change these paths as needed
.path.OBJ = .\obj
.path.PRG = .\prg
.path.CH  = $(FWDIR)\include;$(HBDIR)\include
.path.C   = .\
.path.rc  = .\

#important: Use Uppercase for filenames extensions!
 


el único cambio es que en mis proyectos tengo los fuentes en una carpeta llamada PRG, así que pongo la ruta. Luego sigo igual que en el ejemplo, pero con mis nombre de PRG:

Code: Select all  Expand view

PRG =               \
RUX00.PRG       \
RUX01.PRG       \
RUX02.PRG       \
RUX03.PRG      

OBJ = $(PRG:.PRG=.OBJ)
OBJS = $(OBJ:.\=.\obj)
PROJECT    : DONATE.EXE

DONATE.EXE : $(OBJS) DONATE.RES $(FWDIR)\lib\FiveH.lib $(FWDIR)\lib\FiveHC.lib
   echo off
   echo $(BCDIR)\lib\c0w32.obj + > b32.bc
   echo $(OBJS), + >> b32.bc
   echo donate.exe, + >> b32.bc
   echo donate.map, + >> b32.bc


y elr esto sigue igual. El problema es que al generar el fichero b32.bc el camino de los OBJ ha desaparecido. Aparece lo siguiente:
Code: Select all  Expand view
c:\bcc582\lib\c0w32.obj +
RUX00.OBJ   RUX01.OBJ   RUX02.OBJ   RUX03.OBJ , +
donate.exe, +
donate.map, +


cuando cada obj debería llevar delante .\OBJ\ y al llamar a TLink me salta el error siguiente:

c:\bcc582\bin\ilink32 -Gn -aa -Tpe -s @b32.bc
Turbo Incremental Link 5.69 Copyright (c) 1997-2005 Borland
Fatal: Unable to open file 'RUX00.OBJ'

Si edito a mano el fichero b32.bc y meto delante de cada nombre de OBJ la ruta correspondiente el exe se genera perfectamente, pero me parece un poco chapuza. La verdad es que me gustaría poder usar una macro para meter los OBJ en el fichero de enlazado, pero no llego a ver que hago mal. ¿ Me puedes ayudar ?

Muchas gracias,

José Luis Sánchez
User avatar
José Luis Sánchez
 
Posts: 539
Joined: Thu Oct 13, 2005 9:23 am
Location: Novelda - Alicante - España

Re: Truco: Ficheros make, sustitución doble en macros

Postby Antonio Linares » Wed Nov 30, 2011 8:18 pm

José Luis,

Te falta la última barra del final:

OBJS = $(OBJ:.\=.\obj\)

creo que es eso :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41318
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Truco: Ficheros make, sustitución doble en macros

Postby José Luis Sánchez » Wed Nov 30, 2011 8:46 pm

Gracias por contestar.

Creo que eso no es, lo he cambiado en mi makefile y el b32.bc sigue igual, sin coger las rutas a los obj.
De momento estoy compilando con un fichero de enlazado que he creado y no lo modifico, pero me gustaría poder hacerlo todo desde el mak.

Saludos,
User avatar
José Luis Sánchez
 
Posts: 539
Joined: Thu Oct 13, 2005 9:23 am
Location: Novelda - Alicante - España


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 8 guests