From d372987f382e164f19967b11e5d284f4053a1f09 Mon Sep 17 00:00:00 2001 From: Viktor Szakats Date: Sun, 7 Jun 2009 09:07:29 +0000 Subject: [PATCH] 2009-06-07 11:05 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) * utils/hbmk2/hbmk2.hu_HU.po * utils/hbmk2/hbmk2.prg + Added experimental pure C build mode. Activate with -hbc (cmdline only). In this mode Harbour libs won't be linked, .prgs won't be compiled, language files won't be handled, options will be treatet as C compiler ones, and obviously some other Harbour related hbmk2 options will be ignored. * Minor translation update. --- harbour/ChangeLog | 16 +- harbour/utils/hbmk2/hbmk2.hu_HU.po | 4 +- harbour/utils/hbmk2/hbmk2.prg | 374 +++++++++++++++-------------- 3 files changed, 214 insertions(+), 180 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index ff99563aeb..c5990580bf 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,6 +17,16 @@ past entries belonging to author(s): Viktor Szakats. */ +2009-06-07 11:05 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) + * utils/hbmk2/hbmk2.hu_HU.po + * utils/hbmk2/hbmk2.prg + + Added experimental pure C build mode. Activate with -hbc + (cmdline only). In this mode Harbour libs won't be linked, + .prgs won't be compiled, language files won't be handled, + options will be treatet as C compiler ones, and obviously + some other Harbour related hbmk2 options will be ignored. + * Minor translation update. + 2009-06-06 19:01 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com) * harbour/contrib/hbqt/Makefile_gen @@ -38,16 +48,16 @@ * harbour/contrib/hbqt/generator/qt45.qtp + Added one more class and fixed another. - + /* Now demoqt demonstrates a lot of controls. Central widget is added to the main window to host all other controls. - Main window hosts + Main window hosts QMenuBar() QToolBar() QStatusBar() - QWidget() - central == drawingArea of XbpDialog() in Xbase++. + QWidget() - central == drawingArea of XbpDialog() in Xbase++. :drawingArea hosts: QTableWidget() | QTableWidgetItem() diff --git a/harbour/utils/hbmk2/hbmk2.hu_HU.po b/harbour/utils/hbmk2/hbmk2.hu_HU.po index e94b12293a..312ce2dda8 100644 --- a/harbour/utils/hbmk2/hbmk2.hu_HU.po +++ b/harbour/utils/hbmk2/hbmk2.hu_HU.po @@ -509,8 +509,8 @@ msgstr "haszn #: hbmk2.prg:5688 #, c-format -msgid "link with library" -msgstr "szerkessze be függvénykönyvtárat" +msgid "link with library. should be without path, extension and 'lib' prefix (unless part of libname)." +msgstr "szerkessze be függvénykönyvtárat. -ben nem szerepelhet útvonal, kiterjesztés és 'lib' előtag (kivéve ha az a név része)." #: hbmk2.prg:5758 #, c-format diff --git a/harbour/utils/hbmk2/hbmk2.prg b/harbour/utils/hbmk2/hbmk2.prg index 7c5491235a..fd7dece987 100644 --- a/harbour/utils/hbmk2/hbmk2.prg +++ b/harbour/utils/hbmk2/hbmk2.prg @@ -162,6 +162,7 @@ REQUEST hbmk_KEYW #define _HBMODE_NATIVE 0 #define _HBMODE_HB10 1 #define _HBMODE_XHB 2 +#define _HBMODE_RAW_C 3 #define _CONF_RELEASE 0 /* No debug */ #define _CONF_DEBUG 1 /* Harbour level debug */ @@ -586,7 +587,6 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) hbmk[ _HBMK_lINC ] := .F. hbmk[ _HBMK_lREBUILDPO ] := .F. hbmk[ _HBMK_lMINIPO ] := .F. - hbmk[ _HBMK_lUNICODE ] := .F. hbmk[ _HBMK_nCONF ] := _CONF_RELEASE hbmk[ _HBMK_lDEBUGTIME ] := .F. @@ -628,6 +628,7 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) CASE cParamL == "-info" ; hbmk[ _HBMK_lInfo ] := .T. CASE cParamL == "-xhb" ; hbmk[ _HBMK_nHBMODE ] := _HBMODE_XHB CASE cParamL == "-hb10" ; hbmk[ _HBMK_nHBMODE ] := _HBMODE_HB10 + CASE cParamL == "-hbc" ; hbmk[ _HBMK_nHBMODE ] := _HBMODE_RAW_C ; lAcceptCFlag := .T. CASE cParamL == "-help" .OR. ; cParamL == "--help" @@ -954,50 +955,60 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) /* Autodetect Harbour environment */ - /* Detect system locations to enable shared library option by default */ - lSysLoc := hb_DirBase() == "/usr/local/bin/" .OR. ; - hb_DirBase() == "/usr/bin/" .OR. ; - hb_DirBase() == "/opt/harbour/" .OR. ; - hb_DirBase() == "/opt/bin/" + IF hbmk[ _HBMK_nHBMODE ] != _HBMODE_RAW_C - s_cHB_BIN_INSTALL := PathSepToSelf( GetEnv( "HB_BIN_INSTALL" ) ) - s_cHB_LIB_INSTALL := PathSepToSelf( GetEnv( "HB_LIB_INSTALL" ) ) - s_cHB_INC_INSTALL := PathSepToSelf( GetEnv( "HB_INC_INSTALL" ) ) + /* Detect system locations to enable shared library option by default */ + lSysLoc := hb_DirBase() == "/usr/local/bin/" .OR. ; + hb_DirBase() == "/usr/bin/" .OR. ; + hb_DirBase() == "/opt/harbour/" .OR. ; + hb_DirBase() == "/opt/bin/" - s_cHB_INSTALL_PREFIX := PathSepToSelf( GetEnv( "HB_INSTALL_PREFIX" ) ) - IF Empty( s_cHB_INSTALL_PREFIX ) - DO CASE - CASE hb_FileExists( DirAddPathSep( hb_DirBase() ) + cBin_CompPRG + cBinExt ) - s_cHB_INSTALL_PREFIX := DirAddPathSep( hb_DirBase() ) + ".." - CASE hb_FileExists( DirAddPathSep( hb_DirBase() ) + "bin" + hb_osPathSeparator() + cBin_CompPRG + cBinExt ) - s_cHB_INSTALL_PREFIX := DirAddPathSep( hb_DirBase() ) - CASE hb_FileExists( DirAddPathSep( hb_DirBase() ) + ".." + hb_osPathSeparator() + ".." + hb_osPathSeparator() + "bin" + hb_osPathSeparator() + cBin_CompPRG + cBinExt ) - s_cHB_INSTALL_PREFIX := DirAddPathSep( hb_DirBase() ) + ".." + hb_osPathSeparator() + ".." - CASE hb_FileExists( DirAddPathSep( hb_DirBase() ) + ".." + hb_osPathSeparator() + ".." + hb_osPathSeparator() + ".." + hb_osPathSeparator() + "bin" + hb_osPathSeparator() + cBin_CompPRG + cBinExt ) - s_cHB_INSTALL_PREFIX := DirAddPathSep( hb_DirBase() ) + ".." + hb_osPathSeparator() + ".." + hb_osPathSeparator() + ".." - OTHERWISE - hbmk_OutErr( hbmk, I_( "Error: HB_INSTALL_PREFIX not set, failed to autodetect." ) ) - RETURN 3 - ENDCASE - /* Detect special *nix dir layout (/bin, /lib/harbour, /include/harbour) */ - IF hb_FileExists( DirAddPathSep( s_cHB_INSTALL_PREFIX ) + "include" +; - hb_osPathSeparator() + iif( hbmk[ _HBMK_nHBMODE ] == _HBMODE_XHB, "xharbour", "harbour" ) +; - hb_osPathSeparator() + "hbvm.h" ) - IF Empty( s_cHB_BIN_INSTALL ) - s_cHB_BIN_INSTALL := PathNormalize( s_cHB_INSTALL_PREFIX ) + "bin" - ENDIF - IF Empty( s_cHB_LIB_INSTALL ) - s_cHB_LIB_INSTALL := PathNormalize( s_cHB_INSTALL_PREFIX ) + "lib" + hb_osPathSeparator() + iif( hbmk[ _HBMK_nHBMODE ] == _HBMODE_XHB, "xharbour", "harbour" ) - ENDIF - IF Empty( s_cHB_INC_INSTALL ) - s_cHB_INC_INSTALL := PathNormalize( s_cHB_INSTALL_PREFIX ) + "include" + hb_osPathSeparator() + iif( hbmk[ _HBMK_nHBMODE ] == _HBMODE_XHB, "xharbour", "harbour" ) + s_cHB_BIN_INSTALL := PathSepToSelf( GetEnv( "HB_BIN_INSTALL" ) ) + s_cHB_LIB_INSTALL := PathSepToSelf( GetEnv( "HB_LIB_INSTALL" ) ) + s_cHB_INC_INSTALL := PathSepToSelf( GetEnv( "HB_INC_INSTALL" ) ) + + s_cHB_INSTALL_PREFIX := PathSepToSelf( GetEnv( "HB_INSTALL_PREFIX" ) ) + IF Empty( s_cHB_INSTALL_PREFIX ) + DO CASE + CASE hb_FileExists( DirAddPathSep( hb_DirBase() ) + cBin_CompPRG + cBinExt ) + s_cHB_INSTALL_PREFIX := DirAddPathSep( hb_DirBase() ) + ".." + CASE hb_FileExists( DirAddPathSep( hb_DirBase() ) + "bin" + hb_osPathSeparator() + cBin_CompPRG + cBinExt ) + s_cHB_INSTALL_PREFIX := DirAddPathSep( hb_DirBase() ) + CASE hb_FileExists( DirAddPathSep( hb_DirBase() ) + ".." + hb_osPathSeparator() + ".." + hb_osPathSeparator() + "bin" + hb_osPathSeparator() + cBin_CompPRG + cBinExt ) + s_cHB_INSTALL_PREFIX := DirAddPathSep( hb_DirBase() ) + ".." + hb_osPathSeparator() + ".." + CASE hb_FileExists( DirAddPathSep( hb_DirBase() ) + ".." + hb_osPathSeparator() + ".." + hb_osPathSeparator() + ".." + hb_osPathSeparator() + "bin" + hb_osPathSeparator() + cBin_CompPRG + cBinExt ) + s_cHB_INSTALL_PREFIX := DirAddPathSep( hb_DirBase() ) + ".." + hb_osPathSeparator() + ".." + hb_osPathSeparator() + ".." + OTHERWISE + hbmk_OutErr( hbmk, I_( "Error: HB_INSTALL_PREFIX not set, failed to autodetect." ) ) + RETURN 3 + ENDCASE + /* Detect special *nix dir layout (/bin, /lib/harbour, /include/harbour) */ + IF hb_FileExists( DirAddPathSep( s_cHB_INSTALL_PREFIX ) + "include" +; + hb_osPathSeparator() + iif( hbmk[ _HBMK_nHBMODE ] == _HBMODE_XHB, "xharbour", "harbour" ) +; + hb_osPathSeparator() + "hbvm.h" ) + IF Empty( s_cHB_BIN_INSTALL ) + s_cHB_BIN_INSTALL := PathNormalize( s_cHB_INSTALL_PREFIX ) + "bin" + ENDIF + IF Empty( s_cHB_LIB_INSTALL ) + s_cHB_LIB_INSTALL := PathNormalize( s_cHB_INSTALL_PREFIX ) + "lib" + hb_osPathSeparator() + iif( hbmk[ _HBMK_nHBMODE ] == _HBMODE_XHB, "xharbour", "harbour" ) + ENDIF + IF Empty( s_cHB_INC_INSTALL ) + s_cHB_INC_INSTALL := PathNormalize( s_cHB_INSTALL_PREFIX ) + "include" + hb_osPathSeparator() + iif( hbmk[ _HBMK_nHBMODE ] == _HBMODE_XHB, "xharbour", "harbour" ) + ENDIF ENDIF ENDIF - ENDIF - IF Empty( s_cHB_INSTALL_PREFIX ) .AND. ; - ( Empty( s_cHB_BIN_INSTALL ) .OR. Empty( s_cHB_LIB_INSTALL ) .OR. Empty( s_cHB_INC_INSTALL ) ) - hbmk_OutErr( hbmk, I_( "Error: Harbour locations couldn't be determined." ) ) - RETURN 3 + IF Empty( s_cHB_INSTALL_PREFIX ) .AND. ; + ( Empty( s_cHB_BIN_INSTALL ) .OR. Empty( s_cHB_LIB_INSTALL ) .OR. Empty( s_cHB_INC_INSTALL ) ) + hbmk_OutErr( hbmk, I_( "Error: Harbour locations couldn't be determined." ) ) + RETURN 3 + ENDIF + ELSE + lSysLoc := .F. + + s_cHB_BIN_INSTALL := "" + s_cHB_LIB_INSTALL := "" + s_cHB_INC_INSTALL := "" + s_cHB_INSTALL_PREFIX := "" ENDIF aCOMPDET_LOCAL := {} @@ -1226,6 +1237,7 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) hbmk[ _HBMK_cPO ] := NIL hbmk[ _HBMK_aLNG ] := {} hbmk[ _HBMK_aINSTPATH ] := {} + hbmk[ _HBMK_lUNICODE ] := ( hbmk[ _HBMK_cARCH ] == "wce" ) aParams := {} @@ -1289,6 +1301,7 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) cParamL == "-nohbc" .OR. ; cParamL == "-xhb" .OR. ; cParamL == "-hb10" .OR. ; + cParamL == "-hbc" .OR. ; cParamL == "-clipper" .OR. ; cParamL == "-rtlink" .OR. ; cParamL == "-blinker" .OR. ; @@ -2876,7 +2889,7 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) /* Create incremental file list for .prg files */ - IF ! lSkipBuild .AND. ! lStopAfterInit .AND. ! lStopAfterHarbour + IF ! lSkipBuild .AND. ! lStopAfterInit .AND. ! lStopAfterHarbour .AND. hbmk[ _HBMK_nHBMODE ] != _HBMODE_RAW_C /* Incremental */ @@ -2904,7 +2917,7 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) /* Harbour compilation */ - IF ! lSkipBuild .AND. ! lStopAfterInit .AND. Len( s_aPRG_TODO ) > 0 .AND. ! s_lCLEAN + IF ! lSkipBuild .AND. ! lStopAfterInit .AND. Len( s_aPRG_TODO ) > 0 .AND. ! s_lCLEAN .AND. hbmk[ _HBMK_nHBMODE ] != _HBMODE_RAW_C IF hbmk[ _HBMK_lINC ] .AND. ! hbmk[ _HBMK_lQuiet ] hbmk_OutStd( hbmk, I_( "Compiling Harbour sources..." ) ) @@ -3013,137 +3026,144 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) IF ! lSkipBuild .AND. ! lStopAfterInit .AND. ! lStopAfterHarbour - /* Do entry function detection on platform required and supported */ - IF ! hbmk[ _HBMK_lDONTEXEC ] .AND. ! lStopAfterCComp .AND. s_cMAIN == NIL - tmp := iif( Lower( FN_ExtGet( s_cFIRST ) ) == ".prg" .OR. Empty( FN_ExtGet( s_cFIRST ) ), FN_ExtSet( s_cFIRST, ".c" ), s_cFIRST ) - IF ! Empty( tmp := getFirstFunc( hbmk, tmp ) ) - s_cMAIN := tmp + IF hbmk[ _HBMK_nHBMODE ] != _HBMODE_RAW_C + + /* Do entry function detection on platform required and supported */ + IF ! hbmk[ _HBMK_lDONTEXEC ] .AND. ! lStopAfterCComp .AND. s_cMAIN == NIL + tmp := iif( Lower( FN_ExtGet( s_cFIRST ) ) == ".prg" .OR. Empty( FN_ExtGet( s_cFIRST ) ), FN_ExtSet( s_cFIRST, ".c" ), s_cFIRST ) + IF ! Empty( tmp := getFirstFunc( hbmk, tmp ) ) + s_cMAIN := tmp + ENDIF ENDIF - ENDIF - /* HACK: Override entry point requested by user or detected by us, - and override the GT if requested by user. */ - IF ! lStopAfterCComp .AND. ; - ! s_lCLEAN .AND. ; - ( s_cMAIN != NIL .OR. ; - ! Empty( hbmk[ _HBMK_aLIBUSERGT ] ) .OR. ; - hbmk[ _HBMK_cGT ] != NIL ) + /* HACK: Override entry point requested by user or detected by us, + and override the GT if requested by user. */ + IF ! lStopAfterCComp .AND. ; + ! s_lCLEAN .AND. ; + ( s_cMAIN != NIL .OR. ; + ! Empty( hbmk[ _HBMK_aLIBUSERGT ] ) .OR. ; + hbmk[ _HBMK_cGT ] != NIL ) - fhnd := hb_FTempCreateEx( @s_cCSTUB, NIL, "hbmk_", ".c" ) - IF fhnd != F_ERROR + fhnd := hb_FTempCreateEx( @s_cCSTUB, NIL, "hbmk_", ".c" ) + IF fhnd != F_ERROR - /* NOTE: This has to be kept synced with Harbour HB_IMPORT values. */ - DO CASE - CASE ! hbmk[ _HBMK_lSHARED ] .OR. ; - !( hbmk[ _HBMK_cARCH ] $ "win|wce" ) .OR. ; - hbmk[ _HBMK_cCOMP ] $ "msvc|msvc64|msvcia64|icc|iccia64" + /* NOTE: This has to be kept synced with Harbour HB_IMPORT values. */ + DO CASE + CASE ! hbmk[ _HBMK_lSHARED ] .OR. ; + !( hbmk[ _HBMK_cARCH ] $ "win|wce" ) .OR. ; + hbmk[ _HBMK_cCOMP ] $ "msvc|msvc64|msvcia64|icc|iccia64" - /* NOTE: MSVC gives the warning: - "LNK4217: locally defined symbol ... imported in function ..." - if using 'dllimport'. [vszakats] */ - tmp := "" - CASE hbmk[ _HBMK_cCOMP ] $ "gcc|mingw|mingw64|mingwarm|cygwin" - tmp := "__attribute__ (( dllimport ))" - CASE hbmk[ _HBMK_cCOMP ] $ "bcc|owatcom" - tmp := "__declspec( dllimport )" - OTHERWISE - tmp := "_declspec( dllimport )" - ENDCASE + /* NOTE: MSVC gives the warning: + "LNK4217: locally defined symbol ... imported in function ..." + if using 'dllimport'. [vszakats] */ + tmp := "" + CASE hbmk[ _HBMK_cCOMP ] $ "gcc|mingw|mingw64|mingwarm|cygwin" + tmp := "__attribute__ (( dllimport ))" + CASE hbmk[ _HBMK_cCOMP ] $ "bcc|owatcom" + tmp := "__declspec( dllimport )" + OTHERWISE + tmp := "_declspec( dllimport )" + ENDCASE - /* Create list of requested symbols */ - array := {} - IF s_cMAIN != NIL - /* NOTE: Request this function to generate link error, rather - than starting with the wrong (default) function. */ - AAdd( array, Upper( iif( Left( s_cMAIN, 1 ) == "@", SubStr( s_cMAIN, 2 ), s_cMAIN ) ) ) - ENDIF - IF hbmk[ _HBMK_cGT ] != NIL - /* Always request default GT first */ - AAdd( array, "HB_GT_" + Upper( SubStr( hbmk[ _HBMK_cGT ], 3 ) ) ) - ENDIF - IF ! Empty( hbmk[ _HBMK_aLIBUSERGT ] ) - AEval( hbmk[ _HBMK_aLIBUSERGT ], {|tmp| AAdd( array, "HB_GT_" + Upper( SubStr( tmp, 3 ) ) ) } ) - 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() ) - IF ! Empty( array ) - 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() ) - ENDIF - - IF hbmk[ _HBMK_cGT ] != NIL .OR. ; - s_cMAIN != NIL - 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() ) - IF hbmk[ _HBMK_cGT ] != NIL - FWrite( fhnd, ' hb_gtSetDefault( "' + Upper( SubStr( hbmk[ _HBMK_cGT ], 3 ) ) + '" );' + hb_osNewLine() ) - ENDIF + /* Create list of requested symbols */ + array := {} IF s_cMAIN != NIL - FWrite( fhnd, ' hb_vmSetLinkedMain( "' + Upper( s_cMAIN ) + '" );' + hb_osNewLine() ) + /* NOTE: Request this function to generate link error, rather + than starting with the wrong (default) function. */ + AAdd( array, Upper( iif( Left( s_cMAIN, 1 ) == "@", SubStr( s_cMAIN, 2 ), s_cMAIN ) ) ) + ENDIF + IF hbmk[ _HBMK_cGT ] != NIL + /* Always request default GT first */ + AAdd( array, "HB_GT_" + Upper( SubStr( hbmk[ _HBMK_cGT ], 3 ) ) ) + ENDIF + IF ! Empty( hbmk[ _HBMK_aLIBUSERGT ] ) + AEval( hbmk[ _HBMK_aLIBUSERGT ], {|tmp| AAdd( array, "HB_GT_" + Upper( SubStr( tmp, 3 ) ) ) } ) 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() ) - ENDIF - FClose( fhnd ) - IF hbmk[ _HBMK_lDEBUGSTUB ] - OutStd( "C stub dump:" + hb_osNewLine() ) - OutStd( hb_MemoRead( s_cCSTUB ) ) + /* 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() ) + IF ! Empty( array ) + 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() ) + ENDIF + + IF hbmk[ _HBMK_cGT ] != NIL .OR. ; + s_cMAIN != NIL + 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() ) + IF hbmk[ _HBMK_cGT ] != NIL + FWrite( fhnd, ' hb_gtSetDefault( "' + Upper( SubStr( hbmk[ _HBMK_cGT ], 3 ) ) + '" );' + hb_osNewLine() ) + ENDIF + IF s_cMAIN != NIL + FWrite( fhnd, ' hb_vmSetLinkedMain( "' + Upper( s_cMAIN ) + '" );' + hb_osNewLine() ) + 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() ) + ENDIF + FClose( fhnd ) + + IF hbmk[ _HBMK_lDEBUGSTUB ] + OutStd( "C stub dump:" + hb_osNewLine() ) + OutStd( hb_MemoRead( s_cCSTUB ) ) + ENDIF + ELSE + hbmk_OutErr( hbmk, I_( "Warning: Stub helper .c program couldn't be created." ) ) + IF ! hbmk[ _HBMK_lINC ] + AEval( ListDirExt( s_aPRG, cWorkDir, ".c" ), {|tmp| FErase( tmp ) } ) + ENDIF + IF s_lBEEP + DoBeep( hbmk, .F. ) + ENDIF + RETURN 5 ENDIF - ELSE - hbmk_OutErr( hbmk, I_( "Warning: Stub helper .c program couldn't be created." ) ) - IF ! hbmk[ _HBMK_lINC ] - AEval( ListDirExt( s_aPRG, cWorkDir, ".c" ), {|tmp| FErase( tmp ) } ) - ENDIF - IF s_lBEEP - DoBeep( hbmk, .F. ) - ENDIF - RETURN 5 + AAdd( s_aC, s_cCSTUB ) + AAdd( s_aC_TODO, s_cCSTUB ) ENDIF - AAdd( s_aC, s_cCSTUB ) - AAdd( s_aC_TODO, s_cCSTUB ) - ENDIF - /* Library list assembly */ - IF hbmk[ _HBMK_lSHARED ] .AND. ! Empty( s_aLIBSHARED ) - s_aLIBHB := ArrayAJoin( { s_aLIBSHAREDPOST,; - aLIB_BASE_CPLR,; - aLIB_BASE_DEBUG } ) + /* Library list assembly */ + IF hbmk[ _HBMK_lSHARED ] .AND. ! Empty( s_aLIBSHARED ) + s_aLIBHB := ArrayAJoin( { s_aLIBSHAREDPOST,; + aLIB_BASE_CPLR,; + aLIB_BASE_DEBUG } ) + ELSE + s_aLIBHB := ArrayAJoin( { aLIB_BASE1,; + aLIB_BASE_CPLR,; + aLIB_BASE_DEBUG,; + s_aLIBVM,; + iif( hbmk[ _HBMK_lNULRDD ], aLIB_BASE_NULRDD, iif( hbmk[ _HBMK_lMT ], aLIB_BASE_RDD_MT, aLIB_BASE_RDD_ST ) ),; + aLIB_BASE2,; + iif( s_lHB_PCRE, aLIB_BASE_PCRE, {} ),; + iif( s_lHB_ZLIB, aLIB_BASE_ZLIB, {} ) } ) + ENDIF ELSE - s_aLIBHB := ArrayAJoin( { aLIB_BASE1,; - aLIB_BASE_CPLR,; - aLIB_BASE_DEBUG,; - s_aLIBVM,; - iif( hbmk[ _HBMK_lNULRDD ], aLIB_BASE_NULRDD, iif( hbmk[ _HBMK_lMT ], aLIB_BASE_RDD_MT, aLIB_BASE_RDD_ST ) ),; - aLIB_BASE2,; - iif( s_lHB_PCRE, aLIB_BASE_PCRE, {} ),; - iif( s_lHB_ZLIB, aLIB_BASE_ZLIB, {} ) } ) + s_aLIBHB := {} + s_aLIBSHARED := {} + s_aPRG := {} ENDIF /* Merge lib lists. */ @@ -3175,18 +3195,20 @@ FUNCTION hbmk( aArgs, /* @ */ lPause, /* @ */ lUTF8 ) s_aRESSRC_TODO := s_aRESSRC ENDIF - IF hbmk[ _HBMK_lREBUILDPO ] - IF ! Empty( hbmk[ _HBMK_cPO ] ) .AND. ! Empty( s_aPRG ) - RebuildPO( hbmk, ListDirExt( s_aPRG, cWorkDir, ".pot" ) ) + IF hbmk[ _HBMK_nHBMODE ] != _HBMODE_RAW_C + IF hbmk[ _HBMK_lREBUILDPO ] + IF ! Empty( hbmk[ _HBMK_cPO ] ) .AND. ! Empty( s_aPRG ) + RebuildPO( hbmk, ListDirExt( s_aPRG, cWorkDir, ".pot" ) ) + ENDIF + ELSE + IF ! Empty( hbmk[ _HBMK_cPO ] ) .AND. Len( s_aPRG_TODO ) > 0 + UpdatePO( hbmk, ListDirExt( s_aPRG_TODO, cWorkDir, ".pot" ) ) + ENDIF ENDIF - ELSE - IF ! Empty( hbmk[ _HBMK_cPO ] ) .AND. Len( s_aPRG_TODO ) > 0 - UpdatePO( hbmk, ListDirExt( s_aPRG_TODO, cWorkDir, ".pot" ) ) - ENDIF - ENDIF - IF Len( hbmk[ _HBMK_aPO ] ) > 0 .AND. hbmk[ _HBMK_cHBL ] != NIL .AND. ! s_lCLEAN - MakeHBL( hbmk, hbmk[ _HBMK_cHBL ] ) + IF Len( hbmk[ _HBMK_aPO ] ) > 0 .AND. hbmk[ _HBMK_cHBL ] != NIL .AND. ! s_lCLEAN + MakeHBL( hbmk, hbmk[ _HBMK_cHBL ] ) + ENDIF ENDIF IF Len( s_aRESSRC_TODO ) > 0 .AND. ! Empty( cBin_Res ) .AND. ! s_lCLEAN @@ -6001,12 +6023,14 @@ STATIC PROCEDURE ShowHelp( hbmk, lLong ) LOCAL aOpt_Basic := {; { "-o" , I_( "output file name" ) },; - { "-l" , I_( "link with library. should be without path, extension and lib prefix (unless part of libname)." ) },; + { "-l" , I_( "link with library. should be without path, extension and 'lib' prefix (unless part of libname)." ) },; { "-L" , I_( "additional path to search for libraries" ) },; { "-i

|-incpath=

", I_( "additional path to search for headers" ) },; { "-static|-shared" , I_( "link with static/shared libs" ) },; { "-mt|-st" , I_( "link with multi/single-thread VM" ) },; - { "-gt" , I_( "link with GT GT driver, can be repeated to link with more GTs. First one will be the default at runtime" ) } } + { "-gt" , I_( "link with GT GT driver, can be repeated to link with more GTs. First one will be the default at runtime" ) },; + { "-hblib" , I_( "create static library" ) },; + { "-hbdyn" , I_( "create dynamic library" ) }} LOCAL aOpt_Help := {; { "-help|--help" , I_( "long help" ) } } @@ -6067,13 +6091,13 @@ STATIC PROCEDURE ShowHelp( hbmk, lLong ) { "-hbcmp|-clipper" , I_( "stop after creating the object files\ncreate link/copy hbmk to hbcmp/clipper for the same effect" ) },; { "-hbcc" , I_( "stop after creating the object files and accept raw C flags\ncreate link/copy hbmk to hbcc for the same effect" ) },; { "-hblnk" , I_( "accept raw linker flags" ) },; - { "-hblib" , I_( "create static library" ) },; - { "-hbdyn" , I_( "create dynamic library" ) },; { "-hb10" , I_( "enable Harbour 1.0.x compatibility mode (experimental)" ) },; { "-xhb" , I_( "enable xhb mode (experimental)" ) },; + { "-hbc" , I_( "enable pure C mode (experimental)" ) },; { "-rtlink" , "" },; { "-blinker" , "" },; { "-exospace" , I_( "emulate Clipper compatible linker behavior\ncreate link/copy hbmk to rtlink/blinker/exospace for the same effect" ) },; + NIL,; { "--hbdirbin" , I_( "output Harbour binary directory" ) },; { "--hbdirdyn" , I_( "output Harbour dynamic library directory" ) },; { "--hbdirlib" , I_( "output Harbour static library directory" ) },;