From 1ff4a5ee13e6235a34a6ce0720cf31cdadd97ff4 Mon Sep 17 00:00:00 2001 From: Viktor Szakats Date: Sat, 3 Jul 2010 08:47:53 +0000 Subject: [PATCH] 2010-07-02 10:44 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) * utils/hbmk2/hbmk2.prg + Added feature for plugins to register the file extensions they can handle. This makes -pi option unnecessary for passing special file types to the build process. File types handled by hbmk2 cannot be overridden this way, if you want to do such thing -pi option is required, this is by design, and this way plugins cannot inadvertently mess up the build process. + Added strict parameter checking to hbmk2 plugin functions which requires the hbmk2 context. Now calling them with bad parameters won't cause RTE inside hbmk2 code. * contrib/hbqt/hbmk2_plugin_qt.prg + Registering the file types the plugin can handle. * contrib/hbqt/hbqtcore.hbp * contrib/hbqt/qtwebkit/hbqtwebkit.hbp * contrib/hbqt/hbqscintilla/hbqscintilla.hbp * contrib/hbqt/hbqtnetwork.hbp * contrib/hbqt/qtdesigner/hbqtdesigner.hbp * contrib/hbqt/hbqt.hbp * contrib/hbqt/hbqtgui.hbp * contrib/hbide/hbide.hbp - Dropped -pi option. It is now unnecessary in these cases (well, all cases in Harbour) * contrib/hbqt/hbqscintilla/hbqscintilla.hbp ! Fixed content. The referenced plugin name was deleted quite long ago already when this file was committed. Was this file ever tested before commit? + contrib/hbqt/tests/harbour-logo.png + contrib/hbqt/tests/harbour-icon.png + contrib/hbqt/tests/testres.prg + contrib/hbqt/tests/testres.qrc + Added example for QT resource embedding. Sent to the list by Bacco, with my cleanups, formatting, renames etc. I didn't add a .hbp file for it, so pls remember to build it using: 'hbmk2 testres testres.qrc' --- harbour/ChangeLog | 42 +++ harbour/contrib/hbide/hbide.hbp | 46 +-- harbour/contrib/hbqt/hbmk2_plugin_qt.prg | 9 + .../hbqt/hbqscintilla/hbqscintilla.hbp | 29 +- harbour/contrib/hbqt/hbqt.hbp | 14 +- harbour/contrib/hbqt/hbqtcore.hbp | 3 +- harbour/contrib/hbqt/hbqtgui.hbp | 3 +- harbour/contrib/hbqt/hbqtnetwork.hbp | 3 +- .../contrib/hbqt/qtdesigner/hbqtdesigner.hbp | 3 +- harbour/contrib/hbqt/qtwebkit/hbqtwebkit.hbp | 4 +- harbour/contrib/hbqt/tests/harbour-icon.png | Bin 0 -> 2580 bytes harbour/contrib/hbqt/tests/harbour-logo.png | Bin 0 -> 34987 bytes harbour/contrib/hbqt/tests/testres.prg | 54 ++++ harbour/contrib/hbqt/tests/testres.qrc | 6 + harbour/utils/hbmk2/hbmk2.prg | 283 +++++++++++------- 15 files changed, 326 insertions(+), 173 deletions(-) create mode 100644 harbour/contrib/hbqt/tests/harbour-icon.png create mode 100644 harbour/contrib/hbqt/tests/harbour-logo.png create mode 100644 harbour/contrib/hbqt/tests/testres.prg create mode 100644 harbour/contrib/hbqt/tests/testres.qrc diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 34f914a46e..fd11e8638b 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -16,6 +16,48 @@ The license applies to all entries newer than 2009-04-28. */ +2010-07-02 10:44 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) + * utils/hbmk2/hbmk2.prg + + Added feature for plugins to register the file extensions + they can handle. This makes -pi option unnecessary for + passing special file types to the build process. File types + handled by hbmk2 cannot be overridden this way, if you want + to do such thing -pi option is required, this is by design, + and this way plugins cannot inadvertently mess up the build + process. + + Added strict parameter checking to hbmk2 plugin functions + which requires the hbmk2 context. Now calling them with bad + parameters won't cause RTE inside hbmk2 code. + + * contrib/hbqt/hbmk2_plugin_qt.prg + + Registering the file types the plugin can handle. + + * contrib/hbqt/hbqtcore.hbp + * contrib/hbqt/qtwebkit/hbqtwebkit.hbp + * contrib/hbqt/hbqscintilla/hbqscintilla.hbp + * contrib/hbqt/hbqtnetwork.hbp + * contrib/hbqt/qtdesigner/hbqtdesigner.hbp + * contrib/hbqt/hbqt.hbp + * contrib/hbqt/hbqtgui.hbp + * contrib/hbide/hbide.hbp + - Dropped -pi option. It is now unnecessary in these cases + (well, all cases in Harbour) + + * contrib/hbqt/hbqscintilla/hbqscintilla.hbp + ! Fixed content. The referenced plugin name was deleted quite + long ago already when this file was committed. Was this + file ever tested before commit? + + + contrib/hbqt/tests/harbour-logo.png + + contrib/hbqt/tests/harbour-icon.png + + contrib/hbqt/tests/testres.prg + + contrib/hbqt/tests/testres.qrc + + Added example for QT resource embedding. + Sent to the list by Bacco, with my cleanups, formatting, + renames etc. I didn't add a .hbp file for it, so pls + remember to build it using: + 'hbmk2 testres testres.qrc' + 2010-07-02 09:14 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) * contrib/makefile.prg ! Temporarly disabled -w3 warning level. diff --git a/harbour/contrib/hbide/hbide.hbp b/harbour/contrib/hbide/hbide.hbp index 8276ed04a0..4a1b8fbbd5 100644 --- a/harbour/contrib/hbide/hbide.hbp +++ b/harbour/contrib/hbide/hbide.hbp @@ -41,27 +41,27 @@ ideplugins.prg idedict.prg idebrowse.prg --pi=docviewgenerator.ui --pi=docwriter.ui --pi=environ.ui --pi=environments.ui --pi=finddialog.ui --pi=findinfiles.ui --pi=findinfilesex.ui --pi=findsource.ui --pi=funclist.ui --pi=mainwindow.ui --pi=projectpropertiesex.ui --pi=searchreplace.ui --pi=searchreplacepanel.ui --pi=selectionlist.ui --pi=selectproject.ui --pi=setup.ui --pi=shortcuts.ui --pi=skeletons.ui --pi=themes.ui --pi=themesex.ui --pi=toolsutilities.ui --pi=updown.ui +docviewgenerator.ui +docwriter.ui +environ.ui +environments.ui +finddialog.ui +findinfiles.ui +findinfilesex.ui +findsource.ui +funclist.ui +mainwindow.ui +projectpropertiesex.ui +searchreplace.ui +searchreplacepanel.ui +selectionlist.ui +selectproject.ui +setup.ui +shortcuts.ui +skeletons.ui +themes.ui +themesex.ui +toolsutilities.ui +updown.ui --pi=hbide.qrc +hbide.qrc diff --git a/harbour/contrib/hbqt/hbmk2_plugin_qt.prg b/harbour/contrib/hbqt/hbmk2_plugin_qt.prg index e5a2a962ba..e5f97442cb 100644 --- a/harbour/contrib/hbqt/hbmk2_plugin_qt.prg +++ b/harbour/contrib/hbqt/hbmk2_plugin_qt.prg @@ -36,6 +36,15 @@ FUNCTION hbmk2_plugin_qt( hbmk2 ) LOCAL lBuildIt SWITCH hbmk2[ "cSTATE" ] + CASE "init" + + hbmk2_Register_Input_File_Extension( hbmk2, ".qrc" ) + hbmk2_Register_Input_File_Extension( hbmk2, ".ui" ) + hbmk2_Register_Input_File_Extension( hbmk2, ".hpp" ) + hbmk2_Register_Input_File_Extension( hbmk2, ".h" ) + + EXIT + CASE "pre_all" /* Gather input parameters */ diff --git a/harbour/contrib/hbqt/hbqscintilla/hbqscintilla.hbp b/harbour/contrib/hbqt/hbqscintilla/hbqscintilla.hbp index cbb582161e..9853c8ad50 100644 --- a/harbour/contrib/hbqt/hbqscintilla/hbqscintilla.hbp +++ b/harbour/contrib/hbqt/hbqscintilla/hbqscintilla.hbp @@ -1,26 +1,15 @@ --3rd=hbide_version=1.0 --3rd=hbide_type=Lib --3rd=hbide_title=qscintilla --3rd=hbide_output=qscintilla +# +# $Id$ +# + +../hbqt_common.hbm + +-o${hb_name} +-workdir=${hb_work}/${hb_plat}/${hb_comp}/${hb_name} --info --trace --inc --w2 --es2 --hblib --incpath=../ -incpath=${HB_WITH_QSCINTILLA}/qt --incpath=${HB_WITH_QT} --incpath=${HB_WITH_QT}/QtCore --incpath=${HB_WITH_QT}/QtGui - --ohbqscintilla - --plugin=../../../utils/hbmk2/examples/plug_moc.prg - --pi=hbqt_hbqsciscintilla.h +hbqt_hbqsciscintilla.h hbqt_hbqsciscintilla.cpp HBQsciScintilla.cpp diff --git a/harbour/contrib/hbqt/hbqt.hbp b/harbour/contrib/hbqt/hbqt.hbp index ee312bc45b..4392b05689 100644 --- a/harbour/contrib/hbqt/hbqt.hbp +++ b/harbour/contrib/hbqt/hbqt.hbp @@ -21,13 +21,13 @@ hbqt_misc.prg hbqt_errorsys.prg THbQtUI.prg --pi=hbqt_hbdbfmodel.h --pi=hbqt_hbevents.h --pi=hbqt_hbqmainwindow.h --pi=hbqt_hbqplaintextedit.h --pi=hbqt_hbqsyntaxhighlighter.h --pi=hbqt_hbqtableview.h --pi=hbqt_hbslots.h +hbqt_hbdbfmodel.h +hbqt_hbevents.h +hbqt_hbqmainwindow.h +hbqt_hbqplaintextedit.h +hbqt_hbqsyntaxhighlighter.h +hbqt_hbqtableview.h +hbqt_hbslots.h {darwin&!HB_WITH_QT}-cflag=-I/Library/Frameworks/QtGui.framework/Headers {darwin&!HB_WITH_QT}-cflag=-I/Library/Frameworks/QtNetwork.framework/Headers diff --git a/harbour/contrib/hbqt/hbqtcore.hbp b/harbour/contrib/hbqt/hbqtcore.hbp index 196d60e52a..c214d61947 100644 --- a/harbour/contrib/hbqt/hbqtcore.hbp +++ b/harbour/contrib/hbqt/hbqtcore.hbp @@ -9,5 +9,4 @@ hbqt_common.hbm qtcore/*.cpp qtcore/*.prg - --pi=qtcore/*.h +qtcore/*.h diff --git a/harbour/contrib/hbqt/hbqtgui.hbp b/harbour/contrib/hbqt/hbqtgui.hbp index 6d59c1b7da..8225ebaacf 100644 --- a/harbour/contrib/hbqt/hbqtgui.hbp +++ b/harbour/contrib/hbqt/hbqtgui.hbp @@ -9,5 +9,4 @@ hbqt_common.hbm qtgui/*.cpp qtgui/*.prg - --pi=qtgui/*.h +qtgui/*.h diff --git a/harbour/contrib/hbqt/hbqtnetwork.hbp b/harbour/contrib/hbqt/hbqtnetwork.hbp index 42b81dcc5f..2f631e972d 100644 --- a/harbour/contrib/hbqt/hbqtnetwork.hbp +++ b/harbour/contrib/hbqt/hbqtnetwork.hbp @@ -9,5 +9,4 @@ hbqt_common.hbm qtnetwork/*.cpp qtnetwork/*.prg - --pi=qtnetwork/*.h +qtnetwork/*.h diff --git a/harbour/contrib/hbqt/qtdesigner/hbqtdesigner.hbp b/harbour/contrib/hbqt/qtdesigner/hbqtdesigner.hbp index 657805e286..b43a9177a2 100644 --- a/harbour/contrib/hbqt/qtdesigner/hbqtdesigner.hbp +++ b/harbour/contrib/hbqt/qtdesigner/hbqtdesigner.hbp @@ -9,5 +9,4 @@ *.cpp *.prg - --pi=*.hpp +*.hpp diff --git a/harbour/contrib/hbqt/qtwebkit/hbqtwebkit.hbp b/harbour/contrib/hbqt/qtwebkit/hbqtwebkit.hbp index 392dd9760e..b43a9177a2 100644 --- a/harbour/contrib/hbqt/qtwebkit/hbqtwebkit.hbp +++ b/harbour/contrib/hbqt/qtwebkit/hbqtwebkit.hbp @@ -9,6 +9,4 @@ *.cpp *.prg - --pi=*.hpp - +*.hpp diff --git a/harbour/contrib/hbqt/tests/harbour-icon.png b/harbour/contrib/hbqt/tests/harbour-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..35e36d05aa1c17b7e295be8537c3162fbf41972c GIT binary patch literal 2580 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%0D=@odrqJv<;1j5APWwKpv4ON+}kARo#}vFm*q3X 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 LNkvXXu0mjfCMk3^ literal 0 HcmV?d00001 diff --git a/harbour/contrib/hbqt/tests/testres.prg b/harbour/contrib/hbqt/tests/testres.prg new file mode 100644 index 0000000000..a5293224f7 --- /dev/null +++ b/harbour/contrib/hbqt/tests/testres.prg @@ -0,0 +1,54 @@ +/* + * $Id: qtver.prg 14742 2010-06-10 21:02:20Z vszakats $ + */ + +/* + * Harbour Project source code: + * + * Copyright 2010 Bacco + * www - http://harbour-project.org + * + */ + +#include "hbqt.ch" +#include "common.ch" + +REQUEST HB_QT + +STATIC s_qApp +STATIC s_re1 + +INIT PROCEDURE Qt_Start() + s_qApp := QApplication():new() + s_re1 := QResource():new() + s_re1:registerResource_1( HBQTRES_TESTRES() ) + RETURN + +EXIT PROCEDURE Qt_End() + s_re1:unregisterResource_1( HBQTRES_TESTRES() ) + s_qApp:quit() + RETURN + +PROCEDURE Main() + LOCAL oWnd + LOCAL oDA + LOCAL lb1 + LOCAL ly1 + + oWnd := QMainWindow():new() + oWnd:setWindowIcon( ":harbour-icon.png" ) + + oDA := QWidget():new() + oWnd:setCentralWidget( oDA ) + + lb1 := Qlabel():new() + lb1:setAlignment( hb_bitOr( Qt_AlignHCenter, Qt_AlignVCenter ) ) + lb1:setPixMap( QPixMap():new( ":harbour-logo.png" ) ) + + ly1 := QVBoxLayout():new( oDA ) + ly1:addWidget( lb1 ) + + oWnd:Show() + s_qApp:exec() + + RETURN diff --git a/harbour/contrib/hbqt/tests/testres.qrc b/harbour/contrib/hbqt/tests/testres.qrc new file mode 100644 index 0000000000..461b25f842 --- /dev/null +++ b/harbour/contrib/hbqt/tests/testres.qrc @@ -0,0 +1,6 @@ + + + harbour-icon.png + harbour-logo.png + + diff --git a/harbour/utils/hbmk2/hbmk2.prg b/harbour/utils/hbmk2/hbmk2.prg index 94d5c9c15b..27137f8a3f 100644 --- a/harbour/utils/hbmk2/hbmk2.prg +++ b/harbour/utils/hbmk2/hbmk2.prg @@ -359,30 +359,31 @@ REQUEST hbmk_KEYW #define _HBMK_hPLUGINHRB 86 #define _HBMK_hPLUGINVars 87 #define _HBMK_aPLUGINPars 88 +#define _HBMK_hPLUGINExt 89 -#define _HBMK_lDEBUGTIME 89 -#define _HBMK_lDEBUGINC 90 -#define _HBMK_lDEBUGSTUB 91 -#define _HBMK_lDEBUGI18N 92 -#define _HBMK_lDEBUGDEPD 93 +#define _HBMK_lDEBUGTIME 90 +#define _HBMK_lDEBUGINC 91 +#define _HBMK_lDEBUGSTUB 92 +#define _HBMK_lDEBUGI18N 93 +#define _HBMK_lDEBUGDEPD 94 -#define _HBMK_cCCPATH 94 -#define _HBMK_cCCPREFIX 95 -#define _HBMK_cCCPOSTFIX 96 -#define _HBMK_cCCEXT 97 +#define _HBMK_cCCPATH 95 +#define _HBMK_cCCPREFIX 96 +#define _HBMK_cCCPOSTFIX 97 +#define _HBMK_cCCEXT 98 -#define _HBMK_cWorkDir 98 -#define _HBMK_cWorkDirDynSub 99 -#define _HBMK_nCmd_Esc 100 -#define _HBMK_nScr_Esc 101 -#define _HBMK_nCmd_FNF 102 -#define _HBMK_nScr_FNF 103 -#define _HBMK_nErrorLevel 104 +#define _HBMK_cWorkDir 99 +#define _HBMK_cWorkDirDynSub 100 +#define _HBMK_nCmd_Esc 101 +#define _HBMK_nScr_Esc 102 +#define _HBMK_nCmd_FNF 103 +#define _HBMK_nScr_FNF 104 +#define _HBMK_nErrorLevel 105 -#define _HBMK_cPROGDIR 105 -#define _HBMK_cPROGNAME 106 +#define _HBMK_cPROGDIR 106 +#define _HBMK_cPROGNAME 107 -#define _HBMK_MAX_ 106 +#define _HBMK_MAX_ 107 #define _HBMK_DEP_CTRL_MARKER ".control." /* must be an invalid path */ @@ -841,8 +842,12 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause ) hbmk[ _HBMK_lBLDFLGL ] := .F. hbmk[ _HBMK_aPLUGIN ] := {} + hbmk[ _HBMK_hPLUGINHRB ] := { => } hbmk[ _HBMK_hPLUGINVars ] := { => } hbmk[ _HBMK_aPLUGINPars ] := {} + hbmk[ _HBMK_hPLUGINExt ] := { => } + + hb_HSetCaseMatch( hbmk[ _HBMK_hPLUGINExt ], .F. ) hbmk[ _HBMK_lDEBUGTIME ] := .F. hbmk[ _HBMK_lDEBUGINC ] := .F. @@ -2101,6 +2106,7 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause ) cParam := PathProc( PathSepToSelf( MacroProc( hbmk, SubStr( cParam, Len( "-plugin=" ) + 1 ), aParam[ _PAR_cFileName ] ) ), aParam[ _PAR_cFileName ] ) IF ( tmp := FindInPathPlugIn( cParam ) ) != NIL AAdd( hbmk[ _HBMK_aPLUGIN ], tmp ) + PlugIn_Load( hbmk, tmp ) ELSE IF hbmk[ _HBMK_lInfo ] hbmk_OutStd( hbmk, hb_StrFormat( I_( "Warning: Plugin not found: %1$s" ), cParam ) ) @@ -2240,6 +2246,7 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause ) cParam := PathProc( PathSepToSelf( MacroProc( hbmk, cParam, aParam[ _PAR_cFileName ] ) ), aParam[ _PAR_cFileName ] ) IF ( tmp := FindInPathPlugIn( cParam ) ) != NIL AAdd( hbmk[ _HBMK_aPLUGIN ], tmp ) + PlugIn_Load( hbmk, tmp ) ELSE IF hbmk[ _HBMK_lInfo ] hbmk_OutStd( hbmk, hb_StrFormat( I_( "Warning: Plugin not found: %1$s" ), cParam ) ) @@ -2331,6 +2338,13 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause ) hbmk[ _HBMK_cHBL ] := PathSepToSelf( cParam ) hbmk[ _HBMK_cHBLDir ] := FN_DirGet( aParam[ _PAR_cFileName ] ) + CASE FN_ExtGet( cParamL ) $ hbmk[ _HBMK_hPLUGINExt ] + + cParam := PathSepToSelf( MacroProc( hbmk, cParam, aParam[ _PAR_cFileName ] ) ) + FOR EACH cParam IN FN_Expand( PathProc( cParam, aParam[ _PAR_cFileName ] ), Empty( aParam[ _PAR_cFileName ] ) ) + AAdd( hbmk[ _HBMK_aPLUGINPars ], cParam ) + NEXT + OTHERWISE cParam := PathProc( PathSepToSelf( cParam ), aParam[ _PAR_cFileName ] ) @@ -3909,10 +3923,9 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause ) ENDIF ENDIF - /* Prepare plugins */ + /* Call plugins */ - PlugIn_Load( hbmk ) - PlugIn_Execute( hbmk, "pre_all" ) + PlugIn_Execute_All( hbmk, "pre_all" ) /* ; */ @@ -4072,7 +4085,7 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause ) IF ( ! lSkipBuild .AND. ! lStopAfterInit .AND. ! lStopAfterHarbour .AND. hbmk[ _HBMK_nHBMODE ] != _HBMODE_RAW_C ) .OR. ; ( nHarbourPPO >= 2 .AND. lStopAfterHarbour ) /* or in preprocessor mode */ - PlugIn_Execute( hbmk, "pre_prg" ) + PlugIn_Execute_All( hbmk, "pre_prg" ) /* Incremental */ @@ -4706,7 +4719,7 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause ) IF Len( l_aRESSRC_TODO ) > 0 .AND. ! Empty( cBin_Res ) .AND. ! hbmk[ _HBMK_lCLEAN ] - PlugIn_Execute( hbmk, "pre_res" ) + PlugIn_Execute_All( hbmk, "pre_res" ) IF hbmk[ _HBMK_lINC ] .AND. ! hbmk[ _HBMK_lQuiet ] hbmk_OutStd( hbmk, I_( "Compiling resources..." ) ) @@ -4822,7 +4835,7 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause ) ENDIF ENDIF - PlugIn_Execute( hbmk, "pre_c" ) + PlugIn_Execute_All( hbmk, "pre_c" ) IF ! hbmk[ _HBMK_lCLEAN ] @@ -5035,7 +5048,7 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause ) DO CASE CASE ! lStopAfterCComp .AND. ! Empty( cBin_Link ) - PlugIn_Execute( hbmk, "pre_link" ) + PlugIn_Execute_All( hbmk, "pre_link" ) IF ( hbmk[ _HBMK_lINC ] .AND. ! hbmk[ _HBMK_lQuiet ] ) .OR. hbmk[ _HBMK_lInfo ] hbmk_OutStd( hbmk, hb_StrFormat( I_( "Linking... %1$s" ), hbmk[ _HBMK_cPROGNAME ] ) ) @@ -5129,7 +5142,7 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause ) CASE lStopAfterCComp .AND. hbmk[ _HBMK_lCreateDyn ] .AND. ! Empty( cBin_Dyn ) - PlugIn_Execute( hbmk, "pre_link" ) + PlugIn_Execute_All( hbmk, "pre_link" ) IF ( hbmk[ _HBMK_lINC ] .AND. ! hbmk[ _HBMK_lQuiet ] ) .OR. hbmk[ _HBMK_lInfo ] hbmk_OutStd( hbmk, hb_StrFormat( I_( "Creating dynamic library... %1$s" ), hbmk[ _HBMK_cPROGNAME ] ) ) @@ -5197,7 +5210,7 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause ) CASE lStopAfterCComp .AND. hbmk[ _HBMK_lCreateLib ] .AND. ! Empty( cBin_Lib ) - PlugIn_Execute( hbmk, "pre_lib" ) + PlugIn_Execute_All( hbmk, "pre_lib" ) IF ( hbmk[ _HBMK_lINC ] .AND. ! hbmk[ _HBMK_lQuiet ] ) .OR. hbmk[ _HBMK_lInfo ] hbmk_OutStd( hbmk, hb_StrFormat( I_( "Creating static library... %1$s" ), hbmk[ _HBMK_cPROGNAME ] ) ) @@ -5265,7 +5278,7 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause ) /* Cleanup */ - PlugIn_Execute( hbmk, "pre_cleanup" ) + PlugIn_Execute_All( hbmk, "pre_cleanup" ) IF ! Empty( l_cCSTUB ) FErase( l_cCSTUB ) @@ -5413,10 +5426,10 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause ) ENDIF ENDIF - PlugIn_Execute( hbmk, "post_build" ) + PlugIn_Execute_All( hbmk, "post_build" ) ENDIF - PlugIn_Execute( hbmk, "post_all" ) + PlugIn_Execute_All( hbmk, "post_all" ) IF hbmk[ _HBMK_lDEBUGTIME ] hbmk_OutStd( hbmk, hb_StrFormat( I_( "Running time: %1$ss" ), hb_ntos( TimeElapsed( nStart, Seconds() ) ) ) ) @@ -6408,56 +6421,50 @@ STATIC FUNCTION FindInSamePath( cFileName, cFileName2, cPath ) RETURN NIL -STATIC PROCEDURE PlugIn_Load( hbmk ) - LOCAL cFileName +STATIC PROCEDURE PlugIn_Load( hbmk, cFileName ) LOCAL cFile LOCAL cExt LOCAL lOK LOCAL cType - LOCAL hrb + LOCAL hrb := NIL - hbmk[ _HBMK_hPLUGINHRB ] := { => } + hb_FNameSplit( cFileName, NIL, NIL, @cExt ) - FOR EACH cFileName IN hbmk[ _HBMK_aPLUGIN ] + cFile := hb_MemoRead( cFileName ) - hb_FNameSplit( cFileName, NIL, NIL, @cExt ) - - hrb := NIL - - cFile := hb_MemoRead( cFileName ) - - IF ! Empty( cFile ) - lOK := .F. - /* Optimization: Don't try to load it as .hrb if the extension is .prg or .hbs (Harbour script) */ - IF !( Lower( cExt ) == ".prg" ) .AND. ; - !( Lower( cExt ) == ".hbs" ) - BEGIN SEQUENCE WITH {| oError | Break( oError ) } - hrb := hb_hrbLoad( HB_HRB_BIND_FORCELOCAL, cFile ) - cType := I_( "(compiled)" ) - lOK := .T. - END SEQUENCE - ENDIF - IF ! lOK .AND. !( Lower( cExt ) == ".hrb" ) /* Optimization: Don't try to load it as .prg if the extension is .hrb */ - cType := I_( "(source)" ) - cFile := hb_compileFromBuf( cFile, "-n2", "-w3", "-es2", "-q0", "-D" + _HBMK_SCRIPT ) - IF ! Empty( cFile ) - hrb := hb_hrbLoad( HB_HRB_BIND_FORCELOCAL, cFile ) - ENDIF + IF ! Empty( cFile ) + lOK := .F. + /* Optimization: Don't try to load it as .hrb if the extension is .prg or .hbs (Harbour script) */ + IF !( Lower( cExt ) == ".prg" ) .AND. ; + !( Lower( cExt ) == ".hbs" ) + BEGIN SEQUENCE WITH {| oError | Break( oError ) } + hrb := hb_hrbLoad( HB_HRB_BIND_FORCELOCAL, cFile ) + cType := I_( "(compiled)" ) + lOK := .T. + END SEQUENCE + ENDIF + IF ! lOK .AND. !( Lower( cExt ) == ".hrb" ) /* Optimization: Don't try to load it as .prg if the extension is .hrb */ + cType := I_( "(source)" ) + cFile := hb_compileFromBuf( cFile, "-n2", "-w3", "-es2", "-q0", "-D" + _HBMK_SCRIPT ) + IF ! Empty( cFile ) + hrb := hb_hrbLoad( HB_HRB_BIND_FORCELOCAL, cFile ) ENDIF ENDIF + ENDIF - IF ! Empty( hrb ) - hbmk[ _HBMK_hPLUGINHRB ][ cFileName ] := hrb + IF ! Empty( hrb ) + hbmk[ _HBMK_hPLUGINHRB ][ cFileName ] := hrb - IF hbmk[ _HBMK_lTRACE ] - hbmk_OutStd( hbmk, hb_StrFormat( I_( "Loaded plugin #%1$s: %2$s %3$s" ), hb_ntos( cFileName:__enumIndex() ), cFileName, cType ) ) - ENDIF - ELSE - IF hbmk[ _HBMK_lInfo ] - hbmk_OutErr( hbmk, hb_StrFormat( I_( "Error: Loading plugin: %1$s" ), cFileName ) ) - ENDIF + IF hbmk[ _HBMK_lTRACE ] + hbmk_OutStd( hbmk, hb_StrFormat( I_( "Loaded plugin: %1$s %2$s" ), cFileName, cType ) ) ENDIF - NEXT + + PlugIn_call_low( hbmk, cFileName, hrb, PlugIn_make_ctx( hbmk, "init" ) ) + ELSE + IF hbmk[ _HBMK_lInfo ] + hbmk_OutErr( hbmk, hb_StrFormat( I_( "Error: Loading plugin: %1$s" ), cFileName ) ) + ENDIF + ENDIF RETURN @@ -6486,57 +6493,91 @@ FUNCTION hbmk2_StrStripQuote( ... ) ; RETURN StrStripQuote( ... ) FUNCTION hbmk2_OutStdRaw( ... ) ; RETURN ( OutStd( ... ), OutStd( _OUT_EOL ) ) FUNCTION hbmk2_OutErrRaw( ... ) ; RETURN ( OutErr( ... ), OutErr( _OUT_EOL ) ) +STATIC FUNCTION ctx_to_hbmk( ctx ) + LOCAL hbmk + IF hb_isHash( ctx ) .AND. s_cSecToken $ ctx + hbmk := ctx[ s_cSecToken ] + IF ISARRAY( hbmk ) .AND. Len( hbmk ) == _HBMK_MAX_ + RETURN hbmk + ENDIF + ENDIF + RETURN NIL + FUNCTION hbmk2_Macro( ctx, cString ) - LOCAL hbmk := ctx[ s_cSecToken ] - RETURN MacroProc( hbmk, cString ) + LOCAL hbmk := ctx_to_hbmk( ctx ) + IF hbmk != NIL + RETURN MacroProc( hbmk, cString ) + ENDIF + RETURN "" FUNCTION hbmk2_OutStd( ctx, cText ) - LOCAL hbmk := ctx[ s_cSecToken ] - RETURN hbmk_OutStd( hbmk, hb_StrFormat( I_( "plugin: %1$s" ), cText ) ) + LOCAL hbmk := ctx_to_hbmk( ctx ) + IF hbmk != NIL + RETURN hbmk_OutStd( hbmk, hb_StrFormat( I_( "plugin: %1$s" ), cText ) ) + ENDIF + RETURN NIL FUNCTION hbmk2_OutErr( ctx, cText ) - LOCAL hbmk := ctx[ s_cSecToken ] - RETURN hbmk_OutErr( hbmk, hb_StrFormat( I_( "plugin: %1$s" ), cText ) ) + LOCAL hbmk := ctx_to_hbmk( ctx ) + IF hbmk != NIL + RETURN hbmk_OutErr( hbmk, hb_StrFormat( I_( "plugin: %1$s" ), cText ) ) + ENDIF + RETURN NIL FUNCTION hbmk2_PathSepToTarget( ctx, ... ) - LOCAL hbmk := ctx[ s_cSecToken ] - RETURN PathSepToTarget( hbmk, ... ) + LOCAL hbmk := ctx_to_hbmk( ctx ) + IF hbmk != NIL + RETURN PathSepToTarget( hbmk, ... ) + ENDIF + RETURN "" FUNCTION hbmk2_AddInput_PRG( ctx, cFileName ) - LOCAL hbmk := ctx[ s_cSecToken ] - AAdd( hbmk[ _HBMK_aPRG ], PathSepToSelf( cFileName ) ) - DEFAULT hbmk[ _HBMK_cFIRST ] TO PathSepToSelf( cFileName ) + LOCAL hbmk := ctx_to_hbmk( ctx ) + IF hbmk != NIL .AND. ISCHARACTER( cFileName ) + AAdd( hbmk[ _HBMK_aPRG ], PathSepToSelf( cFileName ) ) + DEFAULT hbmk[ _HBMK_cFIRST ] TO PathSepToSelf( cFileName ) + ENDIF RETURN NIL FUNCTION hbmk2_AddInput_C( ctx, cFileName ) - LOCAL hbmk := ctx[ s_cSecToken ] - AAdd( hbmk[ _HBMK_aC ], PathSepToSelf( cFileName ) ) - DEFAULT hbmk[ _HBMK_cFIRST ] TO PathSepToSelf( cFileName ) + LOCAL hbmk := ctx_to_hbmk( ctx ) + IF hbmk != NIL .AND. ISCHARACTER( cFileName ) + AAdd( hbmk[ _HBMK_aC ], PathSepToSelf( cFileName ) ) + DEFAULT hbmk[ _HBMK_cFIRST ] TO PathSepToSelf( cFileName ) + ENDIF RETURN NIL FUNCTION hbmk2_AddInput_CPP( ctx, cFileName ) - LOCAL hbmk := ctx[ s_cSecToken ] - AAdd( hbmk[ _HBMK_aCPP ], PathSepToSelf( cFileName ) ) - DEFAULT hbmk[ _HBMK_cFIRST ] TO PathSepToSelf( cFileName ) + LOCAL hbmk := ctx_to_hbmk( ctx ) + IF hbmk != NIL .AND. ISCHARACTER( cFileName ) + AAdd( hbmk[ _HBMK_aCPP ], PathSepToSelf( cFileName ) ) + DEFAULT hbmk[ _HBMK_cFIRST ] TO PathSepToSelf( cFileName ) + ENDIF RETURN NIL FUNCTION hbmk2_AddInput_RC( ctx, cFileName ) - LOCAL hbmk := ctx[ s_cSecToken ] - AAdd( hbmk[ _HBMK_aRESSRC ], PathSepToSelf( cFileName ) ) + LOCAL hbmk := ctx_to_hbmk( ctx ) + IF hbmk != NIL .AND. ISCHARACTER( cFileName ) + AAdd( hbmk[ _HBMK_aRESSRC ], PathSepToSelf( cFileName ) ) + ENDIF + RETURN NIL + +FUNCTION hbmk2_Register_Input_File_Extension( ctx, cExt ) + LOCAL hbmk := ctx_to_hbmk( ctx ) + IF hbmk != NIL .AND. ISCHARACTER( cExt ) + IF ! Empty( cExt ) + IF !( Left( cExt, 1 ) == "." ) + cExt := "." + cExt + ENDIF + hbmk[ _HBMK_hPLUGINExt ][ Lower( cExt ) ] := NIL + ENDIF + ENDIF RETURN NIL /* ; */ -STATIC FUNCTION PlugIn_Execute( hbmk, cState ) - LOCAL hrb - LOCAL ctx - LOCAL xResult - - LOCAL oError - - IF ! Empty( hbmk[ _HBMK_hPLUGINHRB ] ) - - ctx := {; +STATIC FUNCTION PlugIn_make_ctx( hbmk, cState ) + RETURN {; "cSTATE" => cState ,; "params" => hbmk[ _HBMK_aPLUGINPars ] ,; "vars" => hbmk[ _HBMK_hPLUGINVars ] ,; @@ -6571,24 +6612,37 @@ STATIC FUNCTION PlugIn_Execute( hbmk, cState ) "nErrorLevel" => hbmk[ _HBMK_nErrorLevel ] ,; s_cSecToken => hbmk } - FOR EACH hrb IN hbmk[ _HBMK_hPLUGINHRB ] +STATIC PROCEDURE PlugIn_call_low( hbmk, cName, hrb, ctx ) + LOCAL xResult + LOCAL oError - BEGIN SEQUENCE WITH {| oError | oError:cargo := { ProcName( 1 ), ProcLine( 1 ) }, Break( oError ) } - xResult := hb_hrbDo( hrb, ctx ) - IF ! Empty( xResult ) - IF hbmk[ _HBMK_lInfo ] - hbmk_OutStd( hbmk, hb_StrFormat( I_( "Plugin %1$s returned: '%2$s'" ), hrb:__enumKey(), xResult ) ) - ENDIF - ENDIF - RECOVER USING oError - IF ! hbmk[ _HBMK_lQuiet ] - hbmk_OutErr( hbmk, hb_StrFormat( I_( "Error: Executing plugin: %1$s at %3$s(%4$s)\n'%2$s'" ), hrb:__enumKey(), hbmk_ErrorMessage( oError ), oError:cargo[ 1 ], hb_ntos( oError:cargo[ 2 ] ) ) ) - ENDIF - END SEQUENCE + BEGIN SEQUENCE WITH {| oError | oError:cargo := { ProcName( 1 ), ProcLine( 1 ) }, Break( oError ) } + xResult := hb_hrbDo( hrb, ctx ) + IF ! Empty( xResult ) + IF hbmk[ _HBMK_lInfo ] + hbmk_OutStd( hbmk, hb_StrFormat( I_( "Plugin %1$s returned: '%2$s'" ), cName, xResult ) ) + ENDIF + ENDIF + RECOVER USING oError + IF ! hbmk[ _HBMK_lQuiet ] + hbmk_OutErr( hbmk, hb_StrFormat( I_( "Error: Executing plugin: %1$s at %3$s(%4$s)\n'%2$s'" ), cName, hbmk_ErrorMessage( oError ), oError:cargo[ 1 ], hb_ntos( oError:cargo[ 2 ] ) ) ) + ENDIF + END SEQUENCE + + RETURN + +STATIC PROCEDURE PlugIn_Execute_All( hbmk, cState ) + LOCAL hrb + LOCAL ctx + + IF ! Empty( hbmk[ _HBMK_hPLUGINHRB ] ) + ctx := PlugIn_make_ctx( hbmk, cState ) + FOR EACH hrb IN hbmk[ _HBMK_hPLUGINHRB ] + PlugIn_call_low( hbmk, hrb:__enumKey(), hrb, ctx ) NEXT ENDIF - RETURN NIL + RETURN STATIC FUNCTION hbmk_ErrorMessage( oError ) /* start error message */ @@ -7483,6 +7537,10 @@ STATIC FUNCTION HBC_ProcessOne( hbmk, cFileName, nNestingLevel ) AAddNew( hbmk[ _HBMK_aRESCMP ], tmp ) NEXT ENDIF + CASE FN_ExtGet( cItemL ) $ hbmk[ _HBMK_hPLUGINExt ] + FOR EACH tmp IN FN_Expand( cItem, .F. ) + AAddNew( hbmk[ _HBMK_aPLUGINPars ], tmp ) + NEXT OTHERWISE /* .prg */ IF Empty( FN_ExtGet( cItem ) ) cItem := FN_ExtSet( cItem, ".prg" ) @@ -7746,6 +7804,7 @@ STATIC FUNCTION HBC_ProcessOne( hbmk, cFileName, nNestingLevel ) cLine := PathNormalize( PathProc( PathSepToSelf( MacroProc( hbmk, cLine, cFileName ) ), FN_DirGet( cFileName ) ) ) IF ( tmp := FindInPathPlugIn( cLine ) ) != NIL AAdd( hbmk[ _HBMK_aPLUGIN ], tmp ) + PlugIn_Load( hbmk, tmp ) ELSE IF hbmk[ _HBMK_lInfo ] hbmk_OutStd( hbmk, hb_StrFormat( I_( "Warning: Plugin not found: %1$s" ), cLine ) )