diff --git a/harbour/ChangeLog b/harbour/ChangeLog
index 799d6780ed..9d1bdc50e0 100644
--- a/harbour/ChangeLog
+++ b/harbour/ChangeLog
@@ -16,6 +16,46 @@
The license applies to all entries newer than 2009-04-28.
*/
+2010-07-30 14:04 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)
+ * utils/hbmk2/hbmk2.prg
+ ! Fixed ${hb_workdynsub} macro not returning correct value.
+ ! Fixed to install implibs when -instforce is used and targets are
+ up to date.
+ + Added -implib=
option to control placement of implibs generated
+ in -hbdyn and -hbexe modes. (by default it's the output dir for
+ main target)
+ + Added autodetection of hbmaindllp lib and this case generate little
+ stub posted by Przemek on the list earlier this year, and in this
+ case also enabling linkage of shared Harbour lib in -shared mode.
+ NOTE: Pls check this, this solution is Windows centric, but until
+ I know this is the correct track I didn't want to extend it.
+ Przemek can you take a look at it?
+ * Changed the install group name to "depimplib" for implibs generated
+ for dependencies, and use "implib" group for implibs generated for
+ our own targets. This is needed to be able to control them
+ separately, since we don't necessarily want to install "depimplib"
+ while we always want to install "implib"s.
+
+ * contrib/make.hbs
+ * contrib/hbpost.hbm
+ * Updated list of TODOs
+ * HB_BUILD_CONTRIB_DLL changed to HB_BUILD_CONTRIB_DYN
+ + HB_BUILD_CONTRIB_DYN now works also in stdalone mode.
+ % Moved HB_BUILD_CONTRIB_DYN related options to hbpost.hbm
+ + Added -shared and -lmaindllp options to dynamic lib build mode.
+ * Changed dependency implib install target to have 'depimplib'
+ prefix to differenciate from -hbdyn implib install target.
+ + Added -implib= option to tell hbmk2 to create implibs
+ in lib dir in -hbdyn mode.
+ + Added install target for implibs generated in -hbdyn mode.
+ ; All this means that now by setting HB_BUILD_CONTRIB_DYN=yes,
+ a dynamic version will be build of the libs, import lib
+ placed in lib dir, dynamic lib placed into dynamic lib dir
+ (bin on non-*nix platforms, lib on *nix platforms).
+ IOW, now HB_BUILD_CONTRIB_DYN=yes should work, at least on
+ win and wce. I didn't make functional tests though.
+ Please review/test it.
+
2010-07-30 13:38 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/src/rdd/workarea.c
* harbour/src/rdd/wacore.c
diff --git a/harbour/contrib/hbpost.hbm b/harbour/contrib/hbpost.hbm
index 7023a43cc1..027ca6fb82 100644
--- a/harbour/contrib/hbpost.hbm
+++ b/harbour/contrib/hbpost.hbm
@@ -36,6 +36,12 @@
{(hbdyn|hbexe)&HB_BUILD_SHARED='yes'}-shared
+# Experimental
+{_HB_BUILD_LIBDYN}-hbdyn
+{_HB_BUILD_LIBDYN}-shared
+{_HB_BUILD_LIBDYN}-implib=../lib/${hb_plat}/${hb_comp}${hb_build}/
+{_HB_BUILD_LIBDYN&allwin}-lhbmaindllp
+
{hblib}-o../lib/${hb_plat}/${hb_comp}${hb_build}/
{hbexe|hbdyn}-o../bin/${hb_plat}/${hb_comp}${hb_build}/
@@ -46,7 +52,8 @@
{_HB_BUILD_INSTALL&_HB_INSTALL_BIN&hbexe}-instpath=${_HB_INSTALL_BIN}/
{_HB_BUILD_INSTALL&_HB_INSTALL_DYN&hbdyn}-instpath=${_HB_INSTALL_DYN}/
{_HB_BUILD_INSTALL&_HB_INSTALL_INC&hblib}-instpath=inc:${_HB_INSTALL_INC}/
+{_HB_BUILD_INSTALL&_HB_INSTALL_LIB}-instpath=implib:${_HB_INSTALL_LIB}/
{_HB_BUILD_INSTALL&_HB_INSTALL_ETC}-instpath=etc:${_HB_INSTALL_ETC}/
{_HB_BUILD_INSTALL&_HB_INSTALL_MAN}-instpath=man:${_HB_INSTALL_MAN}/
-{_HB_BUILD_INSTALL&_HB_INSTALL_LIB&HB_INSTALL_IMPLIB='yes'}-instpath=implib:${_HB_INSTALL_LIB}/
+{_HB_BUILD_INSTALL&_HB_INSTALL_LIB&HB_INSTALL_IMPLIB='yes'}-instpath=depimplib:${_HB_INSTALL_LIB}/
{_HB_BUILD_INSTALL}-instforce
diff --git a/harbour/contrib/make.hbs b/harbour/contrib/make.hbs
index 86c510cddf..4b4f0cc6b7 100755
--- a/harbour/contrib/make.hbs
+++ b/harbour/contrib/make.hbs
@@ -29,19 +29,18 @@
/* TODO:
1. normalize path to hbpre/hbpost to save on cmdline
- 2. solve HB_BUILD_CONTRIB_DLL support the .dlls are either
- huge, or they don't link.
+ (after normalizer function has been moved to core)
+ 2. finalize HB_BUILD_CONTRIB_DYN support.
3. Move in external libs to contrib area? (bz2, minizip, sqlite3)
(the only downside is that irrelevant hits will be spilling
- 'grep -R' results)
- 4. 'install' is ignored in stdalone mode. It would be needed to
- replicate the install dir defaulting logic found in global.mk
- to implement it.
- 5. Delete header install related logic from GNU Make system,
- also delete doc/*.txt install related logic (easily replacable
- with postinst.hbs logic)
- 6. Honor paths found in --hbinfo hbctree{{}} section.
- 7. Move lib output dir and workdirs inside contrib dirs.
+ into 'grep -R' results)
+ 4. Honor paths found in --hbinfo hbctree{{}} section.
+ 5. Move lib output dir and workdirs inside contrib dirs.
+
+ NOTE:
+ - 'install' is ignored in stdalone mode. It would be needed to
+ replicate the install dir defaulting logic found in global.mk
+ to implement it.
*/
#pragma warninglevel=3
@@ -114,6 +113,7 @@ PROCEDURE Standalone( aParams, hPackageList )
LOCAL cPWD
LOCAL cPackage
LOCAL cMyPackage
+ LOCAL cProject
LOCAL cOptions
LOCAL cOptionsUser
@@ -205,8 +205,19 @@ PROCEDURE Standalone( aParams, hPackageList )
/* Build the dependencies and ourselves in in sorted order */
FOR EACH cPackage IN aSortedList DESCEND
- call_hbmk2( s_cBase + iif( cPackage == cMyPackage, "", s_cHome + cPackage + "/" ) + hPackageList[ cPackage ][ "cFileName" ],;
+
+ cProject := s_cBase + iif( cPackage == cMyPackage, "", s_cHome + cPackage + "/" ) + hPackageList[ cPackage ][ "cFileName" ]
+
+ call_hbmk2( cProject,;
iif( cPackage == cMyPackage, cOptions + cOptionsUser, " -inc" ), "" )
+
+ /* Highly experimental */
+ IF hPackageList[ cPackage ][ "cType" ] == "hblib" .AND. ;
+ GetEnv( "HB_BUILD_CONTRIB_DYN" ) == "yes" .AND. ;
+ hb_FileExists( PathSepToSelf( FNameExtSet( cProject, ".hbc" ) ) )
+
+ call_hbmk2( cProject, cOptions, " " + FNameExtSet( cProject, ".hbc" ) )
+ ENDIF
NEXT
ENDIF
@@ -383,10 +394,10 @@ PROCEDURE GNUMake( aParams, hPackageList )
/* Highly experimental */
IF hPackageList[ cPackage ][ "cType" ] == "hblib" .AND. ;
- GetEnv( "HB_BUILD_CONTRIB_DLL" ) == "yes" .AND. ;
+ GetEnv( "HB_BUILD_CONTRIB_DYN" ) == "yes" .AND. ;
hb_FileExists( PathSepToSelf( FNameExtSet( cProject, ".hbc" ) ) )
- call_hbmk2( cProject, cOptions, " -hbdyn -nohblib- -implib " + FNameExtSet( cProject, ".hbc" ) )
+ call_hbmk2( cProject, cOptions, " " + FNameExtSet( cProject, ".hbc" ) )
ENDIF
/* Compile documentation */
@@ -466,18 +477,20 @@ STATIC FUNCTION hbmk2_hbinfo_getitem( cString, cItem, lAll )
RETURN cRetVal
-STATIC FUNCTION call_hbmk2( cProject, cOptionsPre, cOptionsPost )
+STATIC FUNCTION call_hbmk2( cProject, cOptionsPre, cOptionsLibDyn )
LOCAL nErrorLevel
clear_hbmk2_envvars()
+ hb_setenv( "_HB_BUILD_LIBDYN", iif( Empty( cOptionsLibDyn ), NIL, "yes" ) )
+
nErrorLevel := mk_hb_processRun( s_cBinDir + "hbmk2" +;
" -quiet -lang=en -width=0" +;
" @" + StrTran( s_cHome + "hbpre", "\", "/" ) +;
cOptionsPre +;
" " + StrTran( cProject, "\", "/" ) +;
" @" + StrTran( s_cHome, "\", "/" ) + "hbpost" +;
- cOptionsPost )
+ cOptionsLibDyn )
IF nErrorLevel != 0
OutStd( hb_StrFormat( "! '%1$s' returned status: %2$s", cProject, hb_ntos( nErrorLevel ) ) + hb_eol() )
diff --git a/harbour/utils/hbmk2/hbmk2.prg b/harbour/utils/hbmk2/hbmk2.prg
index b714649073..f48a89503d 100644
--- a/harbour/utils/hbmk2/hbmk2.prg
+++ b/harbour/utils/hbmk2/hbmk2.prg
@@ -699,7 +699,9 @@ FUNCTION hbmk2( aArgs, nArgTarget, /* @ */ lPause, nLevel )
LOCAL l_aLIBSYSMISC := {}
LOCAL l_aLIBSTATICPOST := {}
LOCAL l_aOPTRUN
+ LOCAL l_cIMPLIBDIR
LOCAL l_cIMPLIBNAME
+ LOCAL l_lIMPLIBToProcess := .F.
LOCAL l_aOBJ
LOCAL l_aOBJA
LOCAL l_aCLEAN
@@ -822,6 +824,8 @@ FUNCTION hbmk2( aArgs, nArgTarget, /* @ */ lPause, nLevel )
LOCAL lDoSupportDetection
LOCAL lDeleteWorkDir := .F.
+ LOCAL lHBMAINDLLP
+
IF s_cSecToken == NIL
s_cSecToken := StrZero( hb_Random( 1, 4294967294 ), 10, 0 )
ENDIF
@@ -834,7 +838,7 @@ FUNCTION hbmk2( aArgs, nArgTarget, /* @ */ lPause, nLevel )
hbmk[ _HBMK_cWorkDir ] := NIL
hbmk[ _HBMK_lCreateLib ] := .F.
- hbmk[ _HBMK_lCreateDyn ] := .F.
+ Set_lCreateDyn( hbmk, .F. )
hbmk[ _HBMK_lCreateImpLib ] := .F.
hbmk[ _HBMK_lCreatePPO ] := .F.
hbmk[ _HBMK_lCreateHRB ] := .F.
@@ -984,9 +988,9 @@ FUNCTION hbmk2( aArgs, nArgTarget, /* @ */ lPause, nLevel )
ENDIF
CASE cParamL == "-hbrun" ; lSkipBuild := .T. ; hbmk[ _HBMK_lRUN ] := .T.
- CASE cParamL == "-hbraw" ; hbmk[ _HBMK_lInfo ] := .F. ; hbmk[ _HBMK_lStopAfterHarbour ] := .T. ; lStopAfterCComp := .T. ; hbmk[ _HBMK_lCreateLib ] := .F. ; hbmk[ _HBMK_lCreateDyn ] := .F. ; lAcceptCFlag := .F. ; lAcceptLDFlag := .F.
+ CASE cParamL == "-hbraw" ; hbmk[ _HBMK_lInfo ] := .F. ; hbmk[ _HBMK_lStopAfterHarbour ] := .T. ; lStopAfterCComp := .T. ; hbmk[ _HBMK_lCreateLib ] := .F. ; Set_lCreateDyn( hbmk, .F. ) ; lAcceptCFlag := .F. ; lAcceptLDFlag := .F.
CASE cParamL == "-hbcmp" .OR. ;
- cParamL == "-clipper" ; hbmk[ _HBMK_lInfo ] := .F. ; hbmk[ _HBMK_lStopAfterHarbour ] := .F. ; lStopAfterCComp := .T. ; hbmk[ _HBMK_lCreateLib ] := .F. ; hbmk[ _HBMK_lCreateDyn ] := .F. ; lAcceptCFlag := .F. ; lAcceptLDFlag := .F.
+ cParamL == "-clipper" ; hbmk[ _HBMK_lInfo ] := .F. ; hbmk[ _HBMK_lStopAfterHarbour ] := .F. ; lStopAfterCComp := .T. ; hbmk[ _HBMK_lCreateLib ] := .F. ; Set_lCreateDyn( hbmk, .F. ) ; lAcceptCFlag := .F. ; lAcceptLDFlag := .F.
CASE cParamL == "-hbcc" ; hbmk[ _HBMK_lInfo ] := .F. ; hbmk[ _HBMK_lStopAfterHarbour ] := .F. ; lStopAfterCComp := .F. ; lAcceptCFlag := .T.
CASE cParamL == "-hblnk" ; hbmk[ _HBMK_lInfo ] := .F. ; hbmk[ _HBMK_lStopAfterHarbour ] := .F. ; lStopAfterCComp := .F. ; lAcceptLDFlag := .T.
CASE cParamL == "-rtlink" .OR. ;
@@ -1764,6 +1768,7 @@ FUNCTION hbmk2( aArgs, nArgTarget, /* @ */ lPause, nLevel )
l_aOBJA := {}
hbmk[ _HBMK_cPROGDIR ] := NIL
hbmk[ _HBMK_cPROGNAME ] := NIL
+ l_cIMPLIBDIR := NIL
l_cIMPLIBNAME := NIL
hbmk[ _HBMK_cFIRST ] := NIL
hbmk[ _HBMK_aPO ] := {}
@@ -1873,10 +1878,10 @@ FUNCTION hbmk2( aArgs, nArgTarget, /* @ */ lPause, nLevel )
CASE cParamL == "-quiet-" ; hbmk[ _HBMK_lQuiet ] := .F.
CASE cParamL == "-info" ; hbmk[ _HBMK_lInfo ] := .T.
CASE cParamL == "-pause" ; lPause := .T.
- CASE cParamL == "-hbexe" ; hbmk[ _HBMK_lStopAfterHarbour ] := .F. ; lStopAfterCComp := .F. ; hbmk[ _HBMK_lCreateLib ] := .F. ; hbmk[ _HBMK_lCreateDyn ] := .F.
- CASE cParamL == "-hblib" ; hbmk[ _HBMK_lStopAfterHarbour ] := .F. ; lStopAfterCComp := .T. ; hbmk[ _HBMK_lCreateLib ] := .T. ; hbmk[ _HBMK_lCreateDyn ] := .F.
- CASE cParamL == "-hbdyn" ; hbmk[ _HBMK_lStopAfterHarbour ] := .F. ; lStopAfterCComp := .T. ; hbmk[ _HBMK_lCreateLib ] := .F. ; hbmk[ _HBMK_lCreateDyn ] := .T. ; hbmk[ _HBMK_lDynVM ] := .F. ; l_lNOHBLIB := .T.
- CASE cParamL == "-hbdynvm" ; hbmk[ _HBMK_lStopAfterHarbour ] := .F. ; lStopAfterCComp := .T. ; hbmk[ _HBMK_lCreateLib ] := .F. ; hbmk[ _HBMK_lCreateDyn ] := .T. ; hbmk[ _HBMK_lDynVM ] := .T. ; l_lNOHBLIB := .F.
+ CASE cParamL == "-hbexe" ; hbmk[ _HBMK_lStopAfterHarbour ] := .F. ; lStopAfterCComp := .F. ; hbmk[ _HBMK_lCreateLib ] := .F. ; Set_lCreateDyn( hbmk, .F. )
+ CASE cParamL == "-hblib" ; hbmk[ _HBMK_lStopAfterHarbour ] := .F. ; lStopAfterCComp := .T. ; hbmk[ _HBMK_lCreateLib ] := .T. ; Set_lCreateDyn( hbmk, .F. )
+ CASE cParamL == "-hbdyn" ; hbmk[ _HBMK_lStopAfterHarbour ] := .F. ; lStopAfterCComp := .T. ; hbmk[ _HBMK_lCreateLib ] := .F. ; Set_lCreateDyn( hbmk, .T. ) ; hbmk[ _HBMK_lDynVM ] := .F. ; l_lNOHBLIB := .T.
+ CASE cParamL == "-hbdynvm" ; hbmk[ _HBMK_lStopAfterHarbour ] := .F. ; lStopAfterCComp := .T. ; hbmk[ _HBMK_lCreateLib ] := .F. ; Set_lCreateDyn( hbmk, .T. ) ; hbmk[ _HBMK_lDynVM ] := .T. ; l_lNOHBLIB := .F.
CASE cParamL == "-hbimplib" ; hbmk[ _HBMK_lCreateImpLib ] := .T. ; lAcceptIFlag := .T.
CASE cParamL == "-gui" .OR. ;
cParamL == "-mwindows" ; hbmk[ _HBMK_lGUI ] := .T. /* Compatibility */
@@ -2133,6 +2138,31 @@ FUNCTION hbmk2( aArgs, nArgTarget, /* @ */ lPause, nLevel )
ENDIF
ENDIF
+ CASE Left( cParamL, Len( "-implib=" ) ) == "-implib="
+
+ hbmk[ _HBMK_lIMPLIB ] := .T.
+
+ tmp := SubStr( cParam, Len( "-implib=" ) + 1 )
+
+ IF ! Empty( tmp )
+ tmp := MacroProc( hbmk, tmp, aParam[ _PAR_cFileName ] )
+ IF ! Empty( tmp )
+ tmp := PathSepToSelf( tmp )
+ hb_FNameSplit( tmp, @cDir, @cName, @cExt )
+ IF Empty( cDir )
+ tmp := PathNormalize( PathMakeAbsolute( tmp, aParam[ _PAR_cFileName ] ) )
+ hb_FNameSplit( tmp, @cDir, @cName, @cExt )
+ IF l_cIMPLIBDIR == NIL
+ l_cIMPLIBDIR := cDir
+ ENDIF
+ ELSE
+ l_cIMPLIBDIR := PathNormalize( PathMakeAbsolute( cDir, aParam[ _PAR_cFileName ] ) )
+ ENDIF
+ ENDIF
+ ELSE
+ l_cIMPLIBDIR := NIL
+ ENDIF
+
CASE Left( cParam, 2 ) == "-L" .AND. ;
Len( cParam ) > 2
@@ -2671,19 +2701,7 @@ FUNCTION hbmk2( aArgs, nArgTarget, /* @ */ lPause, nLevel )
/* Decide about working dir */
IF ! hbmk[ _HBMK_lStopAfterInit ] .AND. ! hbmk[ _HBMK_lCreateImpLib ] .AND. ! lDumpInfo
IF hbmk[ _HBMK_lINC ]
- /* NOTE: We store -hbdyn objects in different dirs by default as - for Windows
- platforms - they're always built using different compilation options
- than normal targets. [vszakats] */
- /* NOTE: We only use different shared object flags when compiling for
- "( win || wce ) & !( allmingw | cygwin )". This may change in the future.
- IMPORTANT: Keep this condition in sync with setting -DHB_DYNLIB C compiler flag */
- IF hbmk[ _HBMK_lCreateDyn ] .AND. !( hbmk[ _HBMK_cCOMP ] $ "mingw|mingw64|mingwarm|cygwin" )
- DEFAULT hbmk[ _HBMK_cWorkDir ] TO FNameDirGet( hbmk[ _HBMK_cPROGNAME ] ) + _WORKDIR_DEF_ + hb_ps() + "hbdyn"
- hbmk[ _HBMK_cWorkDirDynSub ] := "/hbdyn"
- ELSE
- DEFAULT hbmk[ _HBMK_cWorkDir ] TO FNameDirGet( hbmk[ _HBMK_cPROGNAME ] ) + _WORKDIR_DEF_
- hbmk[ _HBMK_cWorkDirDynSub ] := ""
- ENDIF
+ DEFAULT hbmk[ _HBMK_cWorkDir ] TO FNameDirGet( hbmk[ _HBMK_cPROGNAME ] ) + _WORKDIR_DEF_ + hbmk[ _HBMK_cWorkDirDynSub ]
IF ! Empty( hbmk[ _HBMK_cWorkDir ] )
IF ! DirBuild( hbmk[ _HBMK_cWorkDir ] )
hbmk_OutErr( hbmk, hb_StrFormat( I_( "Error: Working directory cannot be created: %1$s" ), hbmk[ _HBMK_cWorkDir ] ) )
@@ -4350,17 +4368,20 @@ FUNCTION hbmk2( aArgs, nArgTarget, /* @ */ lPause, nLevel )
IF ! hbmk[ _HBMK_lStopAfterInit ] .AND. ! hbmk[ _HBMK_lStopAfterHarbour ]
hb_FNameSplit( hbmk[ _HBMK_cPROGNAME ], @cDir, @cName, @cExt )
+ IF l_cIMPLIBDIR == NIL
+ l_cIMPLIBDIR := cDir
+ ENDIF
DO CASE
CASE ! lStopAfterCComp
IF Empty( cExt ) .AND. ! Empty( cBinExt )
hbmk[ _HBMK_cPROGNAME ] := hb_FNameMerge( cDir, cName, cBinExt )
ENDIF
- l_cIMPLIBNAME := hb_FNameMerge( cDir, cLibLibPrefix + cName + _HBMK_IMPLIB_EXE_POST, cImpLibExt )
+ l_cIMPLIBNAME := hb_FNameMerge( l_cIMPLIBDIR, cLibLibPrefix + cName + _HBMK_IMPLIB_EXE_POST, cImpLibExt )
CASE lStopAfterCComp .AND. hbmk[ _HBMK_lCreateDyn ]
IF Empty( cExt ) .AND. ! Empty( cDynLibExt )
hbmk[ _HBMK_cPROGNAME ] := hb_FNameMerge( cDir, cName, cDynLibExt )
ENDIF
- l_cIMPLIBNAME := hb_FNameMerge( cDir, cLibLibPrefix + cName + _HBMK_IMPLIB_DLL_POST, cImpLibExt )
+ l_cIMPLIBNAME := hb_FNameMerge( l_cIMPLIBDIR, cLibLibPrefix + cName + _HBMK_IMPLIB_DLL_POST, cImpLibExt )
CASE lStopAfterCComp .AND. hbmk[ _HBMK_lCreateLib ]
hbmk[ _HBMK_cPROGNAME ] := hb_FNameMerge( cDir, cLibLibPrefix + cName, iif( Empty( cLibLibExt ), cExt, cLibLibExt ) )
ENDCASE
@@ -4564,7 +4585,7 @@ FUNCTION hbmk2( aArgs, nArgTarget, /* @ */ lPause, nLevel )
IF ! hbmk[ _HBMK_lStopAfterInit ] .AND. hbmk[ _HBMK_lDEPIMPLIB ] .AND. ISBLOCK( bBlk_ImpLib )
FOR EACH tmp IN hbmk[ _HBMK_hDEP ]
IF tmp[ _HBMKDEP_lFound ] .AND. ! Empty( tmp[ _HBMKDEP_aIMPLIBSRC ] )
- DoIMPLIB( hbmk, bBlk_ImpLib, cLibLibPrefix, cLibLibExt, tmp[ _HBMKDEP_aIMPLIBSRC ], tmp[ _HBMKDEP_cIMPLIBDST ], "implib" )
+ DoIMPLIB( hbmk, bBlk_ImpLib, cLibLibPrefix, cLibLibExt, tmp[ _HBMKDEP_aIMPLIBSRC ], tmp[ _HBMKDEP_cIMPLIBDST ], "depimplib" )
ENDIF
NEXT
ENDIF
@@ -4704,13 +4725,16 @@ FUNCTION hbmk2( aArgs, nArgTarget, /* @ */ lPause, nLevel )
ENDIF
ENDIF
+ lHBMAINDLLP := AScan( hbmk[ _HBMK_aLIBUSER ], {| tmp | hb_FileMatch( tmp, "hbmaindllp" ) } ) > 0
+
/* HACK: Override entry point requested by user or detected by us,
and override the GT if requested by user. */
IF ( ! lStopAfterCComp .OR. hbmk[ _HBMK_lDynVM ] ) .AND. ;
( l_cMAIN != NIL .OR. ;
! Empty( hbmk[ _HBMK_aLIBUSERGT ] ) .OR. ;
hbmk[ _HBMK_cGT ] != NIL .OR. ;
- l_cCMAIN != NIL )
+ l_cCMAIN != NIL .OR. ;
+ lHBMAINDLLP )
l_cCSTUB := DirAddPathSep( hbmk[ _HBMK_cWorkDir ] ) + "_hbmkaut.c"
@@ -4781,6 +4805,14 @@ FUNCTION hbmk2( aArgs, nArgTarget, /* @ */ lPause, nLevel )
cFile += '' + Chr( 10 )
ENDIF
+ IF lHBMAINDLLP
+ cFile += 'HB_EXPORT_ATTR PHB_FUNC dll_hb_vmProcAddress( const char * szFuncName )' + Chr( 10 )
+ cFile += '{' + Chr( 10 )
+ cFile += ' return hb_vmProcAddress( szFuncName );' + Chr( 10 )
+ cFile += '}' + Chr( 10 )
+ cFile += '' + Chr( 10 )
+ ENDIF
+
IF hbmk[ _HBMK_cGT ] != NIL .OR. ;
l_cMAIN != NIL
IF hbmk[ _HBMK_nHBMODE ] == _HBMODE_HB10 .OR. ;
@@ -5007,6 +5039,7 @@ FUNCTION hbmk2( aArgs, nArgTarget, /* @ */ lPause, nLevel )
l_aLIBSTATICPOST } )
ENDIF
ELSE
+ lHBMAINDLLP := .F.
l_aLIBHB := {}
l_aLIBSHARED := {}
hbmk[ _HBMK_aPRG ] := {}
@@ -5020,7 +5053,7 @@ FUNCTION hbmk2( aArgs, nArgTarget, /* @ */ lPause, nLevel )
ListCookLib( hbmk, l_aLIB, l_aLIBA, l_aLIBRAW, NIL, cLibExt )
IF hbmk[ _HBMK_lSHARED ] .AND. ! Empty( l_aLIBSHARED )
/* Don't link Harbour dynamic/static libs when in '-hbdyn -shared' mode */
- IF !( hbmk[ _HBMK_lCreateDyn ] .AND. ! hbmk[ _HBMK_lDynVM ] )
+ IF !( hbmk[ _HBMK_lCreateDyn ] .AND. ! hbmk[ _HBMK_lDynVM ] ) .OR. lHBMAINDLLP
l_aLIBRAW := ArrayJoin( l_aLIBSHARED, l_aLIBRAW )
ListCookLib( hbmk, l_aLIB, l_aLIBA, l_aLIBSHARED, NIL )
ENDIF
@@ -5478,6 +5511,13 @@ FUNCTION hbmk2( aArgs, nArgTarget, /* @ */ lPause, nLevel )
IF lTargetUpToDate
hbmk_OutStd( hbmk, hb_StrFormat( I_( "Target up to date: %1$s" ), hbmk[ _HBMK_cPROGNAME ] ) )
+
+ DO CASE
+ CASE ! lStopAfterCComp .AND. ! Empty( cBin_Link )
+ l_lIMPLIBToProcess := .T.
+ CASE lStopAfterCComp .AND. hbmk[ _HBMK_lCreateDyn ] .AND. ! Empty( cBin_Dyn )
+ l_lIMPLIBToProcess := .T.
+ ENDCASE
ELSE
IF ! DirBuild( FNameDirGet( hbmk[ _HBMK_cPROGNAME ] ) )
hbmk_OutErr( hbmk, hb_StrFormat( I_( "Warning: Cannot create directory for target '%1$s'." ), hbmk[ _HBMK_cPROGNAME ] ) )
@@ -5561,8 +5601,8 @@ FUNCTION hbmk2( aArgs, nArgTarget, /* @ */ lPause, nLevel )
FErase( cScriptFile )
ENDIF
- IF hbmk[ _HBMK_lIMPLIB ] .AND. hbmk[ _HBMK_nErrorLevel ] == 0 .AND. hbmk[ _HBMK_cPLAT ] $ "win|os2|dos"
- hb_AIns( hbmk[ _HBMK_aINSTFILE ], 1, { "", l_cIMPLIBNAME }, .T. )
+ IF hbmk[ _HBMK_nErrorLevel ] == 0
+ l_lIMPLIBToProcess := .T.
ENDIF
IF hbmk[ _HBMK_nErrorLevel ] == 0 .AND. hbmk[ _HBMK_lGUI ] .AND. hbmk[ _HBMK_cPLAT ] == "darwin"
@@ -5658,8 +5698,8 @@ FUNCTION hbmk2( aArgs, nArgTarget, /* @ */ lPause, nLevel )
FErase( cScriptFile )
ENDIF
- IF hbmk[ _HBMK_lIMPLIB ] .AND. hbmk[ _HBMK_nErrorLevel ] == 0 .AND. hbmk[ _HBMK_cPLAT ] $ "win|os2|dos"
- hb_AIns( hbmk[ _HBMK_aINSTFILE ], 1, { "", l_cIMPLIBNAME }, .T. )
+ IF hbmk[ _HBMK_nErrorLevel ] == 0
+ l_lIMPLIBToProcess := .T.
ENDIF
CASE lStopAfterCComp .AND. hbmk[ _HBMK_lCreateLib ] .AND. ! Empty( cBin_Lib )
@@ -5730,6 +5770,13 @@ FUNCTION hbmk2( aArgs, nArgTarget, /* @ */ lPause, nLevel )
ENDIF
IF ! lTargetUpToDate .OR. hbmk[ _HBMK_lInstForce ]
+ /* For win/bcc and os2/gcc the implib is not created at this point yet,
+ so there will be a copy failure in case the implib generation
+ fails at the post-processing phase. */
+ IF hbmk[ _HBMK_lIMPLIB ] .AND. hbmk[ _HBMK_cPLAT ] $ "win|os2|dos" .AND. ;
+ l_lIMPLIBToProcess
+ hb_AIns( hbmk[ _HBMK_aINSTFILE ], 1, { "implib", l_cIMPLIBNAME }, .T. )
+ ENDIF
hb_AIns( hbmk[ _HBMK_aINSTFILE ], 1, { "", hbmk[ _HBMK_cPROGNAME ] }, .T. )
ENDIF
ENDIF
@@ -5934,6 +5981,24 @@ FUNCTION hbmk2( aArgs, nArgTarget, /* @ */ lPause, nLevel )
RETURN hbmk[ _HBMK_nErrorLevel ]
+/* NOTE: We store -hbdyn objects in different dirs by default as - for Windows
+ platforms - they're always built using different compilation options
+ than normal targets. [vszakats] */
+/* NOTE: We only use different shared object flags when compiling for
+ "( win || wce ) & !( allmingw | cygwin )". This may change in the future.
+ IMPORTANT: Keep this condition in sync with setting -DHB_DYNLIB C compiler flag logic */
+STATIC PROCEDURE Set_lCreateDyn( hbmk, lValue )
+
+ hbmk[ _HBMK_lCreateDyn ] := lValue
+
+ IF hbmk[ _HBMK_lCreateDyn ] .AND. ! Empty( hbmk[ _HBMK_cCOMP ] ) .AND. !( hbmk[ _HBMK_cCOMP ] $ "mingw|mingw64|mingwarm|cygwin" )
+ hbmk[ _HBMK_cWorkDirDynSub ] := hb_ps() + "hbdyn"
+ ELSE
+ hbmk[ _HBMK_cWorkDirDynSub ] := ""
+ ENDIF
+
+ RETURN
+
STATIC PROCEDURE vxworks_env_init( hbmk )
/* Array positions for aTable */
@@ -10915,6 +10980,7 @@ STATIC PROCEDURE ShowHelp( hbmk, lLong )
{ "-[no]cpp[=def]" , I_( "force C/C++ mode or reset to default" ) },;
{ "-[no]map" , I_( "create (or not) a map file" ) },;
{ "-[no]implib" , I_( "create (or not) an import library (in -hbdyn/-hbexe mode). The name will have a postfix added." ) },;
+ { "-implib=" , I_( "create import library (in -hbdyn/-hbexe mode) in (default: same as output dir)" ) },;
{ "-[no]strip" , I_( "strip (no strip) binaries" ) },;
{ "-[no]trace" , I_( "show commands executed" ) },;
{ "-[no]beep" , I_( "enable (or disable) single beep on successful exit, double beep on failure" ) },;