2010-03-22 00:43 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)

* utils/hbmk2/hbmk2.prg
    + Added experimental -mkimplib= option to "convert" .dll
      files into import libraries. Syntax tentative.
    ; TODO: Support for idiotic -a Borland C implib option.
            If anyone has an idea how to detect when to use
            -a and when not, I will implement it. If not,
            I will most probably drop maintaining -a option
            for bcc and leave it off. This leaves implibs
            working for most .dlls we currently use, but will
            break some (blat, curl, cairo, pq, alleg from
            contrib).

  * config/win/xcc.mk
  * utils/hbmk2/hbmk2.prg
    ! Fixed to use case-correct filenames for xcc tools.

  * bin/hb-mkimp.prg
    + Added msvcia64, msvcarm, xcc support.
    ! Fixed few library specs for msvc*.
    * FS_ERROR -> F_ERROR
    ! Fixed handling spaces inside dll name for msvc*.
    ! Fixed handling non .dll extension for msvc*.
This commit is contained in:
Viktor Szakats
2010-03-21 23:44:16 +00:00
parent 3bc818f6e4
commit 504e7698e9
4 changed files with 166 additions and 28 deletions

View File

@@ -17,6 +17,30 @@
past entries belonging to author(s): Viktor Szakats.
*/
2010-03-22 00:43 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)
* utils/hbmk2/hbmk2.prg
+ Added experimental -mkimplib= option to "convert" .dll
files into import libraries. Syntax tentative.
; TODO: Support for idiotic -a Borland C implib option.
If anyone has an idea how to detect when to use
-a and when not, I will implement it. If not,
I will most probably drop maintaining -a option
for bcc and leave it off. This leaves implibs
working for most .dlls we currently use, but will
break some (blat, curl, cairo, pq, alleg from
contrib).
* config/win/xcc.mk
* utils/hbmk2/hbmk2.prg
! Fixed to use case-correct filenames for xcc tools.
* bin/hb-mkimp.prg
+ Added msvcia64, msvcarm, xcc support.
! Fixed few library specs for msvc*.
* FS_ERROR -> F_ERROR
! Fixed handling spaces inside dll name for msvc*.
! Fixed handling non .dll extension for msvc*.
2010-03-21 20:30 UTC+0100 Xavi (jarabal/at/gmail.com)
* harbour/src/rtl/teditor.prg
! Fixing MemoEdit parameter calculation: nTextBuffRow, nWindowColumn.

View File

@@ -15,7 +15,7 @@
*/
/* TOFIX: Ugly hack to avoid #include "fileio.ch" */
#define FS_ERROR ( -1 )
#define F_ERROR ( -1 )
PROCEDURE Main( cCompiler, cLibDir )
LOCAL aLibs
@@ -53,12 +53,12 @@ PROCEDURE Main( cCompiler, cLibDir )
{ "ace32" , "HB_WITH_ADS" , "ace32.dll" , .F. , "ace32.lib" , , }, ;
{ "ace32" , "HB_WITH_ADS" , "32bit\ace32.dll" , .F. , "32bit\ace32.lib" , , }, ;
{ "alleg" , "HB_WITH_ALLEGRO" , "..\bin\alleg42.dll" , .T. , "..\lib\alleg.lib" , , }, ;
{ "sde61" , "HB_WITH_APOLLO" , "..\sde61.dll" , .F. , "..\sde61.dll" , , }, ;
{ "sde7" , "HB_WITH_APOLLO" , "..\sde7.dll" , .F. , "..\sde7.dll" , , }, ;
{ "sde61" , "HB_WITH_APOLLO" , "..\sde61.dll" , .F. , , , }, ;
{ "sde7" , "HB_WITH_APOLLO" , "..\sde7.dll" , .F. , , , }, ;
{ "blat" , "HB_WITH_BLAT" , "..\blat.dll" , .T. , "..\blat.lib" , , }, ;
{ "cairo" , "HB_WITH_CAIRO" , "..\..\bin\libcairo-2.dll" , .T. , "..\..\lib\cairo.lib" , , "..\..\lib\libcairo.dll.a" }, ;
{ "libcurl" , "HB_WITH_CURL" , "..\libcurl.dll" , .T. , "..\libcurl.dll" , , "..\lib\libcurl.a" }, ;
{ "libcurl" , "HB_WITH_CURL" , "..\bin\libcurl.dll" , .T. , "..\bin\libcurl.dll" , , "..\lib\libcurldll.a" }, ;
{ "libcurl" , "HB_WITH_CURL" , "..\libcurl.dll" , .T. , , , "..\lib\libcurl.a" }, ;
{ "libcurl" , "HB_WITH_CURL" , "..\bin\libcurl.dll" , .T. , , , "..\lib\libcurldll.a" }, ;
{ "fbclient" , "HB_WITH_FIREBIRD" , "..\bin\fbclient.dll" , .F. , "..\lib\fbclient_ms.lib" , , }, ;
{ "FreeImage" , "HB_WITH_FREEIMAGE" , "..\Dist\FreeImage.dll" , .F. , "..\Dist\FreeImage.lib" , , }, ;
{ "bgd" , "HB_WITH_GD" , "..\bin\bgd.dll" , .F. , "..\lib\bgd.lib" , , }, ;
@@ -84,14 +84,17 @@ PROCEDURE Main( cCompiler, cLibDir )
#define _C_PROC_LIBA 6
hComps := {;
"mingw" => { "lib", ".a" , {| s, t | hb_FCopy( s, t ) != FS_ERROR }, {| s, t | hb_FCopy( s, t ) != FS_ERROR }, NIL, {| s, t | hb_FCopy( s, t ) != FS_ERROR } }, ;
"mingw64" => { "lib", ".a" , {| s, t | hb_FCopy( s, t ) != FS_ERROR }, NIL, {| s, t | hb_FCopy( s, t ) != FS_ERROR }, {| s, t | hb_FCopy( s, t ) != FS_ERROR } }, ;
"msvc" => { "" , ".lib", {| s, t | MSVC_implib( s, t, "x86" ) }, {| s, t | hb_FCopy( s, t ) != FS_ERROR }, NIL, NIL }, ;
"msvc64" => { "" , ".lib", {| s, t | MSVC_implib( s, t, "x64" ) }, NIL, {| s, t | hb_FCopy( s, t ) != FS_ERROR }, NIL }, ;
"pocc" => { "" , ".lib", {| s, t | hb_processRun( "polib " + FN_Escape( s ) + " /out:" + FN_Escape( t ) ) == 0 }, {| s, t | hb_FCopy( s, t ) != FS_ERROR }, NIL, NIL }, ;
"pocc64" => { "" , ".lib", {| s, t | hb_processRun( "polib " + FN_Escape( s ) + " /out:" + FN_Escape( t ) ) == 0 }, NIL, {| s, t | hb_FCopy( s, t ) != FS_ERROR }, NIL }, ;
"watcom" => { "" , ".lib", {| s, t | hb_processRun( "wlib -q -o=" + FN_Escape( t ) + " " + FN_Escape( s ) ) == 0 }, NIL, NIL, NIL }, ;
"bcc" => { "" , ".lib", {| s, t, lib | hb_processRun( "implib " + iif( lib[ _L_DLLMS ], "-a", "" ) + " " + FN_Escape( t ) + " " + FN_Escape( s ) ) == 0 }, NIL, NIL, NIL } }
"mingw" => { "lib", ".a" , {| s, t | hb_FCopy( s, t ) != F_ERROR }, {| s, t | hb_FCopy( s, t ) != F_ERROR }, NIL, {| s, t | hb_FCopy( s, t ) != F_ERROR } }, ;
"mingw64" => { "lib", ".a" , {| s, t | hb_FCopy( s, t ) != F_ERROR }, NIL, {| s, t | hb_FCopy( s, t ) != F_ERROR }, {| s, t | hb_FCopy( s, t ) != F_ERROR } }, ;
"msvc" => { "" , ".lib", {| s, t | MSVC_implib( s, t, "x86" ) }, {| s, t | hb_FCopy( s, t ) != F_ERROR }, NIL, NIL }, ;
"msvc64" => { "" , ".lib", {| s, t | MSVC_implib( s, t, "x64" ) }, NIL, {| s, t | hb_FCopy( s, t ) != F_ERROR }, NIL }, ;
"msvcia64" => { "" , ".lib", {| s, t | MSVC_implib( s, t, "ia86" ) }, NIL, NIL, NIL }, ;
"msvcarm" => { "" , ".lib", {| s, t | MSVC_implib( s, t, "arm" ) }, NIL, NIL, NIL }, ;
"xcc" => { "" , ".lib", {| s, t | hb_processRun( "xLib " + FN_Escape( s ) + " /out:" + FN_Escape( t ) ) == 0 }, {| s, t | hb_FCopy( s, t ) != F_ERROR }, NIL, NIL }, ;
"pocc" => { "" , ".lib", {| s, t | hb_processRun( "polib " + FN_Escape( s ) + " /out:" + FN_Escape( t ) ) == 0 }, {| s, t | hb_FCopy( s, t ) != F_ERROR }, NIL, NIL }, ;
"pocc64" => { "" , ".lib", {| s, t | hb_processRun( "polib " + FN_Escape( s ) + " /out:" + FN_Escape( t ) ) == 0 }, NIL, {| s, t | hb_FCopy( s, t ) != F_ERROR }, NIL }, ;
"watcom" => { "" , ".lib", {| s, t | hb_processRun( "wlib -q -o=" + FN_Escape( t ) + " " + FN_Escape( s ) ) == 0 }, NIL, NIL, NIL }, ;
"bcc" => { "" , ".lib", {| s, t, lib | hb_processRun( "implib " + iif( lib[ _L_DLLMS ], "-a", "" ) + " " + FN_Escape( t ) + " " + FN_Escape( s ) ) == 0 }, NIL, NIL, NIL } }
IF Lower( cCompiler ) $ hComps
@@ -152,7 +155,7 @@ STATIC FUNCTION MSVC_implib( s, t, cMode )
IF hb_processRun( "dumpbin -exports " + FN_Escape( s ),, @cExports ) == 0
cFuncList := "LIBRARY " + FN_NameGet( s ) + hb_osNewLine() +;
cFuncList := "LIBRARY " + Chr( 34 ) + FN_NameExtGet( s ) + Chr( 34 ) + hb_osNewLine() +;
"EXPORTS" + hb_osNewLine()
cExports := StrTran( cExports, Chr( 13 ) + Chr( 10 ), Chr( 10 ) )
@@ -172,13 +175,13 @@ STATIC FUNCTION MSVC_implib( s, t, cMode )
NEXT
fhnd := hb_FTempCreateEx( @cDef )
IF fhnd != FS_ERROR
IF fhnd != F_ERROR
FWrite( fhnd, cFuncList )
FClose( fhnd )
lSuccess := ( hb_processRun( "lib -nologo -machine:" + cMode + " -def:" + FN_Escape( cDef ) + " -out:" + FN_Escape( t ) ) == 0 )
FErase( cFuncList )
FErase( cDef )
ENDIF
ENDIF
@@ -187,12 +190,12 @@ STATIC FUNCTION MSVC_implib( s, t, cMode )
STATIC FUNCTION FN_Escape( cFileName )
RETURN Chr( 34 ) + cFileName + Chr( 34 )
STATIC FUNCTION FN_NameGet( cFileName )
LOCAL cName
STATIC FUNCTION FN_NameExtGet( cFileName )
LOCAL cName, cExt
hb_FNameSplit( cFileName,, @cName )
hb_FNameSplit( cFileName,, @cName, @cExt )
RETURN cName
RETURN hb_FNameMerge( NIL, cName, cExt )
STATIC FUNCTION DirAddPathSep( cDir )

View File

@@ -10,7 +10,7 @@ LIB_EXT := .lib
HB_DYN_COPT := -DHB_DYNLIB
CC := xcc.exe
CC := xCC.exe
CC_IN := -c
CC_OUT := -Fo
@@ -41,7 +41,7 @@ ifeq ($(HB_BUILD_DEBUG),yes)
CFLAGS += -Zi
endif
LD := xlink.exe
LD := xLink.exe
LD_OUT := -out:
LIBPATHS := -libpath:$(LIB_DIR)
@@ -49,7 +49,7 @@ LDLIBS := $(foreach lib,$(HB_USER_LIBS) $(LIBS) $(SYSLIBS),$(lib)$(LIB_EXT))
LDFLAGS += $(LIBPATHS)
AR := xlib.exe
AR := xLib.exe
AR_RULE = $(AR) $(ARFLAGS) $(HB_AFLAGS) $(HB_USER_AFLAGS) -out:$(LIB_DIR)/$@ $(^F)
DY := $(LD)

View File

@@ -678,6 +678,7 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause )
LOCAL cBin_Res
LOCAL cBin_Lib
LOCAL cBin_Dyn
LOCAL bBlk_ImpLib
LOCAL cPath_CompC
LOCAL nErrorLevel := 0
LOCAL tmp, tmp1, tmp2, tmp3, array
@@ -698,6 +699,9 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause )
LOCAL lAcceptLDFlag := .F.
LOCAL lAcceptLDClipper := .F.
LOCAL lHarbourInfo := .F.
LOCAL lMakeImpLib := .F.
LOCAL cMakeImpLibDLL := NIL
LOCAL cMakeImpLibLib := NIL
LOCAL cWorkDir := NIL
@@ -1740,6 +1744,16 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause )
OutStd( l_cHB_INC_INSTALL )
CASE Left( cParamL, Len( "-mkimplib=" ) ) == "-mkimplib="
lStopAfterInit := .T.
lMakeImpLib := .T.
cMakeImpLibLib := SubStr( cParam, Len( "-mkimplib=" ) + 1 )
CASE lMakeImpLib .AND. Empty( cMakeImpLibDLL )
cMakeImpLibDLL := PathProc( cParam, aParam[ _PAR_cFileName ] )
CASE Left( cParamL, Len( "-jobs=" ) ) == "-jobs="
cParam := ArchCompFilter( hbmk, SubStr( cParam, Len( "-jobs=" ) + 1 ) )
@@ -2240,7 +2254,7 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause )
ENDIF
ENDIF
IF ! lStopAfterInit .AND. ! lStopAfterHarbour
IF ( ! lStopAfterInit .AND. ! lStopAfterHarbour ) .OR. lMakeImpLib
IF hbmk[ _HBMK_cGT ] != NIL .AND. hbmk[ _HBMK_cGT ] == hbmk[ _HBMK_cGTDEFAULT ]
hbmk[ _HBMK_cGT ] := NIL
@@ -2611,6 +2625,7 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause )
cOpt_Dyn := "-shared -o {OD} {LO} {FD} {DL} {LS}"
cBin_Link := cBin_CompC
cOpt_Link := "{LO} {LA} {LS} {FL} {DL}"
bBlk_ImpLib := {| s, t | hb_FCopy( s, t ) != F_ERROR }
cLibPathPrefix := "-L"
cLibPathSep := " "
cLibLibExt := ".a"
@@ -2743,6 +2758,7 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause )
cOpt_Dyn := "-shared -o {OD} {LO} {LL} {LB} {FD} {DL} {LS}"
cBin_Link := cBin_CompC
cOpt_Link := "{LO} {LA} {FL} {DL}"
bBlk_ImpLib := {| s, t | hb_FCopy( s, t ) != F_ERROR }
cLibPathPrefix := "-L"
cLibPathSep := " "
IF hbmk[ _HBMK_cCOMP ] == "gccomf"
@@ -2991,6 +3007,9 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause )
ENDIF
cBin_Lib := "wlib" + cCCEXT
cOpt_Lib := "-q {FA} {OL} {LO}{SCRIPT}"
IF hbmk[ _HBMK_cPLAT ] $ "win|os2"
bBlk_ImpLib := {| s, t | win_implib_command( cBin_Lib + " -q -o={OL} {ID}", nCmd_Esc, s, t ) }
ENDIF
cLibLibExt := cLibExt
cLibObjPrefix := "-+ "
IF hbmk[ _HBMK_lMT ] .AND. hbmk[ _HBMK_cPLAT ] $ "win|os2"
@@ -3101,6 +3120,8 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause )
cBin_Dyn := cBin_Link
cOpt_Link := '-Gn -Tpe -L{DL} {FL} ' + iif( hbmk[ _HBMK_lGUI ], "c0w32.obj", "c0x32.obj" ) + " {LO}, {OE}, " + iif( hbmk[ _HBMK_lMAP ], "{OM}", "nul" ) + ", {LL} {LB} cw32mt.lib import32.lib,, {LS}{SCRIPT}"
cOpt_Dyn := '-Gn -Tpd -L{DL} {FD} ' + "c0d32.obj" + " {LO}, {OD}, " + iif( hbmk[ _HBMK_lMAP ], "{OM}", "nul" ) + ", {LL} {LB} cw32mt.lib import32.lib,, {LS}{SCRIPT}"
/* TODO: Add support for idiotic BCC -a option. */
bBlk_ImpLib := {| s, t | win_implib_command( "implib {FI} {OL} {ID}", nCmd_Esc, s, t, "" ) }
cLibPathPrefix := ""
cLibPathSep := ";"
IF hbmk[ _HBMK_lMAP ]
@@ -3243,6 +3264,17 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause )
cOpt_CompC += " {FC} {LC}"
cOptIncMask := "-I{DI}"
cOpt_Link := "-nologo -out:{OE} {LO} {DL} {FL} {LL} {LB} {LS}"
DO CASE
CASE hbmk[ _HBMK_cCOMP ] == "msvc" ; tmp := "-machine:x86"
CASE hbmk[ _HBMK_cCOMP ] == "msvc64" ; tmp := "-machine:x64"
CASE hbmk[ _HBMK_cCOMP ] == "msvcia64" ; tmp := "-machine:ia64"
CASE hbmk[ _HBMK_cCOMP ] == "icc" ; tmp := "-machine:x86"
CASE hbmk[ _HBMK_cCOMP ] == "iccia64" ; tmp := "-machine:ia64"
CASE hbmk[ _HBMK_cCOMP ] == "msvcarm" ; tmp := "-machine:xarm"
CASE hbmk[ _HBMK_cCOMP ] == "msvcmips" ; tmp := "-machine:mips"
CASE hbmk[ _HBMK_cCOMP ] == "msvcsh" ; tmp := "-machine:sh5"
ENDCASE
bBlk_ImpLib := {| s, t | win_implib_command_msvc( cBin_Lib + " -nologo {FI} -def:{ID} -out:{OL}", nCmd_Esc, s, t, tmp ) }
cLibPathPrefix := "-libpath:"
cLibPathSep := " "
IF hbmk[ _HBMK_lMAP ]
@@ -3332,10 +3364,10 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause )
cObjExt := ".obj"
cLibLibExt := cLibExt
IF hbmk[ _HBMK_cCOMP ] == "xcc"
cBin_CompC := "xcc.exe"
cBin_Lib := "xlib.exe"
cBin_Link := "xlink.exe"
cBin_Res := "xrc.exe"
cBin_CompC := "xCC.exe"
cBin_Lib := "xLib.exe"
cBin_Link := "xLink.exe"
cBin_Res := "xRC.exe"
ELSE
cBin_CompC := "pocc.exe"
cBin_Lib := "polib.exe"
@@ -3358,6 +3390,7 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause )
ENDIF
cOptIncMask := "-I{DI}"
cOpt_Dyn := "{FD} -dll -out:{OD} {DL} {LO} {LL} {LB} {LS}"
bBlk_ImpLib := {| s, t | win_implib_command( cBin_Lib + " {ID} -out:{OL}", nCmd_Esc, s, t ) }
IF hbmk[ _HBMK_cPLAT ] == "wce"
AAdd( hbmk[ _HBMK_aOPTC ], "-DUNICODE" )
AAdd( hbmk[ _HBMK_aOPTC ], "-D_WINCE" ) /* Required by pocc Windows headers */
@@ -3561,6 +3594,21 @@ FUNCTION hbmk2( aArgs, /* @ */ lPause )
ENDIF
ENDIF
IF lMakeImpLib
IF ISBLOCK( bBlk_ImpLib )
IF ! Empty( cMakeImpLibDLL ) .AND. ! Empty( cMakeImpLibLib )
hbmk_OutStd( hbmk, I_( "Creating import library..." ) )
IF ! Eval( bBlk_ImpLib, cMakeImpLibDLL, cMakeImpLibLib )
hbmk_OutErr( hbmk, I_( "Error: Creating import libraries failed." ) )
ENDIF
ELSE
hbmk_OutErr( hbmk, I_( "Error: Missing parameter for import library creation." ) )
ENDIF
ELSE
hbmk_OutErr( hbmk, I_( "Error: Creating import libraries is not supported for this platform or compiler." ) )
ENDIF
ENDIF
DEFAULT nScr_Esc TO nCmd_Esc
/* Delete all lib paths which contain late-evaluation macros. */
@@ -7634,6 +7682,67 @@ STATIC FUNCTION GenHBL( hbmk, aFiles, cFileOut, lEmpty )
RETURN lRetVal
STATIC FUNCTION win_implib_command( cCommand, nCmd_Esc, s, t, f )
DEFAULT f TO ""
cCommand := StrTran( cCommand, "{FI}", f )
cCommand := StrTran( cCommand, "{ID}", FN_Escape( s, nCmd_Esc ) )
cCommand := StrTran( cCommand, "{OL}", FN_Escape( t, nCmd_Esc ) )
RETURN hb_processRun( cCommand ) == 0
STATIC FUNCTION win_implib_command_msvc( cCommand, nCmd_Esc, s, t, f )
LOCAL lSuccess := .F.
LOCAL cExports
LOCAL fhnd
LOCAL cDef
LOCAL cLine
LOCAL tmp
LOCAL aCols
LOCAL cFuncList
LOCAL cCommandDump
cCommandDump := "dumpbin -exports {ID}"
cCommandDump := StrTran( cCommandDump, "{ID}", FN_Escape( s, nCmd_Esc ) )
IF hb_processRun( cCommandDump,, @cExports ) == 0
cFuncList := "LIBRARY " + Chr( 34 ) + FN_NameExtGet( s ) + Chr( 34 ) + hb_osNewLine() +;
"EXPORTS" + hb_osNewLine()
cExports := StrTran( cExports, Chr( 13 ) + Chr( 10 ), Chr( 10 ) )
tmp := At( "ordinal hint", cExports )
IF tmp > 0
cExports := SubStr( cExports, tmp + Len( "ordinal hint" ) )
ENDIF
FOR EACH cLine IN hb_ATokens( cExports, Chr( 10 ) )
IF ! Empty( cLine )
aCols := hb_ATokens( cLine )
IF Len( aCols ) >= 4
cFuncList += aCols[ 4 ] + hb_osNewLine()
ENDIF
ENDIF
NEXT
fhnd := hb_FTempCreateEx( @cDef )
IF fhnd != F_ERROR
FWrite( fhnd, cFuncList )
FClose( fhnd )
lSuccess := win_implib_command( cCommand, nCmd_Esc, cDef, t, f )
FErase( cDef )
ENDIF
ENDIF
RETURN lSuccess
#define _VCS_UNKNOWN 0
#define _VCS_SVN 1
#define _VCS_GIT 2
@@ -8475,6 +8584,8 @@ STATIC PROCEDURE ShowHelp( hbmk, lLong )
{ "-blinker" , "" },;
{ "-exospace" , I_( "emulate Clipper compatible linker behavior\ncreate link/copy hbmk2 to rtlink/blinker/exospace for the same effect" ) },;
NIL,;
{ "-mkimplib=<l> <d>" , I_( "convert <d> .dll into <l> import libaray (experimental)" ) },;
NIL,;
{ "-hbmake=<file>" , I_( "convert hbmake project file to .hbp file (experimental)" ) },;
{ "-xbp=<file>" , I_( "convert .xbp (xbuild) project file to .hbp file (experimental)" ) },;
{ "-xhp=<file>" , I_( "convert .xhp (xMate) project file to .hbp file (experimental)" ) },;