diff --git a/harbour/ChangeLog b/harbour/ChangeLog
index 6e42cca7ff..ab70558243 100644
--- a/harbour/ChangeLog
+++ b/harbour/ChangeLog
@@ -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:
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.
diff --git a/harbour/utils/hbmk2/hbmk2.prg b/harbour/utils/hbmk2/hbmk2.prg
index 2fac8d6795..624a071cfd 100644
--- a/harbour/utils/hbmk2/hbmk2.prg
+++ b/harbour/utils/hbmk2/hbmk2.prg
@@ -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: pass flag to linker (dynamic library)" ,;
" -runflag: pass flag to output executable when -run option is used" ,;
" -inc enable incremental build mode" ,;
+ " -workdir: 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" ,;