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?
This commit is contained in:
Viktor Szakats
2010-06-29 10:50:10 +00:00
parent 8b4144be74
commit c2079b533e
8 changed files with 350 additions and 486 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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