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)
This commit is contained in:
Viktor Szakats
2009-08-06 13:43:53 +00:00
parent 06761b8779
commit 896fdcef4f
2 changed files with 125 additions and 76 deletions

View File

@@ -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

View File

@@ -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