diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 3205d8bc1a..71879c2a57 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,6 +17,40 @@ past entries belonging to author(s): Viktor Szakats. */ +2009-06-20 11:36 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) + * utils/hbmk2/hbmk2.prg + + Added support for input/output filenames containing spaces. + Only for msvc and bcc so far. + ! Fixed to always delete target lib in -hblib + non-incremental mode + before creating it. + + Small miracles of life: Microsoft finally added /nologo switch to + resource compiler in MSVC 2010. Hard to believe, but true. Now + I'll have to find out what method to use to detect C compiler + version to enable it. + + Support for HB_COMPILER_VER envvar to tell hbmk2 what C compiler + version is expected. Currently only used with MSVC targets. + Use values like: + - 710 (for MSVC .NET 2003) + - 800 (for MSVC 2005) + - 900 (for MSVC 2008) + - 1000 (for MSVC 2010) + The generic format is <99><99>[.<99>] as [.]. + That makes BCC 5.5.1 '505.1' or shortly '505'. + Currently the only situation where such switch is necessary is when + using pre-8.0 MSVC versions, so most users don't have to bother with + this for now. + NOTE: Harbour GNU Make compatible HB_VISUALC_VER_PRE80 envvar still + supported to stay uniform. + + Added /nologo switch to MSVC lib command. + ! Protect against adding internally inherited C compiler switches, + if they are already on the switch list. + + * tests/testhrb.prg + ! Adapted to latest hbhrb.ch changes. + + * tests/setkeys.prg + * Minor formatting. + 2009-06-20 04:57 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) * contrib/hbxbp/xbp.ch * contrib/hbxbp/xbpscrollbar.prg diff --git a/harbour/tests/setkeys.prg b/harbour/tests/setkeys.prg index e1dadfb83b..84903c0f7a 100644 --- a/harbour/tests/setkeys.prg +++ b/harbour/tests/setkeys.prg @@ -1,13 +1,15 @@ /* * $Id$ + */ - Harbour Project source code - http://www.harbour-project.org - - By: April White - - This file contains the Harbour function(s) that maintain the list - of set-keys (hot-keys). - +/* + * Harbour Project source code + * This file contains the Harbour function(s) that maintain the list + * of set-keys (hot-keys). + * + * By: April White + * www - http://www.harbour-project.org + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) @@ -47,79 +49,83 @@ * whether to permit this exception to apply to your modifications. * If you do not wish that, delete this exception notice. - V 1.0 A White Initial version, submitted to Harbour Project - V 1.1 A White Add a Help() function to test default F1 + V 1.0 April White Initial version, submitted to Harbour Project + V 1.1 April White Add a Help() function to test default F1 */ - #include "inkey.ch" - Procedure Main() - local GetList := {} - local alpha, bravo, charlie, k, l - local F8Active := .t. +#include "inkey.ch" - cls +Procedure Main() + local GetList := {} + local alpha, bravo, charlie, k, l + local F8Active := .t. - @ 2, 2 say "Press F10 to popup alert box of current get, not active if empty" - @ 3, 2 say "Press F9 to disable all setkeys, except F9 to restore (uses SetKeySave())" - @ 4, 2 say "Press F8 to test setkey w/ array, SetKeyCheck(), and SetKeyGet()" - @ 5, 2 say "Press F7 to active/deactive F8" + cls - alpha := "alpha " - bravo := 123 - charlie := date() + @ 2, 2 say "Press F10 to popup alert box of current get, not active if empty" + @ 3, 2 say "Press F9 to disable all setkeys, except F9 to restore (uses SetKeySave())" + @ 4, 2 say "Press F8 to test setkey w/ array, SetKeyCheck(), and SetKeyGet()" + @ 5, 2 say "Press F7 to active/deactive F8" - @ 10, 10 get alpha - @ 11, 10 get bravo - @ 12, 10 get charlie + alpha := "alpha " + bravo := 123 + charlie := date() - #ifndef K_F10 + @ 10, 10 get alpha + @ 11, 10 get bravo + @ 12, 10 get charlie - #define K_F10 -9 - #define K_F9 -8 - #define K_F8 -7 - #define K_ESC 27 + #ifndef K_F10 - #endif + #define K_F10 -9 + #define K_F9 -8 + #define K_F8 -7 + #define K_ESC 27 - setKey( K_F10, {|| Alert( transform( getactive():varGet(), NIL ) ) }, ; - {|| !empty( getactive():VarGet() ) } ) /* :buffer */ - setKey( K_F9 , {|| k := hb_SetKeySave( NIL ), ; - SetKey( K_F9, {|| hb_SetKeySave( k ) } ) } ) - SetKey( K_F8 , {|| SubMain() }, {|| F8Active } ) - SetKey( K_F7 , {|| F8Active := .not. F8Active } ) + #endif - read - ? alpha, bravo, charlie + setKey( K_F10, {|| Alert( transform( getactive():varGet(), NIL ) ) }, ; + {|| !empty( getactive():VarGet() ) } ) /* :buffer */ + setKey( K_F9 , {|| k := hb_SetKeySave( NIL ), ; + SetKey( K_F9, {|| hb_SetKeySave( k ) } ) } ) + SetKey( K_F8 , {|| SubMain() }, {|| F8Active } ) + SetKey( K_F7 , {|| F8Active := .not. F8Active } ) + read + ? alpha, bravo, charlie - static Procedure SubMain() - local n - local bF8Action, bF8Active + return - bF8Action := hb_SetKeyGet( K_F8, @bF8Active ) - SetKey( K_F8, NIL ) +static Procedure SubMain() + local n + local bF8Action, bF8Active - hb_SetKeyArray( { 49, 50, 52, 53 }, {|x| qout( chr( x ) ) } ) - do while ( n := inkey( 0 ) ) != K_ESC - if hb_SetKeyCheck( n, procname(),procline(), readvar() ) - qqout( " hit hot" ) - else - qout( chr( n ) ) - qqout( " hit cold" ) - endif - end + bF8Action := hb_SetKeyGet( K_F8, @bF8Active ) + SetKey( K_F8, NIL ) - hb_SetKeyArray( { 49, 50, 52, 53 }, NIL ) - SetKey( K_F8, bF8Action, bF8Active ) + hb_SetKeyArray( { 49, 50, 52, 53 }, {|x| qout( chr( x ) ) } ) + do while ( n := inkey( 0 ) ) != K_ESC + if hb_SetKeyCheck( n, procname(),procline(), readvar() ) + qqout( " hit hot" ) + else + qout( chr( n ) ) + qqout( " hit cold" ) + endif + end - return + hb_SetKeyArray( { 49, 50, 52, 53 }, NIL ) + SetKey( K_F8, bF8Action, bF8Active ) - Procedure Help( cProc, nLine, cVar ) - local nX := col(), nY := row() + return - @ 19, 19 say "Pcount: " ; ?? pcount() - @ 20, 10 say "Proc : " ; ?? cProc - @ 21, 10 say "Line : " ; ?? nLine - @ 22, 10 say "Var : " ; ?? cVar +Procedure Help( cProc, nLine, cVar ) + local nX := col(), nY := row() - SetPos( nX, nY ) + @ 19, 19 say "Pcount: " ; ?? pcount() + @ 20, 10 say "Proc : " ; ?? cProc + @ 21, 10 say "Line : " ; ?? nLine + @ 22, 10 say "Var : " ; ?? cVar + + SetPos( nX, nY ) + + return diff --git a/harbour/tests/testhrb.prg b/harbour/tests/testhrb.prg index b8a155652d..5dde19db48 100644 --- a/harbour/tests/testhrb.prg +++ b/harbour/tests/testhrb.prg @@ -19,29 +19,29 @@ Local pHrb, cExe := "Msg2()", n // ? "Loading('exthrb.hrb' )" // pHrb := hb_HrbLoad("exthrb.hrb" ) -// ? "Loading(HB_HRB_DEFAULT,'exthrb.hrb' )" -// pHrb := hb_HrbLoad(HB_HRB_DEFAULT,"exthrb.hrb" ) +// ? "Loading(HB_HRB_BIND_DEFAULT,'exthrb.hrb' )" +// pHrb := hb_HrbLoad(HB_HRB_BIND_DEFAULT,"exthrb.hrb" ) -// ? "Loading(HB_HRB_KEEP_LOCAL,'exthrb.hrb' )" -// pHrb := hb_HrbLoad(HB_HRB_KEEP_LOCAL,"exthrb.hrb" ) +// ? "Loading(HB_HRB_BIND_LOCAL,'exthrb.hrb' )" +// pHrb := hb_HrbLoad(HB_HRB_BIND_LOCAL,"exthrb.hrb" ) - ? "Loading("+iif(n=0,"HB_HRB_DEFAULT",iif(n=1,"HB_HRB_KEEP_LOCAL","HB_HRB_KEEP_GLOBAL"))+",'exthrb.hrb' )" + ? "Loading("+iif(n=0,"HB_HRB_BIND_DEFAULT",iif(n=1,"HB_HRB_BIND_LOCAL","HB_HRB_BIND_OVERLOAD"))+",'exthrb.hrb' )" pHrb := hb_HrbLoad(n,"exthrb.hrb" ) ? "=========================" - ? "calling Msg ... DEFAULT=From exe, LOCAL=From exe, GLOBAL=From HRB" + ? "calling Msg ... DEFAULT=From exe, LOCAL=From exe, OVERLOAD=From HRB" Msg() ? "=========================" - ? "calling Msg ... DEFAULT=From exe, LOCAL=From HRB, GLOBAL=From HRB" + ? "calling Msg ... DEFAULT=From exe, LOCAL=From HRB, OVERLOAD=From HRB" &cExe // ? "=========================" - hb_HrbUnload( pHrb ) // should do nothing in case of GLOBAL + hb_HrbUnload( pHrb ) // should do nothing in case of OVERLOAD - ? "calling Msg ... DEFAULT=From exe, LOCAL=From exe, GLOBAL=From HRB" - Msg() // test unload protection when using GLOBAL ... then Hrb not anymore unloadable + ? "calling Msg ... DEFAULT=From exe, LOCAL=From exe, OVERLOAD=From HRB" + Msg() // test unload protection when using OVERLOAD ... then .hrb not anymore unloadable ? "=========================" ? "END" diff --git a/harbour/utils/hbmk2/hbmk2.prg b/harbour/utils/hbmk2/hbmk2.prg index 786e6d1d8e..2f7b45b0fd 100644 --- a/harbour/utils/hbmk2/hbmk2.prg +++ b/harbour/utils/hbmk2/hbmk2.prg @@ -166,6 +166,9 @@ REQUEST hbmk_KEYW #define _CONF_DEBUG 1 /* Harbour level debug */ #define _CONF_FULLDEBUG 2 /* Harbour + C level debug */ +#define _ESC_NONE 0 +#define _ESC_DBLQUOTE 1 + #define _LNG_MARKER "${lng}" #define _HBMK_CFG_NAME "hbmk.cfg" @@ -556,6 +559,8 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) LOCAL cOpt_CprsMax LOCAL cBin_Post := NIL LOCAL cOpt_Post + LOCAL nOpt_Esc := NIL + LOCAL nCCompVer LOCAL cCommand LOCAL aCommand @@ -865,6 +870,13 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) #endif ENDIF + nCCompVer := Val( GetEnv( "HB_COMPILER_VER" ) ) /* Format: <09><00>[.<00>] = [.] */ +#if 0 + IF Empty( nCCompVer ) + nCCompVer := Val( GetEnv( "HB_COMP_VER" ) ) + ENDIF +#endif + /* Autodetect architecture */ IF Empty( hbmk[ _HBMK_cARCH ] ) @@ -1976,7 +1988,7 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) {OM} output map name {DB} dir for binaries {DI} dir for includes - {DL} dir for libs + {DL} dirs for libs {SCRIPT} save command line to script and pass it to command as @ */ @@ -2096,14 +2108,14 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) /* Always inherit/reproduce some flags from self */ - IF "-mlp64" $ cSelfFlagC ; AAdd( hbmk[ _HBMK_aOPTC ], "-mlp64" ) - ELSEIF "-mlp32" $ cSelfFlagC ; AAdd( hbmk[ _HBMK_aOPTC ], "-mlp32" ) - ELSEIF "-m64" $ cSelfFlagC ; AAdd( hbmk[ _HBMK_aOPTC ], "-m64" ) - ELSEIF "-m32" $ cSelfFlagC ; AAdd( hbmk[ _HBMK_aOPTC ], "-m32" ) + 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" ) ENDIF - IF "-fPIC" $ cSelfFlagC ; AAdd( hbmk[ _HBMK_aOPTC ], "-fPIC" ) - ELSEIF "-fpic" $ cSelfFlagC ; AAdd( hbmk[ _HBMK_aOPTC ], "-fpic" ) + IF "-fPIC" $ cSelfFlagC ; AAddNotExists( hbmk[ _HBMK_aOPTC ], "-fPIC" ) + ELSEIF "-fpic" $ cSelfFlagC ; AAddNotExists( hbmk[ _HBMK_aOPTC ], "-fpic" ) ENDIF DO CASE @@ -2614,13 +2626,15 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) IF l_lCPP != NIL .AND. l_lCPP AAdd( hbmk[ _HBMK_aOPTC ], "-P" ) ENDIF + nOpt_Esc := _ESC_DBLQUOTE cLibPrefix := NIL 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}"' cBin_CompC := "bcc32.exe" cOpt_CompC := "-c -q -tWM" IF hbmk[ _HBMK_lOPTIM ] @@ -2628,12 +2642,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 ] @@ -2645,14 +2659,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"{OW}"' ) 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 @@ -2666,6 +2680,18 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) CASE ( hbmk[ _HBMK_cARCH ] == "win" .AND. hbmk[ _HBMK_cCOMP ] $ "msvc|msvc64|msvcia64|icc|iccia64" ) .OR. ; ( hbmk[ _HBMK_cARCH ] == "wce" .AND. hbmk[ _HBMK_cCOMP ] == "msvcarm" ) /* NOTE: Cross-platform: wce/ARM on win/x86 */ + + IF Empty( nCCompVer ) + /* Compatibility with Harbour GNU Make system */ + IF Empty( GetEnv( "HB_VISUALC_VER_PRE80" ) ) + nCCompVer := 800 /* Visual Studio 2005 */ + ELSE + nCCompVer := 710 /* Visual Studio .NET 2003 */ + ENDIF + /* 900 : Visual Studio 2008 */ + /* 1000 : Visual Studio 2010 */ + ENDIF + IF hbmk[ _HBMK_lDEBUG ] IF hbmk[ _HBMK_cCOMP ] == "msvcarm" AAdd( hbmk[ _HBMK_aOPTC ], "-Zi" ) @@ -2697,7 +2723,7 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) cBin_Dyn := cBin_Link ELSE cBin_Lib := "lib.exe" - IF hbmk[ _HBMK_cCOMP ] == "msvcarm" .AND. ! Empty( GetEnv( "HB_VISUALC_VER_PRE80" ) ) + IF hbmk[ _HBMK_cCOMP ] == "msvcarm" .AND. nCCompVer < 800 cBin_CompC := "clarm.exe" ELSE cBin_CompC := "cl.exe" @@ -2705,18 +2731,19 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) cBin_Link := "link.exe" cBin_Dyn := cBin_Link ENDIF - cOpt_Lib := "{FA} /out:{OL} {LO}" - cOpt_Dyn := "{FD} /dll /out:{OD} {DL} {LO} {LL} {LS}" + nOpt_Esc := _ESC_DBLQUOTE + 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" - IF Empty( GetEnv( "HB_VISUALC_VER_PRE80" ) ) + IF nCCompVer >= 800 cOpt_CompC += " -Od -Os -Gy -GS- -Gm -Zi -GR-" ELSE cOpt_CompC += " -Oxsb1 -YX -GF" ENDIF ELSE - IF Empty( GetEnv( "HB_VISUALC_VER_PRE80" ) ) + IF nCCompVer >= 800 cOpt_CompC += " -Ot2b1" ELSE cOpt_CompC += " -Ogt2yb1p -GX- -G6 -YX" @@ -2725,7 +2752,7 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) ENDIF cOpt_CompC += " {FC} {LC}" cOptIncMask := '-I"{DI}"' - cOpt_Link := "-nologo /out:{OE} {LO} {DL} {FL} {LL} {LS}" + cOpt_Link := '/nologo /out:"{OE}" {LO} {DL} {FL} {LL} {LS}' cLibPathPrefix := "/libpath:" cLibPathSep := " " IF hbmk[ _HBMK_lMAP ] @@ -2761,14 +2788,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"{OW}\"' ) /* 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 @@ -2795,7 +2822,10 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) IF !( hbmk[ _HBMK_cCOMP ] $ "icc|iccia64" ) cBin_Res := "rc.exe" - cOpt_Res := "{FR} /fo {OS} {IR}" /* NOTE: No /nologo option as of MSVC 2008. [vszakats] */ + cOpt_Res := '{FR} /fo "{OS}" "{IR}"' + IF nCCompVer >= 1000 + cOpt_Res := "/nologo " + cOpt_Res /* NOTE: Only in MSVC 2010 and upper. [vszakats] */ + ENDIF cResExt := ".res" ENDIF @@ -3117,7 +3147,7 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) " " + ArrayToList( l_aPRG_TODO ) +; iif( l_lBLDFLGP, " " + cSelfFlagPRG, "" ) +; iif( ! Empty( GetEnv( "HB_USER_PRGFLAGS" ) ), " " + GetEnv( "HB_USER_PRGFLAGS" ), "" ) +; - iif( ! Empty( hbmk[ _HBMK_aOPTPRG ] ), " " + ArrayToList( hbmk[ _HBMK_aOPTPRG ] ), "" ) + iif( ! Empty( hbmk[ _HBMK_aOPTPRG ] ), " " + ArrayToList( hbmk[ _HBMK_aOPTPRG ],, nOpt_Esc ), "" ) cCommand := AllTrim( cCommand ) @@ -3315,7 +3345,7 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) ENDIF /* Dress obj names. */ l_aOBJ := ListDirExt( ArrayJoin( l_aPRG, l_aC ), cWorkDir, cObjExt ) - l_aOBJUSER := ListCook( l_aOBJUSER, NIL, cObjExt ) + l_aOBJUSER := ListCook( l_aOBJUSER, cObjExt ) IF hbmk[ _HBMK_lINC ] .AND. ! hbmk[ _HBMK_lREBUILD ] l_aRESSRC_TODO := {} @@ -3398,7 +3428,7 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) ENDIF NEXT ELSE - cOpt_Res := StrTran( cOpt_Res, "{LR}" , ArrayToList( l_aRESSRC_TODO ) ) + cOpt_Res := StrTran( cOpt_Res, "{LR}" , ArrayToList( l_aRESSRC_TODO,, nOpt_Esc ) ) cOpt_Res := AllTrim( cOpt_Res ) @@ -3481,15 +3511,15 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) GetEnv( "HB_USER_CFLAGS" ) + " " + ArrayToList( hbmk[ _HBMK_aOPTC ] ) ) cOpt_CompC := StrTran( cOpt_CompC, "{FL}" , iif( l_lBLDFLGL, cSelfFlagL + " ", "" ) +; GetEnv( "HB_USER_LDFLAGS" ) + " " + ArrayToList( hbmk[ _HBMK_aOPTL ] ) ) - cOpt_CompC := StrTran( cOpt_CompC, "{LR}" , ArrayToList( ArrayJoin( ListDirExt( l_aRESSRC, cWorkDir, cResExt ), l_aRESCMP ) ) ) - cOpt_CompC := StrTran( cOpt_CompC, "{LO}" , ArrayToList( ArrayAJoin( { ListCook( l_aOBJUSER, cObjPrefix ), ListCook( l_aPRG_DONE, cObjPrefix, cObjExt ), ListCook( l_aC_DONE, cObjPrefix, cObjExt ) } ) ) ) - cOpt_CompC := StrTran( cOpt_CompC, "{LS}" , ArrayToList( ListCook( ArrayJoin( ListDirExt( l_aRESSRC, "", cResExt ), l_aRESCMP ), cResPrefix ) ) ) - cOpt_CompC := StrTran( cOpt_CompC, "{LA}" , ArrayToList( l_aOBJA ) ) - cOpt_CompC := StrTran( cOpt_CompC, "{LL}" , ArrayToList( l_aLIB ) ) + cOpt_CompC := StrTran( cOpt_CompC, "{LR}" , ArrayToList( ArrayJoin( ListDirExt( l_aRESSRC, cWorkDir, cResExt ), l_aRESCMP ),, nOpt_Esc ) ) + 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, "{DL}" , ArrayToList( ListCook( hbmk[ _HBMK_aLIBPATH ], cLibPathPrefix ), cLibPathSep ) ) + 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 ) @@ -3521,7 +3551,7 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) aThreads := {} FOR EACH aTODO IN ArraySplit( ArrayJoin( ListDirExt( l_aPRG_TODO, cWorkDir, ".c" ), l_aC_TODO ), l_nJOBS ) - cOpt_CompCLoop := AllTrim( StrTran( cOpt_CompC, "{LC}" , ArrayToList( aTODO ) ) ) + cOpt_CompCLoop := AllTrim( StrTran( cOpt_CompC, "{LC}" , ArrayToList( aTODO,, nOpt_Esc ) ) ) /* Handle moving the whole command line to a script, if requested. */ IF "{SCRIPT}" $ cOpt_CompCLoop @@ -3645,7 +3675,8 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) hbmk_OutErr( hbmk, hb_StrFormat( I_( "Warning: Cannot create directory for target '%1$s'." ), l_cPROGNAME ) ) ENDIF - IF hbmk[ _HBMK_lREBUILD ] + IF hbmk[ _HBMK_lREBUILD ] .OR. ; + ( ! hbmk[ _HBMK_lINC ] .AND. lStopAfterCComp .AND. lCreateLib .AND. ! Empty( cBin_Lib ) ) /* non-incremental + static lib */ IF hb_FileExists( PathSepToTarget( hbmk, l_cPROGNAME ) ) .AND. ; FErase( PathSepToTarget( hbmk, l_cPROGNAME ) ) == F_ERROR hbmk_OutErr( hbmk, hb_StrFormat( I_( "Warning: Cannot delete existing target '%1$s'." ), l_cPROGNAME ) ) @@ -3664,13 +3695,13 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) /* Order is significant */ cOpt_Link := StrTran( cOpt_Link, "{FL}" , iif( l_lBLDFLGL, cSelfFlagL + " ", "" ) +; GetEnv( "HB_USER_LDFLAGS" ) + " " + ArrayToList( hbmk[ _HBMK_aOPTL ] ) ) - cOpt_Link := StrTran( cOpt_Link, "{LO}" , ArrayToList( ListCook( ArrayJoin( l_aOBJ, l_aOBJUSER ), cObjPrefix ) ) ) - cOpt_Link := StrTran( cOpt_Link, "{LS}" , ArrayToList( ListCook( ArrayJoin( ListDirExt( l_aRESSRC, cWorkDir, cResExt ), l_aRESCMP ), cResPrefix ) ) ) - cOpt_Link := StrTran( cOpt_Link, "{LA}" , ArrayToList( l_aOBJA ) ) - cOpt_Link := StrTran( cOpt_Link, "{LL}" , ArrayToList( l_aLIB ) ) + 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, "{DL}" , ArrayToList( ListCook( hbmk[ _HBMK_aLIBPATH ], cLibPathPrefix ), cLibPathSep ) ) + cOpt_Link := StrTran( cOpt_Link, "{DL}" , ArrayToList( hbmk[ _HBMK_aLIBPATH ], cLibPathSep, nOpt_Esc, cLibPathPrefix ) ) cOpt_Link := StrTran( cOpt_Link, "{DB}" , l_cHB_BIN_INSTALL ) cOpt_Link := AllTrim( cOpt_Link ) @@ -3722,10 +3753,10 @@ 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( ListCook( ArrayJoin( l_aOBJ, l_aOBJUSER ), cLibObjPrefix ) ) ) - cOpt_Lib := StrTran( cOpt_Lib, "{LL}" , ArrayToList( l_aLIB ) ) + 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, "{DL}" , ArrayToList( ListCook( hbmk[ _HBMK_aLIBPATH ], cLibPathPrefix ), cLibPathSep ) ) + cOpt_Lib := StrTran( cOpt_Lib, "{DL}" , ArrayToList( hbmk[ _HBMK_aLIBPATH ], cLibPathSep, nOpt_Esc, cLibPathPrefix ) ) cOpt_Lib := StrTran( cOpt_Lib, "{DB}" , l_cHB_BIN_INSTALL ) cOpt_Lib := AllTrim( cOpt_Lib ) @@ -3777,12 +3808,12 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) /* Order is significant */ cOpt_Dyn := StrTran( cOpt_Dyn, "{FD}" , GetEnv( "HB_USER_DFLAGS" ) + " " + ArrayToList( hbmk[ _HBMK_aOPTD ] ) ) - cOpt_Dyn := StrTran( cOpt_Dyn, "{LO}" , ArrayToList( ListCook( ArrayJoin( l_aOBJ, l_aOBJUSER ), cDynObjPrefix ) ) ) - cOpt_Dyn := StrTran( cOpt_Dyn, "{LS}" , ArrayToList( ListCook( ArrayJoin( ListDirExt( l_aRESSRC, cWorkDir, cResExt ), l_aRESCMP ), cResPrefix ) ) ) - cOpt_Dyn := StrTran( cOpt_Dyn, "{LL}" , ArrayToList( l_aLIB ) ) + 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, "{DL}" , ArrayToList( ListCook( hbmk[ _HBMK_aLIBPATH ], cLibPathPrefix ), cLibPathSep ) ) + cOpt_Dyn := StrTran( cOpt_Dyn, "{DL}" , ArrayToList( hbmk[ _HBMK_aLIBPATH ], cLibPathSep, nOpt_Esc, cLibPathPrefix ) ) cOpt_Dyn := StrTran( cOpt_Dyn, "{DB}" , l_cHB_BIN_INSTALL ) cOpt_Dyn := AllTrim( cOpt_Dyn ) @@ -4399,6 +4430,14 @@ STATIC FUNCTION ArraySplit( arrayIn, nChunksReq ) RETURN arrayOut +STATIC FUNCTION AAddNotExists( array, xItem ) + + IF AScan( array, {|tmp| tmp == xItem } ) == 0 + AAdd( array, xItem ) + ENDIF + + RETURN array + STATIC FUNCTION AAddNotEmpty( array, xItem ) IF ! Empty( xItem ) @@ -4455,33 +4494,48 @@ STATIC FUNCTION ListCookLib( hbmk, arraySrc, cPrefix, cExtNew ) RETURN array /* Append optional prefix and optional extension to all members */ -STATIC FUNCTION ListCook( arraySrc, cPrefix, cExtNew ) +STATIC FUNCTION ListCook( arraySrc, cExtNew ) LOCAL array := AClone( arraySrc ) LOCAL cItem - FOR EACH cItem IN array - IF cPrefix != NIL - cItem := cPrefix + cItem - ENDIF - IF cExtNew != NIL + IF cExtNew != NIL + FOR EACH cItem IN array cItem := FN_ExtSet( cItem, cExtNew ) - ENDIF - NEXT + NEXT + ENDIF RETURN array -STATIC FUNCTION ArrayToList( array, cSeparator ) +STATIC FUNCTION ArrayToList( array, cSeparator, nEscapeMode, cPrefix ) LOCAL cString := "" LOCAL tmp DEFAULT cSeparator TO " " + DEFAULT nEscapeMode TO _ESC_NONE + DEFAULT cPrefix TO "" - FOR tmp := 1 TO Len( array ) - cString += array[ tmp ] - IF tmp < Len( array ) - cString += cSeparator - ENDIF - NEXT + SWITCH nEscapeMode + CASE _ESC_NONE + FOR tmp := 1 TO Len( array ) + cString += cPrefix + array[ tmp ] + IF tmp < Len( array ) + cString += cSeparator + ENDIF + NEXT + EXIT + CASE _ESC_DBLQUOTE + FOR tmp := 1 TO Len( array ) + IF " " $ array[ tmp ] + cString += cPrefix + Chr( 34 ) + array[ tmp ] + Chr( 34 ) + ELSE + cString += cPrefix + array[ tmp ] + ENDIF + IF tmp < Len( array ) + cString += cSeparator + ENDIF + NEXT + EXIT + ENDSWITCH RETURN cString