diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 1d0c18ecc8..9c768542c4 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,57 @@ 2009-12-31 13:59 UTC+0100 Foo Bar (foo.bar foobar.org) */ +2009-02-23 14:51 UTC+0100 Viktor Szakats (harbour.01 syenar hu) + * utils/hbmk2/hbmk2.prg + ! Fixed bug which made gtwvt the default GT for mingw. + ! Fixed to create final exe in current dir if no output + filename was specified and the first input file + contained a path. + * Changed to use version-less harbour shared lib names + on *nixes. + ! Fixed to pass full path with harbour.so to gcc. + (even when Harbour isn't run from a system location) + ! Fixed compilation/linking/cleanup if an input file + wasn't in current dir. + * Temp stub file is now created in system default temp dir, + instead of the current one. + + Harbour shared lib path is normalized when Harbour + is found on system locations. (so '*/bin/../lib/' becomes + '*/lib') + * Better I hope handling of .so/.dylib/.sl/.dll files passed + on the command line. + + * bin/hb-mkdll.bat + ! Fixed typo in Borland MT .dll name. + ! Fixed to not include maindll.obj, maindllp.obj in + Borland .dlls. + * Minor formatting and cleanup on internal names. + + Added checking for source lib existence, showing + message if not found. + + Better user feedback. + + * bin/postinst.bat + + Added running hb_mkdll.bat at the end of the build + process. For now users have to use 'set HB_DLL=yes' + to enable this features. It's experimental yet, + see previous comments. + + * source/vm/Makefile + + Now generating hbmainstd and hbmainwin for remaining + (non-mingw and non-mingwce) compilers. MSVC and BCC + need this for -shared linkage, I'm not sure about the + rest, anyhow we can disable it for other compilers + if it isn't needed in future. + + * bin/hb-func.sh + % Refined hbmkcfg.hbp setup to better detect conditions. + + * contrib/hbcurl/hbcurl.c + ! Pacified this only one new gcc 4.3.3 warning. + + * config/win/gcc.cf + * config/win/mingw.cf + + Added -mtune=pentiumpro gcc optimization. 2009-02-22 19:32 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com) * harbour/contrib/gtwvg/wvgwin.c @@ -27,16 +78,16 @@ * harbour/contrib/gtwvg/wvgtreev.prg * harbour/contrib/gtwvg/wvgwnd.prg ! Code cleanup. - ! Implemented generic callback functionality taking - use of SetProp()/GetProp() functions of WINAPI. It - effectively eliminates the use of AsCallBack() + ! Implemented generic callback functionality taking + use of SetProp()/GetProp() functions of WINAPI. It + effectively eliminates the use of AsCallBack() function which has been discussed as non-scalable in multi-processor architect. - ; TODO: To use hb_gcAlloc() mechanism to hold the + ; TODO: To use hb_gcAlloc() mechanism to hold the codeblock. Please review wvgwnd():SetWindowProcCallback() and wvgwin:WVG_SetWindowProcBlock( ::hWnd, bBlock ). - I did try but could not resolve it properly. + I did try but could not resolve it properly. 2009-02-22 22:39 UTC+0100 Viktor Szakats (harbour.01 syenar hu) * make_vc.mak diff --git a/harbour/bin/hb-func.sh b/harbour/bin/hb-func.sh index 44cdbd2687..adb652a953 100755 --- a/harbour/bin/hb-func.sh +++ b/harbour/bin/hb-func.sh @@ -178,10 +178,13 @@ mk_hbtools() fi if [ "${HB_COMPILER}" = "mingw" ]; then HB_SYS_LIBS="${HB_SYS_LIBS} -luser32 -lwinspool -lgdi32 -lcomctl32 -lcomdlg32 -lole32 -loleaut32 -luuid -lwsock32 -lws2_32" + HB_WITHOUT_X11="yes" elif [ "${HB_COMPILER}" = "mingwce" ]; then HB_SYS_LIBS="${HB_SYS_LIBS} -lwininet -lws2 -lcommdlg -lcommctrl -luuid -lole32" + HB_WITHOUT_X11="yes" elif [ "${HB_COMPILER}" = "djgpp" ]; then HB_SYS_LIBS="${HB_SYS_LIBS}" + HB_WITHOUT_X11="yes" else HB_CRS_LIB="" if [ "${HB_ARCHITECTURE}" = "linux" ]; then @@ -240,10 +243,10 @@ mk_hbtools() if [ "${HB_WITHOUT_X11}" != "yes" ]; then echo "libdynhas=gtxwc">> ${hb_hbmkcfg} fi - if [ "${HB_WITHOUT_GTCRS}" != "yes" ]; then + if [ "${HB_WITHOUT_GTCRS}" != "yes" ] && [ -n "${HB_CRS_LIB}" ]; then echo "libdynhas=gtcrs">> ${hb_hbmkcfg} fi - if [ "${HB_WITHOUT_GTSLN}" != "yes" ]; then + if [ "${HB_WITHOUT_GTSLN}" != "yes" ] && [ -n "${HB_SLN_LIB}" ]; then echo "libdynhas=gtsln">> ${hb_hbmkcfg} fi diff --git a/harbour/bin/hb-mkdll.bat b/harbour/bin/hb-mkdll.bat index fae18d1595..ff7af98b98 100644 --- a/harbour/bin/hb-mkdll.bat +++ b/harbour/bin/hb-mkdll.bat @@ -20,87 +20,90 @@ if "%HB_COMPILER%" == "" ( echo HB_COMPILER needs to be set. && goto END ) if not "%HB_ARCHITECTURE%" == "win" goto END set HB_DLL_VERSION=11 -set HB_DLL_LIBS=hbcommon,hbpp,hbrtl,hbmacro,hblang,hbcpage,hbpcre,hbzlib,hbextern,hbrdd,rddntx,rddnsx,rddcdx,rddfpt,hbsix,hbhsx,hbusrrdd,gtcgi,gtpca,gtstd,gtwin,gtwvt,gtgui +set HB_DLL_LIBS=hbcommon hbpp hbrtl hbmacro hblang hbcpage hbpcre hbzlib hbextern hbrdd rddntx rddnsx rddcdx rddfpt hbsix hbhsx hbusrrdd gtcgi gtpca gtstd gtwin gtwvt gtgui +set HB_DLL_LIBS_ST=hbvm +set HB_DLL_LIBS_MT=hbvmmt if not "%HB_COMPILER%" == "msvc" goto NOT_MSVC -rem Generating Harbour .dll for MSVC +echo Making .dlls for %HB_COMPILER%... md _dll cd _dll -rem ; Extract core objects -echo.> _hbocore.txt +rem ; Extract neutral objects +echo.> _hboneut.txt for %%f in (%HB_DLL_LIBS%) do ( - echo Processing library: %%f - lib "%HB_LIB_INSTALL%\%%f.lib" /nologo /list > _hboraw.txt - for /F %%p in (_hboraw.txt) do ( - lib "%HB_LIB_INSTALL%\%%f.lib" /nologo /extract:%%p - echo %%p>> _hbocore.txt - ) - del _hboraw.txt + if exist "%HB_LIB_INSTALL%\%%f.lib" ( + echo Processing library: %%f + lib "%HB_LIB_INSTALL%\%%f.lib" /nologo /list > _hboraw.txt + for /F %%p in (_hboraw.txt) do ( + lib "%HB_LIB_INSTALL%\%%f.lib" /nologo /extract:%%p + echo %%p>> _hboneut.txt + ) + del _hboraw.txt + ) else ( echo Library not found: %HB_LIB_INSTALL%\%%f.lib ) ) -md vm -cd vm -set HB_DLL_LIBS=hbvm -rem ; Extract VM objects -echo.> ..\_hbovm.txt -for %%f in (%HB_DLL_LIBS%) do ( - echo Processing library: %%f - lib "%HB_LIB_INSTALL%\%%f.lib" /nologo /list > _hboraw.txt - for /F %%p in (_hboraw.txt) do ( - if not "%%p" == "maindll.obj" ( - if not "%%p" == "maindllp.obj" ( - lib "%HB_LIB_INSTALL%\%%f.lib" /nologo /extract:%%p - echo vm\%%p>> ..\_hbovm.txt +md _st +cd _st +rem ; Extract ST objects +echo.> ..\_hbost.txt +for %%f in (%HB_DLL_LIBS_ST%) do ( + if exist "%HB_LIB_INSTALL%\%%f.lib" ( + echo Processing library: %%f + lib "%HB_LIB_INSTALL%\%%f.lib" /nologo /list > _hboraw.txt + for /F %%p in (_hboraw.txt) do ( + if not "%%p" == "maindll.obj" ( + if not "%%p" == "maindllp.obj" ( + lib "%HB_LIB_INSTALL%\%%f.lib" /nologo /extract:%%p + echo _st\%%p>> ..\_hbost.txt + ) + ) ) - ) - ) - del _hboraw.txt + del _hboraw.txt + ) else ( echo Library not found: %HB_LIB_INSTALL%\%%f.lib ) ) cd .. -md vmmt -cd vmmt -set HB_DLL_LIBS=hbvmmt -rem ; Extract VM (MT) objects -echo.> ..\_hbovmmt.txt -for %%f in (%HB_DLL_LIBS%) do ( - echo Processing library: %%f - lib "%HB_LIB_INSTALL%\%%f.lib" /nologo /list > _hboraw.txt - for /F %%p in (_hboraw.txt) do ( - if not "%%p" == "maindll.obj" ( - if not "%%p" == "maindllp.obj" ( - lib "%HB_LIB_INSTALL%\%%f.lib" /nologo /extract:%%p - echo vmmt\%%p>> ..\_hbovmmt.txt +md _mt +cd _mt +rem ; Extract MT objects +echo.> ..\_hbomt.txt +for %%f in (%HB_DLL_LIBS_MT%) do ( + if exist "%HB_LIB_INSTALL%\%%f.lib" ( + echo Processing library: %%f + lib "%HB_LIB_INSTALL%\%%f.lib" /nologo /list > _hboraw.txt + for /F %%p in (_hboraw.txt) do ( + if not "%%p" == "maindll.obj" ( + if not "%%p" == "maindllp.obj" ( + lib "%HB_LIB_INSTALL%\%%f.lib" /nologo /extract:%%p + echo _mt\%%p>> ..\_hbomt.txt + ) + ) ) - ) - ) - del _hboraw.txt + del _hboraw.txt + ) else ( echo Library not found: %HB_LIB_INSTALL%\%%f.lib ) ) cd .. -link /dll /out:"%HB_BIN_INSTALL%\harbour-%HB_DLL_VERSION%-vc.dll" @_hbocore.txt @_hbovm.txt user32.lib wsock32.lib advapi32.lib gdi32.lib > nul -link /dll /out:"%HB_BIN_INSTALL%\harbourmt-%HB_DLL_VERSION%-vc.dll" @_hbocore.txt @_hbovmmt.txt user32.lib wsock32.lib advapi32.lib gdi32.lib > nul +set _DST_NAME_ST=%HB_BIN_INSTALL%\harbour-%HB_DLL_VERSION%-vc.dll +set _DST_NAME_MT=%HB_BIN_INSTALL%\harbourmt-%HB_DLL_VERSION%-vc.dll + +echo Making %_DST_NAME_ST%... && link /dll /out:"%_DST_NAME_ST%" @_hboneut.txt @_hbost.txt user32.lib wsock32.lib advapi32.lib gdi32.lib > nul +echo Making %_DST_NAME_MT%... && link /dll /out:"%_DST_NAME_MT%" @_hboneut.txt @_hbomt.txt user32.lib wsock32.lib advapi32.lib gdi32.lib > nul rem ; Cleanup -for /F %%o in (_hbovm.txt) do ( - del %%o -) -del _hbovm.txt -rmdir vm +for /F %%o in (_hbost.txt) do ( del %%o ) +del _hbost.txt +rmdir _st -for /F %%o in (_hbovmmt.txt) do ( - del %%o -) -del _hbovmmt.txt -rmdir vmmt +for /F %%o in (_hbomt.txt) do ( del %%o ) +del _hbomt.txt +rmdir _mt -for /F %%o in (_hbocore.txt) do ( - del %%o -) -del _hbocore.txt +for /F %%o in (_hboneut.txt) do ( del %%o ) +del _hboneut.txt cd .. rmdir _dll @@ -110,109 +113,118 @@ goto END if not "%HB_COMPILER%" == "bcc32" goto NOT_BCC32 -rem Generating Harbour .dll for Borland C/C++ +echo Making .dlls for %HB_COMPILER%... md _dll cd _dll -echo. c0d32.obj +> _hball.txt -echo. c0d32.obj +> _hballvm.txt +echo. c0d32.obj +> _hballst.txt +echo. c0d32.obj +> _hballmt.txt -rem ; Extract core objects -echo.> _hbocore.txt +rem ; Extract neutral objects +echo.> _hboneut.txt for %%f in (%HB_DLL_LIBS%) do ( - echo Processing library: %%f - tlib "%HB_LIB_INSTALL%\%%f.lib", _hboraw.txt > nul - echo.> _hboraw2.txt - for /F "tokens=1,2" %%f in (_hboraw.txt) do ( - if "%%g" == "size" ( - echo %%f.obj >> _hboraw2.txt + if exist "%HB_LIB_INSTALL%\%%f.lib" ( + echo Processing library: %%f + tlib "%HB_LIB_INSTALL%\%%f.lib", _hboraw.txt > nul + echo.> _hboraw2.txt + for /F "tokens=1,2" %%f in (_hboraw.txt) do ( + if "%%g" == "size" ( + echo %%f.obj >> _hboraw2.txt + ) ) - ) - del _hboraw.txt - for /F %%p in (_hboraw2.txt) do ( - tlib "%HB_LIB_INSTALL%\%%f.lib" * %%p > nul - echo %%p +>> _hball.txt - echo %%p +>> _hballvm.txt - echo %%p>> _hbocore.txt - ) - del _hboraw2.txt + del _hboraw.txt + for /F %%p in (_hboraw2.txt) do ( + tlib "%HB_LIB_INSTALL%\%%f.lib" * %%p > nul + echo %%p +>> _hballst.txt + echo %%p +>> _hballmt.txt + echo %%p>> _hboneut.txt + ) + del _hboraw2.txt + ) else ( echo Library not found: %HB_LIB_INSTALL%\%%f.lib ) ) -md vm -cd vm -set HB_DLL_LIBS=hbvm -rem ; Extract VM objects -echo.> ..\_hbovm.txt -for %%f in (%HB_DLL_LIBS%) do ( - echo Processing library: %%f - tlib "%HB_LIB_INSTALL%\%%f.lib", _hboraw.txt > nul - echo.> _hboraw2.txt - for /F "tokens=1,2" %%f in (_hboraw.txt) do ( - if "%%g" == "size" ( - echo %%f.obj >> _hboraw2.txt +md _st +cd _st +rem ; Extract ST objects +echo.> ..\_hbost.txt +for %%f in (%HB_DLL_LIBS_ST%) do ( + if exist "%HB_LIB_INSTALL%\%%f.lib" ( + echo Processing library: %%f + tlib "%HB_LIB_INSTALL%\%%f.lib", _hboraw.txt > nul + echo.> _hboraw2.txt + for /F "tokens=1,2" %%f in (_hboraw.txt) do ( + if "%%g" == "size" ( + echo %%f.obj >> _hboraw2.txt + ) ) - ) - del _hboraw.txt - for /F %%p in (_hboraw2.txt) do ( - tlib "%HB_LIB_INSTALL%\%%f.lib" * %%p > nul - echo vm\%%p +>> ..\_hball.txt - echo vm\%%p>> ..\_hbovm.txt - ) - del _hboraw2.txt + del _hboraw.txt + for /F %%p in (_hboraw2.txt) do ( + if not "%%p" == "maindll.obj" ( + if not "%%p" == "maindllp.obj" ( + tlib "%HB_LIB_INSTALL%\%%f.lib" * %%p > nul + echo _st\%%p +>> ..\_hballst.txt + echo _st\%%p>> ..\_hbost.txt + ) + ) + ) + del _hboraw2.txt + ) else ( echo Library not found: %HB_LIB_INSTALL%\%%f.lib ) ) cd .. -md vmmt -cd vmmt -set HB_DLL_LIBS=hbvmmt -rem ; Extract VM (MT) objects -echo.> ..\_hbovmmt.txt -for %%f in (%HB_DLL_LIBS%) do ( - echo Processing library: %%f - tlib "%HB_LIB_INSTALL%\%%f.lib", _hboraw.txt > nul - echo.> _hboraw2.txt - for /F "tokens=1,2" %%f in (_hboraw.txt) do ( - if "%%g" == "size" ( - echo %%f.obj >> _hboraw2.txt +md _mt +cd _mt +rem ; Extract MT objects +echo.> ..\_hbomt.txt +for %%f in (%HB_DLL_LIBS_MT%) do ( + if exist "%HB_LIB_INSTALL%\%%f.lib" ( + echo Processing library: %%f + tlib "%HB_LIB_INSTALL%\%%f.lib", _hboraw.txt > nul + echo.> _hboraw2.txt + for /F "tokens=1,2" %%f in (_hboraw.txt) do ( + if "%%g" == "size" ( + echo %%f.obj >> _hboraw2.txt + ) ) - ) - del _hboraw.txt - for /F %%p in (_hboraw2.txt) do ( - tlib "%HB_LIB_INSTALL%\%%f.lib" * %%p > nul - echo vmmt\%%p +>> ..\_hballvm.txt - echo vmmt\%%p>> ..\_hbovmmt.txt - ) - del _hboraw2.txt + del _hboraw.txt + for /F %%p in (_hboraw2.txt) do ( + if not "%%p" == "maindll.obj" ( + if not "%%p" == "maindllp.obj" ( + tlib "%HB_LIB_INSTALL%\%%f.lib" * %%p > nul + echo _mt\%%p +>> ..\_hballmt.txt + echo _mt\%%p>> ..\_hbomt.txt + ) + ) + ) + del _hboraw2.txt + ) else ( echo Library not found: %HB_LIB_INSTALL%\%%f.lib ) ) cd .. -echo. , "%HB_BIN_INSTALL%\harbour-%HB_DLL_VERSION%-b32.dll" ,, cw32mt.lib import32.lib >> _hball.txt -echo. , "%HB_BIN_INSTALL%\harbourvm-%HB_DLL_VERSION%-b32.dll",, cw32mt.lib import32.lib >> _hballvm.txt +set _DST_NAME_ST=%HB_BIN_INSTALL%\harbour-%HB_DLL_VERSION%-b32.dll +set _DST_NAME_MT=%HB_BIN_INSTALL%\harbourmt-%HB_DLL_VERSION%-b32.dll -ilink32 -Gn -C -aa -Tpd -Gi -x c0d32.obj @_hball.txt > nul -ilink32 -Gn -C -aa -Tpd -Gi -x c0d32.obj @_hballvm.txt > nul +echo. , "%_DST_NAME_ST%",, cw32mt.lib import32.lib >> _hballst.txt +echo. , "%_DST_NAME_ST%",, cw32mt.lib import32.lib >> _hballmt.txt -del _hball.txt -del _hballvm.txt +echo Making %_DST_NAME_ST%... && ilink32 -Gn -C -aa -Tpd -Gi -x c0d32.obj @_hballst.txt > nul +echo Making %_DST_NAME_MT%... && ilink32 -Gn -C -aa -Tpd -Gi -x c0d32.obj @_hballmt.txt > nul + +del _hballst.txt +del _hballmt.txt rem ; Cleanup -for /F %%o in (_hbovm.txt) do ( - del %%o -) -del _hbovm.txt -rmdir vm +for /F %%o in (_hbost.txt) do ( del %%o ) +del _hbost.txt +rmdir _st -for /F %%o in (_hbovmmt.txt) do ( - del %%o -) -del _hbovmmt.txt -rmdir vmmt +for /F %%o in (_hbomt.txt) do ( del %%o ) +del _hbomt.txt +rmdir _mt -for /F %%o in (_hbocore.txt) do ( - del %%o -) -del _hbocore.txt +for /F %%o in (_hboneut.txt) do ( del %%o ) +del _hboneut.txt cd .. rmdir _dll diff --git a/harbour/bin/postinst.bat b/harbour/bin/postinst.bat index 95e06942c6..28c68995a2 100644 --- a/harbour/bin/postinst.bat +++ b/harbour/bin/postinst.bat @@ -18,6 +18,8 @@ goto inst_%HB_ARCHITECTURE% :inst_win rem Windows post install part +if "%HB_DLL%" == "yes" call %~dp0hb-mkdll.bat + echo @"%%~dp0hbmk2.exe" -hbcc %%*> %HB_BIN_INSTALL%\hbcc.bat echo @"%%~dp0hbmk2.exe" -hbcmp %%*> %HB_BIN_INSTALL%\hbcmp.bat echo @"%%~dp0hbmk2.exe" -hblnk %%*> %HB_BIN_INSTALL%\hblnk.bat diff --git a/harbour/config/win/gcc.cf b/harbour/config/win/gcc.cf index 57d280101b..62bdc8bee8 100644 --- a/harbour/config/win/gcc.cf +++ b/harbour/config/win/gcc.cf @@ -13,7 +13,7 @@ CC = gcc CC_IN = -c CC_OUT = -o CPPFLAGS = -I. -I$(HB_INC_COMPILE) -CFLAGS = -Wall -W -O3 -march=i586 +CFLAGS = -Wall -W -O3 -march=i586 -mtune=pentiumpro LD = gcc LD_OUT = -o diff --git a/harbour/config/win/mingw.cf b/harbour/config/win/mingw.cf index 9af3e549d4..0b6d2a8a63 100644 --- a/harbour/config/win/mingw.cf +++ b/harbour/config/win/mingw.cf @@ -13,7 +13,7 @@ CC = $(CCPREFIX)gcc CC_IN = -c CC_OUT = -o CPPFLAGS = -I. -I$(HB_INC_COMPILE) -CFLAGS = -Wall -W -O3 -march=i586 +CFLAGS = -Wall -W -O3 -march=i586 -mtune=pentiumpro LD = $(CCPREFIX)gcc LD_OUT = -o diff --git a/harbour/contrib/hbcurl/hbcurl.c b/harbour/contrib/hbcurl/hbcurl.c index 2a346acd97..9c8718e8f6 100644 --- a/harbour/contrib/hbcurl/hbcurl.c +++ b/harbour/contrib/hbcurl/hbcurl.c @@ -71,8 +71,8 @@ /* NOTE: Harbour requires libcurl 7.17.0 or upper. This was the version where curl_easy_setopt() started to make copies of passed strings, which we currently require. - Update: This requirement is now sorted out by local string - buffering logic used with pre-7.17.0 versions of + Update: This requirement is now sorted out by local string + buffering logic used with pre-7.17.0 versions of libcurl. [vszakats] */ @@ -130,7 +130,7 @@ static HB_HASH_FUNC( hb_curl_HashKey ) /* ULONG func( void * Value, void * Ca { ULONG ulSum = 0; char * szName = ( char * ) Value; - + while( *szName ) ulSum += *szName++; @@ -1671,7 +1671,7 @@ HB_FUNC( CURL_EASY_GETINFO ) break; case HB_CURLINFO_CERTINFO: #if LIBCURL_VERSION_NUM >= 0x071301 - res = HB_CURL_EASY_GETINFO( hb_curl, CURLINFO_CERTINFO, &ret_ptr ); + res = HB_CURL_EASY_GETINFO( hb_curl, CURLINFO_CERTINFO, ( struct curl_slist * ) &ret_ptr ); #endif type = HB_CURL_INFO_TYPE_PTR; break; diff --git a/harbour/source/vm/Makefile b/harbour/source/vm/Makefile index 836d3b7edf..9125861dd4 100644 --- a/harbour/source/vm/Makefile +++ b/harbour/source/vm/Makefile @@ -14,6 +14,7 @@ ifeq ($(HB_ARCHITECTURE),win) DIRS = mainstd mainwin else C_MAIN = mainstd.c mainwin.c + DIRS = mainstd mainwin endif endif else diff --git a/harbour/utils/hbmk2/hbmk2.prg b/harbour/utils/hbmk2/hbmk2.prg index 83ace1a050..93b7212396 100644 --- a/harbour/utils/hbmk2/hbmk2.prg +++ b/harbour/utils/hbmk2/hbmk2.prg @@ -221,6 +221,8 @@ FUNCTION Main( ... ) LOCAL cObjExt LOCAL cLibPathPrefix LOCAL cLibPathSep + LOCAL cDynLibNamePrefix + LOCAL cDynLibExt LOCAL cCommand LOCAL cOpt_CompC @@ -235,6 +237,8 @@ FUNCTION Main( ... ) LOCAL lNOHBP LOCAL lSysLoc LOCAL cSelfCOMP + LOCAL cPrefix + LOCAL cPostfix LOCAL lStopAfterHarbour := .F. LOCAL lStopAfterCComp := .F. @@ -365,16 +369,21 @@ FUNCTION Main( ... ) /* Setup architecture dependent data */ DO CASE - CASE t_cARCH $ "bsd|hpux|sunos" .OR. t_cARCH == "darwin" /* Separated to avoid match with 'win' */ - aCOMPSUP := { "gcc" } + CASE t_cARCH $ "bsd|hpux|sunos|linux" .OR. t_cARCH == "darwin" /* Separated to avoid match with 'win' */ + IF t_cARCH == "linux" + aCOMPSUP := { "gcc", "gpp", "owatcom", "mingw", "mingwce" } + ELSE + aCOMPSUP := { "gcc" } + ENDIF cBin_CompPRG := "harbour" s_aLIBHBGT := { "gttrm", "gtxwc" } t_cGTDEFAULT := "gttrm" - CASE t_cARCH == "linux" - aCOMPSUP := { "gcc", "gpp", "owatcom", "mingw", "mingwce" } - cBin_CompPRG := "harbour" - s_aLIBHBGT := { "gttrm", "gtxwc" } - t_cGTDEFAULT := "gtstd" + cDynLibNamePrefix := "lib" + SWITCH t_cARCH + CASE "darwin" ; cDynLibExt := ".dylib" ; EXIT + CASE "hpux" ; cDynLibExt := ".sl" ; EXIT + OTHERWISE ; cDynLibExt := ".so" + ENDSWITCH CASE t_cARCH == "dos" aCOMPDET := { { {|| FindInPath( "gcc" ) != NIL }, "djgpp" },; { {|| FindInPath( "wpp386" ) != NIL }, "owatcom" } } /* TODO: Add full support for wcc386 */ @@ -382,6 +391,8 @@ FUNCTION Main( ... ) cBin_CompPRG := "harbour.exe" s_aLIBHBGT := { "gtdos" } t_cGTDEFAULT := "gtdos" + cDynLibNamePrefix := "" + cDynLibExt := "" CASE t_cARCH == "os2" aCOMPDET := { { {|| FindInPath( "gcc" ) != NIL }, "gcc" },; { {|| FindInPath( "wpp386" ) != NIL }, "owatcom" },; /* TODO: Add full support for wcc386 */ @@ -390,6 +401,8 @@ FUNCTION Main( ... ) cBin_CompPRG := "harbour.exe" s_aLIBHBGT := { "gtos2" } t_cGTDEFAULT := "gtos2" + cDynLibNamePrefix := "" + cDynLibExt := ".dll" CASE t_cARCH == "win" /* Order is significant. owatcom also keeps a cl.exe in it's binary dir. */ @@ -406,6 +419,8 @@ FUNCTION Main( ... ) cBin_CompPRG := "harbour.exe" s_aLIBHBGT := { "gtwin", "gtwvt", "gtgui" } t_cGTDEFAULT := "gtwin" + cDynLibNamePrefix := "" + cDynLibExt := ".dll" OTHERWISE OutErr( "hbmk: Error: HB_ARCHITECTURE value unknown: " + t_cARCH + hb_osNewLine() ) PauseForKey() @@ -741,14 +756,15 @@ FUNCTION Main( ... ) @s_lRUN,; @s_cGT ) - CASE Lower( FN_ExtGet( cParam ) ) == ".prg" ; AAdd( s_aPRG , PathSepToTarget( cParam ) ) ; DEFAULT s_cFIRST TO PathSepToSelf( cParam ) - CASE Lower( FN_ExtGet( cParam ) ) == ".rc" ; AAdd( s_aRESSRC , PathSepToTarget( cParam ) ) - CASE Lower( FN_ExtGet( cParam ) ) == ".res" ; AAdd( s_aRESCMP , PathSepToTarget( cParam ) ) - CASE Lower( FN_ExtGet( cParam ) ) == ".a" ; AAdd( s_aOBJA , PathSepToTarget( cParam ) ) - CASE Lower( FN_ExtGet( cParam ) ) $ ".o|.obj" ; AAdd( s_aOBJUSER, PathSepToTarget( cParam ) ) ; DEFAULT s_cFIRST TO PathSepToSelf( cParam ) - CASE Lower( FN_ExtGet( cParam ) ) $ ".c|.cpp" ; AAdd( s_aC , PathSepToTarget( cParam ) ) ; DEFAULT s_cFIRST TO PathSepToSelf( cParam ) - CASE Lower( FN_ExtGet( cParam ) ) $ ".lib" ; AAddNotEmpty( s_aLIBUSER, PathSepToTarget( ArchCompFilter( cParam ) ) ) - OTHERWISE ; AAdd( s_aPRG , PathSepToTarget( cParam ) ) ; DEFAULT s_cFIRST TO PathSepToSelf( cParam ) + CASE Lower( FN_ExtGet( cParam ) ) == ".prg" ; AAdd( s_aPRG , PathSepToTarget( cParam ) ) ; DEFAULT s_cFIRST TO PathSepToSelf( cParam ) + CASE Lower( FN_ExtGet( cParam ) ) == ".rc" ; AAdd( s_aRESSRC , PathSepToTarget( cParam ) ) + CASE Lower( FN_ExtGet( cParam ) ) == ".res" ; AAdd( s_aRESCMP , PathSepToTarget( cParam ) ) + CASE Lower( FN_ExtGet( cParam ) ) == ".a" ; AAdd( s_aOBJA , PathSepToTarget( cParam ) ) + CASE Lower( FN_ExtGet( cParam ) ) $ ".o|.obj" ; AAdd( s_aOBJUSER, PathSepToTarget( cParam ) ) ; DEFAULT s_cFIRST TO PathSepToSelf( cParam ) + CASE Lower( FN_ExtGet( cParam ) ) $ ".c|.cpp" ; AAdd( s_aC , PathSepToTarget( cParam ) ) ; DEFAULT s_cFIRST TO PathSepToSelf( cParam ) + CASE Lower( FN_ExtGet( cParam ) ) == ".lib" .OR. ; + Lower( FN_ExtGet( cParam ) ) == cDynLibExt ; AAddNotEmpty( s_aLIBUSER, PathSepToTarget( ArchCompFilter( cParam ) ) ) + OTHERWISE ; AAdd( s_aPRG , PathSepToTarget( cParam ) ) ; DEFAULT s_cFIRST TO PathSepToSelf( cParam ) ENDCASE NEXT @@ -761,9 +777,10 @@ FUNCTION Main( ... ) /* If -o with full name wasn't specified, let's make it the first source file specified. */ - DEFAULT s_cPROGNAME TO s_cFIRST + DEFAULT s_cPROGNAME TO FN_NameGet( s_cFIRST ) - IF t_cCOMP $ "mingwce|poccce" + IF t_cCOMP == "mingwce" .OR. ; + t_cCOMP == "poccce" t_cGTDEFAULT := "gtwvt" ENDIF @@ -789,19 +806,25 @@ FUNCTION Main( ... ) s_cPROGNAME := FN_ExtSet( s_cPROGNAME ) ENDIF + IF lSysLoc + cPrefix := PathNormalize( s_cHB_LIB_INSTALL ) + ELSE + cPrefix := DirAddPathSep( s_cHB_LIB_INSTALL ) + ENDIF +#if 1 + cPostfix := "" + HB_SYMBOL_UNUSED( cDL_Version ) +#else + cPostfix := "-" + cDL_Version +#endif + DO CASE - CASE t_cARCH $ "bsd|linux|sunos" - s_aLIBSHARED := { iif( s_lMT, "harbourmt-" + cDL_Version + ".so",; - "harbour-" + cDL_Version + ".so" ) } - CASE t_cARCH == "hpux" - s_aLIBSHARED := { iif( s_lMT, "harbourmt-" + cDL_Version + ".sl",; - "harbour-" + cDL_Version + ".sl" ) } - CASE t_cARCH == "darwin" - s_aLIBSHARED := { iif( s_lMT, "harbourmt-" + cDL_Version + ".dylib",; - "harbour-" + cDL_Version + ".dylib" ) } + CASE t_cARCH $ "bsd|linux|hpux|sunos" .OR. t_cARCH == "darwin" /* Separated to avoid match with 'win' */ + s_aLIBSHARED := { iif( s_lMT, cPrefix + cDynLibNamePrefix + "harbourmt" + cPostfix + cDynLibExt,; + cPrefix + cDynLibNamePrefix + "harbour" + cPostfix + cDynLibExt ) } CASE t_cARCH $ "os2|win" - s_aLIBSHARED := { iif( s_lMT, "harbourmt",; - "harbour" ) } + s_aLIBSHARED := { iif( s_lMT, cDynLibNamePrefix + "harbourmt",; + cDynLibNamePrefix + "harbour" ) } OTHERWISE s_aLIBSHARED := NIL ENDCASE @@ -1173,7 +1196,7 @@ FUNCTION Main( ... ) ENDIF CASE t_cCOMP == "icc" - cLibPrefix := "" + cLibPrefix := NIL cLibExt := ".lib" cObjExt := ".obj" cLibPathPrefix := NIL /* TODO */ @@ -1349,7 +1372,7 @@ FUNCTION Main( ... ) s_cGT != NIL .OR. ; s_lFMSTAT != NIL - fhnd := hb_FTempCreateEx( @s_cCSTUB, ".", "hbsc_", ".c" ) + fhnd := hb_FTempCreateEx( @s_cCSTUB, NIL, "hbsc_", ".c" ) IF fhnd != F_ERROR /* NOTE: This has to be kept synced with Harbour HB_IMPORT values. */ @@ -1428,7 +1451,7 @@ FUNCTION Main( ... ) FClose( fhnd ) ELSE OutErr( "hbmk: Warning: Stub helper .c program couldn't be created." + hb_osNewLine() ) - AEval( ListCook( s_aPRG, NIL, ".c" ), {|tmp| FErase( tmp ) } ) + AEval( ListDirExt( s_aPRG, "", ".c" ), {|tmp| FErase( tmp ) } ) PauseForKey() RETURN 5 ENDIF @@ -1454,17 +1477,9 @@ FUNCTION Main( ... ) /* Merge lib lists. */ s_aLIB := ArrayAJoin( { s_aLIBHB, s_aLIBUSER, s_aLIB3RD, s_aLIBSYS } ) /* Dress lib names. */ - s_aLIB := ListCook( s_aLIB, cLibPrefix, cLibExt ) - /* Strip 'lib' prefix when the target is gcc family. */ - IF t_cCOMP $ "gcc|gpp|mingw|djgpp|rsxnt|rsx32" - FOR EACH tmp IN s_aLIB - IF Left( tmp, 3 ) == "lib" - tmp := SubStr( tmp, 4 ) - ENDIF - NEXT - ENDIF + s_aLIB := ListCookLib( s_aLIB, cDynLibExt, cLibPrefix, cLibExt ) /* Dress obj names. */ - s_aOBJ := ListCook( ArrayJoin( s_aPRG, s_aC ), NIL, cObjExt ) + s_aOBJ := ListDirExt( ArrayJoin( s_aPRG, s_aC ), "", cObjExt ) s_aOBJUSER := ListCook( s_aOBJUSER, NIL, cObjExt ) nErrorLevel := 0 @@ -1476,7 +1491,7 @@ FUNCTION Main( ... ) /* Compiling */ /* Order is significant */ - cOpt_CompC := StrTran( cOpt_CompC, "{LC}" , ArrayToList( ArrayJoin( ListCook( s_aPRG, NIL, ".c" ), s_aC ) ) ) + cOpt_CompC := StrTran( cOpt_CompC, "{LC}" , ArrayToList( ArrayJoin( ListDirExt( s_aPRG, "", ".c" ), s_aC ) ) ) cOpt_CompC := StrTran( cOpt_CompC, "{LO}" , ArrayToList( ListCook( s_aOBJUSER, cObjPrefix ) ) ) cOpt_CompC := StrTran( cOpt_CompC, "{LA}" , ArrayToList( s_aOBJA ) ) cOpt_CompC := StrTran( cOpt_CompC, "{LL}" , ArrayToList( s_aLIB ) ) @@ -1580,7 +1595,7 @@ FUNCTION Main( ... ) IF ! Empty( s_cCSTUB ) FErase( s_cCSTUB ) ENDIF - AEval( ListCook( s_aPRG, NIL, ".c" ), {|tmp| FErase( tmp ) } ) + AEval( ListDirExt( s_aPRG, "", ".c" ), {|tmp| FErase( tmp ) } ) IF ! lStopAfterCComp AEval( s_aOBJ, {|tmp| FErase( tmp ) } ) ENDIF @@ -1735,17 +1750,61 @@ STATIC FUNCTION AAddNotEmpty( aArray, xItem ) RETURN aArray -/* Append optional prefix and optional extension to all members */ -STATIC FUNCTION ListCook( arraySrc, cPrefix, cExt ) +STATIC FUNCTION ListDirExt( arraySrc, cDirNew, cExtNew ) LOCAL array := AClone( arraySrc ) - LOCAL tmp + LOCAL cFileName + LOCAL cDir, cName, cExt - DEFAULT cPrefix TO "" + FOR EACH cFileName IN array + hb_FNameSplit( cFileName, @cDir, @cName, @cExt ) + IF cDirNew != NIL + cDir := cDirNew + ENDIF + IF cExtNew != NIL + cExt := cExtNew + ENDIF + cFileName := hb_FNameMerge( cDir, cName, cExt ) + NEXT - FOR tmp := 1 TO Len( array ) - array[ tmp ] := cPrefix + array[ tmp ] - IF ISCHARACTER( cExt ) - array[ tmp ] := FN_ExtSet( array[ tmp ], cExt ) + RETURN array + +/* Forms the list of libs as to appear on the command line */ +STATIC FUNCTION ListCookLib( arraySrc, cDynLibExt, cPrefix, cExtNew ) + LOCAL array := AClone( arraySrc ) + LOCAL cDir, cName, cExt + LOCAL cLibName + + FOR EACH cLibName IN array + hb_FNameSplit( cLibName, @cDir, @cName, @cExt ) + IF !( cExt == cDynLibExt ) + IF cExtNew != NIL + cExt := cExtNew + ENDIF + IF t_cCOMP $ "gcc|gpp|mingw|djgpp|rsxnt|rsx32" + IF Left( cName, 3 ) == "lib" + cName := SubStr( cName, 4 ) + ENDIF + ENDIF + IF cPrefix != NIL + cName := cPrefix + cName + ENDIF + cLibName := hb_FNameMerge( cDir, cName, cExtNew ) + ENDIF + NEXT + + RETURN array + +/* Append optional prefix and optional extension to all members */ +STATIC FUNCTION ListCook( arraySrc, cPrefix, cExtNew ) + LOCAL array := AClone( arraySrc ) + LOCAL cItem + + FOR EACH cItem IN array + IF cPrefix != NIL + cItem := cPrefix + cItem + ENDIF + IF cExtNew != NIL + cItem := FN_ExtSet( cItem, cExtNew ) ENDIF NEXT @@ -1778,6 +1837,34 @@ STATIC FUNCTION ListToArray( cList ) RETURN array +/* NOTE: Can hurt if there are symlinks on the way. */ +/* NOTE: This function also add an ending separator. */ +STATIC FUNCTION PathNormalize( cPath ) + LOCAL nLastSep + LOCAL nNextSep + + cPath := DirAddPathSep( cPath ) + + nLastSep := 0 + DO WHILE ( nNextSep := hb_At( hb_osPathSeparator(), cPath, nLastSep + 1 ) ) > 0 + SWITCH SubStr( cPath, nLastSep + 1, nNextSep - nLastSep - 1 ) + CASE ".." + nLastSep := hb_Rat( hb_osPathSeparator(), cPath, 1, nLastSep - 1 ) + IF nLastSep == 0 + /* Underflow. Return where we are. */ + RETURN cPath + ENDIF + CASE "." + CASE "" + cPath := Left( cPath, nLastSep ) + SubStr( cPath, nNextSep + 1 ) + EXIT + OTHERWISE + nLastSep := nNextSep + ENDSWITCH + ENDDO + + RETURN cPath + STATIC FUNCTION PathSepToSelf( cFileName ) #if defined( __PLATFORM__WINDOWS ) .OR. ; defined( __PLATFORM__DOS ) .OR. ;