FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Truco: Ficheros make, sustitución doble en macros
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Truco: Ficheros make, sustitución doble en macros
Posted: Sun Nov 27, 2011 04:09 PM
Este es un truco que he descubierto recientemente usando la utilidad make de Borland y de Microsoft. Consideremos esta lista:

Code (fw): Select all Collapse
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 (fw): Select all Collapse
#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
Posts: 564
Joined: Thu Oct 13, 2005 09:23 AM
Re: Truco: Ficheros make, sustitución doble en macros
Posted: Wed Nov 30, 2011 06: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 (fw): Select all Collapse
#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 (fw): Select all Collapse
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 (fw): Select all Collapse
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
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Truco: Ficheros make, sustitución doble en macros
Posted: Wed Nov 30, 2011 08: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
Posts: 564
Joined: Thu Oct 13, 2005 09:23 AM
Re: Truco: Ficheros make, sustitución doble en macros
Posted: Wed Nov 30, 2011 08: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,

Continue the discussion