From cb560a981455f7a5eaf0fd894a850b104a77c3a2 Mon Sep 17 00:00:00 2001 From: Viktor Szakats Date: Sun, 24 May 2009 11:33:29 +0000 Subject: [PATCH] 2009-05-24 13:27 UTC+0200 Viktor Szakats (harbour.01 syenar hu) * utils/hbmk2/hbmk2.prg * Changed multitarget support. Instead of special .hbt extension (which was not removed), not -target=[.hbm|.prg] option can be used to force a distinct target from the command line. This way it's more flexible, easy to use and clear without needing a special extension alias. Here's the updated usage: There are two ways to do multitarget hbmk2 sessions: 1.) hbmk2 [] -target=target1[.hbm|.prg] [] -target=target2[.hbm|.prg] [] Examples: hbmk2 -target=prog1 -target=prog2 -target=prog3 hbmk2 -target=prog1.prg -target=prog2.prg -target=prog3.prg hbmk2 -target=mylib1.hbm -target=mylib2.hbm -target=myapp.hbm hbmk2 -trace -pause -target=mylib1.hbm -target=mylib2.hbm -target=myapp.hbm -beep 2.) hbmk2 [] -target -target [-notarget ] Examples: hbmk2 -target hello1.prg -target hello2.prg hbmk2 -trace -target hello1.prg -target hello2.prg hbmk2 -trace -target hello1.prg -target hello2.prg -notarget -beep * Changed ' = ' operators to macro LEFTEQUAL(). + Added Set( _SET_EXACT ) setting to make sure above operator works regardless of caller/default state. ; NOTE: IMO it would be useful to add a pseudo function equivalent to non-exact equality operator. This would clear up hacks like above. * doc/dirstruc.txt ! Typo. --- harbour/ChangeLog | 32 ++++++++++++++++++++++++++ harbour/doc/dirstruc.txt | 2 +- harbour/utils/hbmk2/hbmk2.prg | 43 +++++++++++++++++++---------------- 3 files changed, 57 insertions(+), 20 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index f9a9d6de44..bee63d1275 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,6 +17,38 @@ past entries belonging to these authors: Viktor Szakats. */ +2009-05-24 13:27 UTC+0200 Viktor Szakats (harbour.01 syenar hu) + * utils/hbmk2/hbmk2.prg + * Changed multitarget support. Instead of special .hbt extension + (which was not removed), not -target=[.hbm|.prg] option + can be used to force a distinct target from the command line. + This way it's more flexible, easy to use and clear without needing + a special extension alias. + + Here's the updated usage: + There are two ways to do multitarget hbmk2 sessions: + 1.) hbmk2 [] -target=target1[.hbm|.prg] [] -target=target2[.hbm|.prg] [] + Examples: + hbmk2 -target=prog1 -target=prog2 -target=prog3 + hbmk2 -target=prog1.prg -target=prog2.prg -target=prog3.prg + hbmk2 -target=mylib1.hbm -target=mylib2.hbm -target=myapp.hbm + hbmk2 -trace -pause -target=mylib1.hbm -target=mylib2.hbm -target=myapp.hbm -beep + 2.) hbmk2 [] -target -target [-notarget ] + Examples: + hbmk2 -target hello1.prg -target hello2.prg + hbmk2 -trace -target hello1.prg -target hello2.prg + hbmk2 -trace -target hello1.prg -target hello2.prg -notarget -beep + + * Changed ' = ' operators to macro LEFTEQUAL(). + + Added Set( _SET_EXACT ) setting to make sure above operator + works regardless of caller/default state. + ; NOTE: IMO it would be useful to add a pseudo function + equivalent to non-exact equality operator. This would + clear up hacks like above. + + * doc/dirstruc.txt + ! Typo. + 2009-05-24 11:52 UTC+0200 Viktor Szakats (harbour.01 syenar hu) * INSTALL * Terminology cleanup: x64 -> x86-64 diff --git a/harbour/doc/dirstruc.txt b/harbour/doc/dirstruc.txt index 3eadc05850..43f9d3c1fa 100644 --- a/harbour/doc/dirstruc.txt +++ b/harbour/doc/dirstruc.txt @@ -392,7 +392,7 @@ track of all files (read the FAQ if you don't know what SVN is). | +---hbextern - hbextern.ch generator. | - +---hbi18n - Harbour i18n .pot/.hbl file manger. + +---hbi18n - Harbour i18n .pot/.hbl file manager. | +---hbmk - Harbour Make utility. | | diff --git a/harbour/utils/hbmk2/hbmk2.prg b/harbour/utils/hbmk2/hbmk2.prg index 2c74e0dd19..010c00b412 100644 --- a/harbour/utils/hbmk2/hbmk2.prg +++ b/harbour/utils/hbmk2/hbmk2.prg @@ -162,6 +162,9 @@ REQUEST hbmk_KEYW #define OutStd( x ) low_OutStd( hbmk[ _HBMK_lUTF8 ], x ) #define OutErr( x ) low_OutErr( hbmk[ _HBMK_lUTF8 ], x ) +/* This requires Set( _SET_EXACT, .F. ) */ +#define LEFTEQUAL( l, r ) ( l = r ) + #define _HBMK_lQuiet 1 #define _HBMK_lInfo 2 #define _HBMK_cARCH 3 @@ -235,6 +238,8 @@ PROCEDURE Main( ... ) LOCAL nTargetTODO LOCAL lHadTarget + LOCAL lOldExact := Set( _SET_EXACT, .F. ) + /* Emulate -hbcmp, -hbcc, -hblnk switches when certain self names are detected. For compatibility with hbmk script aliases. */ @@ -279,10 +284,10 @@ PROCEDURE Main( ... ) FOR EACH tmp IN aArgs DO CASE - CASE Lower( FN_ExtGet( tmp ) ) == ".hbt" .AND. ! lHadTarget + CASE Lower( Left( tmp, Len( "-target=" ) ) ) == "-target=" nTarget++ IF nTarget == nTargetTODO - AAdd( aArgsTarget, tmp ) + AAdd( aArgsTarget, SubStr( tmp, Len( "-target=" ) + 1 ) ) ENDIF CASE Lower( tmp ) == "-target" nTarget++ @@ -319,6 +324,8 @@ PROCEDURE Main( ... ) ErrorLevel( nResult ) + Set( _SET_EXACT, lOldExact ) + RETURN STATIC FUNCTION hbmk_run( cCmd ) @@ -1140,8 +1147,7 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) nEmbedLevel := 1 HBM_Load( hbmk, aParams, cParam, @nEmbedLevel ) /* Load parameters from script file */ ENDIF - CASE Lower( FN_ExtGet( cParam ) ) == ".hbm" .OR. ; - Lower( FN_ExtGet( cParam ) ) == ".hbt" + CASE Lower( FN_ExtGet( cParam ) ) == ".hbm" nEmbedLevel := 1 HBM_Load( hbmk, aParams, cParam, @nEmbedLevel ) /* Load parameters from script file */ OTHERWISE @@ -4751,8 +4757,7 @@ STATIC PROCEDURE HBM_Load( hbmk, aParams, cFileName, /* @ */ nEmbedLevel ) nEmbedLevel++ HBM_Load( hbmk, aParams, PathProc( cParam, cFileName ), @nEmbedLevel ) /* Load parameters from script file */ ENDIF - CASE Lower( FN_ExtGet( cParam ) ) == ".hbm" .OR. ; - Lower( FN_ExtGet( cParam ) ) == ".hbt" + CASE Lower( FN_ExtGet( cParam ) ) == ".hbm" IF nEmbedLevel < 3 nEmbedLevel++ HBM_Load( hbmk, aParams, PathProc( cParam, cFileName ), @nEmbedLevel ) /* Load parameters from script file */ @@ -4906,7 +4911,7 @@ STATIC FUNCTION getFirstFunc( hbmk, cFile ) IF cExt == ".c" FOR EACH cLine IN hb_ATokens( StrTran( hb_MemoRead( cFile ), Chr( 13 ), Chr( 10 ) ), Chr( 10 ) ) cLine := AllTrim( cLine ) - IF cLine = '{ "' .AND. "HB_FS_FIRST" $ cLine + IF LEFTEQUAL( cLine, '{ "' ) .AND. "HB_FS_FIRST" $ cLine n := 4 DO WHILE ( c := SubStr( cLine, n++, 1 ) ) != '"' cFuncName += c @@ -4918,7 +4923,7 @@ STATIC FUNCTION getFirstFunc( hbmk, cFile ) cFuncList := commandResult( hbmk, cExecNM + " " + cFile + " -g -n --defined-only -C" ) IF ( n := At( " T HB_FUN_", cFuncList ) ) != 0 n += 10 - DO WHILE ( c := SubStr( cFuncList, n++, 1 ) ) = "_" .OR. ; + DO WHILE ( c := SubStr( cFuncList, n++, 1 ) ) == "_" .OR. ; IsDigit( c ) .OR. IsAlpha( c ) cFuncName += c ENDDO @@ -5176,13 +5181,13 @@ STATIC FUNCTION rtlnk_process( hbmk, cCommands, cFileOut, aFileList, aLibList, ; ENDIF FOR EACH cLine IN hb_ATokens( cCommands, Chr( 10 ) ) cLine := AllTrim( cLine ) - IF !Empty( cLine ) .AND. !cLine = "#" .AND. !cLine = "//" + IF !Empty( cLine ) .AND. ! LEFTEQUAL( cLine, "#" ) .AND. ! LEFTEQUAL( cLine, "//" ) IF nMode == RTLNK_MODE_NONE /* blinker extension */ - IF Upper( cLine ) = "ECHO " + IF LEFTEQUAL( Upper( cLine ), "ECHO " ) hbmk_OutStd( hbmk, hb_StrFormat( I_( "Blinker ECHO: %1$s" ), SubStr( cLine, 6 ) ) ) LOOP - ELSEIF Upper( cLine ) = "BLINKER " + ELSEIF LEFTEQUAL( Upper( cLine ), "BLINKER " ) /* skip blinker commands */ LOOP ELSE /* TODO: add other blinker commands */ @@ -5216,7 +5221,7 @@ STATIC FUNCTION rtlnk_process( hbmk, cCommands, cFileOut, aFileList, aLibList, ; ELSEIF nMode == RTLNK_MODE_SKIPNEXT nMode := RTLNK_MODE_SKIP ENDIF - ELSEIF cWord = "@" + ELSEIF LEFTEQUAL( cWord, "@" ) cWord := SubStr( cWord, 2 ) cCommands := rtlnk_read( @cWord, aPrevFiles ) IF cCommands == NIL @@ -5230,16 +5235,16 @@ STATIC FUNCTION rtlnk_process( hbmk, cCommands, cFileOut, aFileList, aLibList, ; ELSE cWord := Upper( cWord ) IF Len( cWord ) >= 2 - IF "OUTPUT" = cWord + IF LEFTEQUAL( "OUTPUT", cWord ) nMode := RTLNK_MODE_OUT - ELSEIF "FILE" = cWord + ELSEIF LEFTEQUAL( "FILE", cWord ) nMode := RTLNK_MODE_FILE - ELSEIF "LIBRARY" = cWord + ELSEIF LEFTEQUAL( "LIBRARY", cWord ) nMode := RTLNK_MODE_LIB - ELSEIF "MODULE" = cWord .OR. ; - "EXCLUDE" = cWord .OR. ; - "REFER" = cWord .OR. ; - "INTO" = cWord + ELSEIF LEFTEQUAL( "MODULE", cWord ) .OR. ; + LEFTEQUAL( "EXCLUDE", cWord ) .OR. ; + LEFTEQUAL( "REFER", cWord ) .OR. ; + LEFTEQUAL( "INTO", cWord ) nMode := RTLNK_MODE_SKIP ENDIF ENDIF