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).
This commit is contained in:
Viktor Szakats
2012-06-12 02:30:41 +00:00
parent 8bc5cbe4bf
commit 169631527c
13 changed files with 464 additions and 334 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -6,3 +6,5 @@
-nulrdd
hbi18n.prg
{!(HB_BUILD_DYN='no')&(win|wce|os2)}-shared

View File

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

View File

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

View File

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