diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 59153fed7c..2bf28c21ac 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,6 +17,22 @@ past entries belonging to author(s): Viktor Szakats. */ +2009-06-20 16:39 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) + * utils/hbmk2/hbmk2.prg + % Reworked space in filename support to be generic. Now all + Windows compilers have it turned on, and this is the only + mode of escaping currently implemented (it may also need + to be revised). + For MinGW it's only turned on when host and target are + both Windows. Notice that MinGW has a few bugs regarding + filename handling, which means you cannot use spaces + in Harbour install path when also using input resource + files and you cannot use spaces as input lib names. + + Added space in filename support for external Harbour + compiler. + ! Fixed not to create working dir, if it's set empty. + * Minor formatting/cleanup. + 2009-06-20 12:16 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) * utils/hbmk2/hbmk2.prg + Added win/pocc* and win/watcom support for input/output diff --git a/harbour/utils/hbmk2/hbmk2.prg b/harbour/utils/hbmk2/hbmk2.prg index 150a152093..342ebfb885 100644 --- a/harbour/utils/hbmk2/hbmk2.prg +++ b/harbour/utils/hbmk2/hbmk2.prg @@ -613,6 +613,7 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) LOCAL cSelfFlagPRG := hb_Version( HB_VERSION_FLAG_PRG ) LOCAL cSelfFlagC := hb_Version( HB_VERSION_FLAG_C ) LOCAL cSelfFlagL := hb_Version( HB_VERSION_FLAG_LINKER ) + LOCAL cSelfARCH := hb_Version( HB_VERSION_BUILD_ARCH ) LOCAL cDL_Version_Alter LOCAL cDL_Version @@ -905,7 +906,7 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) hbmk[ _HBMK_cARCH ] := "dos" EXIT OTHERWISE - hbmk[ _HBMK_cARCH ] := hb_Version( HB_VERSION_BUILD_ARCH ) + hbmk[ _HBMK_cARCH ] := cSelfARCH ENDSWITCH IF ! Empty( hbmk[ _HBMK_cARCH ] ) IF hbmk[ _HBMK_lInfo ] @@ -1911,13 +1912,14 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) ELSE DEFAULT cWorkDir TO FN_DirGet( l_cPROGNAME ) + _WORKDIR_DEF_ ENDIF - AAdd( hbmk[ _HBMK_aOPTPRG ], "-o" + cWorkDir + hb_osPathSeparator() ) /* NOTE: Ending path sep is important. */ - IF ! DirBuild( cWorkDir ) - hbmk_OutErr( hbmk, hb_StrFormat( I_( "Error: Working directory cannot be created: %1$s" ), cWorkDir ) ) - IF l_lBEEP - DoBeep( hbmk, .F. ) + IF ! Empty( cWorkDir ) + IF ! DirBuild( cWorkDir ) + hbmk_OutErr( hbmk, hb_StrFormat( I_( "Error: Working directory cannot be created: %1$s" ), cWorkDir ) ) + IF l_lBEEP + DoBeep( hbmk, .F. ) + ENDIF + RETURN 9 ENDIF - RETURN 9 ENDIF ELSE cWorkDir := "" @@ -1951,14 +1953,14 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) CASE hbmk[ _HBMK_cARCH ] $ "bsd|linux|hpux|sunos" .OR. hbmk[ _HBMK_cARCH ] == "darwin" /* Separated to avoid match with 'win' */ IF Empty( cPrefix ) l_aLIBSHARED := { iif( hbmk[ _HBMK_lMT ], "harbourmt" + cPostfix,; - "harbour" + cPostfix ) } + "harbour" + cPostfix ) } ELSE l_aLIBSHARED := { iif( hbmk[ _HBMK_lMT ], cPrefix + cDynLibNamePrefix + "harbourmt" + cPostfix + cDynLibExt,; - cPrefix + cDynLibNamePrefix + "harbour" + cPostfix + cDynLibExt ) } + cPrefix + cDynLibNamePrefix + "harbour" + cPostfix + cDynLibExt ) } ENDIF CASE hbmk[ _HBMK_cARCH ] $ "os2|win|wce" l_aLIBSHARED := { iif( hbmk[ _HBMK_lMT ], cDynLibNamePrefix + "harbourmt",; - cDynLibNamePrefix + "harbour" ) } + cDynLibNamePrefix + "harbour" ) } OTHERWISE l_aLIBSHARED := NIL ENDCASE @@ -2108,14 +2110,14 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) /* Always inherit/reproduce some flags from self */ - IF "-mlp64" $ cSelfFlagC ; AAddNotExists( hbmk[ _HBMK_aOPTC ], "-mlp64" ) - ELSEIF "-mlp32" $ cSelfFlagC ; AAddNotExists( hbmk[ _HBMK_aOPTC ], "-mlp32" ) - ELSEIF "-m64" $ cSelfFlagC ; AAddNotExists( hbmk[ _HBMK_aOPTC ], "-m64" ) - ELSEIF "-m32" $ cSelfFlagC ; AAddNotExists( hbmk[ _HBMK_aOPTC ], "-m32" ) + IF "-mlp64" $ cSelfFlagC ; AAddNew( hbmk[ _HBMK_aOPTC ], "-mlp64" ) + ELSEIF "-mlp32" $ cSelfFlagC ; AAddNew( hbmk[ _HBMK_aOPTC ], "-mlp32" ) + ELSEIF "-m64" $ cSelfFlagC ; AAddNew( hbmk[ _HBMK_aOPTC ], "-m64" ) + ELSEIF "-m32" $ cSelfFlagC ; AAddNew( hbmk[ _HBMK_aOPTC ], "-m32" ) ENDIF - IF "-fPIC" $ cSelfFlagC ; AAddNotExists( hbmk[ _HBMK_aOPTC ], "-fPIC" ) - ELSEIF "-fpic" $ cSelfFlagC ; AAddNotExists( hbmk[ _HBMK_aOPTC ], "-fpic" ) + IF "-fPIC" $ cSelfFlagC ; AAddNew( hbmk[ _HBMK_aOPTC ], "-fPIC" ) + ELSEIF "-fpic" $ cSelfFlagC ; AAddNew( hbmk[ _HBMK_aOPTC ], "-fpic" ) ENDIF DO CASE @@ -2201,7 +2203,7 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) ENDIF ENDIF cOpt_CompC += " {FC}" - cOptIncMask := '-I"{DI}"' + cOptIncMask := "-I{DI}" IF hbmk[ _HBMK_lINC ] .AND. ! Empty( cWorkDir ) cOpt_CompC += " {IC} -o {OO}" ELSE @@ -2213,12 +2215,15 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) cLibPathSep := " " cLibLibExt := ".a" cBin_Lib := hbmk[ _HBMK_cCCPREFIX ] + "ar" + cCCEXT_mingw + IF cSelfARCH $ "win|wce" + nOpt_Esc := _ESC_DBLQUOTE + ENDIF cOpt_Lib := "{FA} rcs {OL} {LO}" cLibObjPrefix := NIL IF ! Empty( hbmk[ _HBMK_cCCPATH ] ) - cBin_Lib := hbmk[ _HBMK_cCCPATH ] + hb_osPathSeparator() + cBin_Lib - cBin_CompC := hbmk[ _HBMK_cCCPATH ] + hb_osPathSeparator() + cBin_CompC - cBin_Link := hbmk[ _HBMK_cCCPATH ] + hb_osPathSeparator() + cBin_Link + cBin_Lib := FN_Escape( hbmk[ _HBMK_cCCPATH ] + hb_osPathSeparator() + cBin_Lib, nOpt_Esc ) + cBin_CompC := FN_Escape( hbmk[ _HBMK_cCCPATH ] + hb_osPathSeparator() + cBin_CompC, nOpt_Esc ) + cBin_Link := FN_Escape( hbmk[ _HBMK_cCCPATH ] + hb_osPathSeparator() + cBin_Link, nOpt_Esc ) ENDIF IF !( hbmk[ _HBMK_cARCH ] == "wce" ) IF hbmk[ _HBMK_lGUI ] @@ -2273,7 +2278,7 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) cResExt := ".reso" cOpt_Res := "{FR} {IR} -O coff -o {OS}" IF ! Empty( hbmk[ _HBMK_cCCPATH ] ) - cBin_Res := hbmk[ _HBMK_cCCPATH ] + hb_osPathSeparator() + cBin_Res + cBin_Res := FN_Escape( hbmk[ _HBMK_cCCPATH ] + hb_osPathSeparator() + cBin_Res, nOpt_Esc ) ENDIF ENDIF @@ -2454,23 +2459,23 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) cOpt_CompC += " -3s" ENDIF cOpt_CompC += " -zq -bt=NT {FC}" - cOptIncMask := '-i"{DI}"' + cOptIncMask := "-i{DI}" IF hbmk[ _HBMK_lINC ] .AND. ! Empty( cWorkDir ) - cOpt_CompC += ' "{IC}" -fo="{OO}"' + cOpt_CompC += " {IC} -fo={OO}" ELSE cOpt_CompC += " {LC}" ENDIF IF lStopAfterCComp .AND. ! lCreateLib .AND. ! lCreateDyn IF ( Len( l_aPRG ) + Len( l_aC ) ) == 1 - AAdd( hbmk[ _HBMK_aOPTC ], '-fo="{OO}"' ) + AAdd( hbmk[ _HBMK_aOPTC ], "-fo={OO}" ) ELSE - AAdd( hbmk[ _HBMK_aOPTC ], '-fo="{OD}"' ) + AAdd( hbmk[ _HBMK_aOPTC ], "-fo={OD}" ) ENDIF ENDIF cBin_Link := "wlink.exe" - cOpt_Link := '{FL} NAME "{OE}" {LO} {DL} {LL} {LS}{SCRIPT}' + cOpt_Link := "{FL} NAME {OE} {LO} {DL} {LL} {LS}{SCRIPT}" cBin_Lib := "wlib.exe" - cOpt_Lib := '{FA} "{OL}" {LO}{SCRIPT}' + cOpt_Lib := "{FA} {OL} {LO}{SCRIPT}" cLibLibExt := cLibExt cLibObjPrefix := "-+ " IF hbmk[ _HBMK_lMT ] @@ -2503,7 +2508,7 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) IF Len( l_aRESSRC ) > 0 cBin_Res := "wrc" cResExt := ".res" - cOpt_Res := '-r {FR} -zm "{IR}" -fo="{OS}"' + cOpt_Res := "-r {FR} -zm {IR} -fo={OS}" cResPrefix := "OP res=" ENDIF @@ -2632,10 +2637,10 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) cLibExt := ".lib" cObjExt := ".obj" cBin_Lib := "tlib.exe" - cOpt_Lib := '{FA} "{OL}" {LO}{SCRIPT}' + cOpt_Lib := "{FA} {OL} {LO}{SCRIPT}" cLibLibExt := cLibExt cLibObjPrefix := "-+ " - cOptIncMask := '-I"{DI}"' + cOptIncMask := "-I{DI}" cBin_CompC := "bcc32.exe" cOpt_CompC := "-c -q -tWM" IF hbmk[ _HBMK_lOPTIM ] @@ -2643,12 +2648,12 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) ENDIF cOpt_CompC += " {FC} {LC}" cBin_Res := "brcc32.exe" - cOpt_Res := '{FR} "{IR}" -fo"{OS}"' + cOpt_Res := "{FR} {IR} -fo{OS}" cResExt := ".res" cBin_Link := "ilink32.exe" cBin_Dyn := cBin_Link - cOpt_Link := '-Gn -Tpe -L{DL} {FL} ' + iif( hbmk[ _HBMK_lGUI ], "c0w32.obj", "c0x32.obj" ) + ' {LO}, "{OE}", ' + iif( hbmk[ _HBMK_lMAP ], '"{OM}"', "nul" ) + ", {LL} cw32mt.lib import32.lib,, {LS}{SCRIPT}" - cOpt_Dyn := '-Gn -Tpd -L{DL} {FD} ' + "c0d32.obj" + ' {LO}, "{OD}", ' + iif( hbmk[ _HBMK_lMAP ], '"{OM}"', "nul" ) + ", {LL} cw32mt.lib import32.lib,, {LS}{SCRIPT}" + cOpt_Link := '-Gn -Tpe -L{DL} {FL} ' + iif( hbmk[ _HBMK_lGUI ], "c0w32.obj", "c0x32.obj" ) + " {LO}, {OE}, " + iif( hbmk[ _HBMK_lMAP ], "{OM}", "nul" ) + ", {LL} cw32mt.lib import32.lib,, {LS}{SCRIPT}" + cOpt_Dyn := '-Gn -Tpd -L{DL} {FD} ' + "c0d32.obj" + " {LO}, {OD}, " + iif( hbmk[ _HBMK_lMAP ], "{OM}", "nul" ) + ", {LL} cw32mt.lib import32.lib,, {LS}{SCRIPT}" cLibPathPrefix := "" cLibPathSep := ";" IF hbmk[ _HBMK_lGUI ] @@ -2660,14 +2665,14 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) ENDIF IF hbmk[ _HBMK_lINC ] IF ! Empty( cWorkDir ) - AAdd( hbmk[ _HBMK_aOPTC ], '-n"{OW}"' ) + AAdd( hbmk[ _HBMK_aOPTC ], "-n" + FN_Escape( PathSepToTarget( hbmk, cWorkDir ), nOpt_Esc ) ) ENDIF ELSE IF lStopAfterCComp .AND. ! lCreateLib .AND. ! lCreateDyn IF ( Len( l_aPRG ) + Len( l_aC ) ) == 1 - AAdd( hbmk[ _HBMK_aOPTC ], '-o"{OO}"' ) + AAdd( hbmk[ _HBMK_aOPTC ], "-o{OO}" ) ELSE - AAdd( hbmk[ _HBMK_aOPTC ], '-n"{OD}"' ) + AAdd( hbmk[ _HBMK_aOPTC ], "-n{OD}" ) ENDIF ENDIF ENDIF @@ -2733,8 +2738,8 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) cBin_Dyn := cBin_Link ENDIF nOpt_Esc := _ESC_DBLQUOTE - cOpt_Lib := '/nologo {FA} /out:"{OL}" {LO}' - cOpt_Dyn := '{FD} /dll /out:"{OD}" {DL} {LO} {LL} {LS}' + cOpt_Lib := "/nologo {FA} /out:{OL} {LO}" + cOpt_Dyn := "{FD} /dll /out:{OD} {DL} {LO} {LL} {LS}" cOpt_CompC := "-nologo -c -Gs" IF hbmk[ _HBMK_lOPTIM ] IF hbmk[ _HBMK_cCOMP ] == "msvcarm" @@ -2752,8 +2757,8 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) ENDIF ENDIF cOpt_CompC += " {FC} {LC}" - cOptIncMask := '-I"{DI}"' - cOpt_Link := '/nologo /out:"{OE}" {LO} {DL} {FL} {LL} {LS}' + cOptIncMask := "-I{DI}" + cOpt_Link := "/nologo /out:{OE} {LO} {DL} {FL} {LL} {LS}" cLibPathPrefix := "/libpath:" cLibPathSep := " " IF hbmk[ _HBMK_lMAP ] @@ -2789,14 +2794,14 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) ENDIF IF hbmk[ _HBMK_lINC ] IF ! Empty( cWorkDir ) - AAdd( hbmk[ _HBMK_aOPTC ], '-Fo"{OW}\"' ) /* NOTE: Ending path sep is important. */ + AAdd( hbmk[ _HBMK_aOPTC ], "-Fo" + FN_Escape( PathSepToTarget( hbmk, cWorkDir ) + hb_osPathSeparator(), nOpt_Esc ) ) /* NOTE: Ending path sep is important. */ ENDIF ELSE IF lStopAfterCComp .AND. ! lCreateLib .AND. ! lCreateDyn IF ( Len( l_aPRG ) + Len( l_aC ) ) == 1 - AAdd( hbmk[ _HBMK_aOPTC ], '-Fo"{OO}"' ) + AAdd( hbmk[ _HBMK_aOPTC ], "-Fo{OO}" ) ELSE - AAdd( hbmk[ _HBMK_aOPTC ], '-Fo"{OD}"' ) + AAdd( hbmk[ _HBMK_aOPTC ], "-Fo{OD}" ) ENDIF ENDIF ENDIF @@ -2823,7 +2828,7 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) IF !( hbmk[ _HBMK_cCOMP ] $ "icc|iccia64" ) cBin_Res := "rc.exe" - cOpt_Res := '{FR} /fo "{OS}" "{IR}"' + cOpt_Res := "{FR} /fo {OS} {IR}" IF nCCompVer >= 1000 cOpt_Res := "/nologo " + cOpt_Res /* NOTE: Only in MSVC 2010 and upper. [vszakats] */ ENDIF @@ -2866,12 +2871,12 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) ENDIF cOpt_CompC += " {FC}" IF lStopAfterCComp .AND. ! lCreateLib .AND. ! lCreateDyn .AND. ( Len( l_aPRG ) + Len( l_aC ) ) == 1 - cOpt_CompC += ' {LC} /Fo"{OO}"' + cOpt_CompC += " {LC} /Fo{OO}" ELSE - cOpt_CompC += ' "{IC}"' + cOpt_CompC += " {IC}" ENDIF - cOptIncMask := '/I"{DI}"' - cOpt_Dyn := '{FD} /dll /out:"{OD}" {DL} {LO} {LL} {LS}' + cOptIncMask := "/I{DI}" + cOpt_Dyn := "{FD} /dll /out:{OD} {DL} {LO} {LL} {LS}" DO CASE CASE hbmk[ _HBMK_cCOMP ] == "pocc" IF hbmk[ _HBMK_lOPTIM ] @@ -2887,18 +2892,18 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) AAdd( hbmk[ _HBMK_aOPTC ], "-DUNICODE" ) AAdd( hbmk[ _HBMK_aOPTC ], "-DHB_NO_WIN_CONSOLE" ) ENDCASE - cOpt_Res := '{FR} /Fo"{OS}" "{IR}"' + cOpt_Res := "{FR} /Fo{OS} {IR}" cResExt := ".res" - cOpt_Lib := '{FA} /out:"{OL}" {LO}' + cOpt_Lib := "{FA} /out:{OL} {LO}" IF hbmk[ _HBMK_lMT ] AAdd( hbmk[ _HBMK_aOPTC ], "/MT" ) ENDIF IF hbmk[ _HBMK_lINC ] IF ! Empty( cWorkDir ) - AAdd( hbmk[ _HBMK_aOPTC ], '/Fo"{OO}"' ) + AAdd( hbmk[ _HBMK_aOPTC ], "/Fo{OO}" ) ENDIF ENDIF - cOpt_Link := '/out:"{OE}" {LO} {DL} {FL} {LL} {LS}' + cOpt_Link := "/out:{OE} {LO} {DL} {FL} {LL} {LS}" cLibPathPrefix := "/libpath:" cLibPathSep := " " IF hbmk[ _HBMK_lSHARED ] @@ -2942,6 +2947,20 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) ENDIF ENDIF + IF ! lStopAfterInit + IF hbmk[ _HBMK_lINC ] + IF ! Empty( cWorkDir ) + /* NOTE: Ending path sep is important. */ + /* Different escaping for internal and external compiler. */ + IF hbmk[ _HBMK_nHBMODE ] == _HBMODE_NATIVE + AAdd( hbmk[ _HBMK_aOPTPRG ], "-o" + cWorkDir + hb_osPathSeparator() ) + ELSE + AAdd( hbmk[ _HBMK_aOPTPRG ], "-o" + FN_Escape( cWorkDir + hb_osPathSeparator(), nOpt_Esc ) ) + ENDIF + ENDIF + ENDIF + ENDIF + IF ! lStopAfterInit .AND. ! lStopAfterHarbour hb_FNameSplit( l_cPROGNAME, @cDir, @cName, @cExt ) DO CASE @@ -2993,10 +3012,15 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) IF ! lSkipBuild .AND. ! lStopAfterInit FOR EACH tmp IN hbmk[ _HBMK_aINCPATH ] - AAdd( hbmk[ _HBMK_aOPTPRG ], "-i" + tmp ) + /* Different escaping for internal and external compiler. */ + IF hbmk[ _HBMK_nHBMODE ] == _HBMODE_NATIVE + AAdd( hbmk[ _HBMK_aOPTPRG ], "-i" + tmp ) + ELSE + AAdd( hbmk[ _HBMK_aOPTPRG ], "-i" + FN_Escape( tmp, nOpt_Esc ) ) + ENDIF IF ! lStopAfterHarbour - AAdd( hbmk[ _HBMK_aOPTC ], StrTran( cOptIncMask, "{DI}", tmp ) ) - AAdd( hbmk[ _HBMK_aOPTRES ], StrTran( cOptIncMask, "{DI}", tmp ) ) + AAdd( hbmk[ _HBMK_aOPTC ], StrTran( cOptIncMask, "{DI}", FN_Escape( tmp, nOpt_Esc ) ) ) + AAdd( hbmk[ _HBMK_aOPTRES ], StrTran( cOptIncMask, "{DI}", FN_Escape( tmp, nOpt_Esc ) ) ) ENDIF NEXT ENDIF @@ -3098,7 +3122,7 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) hbmk_OutStd( hbmk, I_( "Harbour compiler command (internal):" ) ) ENDIF ENDIF - OutStd( DirAddPathSep( PathSepToSelf( l_cHB_BIN_INSTALL ) ) + cBin_CompPRG + cBinExt +; + OutStd( FN_Escape( DirAddPathSep( PathSepToSelf( l_cHB_BIN_INSTALL ) ) + cBin_CompPRG + cBinExt, nOpt_Esc ) +; " " + ArrayToList( aCommand ) + hb_osNewLine() ) ENDIF @@ -3109,7 +3133,7 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) IF ( tmp := hb_compile( "", aCommand ) ) != 0 hbmk_OutErr( hbmk, hb_StrFormat( I_( "Error: Running Harbour compiler. %1$s" ), hb_ntos( tmp ) ) ) IF ! hbmk[ _HBMK_lQuiet ] - OutErr( DirAddPathSep( PathSepToSelf( l_cHB_BIN_INSTALL ) ) + cBin_CompPRG + cBinExt +; + OutErr( FN_Escape( DirAddPathSep( PathSepToSelf( l_cHB_BIN_INSTALL ) ) + cBin_CompPRG + cBinExt, nOpt_Esc ) +; " " + ArrayToList( aCommand ) + hb_osNewLine() ) ENDIF IF l_lBEEP @@ -3143,13 +3167,12 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) ELSE /* Use external compiler */ - cCommand := DirAddPathSep( PathSepToSelf( l_cHB_BIN_INSTALL ) ) +; - cBin_CompPRG + cBinExt +; + cCommand := FN_Escape( DirAddPathSep( PathSepToSelf( l_cHB_BIN_INSTALL ) ) + cBin_CompPRG + cBinExt, nOpt_Esc ) +; " " + iif( lCreateLib .OR. lCreateDyn, "-n1", iif( hbmk[ _HBMK_nHBMODE ] != _HBMODE_NATIVE, "-n", "-n2" ) ) +; - " " + ArrayToList( l_aPRG_TODO ) +; + " " + ArrayToList( l_aPRG_TODO,, nOpt_Esc ) +; iif( l_lBLDFLGP, " " + cSelfFlagPRG, "" ) +; iif( ! Empty( GetEnv( "HB_USER_PRGFLAGS" ) ), " " + GetEnv( "HB_USER_PRGFLAGS" ), "" ) +; - iif( ! Empty( hbmk[ _HBMK_aOPTPRG ] ), " " + ArrayToList( hbmk[ _HBMK_aOPTPRG ],, nOpt_Esc ), "" ) + iif( ! Empty( hbmk[ _HBMK_aOPTPRG ] ), " " + ArrayToList( hbmk[ _HBMK_aOPTPRG ] ), "" ) cCommand := AllTrim( cCommand ) @@ -3340,10 +3363,10 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) /* Merge lib lists. */ l_aLIBRAW := ArrayAJoin( { hbmk[ _HBMK_aLIBUSER ], l_aLIBHB, l_aLIB3RD, l_aLIBSYS } ) /* Dress lib names. */ - l_aLIB := ListCookLib( hbmk, l_aLIBRAW, cLibPrefix, cLibExt ) + l_aLIB := ListCookLib( hbmk, l_aLIBRAW, cLibExt ) IF hbmk[ _HBMK_lSHARED ] .AND. ! Empty( l_aLIBSHARED ) l_aLIBRAW := ArrayJoin( l_aLIBSHARED, l_aLIBRAW ) - l_aLIB := ArrayJoin( ListCookLib( hbmk, l_aLIBSHARED, cLibPrefix ), l_aLIB ) + l_aLIB := ArrayJoin( ListCookLib( hbmk, l_aLIBSHARED ), l_aLIB ) ENDIF /* Dress obj names. */ l_aOBJ := ListDirExt( ArrayJoin( l_aPRG, l_aC ), cWorkDir, cObjExt ) @@ -3401,15 +3424,15 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) /* Compiling resource */ cOpt_Res := StrTran( cOpt_Res, "{FR}" , GetEnv( "HB_USER_RESFLAGS" ) + " " + ArrayToList( hbmk[ _HBMK_aOPTRES ] ) ) - cOpt_Res := StrTran( cOpt_Res, "{DI}" , l_cHB_INC_INSTALL ) + cOpt_Res := StrTran( cOpt_Res, "{DI}" , FN_Escape( l_cHB_INC_INSTALL, nOpt_Esc ) ) IF "{IR}" $ cOpt_Res FOR EACH tmp IN l_aRESSRC_TODO cCommand := cOpt_Res - cCommand := StrTran( cCommand, "{IR}", tmp ) - cCommand := StrTran( cCommand, "{OS}", PathSepToTarget( hbmk, FN_DirExtSet( tmp, cWorkDir, cResExt ) ) ) + cCommand := StrTran( cCommand, "{IR}", FN_Escape( tmp, nOpt_Esc ) ) + cCommand := StrTran( cCommand, "{OS}", FN_Escape( PathSepToTarget( hbmk, FN_DirExtSet( tmp, cWorkDir, cResExt ) ), nOpt_Esc ) ) cCommand := cBin_Res + " " + AllTrim( cCommand ) @@ -3517,22 +3540,22 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) cOpt_CompC := StrTran( cOpt_CompC, "{LO}" , ArrayToList( ArrayAJoin( { l_aOBJUSER, ListCook( l_aPRG_DONE, cObjExt ), ListCook( l_aC_DONE, cObjExt ) } ),, nOpt_Esc, cObjPrefix ) ) cOpt_CompC := StrTran( cOpt_CompC, "{LS}" , ArrayToList( ArrayJoin( ListDirExt( l_aRESSRC, "", cResExt ), l_aRESCMP ),, nOpt_Esc, cResPrefix ) ) cOpt_CompC := StrTran( cOpt_CompC, "{LA}" , ArrayToList( l_aOBJA,, nOpt_Esc ) ) - cOpt_CompC := StrTran( cOpt_CompC, "{LL}" , ArrayToList( l_aLIB,, nOpt_Esc ) ) - cOpt_CompC := StrTran( cOpt_CompC, "{OD}" , PathSepToTarget( hbmk, FN_DirGet( l_cPROGNAME ) ) ) - cOpt_CompC := StrTran( cOpt_CompC, "{OE}" , PathSepToTarget( hbmk, l_cPROGNAME ) ) - cOpt_CompC := StrTran( cOpt_CompC, "{OM}" , PathSepToTarget( hbmk, FN_ExtSet( l_cPROGNAME, ".map" ) ) ) + cOpt_CompC := StrTran( cOpt_CompC, "{LL}" , ArrayToList( l_aLIB,, nOpt_Esc, cLibPrefix ) ) + cOpt_CompC := StrTran( cOpt_CompC, "{OD}" , FN_Escape( PathSepToTarget( hbmk, FN_DirGet( l_cPROGNAME ) ), nOpt_Esc ) ) + cOpt_CompC := StrTran( cOpt_CompC, "{OE}" , FN_Escape( PathSepToTarget( hbmk, l_cPROGNAME ), nOpt_Esc ) ) + cOpt_CompC := StrTran( cOpt_CompC, "{OM}" , FN_Escape( PathSepToTarget( hbmk, FN_ExtSet( l_cPROGNAME, ".map" ) ), nOpt_Esc ) ) cOpt_CompC := StrTran( cOpt_CompC, "{DL}" , ArrayToList( hbmk[ _HBMK_aLIBPATH ], cLibPathSep, nOpt_Esc, cLibPathPrefix ) ) cOpt_CompC := StrTran( cOpt_CompC, "{DB}" , l_cHB_BIN_INSTALL ) - cOpt_CompC := StrTran( cOpt_CompC, "{DI}" , l_cHB_INC_INSTALL ) + cOpt_CompC := StrTran( cOpt_CompC, "{DI}" , FN_Escape( l_cHB_INC_INSTALL, nOpt_Esc ) ) IF "{IC}" $ cOpt_CompC aThreads := {} FOR EACH aTODO IN ArraySplit( ArrayJoin( ListDirExt( l_aPRG_TODO, cWorkDir, ".c" ), l_aC_TODO ), l_nJOBS ) IF hb_mtvm() - AAdd( aThreads, hb_threadStart( @CompileCLoop(), hbmk, aTODO, cBin_CompC, cOpt_CompC, cWorkDir, cObjExt, aTODO:__enumIndex(), Len( aTODO:__enumBase() ) ) ) + AAdd( aThreads, hb_threadStart( @CompileCLoop(), hbmk, aTODO, cBin_CompC, cOpt_CompC, cWorkDir, cObjExt, nOpt_Esc, aTODO:__enumIndex(), Len( aTODO:__enumBase() ) ) ) ELSE - IF ! CompileCLoop( hbmk, aTODO, cBin_CompC, cOpt_CompC, cWorkDir, cObjExt ) + IF ! CompileCLoop( hbmk, aTODO, cBin_CompC, cOpt_CompC, cWorkDir, cObjExt, nOpt_Esc ) nErrorLevel := 6 ENDIF ENDIF @@ -3547,8 +3570,8 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) NEXT ENDIF ELSE - cOpt_CompC := StrTran( cOpt_CompC, "{OO}" , PathSepToTarget( hbmk, FN_ExtSet( l_cPROGNAME, cObjExt ) ) ) - cOpt_CompC := StrTran( cOpt_CompC, "{OW}" , PathSepToTarget( hbmk, cWorkDir ) ) + cOpt_CompC := StrTran( cOpt_CompC, "{OO}" , FN_Escape( PathSepToTarget( hbmk, FN_ExtSet( l_cPROGNAME, cObjExt ) ), nOpt_Esc ) ) + cOpt_CompC := StrTran( cOpt_CompC, "{OW}" , FN_Escape( PathSepToTarget( hbmk, cWorkDir ), nOpt_Esc ) ) aThreads := {} FOR EACH aTODO IN ArraySplit( ArrayJoin( ListDirExt( l_aPRG_TODO, cWorkDir, ".c" ), l_aC_TODO ), l_nJOBS ) @@ -3700,9 +3723,9 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) cOpt_Link := StrTran( cOpt_Link, "{LO}" , ArrayToList( ArrayJoin( l_aOBJ, l_aOBJUSER ),, nOpt_Esc, cObjPrefix ) ) cOpt_Link := StrTran( cOpt_Link, "{LS}" , ArrayToList( ArrayJoin( ListDirExt( l_aRESSRC, cWorkDir, cResExt ), l_aRESCMP ),, nOpt_Esc, cResPrefix ) ) cOpt_Link := StrTran( cOpt_Link, "{LA}" , ArrayToList( l_aOBJA,, nOpt_Esc ) ) - cOpt_Link := StrTran( cOpt_Link, "{LL}" , ArrayToList( l_aLIB,, nOpt_Esc ) ) - cOpt_Link := StrTran( cOpt_Link, "{OE}" , PathSepToTarget( hbmk, l_cPROGNAME ) ) - cOpt_Link := StrTran( cOpt_Link, "{OM}" , PathSepToTarget( hbmk, FN_ExtSet( l_cPROGNAME, ".map" ) ) ) + cOpt_Link := StrTran( cOpt_Link, "{LL}" , ArrayToList( l_aLIB,, nOpt_Esc, cLibPrefix ) ) + cOpt_Link := StrTran( cOpt_Link, "{OE}" , FN_Escape( PathSepToTarget( hbmk, l_cPROGNAME ), nOpt_Esc ) ) + cOpt_Link := StrTran( cOpt_Link, "{OM}" , FN_Escape( PathSepToTarget( hbmk, FN_ExtSet( l_cPROGNAME, ".map" ) ), nOpt_Esc ) ) cOpt_Link := StrTran( cOpt_Link, "{DL}" , ArrayToList( hbmk[ _HBMK_aLIBPATH ], cLibPathSep, nOpt_Esc, cLibPathPrefix ) ) cOpt_Link := StrTran( cOpt_Link, "{DB}" , l_cHB_BIN_INSTALL ) @@ -3756,8 +3779,8 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) /* Order is significant */ cOpt_Lib := StrTran( cOpt_Lib, "{FA}" , GetEnv( "HB_USER_AFLAGS" ) + " " + ArrayToList( hbmk[ _HBMK_aOPTA ] ) ) cOpt_Lib := StrTran( cOpt_Lib, "{LO}" , ArrayToList( ArrayJoin( l_aOBJ, l_aOBJUSER ),, nOpt_Esc, cLibObjPrefix ) ) - cOpt_Lib := StrTran( cOpt_Lib, "{LL}" , ArrayToList( l_aLIB,, nOpt_Esc ) ) - cOpt_Lib := StrTran( cOpt_Lib, "{OL}" , PathSepToTarget( hbmk, l_cPROGNAME ) ) + cOpt_Lib := StrTran( cOpt_Lib, "{LL}" , ArrayToList( l_aLIB,, nOpt_Esc, cLibPrefix ) ) + cOpt_Lib := StrTran( cOpt_Lib, "{OL}" , FN_Escape( PathSepToTarget( hbmk, l_cPROGNAME ), nOpt_Esc ) ) cOpt_Lib := StrTran( cOpt_Lib, "{DL}" , ArrayToList( hbmk[ _HBMK_aLIBPATH ], cLibPathSep, nOpt_Esc, cLibPathPrefix ) ) cOpt_Lib := StrTran( cOpt_Lib, "{DB}" , l_cHB_BIN_INSTALL ) @@ -3812,9 +3835,9 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) cOpt_Dyn := StrTran( cOpt_Dyn, "{FD}" , GetEnv( "HB_USER_DFLAGS" ) + " " + ArrayToList( hbmk[ _HBMK_aOPTD ] ) ) cOpt_Dyn := StrTran( cOpt_Dyn, "{LO}" , ArrayToList( ArrayJoin( l_aOBJ, l_aOBJUSER ),, nOpt_Esc, cDynObjPrefix ) ) cOpt_Dyn := StrTran( cOpt_Dyn, "{LS}" , ArrayToList( ArrayJoin( ListDirExt( l_aRESSRC, cWorkDir, cResExt ), l_aRESCMP ),, nOpt_Esc, cResPrefix ) ) - cOpt_Dyn := StrTran( cOpt_Dyn, "{LL}" , ArrayToList( l_aLIB,, nOpt_Esc ) ) - cOpt_Dyn := StrTran( cOpt_Dyn, "{OD}" , PathSepToTarget( hbmk, l_cPROGNAME ) ) - cOpt_Dyn := StrTran( cOpt_Dyn, "{OM}" , PathSepToTarget( hbmk, FN_ExtSet( l_cPROGNAME, ".map" ) ) ) + cOpt_Dyn := StrTran( cOpt_Dyn, "{LL}" , ArrayToList( l_aLIB,, nOpt_Esc, cLibPrefix ) ) + cOpt_Dyn := StrTran( cOpt_Dyn, "{OD}" , FN_Escape( PathSepToTarget( hbmk, l_cPROGNAME ), nOpt_Esc ) ) + cOpt_Dyn := StrTran( cOpt_Dyn, "{OM}" , FN_Escape( PathSepToTarget( hbmk, FN_ExtSet( l_cPROGNAME, ".map" ) ), nOpt_Esc ) ) cOpt_Dyn := StrTran( cOpt_Dyn, "{DL}" , ArrayToList( hbmk[ _HBMK_aLIBPATH ], cLibPathSep, nOpt_Esc, cLibPathPrefix ) ) cOpt_Dyn := StrTran( cOpt_Dyn, "{DB}" , l_cHB_BIN_INSTALL ) @@ -4011,7 +4034,7 @@ STATIC PROCEDURE DoBeep( hbmk, lSuccess ) RETURN -STATIC FUNCTION CompileCLoop( hbmk, aTODO, cBin_CompC, cOpt_CompC, cWorkDir, cObjExt, nJob, nJobs ) +STATIC FUNCTION CompileCLoop( hbmk, aTODO, cBin_CompC, cOpt_CompC, cWorkDir, cObjExt, nOpt_Esc, nJob, nJobs ) LOCAL lResult := .T. LOCAL cCommand LOCAL tmp, tmp1 @@ -4019,8 +4042,8 @@ STATIC FUNCTION CompileCLoop( hbmk, aTODO, cBin_CompC, cOpt_CompC, cWorkDir, cOb FOR EACH tmp IN aTODO cCommand := cOpt_CompC - cCommand := StrTran( cCommand, "{IC}", tmp ) - cCommand := StrTran( cCommand, "{OO}", PathSepToTarget( hbmk, FN_DirExtSet( tmp, cWorkDir, cObjExt ) ) ) + cCommand := StrTran( cCommand, "{IC}", FN_Escape( tmp, nOpt_Esc ) ) + cCommand := StrTran( cCommand, "{OO}", FN_Escape( PathSepToTarget( hbmk, FN_DirExtSet( tmp, cWorkDir, cObjExt ) ), nOpt_Esc ) ) cCommand := cBin_CompC + " " + AllTrim( cCommand ) @@ -4432,7 +4455,7 @@ STATIC FUNCTION ArraySplit( arrayIn, nChunksReq ) RETURN arrayOut -STATIC FUNCTION AAddNotExists( array, xItem ) +STATIC FUNCTION AAddNew( array, xItem ) IF AScan( array, {|tmp| tmp == xItem } ) == 0 AAdd( array, xItem ) @@ -4459,7 +4482,7 @@ STATIC FUNCTION ListDirExt( arraySrc, cDirNew, cExtNew ) RETURN array /* Forms the list of libs as to appear on the command line */ -STATIC FUNCTION ListCookLib( hbmk, arraySrc, cPrefix, cExtNew ) +STATIC FUNCTION ListCookLib( hbmk, arraySrc, cExtNew ) LOCAL array := AClone( arraySrc ) LOCAL cDir LOCAL cLibName @@ -4474,23 +4497,17 @@ STATIC FUNCTION ListCookLib( hbmk, arraySrc, cPrefix, cExtNew ) cLibName := SubStr( cLibName, 4 ) ENDIF #endif - IF cPrefix != NIL - cLibName := cPrefix + cLibName - ENDIF IF cExtNew != NIL cLibName := FN_ExtSet( cLibName, cExtNew ) ENDIF ENDIF NEXT ELSE - FOR EACH cLibName IN array - IF cPrefix != NIL - cLibName := cPrefix + cLibName - ENDIF - IF cExtNew != NIL + IF cExtNew != NIL + FOR EACH cLibName IN array cLibName := FN_ExtSet( cLibName, cExtNew ) - ENDIF - NEXT + NEXT + ENDIF ENDIF RETURN array @@ -4528,7 +4545,7 @@ STATIC FUNCTION ArrayToList( array, cSeparator, nEscapeMode, cPrefix ) CASE _ESC_DBLQUOTE FOR tmp := 1 TO Len( array ) IF " " $ array[ tmp ] - cString += cPrefix + Chr( 34 ) + array[ tmp ] + Chr( 34 ) + cString += cPrefix + '"' + array[ tmp ] + '"' ELSE cString += cPrefix + array[ tmp ] ENDIF @@ -4742,6 +4759,24 @@ STATIC FUNCTION DirUnbuild( cDir ) RETURN .T. +STATIC FUNCTION FN_Escape( cFileName, nEscapeMode ) + + DEFAULT nEscapeMode TO _ESC_NONE + + SWITCH nEscapeMode + CASE _ESC_DBLQUOTE + IF " " $ cFileName + /* Sloppy */ + IF Right( cFileName, 1 ) == "\" + cFileName += "\" + ENDIF + RETURN '"' + cFileName + '"' + ENDIF + EXIT + ENDSWITCH + + RETURN cFileName + STATIC FUNCTION FN_DirGet( cFileName ) LOCAL cDir