diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 698d91d450..3e86bb0c16 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -16,6 +16,49 @@ The license applies to all entries newer than 2009-04-28. */ +2012-06-12 04:17 UTC+0200 Viktor Szakats (harbour syenar.net) + * contrib/hbhttpd/log.prg + * contrib/hbtip/log.prg + * contrib/hbziparc/ziparc.prg + * src/rtl/hbdoc.prg + * src/rtl/hbi18n2.prg + * src/rtl/memvarhb.prg + * src/rtl/tlabel.prg + * src/rtl/treport.prg + % use HB_FNAMEEXTSETDEF() instead of manual logic. + it also fixes RTEs in hbziparc when passed non-string + filename to nearly any of its APIs. + + * utils/hbi18n/hbi18n.hbp + * missed -shared enabler in .hbp + + * utils/hbmk2/Makefile + * utils/hbmk2/hbmk2.hbp + + enabled -shared build for hbmk2 + + * utils/hbmk2/hbmk2.prg + % consolidated .hbc finder logic + % moved 'hbmk' structure initializations to subfunctions + + added Harbour installation autodetection for hbmk2's + runner mode. It's copy-paste code yet. + + added automatic include path configuration in hbmk2's + runner mode. It means that now #require-d extensions + will have their include paths setup, so their header + will be found, so they can be used now. + + ; I more and more see it a reality to integrate hbrun + functionality into hbmk2. #require logic needs + much of hbmk2's facilities, and hbmk2 already has + basic runner capabilities. Contrib libs (and plugins) + will all have to be loaded dynamically in such case, + but since it works well, it should not be a problem. + Finally hbmk2 can be the utility that runs scripts + dynamically and also able to build an exe from them, + using the exact same source code, without any external + configuration, if the source code provides "#require" + clues. All it needs is both dynamic and static versions + of extensions (=contribs or addons). + 2012-06-11 16:28 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com) * contrib/hbqt/qtcore/hbqt_bind.cpp ! Changed: HB_TR_ALWAYS => HB_TR_DEBUG ( really a nuisiance causer ). @@ -41,7 +84,7 @@ + contrib/hbqt/tests/dbfbrowser.prg + contrib/hbqt/tests/dbfbrowserclass.prg + Added: Table browser demo code by Bacco, thank you. - This code works absolutely flawless both with current and + This code works absolutely flawless both with current and __HBQT_REVAMP__ protocols. 2012-06-11 21:06 UTC+0200 Viktor Szakats (harbour syenar.net) diff --git a/harbour/contrib/hbhttpd/log.prg b/harbour/contrib/hbhttpd/log.prg index fd572d202c..056a3315af 100644 --- a/harbour/contrib/hbhttpd/log.prg +++ b/harbour/contrib/hbhttpd/log.prg @@ -69,15 +69,11 @@ CREATE CLASS UHttpdLog ENDCLASS METHOD New( cFileName ) CLASS UHttpdLog - LOCAL cExt IF HB_ISSTRING( cFileName ) IF Set( _SET_DEFEXTENSIONS ) - hb_FNameSplit( cFileName, NIL, NIL, @cExt ) - IF Empty( cExt ) - cFileName += ".log" - ENDIF + cFileName := hb_FNameExtSetDef( cFileName, ".log" ) ENDIF ::cFileName := cFileName diff --git a/harbour/contrib/hbtip/log.prg b/harbour/contrib/hbtip/log.prg index 1d12dd97da..c53e33fae4 100644 --- a/harbour/contrib/hbtip/log.prg +++ b/harbour/contrib/hbtip/log.prg @@ -69,17 +69,13 @@ CREATE CLASS TIPLOG ENDCLASS METHOD New( cFileName ) CLASS TIPLOG - LOCAL cExt IF ! HB_ISSTRING( cFileName ) cFileName := "hbtip" ENDIF IF Set( _SET_DEFEXTENSIONS ) - hb_FNameSplit( cFileName, NIL, NIL, @cExt ) - IF Empty( cExt ) - cFileName += ".log" - ENDIF + cFileName := hb_FNameExtSetDef( cFileName, ".log" ) ENDIF ::cFileName := cFileName diff --git a/harbour/contrib/hbziparc/ziparc.prg b/harbour/contrib/hbziparc/ziparc.prg index 1ccaddf122..2989d6b680 100644 --- a/harbour/contrib/hbziparc/ziparc.prg +++ b/harbour/contrib/hbziparc/ziparc.prg @@ -83,16 +83,12 @@ PROCEDURE hb_SetZipComment( cComment ) FUNCTION hb_GetZipComment( cFileName ) LOCAL hUnzip LOCAL cComment - LOCAL cExt IF Set( _SET_DEFEXTENSIONS ) - hb_FNameSplit( cFileName, NIL, NIL, @cExt ) - IF Empty( cExt ) - cFileName += ".zip" - ENDIF + cFileName := hb_FNameExtSetDef( cFileName, ".zip" ) ENDIF - IF !Empty( hUnzip := hb_UnzipOpen( cFileName ) ) + IF ! Empty( hUnzip := hb_UnzipOpen( cFileName ) ) hb_UnzipGlobalInfo( hUnzip, NIL, @cComment ) hb_UnzipClose( hUnzip ) ELSE @@ -104,16 +100,12 @@ FUNCTION hb_GetZipComment( cFileName ) FUNCTION hb_GetFileCount( cFileName ) LOCAL hUnzip LOCAL nEntries - LOCAL cExt IF Set( _SET_DEFEXTENSIONS ) - hb_FNameSplit( cFileName, NIL, NIL, @cExt ) - IF Empty( cExt ) - cFileName += ".zip" - ENDIF + cFileName := hb_FNameExtSetDef( cFileName, ".zip" ) ENDIF - IF !Empty( hUnzip := hb_UnzipOpen( cFileName ) ) + IF ! Empty( hUnzip := hb_UnzipOpen( cFileName ) ) hb_UnzipGlobalInfo( hUnzip, @nEntries, NIL ) hb_UnzipClose( hUnzip ) ELSE @@ -125,16 +117,12 @@ FUNCTION hb_GetFileCount( cFileName ) FUNCTION hb_ZipWithPassword( cFileName ) LOCAL lCrypted := .F. LOCAL hUnzip - LOCAL cExt IF Set( _SET_DEFEXTENSIONS ) - hb_FNameSplit( cFileName, NIL, NIL, @cExt ) - IF Empty( cExt ) - cFileName += ".zip" - ENDIF + cFileName := hb_FNameExtSetDef( cFileName, ".zip" ) ENDIF - IF !Empty( hUnzip := hb_UnzipOpen( cFileName ) ) + IF ! Empty( hUnzip := hb_UnzipOpen( cFileName ) ) IF hb_UnzipFileFirst( hUnzip ) == 0 hb_UnzipFileInfo( hUnzip, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, @lCrypted ) @@ -149,7 +137,6 @@ FUNCTION hb_GetFilesInZip( cFileName, lVerbose ) LOCAL hUnzip LOCAL nErr - LOCAL cExt LOCAL dDate LOCAL cTime @@ -165,13 +152,10 @@ FUNCTION hb_GetFilesInZip( cFileName, lVerbose ) LOCAL aFiles := {} IF Set( _SET_DEFEXTENSIONS ) - hb_FNameSplit( cFileName, NIL, NIL, @cExt ) - IF Empty( cExt ) - cFileName += ".zip" - ENDIF + cFileName := hb_FNameExtSetDef( cFileName, ".zip" ) ENDIF - IF !Empty( hUnzip := hb_UnzipOpen( cFileName ) ) + IF ! Empty( hUnzip := hb_UnzipOpen( cFileName ) ) hb_default( @lVerbose, .F. ) @@ -296,17 +280,14 @@ FUNCTION hb_ZipFile( cFileName,; HB_SYMBOL_UNUSED( acExclude ) IF Set( _SET_DEFEXTENSIONS ) - hb_FNameSplit( cFileName, NIL, NIL, @cExt ) - IF Empty( cExt ) - cFileName += ".zip" - ENDIF + cFileName := hb_FNameExtSetDef( cFileName, ".zip" ) ENDIF IF lOverwrite .AND. hb_FileExists( cFileName ) FErase( cFileName ) ENDIF - IF !Empty( hZip := hb_ZipOpen( cFileName, iif( ! lOverwrite .AND. hb_FileExists( cFileName ), HB_ZIP_OPEN_ADDINZIP, NIL ) ) ) + IF ! Empty( hZip := hb_ZipOpen( cFileName, iif( ! lOverwrite .AND. hb_FileExists( cFileName ), HB_ZIP_OPEN_ADDINZIP, NIL ) ) ) IF HB_ISSTRING( acFiles ) acFiles := { acFiles } @@ -408,7 +389,6 @@ FUNCTION hb_UnzipFile( cFileName, bUpdate, lWithPath, cPassword, cPath, acFiles, LOCAL nErr LOCAL nPos LOCAL cZipName - LOCAL cExt LOCAL lExtract LOCAL hHandle @@ -430,13 +410,10 @@ FUNCTION hb_UnzipFile( cFileName, bUpdate, lWithPath, cPassword, cPath, acFiles, ENDIF IF Set( _SET_DEFEXTENSIONS ) - hb_FNameSplit( cFileName, NIL, NIL, @cExt ) - IF Empty( cExt ) - cFileName += ".zip" - ENDIF + cFileName := hb_FNameExtSetDef( cFileName, ".zip" ) ENDIF - IF !Empty( hUnzip := hb_UnzipOpen( cFileName ) ) + IF ! Empty( hUnzip := hb_UnzipOpen( cFileName ) ) IF HB_ISNUMERIC( acFiles ) .OR. ; HB_ISSTRING( acFiles ) @@ -511,13 +488,9 @@ FUNCTION hb_ZipDeleteFiles( cFileName, acFiles ) LOCAL lRetVal := .T. LOCAL cFileToProc - LOCAL cExt IF Set( _SET_DEFEXTENSIONS ) - hb_FNameSplit( cFileName, NIL, NIL, @cExt ) - IF Empty( cExt ) - cFileName += ".zip" - ENDIF + cFileName := hb_FNameExtSetDef( cFileName, ".zip" ) ENDIF IF HB_ISSTRING( acFiles ) diff --git a/harbour/src/rtl/hbdoc.prg b/harbour/src/rtl/hbdoc.prg index e616a8f5f4..833b74b05a 100644 --- a/harbour/src/rtl/hbdoc.prg +++ b/harbour/src/rtl/hbdoc.prg @@ -313,16 +313,12 @@ FUNCTION __hbdoc_FilterOut( cFile ) FUNCTION __hbdoc_SaveHBD( cFileName, aEntry ) LOCAL fhnd - LOCAL cExt IF HB_ISSTRING( cFileName ) .AND. ; HB_ISARRAY( aEntry ) IF Set( _SET_DEFEXTENSIONS ) - hb_FNameSplit( cFileName, NIL, NIL, @cExt ) - IF Empty( cExt ) - cFileName += _HBDOC_EXT - ENDIF + cFileName := hb_FNameExtSetDef( cFileName, _HBDOC_EXT ) ENDIF fhnd := hb_FCreate( cFileName, FC_NORMAL, FO_CREAT + FO_TRUNC + FO_READWRITE + FO_EXCLUSIVE ) @@ -338,7 +334,6 @@ FUNCTION __hbdoc_SaveHBD( cFileName, aEntry ) FUNCTION __hbdoc_LoadHBD( cFileName ) LOCAL fhnd - LOCAL cExt LOCAL aEntry := NIL LOCAL cBuffer @@ -346,10 +341,7 @@ FUNCTION __hbdoc_LoadHBD( cFileName ) IF HB_ISSTRING( cFileName ) IF Set( _SET_DEFEXTENSIONS ) - hb_FNameSplit( cFileName, NIL, NIL, @cExt ) - IF Empty( cExt ) - cFileName += _HBDOC_EXT - ENDIF + cFileName := hb_FNameExtSetDef( cFileName, _HBDOC_EXT ) ENDIF fhnd := FOpen( cFileName, FO_READ ) diff --git a/harbour/src/rtl/hbi18n2.prg b/harbour/src/rtl/hbi18n2.prg index 6d793d5e97..d16e841f16 100644 --- a/harbour/src/rtl/hbi18n2.prg +++ b/harbour/src/rtl/hbi18n2.prg @@ -61,21 +61,18 @@ #define _I18N_ITEM { "", {}, {}, .F., NIL } -#define _I18N_EOL chr( 10 ) -#define _I18N_DELIM ( chr( 0 ) + chr( 3 ) + chr( 0 ) ) +#define _I18N_EOL Chr( 10 ) +#define _I18N_DELIM ( Chr( 0 ) + Chr( 3 ) + Chr( 0 ) ) #define LEFTEQUAL( l, r ) ( Left( l, Len( r ) ) == r ) -STATIC FUNCTION __I18N_fileName( cFile ) - LOCAL cExt +STATIC FUNCTION __I18N_fileName( cFileName ) IF Set( _SET_DEFEXTENSIONS ) - hb_FNameSplit( cFile, NIL, NIL, @cExt ) - IF Empty( cExt ) - cFile += ".pot" - ENDIF + cFileName := hb_FNameExtSetDef( cFileName, ".pot" ) ENDIF - RETURN cFile + + RETURN cFileName STATIC FUNCTION __I18N_strEncode( cStr ) diff --git a/harbour/src/rtl/memvarhb.prg b/harbour/src/rtl/memvarhb.prg index 5d68cdd4fe..fe8ae3b4ad 100644 --- a/harbour/src/rtl/memvarhb.prg +++ b/harbour/src/rtl/memvarhb.prg @@ -81,11 +81,8 @@ FUNCTION HB_MVSAVE( cFileName, cMask, lIncludeMask ) LOCAL nScope LOCAL lMatch - LOCAL cExt LOCAL aVars - LOCAL fhnd - LOCAL tmp LOCAL oError @@ -95,10 +92,7 @@ FUNCTION HB_MVSAVE( cFileName, cMask, lIncludeMask ) IF HB_ISSTRING( cFileName ) IF Set( _SET_DEFEXTENSIONS ) - hb_FNameSplit( cFileName, NIL, NIL, @cExt ) - IF Empty( cExt ) - cFileName += _HBMEM_EXT - ENDIF + cFileName := hb_FNameExtSetDef( cFileName, _HBMEM_EXT ) ENDIF IF ! HB_ISSTRING( cMask ) .OR. ; @@ -176,7 +170,6 @@ FUNCTION HB_MVRESTORE( cFileName, lAdditive, cMask, lIncludeMask ) LOCAL cName LOCAL lMatch - LOCAL cExt LOCAL aVars LOCAL cBuffer LOCAL xValue @@ -198,10 +191,7 @@ FUNCTION HB_MVRESTORE( cFileName, lAdditive, cMask, lIncludeMask ) ENDIF IF Set( _SET_DEFEXTENSIONS ) - hb_FNameSplit( cFileName, NIL, NIL, @cExt ) - IF Empty( cExt ) - cFileName += _HBMEM_EXT - ENDIF + cFileName := hb_FNameExtSetDef( cFileName, _HBMEM_EXT ) ENDIF IF ! HB_ISSTRING( cFileName ) .OR. ; diff --git a/harbour/src/rtl/tlabel.prg b/harbour/src/rtl/tlabel.prg index 5aeac1b8e0..e9fa77d36c 100644 --- a/harbour/src/rtl/tlabel.prg +++ b/harbour/src/rtl/tlabel.prg @@ -124,7 +124,6 @@ METHOD New( cLBLName, lPrinter, cAltFile, lNoConsole, bFor, ; LOCAL xBreakVal, lBroke := .F. LOCAL err LOCAL OldMargin - LOCAL cExt ::aBandToPrint := {} // Array(5) ::nCurrentCol := 1 @@ -140,10 +139,7 @@ METHOD New( cLBLName, lPrinter, cAltFile, lNoConsole, bFor, ; /* NOTE: CA-Cl*pper does an RTrim() on the filename here, but in Harbour we're using _SET_TRIMFILENAME. [vszakats] */ IF Set( _SET_DEFEXTENSIONS ) - hb_FNameSplit( cLBLName, NIL, NIL, @cExt ) - IF Empty( cExt ) - cLBLName += ".lbl" - ENDIF + cLBLName := hb_FNameExtSetDef( cLBLName, ".lbl" ) ENDIF ENDIF diff --git a/harbour/src/rtl/treport.prg b/harbour/src/rtl/treport.prg index 94f0eaa0e3..0ab4677eb9 100644 --- a/harbour/src/rtl/treport.prg +++ b/harbour/src/rtl/treport.prg @@ -206,7 +206,6 @@ METHOD New( cFrmName AS STRING,; LOCAL nCol, nGroup LOCAL xBreakVal, lBroke := .F. LOCAL err - LOCAL cExt LOCAL lAnyTotals LOCAL lAnySubTotals @@ -222,10 +221,7 @@ METHOD New( cFrmName AS STRING,; /* NOTE: CA-Cl*pper does an RTrim() on the filename here, but in Harbour we're using _SET_TRIMFILENAME. */ IF Set( _SET_DEFEXTENSIONS ) - hb_FNameSplit( cFRMName, NIL, NIL, @cExt ) - IF Empty( cExt ) - cFRMName += ".frm" - ENDIF + cFRMName := hb_FNameExtSetDef( cFRMName, ".frm" ) ENDIF ENDIF diff --git a/harbour/utils/hbi18n/hbi18n.hbp b/harbour/utils/hbi18n/hbi18n.hbp index 0f86013d53..f656cfeb0b 100644 --- a/harbour/utils/hbi18n/hbi18n.hbp +++ b/harbour/utils/hbi18n/hbi18n.hbp @@ -6,3 +6,5 @@ -nulrdd hbi18n.prg + +{!(HB_BUILD_DYN='no')&(win|wce|os2)}-shared diff --git a/harbour/utils/hbmk2/Makefile b/harbour/utils/hbmk2/Makefile index 3c1efe26a5..28645f1903 100644 --- a/harbour/utils/hbmk2/Makefile +++ b/harbour/utils/hbmk2/Makefile @@ -20,4 +20,10 @@ ifneq ($(HB_HAS_WATT),) HB_PRGFLAGS += -DHB_HAS_WATT endif +ifneq ($(filter $(HB_PLATFORM),win wce os2),) + ifneq ($(HB_BUILD_DYN),no) + HB_BUILD_SHARED := yes + endif +endif + include $(TOP)$(ROOT)config/bin.mk diff --git a/harbour/utils/hbmk2/hbmk2.hbp b/harbour/utils/hbmk2/hbmk2.hbp index 2ce56a03de..0e6e37ed7d 100644 --- a/harbour/utils/hbmk2/hbmk2.hbp +++ b/harbour/utils/hbmk2/hbmk2.hbp @@ -14,3 +14,5 @@ hbmk2.prg hbmk2.%{hb_lng}.po -hbl=hbmk2.%{hb_lng}.hbl -lng=es_PE,hu_HU,pt_BR + +{!(HB_BUILD_DYN='no')&(win|wce|os2)}-shared diff --git a/harbour/utils/hbmk2/hbmk2.prg b/harbour/utils/hbmk2/hbmk2.prg index 99c3264f20..d77d71a32a 100644 --- a/harbour/utils/hbmk2/hbmk2.prg +++ b/harbour/utils/hbmk2/hbmk2.prg @@ -1,3 +1,4 @@ + #pragma linenumber=on /* * $Id$ */ @@ -765,9 +766,160 @@ STATIC PROCEDURE hbmk_COMP_Setup( cARCH, cCOMP, cBasePath ) RETURN +STATIC FUNCTION hbmk_new() + LOCAL hbmk[ _HBMK_MAX_ ] + + hbmk[ _HBMK_cBUILD ] := "" + + hbmk[ _HBMK_lStopAfterInit ] := .F. + hbmk[ _HBMK_lStopAfterHarbour ] := .F. + + hbmk[ _HBMK_nErrorLevel ] := _ERRLEV_OK + + hbmk[ _HBMK_cWorkDir ] := NIL + + hbmk[ _HBMK_lCreateLib ] := .F. + Set_lCreateDyn( hbmk, .F. ) + hbmk[ _HBMK_lCreateImpLib ] := .F. + hbmk[ _HBMK_lCreatePPO ] := .F. + hbmk[ _HBMK_lCreateHRB ] := .F. + + hbmk[ _HBMK_lDynVM ] := .F. + + hbmk[ _HBMK_lQuiet ] := .F. + hbmk[ _HBMK_lInfo ] := .F. + hbmk[ _HBMK_nMaxCol ] := MaxCol() + + hbmk[ _HBMK_cPLAT ] := "" + hbmk[ _HBMK_cCOMP ] := "" + + hbmk[ _HBMK_lCPP ] := NIL + hbmk[ _HBMK_lGUI ] := .F. + hbmk[ _HBMK_lMT ] := .F. + hbmk[ _HBMK_lPIC ] := .F. + hbmk[ _HBMK_lDEBUG ] := .F. + hbmk[ _HBMK_nHEAD ] := _HEAD_FULL + hbmk[ _HBMK_lREBUILD ] := .F. + hbmk[ _HBMK_lCLEAN ] := .F. + hbmk[ _HBMK_lTRACE ] := .F. + hbmk[ _HBMK_lDONTEXEC ] := .F. + hbmk[ _HBMK_nHBMODE ] := _HBMODE_NATIVE + hbmk[ _HBMK_lSHAREDDIST ] := NIL + hbmk[ _HBMK_lNULRDD ] := .F. + hbmk[ _HBMK_lMAP ] := .F. + hbmk[ _HBMK_lBEEP ] := .F. + hbmk[ _HBMK_lSTRIP ] := .F. + hbmk[ _HBMK_lOPTIM ] := .T. + hbmk[ _HBMK_nWARN ] := _WARN_YES + hbmk[ _HBMK_nCOMPR ] := _COMPR_OFF + hbmk[ _HBMK_lRUN ] := .F. + hbmk[ _HBMK_lINC ] := .F. + hbmk[ _HBMK_lREBUILDPO ] := .F. + hbmk[ _HBMK_lMINIPO ] := .F. + hbmk[ _HBMK_nCONF ] := _CONF_RELEASE + hbmk[ _HBMK_lIGNOREERROR ] := .F. + hbmk[ _HBMK_lIMPLIB ] := .F. + hbmk[ _HBMK_lHBCPPMM ] := .F. + hbmk[ _HBMK_aVAR ] := {} + hbmk[ _HBMK_hDEP ] := { => } + hbmk[ _HBMK_hAUTOHBC ] := { => } + hbmk[ _HBMK_hAUTOHBCFOUND ] := { => } + hbmk[ _HBMK_aDEPTHBC ] := {} + hbmk[ _HBMK_lDEPIMPLIB ] := .T. + + hb_HSetCaseMatch( hbmk[ _HBMK_hDEP ], .F. ) + + hbmk[ _HBMK_lBLDFLGP ] := .F. + hbmk[ _HBMK_lBLDFLGC ] := .F. + hbmk[ _HBMK_lBLDFLGL ] := .F. + + 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. + hbmk[ _HBMK_lDEBUGSTUB ] := .F. + hbmk[ _HBMK_lDEBUGI18N ] := .F. + hbmk[ _HBMK_lDEBUGDEPD ] := .F. + hbmk[ _HBMK_lDEBUGPARS ] := .F. + + hbmk[ _HBMK_nCmd_Esc ] := NIL + hbmk[ _HBMK_nScr_Esc ] := NIL + hbmk[ _HBMK_nCmd_FNF ] := NIL + + hbmk[ _HBMK_hDEPTSDIR ] := { => } + hbmk[ _HBMK_hDEPTMACRO ] := { => } + + hbmk[ _HBMK_lInstForce ] := .F. + hbmk[ _HBMK_lAutoHBM ] := .T. + hbmk[ _HBMK_lContainer ] := .F. + hbmk[ _HBMK_lShowLevel ] := .F. + + hbmk[ _HBMK_aLINK ] := {} + + hbmk[ _HBMK_cC ] := "" + hbmk[ _HBMK_cCPP ] := "" + + hbmk[ _HBMK_aINCPATH ] := {} + hbmk[ _HBMK_aLIBPATH ] := {} + + RETURN hbmk + +STATIC PROCEDURE hbmk_init_stage2( hbmk ) + + hbmk[ _HBMK_aPRG ] := {} + hbmk[ _HBMK_aC ] := {} + hbmk[ _HBMK_aCPP ] := {} + hbmk[ _HBMK_hDEPTS ] := { => } + hbmk[ _HBMK_aOPTPRG ] := {} + hbmk[ _HBMK_aOPTC ] := {} + hbmk[ _HBMK_aOPTCUSER ] := {} + hbmk[ _HBMK_aOPTCX ] := {} + hbmk[ _HBMK_aOPTCPPX ] := {} + hbmk[ _HBMK_aOPTRES ] := {} + hbmk[ _HBMK_aOPTL ] := {} + hbmk[ _HBMK_aOPTLPOST ] := {} + hbmk[ _HBMK_aOPTA ] := {} + hbmk[ _HBMK_aOPTD ] := {} + hbmk[ _HBMK_aOPTDPOST ] := {} + hbmk[ _HBMK_aOPTI ] := {} + hbmk[ _HBMK_aRESSRC ] := {} + hbmk[ _HBMK_aRESCMP ] := {} + hbmk[ _HBMK_aLIBUSER ] := {} + hbmk[ _HBMK_aLIBUSERFWK ] := {} + hbmk[ _HBMK_aLIBUSERGT ] := {} + hbmk[ _HBMK_aLIBUSERSYS ] := {} + hbmk[ _HBMK_aLIBUSERSYSPRE ] := {} + hbmk[ _HBMK_aLIBFILTEROUT ] := {} + hbmk[ _HBMK_aOBJUSER ] := {} + hbmk[ _HBMK_aGT ] := {} + hbmk[ _HBMK_aICON ] := {} + hbmk[ _HBMK_cMANIFEST ] := NIL + hbmk[ _HBMK_aIMPLIBSRC ] := {} + hbmk[ _HBMK_aDEF ] := {} + hbmk[ _HBMK_aINSTFILE ] := {} + hbmk[ _HBMK_aREQUEST ] := {} + hbmk[ _HBMK_cPROGDIR ] := NIL + hbmk[ _HBMK_cPROGNAME ] := NIL + hbmk[ _HBMK_cFIRST ] := NIL + hbmk[ _HBMK_aPO ] := {} + hbmk[ _HBMK_cHBL ] := NIL + hbmk[ _HBMK_cHBLDir ] := "" + hbmk[ _HBMK_cPO ] := NIL + hbmk[ _HBMK_aLNG ] := {} + hbmk[ _HBMK_aINSTPATH ] := {} + hbmk[ _HBMK_lWINUNI ] := .F. + hbmk[ _HBMK_cHBX ] := NIL + + RETURN + FUNCTION hbmk( aArgs, nArgTarget, /* @ */ lPause, nLevel ) - LOCAL hbmk[ _HBMK_MAX_ ] + LOCAL hbmk LOCAL aLIB_BASE_EXTERN LOCAL aLIB_BASE_DEBUG @@ -913,8 +1065,6 @@ FUNCTION hbmk( aArgs, nArgTarget, /* @ */ lPause, nLevel ) LOCAL aOBJLIST LOCAL cHarbourDyn - LOCAL lFound - LOCAL lSkipBuild := .F. LOCAL lStopAfterCComp := .F. LOCAL lAcceptCFlag := .F. @@ -958,100 +1108,7 @@ FUNCTION hbmk( aArgs, nArgTarget, /* @ */ lPause, nLevel ) s_cSecToken := StrZero( hb_rand32(), 10, 0 ) ENDIF - hbmk[ _HBMK_cBUILD ] := "" - - hbmk[ _HBMK_lStopAfterInit ] := .F. - hbmk[ _HBMK_lStopAfterHarbour ] := .F. - - hbmk[ _HBMK_nErrorLevel ] := _ERRLEV_OK - - hbmk[ _HBMK_cWorkDir ] := NIL - - hbmk[ _HBMK_lCreateLib ] := .F. - Set_lCreateDyn( hbmk, .F. ) - hbmk[ _HBMK_lCreateImpLib ] := .F. - hbmk[ _HBMK_lCreatePPO ] := .F. - hbmk[ _HBMK_lCreateHRB ] := .F. - - hbmk[ _HBMK_lDynVM ] := .F. - - hbmk[ _HBMK_lQuiet ] := .F. - hbmk[ _HBMK_lInfo ] := .F. - hbmk[ _HBMK_nMaxCol ] := MaxCol() - - hbmk[ _HBMK_cPLAT ] := "" - hbmk[ _HBMK_cCOMP ] := "" - - hbmk[ _HBMK_lCPP ] := NIL - hbmk[ _HBMK_lGUI ] := .F. - hbmk[ _HBMK_lMT ] := .F. - hbmk[ _HBMK_lPIC ] := .F. - hbmk[ _HBMK_lDEBUG ] := .F. - hbmk[ _HBMK_nHEAD ] := _HEAD_FULL - hbmk[ _HBMK_lREBUILD ] := .F. - hbmk[ _HBMK_lCLEAN ] := .F. - hbmk[ _HBMK_lTRACE ] := .F. - hbmk[ _HBMK_lDONTEXEC ] := .F. - hbmk[ _HBMK_nHBMODE ] := _HBMODE_NATIVE - hbmk[ _HBMK_lSHAREDDIST ] := NIL - hbmk[ _HBMK_lNULRDD ] := .F. - hbmk[ _HBMK_lMAP ] := .F. - hbmk[ _HBMK_lBEEP ] := .F. - hbmk[ _HBMK_lSTRIP ] := .F. - hbmk[ _HBMK_lOPTIM ] := .T. - hbmk[ _HBMK_nWARN ] := _WARN_YES - hbmk[ _HBMK_nCOMPR ] := _COMPR_OFF - hbmk[ _HBMK_lRUN ] := .F. - hbmk[ _HBMK_lINC ] := .F. - hbmk[ _HBMK_lREBUILDPO ] := .F. - hbmk[ _HBMK_lMINIPO ] := .F. - hbmk[ _HBMK_nCONF ] := _CONF_RELEASE - hbmk[ _HBMK_lIGNOREERROR ] := .F. - hbmk[ _HBMK_lIMPLIB ] := .F. - hbmk[ _HBMK_lHBCPPMM ] := .F. - hbmk[ _HBMK_aVAR ] := {} - hbmk[ _HBMK_hDEP ] := { => } - hbmk[ _HBMK_hAUTOHBC ] := { => } - hbmk[ _HBMK_hAUTOHBCFOUND ] := { => } - hbmk[ _HBMK_aDEPTHBC ] := {} - hbmk[ _HBMK_lDEPIMPLIB ] := .T. - - hb_HSetCaseMatch( hbmk[ _HBMK_hDEP ], .F. ) - - hbmk[ _HBMK_lBLDFLGP ] := .F. - hbmk[ _HBMK_lBLDFLGC ] := .F. - hbmk[ _HBMK_lBLDFLGL ] := .F. - - 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. - hbmk[ _HBMK_lDEBUGSTUB ] := .F. - hbmk[ _HBMK_lDEBUGI18N ] := .F. - hbmk[ _HBMK_lDEBUGDEPD ] := .F. - hbmk[ _HBMK_lDEBUGPARS ] := .F. - - hbmk[ _HBMK_nCmd_Esc ] := NIL - hbmk[ _HBMK_nScr_Esc ] := NIL - hbmk[ _HBMK_nCmd_FNF ] := NIL - - hbmk[ _HBMK_hDEPTSDIR ] := { => } - hbmk[ _HBMK_hDEPTMACRO ] := { => } - - hbmk[ _HBMK_lInstForce ] := .F. - hbmk[ _HBMK_lAutoHBM ] := .T. - hbmk[ _HBMK_lContainer ] := .F. - hbmk[ _HBMK_lShowLevel ] := .F. - - hbmk[ _HBMK_aLINK ] := {} - - hbmk[ _HBMK_cC ] := "" - hbmk[ _HBMK_cCPP ] := "" + hbmk := hbmk_new() hbmk[ _HBMK_aArgs ] := aArgs hbmk[ _HBMK_nArgTarget ] := nArgTarget @@ -1781,9 +1838,6 @@ FUNCTION hbmk( aArgs, nArgTarget, /* @ */ lPause, nLevel ) ENDIF ENDIF - hbmk[ _HBMK_aINCPATH ] := {} - hbmk[ _HBMK_aLIBPATH ] := {} - IF Empty( hbmk[ _HBMK_cCPU ] ) hbmk[ _HBMK_cCPU ] := hbmk_CPU( hbmk ) ENDIF @@ -2026,54 +2080,13 @@ FUNCTION hbmk( aArgs, nArgTarget, /* @ */ lPause, nLevel ) /* Process command line */ - hbmk[ _HBMK_aPRG ] := {} - hbmk[ _HBMK_aC ] := {} - hbmk[ _HBMK_aCPP ] := {} - hbmk[ _HBMK_hDEPTS ] := { => } - hbmk[ _HBMK_aOPTPRG ] := {} - hbmk[ _HBMK_aOPTC ] := {} - hbmk[ _HBMK_aOPTCUSER ] := {} - hbmk[ _HBMK_aOPTCX ] := {} - hbmk[ _HBMK_aOPTCPPX ] := {} - hbmk[ _HBMK_aOPTRES ] := {} - hbmk[ _HBMK_aOPTL ] := {} - hbmk[ _HBMK_aOPTLPOST ] := {} - hbmk[ _HBMK_aOPTA ] := {} - hbmk[ _HBMK_aOPTD ] := {} - hbmk[ _HBMK_aOPTDPOST ] := {} - hbmk[ _HBMK_aOPTI ] := {} + hbmk_init_stage2( hbmk ) + l_aOPTRUN := {} - hbmk[ _HBMK_aRESSRC ] := {} - hbmk[ _HBMK_aRESCMP ] := {} - hbmk[ _HBMK_aLIBUSER ] := {} - hbmk[ _HBMK_aLIBUSERFWK ] := {} - hbmk[ _HBMK_aLIBUSERGT ] := {} - hbmk[ _HBMK_aLIBUSERSYS ] := {} - hbmk[ _HBMK_aLIBUSERSYSPRE ] := {} - hbmk[ _HBMK_aLIBFILTEROUT ] := {} - hbmk[ _HBMK_aOBJUSER ] := {} - hbmk[ _HBMK_aGT ] := {} - hbmk[ _HBMK_aICON ] := {} - hbmk[ _HBMK_cMANIFEST ] := NIL - hbmk[ _HBMK_aIMPLIBSRC ] := {} - hbmk[ _HBMK_aDEF ] := {} - hbmk[ _HBMK_aINSTFILE ] := {} - hbmk[ _HBMK_aREQUEST ] := {} l_aOBJA := {} - hbmk[ _HBMK_cPROGDIR ] := NIL - hbmk[ _HBMK_cPROGNAME ] := NIL l_cLIBSELF := NIL l_cIMPLIBDIR := NIL l_cIMPLIBNAME := NIL - hbmk[ _HBMK_cFIRST ] := NIL - hbmk[ _HBMK_aPO ] := {} - hbmk[ _HBMK_cHBL ] := NIL - hbmk[ _HBMK_cHBLDir ] := "" - hbmk[ _HBMK_cPO ] := NIL - hbmk[ _HBMK_aLNG ] := {} - hbmk[ _HBMK_aINSTPATH ] := {} - hbmk[ _HBMK_lWINUNI ] := .F. - hbmk[ _HBMK_cHBX ] := NIL aParams := {} @@ -2150,7 +2163,7 @@ FUNCTION hbmk( aArgs, nArgTarget, /* @ */ lPause, nLevel ) NEXT /* Process automatic control files. */ - HBC_ProcessAll( hbmk ) + HBC_ProcessAuto( hbmk ) /* Process command line (2nd pass) */ FOR EACH aParam IN aParams @@ -3073,28 +3086,7 @@ FUNCTION hbmk( aArgs, nArgTarget, /* @ */ lPause, nLevel ) cParam := tmp1 := MacroProc( hbmk, cParam, aParam[ _PAR_cFileName ] ) cParam := PathMakeAbsolute( PathSepToSelf( cParam ), aParam[ _PAR_cFileName ] ) IF ! Empty( cParam ) - lFound := .F. - IF hb_FileExists( cParam ) - lFound := .T. - ELSE - FOR EACH tmp IN hbmk[ _HBMK_aLIBPATH ] - IF hb_FileExists( hb_DirSepAdd( PathSepToSelf( MacroProc( hbmk, tmp, cParam, _MACRO_LATE_PREFIX ) ) ) + hb_FNameNameExt( cParam ) ) - cParam := hb_DirSepAdd( PathSepToSelf( MacroProc( hbmk, tmp, cParam, _MACRO_LATE_PREFIX ) ) ) + hb_FNameNameExt( cParam ) - lFound := .T. - EXIT - ENDIF - NEXT - ENDIF - - IF lFound - cParam := hb_PathNormalize( cParam ) - - IF hbmk[ _HBMK_lInfo ] - _hbmk_OutStd( hbmk, hb_StrFormat( I_( "Processing: %1$s" ), cParam ) ) - ENDIF - - HBC_ProcessOne( hbmk, cParam, 1 ) - ELSE + IF ! HBC_Find( hbmk, cParam ) IF Empty( aParam[ _PAR_cFileName ] ) _hbmk_OutErr( hbmk, hb_StrFormat( I_( "Warning: Cannot find %1$s" ), tmp1 ) ) ELSE @@ -5279,34 +5271,13 @@ FUNCTION hbmk( aArgs, nArgTarget, /* @ */ lPause, nLevel ) FOR EACH cParam IN hbmk[ _HBMK_hAUTOHBCFOUND ] IF ! Empty( cParam ) - tmp1 := cParam - lFound := .F. - IF hb_FileExists( cParam ) - lFound := .T. + IF Left( cParam:__enumKey(), 1 ) == "." + _hbmk_OutStd( hbmk, hb_StrFormat( I_( "Triggered by #require directive: %1$s" ), cParam ) ) ELSE - FOR EACH tmp IN hbmk[ _HBMK_aLIBPATH ] - IF hb_FileExists( hb_DirSepAdd( PathSepToSelf( MacroProc( hbmk, tmp, cParam, _MACRO_LATE_PREFIX ) ) ) + hb_FNameNameExt( cParam ) ) - cParam := hb_DirSepAdd( PathSepToSelf( MacroProc( hbmk, tmp, cParam, _MACRO_LATE_PREFIX ) ) ) + hb_FNameNameExt( cParam ) - lFound := .T. - EXIT - ENDIF - NEXT + _hbmk_OutStd( hbmk, hb_StrFormat( I_( "Triggered by '%1$s' header: %2$s" ), cParam:__enumKey(), cParam ) ) ENDIF - - IF lFound - cParam := hb_PathNormalize( cParam ) - - IF hbmk[ _HBMK_lInfo ] - IF Left( cParam:__enumKey(), 1 ) == "." - _hbmk_OutStd( hbmk, hb_StrFormat( I_( "Processing (triggered by #require directive): %1$s" ), cParam ) ) - ELSE - _hbmk_OutStd( hbmk, hb_StrFormat( I_( "Processing (triggered by '%1$s' header): %2$s" ), cParam:__enumKey(), cParam ) ) - ENDIF - ENDIF - - HBC_ProcessOne( hbmk, cParam, 1 ) - ELSE - _hbmk_OutErr( hbmk, hb_StrFormat( I_( "Warning: Cannot find %1$s" ), tmp1 ) ) + IF ! HBC_Find( hbmk, cParam ) + _hbmk_OutErr( hbmk, hb_StrFormat( I_( "Warning: Cannot find %1$s" ), cParam ) ) ENDIF ENDIF NEXT @@ -9432,7 +9403,32 @@ STATIC FUNCTION FNameHasWildcard( cFileName ) RETURN "?" $ cFileName .OR. ; "*" $ cFileName -STATIC PROCEDURE HBC_ProcessAll( hbmk ) +STATIC FUNCTION HBC_Find( hbmk, cFile, nNesting ) + LOCAL cLibPath + LOCAL lFound + + hb_default( @nNesting, 1 ) + + lFound := .F. + IF hb_FileExists( cFile ) + lFound := .T. + ELSE + FOR EACH cLibPath IN hbmk[ _HBMK_aLIBPATH ] + IF hb_FileExists( hb_DirSepAdd( PathSepToSelf( MacroProc( hbmk, cLibPath, cFile, _MACRO_LATE_PREFIX ) ) ) + hb_FNameNameExt( cFile ) ) + cFile := hb_DirSepAdd( PathSepToSelf( MacroProc( hbmk, cLibPath, cFile, _MACRO_LATE_PREFIX ) ) ) + hb_FNameNameExt( cFile ) + lFound := .T. + EXIT + ENDIF + NEXT + ENDIF + + IF lFound + HBC_ProcessOne( hbmk, hb_PathNormalize( cFile ), nNesting ) + ENDIF + + RETURN lFound + +STATIC PROCEDURE HBC_ProcessAuto( hbmk ) LOCAL cDir LOCAL cFileName @@ -9469,6 +9465,10 @@ STATIC FUNCTION HBC_ProcessOne( hbmk, cFileName, nNestingLevel ) LOCAL lFound LOCAL tmp, tmp1 + IF hbmk[ _HBMK_lInfo ] + _hbmk_OutStd( hbmk, hb_StrFormat( I_( "Processing: %1$s" ), cFileName ) ) + ENDIF + IF ! hbmk_hb_FileExists( cFileName ) _hbmk_OutErr( hbmk, hb_StrFormat( I_( "Error: Opening: %1$s" ), cFileName ) ) RETURN .F. @@ -9566,28 +9566,7 @@ STATIC FUNCTION HBC_ProcessOne( hbmk, cFileName, nNestingLevel ) IF hb_FNameExt( cItem ) == ".hbc" cItem := PathMakeAbsolute( PathSepToSelf( cItem ), hb_FNameDir( cFileName ) ) IF nNestingLevel < _HBMK_NEST_MAX - lFound := .F. - IF hb_FileExists( cItem ) - lFound := .T. - ELSE - FOR EACH tmp IN hbmk[ _HBMK_aLIBPATH ] - IF hb_FileExists( hb_DirSepAdd( PathSepToSelf( MacroProc( hbmk, tmp, cItem, _MACRO_LATE_PREFIX ) ) ) + hb_FNameNameExt( cItem ) ) - cItem := hb_DirSepAdd( PathSepToSelf( MacroProc( hbmk, tmp, cItem, _MACRO_LATE_PREFIX ) ) ) + hb_FNameNameExt( cItem ) - lFound := .T. - EXIT - ENDIF - NEXT - ENDIF - - IF lFound - cItem := hb_PathNormalize( cItem ) - - IF hbmk[ _HBMK_lInfo ] - _hbmk_OutStd( hbmk, hb_StrFormat( I_( "Processing: %1$s" ), cItem ) ) - ENDIF - - HBC_ProcessOne( hbmk, cItem, nNestingLevel + 1 ) - ELSE + IF ! HBC_Find( hbmk, cItem, nNestingLevel + 1 ) _hbmk_OutErr( hbmk, hb_StrFormat( I_( "Warning: Cannot find %1$s (referenced from %2$s)" ), tmp1, cFileName ) ) ENDIF ELSE @@ -9640,28 +9619,7 @@ STATIC FUNCTION HBC_ProcessOne( hbmk, cFileName, nNestingLevel ) cItem := hb_FNameExtSet( cItem, ".hbc" ) ENDIF - lFound := .F. - IF hb_FileExists( cItem ) - lFound := .T. - ELSE - FOR EACH tmp IN hbmk[ _HBMK_aLIBPATH ] - IF hb_FileExists( hb_DirSepAdd( PathSepToSelf( MacroProc( hbmk, tmp, cItem, _MACRO_LATE_PREFIX ) ) ) + hb_FNameNameExt( cItem ) ) - cItem := hb_DirSepAdd( PathSepToSelf( MacroProc( hbmk, tmp, cItem, _MACRO_LATE_PREFIX ) ) ) + hb_FNameNameExt( cItem ) - lFound := .T. - EXIT - ENDIF - NEXT - ENDIF - - IF lFound - cItem := hb_PathNormalize( cItem ) - - IF hbmk[ _HBMK_lInfo ] - _hbmk_OutStd( hbmk, hb_StrFormat( I_( "Processing: %1$s" ), cItem ) ) - ENDIF - - HBC_ProcessOne( hbmk, cItem, nNestingLevel + 1 ) - ELSE + IF ! HBC_Find( hbmk, cItem, nNestingLevel + 1 ) _hbmk_OutErr( hbmk, hb_StrFormat( I_( "Warning: Cannot find %1$s (referenced from %2$s)" ), tmp1, cFileName ) ) ENDIF ELSE @@ -12103,11 +12061,16 @@ STATIC FUNCTION hbmk_CoreHeaderFilesMinimal() STATIC PROCEDURE __hbrun_minimal( cFile, ... ) LOCAL aDynamic := {} + LOCAL hbmk + LOCAL cHBC + LOCAL tmp + LOCAL aINCPATH IF ! Empty( cFile := FindInPath( cFile ) ) + SWITCH Lower( hb_FNameExt( cFile ) ) CASE ".hb" - __hbrun_LoadExtDynamicFromSource( aDynamic, cFile ) + /* NOTE: Assumptions: - one dynamic libs belongs to one .hbc file - dynamic libs will reference and automatically load all their dependencies @@ -12116,13 +12079,42 @@ STATIC PROCEDURE __hbrun_minimal( cFile, ... ) - 3rd party addons can be loaded, too if they are installed into the Harbour dir tree - dynamic libs are installed into bin dir. - (this list is to be finalized) */ - /* TODO: Find .hbc file. Load .hbc file. Process .hbc references. + + __hbrun_LoadExtDynamicFromSource( aDynamic, cFile ) + + aINCPATH := { "-I" + hb_FNameDir( cFile ) } + + /* NOTE: Find .hbc file. Load .hbc file. Process .hbc references. Pick include paths. Load libs. Add include paths to include path list. For this hbrun needs to know where Harbour tree - is located. Once matured, copy the loading method to hbrun. */ - __hbrun_extensions_dynamic_init( aDynamic ) + is located. Once matured, copy this loading method to hbrun, + OR migrate hbrun functionality into hbmk2, with contribs + loaded solely dynamically. */ + + /* NOTE: - most filters and macros in .hbc files won't work in + this mode */ + + IF ! Empty( aDynamic ) + + hbmk := hbmk_new() + hbmk_init_stage2( hbmk ) + __hbrun_detect_setup( hbmk ) + + FOR EACH tmp IN aDynamic + IF ! HBC_Find( hbmk, cHBC := hb_FNameExtSet( tmp, ".hbc" ) ) + OutErr( hb_StrFormat( I_( "Warning: Cannot find %1$s" ), cHBC ) + hb_eol() ) + ENDIF + NEXT + + FOR EACH tmp IN hbmk[ _HBMK_aINCPATH ] + AAdd( aINCPATH, "-I" + tmp ) + NEXT + + __hbrun_extensions_dynamic_init( aDynamic ) + ENDIF + cFile := hb_compileBuf( hbmk_CoreHeaderFilesMinimal(), hb_ProgName(), "-n2", "-w", "-es2", "-q0", ; - "-I" + hb_FNameDir( cFile ), "-D" + "__HBSCRIPT__HBRUN", cFile ) + hb_ArrayToParams( aINCPATH ), "-D" + "__HBSCRIPT__HBRUN", cFile ) IF cFile == NIL ErrorLevel( 1 ) EXIT @@ -12195,6 +12187,155 @@ STATIC PROCEDURE __hbrun_extensions_dynamic_load( cName ) RETURN +/* It's a reduced copy of similar logic in hbmk() function + TODO: merge these into one */ +STATIC PROCEDURE __hbrun_detect_setup( hbmk ) + + LOCAL l_cHB_INSTALL_PREFIX + + LOCAL l_cHB_INSTALL_BIN := "" + LOCAL l_cHB_INSTALL_LIB := "" + LOCAL l_cHB_INSTALL_LI3 := "" + LOCAL l_cHB_INSTALL_DYN := "" + LOCAL l_cHB_INSTALL_INC := "" + LOCAL l_cHB_INSTALL_ADD + + LOCAL tmp + + /* Autodetect Harbour environment */ + + l_cHB_INSTALL_PREFIX := hb_DirSepAdd( hb_DirBase() ) + ".." + + IF hb_FileExists( hb_DirSepAdd( l_cHB_INSTALL_PREFIX ) + "include" +; + hb_ps() + "hbvm.h" ) + /* do nothing */ + /* Detect special non-installed dir layout (after simple 'make') */ + ELSEIF hb_FileExists( hb_DirSepAdd( l_cHB_INSTALL_PREFIX ) + ".." + hb_ps() + ".." + hb_ps() + "include" +; + hb_ps() + "hbvm.h" ) + l_cHB_INSTALL_PREFIX := hb_DirSepAdd( l_cHB_INSTALL_PREFIX ) + ".." + hb_ps() + ".." + hb_ps() + /* Detect special multi-host dir layout */ + ELSEIF hb_FileExists( hb_DirSepAdd( l_cHB_INSTALL_PREFIX ) + ".." + hb_ps() + "include" +; + hb_ps() + "hbvm.h" ) + l_cHB_INSTALL_PREFIX := hb_DirSepAdd( l_cHB_INSTALL_PREFIX ) + ".." + hb_ps() + /* Detect non-installed dir layout with build name containing sub-dirs */ + ELSEIF PathSepCount( hbmk[ _HBMK_cBUILD ] ) > 0 .AND. ; + hb_FileExists( hb_DirSepAdd( l_cHB_INSTALL_PREFIX ) + Replicate( ".." + hb_ps(), PathSepCount( hbmk[ _HBMK_cBUILD ] ) ) + ".." + hb_ps() + ".." + hb_ps() + "include" +; + hb_ps() + "hbvm.h" ) + l_cHB_INSTALL_PREFIX := hb_DirSepAdd( l_cHB_INSTALL_PREFIX ) + Replicate( ".." + hb_ps(), PathSepCount( hbmk[ _HBMK_cBUILD ] ) ) + ".." + hb_ps() + ".." + hb_ps() + /* Detect special *nix dir layout (/bin, /lib/harbour, /lib64/harbour, /include/harbour) */ + ELSEIF hb_FileExists( hb_DirSepAdd( l_cHB_INSTALL_PREFIX ) + "include" +; + hb_ps() + iif( _HBMODE_IS_XHB( hbmk[ _HBMK_nHBMODE ] ), "xharbour", "harbour" ) +; + hb_ps() + "hbvm.h" ) + IF Empty( l_cHB_INSTALL_BIN ) + l_cHB_INSTALL_BIN := hb_PathNormalize( hb_DirSepAdd( l_cHB_INSTALL_PREFIX ) + "bin" ) + ENDIF + IF Empty( l_cHB_INSTALL_LIB ) + IF hb_DirExists( tmp := hb_PathNormalize( hb_DirSepAdd( l_cHB_INSTALL_PREFIX ) + "lib64" + hb_ps() + iif( _HBMODE_IS_XHB( hbmk[ _HBMK_nHBMODE ] ), "xharbour", "harbour" ) ) ) + l_cHB_INSTALL_LIB := tmp + ELSE + l_cHB_INSTALL_LIB := hb_PathNormalize( hb_DirSepAdd( l_cHB_INSTALL_PREFIX ) + "lib" + hb_ps() + iif( _HBMODE_IS_XHB( hbmk[ _HBMK_nHBMODE ] ), "xharbour", "harbour" ) ) + ENDIF + ENDIF + IF Empty( l_cHB_INSTALL_INC ) + l_cHB_INSTALL_INC := hb_PathNormalize( hb_DirSepAdd( l_cHB_INSTALL_PREFIX ) + "include" + hb_ps() + iif( _HBMODE_IS_XHB( hbmk[ _HBMK_nHBMODE ] ), "xharbour", "harbour" ) ) + ENDIF + ELSEIF ! hb_FileExists( hb_DirSepAdd( l_cHB_INSTALL_PREFIX ) + hb_ps() + "include" +; + hb_ps() + "hbvm.h" ) + _hbmk_OutErr( hbmk, I_( "Error: Failed to autodetect Harbour installation.\nRun this tool from its original location inside the Harbour installation." ) ) + RETURN + ENDIF + + /* Finish detecting bin/lib/include dirs */ + + IF Empty( l_cHB_INSTALL_BIN ) + /* Autodetect multi-compiler/platform bin structure (also .dlls are in bin dir on non-*nix platforms) */ + IF hb_DirExists( tmp := hb_PathNormalize( hb_DirSepAdd( l_cHB_INSTALL_PREFIX ) ) + "bin" +; + hb_ps() + hbmk[ _HBMK_cPLAT ] +; + hb_ps() + hbmk[ _HBMK_cCOMP ] +; + PathSepToSelf( hbmk[ _HBMK_cBUILD ] ) ) + l_cHB_INSTALL_BIN := tmp + ELSE + l_cHB_INSTALL_BIN := hb_PathNormalize( hb_DirSepAdd( l_cHB_INSTALL_PREFIX ) + "bin" ) + ENDIF + ENDIF + IF Empty( l_cHB_INSTALL_LIB ) + /* Autodetect multi-compiler/platform lib structure */ + IF hb_DirExists( tmp := hb_PathNormalize( hb_DirSepAdd( l_cHB_INSTALL_PREFIX ) ) + "lib" +; + hb_ps() + hbmk[ _HBMK_cPLAT ] +; + hb_ps() + hbmk[ _HBMK_cCOMP ] +; + PathSepToSelf( hbmk[ _HBMK_cBUILD ] ) ) + l_cHB_INSTALL_LIB := tmp + ELSE + l_cHB_INSTALL_LIB := hb_PathNormalize( hb_DirSepAdd( l_cHB_INSTALL_PREFIX ) + "lib" ) + ENDIF + ENDIF + IF Empty( l_cHB_INSTALL_INC ) + l_cHB_INSTALL_INC := hb_PathNormalize( hb_DirSepAdd( l_cHB_INSTALL_PREFIX ) + "include" ) + ENDIF + + IF l_cHB_INSTALL_DYN == NIL + IF HBMK_ISPLAT( "win|wce|os2|dos|cygwin" ) + l_cHB_INSTALL_DYN := l_cHB_INSTALL_BIN + ELSE + l_cHB_INSTALL_DYN := l_cHB_INSTALL_LIB + ENDIF + ENDIF + + /* Make a copy to hbmk structure so that we can use it in deeper + functions. The only reason I kept the local version is to + keep above code parts easier to read. [vszakats] */ + hbmk[ _HBMK_cHB_INSTALL_BIN ] := hb_DirSepDel( PathSepToSelf( l_cHB_INSTALL_BIN ) ) + hbmk[ _HBMK_cHB_INSTALL_LIB ] := l_cHB_INSTALL_LIB := hb_DirSepDel( PathSepToSelf( l_cHB_INSTALL_LIB ) ) + hbmk[ _HBMK_cHB_INSTALL_LI3 ] := l_cHB_INSTALL_LI3 := hb_DirSepDel( PathSepToSelf( l_cHB_INSTALL_LI3 ) ) + hbmk[ _HBMK_cHB_INSTALL_DYN ] := l_cHB_INSTALL_DYN := hb_DirSepDel( PathSepToSelf( l_cHB_INSTALL_DYN ) ) + hbmk[ _HBMK_cHB_INSTALL_INC ] := l_cHB_INSTALL_INC := hb_DirSepDel( PathSepToSelf( l_cHB_INSTALL_INC ) ) + + /* Add main Harbour library dir to lib path list */ + AAddNotEmpty( hbmk[ _HBMK_aLIBPATH ], l_cHB_INSTALL_LIB ) + /* Locally hosted 3rd party binary libraries */ + AAddNotEmpty( hbmk[ _HBMK_aLIBPATH ], l_cHB_INSTALL_LI3 ) + IF ! Empty( l_cHB_INSTALL_DYN ) .AND. !( l_cHB_INSTALL_DYN == l_cHB_INSTALL_LIB ) + AAddNotEmpty( hbmk[ _HBMK_aLIBPATH ], l_cHB_INSTALL_DYN ) + ENDIF + + /* Add main Harbour header dir to header path list */ + AAddNotEmpty( hbmk[ _HBMK_aINCPATH ], l_cHB_INSTALL_INC ) + + /* Add custom search paths for .hbc files */ + IF ! Empty( l_cHB_INSTALL_ADD := GetEnv( "HB_INSTALL_ADDONS" ) ) + #if defined( __PLATFORM__WINDOWS ) .OR. ; + defined( __PLATFORM__DOS ) .OR. ; + defined( __PLATFORM__OS2 ) + FOR EACH tmp IN hb_ATokens( l_cHB_INSTALL_ADD, hb_osPathListSeparator(), .T., .T. ) + #else + FOR EACH tmp IN hb_ATokens( l_cHB_INSTALL_ADD, hb_osPathListSeparator() ) + #endif + IF ! Empty( tmp ) + AAdd( hbmk[ _HBMK_aLIBPATH ], hb_PathNormalize( hb_DirSepAdd( PathSepToSelf( tmp ) ) ) + "%{hb_name}" ) + ENDIF + NEXT + ENDIF + /* Add default search paths for .hbc files */ + l_cHB_INSTALL_ADD := hb_PathNormalize( hb_DirSepAdd( l_cHB_INSTALL_PREFIX ) ) + AAdd( hbmk[ _HBMK_aLIBPATH ], l_cHB_INSTALL_ADD + "contrib" + hb_ps() + "%{hb_name}" ) + AAdd( hbmk[ _HBMK_aLIBPATH ], l_cHB_INSTALL_ADD + "addons" + hb_ps() + "%{hb_name}" ) +#if defined( __PLATFORM__UNIX ) + IF hb_DirExists( "/opt/harbour" ) + AAdd( hbmk[ _HBMK_aLIBPATH ], "/opt/harbour/contrib/%{hb_name}" ) + AAdd( hbmk[ _HBMK_aLIBPATH ], "/opt/harbour/addons/%{hb_name}" ) + ENDIF + IF hb_DirExists( "/usr/local/share/harbour" ) + AAdd( hbmk[ _HBMK_aLIBPATH ], "/usr/local/share/harbour/contrib/%{hb_name}" ) + AAdd( hbmk[ _HBMK_aLIBPATH ], "/usr/local/share/harbour/addons/%{hb_name}" ) + ENDIF + IF hb_DirExists( "/usr/share/harbour" ) + AAdd( hbmk[ _HBMK_aLIBPATH ], "/usr/share/harbour/contrib/%{hb_name}" ) + AAdd( hbmk[ _HBMK_aLIBPATH ], "/usr/share/harbour/addons/%{hb_name}" ) + ENDIF +#endif + + RETURN + /* ------------------------------------------------------------- */ /* Public hbrun API */