2009-04-14 00:44 UTC+0200 Viktor Szakats (harbour.01 syenar hu)
* utils/hbmk2/hbmk2.prg
+ Added -workdir:<dir> cmdline option to override default
working dir (arch/comp) in -inc mode.
+ Added support for working directory in -inc mode.
Due to lack of output dir option in certain compilers
(most sadly in gcc family), these compilers will have to
be executed for each input file, slightly reducing
performance. I hope some day their developers will add such
basic option.
+ -quiet option will now suppress the header lines for
executed commands, creating a good progress output with
'-trace -quiet'.
! Fixed output related regressions in msvc/bcc.
* Removed explicit warning level settings from C compiler
options. User can override if needed.
* Returns errorlevel 19 instead of 9 in help mode. Now
returns 9 if the working dir couldn't be created.
! Fixed resource compiler command for bcc, msvc, pocc.
Turns out none of them supported multiple inputs.
% Minor code size optimization in target output dependency
checking.
This commit is contained in:
@@ -8,6 +8,29 @@
|
||||
2009-12-31 13:59 UTC+0100 Foo Bar (foo.bar foobar.org)
|
||||
*/
|
||||
|
||||
2009-04-14 00:44 UTC+0200 Viktor Szakats (harbour.01 syenar hu)
|
||||
* utils/hbmk2/hbmk2.prg
|
||||
+ Added -workdir:<dir> cmdline option to override default
|
||||
working dir (arch/comp) in -inc mode.
|
||||
+ Added support for working directory in -inc mode.
|
||||
Due to lack of output dir option in certain compilers
|
||||
(most sadly in gcc family), these compilers will have to
|
||||
be executed for each input file, slightly reducing
|
||||
performance. I hope some day their developers will add such
|
||||
basic option.
|
||||
+ -quiet option will now suppress the header lines for
|
||||
executed commands, creating a good progress output with
|
||||
'-trace -quiet'.
|
||||
! Fixed output related regressions in msvc/bcc.
|
||||
* Removed explicit warning level settings from C compiler
|
||||
options. User can override if needed.
|
||||
* Returns errorlevel 19 instead of 9 in help mode. Now
|
||||
returns 9 if the working dir couldn't be created.
|
||||
! Fixed resource compiler command for bcc, msvc, pocc.
|
||||
Turns out none of them supported multiple inputs.
|
||||
% Minor code size optimization in target output dependency
|
||||
checking.
|
||||
|
||||
2009-04-13 21:44 UTC+0200 Viktor Szakats (harbour.01 syenar hu)
|
||||
* utils/hbmk2/hbmk2.prg
|
||||
! Fixed to delete stub object in -inc mode.
|
||||
|
||||
@@ -116,7 +116,7 @@
|
||||
/* TODO: Optimizations (speed/memory). */
|
||||
/* TODO: Incremental support:
|
||||
- handle libs? (problematic)
|
||||
- creating intermediate files in '_arch/comp' subdir
|
||||
- Reuse Harbour .c output for different compiler targets.
|
||||
- 'clean' option? */
|
||||
|
||||
/* PLANNING:
|
||||
@@ -341,6 +341,8 @@ PROCEDURE Main( ... )
|
||||
LOCAL lCreateDyn := .F.
|
||||
LOCAL lAcceptLDClipper := .F.
|
||||
|
||||
LOCAL cWorkDir := NIL
|
||||
|
||||
LOCAL aParams
|
||||
LOCAL aParam
|
||||
LOCAL cParam
|
||||
@@ -369,7 +371,7 @@ PROCEDURE Main( ... )
|
||||
ShowHeader()
|
||||
ShowHelp()
|
||||
PauseForKey()
|
||||
ErrorLevel( 9 )
|
||||
ErrorLevel( 19 )
|
||||
RETURN
|
||||
ENDIF
|
||||
|
||||
@@ -395,7 +397,7 @@ PROCEDURE Main( ... )
|
||||
ShowHeader()
|
||||
ShowHelp( .T. )
|
||||
PauseForKey()
|
||||
ErrorLevel( 9 )
|
||||
ErrorLevel( 19 )
|
||||
RETURN
|
||||
|
||||
CASE cParamL == "--version"
|
||||
@@ -1098,6 +1100,10 @@ PROCEDURE Main( ... )
|
||||
AAdd( s_aOPTRUN , PathSepToTarget( cParam, 2 ) )
|
||||
ENDIF
|
||||
|
||||
CASE Left( cParamL, Len( "-workdir:" ) ) == "-workdir:"
|
||||
|
||||
cWorkDir := PathSepToTarget( ArchCompFilter( SubStr( cParam, Len( "-workdir:" ) + 1 ) ) )
|
||||
|
||||
CASE Left( cParam, 2 ) == "-l" .AND. ;
|
||||
Len( cParam ) > 2 .AND. ;
|
||||
!( Left( cParam, 3 ) == "-l-" )
|
||||
@@ -1216,6 +1222,21 @@ PROCEDURE Main( ... )
|
||||
RETURN
|
||||
ENDIF
|
||||
|
||||
IF s_lINC
|
||||
IF cWorkDir == NIL
|
||||
cWorkDir := t_cARCH + hb_osPathSeparator() + t_cCOMP
|
||||
ENDIF
|
||||
AAdd( s_aOPTPRG, "-o" + cWorkDir + hb_osPathSeparator() ) /* NOTE: Ending path sep is important. */
|
||||
IF ! DirBuild( cWorkDir )
|
||||
OutErr( "hbmk: Error: Working directory cannot be created: " + cWorkDir + hb_osNewLine() )
|
||||
PauseForKey()
|
||||
ErrorLevel( 9 )
|
||||
RETURN
|
||||
ENDIF
|
||||
ELSE
|
||||
cWorkDir := ""
|
||||
ENDIF
|
||||
|
||||
IF ! lStopAfterInit .AND. ! lStopAfterHarbour
|
||||
|
||||
/* If -o with full name wasn't specified, let's
|
||||
@@ -1234,7 +1255,7 @@ PROCEDURE Main( ... )
|
||||
s_aPRG_TODO := {}
|
||||
FOR EACH tmp IN s_aPRG
|
||||
IF ! hb_FGetDateTime( tmp, @tmp1 ) .OR. ;
|
||||
! hb_FGetDateTime( FN_ExtSet( tmp, ".c" ), @tmp2 ) .OR. ;
|
||||
! hb_FGetDateTime( FN_DirExtSet( tmp, cWorkDir, ".c" ), @tmp2 ) .OR. ;
|
||||
tmp1 > tmp2
|
||||
AAdd( s_aPRG_TODO, tmp )
|
||||
ENDIF
|
||||
@@ -1265,7 +1286,7 @@ PROCEDURE Main( ... )
|
||||
s_aOPTPRG } )
|
||||
|
||||
IF s_lTRACE
|
||||
IF ! s_lDONTEXEC .OR. ! t_lQuiet
|
||||
IF ! t_lQuiet
|
||||
OutStd( "hbmk: Harbour compiler command (internal):" + hb_osNewLine() )
|
||||
ENDIF
|
||||
OutStd( DirAddPathSep( PathSepToSelf( s_cHB_BIN_INSTALL ) ) + cBin_CompPRG +;
|
||||
@@ -1292,7 +1313,7 @@ PROCEDURE Main( ... )
|
||||
cCommand := AllTrim( cCommand )
|
||||
|
||||
IF s_lTRACE
|
||||
IF ! s_lDONTEXEC .OR. ! t_lQuiet
|
||||
IF ! t_lQuiet
|
||||
OutStd( "hbmk: Harbour compiler command:" + hb_osNewLine() )
|
||||
ENDIF
|
||||
OutStd( cCommand + hb_osNewLine() )
|
||||
@@ -1361,6 +1382,7 @@ PROCEDURE Main( ... )
|
||||
{LL} list of lib files
|
||||
{FC} flags for C compiler (user + automatic)
|
||||
{FL} flags for linker (user + automatic)
|
||||
{OW} working dir (when in -inc mode)
|
||||
{OD} output dir
|
||||
{OO} output object (when in -hbcmp mode)
|
||||
{OE} output executable
|
||||
@@ -1398,7 +1420,12 @@ PROCEDURE Main( ... )
|
||||
cBin_Lib := t_cCCPREFIX + "ar"
|
||||
cOpt_Lib := "{FA} rcs {OL} {LO}"
|
||||
cBin_CompC := t_cCCPREFIX + iif( t_cCOMP == "gpp" .OR. s_lCPP, "g++", "gcc" )
|
||||
cOpt_CompC := "-c -O3 {FC} {LC} -I{DI}"
|
||||
cOpt_CompC := "-c -O3 {FC} -I{DI}"
|
||||
IF s_lINC .AND. ! Empty( cWorkDir )
|
||||
cOpt_CompC += " {IC} -o {OO}"
|
||||
ELSE
|
||||
cOpt_CompC += " {LC}"
|
||||
ENDIF
|
||||
cBin_Link := cBin_CompC
|
||||
cOpt_Link := "{LO} {LA} {FL} {DL}"
|
||||
IF ! Empty( t_cCCPATH )
|
||||
@@ -1535,7 +1562,12 @@ PROCEDURE Main( ... )
|
||||
cLibExt := ""
|
||||
cObjExt := ".o"
|
||||
cBin_CompC := t_cCCPREFIX + "gcc.exe"
|
||||
cOpt_CompC := "-c -O3 {FC} {LC} -I{DI}"
|
||||
cOpt_CompC := "-c -O3 {FC} -I{DI}"
|
||||
IF s_lINC .AND. ! Empty( cWorkDir )
|
||||
cOpt_CompC += " {IC} -o {OO}"
|
||||
ELSE
|
||||
cOpt_CompC += " {LC}"
|
||||
ENDIF
|
||||
cBin_Link := cBin_CompC
|
||||
cOpt_Link := "{LO} {LA} {LS} {FL} {DL}"
|
||||
cLibPathPrefix := "-L"
|
||||
@@ -1617,7 +1649,12 @@ PROCEDURE Main( ... )
|
||||
cLibExt := ""
|
||||
cObjExt := ".o"
|
||||
cBin_CompC := "gcc.exe"
|
||||
cOpt_CompC := "-c -O3 {FC} {LC} -I{DI}"
|
||||
cOpt_CompC := "-c -O3 {FC} -I{DI}"
|
||||
IF s_lINC .AND. ! Empty( cWorkDir )
|
||||
cOpt_CompC += " {IC} -o {OO}"
|
||||
ELSE
|
||||
cOpt_CompC += " {LC}"
|
||||
ENDIF
|
||||
cBin_Link := cBin_CompC
|
||||
cOpt_Link := "{LO} {LA} {FL} {DL}"
|
||||
cLibPathPrefix := "-L"
|
||||
@@ -1656,7 +1693,12 @@ PROCEDURE Main( ... )
|
||||
cLibExt := ""
|
||||
cObjExt := ".o"
|
||||
cBin_CompC := "gcc.exe"
|
||||
cOpt_CompC := "-c -O3 {FC} {LC} -I{DI}{SCRIPT}"
|
||||
cOpt_CompC := "-c -O3 {FC} -I{DI}"
|
||||
IF s_lINC .AND. ! Empty( cWorkDir )
|
||||
cOpt_CompC += " {IC} -o {OO}"
|
||||
ELSE
|
||||
cOpt_CompC += " {LC}{SCRIPT}"
|
||||
ENDIF
|
||||
cBin_Link := cBin_CompC
|
||||
cOpt_Link := "{LO} {LA} {FL} {DL}{SCRIPT}"
|
||||
cLibPathPrefix := "-L"
|
||||
@@ -1694,7 +1736,12 @@ PROCEDURE Main( ... )
|
||||
cLibPathPrefix := "LIBPATH "
|
||||
cLibPathSep := " "
|
||||
cBin_CompC := "wpp386.exe"
|
||||
cOpt_CompC := "-zq -w3 -5r -fp5 -onaehtri+ -s -ei -zp4 -zt0 -bt=DOS {FC} -i{DI} {LC}"
|
||||
cOpt_CompC := "-zq -5r -fp5 -onaehtri+ -s -ei -zp4 -zt0 -bt=DOS {FC} -i{DI}"
|
||||
IF s_lINC .AND. ! Empty( cWorkDir )
|
||||
cOpt_CompC += " {IC} -fo={OO}"
|
||||
ELSE
|
||||
cOpt_CompC += " {LC}"
|
||||
ENDIF
|
||||
cBin_Link := "wlink.exe"
|
||||
cOpt_Link := "SYS causeway {FL} NAME {OE} {LO} {DL} {LL}{SCRIPT}"
|
||||
cBin_Lib := "wlib.exe"
|
||||
@@ -1716,7 +1763,12 @@ PROCEDURE Main( ... )
|
||||
cLibPathPrefix := "LIBPATH "
|
||||
cLibPathSep := " "
|
||||
cBin_CompC := "wpp386.exe"
|
||||
cOpt_CompC := "-zq -w3 -6s -fp6 -onaehtri+ -s -ei -zp4 -zt0 -bt=NT {FC} -i{DI} {LC}"
|
||||
cOpt_CompC := "-zq -6s -fp6 -onaehtri+ -s -ei -zp4 -zt0 -bt=NT {FC} -i{DI}"
|
||||
IF s_lINC .AND. ! Empty( cWorkDir )
|
||||
cOpt_CompC += " {IC} -fo={OO}"
|
||||
ELSE
|
||||
cOpt_CompC += " {LC}"
|
||||
ENDIF
|
||||
cBin_Link := "wlink.exe"
|
||||
cOpt_Link := "{FL} NAME {OE} {LO} {DL} {LL} {LS}{SCRIPT}"
|
||||
cBin_Lib := "wlib.exe"
|
||||
@@ -1768,7 +1820,12 @@ PROCEDURE Main( ... )
|
||||
cLibPathPrefix := "LIBPATH "
|
||||
cLibPathSep := " "
|
||||
cBin_CompC := "wpp386.exe"
|
||||
cOpt_CompC := "-zq -w3 -5r -fp5 -onaehtri+ -s -ei -zp4 -zt0 -bt=OS2 {FC} -i{DI} {LC}"
|
||||
cOpt_CompC := "-zq -5r -fp5 -onaehtri+ -s -ei -zp4 -zt0 -bt=OS2 {FC} -i{DI}"
|
||||
IF s_lINC .AND. ! Empty( cWorkDir )
|
||||
cOpt_CompC += " {IC} -fo={OO}"
|
||||
ELSE
|
||||
cOpt_CompC += " {LC}"
|
||||
ENDIF
|
||||
cBin_Link := "wlink.exe"
|
||||
cOpt_Link := "{FL} NAME {OE} {LO} {DL} {LL}{SCRIPT}"
|
||||
cBin_Lib := "wlib.exe"
|
||||
@@ -1797,7 +1854,12 @@ PROCEDURE Main( ... )
|
||||
cLibPathPrefix := "LIBPATH "
|
||||
cLibPathSep := " "
|
||||
cBin_CompC := "wpp386"
|
||||
cOpt_CompC := "-zq -w3 -6r -fp6 -onaehtri+ -s -ei -zp4 -zt0 -bt=LINUX {FC} -i{DI} {LC}"
|
||||
cOpt_CompC := "-zq -6r -fp6 -onaehtri+ -s -ei -zp4 -zt0 -bt=LINUX {FC} -i{DI}"
|
||||
IF s_lINC .AND. ! Empty( cWorkDir )
|
||||
cOpt_CompC += " {IC} -fo={OO}"
|
||||
ELSE
|
||||
cOpt_CompC += " {LC}"
|
||||
ENDIF
|
||||
cBin_Link := "wlink"
|
||||
cOpt_Link := "SYS LINUX {FL} NAME {OE} {LO} {DL} {LL}{SCRIPT}"
|
||||
cBin_Lib := "wlib"
|
||||
@@ -1838,20 +1900,24 @@ PROCEDURE Main( ... )
|
||||
cBin_CompC := "bcc32.exe"
|
||||
cOpt_CompC := "-c -q -tWM -O2 -OS -Ov -Oi -Oc -d {FC} -I{DI} {LC}"
|
||||
cBin_Res := "brcc32.exe"
|
||||
cOpt_Res := "{LR}"
|
||||
cOpt_Res := "{IR} -fo{OS}"
|
||||
cResExt := ".res"
|
||||
cBin_Link := "ilink32.exe"
|
||||
cOpt_Link := "-Gn -C -ap -Tpe -L{DL} {FL} c0d32.obj {LO}, {OE}, " + iif( s_lMAP, "{OM}", "nul" ) + ", cw32mt.lib {LL} import32.lib,, {LS}{SCRIPT}"
|
||||
cLibPathPrefix := ""
|
||||
cLibPathSep := ";"
|
||||
IF lStopAfterCComp .AND. ! lCreateLib .AND. ! lCreateDyn
|
||||
IF ( Len( s_aPRG ) + Len( s_aC ) ) == 1
|
||||
AAdd( s_aOPTC, "-o{OO}" )
|
||||
ELSE
|
||||
AAdd( s_aOPTC, "-n{OD}" )
|
||||
IF s_lINC
|
||||
IF ! Empty( cWorkDir )
|
||||
AAdd( s_aOPTC, "-n{OW}" )
|
||||
ENDIF
|
||||
ELSE
|
||||
AAdd( s_aOPTC, "-e{OE}" )
|
||||
IF lStopAfterCComp .AND. ! lCreateLib .AND. ! lCreateDyn
|
||||
IF ( Len( s_aPRG ) + Len( s_aC ) ) == 1
|
||||
AAdd( s_aOPTC, "-o{OO}" )
|
||||
ELSE
|
||||
AAdd( s_aOPTC, "-n{OD}" )
|
||||
ENDIF
|
||||
ENDIF
|
||||
ENDIF
|
||||
IF s_lSHARED
|
||||
AAdd( s_aLIBPATH, "{DB}" )
|
||||
@@ -1895,7 +1961,7 @@ PROCEDURE Main( ... )
|
||||
ENDIF
|
||||
cOpt_Lib := "{FA} /out:{OL} {LO}"
|
||||
cOpt_Dyn := "{FD} /dll /out:{OD} {DL} {LO} {LL} {LS}"
|
||||
cOpt_CompC := "-nologo -c -W3 {FC} -I{DI} {LC}"
|
||||
cOpt_CompC := "-nologo -c {FC} -I{DI} {LC}"
|
||||
cOpt_Link := "-nologo {LO} {DL} {FL} {LL} {LS}"
|
||||
cLibPathPrefix := "/libpath:"
|
||||
cLibPathSep := " "
|
||||
@@ -1930,14 +1996,18 @@ PROCEDURE Main( ... )
|
||||
AAdd( s_aOPTL, "/opt:icf" )
|
||||
AAdd( s_aOPTL, "/manifest:no" )
|
||||
ENDIF
|
||||
IF lStopAfterCComp .AND. ! lCreateLib .AND. ! lCreateDyn
|
||||
IF ( Len( s_aPRG ) + Len( s_aC ) ) == 1
|
||||
AAdd( s_aOPTC, "-Fo{OO}" )
|
||||
ELSE
|
||||
AAdd( s_aOPTC, "-Fo{OD}" )
|
||||
IF s_lINC
|
||||
IF ! Empty( cWorkDir )
|
||||
AAdd( s_aOPTC, "-Fo{OW}\" ) /* NOTE: Ending path sep is important. */
|
||||
ENDIF
|
||||
ELSE
|
||||
AAdd( s_aOPTC, "-Fe{OE}" )
|
||||
IF lStopAfterCComp .AND. ! lCreateLib .AND. ! lCreateDyn
|
||||
IF ( Len( s_aPRG ) + Len( s_aC ) ) == 1
|
||||
AAdd( s_aOPTC, "-Fo{OO}" )
|
||||
ELSE
|
||||
AAdd( s_aOPTC, "-Fo{OD}" )
|
||||
ENDIF
|
||||
ENDIF
|
||||
ENDIF
|
||||
IF s_lSHARED
|
||||
AAdd( s_aOPTL, "/libpath:{DB}" )
|
||||
@@ -1962,7 +2032,7 @@ PROCEDURE Main( ... )
|
||||
|
||||
IF !( t_cCOMP $ "icc|iccia64" )
|
||||
cBin_Res := "rc.exe"
|
||||
cOpt_Res := "/r {LR}"
|
||||
cOpt_Res := "/fo {OS} {IR}"
|
||||
cResExt := ".res"
|
||||
ENDIF
|
||||
|
||||
@@ -2007,17 +2077,13 @@ PROCEDURE Main( ... )
|
||||
CASE t_cCOMP == "poccarm"
|
||||
AAdd( s_aOPTC, "/Tarm-coff" )
|
||||
ENDCASE
|
||||
cOpt_Res := "{LR}"
|
||||
cOpt_Res := "/Fo{OS} {IR}"
|
||||
cResExt := ".res"
|
||||
cOpt_Lib := "{FA} /out:{OL} {LO}"
|
||||
IF s_lMT
|
||||
AAdd( s_aOPTC, "/MT" )
|
||||
ENDIF
|
||||
IF lStopAfterCComp .AND. ! lCreateLib .AND. ! lCreateDyn
|
||||
IF ( Len( s_aPRG ) + Len( s_aC ) ) == 1
|
||||
AAdd( s_aOPTC, "/Fo{OO}" )
|
||||
ENDIF
|
||||
ELSE
|
||||
IF !( lStopAfterCComp .AND. ! lCreateLib .AND. ! lCreateDyn )
|
||||
AAdd( s_aOPTL, "/out:{OE}" )
|
||||
ENDIF
|
||||
cOpt_Link := "{LO} {DL} {FL} {LL} {LS}"
|
||||
@@ -2160,7 +2226,7 @@ PROCEDURE Main( ... )
|
||||
ELSE
|
||||
OutErr( "hbmk: Warning: Stub helper .c program couldn't be created." + hb_osNewLine() )
|
||||
IF ! s_lINC
|
||||
AEval( ListDirExt( s_aPRG, "", ".c" ), {|tmp| FErase( tmp ) } )
|
||||
AEval( ListDirExt( s_aPRG, cWorkDir, ".c" ), {|tmp| FErase( tmp ) } )
|
||||
ENDIF
|
||||
PauseForKey()
|
||||
ErrorLevel( 5 )
|
||||
@@ -2195,14 +2261,14 @@ PROCEDURE Main( ... )
|
||||
s_aLIB := ArrayJoin( ListCookLib( s_aLIBSHARED, cLibPrefix ), s_aLIB )
|
||||
ENDIF
|
||||
/* Dress obj names. */
|
||||
s_aOBJ := ListDirExt( ArrayJoin( s_aPRG, s_aC ), "", cObjExt )
|
||||
s_aOBJ := ListDirExt( ArrayJoin( s_aPRG, s_aC ), cWorkDir, cObjExt )
|
||||
s_aOBJUSER := ListCook( s_aOBJUSER, NIL, cObjExt )
|
||||
|
||||
IF s_lINC
|
||||
s_aRESSRC_TODO := {}
|
||||
FOR EACH tmp IN s_aRESSRC
|
||||
IF ! hb_FGetDateTime( tmp, @tmp1 ) .OR. ;
|
||||
! hb_FGetDateTime( FN_ExtSet( tmp, cResExt ), @tmp2 ) .OR. ;
|
||||
! hb_FGetDateTime( FN_DirExtSet( tmp, cWorkDir, cResExt ), @tmp2 ) .OR. ;
|
||||
tmp1 > tmp2
|
||||
AAdd( s_aRESSRC_TODO, tmp )
|
||||
ENDIF
|
||||
@@ -2228,12 +2294,12 @@ PROCEDURE Main( ... )
|
||||
|
||||
cCommand := cOpt_Res
|
||||
cCommand := StrTran( cCommand, "{IR}", tmp )
|
||||
cCommand := StrTran( cCommand, "{OS}", PathSepToTarget( FN_ExtSet( tmp, cResExt ) ) )
|
||||
cCommand := StrTran( cCommand, "{OS}", PathSepToTarget( FN_DirExtSet( tmp, cWorkDir, cResExt ) ) )
|
||||
|
||||
cCommand := cBin_Res + " " + AllTrim( cCommand )
|
||||
|
||||
IF s_lTRACE
|
||||
IF ! s_lDONTEXEC .OR. ! t_lQuiet
|
||||
IF ! t_lQuiet
|
||||
OutStd( "hbmk: Resource compiler command:" + hb_osNewLine() )
|
||||
ENDIF
|
||||
OutStd( cCommand + hb_osNewLine() )
|
||||
@@ -2266,7 +2332,7 @@ PROCEDURE Main( ... )
|
||||
cCommand := cBin_Res + " " + cOpt_Res
|
||||
|
||||
IF s_lTRACE
|
||||
IF ! s_lDONTEXEC .OR. ! t_lQuiet
|
||||
IF ! t_lQuiet
|
||||
OutStd( "hbmk: Resource compiler command:" + hb_osNewLine() )
|
||||
ENDIF
|
||||
OutStd( cCommand + hb_osNewLine() )
|
||||
@@ -2294,7 +2360,7 @@ PROCEDURE Main( ... )
|
||||
s_aC_DONE := {}
|
||||
FOR EACH tmp IN s_aC
|
||||
IF ! hb_FGetDateTime( tmp, @tmp1 ) .OR. ;
|
||||
! hb_FGetDateTime( FN_ExtSet( tmp, cObjExt ), @tmp2 ) .OR. ;
|
||||
! hb_FGetDateTime( FN_DirExtSet( tmp, cWorkDir, cObjExt ), @tmp2 ) .OR. ;
|
||||
tmp1 > tmp2
|
||||
AAdd( s_aC_TODO, tmp )
|
||||
ELSE
|
||||
@@ -2310,8 +2376,8 @@ PROCEDURE Main( ... )
|
||||
s_aPRG_TODO := {}
|
||||
s_aPRG_DONE := {}
|
||||
FOR EACH tmp IN s_aPRG
|
||||
IF ! hb_FGetDateTime( FN_ExtSet( tmp, ".c" ), @tmp1 ) .OR. ;
|
||||
! hb_FGetDateTime( FN_ExtSet( tmp, cObjExt ), @tmp2 ) .OR. ;
|
||||
IF ! hb_FGetDateTime( FN_DirExtSet( tmp, cWorkDir, ".c" ), @tmp1 ) .OR. ;
|
||||
! hb_FGetDateTime( FN_DirExtSet( tmp, cWorkDir, cObjExt ), @tmp2 ) .OR. ;
|
||||
tmp1 > tmp2
|
||||
AAdd( s_aPRG_TODO, tmp )
|
||||
ELSE
|
||||
@@ -2339,7 +2405,7 @@ PROCEDURE Main( ... )
|
||||
GetEnv( "HB_USER_CFLAGS" ) + " " + ArrayToList( s_aOPTC ) )
|
||||
cOpt_CompC := StrTran( cOpt_CompC, "{FL}" , iif( s_lBLDFLGL, cSelfFlagL + " ", "" ) +;
|
||||
GetEnv( "HB_USER_LDFLAGS" ) + " " + ArrayToList( s_aOPTL ) )
|
||||
cOpt_CompC := StrTran( cOpt_CompC, "{LR}" , ArrayToList( ArrayJoin( ListDirExt( s_aRESSRC, "", cResExt ), s_aRESCMP ) ) )
|
||||
cOpt_CompC := StrTran( cOpt_CompC, "{LR}" , ArrayToList( ArrayJoin( ListDirExt( s_aRESSRC, cWorkDir, cResExt ), s_aRESCMP ) ) )
|
||||
cOpt_CompC := StrTran( cOpt_CompC, "{LO}" , ArrayToList( ArrayAJoin( { ListCook( s_aOBJUSER, cObjPrefix ), ListCook( s_aPRG_DONE, cObjPrefix, cObjExt ), ListCook( s_aC_DONE, cObjPrefix, cObjExt ) } ) ) )
|
||||
cOpt_CompC := StrTran( cOpt_CompC, "{LS}" , ArrayToList( ListCook( ArrayJoin( ListDirExt( s_aRESSRC, "", cResExt ), s_aRESCMP ), cResPrefix ) ) )
|
||||
cOpt_CompC := StrTran( cOpt_CompC, "{LA}" , ArrayToList( s_aOBJA ) )
|
||||
@@ -2353,16 +2419,16 @@ PROCEDURE Main( ... )
|
||||
|
||||
IF "{IC}" $ cOpt_CompC
|
||||
|
||||
FOR EACH tmp IN ArrayJoin( ListDirExt( s_aPRG_TODO, "", ".c" ), s_aC_TODO )
|
||||
FOR EACH tmp IN ArrayJoin( ListDirExt( s_aPRG_TODO, cWorkDir, ".c" ), s_aC_TODO )
|
||||
|
||||
cCommand := cOpt_CompC
|
||||
cCommand := StrTran( cCommand, "{IC}", tmp )
|
||||
cCommand := StrTran( cCommand, "{OO}", PathSepToTarget( NameDirExt( tmp, "", cObjExt ) ) )
|
||||
cCommand := StrTran( cCommand, "{OO}", PathSepToTarget( FN_DirExtSet( tmp, cWorkDir, cObjExt ) ) )
|
||||
|
||||
cCommand := cBin_CompC + " " + AllTrim( cCommand )
|
||||
|
||||
IF s_lTRACE
|
||||
IF ! s_lDONTEXEC .OR. ! t_lQuiet
|
||||
IF ! t_lQuiet
|
||||
OutStd( "hbmk: C compiler command:" + hb_osNewLine() )
|
||||
ENDIF
|
||||
OutStd( cCommand + hb_osNewLine() )
|
||||
@@ -2376,8 +2442,9 @@ PROCEDURE Main( ... )
|
||||
ENDIF
|
||||
NEXT
|
||||
ELSE
|
||||
cOpt_CompC := StrTran( cOpt_CompC, "{LC}" , ArrayToList( ArrayJoin( ListDirExt( s_aPRG_TODO, "", ".c" ), s_aC_TODO ) ) )
|
||||
cOpt_CompC := StrTran( cOpt_CompC, "{LC}" , ArrayToList( ArrayJoin( ListDirExt( s_aPRG_TODO, cWorkDir, ".c" ), s_aC_TODO ) ) )
|
||||
cOpt_CompC := StrTran( cOpt_CompC, "{OO}" , PathSepToTarget( FN_ExtSet( s_cPROGNAME, cObjExt ) ) )
|
||||
cOpt_CompC := StrTran( cOpt_CompC, "{OW}" , PathSepToTarget( cWorkDir ) )
|
||||
|
||||
cOpt_CompC := AllTrim( cOpt_CompC )
|
||||
|
||||
@@ -2396,7 +2463,7 @@ PROCEDURE Main( ... )
|
||||
cCommand := cBin_CompC + " " + cOpt_CompC
|
||||
|
||||
IF s_lTRACE
|
||||
IF ! s_lDONTEXEC .OR. ! t_lQuiet
|
||||
IF ! t_lQuiet
|
||||
OutStd( "hbmk: C compiler command:" + hb_osNewLine() )
|
||||
ENDIF
|
||||
OutStd( cCommand + hb_osNewLine() )
|
||||
@@ -2438,39 +2505,7 @@ PROCEDURE Main( ... )
|
||||
|
||||
lTargetUpToDate := .T.
|
||||
IF lTargetUpToDate
|
||||
FOR EACH tmp IN s_aOBJ
|
||||
IF ! hb_FGetDateTime( tmp, @tmp1 ) .OR. tmp1 > tTarget
|
||||
lTargetUpToDate := .F.
|
||||
EXIT
|
||||
ENDIF
|
||||
NEXT
|
||||
ENDIF
|
||||
IF lTargetUpToDate
|
||||
FOR EACH tmp IN s_aOBJUSER
|
||||
IF ! hb_FGetDateTime( tmp, @tmp1 ) .OR. tmp1 > tTarget
|
||||
lTargetUpToDate := .F.
|
||||
EXIT
|
||||
ENDIF
|
||||
NEXT
|
||||
ENDIF
|
||||
IF lTargetUpToDate
|
||||
FOR EACH tmp IN s_aOBJA
|
||||
IF ! hb_FGetDateTime( tmp, @tmp1 ) .OR. tmp1 > tTarget
|
||||
lTargetUpToDate := .F.
|
||||
EXIT
|
||||
ENDIF
|
||||
NEXT
|
||||
ENDIF
|
||||
IF lTargetUpToDate
|
||||
FOR EACH tmp IN s_aRESSRC
|
||||
IF ! hb_FGetDateTime( FN_ExtSet( tmp, cResExt ), @tmp1 ) .OR. tmp1 > tTarget
|
||||
lTargetUpToDate := .F.
|
||||
EXIT
|
||||
ENDIF
|
||||
NEXT
|
||||
ENDIF
|
||||
IF lTargetUpToDate
|
||||
FOR EACH tmp IN s_aRESCMP
|
||||
FOR EACH tmp IN ArrayAJoin( { s_aOBJ, s_aOBJUSER, s_aOBJA, s_aRESSRC, s_aRESCMP } )
|
||||
IF ! hb_FGetDateTime( tmp, @tmp1 ) .OR. tmp1 > tTarget
|
||||
lTargetUpToDate := .F.
|
||||
EXIT
|
||||
@@ -2495,7 +2530,7 @@ PROCEDURE Main( ... )
|
||||
IF nErrorLevel == 0 .AND. ( Len( s_aOBJ ) + Len( s_aOBJUSER ) + Len( s_aOBJA ) ) > 0
|
||||
|
||||
IF lTargetUpToDate
|
||||
OutStd( "hbmk: Target already up to date: " + cTarget + hb_osNewLine() )
|
||||
OutStd( "hbmk: Target up to date: " + cTarget + hb_osNewLine() )
|
||||
ELSE
|
||||
DO CASE
|
||||
CASE ! lStopAfterCComp .AND. ! Empty( cBin_Link )
|
||||
@@ -2510,7 +2545,7 @@ PROCEDURE Main( ... )
|
||||
cOpt_Link := StrTran( cOpt_Link, "{FL}" , iif( s_lBLDFLGL, cSelfFlagL + " ", "" ) +;
|
||||
GetEnv( "HB_USER_LDFLAGS" ) + " " + ArrayToList( s_aOPTL ) )
|
||||
cOpt_Link := StrTran( cOpt_Link, "{LO}" , ArrayToList( ListCook( ArrayJoin( s_aOBJ, s_aOBJUSER ), cObjPrefix ) ) )
|
||||
cOpt_Link := StrTran( cOpt_Link, "{LS}" , ArrayToList( ListCook( ArrayJoin( ListDirExt( s_aRESSRC, "", cResExt ), s_aRESCMP ), cResPrefix ) ) )
|
||||
cOpt_Link := StrTran( cOpt_Link, "{LS}" , ArrayToList( ListCook( ArrayJoin( ListDirExt( s_aRESSRC, cWorkDir, cResExt ), s_aRESCMP ), cResPrefix ) ) )
|
||||
cOpt_Link := StrTran( cOpt_Link, "{LA}" , ArrayToList( s_aOBJA ) )
|
||||
cOpt_Link := StrTran( cOpt_Link, "{LL}" , ArrayToList( s_aLIB ) )
|
||||
cOpt_Link := StrTran( cOpt_Link, "{OE}" , PathSepToTarget( FN_ExtSet( s_cPROGNAME, cBinExt ) ) )
|
||||
@@ -2535,7 +2570,7 @@ PROCEDURE Main( ... )
|
||||
cCommand := cBin_Link + " " + cOpt_Link
|
||||
|
||||
IF s_lTRACE
|
||||
IF ! s_lDONTEXEC .OR. ! t_lQuiet
|
||||
IF ! t_lQuiet
|
||||
OutStd( "hbmk: Linker command:" + hb_osNewLine() )
|
||||
ENDIF
|
||||
OutStd( cCommand + hb_osNewLine() )
|
||||
@@ -2588,7 +2623,7 @@ PROCEDURE Main( ... )
|
||||
cCommand := cBin_Lib + " " + cOpt_Lib
|
||||
|
||||
IF s_lTRACE
|
||||
IF ! s_lDONTEXEC .OR. ! t_lQuiet
|
||||
IF ! t_lQuiet
|
||||
OutStd( "hbmk: Lib command:" + hb_osNewLine() )
|
||||
ENDIF
|
||||
OutStd( cCommand + hb_osNewLine() )
|
||||
@@ -2619,7 +2654,7 @@ PROCEDURE Main( ... )
|
||||
/* Order is significant */
|
||||
cOpt_Dyn := StrTran( cOpt_Dyn, "{FD}" , GetEnv( "HB_USER_DFLAGS" ) + " " + ArrayToList( s_aOPTD ) )
|
||||
cOpt_Dyn := StrTran( cOpt_Dyn, "{LO}" , ArrayToList( ListCook( ArrayJoin( s_aOBJ, s_aOBJUSER ), cDynObjPrefix ) ) )
|
||||
cOpt_Dyn := StrTran( cOpt_Dyn, "{LS}" , ArrayToList( ListCook( ArrayJoin( ListDirExt( s_aRESSRC, "", cResExt ), s_aRESCMP ), cResPrefix ) ) )
|
||||
cOpt_Dyn := StrTran( cOpt_Dyn, "{LS}" , ArrayToList( ListCook( ArrayJoin( ListDirExt( s_aRESSRC, cWorkDir, cResExt ), s_aRESCMP ), cResPrefix ) ) )
|
||||
cOpt_Dyn := StrTran( cOpt_Dyn, "{LL}" , ArrayToList( s_aLIB ) )
|
||||
cOpt_Dyn := StrTran( cOpt_Dyn, "{OD}" , PathSepToTarget( FN_ExtSet( s_cPROGNAME, cDynLibExt ) ) )
|
||||
cOpt_Dyn := StrTran( cOpt_Dyn, "{OM}" , PathSepToTarget( FN_ExtSet( s_cPROGNAME, ".map" ) ) )
|
||||
@@ -2643,7 +2678,7 @@ PROCEDURE Main( ... )
|
||||
cCommand := cBin_Dyn + " " + cOpt_Dyn
|
||||
|
||||
IF s_lTRACE
|
||||
IF ! s_lDONTEXEC .OR. ! t_lQuiet
|
||||
IF ! t_lQuiet
|
||||
OutStd( "hbmk: Dynamic lib link command:" + hb_osNewLine() )
|
||||
ENDIF
|
||||
OutStd( cCommand + hb_osNewLine() )
|
||||
@@ -2671,15 +2706,15 @@ PROCEDURE Main( ... )
|
||||
|
||||
IF ! Empty( s_cCSTUB )
|
||||
FErase( s_cCSTUB )
|
||||
FErase( NameDirExt( s_cCSTUB, "", cObjExt ) )
|
||||
FErase( FN_DirExtSet( s_cCSTUB, "", cObjExt ) )
|
||||
ENDIF
|
||||
IF ! s_lINC
|
||||
AEval( ListDirExt( s_aPRG, "", ".c" ), {|tmp| FErase( tmp ) } )
|
||||
AEval( ListDirExt( s_aPRG, cWorkDir, ".c" ), {|tmp| FErase( tmp ) } )
|
||||
ENDIF
|
||||
IF ! lStopAfterCComp .OR. lCreateLib .OR. lCreateDyn
|
||||
IF ! s_lINC
|
||||
IF ! Empty( cResExt )
|
||||
AEval( ListDirExt( s_aRESSRC, "", cResExt ), {|tmp| FErase( tmp ) } )
|
||||
AEval( ListDirExt( s_aRESSRC, cWorkDir, cResExt ), {|tmp| FErase( tmp ) } )
|
||||
ENDIF
|
||||
AEval( s_aOBJ, {|tmp| FErase( tmp ) } )
|
||||
ENDIF
|
||||
@@ -2709,7 +2744,7 @@ PROCEDURE Main( ... )
|
||||
cCommand := cBin_Cprs + " " + cOpt_Cprs
|
||||
|
||||
IF s_lTRACE
|
||||
IF ! s_lDONTEXEC .OR. ! t_lQuiet
|
||||
IF ! t_lQuiet
|
||||
OutStd( "hbmk: Compression command:" + hb_osNewLine() )
|
||||
ENDIF
|
||||
OutStd( cCommand + hb_osNewLine() )
|
||||
@@ -2730,7 +2765,7 @@ PROCEDURE Main( ... )
|
||||
#endif
|
||||
cCommand := AllTrim( PathSepToTarget( s_cPROGNAME ) + " " + ArrayToList( s_aOPTRUN ) )
|
||||
IF s_lTRACE
|
||||
IF ! s_lDONTEXEC .OR. ! t_lQuiet
|
||||
IF ! t_lQuiet
|
||||
OutStd( "hbmk: Running executable:" + hb_osNewLine() )
|
||||
ENDIF
|
||||
OutStd( cCommand + hb_osNewLine() )
|
||||
@@ -2862,25 +2897,11 @@ STATIC FUNCTION ListDirExt( arraySrc, cDirNew, cExtNew )
|
||||
LOCAL cFileName
|
||||
|
||||
FOR EACH cFileName IN array
|
||||
cFileName := NameDirExt( cFileName, cDirNew, cExtNew )
|
||||
cFileName := FN_DirExtSet( cFileName, cDirNew, cExtNew )
|
||||
NEXT
|
||||
|
||||
RETURN array
|
||||
|
||||
STATIC FUNCTION NameDirExt( cFileName, cDirNew, cExtNew )
|
||||
LOCAL cDir, cName, cExt
|
||||
|
||||
hb_FNameSplit( cFileName, @cDir, @cName, @cExt )
|
||||
|
||||
IF cDirNew != NIL
|
||||
cDir := cDirNew
|
||||
ENDIF
|
||||
IF cExtNew != NIL
|
||||
cExt := cExtNew
|
||||
ENDIF
|
||||
|
||||
RETURN hb_FNameMerge( cDir, cName, cExt )
|
||||
|
||||
/* Forms the list of libs as to appear on the command line */
|
||||
STATIC FUNCTION ListCookLib( arraySrc, cPrefix, cExtNew )
|
||||
LOCAL array := AClone( arraySrc )
|
||||
@@ -3057,6 +3078,44 @@ STATIC FUNCTION DirDelPathSep( cDir )
|
||||
|
||||
RETURN cDir
|
||||
|
||||
#define hb_DirMake( d ) MakeDir( d )
|
||||
|
||||
FUNCTION DirBuild( cDir )
|
||||
LOCAL cDirTemp
|
||||
LOCAL cDirItem
|
||||
LOCAL tmp
|
||||
|
||||
IF ! hb_DirExists( cDir )
|
||||
|
||||
cDir := DirAddPathSep( cDir )
|
||||
|
||||
IF ! Empty( hb_osDriveSeparator() ) .AND. ;
|
||||
( tmp := At( hb_osDriveSeparator(), cDir ) ) > 0
|
||||
cDirTemp := Left( cDir, tmp )
|
||||
cDir := SubStr( cDir, tmp + 1 )
|
||||
ELSE
|
||||
cDirTemp := ""
|
||||
ENDIF
|
||||
|
||||
FOR EACH cDirItem IN hb_ATokens( cDir, hb_osPathSeparator() )
|
||||
IF !( Right( cDirTemp, 1 ) == hb_osPathSeparator() ) .AND. ! Empty( cDirTemp )
|
||||
cDirTemp += hb_osPathSeparator()
|
||||
ENDIF
|
||||
IF ! Empty( cDirItem ) /* Skip root path, if any */
|
||||
cDirTemp += cDirItem
|
||||
IF hb_FileExists( cDirTemp )
|
||||
RETURN .F.
|
||||
ELSEIF ! hb_DirExists( cDirTemp )
|
||||
IF hb_DirMake( cDirTemp ) != 0
|
||||
RETURN .F.
|
||||
ENDIF
|
||||
ENDIF
|
||||
ENDIF
|
||||
NEXT
|
||||
ENDIF
|
||||
|
||||
RETURN .T.
|
||||
|
||||
STATIC FUNCTION FN_DirGet( cFileName )
|
||||
LOCAL cDir
|
||||
|
||||
@@ -3085,6 +3144,20 @@ STATIC FUNCTION FN_ExtSet( cFileName, cExt )
|
||||
|
||||
RETURN hb_FNameMerge( cDir, cName, cExt )
|
||||
|
||||
STATIC FUNCTION FN_DirExtSet( cFileName, cDirNew, cExtNew )
|
||||
LOCAL cDir, cName, cExt
|
||||
|
||||
hb_FNameSplit( cFileName, @cDir, @cName, @cExt )
|
||||
|
||||
IF cDirNew != NIL
|
||||
cDir := cDirNew
|
||||
ENDIF
|
||||
IF cExtNew != NIL
|
||||
cExt := cExtNew
|
||||
ENDIF
|
||||
|
||||
RETURN hb_FNameMerge( cDir, cName, cExt )
|
||||
|
||||
#define HBMK_CFG_NAME "hbmk.cfg"
|
||||
|
||||
STATIC PROCEDURE HBP_ProcessAll( lConfigOnly,;
|
||||
@@ -3994,6 +4067,8 @@ STATIC PROCEDURE ShowHelp( lLong )
|
||||
" -dflag:<f> pass flag to linker (dynamic library)" ,;
|
||||
" -runflag:<f> pass flag to output executable when -run option is used" ,;
|
||||
" -inc enable incremental build mode" ,;
|
||||
" -workdir:<dir> working directory for incremental build mode" ,;
|
||||
" (default: arch/comp)" ,;
|
||||
" -hbcmp stop after creating the object files" ,;
|
||||
" create link/copy hbmk to hbcmp for the same effect" ,;
|
||||
" -hbcc stop after creating the object files and accept raw C flags" ,;
|
||||
|
||||
Reference in New Issue
Block a user