From 079063a91f0081ff791a1e264a7138b3599b50df Mon Sep 17 00:00:00 2001 From: Viktor Szakats Date: Fri, 1 May 2009 12:54:58 +0000 Subject: [PATCH] 2009-05-01 14:53 UTC+0200 Viktor Szakats (harbour.01 syenar hu) * utils/hbmk2/hbmk2.prg + Added MT support for rest of C compilers (gcc, pocc). Please test. MT support is now complete, maybe in the future it can be added for resource compiling if that's a bottleneck for some users. --- harbour/ChangeLog | 7 +++ harbour/utils/hbmk2/hbmk2.prg | 89 +++++++++++++++++++++++++---------- 2 files changed, 70 insertions(+), 26 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index c78a128bfa..d30b9e37e3 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,6 +17,13 @@ past entries belonging to these authors: Viktor Szakats. */ +2009-05-01 14:53 UTC+0200 Viktor Szakats (harbour.01 syenar hu) + * utils/hbmk2/hbmk2.prg + + Added MT support for rest of C compilers (gcc, pocc). + Please test. MT support is now complete, maybe in the + future it can be added for resource compiling if that's + a bottleneck for some users. + 2009-05-01 13:17 UTC+0200 Viktor Szakats (harbour.01 syenar hu) * bin/postinst.bat + Added generation of libpq.lib from .dll for msvc. (not tested) diff --git a/harbour/utils/hbmk2/hbmk2.prg b/harbour/utils/hbmk2/hbmk2.prg index 8ac72d594c..09d881287e 100644 --- a/harbour/utils/hbmk2/hbmk2.prg +++ b/harbour/utils/hbmk2/hbmk2.prg @@ -93,7 +93,6 @@ /* TODO: Add support for dynamic library creation for rest of compilers. */ /* TODO: Cleanup on variable names and compiler configuration. */ /* TODO: Finish C++/C mode selection. */ -/* TODO: Finish support for multithreaded compilation. */ /* TODO: Add a way to fallback to stop if required headers couldn't be found. This needs a way to spec what key headers to look for. */ @@ -137,6 +136,8 @@ STATIC s_nHEAD := _HEAD_PARTIAL STATIC s_aINCPATH STATIC s_aINCTRYPATH STATIC s_lREBUILD := .F. +STATIC s_lTRACE := .F. +STATIC s_lDONTEXEC := .F. STATIC s_lDEBUGTIME := .F. STATIC s_lDEBUGINC := .F. @@ -317,8 +318,6 @@ FUNCTION hbmk( aArgs ) LOCAL s_lSTRIP := .F. LOCAL s_lOPT := .T. LOCAL s_nCOMPR := _COMPR_OFF - LOCAL s_lTRACE := .F. - LOCAL s_lDONTEXEC := .F. LOCAL s_lBLDFLGP := .F. LOCAL s_lBLDFLGC := .F. LOCAL s_lBLDFLGL := .F. @@ -420,7 +419,7 @@ FUNCTION hbmk( aArgs ) LOCAL aThreads LOCAL thread - LOCAL nStart := secondscpu() + LOCAL nStart := Seconds() IF Empty( aArgs ) ShowHeader() @@ -2812,30 +2811,25 @@ FUNCTION hbmk( aArgs ) IF "{IC}" $ cOpt_CompC - FOR EACH tmp IN ArrayJoin( ListDirExt( s_aPRG_TODO, cWorkDir, ".c" ), s_aC_TODO ) - - cCommand := cOpt_CompC - cCommand := StrTran( cCommand, "{IC}", tmp ) - cCommand := StrTran( cCommand, "{OO}", PathSepToTarget( FN_DirExtSet( tmp, cWorkDir, cObjExt ) ) ) - - cCommand := cBin_CompC + " " + AllTrim( cCommand ) - - IF s_lTRACE - IF ! s_lQuiet - OutStd( "hbmk: C compiler command:" + hb_osNewLine() ) + aThreads := {} + FOR EACH aTODO IN ArraySplit( ArrayJoin( ListDirExt( s_aPRG_TODO, cWorkDir, ".c" ), s_aC_TODO ), s_nJOBS ) + IF hb_mtvm() + AAdd( aThreads, hb_threadStart( @CompileCLoop(), aTODO, cBin_CompC, cOpt_CompC, cWorkDir, cObjExt, aTODO:__enumIndex() ) ) + ELSE + IF ! CompileCLoop( aTODO, cBin_CompC, cOpt_CompC, cWorkDir, cObjExt ) + nErrorLevel := 6 ENDIF - OutStd( cCommand + hb_osNewLine() ) - ENDIF - - IF ! s_lDONTEXEC .AND. ( tmp1 := hbmk_run( cCommand ) ) != 0 - OutErr( "hbmk: Error: Running C compiler. " + hb_ntos( tmp1 ) + ":" + hb_osNewLine() ) - IF ! s_lQuiet - OutErr( cCommand + hb_osNewLine() ) - ENDIF - nErrorLevel := 6 - EXIT ENDIF NEXT + + IF hb_mtvm() + FOR EACH thread IN aThreads + hb_threadJoin( thread, @tmp ) + IF ! tmp + nErrorLevel := 6 + ENDIF + NEXT + ENDIF ELSE cOpt_CompC := StrTran( cOpt_CompC, "{OO}" , PathSepToTarget( FN_ExtSet( s_cPROGNAME, cObjExt ) ) ) cOpt_CompC := StrTran( cOpt_CompC, "{OW}" , PathSepToTarget( cWorkDir ) ) @@ -3235,11 +3229,51 @@ FUNCTION hbmk( aArgs ) ENDIF IF s_lDEBUGTIME - OutStd( "hbmk: Running time: " + hb_ntos( secondscpu() - nStart ) + "s" + hb_osNewLine() ) + OutStd( "hbmk: Running time: " + hb_ntos( TimeElapsed( nStart, Seconds() ) ) + "s" + hb_osNewLine() ) ENDIF RETURN nErrorLevel +STATIC FUNCTION CompileCLoop( aTODO, cBin_CompC, cOpt_CompC, cWorkDir, cObjExt, nJob ) + LOCAL lResult := .T. + LOCAL cCommand + LOCAL tmp, tmp1 + + FOR EACH tmp IN aTODO + + cCommand := cOpt_CompC + cCommand := StrTran( cCommand, "{IC}", tmp ) + cCommand := StrTran( cCommand, "{OO}", PathSepToTarget( FN_DirExtSet( tmp, cWorkDir, cObjExt ) ) ) + + cCommand := cBin_CompC + " " + AllTrim( cCommand ) + + IF s_lTRACE + IF ! s_lQuiet + IF nJob != NIL + OutStd( "hbmk: C compiler command job #" + hb_ntos( nJob ) + ":" + hb_osNewLine() ) + ELSE + OutStd( "hbmk: C compiler command:" + hb_osNewLine() ) + ENDIF + ENDIF + OutStd( cCommand + hb_osNewLine() ) + ENDIF + + IF ! s_lDONTEXEC .AND. ( tmp1 := hbmk_run( cCommand ) ) != 0 + IF nJob != NIL + OutErr( "hbmk: Error: Running C compiler job #" + hb_ntos( nJob ) + ". " + hb_ntos( tmp1 ) + ":" + hb_osNewLine() ) + ELSE + OutErr( "hbmk: Error: Running C compiler. " + hb_ntos( tmp1 ) + ":" + hb_osNewLine() ) + ENDIF + IF ! s_lQuiet + OutErr( cCommand + hb_osNewLine() ) + ENDIF + lResult := .F. + EXIT + ENDIF + NEXT + + RETURN lResult + STATIC FUNCTION SetupForGT( cGT, /* @ */ s_cGT, /* @ */ s_lGUI ) IF IsValidHarbourID( cGT ) @@ -4518,6 +4552,9 @@ STATIC FUNCTION MacroProc( cString, cDirParent ) RETURN cString +STATIC FUNCTION TimeElapsed( nStartSec, nEndSec ) + RETURN Round( ( nEndSec - iif( nEndSec < nStartSec, nStartSec - 86399, nStartSec ) ), 1 ) + #define HB_ISALPHA( c ) ( Upper( c ) >= "A" .AND. Upper( c ) <= "Z" ) #define HB_ISFIRSTIDCHAR( c ) ( HB_ISALPHA( c ) .OR. ( c ) == '_' ) #define HB_ISNEXTIDCHAR( c ) ( HB_ISFIRSTIDCHAR(c) .OR. IsDigit( c ) )