diff --git a/harbour/ChangeLog b/harbour/ChangeLog index b79c6d83af..6b9297c3b4 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,6 +17,16 @@ past entries belonging to author(s): Viktor Szakats. */ +2009-08-06 15:39 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) + * utils/hbmk2/hbmk2.prg + + In incremental (-inc) mode .c and .rc stubs are now created + inside workdir and kept there for consecutive build runs. + They are only recreated if necessary. This means that + -gt, -main= and -icon options work well with -inc mode, and + won't anymore force linking on each run. + * All stubs will be recreated in -rebuild mode. + * Above stubs will be deleted in -clean mode. (except vcshead and tshead) + 2009-08-06 11:17 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) * utils/hbmk2/hbmk2.prg ! Fixed escaping icon filenames in automatically generated .rc files diff --git a/harbour/utils/hbmk2/hbmk2.prg b/harbour/utils/hbmk2/hbmk2.prg index e319c330b3..7f8a72da75 100644 --- a/harbour/utils/hbmk2/hbmk2.prg +++ b/harbour/utils/hbmk2/hbmk2.prg @@ -591,6 +591,7 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) LOCAL tmp, tmp1, tmp2, array LOCAL cScriptFile LOCAL fhnd + LOCAL cFile LOCAL lNOHBC LOCAL lSysLoc LOCAL cPrefix @@ -3048,7 +3049,7 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) "#define _HBMK_VCS_TYPE_ " + '"' + tmp2 + '"' + Chr( 10 ) +; "#define _HBMK_VCS_ID_ " + '"' + tmp1 + '"' + Chr( 10 ) /* Update only if something changed to trigger rebuild only if really needed */ - IF !( hb_MemoRead( l_cVCSHEAD ) == tmp ) + IF hbmk[ _HBMK_lREBUILD ] .OR. !( hb_MemoRead( l_cVCSHEAD ) == tmp ) IF hbmk[ _HBMK_lInfo ] hbmk_OutStd( hbmk, hb_StrFormat( I_( "Generating VCS header: %1$s" ), l_cVCSHEAD ) ) ENDIF @@ -3278,13 +3279,13 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) /* HACK: Override entry point requested by user or detected by us, and override the GT if requested by user. */ IF ! lStopAfterCComp .AND. ; - ! l_lCLEAN .AND. ; ( l_cMAIN != NIL .OR. ; ! Empty( hbmk[ _HBMK_aLIBUSERGT ] ) .OR. ; hbmk[ _HBMK_cGT ] != NIL ) - fhnd := hb_FTempCreateEx( @l_cCSTUB, NIL, "hbmk_", ".c" ) - IF fhnd != F_ERROR + l_cCSTUB := DirAddPathSep( cWorkDir ) + "_hbmkaut.c" + + IF ! l_lCLEAN /* NOTE: This has to be kept synced with Harbour HB_IMPORT values. */ DO CASE @@ -3320,91 +3321,110 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) ENDIF /* Build C stub */ - FWrite( fhnd, '/* This temp source file was generated by hbmk tool. */' + hb_osNewLine() +; - '/* You can safely delete it. */' + hb_osNewLine() +; - '' + hb_osNewLine() +; - '#include "hbapi.h"' + hb_osNewLine() ) + cFile := '/* This temp source file was generated by hbmk tool. */' + Chr( 10 ) +; + '/* You can safely delete it. */' + Chr( 10 ) +; + '' + Chr( 10 ) +; + '#include "hbapi.h"' + Chr( 10 ) IF ! Empty( array ) AEval( array, {|tmp, i| array[ i ] := FuncNameEncode( tmp ) } ) - FWrite( fhnd, '' + hb_osNewLine() ) - AEval( array, {|tmp| FWrite( fhnd, 'HB_FUNC_EXTERN( ' + tmp + ' );' + hb_osNewLine() ) } ) - FWrite( fhnd, '' + hb_osNewLine() ) - FWrite( fhnd, 'void _hb_lnk_ForceLink_hbmk( void )' + hb_osNewLine() ) - FWrite( fhnd, '{' + hb_osNewLine() ) - AEval( array, {|tmp| FWrite( fhnd, ' HB_FUNC_EXEC( ' + tmp + ' );' + hb_osNewLine() ) } ) - FWrite( fhnd, '}' + hb_osNewLine() ) - FWrite( fhnd, '' + hb_osNewLine() ) + cFile += '' + Chr( 10 ) + AEval( array, {|tmp| cFile += 'HB_FUNC_EXTERN( ' + tmp + ' );' + Chr( 10 ) } ) + cFile += '' + Chr( 10 ) + cFile += 'void _hb_lnk_ForceLink_hbmk( void )' + Chr( 10 ) + cFile += '{' + Chr( 10 ) + AEval( array, {|tmp| cFile += ' HB_FUNC_EXEC( ' + tmp + ' );' + Chr( 10 ) } ) + cFile += '}' + Chr( 10 ) + cFile += '' + Chr( 10 ) ENDIF IF hbmk[ _HBMK_cGT ] != NIL .OR. ; l_cMAIN != NIL IF hbmk[ _HBMK_nHBMODE ] == _HBMODE_HB10 .OR. ; hbmk[ _HBMK_nHBMODE ] == _HBMODE_XHB - FWrite( fhnd, '#include "hbinit.h"' + hb_osNewLine() +; - '' + hb_osNewLine() +; - 'HB_EXTERN_BEGIN' + hb_osNewLine() +; - 'extern ' + tmp + ' const char * s_defaultGT;' + hb_osNewLine() +; - 'extern ' + tmp + ' const char * s_pszLinkedMain;' + hb_osNewLine() +; - 'HB_EXTERN_END' + hb_osNewLine() +; - '' + hb_osNewLine() +; - 'HB_CALL_ON_STARTUP_BEGIN( _hb_hbmk_setdef_ )' + hb_osNewLine() ) + cFile += '#include "hbinit.h"' + Chr( 10 ) +; + '' + Chr( 10 ) +; + 'HB_EXTERN_BEGIN' + Chr( 10 ) +; + 'extern ' + tmp + ' const char * s_defaultGT;' + Chr( 10 ) +; + 'extern ' + tmp + ' const char * s_pszLinkedMain;' + Chr( 10 ) +; + 'HB_EXTERN_END' + Chr( 10 ) +; + '' + Chr( 10 ) +; + 'HB_CALL_ON_STARTUP_BEGIN( _hb_hbmk_setdef_ )' + Chr( 10 ) ELSE - FWrite( fhnd, '#include "hbinit.h"' + hb_osNewLine() +; - '' + hb_osNewLine() +; - 'HB_EXTERN_BEGIN' + hb_osNewLine() +; - 'extern ' + tmp + ' void hb_vmSetLinkedMain( const char * szMain );' + hb_osNewLine() +; - 'extern ' + tmp + ' void hb_gtSetDefault( const char * szGtName );' + hb_osNewLine() +; - 'HB_EXTERN_END' + hb_osNewLine() +; - '' + hb_osNewLine() +; - 'HB_CALL_ON_STARTUP_BEGIN( _hb_hbmk_setdef_ )' + hb_osNewLine() ) + cFile += '#include "hbinit.h"' + Chr( 10 ) +; + '' + Chr( 10 ) +; + 'HB_EXTERN_BEGIN' + Chr( 10 ) +; + 'extern ' + tmp + ' void hb_vmSetLinkedMain( const char * szMain );' + Chr( 10 ) +; + 'extern ' + tmp + ' void hb_gtSetDefault( const char * szGtName );' + Chr( 10 ) +; + 'HB_EXTERN_END' + Chr( 10 ) +; + '' + Chr( 10 ) +; + 'HB_CALL_ON_STARTUP_BEGIN( _hb_hbmk_setdef_ )' + Chr( 10 ) ENDIF IF hbmk[ _HBMK_cGT ] != NIL IF hbmk[ _HBMK_nHBMODE ] == _HBMODE_HB10 .OR. ; hbmk[ _HBMK_nHBMODE ] == _HBMODE_XHB - FWrite( fhnd, ' s_defaultGT = "' + Upper( SubStr( hbmk[ _HBMK_cGT ], 3 ) ) + '";' + hb_osNewLine() ) + cFile += ' s_defaultGT = "' + Upper( SubStr( hbmk[ _HBMK_cGT ], 3 ) ) + '";' + Chr( 10 ) ELSE - FWrite( fhnd, ' hb_gtSetDefault( "' + Upper( SubStr( hbmk[ _HBMK_cGT ], 3 ) ) + '" );' + hb_osNewLine() ) + cFile += ' hb_gtSetDefault( "' + Upper( SubStr( hbmk[ _HBMK_cGT ], 3 ) ) + '" );' + Chr( 10 ) ENDIF ENDIF IF l_cMAIN != NIL IF hbmk[ _HBMK_nHBMODE ] == _HBMODE_HB10 .OR. ; hbmk[ _HBMK_nHBMODE ] == _HBMODE_XHB - FWrite( fhnd, ' s_pszLinkedMain = "' + Upper( l_cMAIN ) + '";' + hb_osNewLine() ) + cFile += ' s_pszLinkedMain = "' + Upper( l_cMAIN ) + '";' + Chr( 10 ) ELSE - FWrite( fhnd, ' hb_vmSetLinkedMain( "' + Upper( l_cMAIN ) + '" );' + hb_osNewLine() ) + cFile += ' hb_vmSetLinkedMain( "' + Upper( l_cMAIN ) + '" );' + Chr( 10 ) ENDIF ENDIF - FWrite( fhnd, 'HB_CALL_ON_STARTUP_END( _hb_hbmk_setdef_ )' + hb_osNewLine() +; - '' + hb_osNewLine() +; - '#if defined( HB_PRAGMA_STARTUP )' + hb_osNewLine() +; - ' #pragma startup_hb_lnk_SetDefault_hbmk_' + hb_osNewLine() +; - '#elif defined( HB_MSC_STARTUP )' + hb_osNewLine() +; - ' #if defined( HB_OS_WIN_64 )' + hb_osNewLine() +; - ' #pragma section( HB_MSC_START_SEGMENT, long, read )' + hb_osNewLine() +; - ' #endif' + hb_osNewLine() +; - ' #pragma data_seg( HB_MSC_START_SEGMENT )' + hb_osNewLine() +; - ' static HB_$INITSYM hb_vm_auto_hbmk_setdef_ = _hb_hbmk_setdef_;' + hb_osNewLine() +; - ' #pragma data_seg()' + hb_osNewLine() +; - '#endif' + hb_osNewLine() ) + cFile += 'HB_CALL_ON_STARTUP_END( _hb_hbmk_setdef_ )' + Chr( 10 ) +; + '' + Chr( 10 ) +; + '#if defined( HB_PRAGMA_STARTUP )' + Chr( 10 ) +; + ' #pragma startup_hb_lnk_SetDefault_hbmk_' + Chr( 10 ) +; + '#elif defined( HB_MSC_STARTUP )' + Chr( 10 ) +; + ' #if defined( HB_OS_WIN_64 )' + Chr( 10 ) +; + ' #pragma section( HB_MSC_START_SEGMENT, long, read )' + Chr( 10 ) +; + ' #endif' + Chr( 10 ) +; + ' #pragma data_seg( HB_MSC_START_SEGMENT )' + Chr( 10 ) +; + ' static HB_$INITSYM hb_vm_auto_hbmk_setdef_ = _hb_hbmk_setdef_;' + Chr( 10 ) +; + ' #pragma data_seg()' + Chr( 10 ) +; + '#endif' + Chr( 10 ) ENDIF - FClose( fhnd ) - IF hbmk[ _HBMK_lDEBUGSTUB ] - OutStd( "C stub dump:" + hb_osNewLine() ) - OutStd( hb_MemoRead( l_cCSTUB ) ) + IF hbmk[ _HBMK_lINC ] + IF hbmk[ _HBMK_lREBUILD ] .OR. !( hb_MemoRead( l_cCSTUB ) == cFile ) + fhnd := FCreate( l_cCSTUB ) + ELSE + fhnd := NIL + ENDIF + ELSE + fhnd := hb_FTempCreateEx( @l_cCSTUB, NIL, "hbmk_", ".c" ) ENDIF - ELSE - hbmk_OutErr( hbmk, I_( "Warning: Stub helper .c program couldn't be created." ) ) - IF ! hbmk[ _HBMK_lINC ] - AEval( ListDirExt( hbmk[ _HBMK_aPRG ], cWorkDir, ".c" ), {|tmp| FErase( tmp ) } ) + IF fhnd == NIL + AAdd( hbmk[ _HBMK_aC ], l_cCSTUB ) + ELSEIF fhnd != F_ERROR + FWrite( fhnd, cFile ) + FClose( fhnd ) + + IF hbmk[ _HBMK_lDEBUGSTUB ] + OutStd( "C stub dump:" + hb_osNewLine() ) + OutStd( cFile ) + ENDIF + AAdd( hbmk[ _HBMK_aC ], l_cCSTUB ) + AAdd( l_aC_TODO, l_cCSTUB ) + ELSE + hbmk_OutErr( hbmk, I_( "Warning: Stub helper .c program couldn't be created." ) ) + IF ! hbmk[ _HBMK_lINC ] + AEval( ListDirExt( hbmk[ _HBMK_aPRG ], cWorkDir, ".c" ), {|tmp| FErase( tmp ) } ) + ENDIF + IF hbmk[ _HBMK_lBEEP ] + DoBeep( hbmk, .F. ) + ENDIF + RETURN 5 ENDIF - IF hbmk[ _HBMK_lBEEP ] - DoBeep( hbmk, .F. ) + /* Don't delete stub in workdir in incremental mode. */ + IF hbmk[ _HBMK_lINC ] + l_cCSTUB := NIL ENDIF - RETURN 5 ENDIF - AAdd( hbmk[ _HBMK_aC ], l_cCSTUB ) - AAdd( l_aC_TODO, l_cCSTUB ) ENDIF /* Library list assembly */ @@ -3486,26 +3506,45 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) ENDIF IF hbmk[ _HBMK_cARCH ] $ "win|wce|os2" .AND. ; - ! Empty( hbmk[ _HBMK_aICON ] ) .AND. ! l_lCLEAN + ! Empty( hbmk[ _HBMK_aICON ] ) - fhnd := hb_FTempCreateEx( @l_cRESSTUB, NIL, "hbmk_", ".rc" ) - IF fhnd != F_ERROR + l_cRESSTUB := DirAddPathSep( cWorkDir ) + "_hbmkaut.rc" + IF ! l_lCLEAN /* Build .rc stub */ - FWrite( fhnd, '/* This temp source file was generated by hbmk tool. */' + hb_osNewLine() +; - '/* You can safely delete it. */' + hb_osNewLine() +; - '' + hb_osNewLine() ) - AEval( hbmk[ _HBMK_aICON ], {|tmp, tmp1| FWrite( fhnd, 'ICON' + hb_ntos( tmp1 ) + ' ICON DISCARDABLE "' + FN_Escape( PathSepToTarget( hbmk, tmp ), _ESC_BACKSLASH ) + '"' + hb_osNewLine() ) } ) - FClose( fhnd ) + cFile := '/* This temp source file was generated by hbmk tool. */' + Chr( 10 ) +; + '/* You can safely delete it. */' + Chr( 10 ) +; + '' + Chr( 10 ) + AEval( hbmk[ _HBMK_aICON ], {|tmp, tmp1| cFile += 'ICON' + hb_ntos( tmp1 ) + ' ICON DISCARDABLE "' + FN_Escape( PathSepToTarget( hbmk, tmp ), _ESC_BACKSLASH ) + '"' + Chr( 10 ) } ) - IF hbmk[ _HBMK_lDEBUGSTUB ] - OutStd( ".rc stub dump:" + hb_osNewLine() ) - OutStd( hb_MemoRead( l_cRESSTUB ) ) + IF hbmk[ _HBMK_lINC ] + IF hbmk[ _HBMK_lREBUILD ] .OR. !( hb_MemoRead( l_cRESSTUB ) == cFile ) + fhnd := FCreate( l_cRESSTUB ) + ELSE + fhnd := NIL + ENDIF + ELSE + fhnd := hb_FTempCreateEx( @l_cRESSTUB, NIL, "hbmk_", ".rc" ) + ENDIF + IF fhnd == NIL + hb_AIns( hbmk[ _HBMK_aRESSRC ], 1, l_cRESSTUB, .T. ) + ELSEIF fhnd != F_ERROR + FWrite( fhnd, cFile ) + FClose( fhnd ) + + IF hbmk[ _HBMK_lDEBUGSTUB ] + OutStd( ".rc stub dump:" + hb_osNewLine() ) + OutStd( cFile ) + ENDIF + hb_AIns( hbmk[ _HBMK_aRESSRC ], 1, l_cRESSTUB, .T. ) + AAdd( l_aRESSRC_TODO, l_cRESSTUB ) + ELSE + hbmk_OutErr( hbmk, I_( "Warning: Stub helper .rc file couldn't be created." ) ) + ENDIF + /* Don't delete stub in workdir in incremental mode. */ + IF hbmk[ _HBMK_lINC ] + l_cRESSTUB := NIL ENDIF - hb_AIns( hbmk[ _HBMK_aRESSRC ], 1, l_cRESSTUB, .T. ) - AAdd( l_aRESSRC_TODO, l_cRESSTUB ) - ELSE - hbmk_OutErr( hbmk, I_( "Warning: Stub helper .rc file couldn't be created." ) ) ENDIF ENDIF