2009-02-18 13:14 UTC+0100 Viktor Szakats (harbour.01 syenar hu)

* utils/hbmk/hbmk2.prg
    + Added new TODOs.
    + Now using GTCGI as the GT.
    + Added -info option to enable informational output.
      (currently this is the default for testing period)
    + Added -arch=<arch> command line option. Same as HB_ARCHITECTURE.
      Added -comp=<comp> command line option. Same as HB_COMPILER.
      envvars are kept for compatibility.
    + Added -hblnk option to give plave for hblnk script behaviour
      emulation.
    * Changed -cc, -cmp options to -hbcc, -hbcmp respecitvely.
    + Changed -hbcc, -hbcmp, -hblnk switches to turn off information
      output and turn on quiet mode by default.
    + Added autodetection of architecture when unique to
      architecture compiler is choosen manually. IOW, when
      -comp=msvc|mingw|pocc|dmc|xcc is passed the architecture will
      be set to win automatically. When -comp=djgpp is used,
      dos will be selected.
    ! Fixed ordering of compiler autodetection because f.e. owatcom
      bin dir holds a 'cl.exe', which made hbmk2 falsely detect msvc.
    + Added trick which I'm not sure I like, and may cause problems
      and seemingly unpredictable behaviour, but could also help
      in some environments where multiple compilers are setup in
      parallel (this isn't a recommended scenario for various other
      reasons, so maybe we shouldn't support it further). So from
      now on the compiler autodetection will first look for the
      compiler used to build hbmk2.exe, and check for the rest
      afterwards. This feature is turned off for msvc builds of
      hbmk2.exe because it breaks owatcom autodetection.
    + Added possibility to pass a plain dir by using -odir[\|/]
      switch. The final name will be determined by first input
      file name, if this one also has a dir, -o option will be
      ignored. Added logic to handle separator differences, this
      wasn't tested to a great deal.
    + Added -Wl,--start-group support for linux/gcc|gpp, win/mingw,
      dos/djgpp.
    ! Fixed owatcom support to setup library paths.
    ! Fixed linux/owatcom to use link script.
    * Some adjustments to win/owatcom C compiler settings. I guess
      the ones in .cf should also need a cleanup.
    * Few minor indentation problems fixed.
    ! C compiler and linker scripts now got an extension in
      the generated temp filename to make some of them happy
      (owatcom in this case). .cpl is used for compiler scripts,
      .lnk for linker ones.
    + Compiler autodetection now also looks in hbmk2 executable
      dir before looking into the PATH.
    ! Link script content was wrong due to typo.
    ! Fixed problem with library paths being wrong (doubly
      decorated) in the link command. This may also fix some
      problems with double extensions and final .c file cleanup.
    ! Fixed to add hbdebug lib when building in shared mode.
    ! Fixed typo in automatically adding './' on *nix systems.
    ; Please test, I definitely couldn't retest all scenaros
      after all these changes.

  * bin/postinst.bat
    * Adapted change in mode modifier switches, also
      added new -hblnk one.
  * utils/hbmk/examples/winapi.hbp
    + Added mapi32.
  + utils/hbmk/examples/contrib.hbp
    + Added .hbp file for popular and portable only contribs.
  * config/win/owatcom.cf
    - Removed unnecessary system libs.
  * contrib/hbvpdf/hbvpdft.prg
    * hbwhat32 -> hbwhat in comment.
  * contrib/hbwin/wapi_commctrl.c
  * contrib/hbwin/wapi_winuser.c
    ! Fixed harbour-project page link in header.
  * contrib/hbwin/hbwapi.h
    * Formatting (indenting the whole file content inside
      self-guard isn't necessary.)
This commit is contained in:
Viktor Szakats
2009-02-19 12:46:19 +00:00
parent faf7a49cff
commit a2eb6c9690
10 changed files with 487 additions and 231 deletions

View File

@@ -8,6 +8,81 @@
2009-12-31 13:59 UTC+0100 Foo Bar (foo.bar foobar.org)
*/
2009-02-18 13:14 UTC+0100 Viktor Szakats (harbour.01 syenar hu)
* utils/hbmk/hbmk2.prg
+ Added new TODOs.
+ Now using GTCGI as the GT.
+ Added -info option to enable informational output.
(currently this is the default for testing period)
+ Added -arch=<arch> command line option. Same as HB_ARCHITECTURE.
Added -comp=<comp> command line option. Same as HB_COMPILER.
envvars are kept for compatibility.
+ Added -hblnk option to give plave for hblnk script behaviour
emulation.
* Changed -cc, -cmp options to -hbcc, -hbcmp respecitvely.
+ Changed -hbcc, -hbcmp, -hblnk switches to turn off information
output and turn on quiet mode by default.
+ Added autodetection of architecture when unique to
architecture compiler is choosen manually. IOW, when
-comp=msvc|mingw|pocc|dmc|xcc is passed the architecture will
be set to win automatically. When -comp=djgpp is used,
dos will be selected.
! Fixed ordering of compiler autodetection because f.e. owatcom
bin dir holds a 'cl.exe', which made hbmk2 falsely detect msvc.
+ Added trick which I'm not sure I like, and may cause problems
and seemingly unpredictable behaviour, but could also help
in some environments where multiple compilers are setup in
parallel (this isn't a recommended scenario for various other
reasons, so maybe we shouldn't support it further). So from
now on the compiler autodetection will first look for the
compiler used to build hbmk2.exe, and check for the rest
afterwards. This feature is turned off for msvc builds of
hbmk2.exe because it breaks owatcom autodetection.
+ Added possibility to pass a plain dir by using -odir[\|/]
switch. The final name will be determined by first input
file name, if this one also has a dir, -o option will be
ignored. Added logic to handle separator differences, this
wasn't tested to a great deal.
+ Added -Wl,--start-group support for linux/gcc|gpp, win/mingw,
dos/djgpp.
! Fixed owatcom support to setup library paths.
! Fixed linux/owatcom to use link script.
* Some adjustments to win/owatcom C compiler settings. I guess
the ones in .cf should also need a cleanup.
* Few minor indentation problems fixed.
! C compiler and linker scripts now got an extension in
the generated temp filename to make some of them happy
(owatcom in this case). .cpl is used for compiler scripts,
.lnk for linker ones.
+ Compiler autodetection now also looks in hbmk2 executable
dir before looking into the PATH.
! Link script content was wrong due to typo.
! Fixed problem with library paths being wrong (doubly
decorated) in the link command. This may also fix some
problems with double extensions and final .c file cleanup.
! Fixed to add hbdebug lib when building in shared mode.
! Fixed typo in automatically adding './' on *nix systems.
; Please test, I definitely couldn't retest all scenaros
after all these changes.
* bin/postinst.bat
* Adapted change in mode modifier switches, also
added new -hblnk one.
* utils/hbmk/examples/winapi.hbp
+ Added mapi32.
+ utils/hbmk/examples/contrib.hbp
+ Added .hbp file for popular and portable only contribs.
* config/win/owatcom.cf
- Removed unnecessary system libs.
* contrib/hbvpdf/hbvpdft.prg
* hbwhat32 -> hbwhat in comment.
* contrib/hbwin/wapi_commctrl.c
* contrib/hbwin/wapi_winuser.c
! Fixed harbour-project page link in header.
* contrib/hbwin/hbwapi.h
* Formatting (indenting the whole file content inside
self-guard isn't necessary.)
2009-02-19 12:49 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/source/vm/thread.c
! fixed the typo in order of sending signals in _hb_thread_cond_signal()
@@ -16,7 +91,7 @@
2009-02-18 17:05 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com)
* harbour/contrib/gtwvg/wvgscrlb.prg
* Disabled structure support for time being as
* Disabled structure support for time being as
build process is unable to locate cstruct.c, etc. headers.
Viktor?

View File

@@ -17,9 +17,9 @@ goto inst_%HB_ARCHITECTURE%
:inst_win
rem Windows post install part
echo @"%%~dp0hbmk2.exe" -cc %%*> %HB_BIN_INSTALL%\hbcc.bat
echo @"%%~dp0hbmk2.exe" -cmp %%*> %HB_BIN_INSTALL%\hbcmp.bat
echo @"%%~dp0hbmk2.exe" %%*> %HB_BIN_INSTALL%\hblnk.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
goto end
@@ -27,9 +27,9 @@ goto end
:inst_dos
rem DOS post install part
echo @hbmk2.exe -cc %%1 %%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9> %HB_BIN_INSTALL%\hbcc.bat
echo @hbmk2.exe -cmp %%1 %%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9> %HB_BIN_INSTALL%\hbcmp.bat
echo @hbmk2.exe %%1 %%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9> %HB_BIN_INSTALL%\hblnk.bat
echo @hbmk2.exe -hbcc %%1 %%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9> %HB_BIN_INSTALL%\hbcc.bat
echo @hbmk2.exe -hbcmp %%1 %%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9> %HB_BIN_INSTALL%\hbcmp.bat
echo @hbmk2.exe -hblnk %%1 %%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9> %HB_BIN_INSTALL%\hblnk.bat
goto end
@@ -37,9 +37,9 @@ goto end
:inst_os2
rem OS/2 post install part
echo @hbmk2.exe -cc %%1 %%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9> %HB_BIN_INSTALL%\hbcc.cmd
echo @hbmk2.exe -cmp %%1 %%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9> %HB_BIN_INSTALL%\hbcmp.cmd
echo @hbmk2.exe %%1 %%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9> %HB_BIN_INSTALL%\hblnk.cmd
echo @hbmk2.exe -hbcc %%1 %%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9> %HB_BIN_INSTALL%\hbcc.cmd
echo @hbmk2.exe -hbcmp %%1 %%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9> %HB_BIN_INSTALL%\hbcmp.cmd
echo @hbmk2.exe -hblnk %%1 %%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9> %HB_BIN_INSTALL%\hblnk.cmd
goto end

View File

@@ -54,7 +54,7 @@ $(foreach lib, $(LINKLIBS), $(link_lib))
$(foreach lib, $(RDDLIBS), $(link_lib))
$(foreach lib, $(GTLIBS), $(link_lib))
echo @%watcom%/binnt/wlink.lnk >> __link__.tmp
echo LIB kernel32.lib, user32.lib, wsock32.lib, winspool.lib, oleaut32.lib, uuid.lib, comctl32.lib, mapi32.lib >> __link__.tmp
echo LIB kernel32.lib, user32.lib, wsock32.lib >> __link__.tmp
-$(LD) @__link__.tmp
endef

View File

@@ -4,11 +4,11 @@
//-------------------------\\
//
// Program Cl_Pdf.prg
// Program Cl_Pdf.prg
//
// Original : Victor K. . http://www.ihaveparts.com
//
// Class Code : Pritpal Bedi . http://www.vouchcac.com
// Class Code : Pritpal Bedi . http://www.vouchcac.com
//
//-------------------------\\
@@ -41,13 +41,13 @@
CREATE CLASS tPdf
#ifndef __HARBOUR__
#ifndef __HARBOUR__
EXPORT:
#endif
VAR aReport
#ifndef __HARBOUR__
#ifndef __HARBOUR__
EXPORT:
#endif
@@ -187,7 +187,7 @@ next
::aReport[ DOCLEN ] := 0
cTemp := "%PDF-1.3" + CRLF
::aReport[ DOCLEN ] += len( cTemp )
fwrite( ::aReport[ HANDLE ], cTemp )
RETURN self
@@ -273,7 +273,7 @@ RETURN self
#ifdef __XPP__
METHOD tPdf:Normal()
#else
METHOD Normal()
METHOD Normal()
#endif
local cName := ::GetFontInfo( "NAME" )
@@ -295,7 +295,7 @@ RETURN self
#ifdef __XPP__
METHOD tPdf:Italic()
#else
METHOD Italic()
METHOD Italic()
#endif
local cName := ::GetFontInfo( "NAME" )
@@ -304,7 +304,7 @@ local cName := ::GetFontInfo( "NAME" )
ELSEIF cName = "Helvetica"
::aReport[ FONTNAME ] := 7
ELSE
::aReport[ FONTNAME ] := 11
::aReport[ FONTNAME ] := 11
ENDIF
aadd( ::aReport[ PAGEFONTS ], ::aReport[ FONTNAME ] )
IF ascan( ::aReport[ FONTS ], { |arr| arr[1] == ::aReport[ FONTNAME ] } ) == 0
@@ -317,7 +317,7 @@ RETURN self
#ifdef __XPP__
METHOD tPdf:Bold()
#else
METHOD Bold()
METHOD Bold()
#endif
local cName := ::GetFontInfo( "NAME" )
@@ -341,7 +341,7 @@ RETURN self
#ifdef __XPP__
METHOD tPdf:BoldItalic()
#else
METHOD BoldItalic()
METHOD BoldItalic()
#endif
local cName := ::GetFontInfo( "NAME" )
@@ -365,7 +365,7 @@ RETURN self
#ifdef __XPP__
METHOD tPdf:BookAdd( cTitle, nLevel, nPage, nLine )
#else
METHOD BookAdd( cTitle, nLevel, nPage, nLine )
METHOD BookAdd( cTitle, nLevel, nPage, nLine )
#endif
aadd( ::aReport[ BOOKMARK ], { nLevel, alltrim( cTitle ), 0, 0, 0, 0, 0, 0, nPage, IIF( nLevel == 1, ::aReport[ PAGEY ], ::aReport[ PAGEY ] - nLine * 72 / ::aReport[ LPI ] ) })
@@ -377,7 +377,7 @@ RETURN self
#ifdef __XPP__
METHOD tPdf:BookClose( )
#else
METHOD BookClose( )
METHOD BookClose( )
#endif
::aReport[ BOOKMARK ] := nil
@@ -389,7 +389,7 @@ RETURN self
#ifdef __XPP__
METHOD tPdf:BookOpen( )
#else
METHOD BookOpen( )
METHOD BookOpen( )
#endif
::aReport[ BOOKMARK ] := {}
@@ -401,7 +401,7 @@ RETURN self
#ifdef __XPP__
METHOD tPdf:Box( x1, y1, x2, y2, nBorder, nShade, cUnits, cColor, cId )
#else
METHOD Box( x1, y1, x2, y2, nBorder, nShade, cUnits, cColor, cId )
METHOD Box( x1, y1, x2, y2, nBorder, nShade, cUnits, cColor, cId )
#endif
local cBoxColor
@@ -496,7 +496,7 @@ return nil
#ifdef __XPP__
METHOD tPdf:Center( cString, nRow, nCol, cUnits, lExact, cId )
#else
METHOD Center( cString, nRow, nCol, cUnits, lExact, cId )
METHOD Center( cString, nRow, nCol, cUnits, lExact, cId )
#endif
local nLen, nAt
@@ -528,7 +528,7 @@ RETURN self
#ifdef __XPP__
METHOD tPdf:Close()
#else
METHOD Close()
METHOD Close()
#endif
local nI, cTemp, nCurLevel, nObj1, nLast, nCount, nFirst, nRecno, nBooklen
@@ -674,7 +674,7 @@ RETURN self
#ifdef __XPP__
METHOD tPdf:Image( cFile, nRow, nCol, cUnits, nHeight, nWidth, cId )
#else
METHOD Image( cFile, nRow, nCol, cUnits, nHeight, nWidth, cId )
METHOD Image( cFile, nRow, nCol, cUnits, nHeight, nWidth, cId )
#endif
DEFAULT nRow TO ::aReport[ REPORTLINE ]
@@ -718,7 +718,7 @@ RETURN self
#ifdef __XPP__
METHOD tPdf:Length( cString )
#else
METHOD Length( cString )
METHOD Length( cString )
#endif
local nWidth := 0.00, nI, nLen, nArr, nAdd := ( ::aReport[ FONTNAME ] - 1 ) % 4
@@ -745,7 +745,7 @@ RETURN nWidth
#ifdef __XPP__
METHOD tPdf:NewLine( n )
#else
METHOD NewLine( n )
METHOD NewLine( n )
#endif
DEFAULT n TO 1
@@ -763,7 +763,7 @@ RETURN ::aReport[ REPORTLINE ]
#ifdef __XPP__
METHOD tPdf:NewPage( _cPageSize, _cPageOrient, _nLpi, _cFontName, _nFontType, _nFontSize )
#else
METHOD NewPage( _cPageSize, _cPageOrient, _nLpi, _cFontName, _nFontType, _nFontSize )
METHOD NewPage( _cPageSize, _cPageOrient, _nLpi, _cFontName, _nFontType, _nFontSize )
#endif
@@ -792,7 +792,7 @@ DEFAULT _nFontSize TO ::aReport[ FONTSIZE ]
::DrawHeader()
::aReport[ REPORTLINE ] := 0
::aReport[ REPORTLINE ] := 0
::aReport[ FONTNAMEPREV ] := 0
::aReport[ FONTSIZEPREV ] := 0
@@ -803,7 +803,7 @@ RETURN self
#ifdef __XPP__
METHOD tPdf:PageSize( _cPageSize )
#else
METHOD PageSize( _cPageSize )
METHOD PageSize( _cPageSize )
#endif
local nSize, aSize := { { "LETTER", 8.50, 11.00 }, ;
@@ -847,7 +847,7 @@ RETURN self
#ifdef __XPP__
METHOD tPdf:PageOrient( _cPageOrient )
#else
METHOD PageOrient( _cPageOrient )
METHOD PageOrient( _cPageOrient )
#endif
DEFAULT _cPageOrient TO "P"
@@ -861,7 +861,7 @@ RETURN self
#ifdef __XPP__
METHOD tPdf:PageNumber( n )
#else
METHOD PageNumber( n )
METHOD PageNumber( n )
#endif
DEFAULT n TO 0
@@ -875,7 +875,7 @@ RETURN ::aReport[ REPORTPAGE ]
#ifdef __XPP__
METHOD tPdf:Reverse( cString )
#else
METHOD Reverse( cString )
METHOD Reverse( cString )
#endif
RETURN cString + chr(255)
@@ -885,7 +885,7 @@ RETURN cString + chr(255)
#ifdef __XPP__
METHOD tPdf:RJust( cString, nRow, nCol, cUnits, lExact, cId )
#else
METHOD RJust( cString, nRow, nCol, cUnits, lExact, cId )
METHOD RJust( cString, nRow, nCol, cUnits, lExact, cId )
#endif
local nLen, nAdj := 1.0, nAt
@@ -918,7 +918,7 @@ RETURN self
#ifdef __XPP__
METHOD tPdf:SetFont( _cFont, _nType, _nSize, cId )
#else
METHOD SetFont( _cFont, _nType, _nSize, cId )
METHOD SetFont( _cFont, _nType, _nSize, cId )
#endif
DEFAULT _cFont TO "Times"
@@ -952,7 +952,7 @@ RETURN self
#ifdef __XPP__
METHOD tPdf:SetLPI(_nLpi)
#else
METHOD SetLPI(_nLpi)
METHOD SetLPI(_nLpi)
#endif
local cLpi := alltrim(str(_nLpi))
@@ -969,7 +969,7 @@ RETURN self
#ifdef __XPP__
METHOD tPdf:StringB( cString )
#else
METHOD StringB( cString )
METHOD StringB( cString )
#endif
cString := strtran( cString, "(", "\(" )
@@ -982,7 +982,7 @@ RETURN cString
#ifdef __XPP__
METHOD tPdf:TextCount( cString, nTop, nLeft, nLength, nTab, nJustify, cUnits )
#else
METHOD TextCount( cString, nTop, nLeft, nLength, nTab, nJustify, cUnits )
METHOD TextCount( cString, nTop, nLeft, nLength, nTab, nJustify, cUnits )
#endif
RETURN ::Text( cString, nTop, nLeft, nLength, nTab, nJustify, cUnits, .f. )
@@ -992,7 +992,7 @@ RETURN ::Text( cString, nTop, nLeft, nLength, nTab, nJustify, cUnits, .f. )
#ifdef __XPP__
METHOD tPdf:Text( cString, nTop, nLeft, nLength, nTab, nJustify, cUnits, cColor, lPrint )
#else
METHOD Text( cString, nTop, nLeft, nLength, nTab, nJustify, cUnits, cColor, lPrint )
METHOD Text( cString, nTop, nLeft, nLength, nTab, nJustify, cUnits, cColor, lPrint )
#endif
local cDelim := chr(0)+chr(9)+chr(10)+chr(13)+chr(26)+chr(32)+chr(138)+chr(141)
@@ -1001,7 +1001,7 @@ local lParagraph, nSpace, nNew, nTokenLen, nCRLF, nTokens, nLen
DEFAULT nTab TO -1
DEFAULT cUnits TO "R"
DEFAULT nJustify TO 4
DEFAULT nJustify TO 4
DEFAULT lPrint TO .t.
DEFAULT cColor TO ""
@@ -1111,7 +1111,7 @@ RETURN nLines
#ifdef __XPP__
METHOD tPdf:UnderLine( cString )
#else
METHOD UnderLine( cString )
METHOD UnderLine( cString )
#endif
RETURN cString + chr(254)
@@ -1121,10 +1121,10 @@ RETURN cString + chr(254)
#ifdef __XPP__
METHOD tPdf:OpenHeader( cFile )
#else
METHOD OpenHeader( cFile )
METHOD OpenHeader( cFile )
#endif
local nAt, cCmd
local nAt, cCmd
DEFAULT cFile TO ""
@@ -1134,7 +1134,7 @@ DEFAULT cFile TO ""
at( " ", cFile ) > 0 .or. ;
( at( " ", cFile ) == 0 .and. len( cFile ) > 8 ) .or. ;
( ( nAt := at( ".", cFile )) > 0 .and. len( substr( cFile, nAt + 1 )) > 3 )
cCmd := "copy " + cFile + " temp.tmp > nul"
RunExternal( cCmd )
@@ -1154,7 +1154,7 @@ RETURN self
#ifdef __XPP__
METHOD tPdf:EditOnHeader()
#else
METHOD EditOnHeader()
METHOD EditOnHeader()
#endif
::aReport[ HEADEREDIT ] := .t.
@@ -1167,7 +1167,7 @@ RETURN self
#ifdef __XPP__
METHOD tPdf:EditOffHeader()
#else
METHOD EditOffHeader()
METHOD EditOffHeader()
#endif
::aReport[ HEADEREDIT ] := .f.
@@ -1180,7 +1180,7 @@ RETURN self
#ifdef __XPP__
METHOD tPdf:CloseHeader()
#else
METHOD CloseHeader()
METHOD CloseHeader()
#endif
::aReport[ HEADER ] := {}
@@ -1192,7 +1192,7 @@ RETURN self
#ifdef __XPP__
METHOD tPdf:DeleteHeader( cId )
#else
METHOD DeleteHeader( cId )
METHOD DeleteHeader( cId )
#endif
local nRet := -1, nId
@@ -1211,7 +1211,7 @@ RETURN nRet
#ifdef __XPP__
METHOD tPdf:EnableHeader( cId )
#else
METHOD EnableHeader( cId )
METHOD EnableHeader( cId )
#endif
local nId
@@ -1228,7 +1228,7 @@ RETURN self
#ifdef __XPP__
METHOD tPdf:DisableHeader( cId )
#else
METHOD DisableHeader( cId )
METHOD DisableHeader( cId )
#endif
local nId
@@ -1245,7 +1245,7 @@ RETURN self
#ifdef __XPP__
METHOD tPdf:SaveHeader( cFile )
#else
METHOD SaveHeader( cFile )
METHOD SaveHeader( cFile )
#endif
local cCmd
@@ -1262,7 +1262,7 @@ RETURN self
#ifdef __XPP__
METHOD tPdf:Header( cFunction, cId, arr )
#else
METHOD Header( cFunction, cId, arr )
METHOD Header( cFunction, cId, arr )
#endif
local nId, nI, nLen, nIdLen
@@ -1304,7 +1304,7 @@ RETURN cId
#ifdef __XPP__
METHOD tPdf:DrawHeader()
#else
METHOD DrawHeader()
METHOD DrawHeader()
#endif
local nI, _nFont, _nSize, nLen := len( ::aReport[ HEADER ] )
@@ -1362,7 +1362,7 @@ RETURN self
#ifdef __XPP__
METHOD tPdf:Margins( nTop, nLeft, nBottom )
#else
METHOD Margins( nTop, nLeft, nBottom )
METHOD Margins( nTop, nLeft, nBottom )
#endif
local nI, nLen := len( ::aReport[ HEADER ] ), nTemp, aTemp, nHeight
@@ -1540,7 +1540,7 @@ RETURN self
#ifdef __XPP__
METHOD tPdf:CreateHeader( _file, _size, _orient, _lpi, _width )
#else
METHOD CreateHeader( _file, _size, _orient, _lpi, _width )
METHOD CreateHeader( _file, _size, _orient, _lpi, _width )
#endif
local ;
@@ -1640,7 +1640,7 @@ RETURN self
#ifdef __XPP__
METHOD tPdf:ImageInfo( cFile )
#else
METHOD ImageInfo( cFile )
METHOD ImageInfo( cFile )
#endif
local cTemp := upper(substr( cFile, rat(".", cFile) + 1 )), aTemp := {}
@@ -1657,7 +1657,7 @@ RETURN aTemp
#ifdef __XPP__
METHOD tPdf:TIFFInfo( cFile )
#else
METHOD TIFFInfo( cFile )
METHOD TIFFInfo( cFile )
#endif
local c40 := chr(0)+chr(0)+chr(0)+chr(0)
@@ -1832,7 +1832,7 @@ return aTemp
#ifdef __XPP__
METHOD tPdf:JPEGInfo( cFile )
#else
METHOD JPEGInfo( cFile )
METHOD JPEGInfo( cFile )
#endif
local c255, nAt, nHandle
@@ -1870,7 +1870,7 @@ return aTemp
#ifdef __XPP__
METHOD tPdf:BookCount( nRecno, nCurLevel )
#else
METHOD BookCount( nRecno, nCurLevel )
METHOD BookCount( nRecno, nCurLevel )
#endif
local nTempLevel, nCount := 0, nLen := len( ::aReport[ BOOKMARK ] )
@@ -1893,7 +1893,7 @@ return -1 * nCount
#ifdef __XPP__
METHOD tPdf:BookFirst( nRecno, nCurLevel, nObj )
#else
METHOD BookFirst( nRecno, nCurLevel, nObj )
METHOD BookFirst( nRecno, nCurLevel, nObj )
#endif
local nFirst := 0, nLen := len( ::aReport[ BOOKMARK ] )
@@ -1910,7 +1910,7 @@ return IIF( nFirst == 0, nFirst, nObj + nFirst )
#ifdef __XPP__
METHOD tPdf:BookLast( nRecno, nCurLevel, nObj )
#else
METHOD BookLast( nRecno, nCurLevel, nObj )
METHOD BookLast( nRecno, nCurLevel, nObj )
#endif
local nLast := 0, nLen := len( ::aReport[ BOOKMARK ] )
@@ -1932,7 +1932,7 @@ return IIF( nLast == 0, nLast, nObj + nLast )
#ifdef __XPP__
METHOD tPdf:BookNext( nRecno, nCurLevel, nObj )
#else
METHOD BookNext( nRecno, nCurLevel, nObj )
METHOD BookNext( nRecno, nCurLevel, nObj )
#endif
local nTempLevel, nNext := 0, nLen := len( ::aReport[ BOOKMARK ] )
@@ -1956,7 +1956,7 @@ return IIF( nNext == 0, nNext, nObj + nNext )
#ifdef __XPP__
METHOD tPdf:BookParent( nRecno, nCurLevel, nObj )
#else
METHOD BookParent( nRecno, nCurLevel, nObj )
METHOD BookParent( nRecno, nCurLevel, nObj )
#endif
local nTempLevel
@@ -1977,7 +1977,7 @@ return IIF( nParent == 0, nObj - 1, nObj + nParent )
#ifdef __XPP__
METHOD tPdf:BookPrev( nRecno, nCurLevel, nObj )
#else
METHOD BookPrev( nRecno, nCurLevel, nObj )
METHOD BookPrev( nRecno, nCurLevel, nObj )
#endif
local nTempLevel
@@ -2002,7 +2002,7 @@ return IIF( nPrev == 0, nPrev, nObj + nPrev )
#ifdef __XPP__
METHOD tPdf:CheckLine( nRow )
#else
METHOD CheckLine( nRow )
METHOD CheckLine( nRow )
#endif
IF nRow + ::aReport[ PDFTOP] > ::aReport[ PDFBOTTOM ]
@@ -2017,7 +2017,7 @@ RETURN self
#ifdef __XPP__
METHOD tPdf:GetFontInfo( cParam )
#else
METHOD GetFontInfo( cParam )
METHOD GetFontInfo( cParam )
#endif
local cRet
@@ -2040,7 +2040,7 @@ return cRet
#ifdef __XPP__
METHOD tPdf:M2R( mm )
#else
METHOD M2R( mm )
METHOD M2R( mm )
#endif
return int( ::aReport[ LPI ] * mm / 25.4 )
@@ -2050,7 +2050,7 @@ return int( ::aReport[ LPI ] * mm / 25.4 )
#ifdef __XPP__
METHOD tPdf:M2X( n )
#else
METHOD M2X( n )
METHOD M2X( n )
#endif
return n * 72 / 25.4
@@ -2058,9 +2058,9 @@ return n * 72 / 25.4
//-------------------------\\
#ifdef __XPP__
METHOD tPdf:M2Y( n )
METHOD tPdf:M2Y( n )
#else
METHOD M2Y( n )
METHOD M2Y( n )
#endif
return ::aReport[ PAGEY ] - n * 72 / 25.4
@@ -2070,7 +2070,7 @@ return ::aReport[ PAGEY ] - n * 72 / 25.4
#ifdef __XPP__
METHOD tPdf:R2D( nRow )
#else
METHOD R2D( nRow )
METHOD R2D( nRow )
#endif
return ::aReport[ PAGEY ] - nRow * 72 / ::aReport[ LPI ]
@@ -2080,7 +2080,7 @@ return ::aReport[ PAGEY ] - nRow * 72 / ::aReport[ LPI ]
#ifdef __XPP__
METHOD tPdf:R2M( nRow )
#else
METHOD R2M( nRow )
METHOD R2M( nRow )
#endif
return 25.4 * nRow / ::aReport[ LPI ]
@@ -2090,7 +2090,7 @@ return 25.4 * nRow / ::aReport[ LPI ]
#ifdef __XPP__
METHOD tPdf:X2M( n )
#else
METHOD X2M( n )
METHOD X2M( n )
#endif
return n * 25.4 / 72
@@ -2100,7 +2100,7 @@ return n * 25.4 / 72
#ifdef __XPP__
METHOD tPdf:TextPrint( nI, nLeft, lParagraph, nJustify, nSpace, nNew, nLength, nLineLen, nLines, nStart, cString, cDelim, cColor, lPrint )
#else
METHOD TextPrint( nI, nLeft, lParagraph, nJustify, nSpace, nNew, nLength, nLineLen, nLines, nStart, cString, cDelim, cColor, lPrint )
METHOD TextPrint( nI, nLeft, lParagraph, nJustify, nSpace, nNew, nLength, nLineLen, nLines, nStart, cString, cDelim, cColor, lPrint )
#endif
local nFinish, nL, nB, nJ, cToken, nRow
@@ -2151,7 +2151,7 @@ RETURN self
#ifdef __XPP__
METHOD tPdf:TextNextPara( cString, cDelim, nI )
#else
METHOD TextNextPara( cString, cDelim, nI )
METHOD TextNextPara( cString, cDelim, nI )
#endif
local nAt, cAt, nCRLF, nNew, nRat, nRet := 0
@@ -2171,7 +2171,7 @@ return nRet
#ifdef __XPP__
METHOD tPdf:ClosePage()
#else
METHOD ClosePage()
METHOD ClosePage()
#endif
local cTemp, cBuffer, nBuffer, nRead, nI, k, nImage, nFont, nImageHandle
@@ -2360,7 +2360,7 @@ RETURN self
#ifdef __XPP__
METHOD tPdf:FilePrint( cFile )
#else
METHOD FilePrint( cFile )
METHOD FilePrint( cFile )
#endif
local cPathAcro := "C:\progra~1\Adobe\Acroba~1.0\Reader"
local cRun := cPathAcro + "\AcroRd32.exe /t " + cFile + " " + ;
@@ -2379,7 +2379,7 @@ RETURN self
#ifdef __XPP__
METHOD tPdf:Execute( cFile )
#else
METHOD Execute( cFile )
METHOD Execute( cFile )
#endif
// Replace cPathAcro with the path at your system
local cPathAcro := "C:\progra~1\Adobe\Acroba~1.0\Reader"
@@ -2628,8 +2628,8 @@ local lRet := .t.
#ifdef __HARBOUR__
if cVerb != nil
// TOFIX: This requires hbwhat32, which in turns requires xhb.
// This has to solved differently.
// TOFIX: This requires hbwhat, which in turns requires xhb.
// This has to be solved differently.
// ShellExecute( GetDeskTopWindow(), cVerb, cFile, , , 1 )
HB_SYMBOL_UNUSED( cFile )
else

View File

@@ -51,35 +51,35 @@
*/
#ifndef __HBWAPI_H
#define __HBWAPI_H
#define __HBWAPI_H
#define wapi_par_WNDPROC( n ) ( ( WNDPROC ) ( ISNUM( n ) ? ( HB_PTRDIFF ) hb_parnint( n ) : ( HB_PTRDIFF ) hb_parptr( n ) ) )
#define wapi_par_WPARAM( n ) ( ( WPARAM ) ( ISNUM( n ) ? ( HB_PTRDIFF ) hb_parnint( n ) : ( HB_PTRDIFF ) hb_parptr( n ) ) )
#define wapi_par_LPARAM( n ) ( ( LPARAM ) ( ISNUM( n ) ? ( HB_PTRDIFF ) hb_parnint( n ) : ( HB_PTRDIFF ) hb_parptr( n ) ) )
#define wapi_par_HWND( n ) ( ( HWND ) ( ISNUM( n ) ? ( HB_PTRDIFF ) hb_parnint( n ) : ( HB_PTRDIFF ) hb_parptr( n ) ) )
#define wapi_par_HDC( n ) ( ( HDC ) ( ISNUM( n ) ? ( HB_PTRDIFF ) hb_parnint( n ) : ( HB_PTRDIFF ) hb_parptr( n ) ) )
#define wapi_par_HANDLE( n ) ( ( HANDLE ) ( ISNUM( n ) ? ( HB_PTRDIFF ) hb_parnint( n ) : ( HB_PTRDIFF ) hb_parptr( n ) ) )
#define wapi_par_HGDIOBJ( n ) ( ( HGDIOBJ ) ( ISNUM( n ) ? ( HB_PTRDIFF ) hb_parnint( n ) : ( HB_PTRDIFF ) hb_parptr( n ) ) )
#define wapi_par_HBRUSH( n ) ( ( HBRUSH ) ( ISNUM( n ) ? ( HB_PTRDIFF ) hb_parnint( n ) : ( HB_PTRDIFF ) hb_parptr( n ) ) )
#define wapi_par_HBITMAP( n ) ( ( HBITMAP ) ( ISNUM( n ) ? ( HB_PTRDIFF ) hb_parnint( n ) : ( HB_PTRDIFF ) hb_parptr( n ) ) )
#define wapi_par_HICON( n ) ( ( HICON ) ( ISNUM( n ) ? ( HB_PTRDIFF ) hb_parnint( n ) : ( HB_PTRDIFF ) hb_parptr( n ) ) )
#define wapi_par_HIMAGELIST( n ) ( ( HIMAGELIST ) ( ISNUM( n ) ? ( HB_PTRDIFF ) hb_parnint( n ) : ( HB_PTRDIFF ) hb_parptr( n ) ) )
#define wapi_par_HFONT( n ) ( ( HFONT ) ( ISNUM( n ) ? ( HB_PTRDIFF ) hb_parnint( n ) : ( HB_PTRDIFF ) hb_parptr( n ) ) )
#define wapi_par_HINSTANCE( n ) ( ( HINSTANCE ) ( ISNUM( n ) ? ( HB_PTRDIFF ) hb_parnint( n ) : ( HB_PTRDIFF ) hb_parptr( n ) ) )
#define wapi_par_COLORREF( n ) ( ( COLORREF ) ( ISNUM( n ) ? ( HB_PTRDIFF ) hb_parnint( n ) : ( HB_PTRDIFF ) hb_parptr( n ) ) )
#define wapi_par_WNDPROC( n ) ( ( WNDPROC ) ( ISNUM( n ) ? ( HB_PTRDIFF ) hb_parnint( n ) : ( HB_PTRDIFF ) hb_parptr( n ) ) )
#define wapi_par_WPARAM( n ) ( ( WPARAM ) ( ISNUM( n ) ? ( HB_PTRDIFF ) hb_parnint( n ) : ( HB_PTRDIFF ) hb_parptr( n ) ) )
#define wapi_par_LPARAM( n ) ( ( LPARAM ) ( ISNUM( n ) ? ( HB_PTRDIFF ) hb_parnint( n ) : ( HB_PTRDIFF ) hb_parptr( n ) ) )
#define wapi_par_HWND( n ) ( ( HWND ) ( ISNUM( n ) ? ( HB_PTRDIFF ) hb_parnint( n ) : ( HB_PTRDIFF ) hb_parptr( n ) ) )
#define wapi_par_HDC( n ) ( ( HDC ) ( ISNUM( n ) ? ( HB_PTRDIFF ) hb_parnint( n ) : ( HB_PTRDIFF ) hb_parptr( n ) ) )
#define wapi_par_HANDLE( n ) ( ( HANDLE ) ( ISNUM( n ) ? ( HB_PTRDIFF ) hb_parnint( n ) : ( HB_PTRDIFF ) hb_parptr( n ) ) )
#define wapi_par_HGDIOBJ( n ) ( ( HGDIOBJ ) ( ISNUM( n ) ? ( HB_PTRDIFF ) hb_parnint( n ) : ( HB_PTRDIFF ) hb_parptr( n ) ) )
#define wapi_par_HBRUSH( n ) ( ( HBRUSH ) ( ISNUM( n ) ? ( HB_PTRDIFF ) hb_parnint( n ) : ( HB_PTRDIFF ) hb_parptr( n ) ) )
#define wapi_par_HBITMAP( n ) ( ( HBITMAP ) ( ISNUM( n ) ? ( HB_PTRDIFF ) hb_parnint( n ) : ( HB_PTRDIFF ) hb_parptr( n ) ) )
#define wapi_par_HICON( n ) ( ( HICON ) ( ISNUM( n ) ? ( HB_PTRDIFF ) hb_parnint( n ) : ( HB_PTRDIFF ) hb_parptr( n ) ) )
#define wapi_par_HIMAGELIST( n ) ( ( HIMAGELIST ) ( ISNUM( n ) ? ( HB_PTRDIFF ) hb_parnint( n ) : ( HB_PTRDIFF ) hb_parptr( n ) ) )
#define wapi_par_HFONT( n ) ( ( HFONT ) ( ISNUM( n ) ? ( HB_PTRDIFF ) hb_parnint( n ) : ( HB_PTRDIFF ) hb_parptr( n ) ) )
#define wapi_par_HINSTANCE( n ) ( ( HINSTANCE ) ( ISNUM( n ) ? ( HB_PTRDIFF ) hb_parnint( n ) : ( HB_PTRDIFF ) hb_parptr( n ) ) )
#define wapi_par_COLORREF( n ) ( ( COLORREF ) ( ISNUM( n ) ? ( HB_PTRDIFF ) hb_parnint( n ) : ( HB_PTRDIFF ) hb_parptr( n ) ) )
#define wapi_par_STRUCT( n ) ( hb_parc( n ) )
#define wapi_par_STRUCT( n ) ( hb_parc( n ) )
#define wapi_par_BOOL( n ) ( hb_parl( n ) )
#define wapi_par_INT( n ) ( hb_parni( n ) )
#define wapi_par_UINT( n ) ( ( UINT ) hb_parni( n ) )
#define wapi_par_LONG( n ) ( ( LONG ) hb_parnl( n ) )
#define wapi_par_BOOL( n ) ( hb_parl( n ) )
#define wapi_par_INT( n ) ( hb_parni( n ) )
#define wapi_par_UINT( n ) ( ( UINT ) hb_parni( n ) )
#define wapi_par_LONG( n ) ( ( LONG ) hb_parnl( n ) )
#define wapi_ret_NI( i ) ( hb_retni( i ) )
#define wapi_ret_L( b ) ( hb_retl( b ) )
#define wapi_ret_NI( i ) ( hb_retni( i ) )
#define wapi_ret_L( b ) ( hb_retl( b ) )
#define wapi_ret_HANDLE( h ) ( hb_retptr( h ) )
#define wapi_ret_HRESULT( hr ) ( hb_retptr( hr ) )
#define wapi_ret_COLORREF( cr ) ( hb_retnint( ( HB_PTRDIFF ) cr ) )
#define wapi_ret_HANDLE( h ) ( hb_retptr( h ) )
#define wapi_ret_HRESULT( hr ) ( hb_retptr( hr ) )
#define wapi_ret_COLORREF( cr ) ( hb_retnint( ( HB_PTRDIFF ) cr ) )
#endif /* __HBWAPI_H */

View File

@@ -3,9 +3,8 @@
*/
/*
*
* Pritpal Bedi <pritpal@vouchcac.com> 14Feb2009
* www - http://www.harbour.org
* www - http://www.harbour-project.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View File

@@ -3,9 +3,8 @@
*/
/*
*
* Pritpal Bedi <pritpal@vouchcac.com> 17Feb2009
* www - http://www.harbour.org
* www - http://www.harbour-project.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -224,7 +223,3 @@ HB_FUNC( WAPI_SHOWSCROLLBAR )
wapi_par_BOOL( 3 ) ) );
}
/*----------------------------------------------------------------------*/

View File

@@ -0,0 +1,10 @@
#
# $Id$
#
# Don't add here any contribs which have external dependencies
# or aren't equally available for all supported Harbour platforms.
# Thank you. [vszakats]
# Some popular and portable Harbour contribs
libs=hbct hbmzip hbtip hbcrypt

View File

@@ -5,5 +5,5 @@
# Used by Harbour core
{win}libs=kernel32 user32 wsock32 advapi32 gdi32
# Others
{win}libs=winspool comctl32 comdlg32 shell32 ole32 oleaut32 uuid odbc32 mpr winmm
{win}libs=winspool comctl32 comdlg32 shell32 ole32 oleaut32 uuid odbc32 mpr winmm mapi32
{win&!bcc32}libs=odbccp32

View File

@@ -67,14 +67,30 @@
/* TODO: Support for more compilers/platforms. */
/* TODO: Cleanup on variable names. */
/* + 2. compiler autodetection for two kinds of dir layout. */
/* * 6. bldflags -> bldflagsC and bldflagsPRG */
/* * 7. output file name auto detection should respect the compilation
mode, f.e. hbmk -cmp a.prg it should generate a.{o,obj} not 'a'
or 'a.exe'. QUESTION: What to do for multiple .prgs? */
/* * 8. Stripping "lib" ".so/.dll/.a" ? */
/* * 9. We should have support for passing object archives (.a) in
link file list and then pass it to GCC without -l parameter.
Using 'mylib.a' and '-lmylib' as GCC parameters has different
meaning so mylib.a should not be converted to -lmylib but simply
passed to GCC as is. */
/* ! 12. hbcplr to add as a lib both when shared and static. */
ANNOUNCE HB_GTSYS
REQUEST HB_GT_CGI_DEFAULT
REQUEST hbm_ARCH
REQUEST hbm_COMP
THREAD STATIC t_lQuiet := .F.
THREAD STATIC t_lInfo := .T. /* Enabled while hbmk gets matured, should later set to .F. */
THREAD STATIC t_cCOMP
THREAD STATIC t_cARCH
THREAD STATIC t_lQuiet
FUNCTION Main( ... )
LOCAL aLIB_BASE1 := {;
@@ -140,6 +156,7 @@ FUNCTION Main( ... )
LOCAL s_aOPTPRG
LOCAL s_aOPTC
LOCAL s_aOPTL
LOCAL s_cPROGDIR
LOCAL s_cPROGNAME
LOCAL s_cMAPNAME
LOCAL s_aOBJ
@@ -180,6 +197,7 @@ FUNCTION Main( ... )
LOCAL fhnd
LOCAL lNOHBP
LOCAL lSysLoc
LOCAL cSelfCOMP
LOCAL lStopAfterHarbour := .F.
LOCAL lStopAfterCComp := .F.
@@ -187,6 +205,8 @@ FUNCTION Main( ... )
LOCAL aParams
LOCAL cParam
LOCAL cDir, cName, cExt
LOCAL cDL_Version := hb_ntos( hb_Version( HB_VERSION_MAJOR ) ) + hb_ntos( hb_Version( HB_VERSION_MINOR ) )
IF PCount() == 0
@@ -196,56 +216,93 @@ FUNCTION Main( ... )
RETURN 9
ENDIF
t_lQuiet := .F.
FOR EACH cParam IN hb_AParams()
IF Lower( cParam ) == "-q"
t_lQuiet := .T.
EXIT
ENDIF
DO CASE
CASE Lower( cParam ) == "-q" ; t_lQuiet := .T. ; t_lInfo := .F.
CASE Lower( Left( cParam, 6 ) ) == "-comp=" ; t_cCOMP := SubStr( cParam, 7 )
CASE Lower( Left( cParam, 6 ) ) == "-arch=" ; t_cARCH := SubStr( cParam, 7 )
CASE Lower( cParam ) == "-hbcc" ; t_lQuiet := .T. ; t_lInfo := .F. ; lStopAfterHarbour := .T.
CASE Lower( cParam ) == "-hbcmp" ; t_lQuiet := .T. ; t_lInfo := .F. ; lStopAfterHarbour := .F. ; lStopAfterCComp := .T.
CASE Lower( cParam ) == "-hblnk" ; t_lQuiet := .T. ; t_lInfo := .F.
CASE Lower( cParam ) == "-info" ; t_lInfo := .T.
ENDCASE
NEXT
SWITCH Lower( FN_NameGet( hb_argv( 0 ) ) )
CASE "hbcc"
t_lQuiet := .T. ; t_lInfo := .F. ; lStopAfterHarbour := .T.
IF t_lInfo
OutStd( "hbmk: Enabled -hbcc option." + hb_osNewLine() )
ENDIF
EXIT
CASE "hbcmp"
t_lQuiet := .T. ; t_lInfo := .F. ; lStopAfterHarbour := .F. ; lStopAfterCComp := .T.
IF t_lInfo
OutStd( "hbmk: Enabled -hbcmp option." + hb_osNewLine() )
ENDIF
EXIT
CASE "hblnk"
t_lQuiet := .T. ; t_lInfo := .F.
IF t_lInfo
OutStd( "hbmk: Enabled -hblnk option." + hb_osNewLine() )
ENDIF
EXIT
ENDSWITCH
IF ! t_lQuiet
ShowHeader()
ENDIF
SWITCH Lower( FN_NameGet( hb_argv( 0 ) ) )
CASE "hbcc"
lStopAfterHarbour := .T.
IF ! t_lQuiet
OutStd( "hbmk: Enabled -cc option." + hb_osNewLine() )
ENDIF
EXIT
CASE "hbcmp"
lStopAfterCComp := .T.
IF ! t_lQuiet
OutStd( "hbmk: Enabled -cmp option." + hb_osNewLine() )
ENDIF
EXIT
ENDSWITCH
/* Load architecture / compiler settings (compatibility) */
IF Empty( t_cARCH )
t_cARCH := Lower( GetEnv( "HB_ARCHITECTURE" ) )
ENDIF
IF Empty( t_cCOMP )
t_cCOMP := Lower( GetEnv( "HB_COMPILER" ) )
ENDIF
/* Autodetect architecture */
t_cARCH := Lower( GetEnv( "HB_ARCHITECTURE" ) )
IF Empty( t_cARCH )
/* NOTE: Keep this in sync manually. All compilers should be listed here,
which are supported on one architecture only. In the future this
should be automatically extracted from a comp/arch matrix. */
SWITCH t_cCOMP
CASE "mingw"
CASE "mingwce"
CASE "msvc"
CASE "bcc32"
CASE "xcc"
CASE "pocc"
CASE "dmc"
t_cARCH := "win"
EXIT
CASE "djgpp"
t_cARCH := "dos"
EXIT
OTHERWISE
#if defined( __PLATFORM__BSD )
t_cARCH := "bsd"
t_cARCH := "bsd"
#elif defined( __PLATFORM__DARWIN )
t_cARCH := "darwin"
t_cARCH := "darwin"
#elif defined( __PLATFORM__DOS )
t_cARCH := "dos"
t_cARCH := "dos"
#elif defined( __PLATFORM__HPUX )
t_cARCH := "hpux"
t_cARCH := "hpux"
#elif defined( __PLATFORM__LINUX )
t_cARCH := "linux"
t_cARCH := "linux"
#elif defined( __PLATFORM__OS2 )
t_cARCH := "os2"
t_cARCH := "os2"
#elif defined( __PLATFORM__SUNOS )
t_cARCH := "sunos"
t_cARCH := "sunos"
#elif defined( __PLATFORM__WINDOWS )
t_cARCH := "win"
t_cARCH := "win"
#endif
ENDSWITCH
IF ! Empty( t_cARCH )
IF ! t_lQuiet
IF t_lInfo
OutStd( "hbmk: Autodetected HB_ARCHITECTURE: " + t_cARCH + hb_osNewLine() )
ENDIF
ENDIF
@@ -264,22 +321,24 @@ FUNCTION Main( ... )
s_aLIBHBGT := { "gttrm", "gtxwc" }
CASE t_cARCH == "dos"
aCOMPDET := { { "gcc.exe" , "djgpp" },;
{ "wpp386.exe", "owatcom" } }
{ "wpp386.exe", "owatcom" } } /* TODO: Add full support for wcc386.exe */
aCOMPSUP := { "djgpp", "gcc", "owatcom", "rsx32" }
cBin_CompPRG := "harbour.exe"
s_aLIBHBGT := { "gtdos" }
CASE t_cARCH == "os2"
aCOMPDET := { { "gcc.exe" , "gcc" },;
{ "wpp386.exe", "owatcom" },;
{ "wpp386.exe", "owatcom" },; /* TODO: Add full support for wcc386.exe */
{ "icc.exe" , "icc" } }
aCOMPSUP := { "gcc", "owatcom", "icc" }
cBin_CompPRG := "harbour.exe"
s_aLIBHBGT := { "gtos2" }
CASE t_cARCH == "win"
aCOMPDET := { { "gcc.exe" , "mingw" },;
/* Ordering is significant.
owatcom also keeps a cl.exe in it's binary dir. */
aCOMPDET := { { "gcc.exe" , "mingw" },; /* TODO: Add full support for g++.exe */
{ "wpp386.exe", "owatcom" },; /* TODO: Add full support for wcc386.exe */
{ "cl.exe" , "msvc" },;
{ "bcc32.exe" , "bcc32" },;
{ "wpp386.exe", "owatcom" },;
{ "pocc.exe" , "pocc" },;
{ "dmc.exe" , "dmc" },;
{ "icc.exe" , "icc" },;
@@ -296,22 +355,38 @@ FUNCTION Main( ... )
/* Autodetect compiler */
t_cCOMP := Lower( GetEnv( "HB_COMPILER" ) )
IF Empty( t_cCOMP )
IF Len( aCOMPSUP ) == 1
t_cCOMP := aCOMPSUP[ 1 ]
ELSEIF t_cARCH == "linux"
t_cCOMP := "gcc"
ELSEIF ! Empty( aCOMPDET )
FOR tmp := 1 TO Len( aCOMPDET )
IF FindInPath( aCOMPDET[ tmp ][ 1 ] )
t_cCOMP := aCOMPDET[ tmp ][ 2 ]
EXIT
ENDIF
NEXT
/* Which compiler was used to compile ourselves? */
cSelfCOMP := SelfCOMP()
/* Skip it for msvc, as it creates problems for other compilers. */
IF !( cSelfCOMP $ "msvc" )
/* Look for this compiler first */
FOR tmp := 1 TO Len( aCOMPDET )
IF aCOMPDET[ tmp ][ 2 ] == cSelfCOMP .AND. FindInPath( aCOMPDET[ tmp ][ 1 ] )
t_cCOMP := aCOMPDET[ tmp ][ 2 ]
EXIT
ENDIF
NEXT
ELSE
cSelfCOMP := ""
ENDIF
IF Empty( t_cCOMP )
/* Check the rest of compilers */
FOR tmp := 1 TO Len( aCOMPDET )
IF !( aCOMPDET[ tmp ][ 2 ] == cSelfCOMP ) .AND. FindInPath( aCOMPDET[ tmp ][ 1 ] )
t_cCOMP := aCOMPDET[ tmp ][ 2 ]
EXIT
ENDIF
NEXT
ENDIF
ENDIF
IF ! Empty( t_cCOMP )
IF ! t_lQuiet
IF t_lInfo
OutStd( "hbmk: Autodetected HB_COMPILER: " + t_cCOMP + hb_osNewLine() )
ENDIF
ELSE
@@ -342,11 +417,11 @@ FUNCTION Main( ... )
lSysLoc := .F.
s_cHB_BIN_INSTALL := DirAdaptPathSep( GetEnv( "HB_BIN_INSTALL" ) )
s_cHB_LIB_INSTALL := DirAdaptPathSep( GetEnv( "HB_LIB_INSTALL" ) )
s_cHB_INC_INSTALL := DirAdaptPathSep( GetEnv( "HB_INC_INSTALL" ) )
s_cHB_BIN_INSTALL := PathSepToTarget( GetEnv( "HB_BIN_INSTALL" ) )
s_cHB_LIB_INSTALL := PathSepToTarget( GetEnv( "HB_LIB_INSTALL" ) )
s_cHB_INC_INSTALL := PathSepToTarget( GetEnv( "HB_INC_INSTALL" ) )
s_cHB_INSTALL_PREFIX := DirAdaptPathSep( GetEnv( "HB_INSTALL_PREFIX" ) )
s_cHB_INSTALL_PREFIX := PathSepToTarget( GetEnv( "HB_INSTALL_PREFIX" ) )
IF Empty( s_cHB_INSTALL_PREFIX )
DO CASE
@@ -405,7 +480,7 @@ FUNCTION Main( ... )
AAddNotEmpty( s_aLIBPATH, s_cHB_LIB_INSTALL )
IF ! t_lQuiet
IF t_lInfo
OutStd( "hbmk: Using Harbour: " + s_cHB_BIN_INSTALL + " " + s_cHB_INC_INSTALL + " " + s_cHB_LIB_INSTALL + hb_osNewLine() )
ENDIF
@@ -440,6 +515,7 @@ FUNCTION Main( ... )
s_aRESCMP := {}
s_aLIBUSER := {}
s_aOBJUSER := {}
s_cPROGDIR := NIL
s_cPROGNAME := NIL
/* Collect all command line parameters */
@@ -486,7 +562,16 @@ FUNCTION Main( ... )
FOR EACH cParam IN aParams
DO CASE
CASE Lower( cParam ) == "-q" /* Simply ignore */
CASE Lower( cParam ) == "-q" .OR. ;
Lower( Left( cParam, 6 ) ) == "-comp=" .OR. ;
Lower( Left( cParam, 6 ) ) == "-arch=" .OR. ;
Lower( cParam ) == "-hbcc" .OR. ;
Lower( cParam ) == "-hbcmp" .OR. ;
Lower( cParam ) == "-hblnk" .OR. ;
Lower( cParam ) == "-info"
/* Simply ignore. The were already processed in the first pass. */
CASE Lower( cParam ) == "-gui" ; s_lGUI := .T.
CASE Lower( cParam ) == "-mwindows" ; s_lGUI := .T. /* Compatibility */
CASE Lower( cParam ) == "-std" ; s_lGUI := .F.
@@ -515,16 +600,25 @@ FUNCTION Main( ... )
CASE Lower( cParam ) == "-trace" ; s_lTRACE := .T.
CASE Lower( cParam ) == "-trace-" ; s_lTRACE := .F.
CASE Lower( cParam ) == "-notrace" ; s_lTRACE := .F.
CASE Lower( cParam ) == "-cc" ; lStopAfterHarbour := .T.
CASE Lower( cParam ) == "-cmp" ; lStopAfterHarbour := .F. ; lStopAfterCComp := .T.
CASE Lower( Left( cParam, 3 ) ) == "-gt" ; DEFAULT s_cGT TO SubStr( cParam, 2 )
CASE Left( cParam, 2 ) == "-o" ; s_cPROGNAME := DirAdaptPathSep( SubStr( cParam, 3 ) )
CASE Left( cParam, 2 ) == "-o"
tmp := PathSepToSelf( SubStr( cParam, 3 ) )
hb_FNameSplit( tmp, @cDir, @cName, @cExt )
IF ! Empty( cDir ) .AND. Empty( cName ) .AND. Empty( cExt )
/* Only a dir was passed, let's store that and pick a default name later. */
s_cPROGDIR := cDir
ELSE
s_cPROGDIR := NIL
s_cPROGNAME := tmp
ENDIF
CASE Left( cParam, 2 ) == "-l" .AND. ;
Len( cParam ) > 2 .AND. ;
!( Left( cParam, 3 ) == "-l-" ) ; AAddNotEmpty( s_aLIBUSER, DirAdaptPathSep( ArchCompFilter( SubStr( cParam, 3 ) ) ) )
!( Left( cParam, 3 ) == "-l-" ) ; AAddNotEmpty( s_aLIBUSER, PathSepToTarget( ArchCompFilter( SubStr( cParam, 3 ) ) ) )
CASE Left( cParam, 2 ) == "-L" .AND. ;
Len( cParam ) > 2 ; AAddNotEmpty( s_aLIBPATH, DirAdaptPathSep( ArchCompFilter( SubStr( cParam, 3 ) ) ) )
CASE Left( cParam, 1 ) == "-" ; AAdd( s_aOPTPRG , DirAdaptPathSep( cParam ) )
Len( cParam ) > 2 ; AAddNotEmpty( s_aLIBPATH, PathSepToTarget( ArchCompFilter( SubStr( cParam, 3 ) ) ) )
CASE Left( cParam, 1 ) == "-" ; AAdd( s_aOPTPRG , PathSepToTarget( cParam ) )
CASE Lower( FN_ExtGet( cParam ) ) == ".hbp"
HBP_ProcessOne( cParam,;
@@ -544,13 +638,13 @@ FUNCTION Main( ... )
@s_lRUN,;
@s_cGT )
CASE Lower( FN_ExtGet( cParam ) ) == ".prg" ; AAdd( s_aPRG , DirAdaptPathSep( cParam ) ) ; DEFAULT s_cPROGNAME TO DirAdaptPathSep( cParam )
CASE Lower( FN_ExtGet( cParam ) ) == ".rc" ; AAdd( s_aRESSRC , DirAdaptPathSep( cParam ) )
CASE Lower( FN_ExtGet( cParam ) ) == ".res" ; AAdd( s_aRESCMP , DirAdaptPathSep( cParam ) )
CASE Lower( FN_ExtGet( cParam ) ) $ ".o|.obj" ; AAdd( s_aOBJUSER, DirAdaptPathSep( cParam ) ) ; DEFAULT s_cPROGNAME TO DirAdaptPathSep( cParam )
CASE Lower( FN_ExtGet( cParam ) ) $ ".c|.cpp" ; AAdd( s_aC , DirAdaptPathSep( cParam ) ) ; DEFAULT s_cPROGNAME TO DirAdaptPathSep( cParam )
CASE Lower( FN_ExtGet( cParam ) ) $ ".a|.lib" ; AAddNotEmpty( s_aLIBUSER, DirAdaptPathSep( ArchCompFilter( cParam ) ) )
OTHERWISE ; AAdd( s_aPRG , DirAdaptPathSep( cParam ) ) ; DEFAULT s_cPROGNAME TO DirAdaptPathSep( cParam )
CASE Lower( FN_ExtGet( cParam ) ) == ".prg" ; AAdd( s_aPRG , PathSepToTarget( cParam ) ) ; DEFAULT s_cPROGNAME 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 ) ) $ ".o|.obj" ; AAdd( s_aOBJUSER, PathSepToTarget( cParam ) ) ; DEFAULT s_cPROGNAME TO PathSepToSelf( cParam )
CASE Lower( FN_ExtGet( cParam ) ) $ ".c|.cpp" ; AAdd( s_aC , PathSepToTarget( cParam ) ) ; DEFAULT s_cPROGNAME TO PathSepToSelf( cParam )
CASE Lower( FN_ExtGet( cParam ) ) $ ".a|.lib" ; AAddNotEmpty( s_aLIBUSER, PathSepToTarget( ArchCompFilter( cParam ) ) )
OTHERWISE ; AAdd( s_aPRG , PathSepToTarget( cParam ) ) ; DEFAULT s_cPROGNAME TO PathSepToSelf( cParam )
ENDCASE
NEXT
@@ -574,10 +668,17 @@ FUNCTION Main( ... )
ENDIF
/* Merge user libs from command line and envvar. Command line has priority. */
s_aLIBUSER := ArrayAJoin( { s_aLIBUSER, ListToArray( DirAdaptPathSep( GetEnv( "HB_USER_LIBS" ) ) ) } )
s_aLIBUSER := ArrayAJoin( { s_aLIBUSER, ListToArray( PathSepToTarget( GetEnv( "HB_USER_LIBS" ) ) ) } )
/* Strip extension from output name. */
s_cMAPNAME := FN_ExtSet( s_cPROGNAME, ".map" )
/* Combine output dir with output name. */
IF ! Empty( s_cPROGDIR )
hb_FNameSplit( s_cPROGNAME, @cDir, @cName, @cExt )
s_cPROGNAME := hb_FNameMerge( iif( Empty( cDir ), s_cPROGDIR, cDir ), cName, cExt )
ENDIF
/* Determine map name from output name. */
s_cMAPNAME := PathSepToTarget( FN_ExtSet( s_cPROGNAME, ".map" ) )
/* Set output name extension. */
IF t_cARCH $ "os2|win|dos"
s_cPROGNAME := FN_ExtSet( s_cPROGNAME, ".exe" )
ELSE
@@ -667,20 +768,26 @@ FUNCTION Main( ... )
CASE ( t_cARCH == "bsd" .AND. t_cCOMP == "gcc" ) .OR. ;
( t_cARCH == "darwin" .AND. t_cCOMP == "gcc" ) .OR. ;
( t_cARCH == "hpux" .AND. t_cCOMP == "gcc" ) .OR. ;
( t_cARCH == "linux" .AND. t_cCOMP $ "gcc|gpp" ) .OR. ;
( t_cARCH == "sunos" .AND. t_cCOMP == "gcc" )
( t_cARCH == "sunos" .AND. t_cCOMP == "gcc" ) .OR. ;
( t_cARCH == "linux" .AND. t_cCOMP == "gcc" ) .OR. ;
( t_cARCH == "linux" .AND. t_cCOMP == "gpp" )
cLibPrefix := "-l"
cLibExt := NIL
cObjExt := ".o"
cBin_CompC := iif( t_cCOMP == "gpp", "g++", "gcc" )
cOpt_CompC := "{C} {O} -O3 -o{E} {OPTC} -I{I} {A} {L}"
cOpt_CompC := "{C} {O} -O3 -o{E} {OPTC} -I{I} {A}"
cLibPathPrefix := "-L"
cLibPathSep := " "
IF s_lMAP
cOpt_CompC += " -Wl,-Map " + s_cMAPNAME
IF t_cARCH == "linux"
cOpt_CompC += " -Wl,--start-group {L} -Wl,--end-group"
ELSE
cOpt_CompC += " {L}"
aLIB_BASE2 := ArrayAJoin( { aLIB_BASE2, { "hbcommon", "hbrtl" }, s_aLIBVM } )
ENDIF
IF s_lMAP
cOpt_CompC += " -Wl,-Map " + s_cMAPNAME
ENDIF
aLIB_BASE2 := ArrayAJoin( { aLIB_BASE2, { "hbcommon", "hbrtl" }, s_aLIBVM } )
IF t_cARCH == "darwin"
AAdd( s_aOPTC, "-no-cpp-precomp -Wno-long-double" )
ENDIF
@@ -709,19 +816,23 @@ FUNCTION Main( ... )
cLibPathPrefix := "-L"
cLibPathSep := " "
IF s_lMAP
cOpt_CompC += " -Wl,-Map " + s_cMAPNAME
cOpt_CompC += " -Wl,-Map " + s_cMAPNAME
ENDIF
IF s_lSHARED
cOpt_CompC += " -L{B}"
cOpt_CompC += " -L{B}"
ENDIF
IF t_cCOMP == "gcc"
cOpt_CompC += " -mno-cygwin"
cOpt_CompC += " -mno-cygwin"
ENDIF
IF t_cCOMP == "rsxnt"
cOpt_CompC += " -Zwin32"
cOpt_CompC += " -Zwin32"
ENDIF
IF t_cCOMP == "mingw"
cOpt_CompC += " -Wl,--start-group {L} -Wl,--end-group"
ELSE
cOpt_CompC += " {L}"
aLIB_BASE2 := ArrayAJoin( { aLIB_BASE2, { "hbcommon", "hbrtl" }, s_aLIBVM } )
ENDIF
cOpt_CompC += " {L}"
aLIB_BASE2 := ArrayAJoin( { aLIB_BASE2, { "hbcommon", "hbrtl" }, s_aLIBVM } )
IF s_lSTRIP
AAdd( s_aOPTC, "-s" )
ENDIF
@@ -736,14 +847,19 @@ FUNCTION Main( ... )
cLibExt := NIL
cObjExt := ".o"
cBin_CompC := "gcc"
cOpt_CompC := "{C} {O} -O3 -o{E} {OPTC} -I{I} {A} {L}{SCRIPT}"
cOpt_CompC := "{C} {O} -O3 -o{E} {OPTC} -I{I} {A}{SCRIPT}"
cLibPathPrefix := "-L"
cLibPathSep := " "
IF t_cCOMP == "rsx32"
cOpt_CompC += " -Zrsx32"
cOpt_CompC += " -Zrsx32"
ENDIF
IF t_cCOMP == "djgpp"
cOpt_CompC += " -Wl,--start-group {L} -Wl,--end-group"
ELSE
cOpt_CompC += " {L}"
aLIB_BASE2 := ArrayAJoin( { aLIB_BASE2, { "hbcommon", "hbrtl" }, s_aLIBVM } )
ENDIF
s_aLIBSYS := ArrayJoin( s_aLIBSYS, { "m" } )
aLIB_BASE2 := ArrayAJoin( { aLIB_BASE2, { "hbcommon", "hbrtl" }, s_aLIBVM } )
IF s_lSTRIP
AAdd( s_aOPTC, "-s" )
ENDIF
@@ -757,10 +873,12 @@ FUNCTION Main( ... )
cLibExt := ".lib"
cObjPrefix := "FILE "
cObjExt := ".obj"
cLibPathPrefix := "LIBPATH "
cLibPathSep := " "
cBin_CompC := "wpp386"
cOpt_CompC := "-j -w3 -5s -5r -fp5 -oxehtz -zq -zt0 -bt=DOS {OPTC} {C}"
cBin_Link := "wlink"
cOpt_Link := "OP osn=DOS OP stack=65536 OP CASEEXACT OP stub=cwstub.exe {OPTL} NAME {E} {O} {L}{SCRIPT}"
cOpt_Link := "OP osn=DOS OP stack=65536 OP CASEEXACT OP stub=cwstub.exe {OPTL} NAME {E} {O} {A} {L}{SCRIPT}"
IF s_lDEBUG
cOpt_Link := "DEBUG " + cOpt_Link
ENDIF
@@ -770,10 +888,12 @@ FUNCTION Main( ... )
cLibExt := ".lib"
cObjPrefix := "FILE "
cObjExt := ".obj"
cLibPathPrefix := "LIBPATH "
cLibPathSep := " "
cBin_CompC := "wpp386"
cOpt_CompC := "-j -w3 -5s -5r -fp5 -oxehtz -zq -zt0 -mf -bt=NT {OPTC} {C}"
cOpt_CompC := "-w3 -5s -5r -fp5 -onaehtzr -zq -zt0 -bt=NT -oi+ -s {OPTC} {C}"
cBin_Link := "wlink"
cOpt_Link := "OP osn=NT OP stack=65536 OP CASEEXACT {OPTL} NAME {E} {O} {L}{SCRIPT}"
cOpt_Link := "OP osn=NT OP stack=65536 OP CASEEXACT {OPTL} NAME {E} {O} {A} {L}{SCRIPT}"
IF s_lDEBUG
cOpt_Link := "DEBUG " + cOpt_Link
ENDIF
@@ -813,10 +933,12 @@ FUNCTION Main( ... )
cLibExt := ".lib"
cObjPrefix := "FILE "
cObjExt := ".obj"
cLibPathPrefix := "LIBPATH "
cLibPathSep := " "
cBin_CompC := "wpp386"
cOpt_CompC := "-j -w3 -5s -5r -fp5 -oxehtz -zq -zt0 -mf -bt=OS2 {OPTC} {C}"
cBin_Link := "wlink"
cOpt_Link := "OP stack=65536 OP CASEEXACT {OPTL} NAME {E} {O} {L}{SCRIPT}"
cOpt_Link := "OP stack=65536 OP CASEEXACT {OPTL} NAME {E} {O} {A} {L}{SCRIPT}"
IF s_lDEBUG
cOpt_Link := "DEBUG " + cOpt_Link
ENDIF
@@ -842,10 +964,12 @@ FUNCTION Main( ... )
cLibExt := ".lib"
cObjPrefix := "FILE "
cObjExt := ".obj"
cLibPathPrefix := "LIBPATH "
cLibPathSep := " "
cBin_CompC := "wpp386"
cOpt_CompC := "-j -w3 -5s -5r -fp5 -oxehtz -zq -zt0 -mf -bt=LINUX {OPTC} {C}"
cBin_Link := "wlink"
cOpt_Link := "ALL SYS LINUX OP CASEEXACT {OPTL} NAME {E} {O} {L}"
cOpt_Link := "ALL SYS LINUX OP CASEEXACT {OPTL} NAME {E} {O} {A} {L}{SCRIPT}"
IF s_lDEBUG
cOpt_Link := "DEBUG " + cOpt_Link
ENDIF
@@ -855,7 +979,7 @@ FUNCTION Main( ... )
IF s_lDEBUG
AAdd( s_aOPTC, "-y -v" )
ELSE
AAdd( s_aCLEAN, FN_ExtSet( s_cPROGNAME, ".tds" ) )
AAdd( s_aCLEAN, PathSepToTarget( FN_ExtSet( s_cPROGNAME, ".tds" ) ) )
ENDIF
IF s_lGUI
AAdd( s_aOPTC, "-tW" )
@@ -868,10 +992,10 @@ FUNCTION Main( ... )
cLibPathPrefix := ""
cLibPathSep := ";"
IF s_lSHARED
cOpt_CompC += " -L{B}"
cOpt_CompC += " -L{B}"
ENDIF
IF s_lMAP
cOpt_CompC += " -M"
cOpt_CompC += " -M"
ENDIF
/* TOFIX: The two build systems should generate the same .dll name, otherwise
we can only be compatible with one of them. non-GNU is the common choice here. */
@@ -895,13 +1019,13 @@ FUNCTION Main( ... )
cLibPathPrefix := "/libpath:"
cLibPathSep := " "
IF s_lMAP
AAdd( s_aOPTC, "-Fm" )
AAdd( s_aOPTC, "-Fm" )
ENDIF
IF lStopAfterCComp
AAdd( s_aOPTC, "-c" )
ENDIF
IF s_lSHARED
AAdd( s_aOPTL, "/libpath:{B}" )
AAdd( s_aOPTL, "/libpath:{B}" )
ENDIF
s_aLIBSYS := ArrayJoin( s_aLIBSYS, { "user32", "wsock32", "advapi32", "gdi32" } )
/* TOFIX: The two build systems should generate the same .dll name, otherwise
@@ -920,20 +1044,20 @@ FUNCTION Main( ... )
cBin_CompC := "pocc"
cOpt_CompC := "/Ze /Go /Ot /Tx86-coff {OPTC} /I{I} {C}"
IF s_lMT
AAdd( s_aOPTC, "/MT" )
AAdd( s_aOPTC, "/MT" )
ENDIF
cBin_Link := "polink"
cOpt_Link := "{O} {A} {OPTL} {L}"
cLibPathPrefix := "/libpath:"
cLibPathSep := " "
IF s_lSHARED
AAdd( s_aOPTL, "/libpath:{B}" )
AAdd( s_aOPTL, "/libpath:{B}" )
ENDIF
IF s_lMAP
AAdd( s_aOPTL, "/map" )
AAdd( s_aOPTL, "/map" )
ENDIF
IF s_lDEBUG
AAdd( s_aOPTL, "/debug" )
AAdd( s_aOPTL, "/debug" )
ENDIF
s_aLIBSYS := ArrayJoin( s_aLIBSYS, { "user32", "wsock32", "advapi32", "gdi32" } )
@@ -948,7 +1072,8 @@ FUNCTION Main( ... )
ENDCASE
IF s_lSHARED .AND. ! Empty( s_aLIBSHARED )
s_aLIBHB := s_aLIBSHARED
s_aLIBHB := ArrayAJoin( { s_aLIBSHARED,;
aLIB_BASE_DEBUG } )
ELSE
s_aLIBHB := ArrayAJoin( { aLIB_BASE1,;
aLIB_BASE_DEBUG,;
@@ -980,7 +1105,7 @@ FUNCTION Main( ... )
GetEnv( "HB_USER_CFLAGS" ) + " " + ArrayToList( s_aOPTC ) )
cOpt_CompC := StrTran( cOpt_CompC, "{OPTL}", iif( s_lBLDFLG, hb_Version( HB_VERSION_FLAG_LINKER ) + " ", "" ) +;
GetEnv( "HB_USER_LDFLAGS" ) + " " + ArrayToList( s_aOPTL ) )
cOpt_CompC := StrTran( cOpt_CompC, "{E}" , s_cPROGNAME )
cOpt_CompC := StrTran( cOpt_CompC, "{E}" , PathSepToTarget( s_cPROGNAME ) )
cOpt_CompC := StrTran( cOpt_CompC, "{B}" , s_cHB_BIN_INSTALL )
cOpt_CompC := StrTran( cOpt_CompC, "{I}" , s_cHB_INC_INSTALL )
cOpt_CompC := StrTran( cOpt_CompC, "{A}" , ArrayToList( ListCook( s_aLIBPATH, cLibPathPrefix ), cLibPathSep ) )
@@ -989,7 +1114,7 @@ FUNCTION Main( ... )
/* Handle moving the whole command line to a script, if requested. */
IF "{SCRIPT}" $ cOpt_CompC
fhnd := hb_FTempCreateEx( @cScriptFile )
fhnd := hb_FTempCreateEx( @cScriptFile, NIL, NIL, ".cpl" )
IF fhnd != F_ERROR
FWrite( fhnd, StrTran( cOpt_CompC, "{SCRIPT}", "" ) )
FClose( fhnd )
@@ -1030,7 +1155,7 @@ FUNCTION Main( ... )
cOpt_Link := StrTran( cOpt_Link, "{L}" , ArrayToList( s_aLIB ) )
cOpt_Link := StrTran( cOpt_Link, "{OPTL}", iif( s_lBLDFLG, hb_Version( HB_VERSION_FLAG_LINKER ) + " ", "" ) +;
GetEnv( "HB_USER_LDFLAGS" ) + " " + ArrayToList( s_aOPTL ) )
cOpt_Link := StrTran( cOpt_Link, "{E}" , s_cPROGNAME )
cOpt_Link := StrTran( cOpt_Link, "{E}" , PathSepToTarget( s_cPROGNAME ) )
cOpt_Link := StrTran( cOpt_Link, "{B}" , s_cHB_BIN_INSTALL )
cOpt_Link := StrTran( cOpt_Link, "{A}" , ArrayToList( ListCook( s_aLIBPATH, cLibPathPrefix ), cLibPathSep ) )
@@ -1038,9 +1163,9 @@ FUNCTION Main( ... )
/* Handle moving the whole command line to a script, if requested. */
IF "{SCRIPT}" $ cOpt_Link
fhnd := hb_FTempCreateEx( @cScriptFile )
fhnd := hb_FTempCreateEx( @cScriptFile, NIL, NIL, ".lnk" )
IF fhnd != F_ERROR
FWrite( fhnd, StrTran( cOpt_CompC, "{SCRIPT}", "" ) )
FWrite( fhnd, StrTran( cOpt_Link, "{SCRIPT}", "" ) )
FClose( fhnd )
cOpt_Link := "@" + cScriptFile
ELSE
@@ -1083,33 +1208,66 @@ FUNCTION Main( ... )
PauseForKey()
ELSEIF s_lRUN
#if !( defined( __PLATFORM__WINDOWS ) .OR. defined( __PLATFORM__DOS ) .OR. defined( __PLATFORM__OS2 ) )
IF ! Empty( FN_DirGet( s_cPROGNAME ) )
IF Empty( FN_DirGet( s_cPROGNAME ) )
s_cPROGNAME := "." + hb_osPathSeparator() + s_cPROGNAME
ENDIF
#endif
IF s_lTRACE
OutStd( "hbmk: Running executable: '" + s_cPROGNAME + "'" + hb_osNewLine() )
OutStd( "hbmk: Running executable: '" + PathSepToTarget( s_cPROGNAME ) + "'" + hb_osNewLine() )
ENDIF
nErrorLevel := hb_run( s_cPROGNAME )
nErrorLevel := hb_run( PathSepToTarget( s_cPROGNAME ) )
ENDIF
ENDIF
ENDIF
RETURN nErrorLevel
STATIC FUNCTION SelfCOMP()
LOCAL cCompiler := hb_Compiler()
IF "Microsoft Visual C" $ cCompiler ; RETURN "msvc"
ELSEIF "Borland" $ cCompiler ; RETURN "bcc32"
ELSEIF "CodeGear" $ cCompiler ; RETURN "bcc32"
ELSEIF "DJGPP" $ cCompiler ; RETURN "djgpp"
ELSEIF "MinGW" $ cCompiler ; RETURN "mingw"
ELSEIF "GNU C++" $ cCompiler ; RETURN "gcc"
ELSEIF "GNU C" $ cCompiler ; RETURN "gcc"
ELSEIF "Watcom C++" $ cCompiler ; RETURN "owatcom"
ELSEIF "Watcom C" $ cCompiler ; RETURN "owatcom"
ELSEIF "Pelles ISO C" $ cCompiler ; RETURN "pocc"
ELSEIF "Digital Mars" $ cCompiler ; RETURN "dmc"
ELSEIF "(XCC)" $ cCompiler ; RETURN "xcc"
ENDIF
RETURN ""
/* TODO: Add default .exe extension for win|os2|dos */
STATIC FUNCTION FindInPath( cFileName )
LOCAL cPATH
LOCAL cDir
LOCAL cName
LOCAL cExt
/* Check in current dir. */
IF hb_FileExists( cFileName )
RETURN .T.
ENDIF
hb_FNameSplit( cFileName,, @cName, @cExt )
/* Check in the dir of this executable. */
IF ! Empty( hb_DirBase() )
IF hb_FileExists( hb_FNameMerge( hb_DirBase(), cName, cExt ) )
RETURN .T.
ENDIF
ENDIF
/* Check in the PATH. */
cPATH := GetEnv( "PATH" )
IF ! Empty( cPATH )
FOR EACH cDir IN hb_ATokens( cPATH, hb_osPathListSeparator(), .T. )
IF ! Empty( cDir )
IF hb_FileExists( DirAddPathSep( StrStripQuote( cDir ) ) + cFileName )
IF hb_FileExists( hb_FNameMerge( DirAddPathSep( StrStripQuote( cDir ) ), cName, cExt ) )
RETURN .T.
ENDIF
ENDIF
@@ -1156,7 +1314,8 @@ STATIC FUNCTION AAddNotEmpty( aArray, xItem )
RETURN aArray
/* Append optional prefix and optional extension to all members */
STATIC FUNCTION ListCook( array, cPrefix, cExt )
STATIC FUNCTION ListCook( arraySrc, cPrefix, cExt )
LOCAL array := AClone( arraySrc )
LOCAL tmp
DEFAULT cPrefix TO ""
@@ -1197,7 +1356,14 @@ STATIC FUNCTION ListToArray( cList )
RETURN array
STATIC FUNCTION DirAdaptPathSep( cFileName )
STATIC FUNCTION PathSepToSelf( cFileName )
#if defined( __PLATFORM__WINDOWS ) .OR. defined( __PLATFORM__DOS ) .OR. defined( __PLATFORM__OS2 )
RETURN StrTran( cFileName, "/", "\" )
#else
RETURN StrTran( cFileName, "\", "/" )
#endif
STATIC FUNCTION PathSepToTarget( cFileName )
IF t_cARCH $ "win|dos|os2" .AND. !( t_cCOMP == "mingw" )
RETURN StrTran( cFileName, "/", "\" )
@@ -1241,6 +1407,13 @@ STATIC FUNCTION FN_ExtSet( cFileName, cExt )
RETURN hb_FNameMerge( cDir, cName, cExt )
STATIC FUNCTION FN_ExtSetDef( cFileName, cExtNew )
LOCAL cDir, cName, cExt
hb_FNameSplit( cFileName, @cDir, @cName, @cExt )
RETURN hb_FNameMerge( cDir, cName, iif( Empty( cExt ) .AND. ! Empty( cExtNew ), cExtNew, cExt ) )
STATIC PROCEDURE HBP_ProcessAll( /* @ */ aLIBS,;
/* @ */ aLIBPATH,;
/* @ */ aOPTPRG,;
@@ -1260,7 +1433,7 @@ STATIC PROCEDURE HBP_ProcessAll( /* @ */ aLIBS,;
LOCAL aFile
FOR EACH aFile IN aFiles
IF ! t_lQuiet
IF t_lInfo
OutStd( "hbmk: Processing: " + aFile[ F_NAME ] + hb_osNewLine() )
ENDIF
HBP_ProcessOne( aFile[ F_NAME ],;
@@ -1319,7 +1492,7 @@ STATIC PROCEDURE HBP_ProcessOne( cFileName,;
DO CASE
CASE Lower( Left( cLine, Len( "libs=" ) ) ) == "libs=" ; cLine := SubStr( cLine, Len( "libs=" ) + 1 )
FOR EACH cItem IN hb_ATokens( cLine,, .T. )
cItem := DirAdaptPathSep( StrStripQuote( cItem ) )
cItem := PathSepToTarget( StrStripQuote( cItem ) )
IF AScan( aLIBS, {| tmp | tmp == cItem } ) == 0
AAddNotEmpty( aLIBS, cItem )
ENDIF
@@ -1327,7 +1500,7 @@ STATIC PROCEDURE HBP_ProcessOne( cFileName,;
CASE Lower( Left( cLine, Len( "libpaths=" ) ) ) == "libpaths=" ; cLine := SubStr( cLine, Len( "libpaths=" ) + 1 )
FOR EACH cItem IN hb_ATokens( cLine,, .T. )
cItem := DirAdaptPathSep( StrStripQuote( cItem ) )
cItem := PathSepToTarget( StrStripQuote( cItem ) )
IF AScan( aLIBPATH, {| tmp | tmp == cItem } ) == 0
AAddNotEmpty( aLIBPATH, cItem )
ENDIF
@@ -1335,7 +1508,7 @@ STATIC PROCEDURE HBP_ProcessOne( cFileName,;
CASE Lower( Left( cLine, Len( "prgflags=" ) ) ) == "prgflags=" ; cLine := SubStr( cLine, Len( "prgflags=" ) + 1 )
FOR EACH cItem IN hb_ATokens( cLine,, .T. )
cItem := DirAdaptPathSep( StrStripQuote( cItem ) )
cItem := PathSepToTarget( StrStripQuote( cItem ) )
IF AScan( aOPTPRG, {| tmp | tmp == cItem } ) == 0
AAddNotEmpty( aOPTPRG, cItem )
ENDIF
@@ -1523,7 +1696,7 @@ FUNCTION hbm_COMP()
STATIC PROCEDURE PauseForKey()
IF hb_gtInfo( HB_GTI_ISGRAPHIC )
IF ! t_lQUIET .AND. hb_gtInfo( HB_GTI_ISGRAPHIC )
OutStd( "Press any key to continue..." )
Inkey( 0 )
ENDIF
@@ -1564,11 +1737,15 @@ STATIC PROCEDURE ShowHelp()
" -[no]trace show commands executed" ,;
" -[no]run run/don't run the created executable" ,;
" -nohbp do not process .hbp files in current directory" ,;
" -cc stop after creating the .c Harbour output files" ,;
" -hbcc stop after creating the .c Harbour output files" ,;
" create link/copy/rename hbmk to hbcc for the same effect" ,;
" -cmp stop after creating the object files" ,;
" -hbcmp stop after creating the object files" ,;
" create link/copy/rename hbmk to hbcc for the same effect" ,;
" -q quiet mode" ,;
" -hblnk act as linker. Currently this is the same as -q" ,;
" -arch=<arch> assume specific architecure. Same as HB_ARCHITECTURE envvar" ,;
" -comp=<comp> use specific compiler. Same as HB_COMPILER envvar" ,;
" -info turn on informational messages (current default)" ,;
" -q suppress logo and informational messages" ,;
"" ,;
"Notes:" ,;
" - Don't forget to create a MAIN() entry function in your application." ,;