diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 2927d6fb89..4877d38e4e 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -16,6 +16,41 @@ The license applies to all entries newer than 2009-04-28. */ +2010-06-29 12:44 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) + * utils/hbmk2/hbmk2.prg + + Separated package dependency by key header autodetection logic + from header dependency parsing logic. This way the code is + cleaner and it has the added benefit that dependencies + will be detected even without actual source code using the + key headers. This f.e. makes it possible to pull dependencies + for autogenerated code (such example can be found in hbide + where generated .cpp depends on qt). + Another benefit is that pkg detection by header will also + work in non incremental mode or forcefully disabled header + parsing option, it also causes better header parsing + performance. + + * contrib/hbqt/hbqt_common.hbm + - contrib/hbqt/hbmk2_plugin_moc.prg + * contrib/hbqt/hbmk2_plugin_qt.prg + + Merged moc plugin into qt plugin. This way some of the + common code and logic is now integrated, forming a common + hbmk2 plugin for all QT purposes. + % Merged common code. + * Some internal renames. + * Further changes regarding proper -clean behavior. + + * contrib/hbide/hbide.prg + * contrib/hbide/ideprojmanager.prg + - contrib/hbide/resources/hbide.env + + contrib/hbide/hbide.env + * Moved hbide.env to hbide root. + ; TODO: It remains to be solved that hbide.env be searched + at the same locations as as hbide.ini. It would be even better + if hbide.env could use more standard .ini layout and be simply + merged into hbide.ini. + Pritpal, could you check this issue? + 2010-06-29 09:52 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) * INSTALL + Added HB_QT_RCC_BIN @@ -50,8 +85,7 @@ hbide.env, plus the fact the internal html pages make references to these external files, too.) - Deleted some unnecessary trash from source. - ; TOFIX: hbide.env should reside in same place as hbide.ini. - Pritpal could you check it? + ; TOFIX: hbide.env should reside in same place as hbide.ini. [DONE] ; TOFIX: hbide internal html pages make reference to .png files on disk. diff --git a/harbour/contrib/hbide/resources/hbide.env b/harbour/contrib/hbide/hbide.env similarity index 100% rename from harbour/contrib/hbide/resources/hbide.env rename to harbour/contrib/hbide/hbide.env diff --git a/harbour/contrib/hbide/hbide.prg b/harbour/contrib/hbide/hbide.prg index b69b2ce173..e346d2ecdc 100644 --- a/harbour/contrib/hbide/hbide.prg +++ b/harbour/contrib/hbide/hbide.prg @@ -252,7 +252,7 @@ CLASS HbIde DATA cWrkTheme INIT "" DATA cWrkCodec INIT "" DATA cWrkPathMk2 INIT hb_getenv( "HBIDE_DIR_HBMK2" ) - DATA cWrkPathEnv INIT hb_DirBase() + "resources" + DATA cWrkPathEnv INIT hb_DirBase() DATA cWrkEnvironment INIT "" DATA cWrkFind INIT "" DATA cWrkFolderFind INIT "" diff --git a/harbour/contrib/hbide/ideprojmanager.prg b/harbour/contrib/hbide/ideprojmanager.prg index f02b72ec57..165d0d9d7e 100644 --- a/harbour/contrib/hbide/ideprojmanager.prg +++ b/harbour/contrib/hbide/ideprojmanager.prg @@ -137,7 +137,7 @@ CLASS IdeProject DATA dotHbp INIT "" DATA compilers INIT "" DATA cPathMk2 INIT hb_getenv( "HBIDE_DIR_HBMK2" ) - DATA cPathEnv INIT hb_DirBase() + "resources" + DATA cPathEnv INIT hb_DirBase() DATA hSources INIT {=>} DATA hPaths INIT {=>} DATA lPathAbs INIT .F. // Lets try relative paths first . xhp and hbp will be relative anyway diff --git a/harbour/contrib/hbqt/hbmk2_plugin_moc.prg b/harbour/contrib/hbqt/hbmk2_plugin_moc.prg deleted file mode 100644 index ad5b1e2908..0000000000 --- a/harbour/contrib/hbqt/hbmk2_plugin_moc.prg +++ /dev/null @@ -1,150 +0,0 @@ -/* - * $Id$ - */ - -/* - * Copyright 2010 Viktor Szakats (harbour.01 syenar.hu) - * www - http://harbour-project.org - * - * See COPYING for licensing terms. - */ - -#define I_( x ) hb_i18n_gettext( x ) - -FUNCTION hbmk2_plugin_moc( hbmk2 ) - LOCAL cRetVal := "" - - LOCAL cMOC_BIN - - LOCAL aMOC - LOCAL aMOC_Dst - - LOCAL cSrc - LOCAL cDst - LOCAL tSrc - LOCAL tDst - - LOCAL cCommand - LOCAL nError - LOCAL lBuildIt - - SWITCH hbmk2[ "cSTATE" ] - CASE "pre_all" - - /* Gather input parameters */ - - aMOC := {} - aMOC_Dst := {} - - FOR EACH cSrc IN hbmk2[ "params" ] - IF Lower( hbmk2_FNameExtGet( cSrc ) ) == ".h" .OR. ; - Lower( hbmk2_FNameExtGet( cSrc ) ) == ".hpp" - cDst := hbmk2_FNameDirExtSet( "moc_" + hbmk2_FNameNameGet( cSrc ), hbmk2[ "cWorkDir" ], ".cpp" ) - AAdd( aMOC, cSrc ) - AAdd( aMOC_Dst, cDst ) - hbmk2_AddInput_CPP( hbmk2, cDst ) - ENDIF - NEXT - - hbmk2[ "vars" ][ "aMOC" ] := aMOC - hbmk2[ "vars" ][ "aMOC_Dst" ] := aMOC_Dst - - EXIT - - CASE "pre_c" - - IF ! Empty( hbmk2[ "vars" ][ "aMOC" ] ) - - /* Detect 'moc' tool location */ - - cMOC_BIN := GetEnv( "MOC_BIN" ) - IF Empty( cMOC_BIN ) - IF Empty( GetEnv( "HB_QT_MOC_BIN" ) ) - IF hbmk2[ "cPLAT" ] == "win" - IF GetEnv( "HB_WITH_QT" ) == "no" - RETURN NIL - ELSE - cMOC_BIN := GetEnv( "HB_WITH_QT" ) + "\..\bin\moc.exe" - IF ! hb_FileExists( cMOC_BIN ) - hbmk2_OutErr( hbmk2, "HB_WITH_QT points to incomplete QT installation. 'moc' executable not found." ) - RETURN NIL - ENDIF - ENDIF - ELSE - cMOC_BIN := hbmk2_FindInPath( "moc", GetEnv( "PATH" ) + hb_osPathListSeparator() + "/opt/qtsdk/qt/bin" ) - IF Empty( cMOC_BIN ) - cMOC_BIN := hbmk2_FindInPath( "moc-qt4", GetEnv( "PATH" ) + hb_osPathListSeparator() + "/opt/qtsdk/qt/bin" ) - IF Empty( cMOC_BIN ) - hbmk2_OutErr( hbmk2, "HB_QT_MOC_BIN not set, could not autodetect" ) - RETURN NIL - ENDIF - ENDIF - ENDIF - IF hbmk2[ "lINFO" ] - hbmk2_OutStd( hbmk2, hb_StrFormat( "Using QT 'moc' executable: %1$s (autodetected)", cMOC_BIN ) ) - ENDIF - ELSE - IF hb_FileExists( GetEnv( "HB_QT_MOC_BIN" ) ) - cMOC_BIN := GetEnv( "HB_QT_MOC_BIN" ) - IF hbmk2[ "lINFO" ] - hbmk2_OutStd( hbmk2, hb_StrFormat( "Using QT 'moc' executable: %1$s", cMOC_BIN ) ) - ENDIF - ELSE - hbmk2_OutErr( hbmk2, "HB_QT_MOC_BIN points to non-existent file. Make sure to set it to full path and filename of 'moc' executable." ) - RETURN NIL - ENDIF - ENDIF - ENDIF - - /* Execute 'moc' commands on input files */ - - FOR EACH cSrc, cDst IN hbmk2[ "vars" ][ "aMOC" ], hbmk2[ "vars" ][ "aMOC_Dst" ] - - IF hbmk2[ "lINC" ] .AND. ! hbmk2[ "lREBUILD" ] - lBuildIt := ! hb_FGetDateTime( cDst, @tDst ) .OR. ; - ! hb_FGetDateTime( cSrc, @tSrc ) .OR. ; - tSrc > tDst - ELSE - lBuildIt := .T. - ENDIF - - IF lBuildIt - - cCommand := cMOC_BIN +; - " " + hbmk2_FNameEscape( hbmk2_PathSepToTarget( hbmk2, cSrc ), hbmk2[ "nCmd_Esc" ], hbmk2[ "nCmd_FNF" ] ) +; - " -o " + hbmk2_FNameEscape( hbmk2_PathSepToTarget( hbmk2, cDst ), hbmk2[ "nCmd_Esc" ], hbmk2[ "nCmd_FNF" ] ) - - IF hbmk2[ "lTRACE" ] - IF ! hbmk2[ "lQUIET" ] - hbmk2_OutStd( hbmk2, I_( "'moc' command:" ) ) - ENDIF - hbmk2_OutStdRaw( cCommand ) - ENDIF - - IF ! hbmk2[ "lDONTEXEC" ] .AND. ( nError := hb_processRun( cCommand ) ) != 0 - hbmk2_OutErr( hbmk2, hb_StrFormat( I_( "Error: Running 'moc' executable. %1$s" ), hb_ntos( nError ) ) ) - IF ! hbmk2[ "lQUIET" ] - hbmk2_OutErrRaw( cCommand ) - ENDIF - IF ! hbmk2[ "lIGNOREERROR" ] - cRetVal := "error" - EXIT - ENDIF - ENDIF - ENDIF - NEXT - ENDIF - - EXIT - - CASE "post_all" - - IF ! hbmk2[ "lINC" ] .OR. hbmk2[ "lCLEAN" ] - AEval( hbmk2[ "vars" ][ "aMOC_Dst" ], {| tmp | FErase( tmp ) } ) - ENDIF - - EXIT - - ENDSWITCH - - RETURN cRetVal diff --git a/harbour/contrib/hbqt/hbmk2_plugin_qt.prg b/harbour/contrib/hbqt/hbmk2_plugin_qt.prg index cb12fa77bb..f1f4b20bf4 100644 --- a/harbour/contrib/hbqt/hbmk2_plugin_qt.prg +++ b/harbour/contrib/hbqt/hbmk2_plugin_qt.prg @@ -15,6 +15,7 @@ FUNCTION hbmk2_plugin_qt( hbmk2 ) LOCAL cRetVal := "" + LOCAL cMOC_BIN LOCAL cUIC_BIN LOCAL cRCC_BIN @@ -34,213 +35,213 @@ FUNCTION hbmk2_plugin_qt( hbmk2 ) /* Gather input parameters */ - hbmk2[ "vars" ][ "aUI" ] := {} - hbmk2[ "vars" ][ "aUI_Dst" ] := {} - + hbmk2[ "vars" ][ "aMOC" ] := {} + hbmk2[ "vars" ][ "aUIC" ] := {} hbmk2[ "vars" ][ "aQRC" ] := {} - hbmk2[ "vars" ][ "aQRC_Dst" ] := {} FOR EACH cSrc IN hbmk2[ "params" ] SWITCH Lower( hbmk2_FNameExtGet( cSrc ) ) + CASE ".hpp" + CASE ".h" + AAdd( hbmk2[ "vars" ][ "aMOC" ], cSrc ) + EXIT CASE ".ui" - cDst := hbmk2_FNameDirExtSet( "ui_" + hbmk2_FNameNameGet( cSrc ), hbmk2[ "cWorkDir" ], ".prg" ) - AAdd( hbmk2[ "vars" ][ "aUI" ], cSrc ) - AAdd( hbmk2[ "vars" ][ "aUI_Dst" ], cDst ) - hbmk2_AddInput_PRG( hbmk2, cDst ) + AAdd( hbmk2[ "vars" ][ "aUIC" ], cSrc ) EXIT CASE ".qrc" - cDst := hbmk2_FNameDirExtSet( "qrc_" + hbmk2_FNameNameGet( cSrc ), hbmk2[ "cWorkDir" ], ".cpp" ) AAdd( hbmk2[ "vars" ][ "aQRC" ], cSrc ) - AAdd( hbmk2[ "vars" ][ "aQRC_Dst" ], cDst ) - hbmk2_AddInput_CPP( hbmk2, cDst ) EXIT ENDSWITCH NEXT + /* Create output file lists */ + + hbmk2[ "vars" ][ "aMOC_Dst" ] := {} + hbmk2[ "vars" ][ "aUIC_Dst" ] := {} + hbmk2[ "vars" ][ "aQRC_Dst" ] := {} + + FOR EACH cSrc IN hbmk2[ "vars" ][ "aMOC" ] + cDst := hbmk2_FNameDirExtSet( "moc_" + hbmk2_FNameNameGet( cSrc ), hbmk2[ "cWorkDir" ], ".cpp" ) + AAdd( hbmk2[ "vars" ][ "aMOC_Dst" ], cDst ) + hbmk2_AddInput_CPP( hbmk2, cDst ) + NEXT + + FOR EACH cSrc IN hbmk2[ "vars" ][ "aUIC" ] + cDst := hbmk2_FNameDirExtSet( "uic_" + hbmk2_FNameNameGet( cSrc ), hbmk2[ "cWorkDir" ], ".prg" ) + AAdd( hbmk2[ "vars" ][ "aUIC_Dst" ], cDst ) + hbmk2_AddInput_PRG( hbmk2, cDst ) + NEXT + + FOR EACH cSrc IN hbmk2[ "vars" ][ "aQRC" ] + cDst := hbmk2_FNameDirExtSet( "rcc_" + hbmk2_FNameNameGet( cSrc ), hbmk2[ "cWorkDir" ], ".cpp" ) + AAdd( hbmk2[ "vars" ][ "aQRC_Dst" ], cDst ) + hbmk2_AddInput_CPP( hbmk2, cDst ) + NEXT + EXIT CASE "pre_prg" - IF ! Empty( hbmk2[ "vars" ][ "aUI" ] ) + IF ! hbmk2[ "lCLEAN" ] .AND. ! Empty( hbmk2[ "vars" ][ "aUIC" ] ) /* Detect 'uic' tool location */ - cUIC_BIN := GetEnv( "UIC_BIN" ) - IF Empty( cUIC_BIN ) - IF Empty( GetEnv( "HB_QT_UIC_BIN" ) ) - IF hbmk2[ "cPLAT" ] == "win" - IF GetEnv( "HB_WITH_QT" ) == "no" - RETURN NIL - ELSE - cUIC_BIN := GetEnv( "HB_WITH_QT" ) + "\..\bin\uic.exe" - IF ! hb_FileExists( cUIC_BIN ) - hbmk2_OutErr( hbmk2, "HB_WITH_QT points to incomplete QT installation. 'uic' executable not found." ) - RETURN NIL - ENDIF - ENDIF + cUIC_BIN := qt_tool_detect( hbmk2, "UIC_BIN", "HB_QT_UIC_BIN", "uic" ) + + IF ! Empty( cUIC_BIN ) + + /* Execute 'uic' commands on input files */ + + FOR EACH cSrc, cDst IN hbmk2[ "vars" ][ "aUIC" ], hbmk2[ "vars" ][ "aUIC_Dst" ] + + IF hbmk2[ "lINC" ] .AND. ! hbmk2[ "lREBUILD" ] + lBuildIt := ! hb_FGetDateTime( cDst, @tDst ) .OR. ; + ! hb_FGetDateTime( cSrc, @tSrc ) .OR. ; + tSrc > tDst ELSE - cUIC_BIN := hbmk2_FindInPath( "uic", GetEnv( "PATH" ) + hb_osPathListSeparator() + "/opt/qtsdk/qt/bin" ) - IF Empty( cUIC_BIN ) - cUIC_BIN := hbmk2_FindInPath( "uic-qt4", GetEnv( "PATH" ) + hb_osPathListSeparator() + "/opt/qtsdk/qt/bin" ) - IF Empty( cUIC_BIN ) - hbmk2_OutErr( hbmk2, "HB_QT_UIC_BIN not set, could not autodetect" ) - RETURN NIL - ENDIF - ENDIF - ENDIF - IF hbmk2[ "lINFO" ] - hbmk2_OutStd( hbmk2, hb_StrFormat( "Using QT 'uic' executable: %1$s (autodetected)", cUIC_BIN ) ) - ENDIF - ELSE - IF hb_FileExists( GetEnv( "HB_QT_UIC_BIN" ) ) - cUIC_BIN := GetEnv( "HB_QT_UIC_BIN" ) - IF hbmk2[ "lINFO" ] - hbmk2_OutStd( hbmk2, hb_StrFormat( "Using QT 'uic' executable: %1$s", cUIC_BIN ) ) - ENDIF - ELSE - hbmk2_OutErr( hbmk2, "HB_QT_UIC_BIN points to non-existent file. Make sure to set it to full path and filename of 'uic' executable." ) - RETURN NIL - ENDIF - ENDIF - ENDIF - - /* Execute 'uic' commands on input files */ - - FOR EACH cSrc, cDst IN hbmk2[ "vars" ][ "aUI" ], hbmk2[ "vars" ][ "aUI_Dst" ] - - IF hbmk2[ "lINC" ] .AND. ! hbmk2[ "lREBUILD" ] - lBuildIt := ! hb_FGetDateTime( cDst, @tDst ) .OR. ; - ! hb_FGetDateTime( cSrc, @tSrc ) .OR. ; - tSrc > tDst - ELSE - lBuildIt := .T. - ENDIF - - IF lBuildIt - - FClose( hb_FTempCreateEx( @cTmp ) ) - - cCommand := cUIC_BIN +; - " " + hbmk2_FNameEscape( hbmk2_PathSepToTarget( hbmk2, cSrc ), hbmk2[ "nCmd_Esc" ], hbmk2[ "nCmd_FNF" ] ) +; - " -o " + hbmk2_FNameEscape( cTmp, hbmk2[ "nCmd_Esc" ], hbmk2[ "nCmd_FNF" ] ) - - IF hbmk2[ "lTRACE" ] - IF ! hbmk2[ "lQUIET" ] - hbmk2_OutStd( hbmk2, I_( "'uic' command:" ) ) - ENDIF - hbmk2_OutStdRaw( cCommand ) + lBuildIt := .T. ENDIF - IF ! hbmk2[ "lDONTEXEC" ] - IF ( nError := hb_processRun( cCommand ) ) != 0 - hbmk2_OutErr( hbmk2, hb_StrFormat( I_( "Error: Running 'uic' executable. %1$s" ), hb_ntos( nError ) ) ) + IF lBuildIt + + FClose( hb_FTempCreateEx( @cTmp ) ) + + cCommand := cUIC_BIN +; + " " + hbmk2_FNameEscape( hbmk2_PathSepToTarget( hbmk2, cSrc ), hbmk2[ "nCmd_Esc" ], hbmk2[ "nCmd_FNF" ] ) +; + " -o " + hbmk2_FNameEscape( cTmp, hbmk2[ "nCmd_Esc" ], hbmk2[ "nCmd_FNF" ] ) + + IF hbmk2[ "lTRACE" ] IF ! hbmk2[ "lQUIET" ] - hbmk2_OutErrRaw( cCommand ) + hbmk2_OutStd( hbmk2, I_( "'uic' command:" ) ) ENDIF - IF ! hbmk2[ "lIGNOREERROR" ] - FErase( cTmp ) - cRetVal := "error" - EXIT - ENDIF - ELSE - IF ! ui_to_prg( hbmk2, cTmp, cDst, cSrc ) + hbmk2_OutStdRaw( cCommand ) + ENDIF + + IF ! hbmk2[ "lDONTEXEC" ] + IF ( nError := hb_processRun( cCommand ) ) != 0 + hbmk2_OutErr( hbmk2, hb_StrFormat( I_( "Error: Running 'uic' executable. %1$s" ), hb_ntos( nError ) ) ) + IF ! hbmk2[ "lQUIET" ] + hbmk2_OutErrRaw( cCommand ) + ENDIF IF ! hbmk2[ "lIGNOREERROR" ] FErase( cTmp ) cRetVal := "error" EXIT ENDIF + ELSE + IF ! uic_to_prg( hbmk2, cTmp, cDst, cSrc ) + IF ! hbmk2[ "lIGNOREERROR" ] + FErase( cTmp ) + cRetVal := "error" + EXIT + ENDIF + ENDIF ENDIF ENDIF + FErase( cTmp ) ENDIF - FErase( cTmp ) - ENDIF - NEXT + NEXT + ENDIF ENDIF EXIT CASE "pre_c" - IF ! Empty( hbmk2[ "vars" ][ "aQRC" ] ) + IF ! hbmk2[ "lCLEAN" ] .AND. ! Empty( hbmk2[ "vars" ][ "aMOC" ] ) + + /* Detect 'moc' tool location */ + + cMOC_BIN := qt_tool_detect( hbmk2, "MOC_BIN", "HB_QT_MOC_BIN", "moc" ) + + IF ! Empty( cMOC_BIN ) + + /* Execute 'moc' commands on input files */ + + FOR EACH cSrc, cDst IN hbmk2[ "vars" ][ "aMOC" ], hbmk2[ "vars" ][ "aMOC_Dst" ] + + IF hbmk2[ "lINC" ] .AND. ! hbmk2[ "lREBUILD" ] + lBuildIt := ! hb_FGetDateTime( cDst, @tDst ) .OR. ; + ! hb_FGetDateTime( cSrc, @tSrc ) .OR. ; + tSrc > tDst + ELSE + lBuildIt := .T. + ENDIF + + IF lBuildIt + + cCommand := cMOC_BIN +; + " " + hbmk2_FNameEscape( hbmk2_PathSepToTarget( hbmk2, cSrc ), hbmk2[ "nCmd_Esc" ], hbmk2[ "nCmd_FNF" ] ) +; + " -o " + hbmk2_FNameEscape( hbmk2_PathSepToTarget( hbmk2, cDst ), hbmk2[ "nCmd_Esc" ], hbmk2[ "nCmd_FNF" ] ) + + IF hbmk2[ "lTRACE" ] + IF ! hbmk2[ "lQUIET" ] + hbmk2_OutStd( hbmk2, I_( "'moc' command:" ) ) + ENDIF + hbmk2_OutStdRaw( cCommand ) + ENDIF + + IF ! hbmk2[ "lDONTEXEC" ] .AND. ( nError := hb_processRun( cCommand ) ) != 0 + hbmk2_OutErr( hbmk2, hb_StrFormat( I_( "Error: Running 'moc' executable. %1$s" ), hb_ntos( nError ) ) ) + IF ! hbmk2[ "lQUIET" ] + hbmk2_OutErrRaw( cCommand ) + ENDIF + IF ! hbmk2[ "lIGNOREERROR" ] + cRetVal := "error" + EXIT + ENDIF + ENDIF + ENDIF + NEXT + ENDIF + ENDIF + + IF ! hbmk2[ "lCLEAN" ] .AND. ! Empty( hbmk2[ "vars" ][ "aQRC" ] ) /* Detect 'rcc' tool location */ - cRCC_BIN := GetEnv( "RCC_BIN" ) - IF Empty( cRCC_BIN ) - IF Empty( GetEnv( "HB_QT_RCC_BIN" ) ) - IF hbmk2[ "cPLAT" ] == "win" - IF GetEnv( "HB_WITH_QT" ) == "no" - RETURN NIL - ELSE - cRCC_BIN := GetEnv( "HB_WITH_QT" ) + "\..\bin\rcc.exe" - IF ! hb_FileExists( cRCC_BIN ) - hbmk2_OutErr( hbmk2, "HB_WITH_QT points to incomplete QT installation. 'rcc' executable not found." ) - RETURN NIL - ENDIF - ENDIF + cRCC_BIN := qt_tool_detect( hbmk2, "RCC_BIN", "HB_QT_RCC_BIN", "rcc" ) + + IF ! Empty( cRCC_BIN ) + + /* Execute 'rcc' commands on input files */ + + FOR EACH cSrc, cDst IN hbmk2[ "vars" ][ "aQRC" ], hbmk2[ "vars" ][ "aQRC_Dst" ] + + IF hbmk2[ "lINC" ] .AND. ! hbmk2[ "lREBUILD" ] + lBuildIt := ! hb_FGetDateTime( cDst, @tDst ) .OR. ; + ! hb_FGetDateTime( cSrc, @tSrc ) .OR. ; + tSrc > tDst ELSE - cRCC_BIN := hbmk2_FindInPath( "rcc", GetEnv( "PATH" ) + hb_osPathListSeparator() + "/opt/qtsdk/qt/bin" ) - IF Empty( cRCC_BIN ) - cRCC_BIN := hbmk2_FindInPath( "rcc-qt4", GetEnv( "PATH" ) + hb_osPathListSeparator() + "/opt/qtsdk/qt/bin" ) - IF Empty( cRCC_BIN ) - hbmk2_OutErr( hbmk2, "HB_QT_RCC_BIN not set, could not autodetect" ) - RETURN NIL + lBuildIt := .T. + ENDIF + + IF lBuildIt + + cCommand := cRCC_BIN +; + " " + hbmk2_FNameEscape( hbmk2_PathSepToTarget( hbmk2, cSrc ), hbmk2[ "nCmd_Esc" ], hbmk2[ "nCmd_FNF" ] ) +; + " -o " + hbmk2_FNameEscape( hbmk2_PathSepToTarget( hbmk2, cDst ), hbmk2[ "nCmd_Esc" ], hbmk2[ "nCmd_FNF" ] ) + + IF hbmk2[ "lTRACE" ] + IF ! hbmk2[ "lQUIET" ] + hbmk2_OutStd( hbmk2, I_( "'rcc' command:" ) ) + ENDIF + hbmk2_OutStdRaw( cCommand ) + ENDIF + + IF ! hbmk2[ "lDONTEXEC" ] .AND. ( nError := hb_processRun( cCommand ) ) != 0 + hbmk2_OutErr( hbmk2, hb_StrFormat( I_( "Error: Running 'rcc' executable. %1$s" ), hb_ntos( nError ) ) ) + IF ! hbmk2[ "lQUIET" ] + hbmk2_OutErrRaw( cCommand ) + ENDIF + IF ! hbmk2[ "lIGNOREERROR" ] + cRetVal := "error" + EXIT ENDIF ENDIF ENDIF - IF hbmk2[ "lINFO" ] - hbmk2_OutStd( hbmk2, hb_StrFormat( "Using QT 'rcc' executable: %1$s (autodetected)", cRCC_BIN ) ) - ENDIF - ELSE - IF hb_FileExists( GetEnv( "HB_QT_RCC_BIN" ) ) - cRCC_BIN := GetEnv( "HB_QT_RCC_BIN" ) - IF hbmk2[ "lINFO" ] - hbmk2_OutStd( hbmk2, hb_StrFormat( "Using QT 'rcc' executable: %1$s", cRCC_BIN ) ) - ENDIF - ELSE - hbmk2_OutErr( hbmk2, "HB_QT_RCC_BIN points to non-existent file. Make sure to set it to full path and filename of 'rcc' executable." ) - RETURN NIL - ENDIF - ENDIF + NEXT ENDIF - - /* Execute 'rcc' commands on input files */ - - FOR EACH cSrc, cDst IN hbmk2[ "vars" ][ "aQRC" ], hbmk2[ "vars" ][ "aQRC_Dst" ] - - IF hbmk2[ "lINC" ] .AND. ! hbmk2[ "lREBUILD" ] - lBuildIt := ! hb_FGetDateTime( cDst, @tDst ) .OR. ; - ! hb_FGetDateTime( cSrc, @tSrc ) .OR. ; - tSrc > tDst - ELSE - lBuildIt := .T. - ENDIF - - IF lBuildIt - - cCommand := cRCC_BIN +; - " " + hbmk2_FNameEscape( hbmk2_PathSepToTarget( hbmk2, cSrc ), hbmk2[ "nCmd_Esc" ], hbmk2[ "nCmd_FNF" ] ) +; - " -o " + hbmk2_FNameEscape( hbmk2_PathSepToTarget( hbmk2, cDst ), hbmk2[ "nCmd_Esc" ], hbmk2[ "nCmd_FNF" ] ) - - IF hbmk2[ "lTRACE" ] - IF ! hbmk2[ "lQUIET" ] - hbmk2_OutStd( hbmk2, I_( "'rcc' command:" ) ) - ENDIF - hbmk2_OutStdRaw( cCommand ) - ENDIF - - IF ! hbmk2[ "lDONTEXEC" ] .AND. ( nError := hb_processRun( cCommand ) ) != 0 - hbmk2_OutErr( hbmk2, hb_StrFormat( I_( "Error: Running 'rcc' executable. %1$s" ), hb_ntos( nError ) ) ) - IF ! hbmk2[ "lQUIET" ] - hbmk2_OutErrRaw( cCommand ) - ENDIF - IF ! hbmk2[ "lIGNOREERROR" ] - cRetVal := "error" - EXIT - ENDIF - ENDIF - ENDIF - NEXT ENDIF EXIT @@ -248,7 +249,8 @@ FUNCTION hbmk2_plugin_qt( hbmk2 ) CASE "post_all" IF ! hbmk2[ "lINC" ] .OR. hbmk2[ "lCLEAN" ] - AEval( hbmk2[ "vars" ][ "aUI_Dst" ], {| tmp | FErase( tmp ) } ) + AEval( hbmk2[ "vars" ][ "aMOC_Dst" ], {| tmp | FErase( tmp ) } ) + AEval( hbmk2[ "vars" ][ "aUIC_Dst" ], {| tmp | FErase( tmp ) } ) AEval( hbmk2[ "vars" ][ "aQRC_Dst" ], {| tmp | FErase( tmp ) } ) ENDIF @@ -258,9 +260,53 @@ FUNCTION hbmk2_plugin_qt( hbmk2 ) RETURN cRetVal +STATIC FUNCTION qt_tool_detect( hbmk2, cEnvQT, cEnvHB, cName ) + LOCAL cBIN + + cBIN := GetEnv( cEnvQT ) + IF Empty( cBIN ) + IF Empty( GetEnv( cEnvHB ) ) + IF hbmk2[ "cPLAT" ] == "win" + IF GetEnv( "HB_WITH_QT" ) == "no" + RETURN NIL + ELSE + cBIN := GetEnv( "HB_WITH_QT" ) + "\..\bin\" + cName + ".exe" + IF ! hb_FileExists( cBIN ) + hbmk2_OutErr( hbmk2, hb_StrFormat( "HB_WITH_QT points to incomplete QT installation. '%1$s' executable not found.", cName ) ) + RETURN NIL + ENDIF + ENDIF + ELSE + cBIN := hbmk2_FindInPath( cName, GetEnv( "PATH" ) + hb_osPathListSeparator() + "/opt/qtsdk/qt/bin" ) + IF Empty( cBIN ) + cBIN := hbmk2_FindInPath( cName + "-qt4", GetEnv( "PATH" ) + hb_osPathListSeparator() + "/opt/qtsdk/qt/bin" ) + IF Empty( cBIN ) + hbmk2_OutErr( hbmk2, hb_StrFormat( "%1$s not set, could not autodetect", cEnvHB ) ) + RETURN NIL + ENDIF + ENDIF + ENDIF + IF hbmk2[ "lINFO" ] + hbmk2_OutStd( hbmk2, hb_StrFormat( "Using QT '%1$s' executable: %2$s (autodetected)", cName, cBIN ) ) + ENDIF + ELSE + IF hb_FileExists( GetEnv( cEnvHB ) ) + cBIN := GetEnv( cEnvHB ) + IF hbmk2[ "lINFO" ] + hbmk2_OutStd( hbmk2, hb_StrFormat( "Using QT '%1$s' executable: %2$s", cName, cBIN ) ) + ENDIF + ELSE + hbmk2_OutErr( hbmk2, hb_StrFormat( "%1$s points to non-existent file. Make sure to set it to full path and filename of '%2$s' executable.", cEnvHB, cName ) ) + RETURN NIL + ENDIF + ENDIF + ENDIF + + RETURN cBIN + /* ----------------------------------------------------------------------- */ -STATIC FUNCTION ui_to_prg( hbmk2, cFileNameSrc, cFileNameDst, cOriSrc ) +STATIC FUNCTION uic_to_prg( hbmk2, cFileNameSrc, cFileNameDst, cOriSrc ) LOCAL aLinesPRG LOCAL cFile LOCAL cName diff --git a/harbour/contrib/hbqt/hbqt_common.hbm b/harbour/contrib/hbqt/hbqt_common.hbm index e591b49094..9c9b7067a1 100644 --- a/harbour/contrib/hbqt/hbqt_common.hbm +++ b/harbour/contrib/hbqt/hbqt_common.hbm @@ -9,7 +9,7 @@ -stop{dos|watcom|bcc|pocc|pocc64|poccarm|msvcia64} --plugin=hbmk2_plugin_moc.prg +-plugin=hbmk2_plugin_qt.prg -depkeyhead=qt:QtCore/qglobal.h -depcontrol=qt:${HB_WITH_QT} diff --git a/harbour/utils/hbmk2/hbmk2.prg b/harbour/utils/hbmk2/hbmk2.prg index dba06f6f4c..dd38d5f5ea 100644 --- a/harbour/utils/hbmk2/hbmk2.prg +++ b/harbour/utils/hbmk2/hbmk2.prg @@ -325,64 +325,63 @@ REQUEST hbmk_KEYW #define _HBMK_lHBCPPMM 59 #define _HBMK_aVAR 60 #define _HBMK_hDEP 61 -#define _HBMK_hDEPBYHEADER 62 -#define _HBMK_lCreateLib 63 -#define _HBMK_lCreateDyn 64 -#define _HBMK_lCreateImpLib 65 +#define _HBMK_lCreateLib 62 +#define _HBMK_lCreateDyn 63 +#define _HBMK_lCreateImpLib 64 -#define _HBMK_lDynVM 66 +#define _HBMK_lDynVM 65 -#define _HBMK_lBLDFLGP 67 -#define _HBMK_lBLDFLGC 68 -#define _HBMK_lBLDFLGL 69 +#define _HBMK_lBLDFLGP 66 +#define _HBMK_lBLDFLGC 67 +#define _HBMK_lBLDFLGL 68 -#define _HBMK_cFIRST 70 -#define _HBMK_aPRG 71 -#define _HBMK_aC 72 -#define _HBMK_aCPP 73 -#define _HBMK_aRESSRC 74 -#define _HBMK_aRESCMP 75 -#define _HBMK_aOBJUSER 76 -#define _HBMK_aICON 77 -#define _HBMK_aIMPLIBSRC 78 -#define _HBMK_aDEF 79 -#define _HBMK_hDEPTS 80 +#define _HBMK_cFIRST 69 +#define _HBMK_aPRG 70 +#define _HBMK_aC 71 +#define _HBMK_aCPP 72 +#define _HBMK_aRESSRC 73 +#define _HBMK_aRESCMP 74 +#define _HBMK_aOBJUSER 75 +#define _HBMK_aICON 76 +#define _HBMK_aIMPLIBSRC 77 +#define _HBMK_aDEF 78 +#define _HBMK_hDEPTS 79 -#define _HBMK_aPO 81 -#define _HBMK_cHBL 82 -#define _HBMK_cHBLDir 83 -#define _HBMK_aLNG 84 -#define _HBMK_cPO 85 +#define _HBMK_aPO 80 +#define _HBMK_cHBL 81 +#define _HBMK_cHBLDir 82 +#define _HBMK_aLNG 83 +#define _HBMK_cPO 84 -#define _HBMK_aPLUGIN 86 -#define _HBMK_hPLUGINHRB 87 -#define _HBMK_hPLUGINVars 88 -#define _HBMK_aPLUGINPars 89 +#define _HBMK_aPLUGIN 85 +#define _HBMK_hPLUGINHRB 86 +#define _HBMK_hPLUGINVars 87 +#define _HBMK_aPLUGINPars 88 -#define _HBMK_lDEBUGTIME 90 -#define _HBMK_lDEBUGINC 91 -#define _HBMK_lDEBUGSTUB 92 -#define _HBMK_lDEBUGI18N 93 -#define _HBMK_lDEBUGDEPD 94 +#define _HBMK_lDEBUGTIME 89 +#define _HBMK_lDEBUGINC 90 +#define _HBMK_lDEBUGSTUB 91 +#define _HBMK_lDEBUGI18N 92 +#define _HBMK_lDEBUGDEPD 93 -#define _HBMK_cCCPATH 95 -#define _HBMK_cCCPREFIX 96 -#define _HBMK_cCCPOSTFIX 97 -#define _HBMK_cCCEXT 98 +#define _HBMK_cCCPATH 94 +#define _HBMK_cCCPREFIX 95 +#define _HBMK_cCCPOSTFIX 96 +#define _HBMK_cCCEXT 97 -#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_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_cPROGDIR 106 -#define _HBMK_cPROGNAME 107 +#define _HBMK_cPROGDIR 105 +#define _HBMK_cPROGNAME 106 -#define _HBMK_MAX_ 107 +#define _HBMK_MAX_ 106 #define _HBMK_DEP_CTRL_MARKER ".control." /* must be an invalid path */ @@ -2468,11 +2467,11 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause ) /usr/local/include (FHS) */ - dep_postprocess_2( hbmk ) - /* Process any package requirements */ FOR EACH tmp IN hbmk[ _HBMK_hDEP ] - dep_try_pkg_detection( hbmk, tmp ) + IF ! dep_try_pkg_detection( hbmk, tmp ) + dep_try_header_detection( hbmk, tmp ) + ENDIF NEXT ENDIF @@ -4034,20 +4033,13 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause ) IF ! hb_FGetDateTime( FN_DirExtSet( tmp, hbmk[ _HBMK_cWorkDir ], cObjExt ), @tmp2 ) .OR. ; ! hb_FGetDateTime( tmp, @tmp1 ) .OR. ; tmp1 > tmp2 .OR. ; - ( hbmk[ _HBMK_nHEAD ] != _HEAD_OFF .AND. FindNewerHeaders( hbmk, tmp, NIL, .F., tmp2, ! Empty( hbmk[ _HBMK_hDEPBYHEADER ] ), .T., cBin_CompC, @headstate ) ) + ( hbmk[ _HBMK_nHEAD ] != _HEAD_OFF .AND. FindNewerHeaders( hbmk, tmp, NIL, .F., tmp2, .T., cBin_CompC, @headstate ) ) AAdd( l_aC_TODO, tmp ) ENDIF NEXT ELSE l_aC_TODO := AClone( hbmk[ _HBMK_aC ] ) ENDIF - - /* Header dir detection if needed and if FindNewerHeaders() wasn't called yet. */ - IF ! Empty( hbmk[ _HBMK_hDEPBYHEADER ] ) .AND. ! Empty( l_aC_TODO ) .AND. headstate == NIL - FOR EACH tmp IN l_aC_TODO - FindNewerHeaders( hbmk, tmp, NIL, .F., NIL, .T., .T., cBin_CompC, @headstate ) - NEXT - ENDIF ENDIF /* Do header detection and create incremental file list for .cpp files */ @@ -4065,20 +4057,13 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause ) IF ! hb_FGetDateTime( FN_DirExtSet( tmp, hbmk[ _HBMK_cWorkDir ], cObjExt ), @tmp2 ) .OR. ; ! hb_FGetDateTime( tmp, @tmp1 ) .OR. ; tmp1 > tmp2 .OR. ; - ( hbmk[ _HBMK_nHEAD ] != _HEAD_OFF .AND. FindNewerHeaders( hbmk, tmp, NIL, .F., tmp2, ! Empty( hbmk[ _HBMK_hDEPBYHEADER ] ), .T., cBin_CompCPP, @headstate ) ) + ( hbmk[ _HBMK_nHEAD ] != _HEAD_OFF .AND. FindNewerHeaders( hbmk, tmp, NIL, .F., tmp2, .T., cBin_CompCPP, @headstate ) ) AAdd( l_aCPP_TODO, tmp ) ENDIF NEXT ELSE l_aCPP_TODO := AClone( hbmk[ _HBMK_aCPP ] ) ENDIF - - /* Header dir detection if needed and if FindNewerHeaders() wasn't called yet. */ - IF ! Empty( hbmk[ _HBMK_hDEPBYHEADER ] ) .AND. ! Empty( l_aCPP_TODO ) .AND. headstate == NIL - FOR EACH tmp IN l_aCPP_TODO - FindNewerHeaders( hbmk, tmp, NIL, .F., NIL, .T., .T., cBin_CompCPP, @headstate ) - NEXT - ENDIF ENDIF /* Create incremental file list for .prg files */ @@ -4086,9 +4071,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 */ - IF ! hbmk[ _HBMK_lCLEAN ] - PlugIn_Execute( hbmk, "pre_prg" ) - ENDIF + PlugIn_Execute( hbmk, "pre_prg" ) /* Incremental */ @@ -4114,7 +4097,7 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause ) IF ! hb_FGetDateTime( FN_DirExtSet( tmp3, cHarbourOutputDir, cHarbourOutputExt ), @tmp2 ) .OR. ; ! hb_FGetDateTime( tmp3, @tmp1 ) .OR. ; tmp1 > tmp2 .OR. ; - ( hbmk[ _HBMK_nHEAD ] != _HEAD_OFF .AND. FindNewerHeaders( hbmk, tmp, NIL, .F., tmp2, .F., .F., cBin_CompC, @headstate ) ) + ( hbmk[ _HBMK_nHEAD ] != _HEAD_OFF .AND. FindNewerHeaders( hbmk, tmp, NIL, .F., tmp2, .F., cBin_CompC, @headstate ) ) AAdd( l_aPRG_TODO, tmp ) ENDIF NEXT @@ -4632,7 +4615,7 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause ) IF ! hb_FGetDateTime( FN_DirExtSet( tmp, hbmk[ _HBMK_cWorkDir ], cResExt ), @tmp2 ) .OR. ; ! hb_FGetDateTime( tmp, @tmp1 ) .OR. ; tmp1 > tmp2 .OR. ; - ( hbmk[ _HBMK_nHEAD ] != _HEAD_OFF .AND. FindNewerHeaders( hbmk, tmp, NIL, .F., tmp2, .F., .T., cBin_CompC, @headstate ) ) + ( hbmk[ _HBMK_nHEAD ] != _HEAD_OFF .AND. FindNewerHeaders( hbmk, tmp, NIL, .F., tmp2, .T., cBin_CompC, @headstate ) ) AAdd( l_aRESSRC_TODO, tmp ) ENDIF NEXT @@ -4838,9 +4821,9 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause ) ENDIF ENDIF - IF ! hbmk[ _HBMK_lCLEAN ] + PlugIn_Execute( hbmk, "pre_c" ) - PlugIn_Execute( hbmk, "pre_c" ) + IF ! hbmk[ _HBMK_lCLEAN ] FOR EACH tmp3 IN { _CCOMP_PASS_C, _CCOMP_PASS_CPP } @@ -5601,7 +5584,7 @@ STATIC FUNCTION SetupForGT( cGT_New, /* @ */ cGT, /* @ */ lGUI ) #define _HEADSTATE_lAnyNewer 2 #define _HEADSTATE_MAX_ 2 -STATIC FUNCTION FindNewerHeaders( hbmk, cFileName, cParentDir, lSystemHeader, tTimeParent, lIncTry, lCMode, cBin_CompC, /* @ */ headstate, nNestingLevel ) +STATIC FUNCTION FindNewerHeaders( hbmk, cFileName, cParentDir, lSystemHeader, tTimeParent, lCMode, cBin_CompC, /* @ */ headstate, nNestingLevel ) LOCAL cFile LOCAL fhnd LOCAL tTimeSelf @@ -5625,7 +5608,7 @@ STATIC FUNCTION FindNewerHeaders( hbmk, cFileName, cParentDir, lSystemHeader, tT headstate[ _HEADSTATE_lAnyNewer ] := .F. ENDIF - IF ! lIncTry .AND. hbmk[ _HBMK_nHEAD ] == _HEAD_OFF + IF hbmk[ _HBMK_nHEAD ] == _HEAD_OFF RETURN .F. ENDIF @@ -5735,7 +5718,7 @@ STATIC FUNCTION FindNewerHeaders( hbmk, cFileName, cParentDir, lSystemHeader, tT ENDIF IF nNestingLevel > 1 - cFileName := FindHeader( hbmk, cFileName, cParentDir, lIncTry, lSystemHeader ) + cFileName := FindHeader( hbmk, cFileName, cParentDir, lSystemHeader ) IF Empty( cFileName ) RETURN .F. ENDIF @@ -5752,10 +5735,7 @@ STATIC FUNCTION FindNewerHeaders( hbmk, cFileName, cParentDir, lSystemHeader, tT IF tTimeParent != NIL .AND. hb_FGetDateTime( cFileName, @tTimeSelf ) .AND. tTimeSelf > tTimeParent headstate[ _HEADSTATE_lAnyNewer ] := .T. - /* Let it continue if we want to scan for header locations */ - IF ! lIncTry - RETURN .T. - ENDIF + RETURN .T. ENDIF cExt := Lower( FN_ExtGet( cFileName ) ) @@ -5770,9 +5750,7 @@ STATIC FUNCTION FindNewerHeaders( hbmk, cFileName, cParentDir, lSystemHeader, tT FOR EACH cDependency IN hbmk[ _HBMK_hDEPTS ][ cFileName ] IF hb_FGetDateTime( cDependency, @tTimeDependency ) .AND. tTimeDependency > tTimeParent headstate[ _HEADSTATE_lAnyNewer ] := .T. - IF ! lIncTry - RETURN .T. - ENDIF + RETURN .T. ENDIF NEXT @@ -5808,9 +5786,7 @@ STATIC FUNCTION FindNewerHeaders( hbmk, cFileName, cParentDir, lSystemHeader, tT ENDIF IF hb_FGetDateTime( cDependency, @tTimeDependency ) .AND. tTimeDependency > tTimeParent headstate[ _HEADSTATE_lAnyNewer ] := .T. - IF ! lIncTry - RETURN .T. - ENDIF + RETURN .T. ENDIF ENDIF NEXT @@ -5826,9 +5802,7 @@ STATIC FUNCTION FindNewerHeaders( hbmk, cFileName, cParentDir, lSystemHeader, tT ENDIF IF hb_FGetDateTime( cDependency, @tTimeDependency ) .AND. tTimeDependency > tTimeParent headstate[ _HEADSTATE_lAnyNewer ] := .T. - IF ! lIncTry - RETURN .T. - ENDIF + RETURN .T. ENDIF ENDIF NEXT @@ -5859,9 +5833,7 @@ STATIC FUNCTION FindNewerHeaders( hbmk, cFileName, cParentDir, lSystemHeader, tT ENDIF IF hb_FGetDateTime( cDependency, @tTimeDependency ) .AND. tTimeDependency > tTimeParent headstate[ _HEADSTATE_lAnyNewer ] := .T. - IF ! lIncTry - RETURN .T. - ENDIF + RETURN .T. ENDIF ENDIF NEXT @@ -5877,7 +5849,7 @@ STATIC FUNCTION FindNewerHeaders( hbmk, cFileName, cParentDir, lSystemHeader, tT .prg, .c and .res sources. Please try to keep it simple, as speed and maintainability is also important. [vszakats] */ - IF lIncTry .OR. hbmk[ _HBMK_nHEAD ] == _HEAD_FULL + IF hbmk[ _HBMK_nHEAD ] == _HEAD_FULL cFile := MemoRead( cFileName ) ELSE IF ( fhnd := FOpen( cFileName, FO_READ + FO_SHARED ) ) == F_ERROR @@ -5909,12 +5881,10 @@ STATIC FUNCTION FindNewerHeaders( hbmk, cFileName, cParentDir, lSystemHeader, tT lSystemHeader := ( Left( cHeader, 1 ) == "<" ) cHeader := SubStr( cHeader, 2, Len( cHeader ) - 2 ) - IF FindNewerHeaders( hbmk, cHeader, iif( lCMode, FN_DirGet( cFileName ), cParentDir ), lSystemHeader, tTimeParent, lIncTry, lCMode, cBin_CompC, @headstate, nNestingLevel + 1 ) + IF FindNewerHeaders( hbmk, cHeader, iif( lCMode, FN_DirGet( cFileName ), cParentDir ), lSystemHeader, tTimeParent, lCMode, cBin_CompC, @headstate, nNestingLevel + 1 ) headstate[ _HEADSTATE_lAnyNewer ] := .T. /* Let it continue if we want to scan for header locations */ - IF ! lIncTry - RETURN .T. - ENDIF + RETURN .T. ENDIF NEXT ENDIF @@ -6086,41 +6056,6 @@ STATIC PROCEDURE dep_postprocess( hbmk ) RETURN -STATIC PROCEDURE dep_postprocess_2( hbmk ) - LOCAL dep - LOCAL tmp - - /* Create a hash table of dependencies "indexed" by key header, - for header detection. */ - - hbmk[ _HBMK_hDEPBYHEADER ] := { => } - - #if defined( __PLATFORM__UNIX ) - hb_HSetCaseMatch( hbmk[ _HBMK_hDEPBYHEADER ], .T. ) - #else - hb_HSetCaseMatch( hbmk[ _HBMK_hDEPBYHEADER ], .F. ) - #endif - - FOR EACH dep IN hbmk[ _HBMK_hDEP ] - IF ! Empty( dep[ _HBMKDEP_aKeyHeader ] ) .AND. ; - ! dep[ _HBMKDEP_lFound ] - IF ! Empty( dep[ _HBMKDEP_aINCPATH ] ) .OR. ; - ! Empty( dep[ _HBMKDEP_aINCPATHLOCAL ] ) - FOR EACH tmp IN dep[ _HBMKDEP_aKeyHeader ] - IF tmp $ hbmk[ _HBMK_hDEPBYHEADER ] - hbmk_OutErr( hbmk, hb_StrFormat( I_( "Warning: Same key header used for multiple dependencies: %1$s in %2$s (found already in: %3$s)" ), tmp, dep[ _HBMKDEP_cName ], hbmk[ _HBMK_hDEPBYHEADER ][ tmp ][ _HBMKDEP_cName ] ) ) - ELSE - hbmk[ _HBMK_hDEPBYHEADER ][ tmp ] := dep - ENDIF - NEXT - ELSE - hbmk_OutErr( hbmk, hb_StrFormat( I_( "Warning: Key header specified without header search paths: %1$s" ), dep[ _HBMKDEP_cName ] ) ) - ENDIF - ENDIF - NEXT - - RETURN - STATIC FUNCTION dep_evaluate( hbmk ) LOCAL dep @@ -6175,7 +6110,7 @@ STATIC FUNCTION dep_evaluate( hbmk ) RETURN .T. /* Try '*-config' and 'pkg-config *' detection */ -STATIC PROCEDURE dep_try_pkg_detection( hbmk, dep ) +STATIC FUNCTION dep_try_pkg_detection( hbmk, dep ) LOCAL cStdOut LOCAL cErrOut LOCAL cItem @@ -6251,14 +6186,45 @@ STATIC PROCEDURE dep_try_pkg_detection( hbmk, dep ) hbmk_OutStd( hbmk, hb_StrFormat( "debugdepd: REQ %1$s: found as pkg at %2$s (%3$s)", dep[ _HBMKDEP_cName ], dep[ _HBMKDEP_cFound ], dep[ _HBMKDEP_cVersion ] ) ) ENDIF AAdd( hbmk[ _HBMK_aOPTC ], "-D" + _HBMK_HAS_PREF + StrToDefine( cName ) ) - EXIT + RETURN .T. ENDIF ENDIF ENDIF ENDIF NEXT - RETURN + RETURN .F. + +/* Try detection by header */ +STATIC FUNCTION dep_try_header_detection( hbmk, dep ) + LOCAL aINCPATH + LOCAL cDir + LOCAL cFileName + + /* Check dependency include path list */ + + IF ! dep[ _HBMKDEP_lFound ] + FOR EACH aINCPATH IN { dep[ _HBMKDEP_aINCPATH ],; + dep[ _HBMKDEP_aINCPATHLOCAL ] } + FOR EACH cDir IN aINCPATH + FOR EACH cFileName IN dep[ _HBMKDEP_aKeyHeader ] + IF HeaderExists( cDir, cFileName ) != NIL + dep[ _HBMKDEP_cFound ] := DirDelPathSep( PathSepToSelf( cDir ) ) + dep[ _HBMKDEP_lFound ] := .T. + dep[ _HBMKDEP_lFoundLOCAL ] := ( aINCPATH:__enumIndex() == 2 ) + IF hbmk[ _HBMK_lDEBUGDEPD ] + hbmk_OutStd( hbmk, hb_StrFormat( "debugdepd: REQ %1$s: found by %2$s header at %3$s %4$s", dep[ _HBMKDEP_cName ], PathSepToSelf( cFileName ), dep[ _HBMKDEP_cFound ], iif( dep[ _HBMKDEP_lFoundLOCAL ], "(local)", "" ) ) ) + ENDIF + AAddNew( hbmk[ _HBMK_aINCPATH ], DirDelPathSep( PathSepToSelf( cDir ) ) ) + AAdd( hbmk[ _HBMK_aOPTC ], "-D" + _HBMK_HAS_PREF + StrToDefine( dep[ _HBMKDEP_cName ] ) ) + RETURN .T. + ENDIF + NEXT + NEXT + NEXT + ENDIF + + RETURN .F. STATIC FUNCTION StrToDefine( cString ) LOCAL cDefine := "" @@ -6285,10 +6251,8 @@ STATIC FUNCTION AMerge( aDst, aSrc ) RETURN aDst -STATIC FUNCTION FindHeader( hbmk, cFileName, cParentDir, lIncTry, lSystemHeader ) +STATIC FUNCTION FindHeader( hbmk, cFileName, cParentDir, lSystemHeader ) LOCAL cDir - LOCAL aINCPATH - LOCAL dep LOCAL tmp /* Check in current dir */ @@ -6313,36 +6277,6 @@ STATIC FUNCTION FindHeader( hbmk, cFileName, cParentDir, lIncTry, lSystemHeader ENDIF NEXT - /* Check dependency include path list */ - IF lIncTry - cFileName := StrTran( cFileName, "\", "/" ) - IF cFileName $ hbmk[ _HBMK_hDEPBYHEADER ] - dep := hbmk[ _HBMK_hDEPBYHEADER ][ cFileName ] - IF ! dep[ _HBMKDEP_lFound ] - FOR EACH aINCPATH IN { dep[ _HBMKDEP_aINCPATH ],; - dep[ _HBMKDEP_aINCPATHLOCAL ] } - FOR EACH cDir IN aINCPATH - tmp := HeaderExists( cDir, cFileName ) - IF tmp != NIL - dep[ _HBMKDEP_cFound ] := DirDelPathSep( PathSepToSelf( cDir ) ) - dep[ _HBMKDEP_lFound ] := .T. - dep[ _HBMKDEP_lFoundLOCAL ] := ( aINCPATH:__enumIndex() == 2 ) - IF hbmk[ _HBMK_lDEBUGDEPD ] - hbmk_OutStd( hbmk, hb_StrFormat( "debugdepd: REQ %1$s: found by %2$s header at %3$s %4$s", dep[ _HBMKDEP_cName ], PathSepToSelf( cFileName ), dep[ _HBMKDEP_cFound ], iif( dep[ _HBMKDEP_lFoundLOCAL ], "(local)", "" ) ) ) - ENDIF - AAddNew( hbmk[ _HBMK_aINCPATH ], DirDelPathSep( PathSepToSelf( cDir ) ) ) - AAdd( hbmk[ _HBMK_aOPTC ], "-D" + _HBMK_HAS_PREF + StrToDefine( dep[ _HBMKDEP_cName ] ) ) - FOR EACH cFileName IN hbmk[ _HBMK_hDEP ][ dep[ _HBMKDEP_cName ] ][ _HBMKDEP_aKeyHeader ] - hb_HDel( hbmk[ _HBMK_hDEPBYHEADER ], cFileName ) - NEXT - RETURN tmp - ENDIF - NEXT - NEXT - ENDIF - ENDIF - ENDIF - RETURN NIL STATIC FUNCTION HeaderExists( cDir, cFileName )