Files
harbour-core/harbour/examples/hbmake/hbmake.prg
Viktor Szakats 8c77111447 2009-07-11 07:38 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)
* tests/mathtest.prg
  * tests/testcgi.prg
  * tests/speedold.prg
  * tests/testhtml.prg
  * tests/wvtext.prg
  * tests/testpre.prg
  * tests/testfor.prg
  * doc/en-EN/string.txt
  * doc/en-EN/memvar2.txt
  * source/rtl/gtdos/gtdos.c
  * source/rtl/gtsln/keytrans.c
  * source/rtl/gtsln/mousesln.c
  * source/rtl/gtsln/gtsln.c
  * source/rtl/gtsln/kbsln.c
  * source/rdd/dbfntx/dbfntx1.c
  * source/rdd/dbfnsx/dbfnsx1.c
  * source/compiler/genc.c
  * contrib/gtalleg/ssf.c
  * contrib/hbct/strdiff.c
  * contrib/hbct/tests/csetarge.prg
  * contrib/hbct/dattime2.c
  * contrib/xhb/fparse.c
  * contrib/xhb/ttable.prg
  * contrib/xhb/freadlin.c
  * contrib/xhb/cstruct.prg
  * contrib/hbgt/strasint.c
  * contrib/hbfbird/tests/testapi.c
  * contrib/hbxbp/xbpsle.prg
  * contrib/hbxbp/xbpmenubar.prg
  * contrib/hbxbp/xbpfiledialog.prg
  * contrib/hbxbp/xbpwindow.prg
  * contrib/hbxbp/xbpdialog.prg
  * contrib/hbxbp/xbp3state.prg
  * contrib/hbnf/scancode.prg
  * contrib/hbnf/vidmode.prg
  * contrib/hbnf/vidcur.prg
  * contrib/hbnf/proper.c
  * contrib/hbnf/rand1.prg
  * contrib/hbnf/fttext.c
  * contrib/hbnf/settime.prg
  * contrib/hbnf/page.prg
  * contrib/hbnf/findith.prg
  * contrib/hbnf/at2.prg
  * contrib/hbnf/dispc.c
  * contrib/hbnf/gcd.prg
  * contrib/hbnf/dosver.prg
  * contrib/hbnf/nooccur.prg
  * contrib/hbnf/asum.prg
  * contrib/hbnf/sleep.prg
  * contrib/hbnf/wda.prg
  * contrib/hbnf/any2any.prg
  * contrib/hbnf/setdate.prg
  * contrib/hbnf/amedian.prg
  * contrib/hbnf/blink.prg
  * contrib/hbnf/aredit.prg
  * contrib/hbnf/xbox.prg
  * contrib/hbnf/ftround.prg
  * contrib/hbnf/hex2dec.prg
  * contrib/hbnf/nwuid.prg
  * contrib/hbnf/aemaxlen.prg
  * contrib/hbnf/nwlstat.prg
  * contrib/hbnf/invclr.prg
  * contrib/hbnf/diskfunc.prg
  * contrib/hbnf/scregion.prg
  * contrib/hbnf/d2e.prg
  * contrib/hbnf/anomatch.prg
  * contrib/hbnf/cntryset.prg
  * contrib/hbnf/ntow.prg
  * contrib/hbnf/aeminlen.prg
  * contrib/hbnf/savesets.prg
  * contrib/hbnf/tbwhile.prg
  * contrib/hbnf/calendar.prg
  * contrib/hbnf/e2d.prg
  * contrib/hbnf/sysmem.prg
  * contrib/hbnf/aading.prg
  * contrib/hbnf/pending.prg
  * contrib/gtqtc/tests/demoqtc.prg
  * contrib/gtqtc/gtqtc.cpp
  * contrib/gtwvg/wvgscrlb.prg
  * contrib/gtwvg/wvgclass.prg
  * contrib/gtwvg/wvgax.prg
  * contrib/gtwvg/wvgpaint.prg
  * contrib/gtwvg/wvgdarea.prg
  * contrib/gtwvg/wvgmle.prg
  * contrib/gtwvg/wvglistb.prg
  * contrib/gtwvg/wvggui.c
  * contrib/gtwvg/wvgpushb.prg
  * contrib/gtwvg/wvgsle.prg
  * contrib/gtwvg/tests/demowvg.prg
  * contrib/gtwvg/wincallb.c
  * contrib/gtwvg/wvgmenub.prg
  * contrib/gtwvg/wvgphdlr.prg
  * contrib/gtwvg/wvgcheck.prg
  * contrib/gtwvg/wvgstatb.prg
  * contrib/gtwvg/wvgstatc.prg
  * contrib/gtwvg/wvgcore.c
  * contrib/gtwvg/wvgtabpg.prg
  * contrib/gtwvg/wvg3stat.prg
  * contrib/gtwvg/wvgsink.c
  * contrib/gtwvg/wvgwing.c
  * contrib/hbmisc/hb_f.c
  * contrib/hbmisc/nconvert.prg
  * contrib/hbmisc/doc/en/ht_file.txt
  * contrib/hbvpdf/hbvpdf.prg
  * contrib/hbvpdf/hbvpdft.prg
  * examples/hbdoc/examples/core_es/memvar2.txt
  * examples/hbmake/hbmake.prg
  * examples/hbsqlit2/tests/hbsqlite.prg
  * examples/guestbk/testcgi.prg
  * examples/guestbk/guestbk.prg
  * examples/pe/editorhi.prg
  * examples/terminal/trm_cli.prg
  * examples/terminal/terminal.prg
  * examples/hscript/dir.hs
  * examples/hscript/ugly.hs
    * Minor formatting.
2009-07-11 05:46:08 +00:00

6040 lines
197 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* $Id$
*/
/*
* xHarbour Project source code:
* xHarbour make utility main file
*
* Copyright 2000-2007 Luiz Rafael Culik <culikr@uol.com.br>
* www - http://www.xharbour.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
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/).
*
* As a special exception, the Harbour Project gives permission for
* additional uses of the text contained in its release of Harbour.
*
* The exception is that, if you link the Harbour libraries with other
* files to produce an executable, this does not by itself cause the
* resulting executable to be covered by the GNU General Public License.
* Your use of that executable is in no way restricted on account of
* linking the Harbour library code into it.
*
* This exception does not however invalidate any other reasons why
* the executable file might be covered by the GNU General Public License.
*
* This exception applies only to the code released by the Harbour
* Project under the name Harbour. If you copy code from other
* Harbour Project or Free Software Foundation releases into a copy of
* Harbour, as the General Public License permits, the exception does
* not apply to the code that you add in this way. To avoid misleading
* anyone as to the status of such modified files, you must delete
* this exception notice from them.
*
* If you write modifications of your own for Harbour, it is your choice
* whether to permit this exception to apply to your modifications.
* If you do not wish that, delete this exception notice.
*
*/
/*
* Modified By Sandro Freire sandrorrfreire at yahoo.com.br
* added support for Unix OS
*/
#pragma -w2
#include "hbclass.ch"
#include "achoice.ch"
#include "common.ch"
#include "directry.ch"
#include "fileio.ch"
#include "inkey.ch"
#define HBMAKEID hbMakeID()
#define COPYRIGHT hbMakeCopyright()
#define BLD_ALL 1 /* Build all same as -F */
#define BLD_CHNG 2 /* Build with changed pgms */
#define BLD_NONE 3 /* Don't Compile or Link */
#define BLD_ERR -1 /* Error in a module */
#define HB_FEOF -1 /* hb_FReadLine() EOF rtrn */
#define LANG_PT 1 /* portuguese brazilian */
#define LANG_EN 2 /* english */
#define LANG_ES 3 /* spanish */
#define RET_OK 0 /* Normal exit value */
#define RET_ERR -1 /* Error return value */
#define PGM_ERR 1 /* Program Error Return */
#define PGM_QUIT 0 /* Decided to Quit */
#Define HBM_USE_DEPENDS // Set this to have section #DEPENDS parsed like RMake, Ath 2004-06
// An extra parameter is added to FileIsNewer() to have it check the INCLUDE paths also
// Interactive mode asks whether sources should be scanned for dependencies (#include, set procedure to, set proc to
/*
Beginning Static Variables Table
Default Values for core variables are set here
New Core vars should only be added on this section
*/
STATIC s_lErrors := .F.
STATIC s_lPrint := .F.
STATIC s_lEdit := .F.
STATIC s_aDefines := {}
STATIC s_aBuildOrder := {}
STATIC s_aCommands := {}
STATIC s_aMacros := {}
STATIC s_aPrgs := {}
STATIC s_aContribLibs := {}
#IfDef HBM_USE_DEPENDS
STATIC s_aDepends := {}
#Endif
STATIC s_aCFiles := {} // array of C source files
STATIC s_aObjs := {}
STATIC s_aObjsc := {}
STATIC s_aSrcPaths := {}
STATIC s_lEof := .F.
STATIC s_aResources := {}
STATIC s_nMakeFileHandle := F_ERROR // File starts closed
STATIC s_cLinkFile := "hblink.lnk" // Name will be replaced by s_cApppName.lnk
STATIC s_cLinkCommands := ""
STATIC s_lLinux := .F.
STATIC s_lUnix := .F.
STATIC s_lOS2 := .F.
STATIC s_lWindows := .F.
STATIC s_lBcc := .F. // Borland C compiler
STATIC s_lPocc := .F. // Pelles C compiler
STATIC s_lMSVcc := .F. // MS-Visual C compiler
STATIC s_lGcc := .F. // GNU C compiler
STATIC s_lMinGW := .F. // MinGW C compiler
STATIC s_lForce := .F. // "-f" flag
STATIC s_szProject := ""
STATIC s_lLibrary := .F.
STATIC s_lIgnoreErrors := .F.
STATIC s_lRecursive := .F.
STATIC s_lEditMake := .F.
STATIC s_lCompress := .F.
STATIC s_lContribLib := .F.
STATIC s_aDir
STATIC s_aLangMessages := {}
STATIC s_cAppName := ""
STATIC s_cDefLang
STATIC s_cLog := "" // log file name.
STATIC s_cMap := "" // map file name. For borland c
STATIC s_cTds := "" // state file name. For borland c
STATIC s_lGenPpo := .F.
STATIC s_nLang := LANG_EN // default language is english
STATIC s_lMt := .F.
STATIC s_cUserDefine := ""
STATIC s_cUserInclude := ""
STATIC s_cUserLibs := "" // user libs located other than "harbour\lib"
STATIC s_lxFwh := .F.
STATIC s_nFilesToAdd := 5
STATIC s_nWarningLevel := 0
STATIC s_lAsDll := .F.
STATIC s_cObjDir := "obj"
STATIC s_lGui := .F.
STATIC s_cEditor := ""
STATIC s_cHarbourDir := ""
STATIC s_lGenCsource := .F. // Generate PCode by default // Ath added 31-05-2006
STATIC s_cInvalidExt := {".prg",".c",".cpp",".ch",".h",".ppo",".bat",".doc",".txt",".dbf",".ntx",".cdx",".dbt",".fpt",".mem"}
STATIC s_aEOL // for hb_FReadLine() array of End-of-Line (EOF) array
STATIC s_cEOL // EOL terminator used by system compiled on
*---------------------------------------------
FUNCTION MAIN()
*---------------------------------------------
LOCAL cAlertMsg := ""
LOCAL aFile := {}
LOCAL aDef := {}
LOCAL cExp,cLib
LOCAL cExt := ""
LOCAL cFile := ""
LOCAL cMakeParams := ""
LOCAL cOldColor := SETCOLOR()
LOCAL lCreateAndCompile := .F. // not used but must be set to .f. for now
LOCAL nBuildType := 0
LOCAL nLang := GETUSERLANG()
LOCAL nPos
LOCAL nRowPos
DEFAULT s_cEOL TO hb_OsNewLine()
/* NOTE: Please don't modify the formatting or layout. We have a common
header/help layout for all Harbour command-line tools, and
- in case an update - they need to be modified together. Thank you.
[vszakats] */
OutErr( "------------------------------------------------------------------------" + s_cEOL )
OutErr( "Warning: This make tool isn't supported anymore by Harbour team. It will" + s_cEOL )
OutErr( " be removed in next release. Please try its successor: hbmk2" + s_cEOL )
OutErr( "------------------------------------------------------------------------" + s_cEOL )
OutErr( HBMAKEID + " " + HBRawVersion() + s_cEOL )
OutErr( COPYRIGHT + s_cEOL )
IF ( PCount() == 0 ) .or. ( CmdLineParam( @cFile, @cMakeParams ) == RET_ERR )
ShowHelp()
RETURN PGM_ERR
ENDIF
SET SCORE OFF
SET CENTURY ON
nPos := AT( ".", cFile )
cExt := IIF( nPos > 0, SUBSTR( cFile, nPos ), ".mak" )
// TOFIX: Needs to be case sensitive for non-WinDOS [vszakats]
// >--> Not really used in the pgm so it's OK
IF ! EMPTY(cExt) .AND. AScan( s_cInvalidExt, {|x| x == lower(cExt) } ) > 0
ShowHelp( "Invalid extension for hbmake script file <" + cFile + ">." )
Return PGM_ERR
ENDIF
FERASE( s_cLinkFile )
s_cHarbourDir := GetHarbourDir()
IF EMPTY( s_cHarbourDir )
IF s_nlang == LANG_PT /* portuguese brazilian */
cAlertMsg := "hbmake necessita do harbour bin no path."
ELSEIF s_nLang == LANG_ES /* spanish */
cAlertMsg := "hbmake necessita de lo harbour bin en lo path."
ELSE /* english */
cAlertMsg := "hbmake needs harbour bin in the path."
ENDIF
ShowHelp( cAlertMsg )
hb_run( "PATH" )
RETURN PGM_ERR
ENDIF
IF s_nlang == LANG_PT /* portuguese brazilian */
SET DATE BRITISH
ELSE /* english or spanish */
SET DATE ANSI
ENDIF
IF s_lForce .and. !FILE( cFile )
IF s_nlang == LANG_PT /* portuguese brazilian */
cAlertMsg := " Arquivo <" + cFile + "> nÆo encontrado."
ELSEIF s_nLang == LANG_ES /* spanish */
cAlertMsg := " Fichero <" + cFile + "> no encontrado."
ELSE /* english */
cAlertMsg := " Makefile <" + cFile + "> not found."
ENDIF
cAlertMsg += s_cEOL + " Add -e to edit a new makefile or -h for help." + s_cEOL
QOUT( cAlertMsg )
RETURN PGM_ERR
ENDIF
s_aLangMessages := BuildLangArray()
s_cAppName := SUBSTR( cFile,1 , AT(".",cFile) -1)
s_cLog := s_cAppName + ".log"
cExp := s_cAppName + ".exp"
cLib := s_cAppName + ".lib"
FErase( s_cAppName + ".out" )
FErase( s_cLog )
IF s_lBcc
/* if you need of these files, comment the lines below. */
s_cMap := s_cAppName + ".map"
s_cTds := s_cAppName + ".tds"
FErase( s_cMap )
FErase( s_cTds )
ENDIF
/* Edit/Create MakeFile... */
IF s_lEdit .or. ! s_lForce
nRowPos := ROW()
IF ! FILE( cFile )
lCreateAndCompile := ( "-C" $ cMakeParams )
ELSE
lCreateAndCompile := .f.
cMakeParams := STRTRAN( cMakeParams, "-C","" )
ENDIF
nBuildType := IIF( s_lLibrary, CreateLibMakeFile( cFile ), ;
/* Else */ CreateMakeFile( cFile, lCreateAndCompile ) )
SETPOS( nRowPos + 1, 0 )
DO CASE
CASE nBuildType == BLD_ERR
SETCOLOR( cOldColor )
ShowHelp( "Error creating link file." )
RETURN PGM_ERR
CASE nBuildType == BLD_ALL
s_lForce := .T.
CASE nBuildType == BLD_CHNG
s_lForce := .F.
CASE nBuildType == BLD_NONE
IF s_lErrors
QOUT( s_cEOL + "Program had errors, check " + s_cLog )
SETCOLOR( cOldColor )
RETURN PGM_ERR
ELSE
SETCOLOR( cOldColor )
QOUT( s_cEOL)
RETURN PGM_QUIT
ENDIF
OTHERWISE
SETCOLOR( cOldColor )
QOUT( s_cEOL + "Unknown Build returned, quitting, check " + s_cLog )
RETURN PGM_ERR
ENDCASE
/* Restore the statics necessary to read again in ParseMakeFile */
s_aCFiles := {}
s_aCommands := {}
s_aContribLibs := {}
s_aDefines := {}
#IfDef HBM_USE_DEPENDS
s_aDepends := {}
#Endif
s_aMacros := {}
s_aObjs := {}
s_aObjsc := {}
s_aPrgs := {}
ENDIF
/* Compile MakeFile...
* Make file is parsed here
*/
IF ParseMakeFile( cFile ) == RET_ERR
IF s_nLang == LANG_PT /* portuguese brazilian */
cAlertMsg := "<" + cFile + "> nÆo pode ser aberto. FERROR(" + hb_NToS(FError()) + "). O HbMake ser  fechado."
ELSEIF s_nLang == LANG_ES /* spanish */
cAlertMsg := "<" + cFile + "> no pode ser abierto. FERROR(" + hb_NToS(FError()) + "). Lo HbMake ser  cerrado."
ELSE /* english */
cAlertMsg := "<" + cFile + "> cannot be opened. FERROR(" + hb_NToS(FError()) + "). HbMake will close."
ENDIF
ShowHelp( cAlertMsg )
RETURN PGM_ERR
ENDIF
IF s_lPrint
PrintMacros()
ENDIF
IF ! hb_DirExists( s_cObjDir )
#ifdef HB_COMPAT_C53
MakeDir( s_cObjDir )
#endif
ENDIF
if Hb_IsNil(s_lGenppo) .OR. s_lGenppo == .F.
FErase( s_cAppName + ".ppo" )
endif
IF s_lForce
s_lErrors := CompileFiles()
ELSE
s_lErrors := CompileUpdatedFiles()
ENDIF
s_lErrors := IIF( hb_run( s_cLinkCommands ) != 0, .T., .F. )
IF s_lCompress .AND. !s_lLibrary
s_lErrors := IIF( hb_run( " upx -9 " + (s_cAppName) ) != 0, .T., .F. )
ENDIF
IF s_lasdll .or. LOWER( RIGHT( s_cAppName, 4 ) ) == ".dll"
s_lErrors := IIF ( hb_run( ReplaceMacros("implib $(HB_DIR)\lib\" + ;
LEFT( s_cAppName, at( ".", s_cAppName ) - 1 ) + ".lib " + ;
s_cAppName ) ), .T., .F. )
ENDIF
IF s_lBcc
/*
NOTE: The TDS file is always created by borland linker.
If you need of this file, comment the lines below and
remove "-x" flag that is created by hbmake in the
LFLAGS statment for Borland compiler.
*/
FErase( s_cMap )
FErase( s_cTds )
ENDIF
IF s_lPocc
FErase( cExp )
IF !s_lLibrary
FErase( cLib )
ENDIF
ENDIF
IF s_lErrors
QOUT( s_cEOL + "Program had errors, check " + s_cLog )
ENDIF
SETCOLOR( cOldColor )
RETURN PGM_QUIT
*------------------------------
FUNCTION ParseMakeFile( cFile )
*------------------------------
LOCAL cBuffer
LOCAL cMacro := iif(s_lMSVcc,"#MSVC",iif(s_lPocc,"#POCC",iif(s_lGcc,"#GCC","#BCC")))
LOCAL cDep := "#DEPENDS"
LOCAL cOpt := "#OPTS"
LOCAL cCom := "#COMMANDS"
LOCAL cBuild := "#BUILD"
LOCAL cTemp := ""
LOCAL cTemp1 := ""
LOCAL aTemp := {}
LOCAL lMacrosec := .T.
LOCAL lBuildSec := .F.
LOCAL lComSec := .F.
#IFDEF HBM_USE_DEPENDS
LOCAL lDepSec := .F.
#ENDIF
LOCAL aTemp1 := {}
LOCAL cCfg := ""
LOCAL aTempCFiles := {}
LOCAL lLinux := s_lLinux
LOCAL lUnix := s_lUnix
LOCAL aLib
LOCAL aLibx
LOCAL lDjgpp := "GNU C" $ HB_COMPILER()
LOCAL x := 1
LOCAL nFHandle
LOCAL cTrash :=""
LOCAL lErrors := .F.
nFHandle := FOpen( cFile, FO_READ )
IF nFHandle < 1
RETURN RET_ERR /* Couldn't open makefile */
ENDIF
#IFndef __PLATFORM__WINDOWS
IF !FILE( "hbtemp.c" )
CreateLink()
ENDIF
#ENDIF
IF hb_FReadLine( nFHandle, @cBuffer, s_aEOL ) == HB_FEOF
RETURN RET_ERR
ENDIF
cBuffer := Trim( cBuffer )
AAdd( s_aDefines, { "HARBOUR_DIR", s_cHarbourDir } )
IF s_lBcc
AAdd( s_aDefines, { "MAKE_DIR", GetBccDir() } )
ELSEIF s_lGcc
AAdd( s_aDefines, { "MAKE_DIR", GetGccDir() } )
ELSEIF s_lMSVcc
AAdd( s_aDefines, { "MAKE_DIR", GetVccDir() } )
ELSEIF s_lPocc
AAdd( s_aDefines, { "MAKE_DIR", GetPoccDir() } )
ENDIF
WHILE ! s_lEof
IF cMacro $ cBuffer
lMacroSec := .T.
lBuildSec := .F.
lComSec := .F.
#IFDEF HBM_USE_DEPENDS
lDepSec := .F.
#Endif
ELSEIF cBuild $ cBuffer
lMacroSec := .F.
lBuildSec := .T.
lComSec := .F.
#IfDef HBM_USE_DEPENDS
lDepSec := .F.
#Endif
ELSEIF cCom $ cBuffer
lBuildSec := .F.
lComSec := .T.
lMacroSec := .F.
#IfDef HBM_USE_DEPENDS
lDepSec := .F.
ELSEIF cDep $ cBuffer
lBuildSec := .F.
lComSec := .F.
lMacroSec := .F.
lDepSec := .T.
#Endif
ELSE
? "Invalid Make File"
FClose( nFHandle )
RETURN RET_ERR
ENDIF
s_lEof:= ( hb_FReadLine( nFHandle, @ cTemp, s_aEOL ) == HB_FEOF )
/* Nothing to do if Line is empty
*/
IF EMPTY( cTemp )
LOOP
ENDIF
cTemp := Trim( cTemp )
IF "//" $ cTemp
WHILE At( "//", cTemp ) > 0
cTemp := STRTRAN( cTemp, " //", "" )
s_lEof:= (hb_FReadLine( nFHandle, @cTemp1, s_aEOL ) == HB_FEOF)
cTemp += Trim( cTemp1 )
ENDDO
cTemp := STRTRAN( cTemp, " //", "" )
ENDIF
aTemp := ListAsArray2( ALLTRIM( cTemp ), "=" )
IF lmacrosec
IF ALLTRIM( Left( cTemp, 7 ) ) <> "!ifndef" .AND. ALLTRIM( Left( cTemp, 6 ) ) <> "!endif" .AND. ALLTRIM( Left( cTemp, 7 ) ) <> "!IFfile" .AND. ALLTRIM( Left( cTemp, 7 ) ) <> "!stdout" .AND. ALLTRIM( Left( cTemp, 6 ) ) <> "!ifdef"
IF Len( aTemp ) > 1
IF "$" $ aTemp[ 2 ]
IF ( s_lGcc .AND. ( aTemp[ 1 ] == "CFLAG1" ) ) .OR. ( s_lGcc .AND. ( aTemp[ 1 ] == "CFLAG2" ) )
AAdd( s_aMacros, { aTemp[ 1 ], STRTRAN( ReplaceMacros( aTemp[ 2 ] ), "\", "/" ) } )
x++
ELSE
IF aTemp[ 1 ] == "MT" .AND. aTemp[ 2 ] == "YES"
s_lMt := .T.
ENDIF
IF aTemp[ 1 ] == "HBLIBS" .AND. ! s_lMt
aLib := ListAsArray2( aTemp[ 2 ], " " )
FOR each aLibx in aLib
IF At( "mt.lib", Lower( aLibx ) ) > 0
s_lMt := .T.
ENDIF
IF "-l" $ Lower( aLibx )
s_lBcc := .F.
s_lGcc := .T.
s_lMSVcc := .F.
s_lPocc := .F.
s_aDefines[2] := { "MAKE_DIR", GetGccDir() }
s_aDefines[3] := { "HARBOUR_DIR", s_cHarbourDir }
ENDIF
NEXT
ENDIF
IF aTemp[ 1 ] == "ALLOBJ" .AND. ! s_lMt
ENDIF
AAdd( s_aMacros, { aTemp[ 1 ], ReplaceMacros( aTemp[ 2 ] ) } )
ENDIF
ELSE
IF ( s_lGcc .AND. ( aTemp[ 1 ] == "CFLAG1" ) ) .OR. ( s_lGcc .AND. ( aTemp[ 1 ] == "CFLAG2" ) )
AAdd( s_aMacros, { aTemp[ 1 ], STRTRAN( aTemp[ 2 ], "\", "/" ) } )
x++
ELSE
IF aTemp[ 1 ] == "HBLIBS" .AND. ! s_lMt
aLib := ListAsArray2( aTemp[ 2 ], " " )
FOR each aLibx in aLib
IF AT( "mt.lib", LOWER( aLibx ) ) > 0
s_lMt := .T.
ENDIF
IF "-l" $ LOWER( aLibx )
s_lBcc := .F.
s_lGcc := .T.
s_lMSVcc := .F.
s_lPocc := .F.
s_aDefines[2] := { "MAKE_DIR", GetGccDir() }
s_aMacros[2,2] := GetGccDir()
ENDIF
NEXT
ELSEIF aTemp[ 1 ] == "SHELL"
IF !EMPTY( Atemp[ 2 ] )
lErrors := IIF( hb_run( Atemp[ 2 ] + " > e.txt" ) == 0, .F., .T. )
s_lErrors := IIF( lErrors, .T., s_lErrors )
IF ! lErrors
aTemp[ 2 ] := ALLTRIM( hb_MEMOREAD( "e.txt" ) )
aTemp[ 2 ] := STRTRAN( aTemp[ 2 ], chr( 13 ), "" )
aTemp[ 2 ] := STRTRAN( aTemp[ 2 ], chr( 10 ), "" )
ENDIF
FERASE("e.txt")
ENDIF
ENDIF
AADD( s_aMacros, { aTemp[ 1 ], aTemp[ 2 ] } )
ENDIF
ENDIF
ENDIF
IF aTemp[ 1 ] == "COMPRESS"
s_lCompress := "YES" $ aTemp[ 2 ]
ENDIF
IF aTemp[ 1 ] == "GUI"
s_lGui := "YES" $ aTemp[ 2 ]
ENDIF
IF aTemp[ 1 ] == "CONTRIBLIB"
s_lContribLib := "YES" $ aTemp[ 2 ]
ENDIF
IF aTemp[ 1 ] == "OBJDIR" // obj dir
s_cObjDir := aTemp[ 2 ]
ENDIF
IF aTemp[ 1 ] == "PROJECT"
IF At( ".lib", aTemp[ 2 ] ) > 0 .OR. At( ".a", aTemp[ 2 ] ) > 0
s_lLibrary := .T.
ENDIF
s_cAppName := SUBSTR( aTemp[ 2 ], 1, AT( " ", aTemp[ 2 ] ) -1 )
ENDIF
IF aTemp[ 1 ] == "OBJFILES"
s_aObjs := ListAsArray2( ReplaceMacros( aTemp[ 2 ] ), " " )
ENDIF
IF aTemp[ 1 ] == "OBJCFILES"
aTemp1 := ListAsArray2( ReplaceMacros( aTemp[ 2 ] ), " " )
IF Len( aTemp1 ) == 1
IF ! EMPTY( aTemp[ 1 ] )
s_aObjsC := ListAsArray2( ReplaceMacros( aTemp[ 2 ] ), " " )
ENDIF
ELSE
s_aObjsC := ListAsArray2( ReplaceMacros( aTemp[ 2 ] ), " " )
ENDIF
ENDIF
IF aTemp[ 1 ] == "PRGFILES"
s_aPrgs := ListAsArray2( ReplaceMacros( aTemp[ 2 ] ), " " )
ENDIF
IF aTemp[ 1 ] == "PRGFILE"
s_aPrgs := ListAsArray2( ReplaceMacros( aTemp[ 2 ] ), " " )
ENDIF
IF aTemp[ 1 ] == "CONTRIBLIBS"
s_aContribLibs := ListAsArray2( ReplaceMacros( aTemp[ 2 ] ), " " )
ENDIF
IF aTemp[ 1 ] == "CFILES"
aTempCFiles := ListAsArray2( ReplaceMacros( aTemp[ 2 ] ), " " )
IF ( Len( aTempCFiles ) == 1 )
IF ! EMPTY( aTempCFiles[ 1 ] )
s_aCFiles := ListAsArray2( ReplaceMacros( aTemp[ 2 ] ), " " )
ENDIF
ELSE
s_aCFiles := ListAsArray2( ReplaceMacros( aTemp[ 2 ] ), " " )
ENDIF
ENDIF
IF aTemp[ 1 ] == "RESFILES"
s_aResources := ListAsArray2( ReplaceMacros( aTemp[ 2 ] ), " " )
ENDIF
IF aTemp[ 1 ] == "EDITOR"
s_cEditor := Trim( aTemp[ 2 ] )
ENDIF
ELSE
IF "!ifndef" $ cTemp
CheckDefine( nFHandle, cTemp )
ELSEIF "!ifdef" $ cTemp
CheckIFdef( nFHandle, cTemp )
ELSEIF "!iffile" $ cTemp
CheckIFFile( cTemp )
ELSEIF "!stdout" $ cTemp
CheckStdOut( nFHandle, cTemp )
ENDIF
ENDIF
ENDIF
IF s_lMingw .and. s_lGcc
x := ascan(s_aMacros,{|x| X[1] == "HB_DIR"})
IF x>0
IF s_aMacros[x,2] != s_cHarbourDir
s_aMacros[x,2] := s_cHarbourDir
ENDIF
ENDIF
ENDIF
IF lBuildSec
s_szProject := cTemp
s_aBuildOrder := ListAsArray2( cTemp, ":" )
IF !s_lLibrary
SetBuild( nFHandle )
ELSE
SetBuildLib( nFHandle )
ENDIF
ENDIF
IF lComSec
IF ! EMPTY( cTemp )
Setcommands( nFHandle, cTemp )
ENDIF
ENDIF
#IfDef HBM_USE_DEPENDS
IF lDepSec
IF ! EMPTY( cTemp )
SetDependencies( cTemp )
ENDIF
ENDIF
#Endif
IF cTemp == "#BUILD"
cBuffer := cTemp
ELSEIF cTemp == "#COMMANDS"
cbuffer := cTemp
#IfDef HBM_USE_DEPENDS
ELSEIF cTemp == "#DEPENDS"
cbuffer := cTemp
#Endif
ENDIF
ENDDO
FCLOSE( nFHandle ) // Close the opened file & release memory
RETURN RET_OK
*----------------------------
FUNCTION Checkdefine( nFHandle, cTemp )
*----------------------------
LOCAL nPos
LOCAL cRead
LOCAL aSet := {}
LOCAL nMakePos
IF cTemp == "!endif"
RETURN NIL
ENDIF
s_lEof:= (hb_FReadLine( nFHandle, @cTemp, s_aEOL ) == HB_FEOF)
cTemp := Trim( cTemp )
cTemp := STRTRAN( cTemp, "!ifndef ", "" )
cTemp := STRTRAN( cTemp, "\..", "" )
cTemp := STRTRAN( cTemp, "/..", "" )
IF "\.." $ cTemp
cTemp := SUBSTR( cTemp, 1, At( "\..", cTemp ) - 1 )
ELSEIF "/.." $ cTemp
cTemp := SUBSTR( cTemp, 1, At( "/..", cTemp ) - 1 )
ENDIF
aSet := ListAsArray2( cTemp, "=" )
nPos := AScan( s_aDefines, { | x | x[ 1 ] == aSet[ 1 ] } )
IF nPos == 0
cRead := ALLTRIM( STRTRAN( aSet[ 2 ], "$(", "" ) )
cRead := STRTRAN( cRead, ")", "" )
nMakePos := AScan( s_aDefines, { | x | x[ 1 ] == cRead } )
IF nMakePos > 0
AAdd( s_aDefines, { aSet[ 1 ], s_aDefines[ nMakePos, 2 ] } )
AAdd( s_aMacros, { aSet[ 1 ], s_aDefines[ nMakePos, 2 ] } )
ENDIF
ENDIF
RETURN NIL
*----------------------------
FUNCTION Setcommands( nFHandle, cTemp )
*----------------------------
LOCAL cRead
LOCAL nCount := 0
LOCAL aTempMacros := {}
LOCAL aLocalMacros := {}
s_lEof := (hb_FReadLine( nFHandle, @cRead, s_aEOL ) == HB_FEOF)
cRead := ALLTRIM( cRead )
aTempMacros := ListAsArray2( cRead, " " )
AEval( aTempMacros, { | xMacro | IIF( At( "$", xMacro ) > 0, ;
IIF( At( ";", xMacro ) > 0, ( aLocalMacros := ListAsArray2( xMacro, ";" ), ;
AEval( aLocalMacros, { | x | Findmacro( x, @cRead ) } ) ), ;
Findmacro( xMacro, @cRead ) ), ) } )
AAdd( s_aCommands, { cTemp, cRead } )
RETURN NIL
#IfDef HBM_USE_DEPENDS
*--------------------------------
FUNCTION SetDependencies( cTemp )
*--------------------------------
LOCAL nCount := 0
LOCAL aTempMacros := {}
LOCAL aLocalMacros := {}
LOCAL cTmp := ""
aTempMacros := ListAsArray2( ReplaceMacros(cTemp), " " )
IF Len( aTempMacros ) > 1
cTmp := aTempMacros[ 1 ]
IF Right(cTmp,1) == ":"
cTmp := Left(cTmp,Len(cTmp) - 1)
ENDIF
aTempMacros := ADel( aTempMacros , 1)
ASize(aTempMacros,Len(aTempMacros) - 1)
AAdd( s_aDepends, { cTmp, AClone( aTempMacros ) } )
ENDIF
RETURN NIL
#Endif
*----------------------------------
FUNCTION Findmacro( cMacro, cRead )
*----------------------------------
LOCAL nPos
LOCAL cTemp
LOCAL aLocalMacros := {}
cMacro := SUBSTR( cMacro, 1, At( ")", cMacro ) )
IF "-" $ cMacro
cMacro := SUBSTR( cMacro, 3 )
ENDIF
IF ";" $ cMacro
cMacro := SUBSTR( cMacro, At( ";", cMacro ) + 1 )
ENDIF
nPos := AScan( s_aMacros, { | x | "$(" + ALLTRIM( x[ 1 ] ) + ")" == cMacro } )
IF nPos == 0
cTemp := STRTRAN( cMacro, "$(", "" )
cTemp := STRTRAN( cTemp, ")", "" )
IF ! EMPTY( cTemp )
cRead := ALLTRIM( STRTRAN( cRead, cMacro, Gete( cTemp ) ) )
ENDIF
ELSE
cRead := ALLTRIM( STRTRAN( cRead, cMacro, s_aMacros[ npos, 2 ] ) )
ENDIF
RETURN cRead
*--------------------------------
FUNCTION ReplaceMacros( cMacros )
*--------------------------------
LOCAL nCount := 0
LOCAL aTempMacros := {}
LOCAL aLocalMacros := {}
LOCAL cLibPath := ""
LOCAL cLibPath1 := ""
LOCAL cLibPath2:= ""
IF "/LIBPATH2:" $ cMacros
cLibPath2 := "/LIBPATH2:"
cMacros := STRTRAN(cMacros,cLibPath2,"cccccccccc ")
ENDIF
IF "/LIBPATH1:" $ cMacros
cLibPath1 := "/LIBPATH1:"
cMacros := STRTRAN(cMacros,cLibPath1,"bbbbbbbbbb ")
ENDIF
IF "/LIBPATH:" $ cMacros
cLibPath := "/LIBPATH:"
cMacros := STRTRAN(cMacros,cLibPath,"aaaaaaaaaa ")
ENDIF
aTempMacros := ListAsArray2( cMacros, " " )
AEval( aTempMacros, { | xMacro | IIF( "$" $ xMacro , ;
IIF( ";" $ xMacro , ( aLocalMacros := ListAsArray2( xMacro, ";" ), ;
AEval( aLocalMacros, { | x | Findmacro( x, @cMacros ) } ) ), ;
Findmacro( xMacro, @cMacros ) ), ) } )
IF ! EMPTY(cLibPath)
cMacros := STRTRAN(cMacros,"aaaaaaaaaa ","/LIBPATH:")
cMacros := STRTRAN(cMacros,"bbbbbbbbbb ","/LIBPATH:")
cMacros := STRTRAN(cMacros,"cccccccccc ","/LIBPATH:")
IF s_lPocc
cMacros := STRTRAN(cMacros,"\BIN","")
cMacros := STRTRAN(cMacros,"\bin","")
ENDIF
ENDIF
RETURN cMacros
*------------------
FUNCTION SetBuild( nFHandle )
*------------------
LOCAL cAlertMsg
LOCAL cRead
LOCAL nPos
LOCAL aMacro
LOCAL aTemp
LOCAL cCurrentRead := ""
LOCAL cMacro
LOCAL xInfo
LOCAL xItem
s_lEof := (hb_FReadLine( nFHandle, @cRead, s_aEOL ) == HB_FEOF)
cRead := ALLTRIM( cRead )
s_szProject := cRead
aMacro := ListAsArray2( cRead, ":" )
IF Len( aMacro ) > 1
aTemp := ListAsArray2( aMacro[ 2 ], " " )
AEval( aTemp, { | xItem | AAdd( s_aBuildOrder, xItem ) } )
ENDIF
AAdd( s_aBuildOrder, aMacro[ 1 ] )
cRead := STRTRAN( cRead, "@&&!", "" )
aMacro := ListAsArray2( cRead, "\" )
AEval( aMacro, { | xMacro | IIF( "$" $ xMacro , FindMacro( xMacro, @cRead ), ) } )
IF ! s_lLinux .AND. !s_lMinGW
s_cLinkCommands := cRead + " @" + s_cLinkFile
s_nMakeFileHandle := FCreate( s_cLinkFile )
IF s_nMakeFileHandle == F_ERROR
IF s_nLang == LANG_PT /* portuguese brazilian */
cAlertMsg := "<"+s_cLinkFile + "> nÆo pode ser criado."
ELSEIF s_nLang == LANG_ES /* spanish */
cAlertMsg := "<"+s_cLinkFile + "> no pode ser criado."
ELSE /* english */
cAlertMsg := "<"+s_cLinkFile + "> cannot be created."
ENDIF
ALERT( cAlertMsg+" FERROR ("+hb_NToS(FError())+")" )
RETURN NIL
ENDIF
ELSE
s_cLinkCommands := cRead + " "
ENDIF
FOR nPos := 1 TO 7
s_lEof := (hb_FReadLine( nFHandle, @cRead, s_aEOL ) == HB_FEOF)
cRead := ALLTRIM( cRead )
cCurrentRead := cRead
aMacro := ListAsArray2( cRead, " " )
FOR EACH cMacro IN aMacro
IF "$" $ cMacro
FindMacro( cMacro , @cRead )
IF At( "$(PROJECT)", cCurrentRead ) > 0
IF ! s_lGcc
IF ! s_lLinux
IF s_lMSVcc .OR. s_lPocc
cRead := STRTRAN(cRead,",","")
cRead := STRTRAN(cRead,"+","")
xInfo := iif(s_lMSVcc," -out:","/out:")
xInfo += cRead
cRead := xInfo
ENDIF
FWrite( s_nMakeFileHandle, cRead + s_cEOL )
ENDIF
ELSEIF s_lGcc .AND. s_lLinux .OR. ( s_lGcc .AND. s_lMinGW)
s_cLinkCommands += "-o " + cRead + " "
ELSEIF s_lGcc .AND. ! s_lLinux .AND. At( ".exe", cRead ) > 0
FWrite( s_nMakeFileHandle, "-o " + cRead + s_cEOL )
ENDIF
ELSE
IF ! s_lLinux
IF s_lMsVcc .OR. s_lPocc
cRead := STRTRAN(cRead,",","")
cRead := STRTRAN(cRead,"+","")
aTemp := ListAsArray2( cRead, " " )
cRead :=""
FOR EACH xItem IN aTemp
cRead +=xItem+s_cEOL
NEXT
cRead := SUBSTR(cRead,1,rat(s_cEOL,cRead)-1)
ENDIF
IF s_lMinGW
s_cLinkCommands += STRTRAN(cRead,"/","\") + " "
ELSE
FWrite( s_nMakeFileHandle, cRead + s_cEOL )
ENDIF
ELSE
s_cLinkCommands += cRead + " "
ENDIF
ENDIF
ENDIF
NEXT
NEXT
//IF !s_lLinux .and. s_lMinGW
IF s_lWindows .OR. s_lOS2 .OR. s_lMinGW
FClose( s_nMakeFileHandle )
s_nMakeFileHandle:= F_ERROR // Invalid handle now file is closed
ENDIF
IF s_lMsVcc
s_cLinkCommands +=" /nologo " + IIF( s_lGui, "/SUBSYSTEM:WINDOWS"," /SUBSYSTEM:CONSOLE") + " /force:multiple "
ENDIF
RETURN NIL
*----------------------
FUNCTION CompileFiles()
*----------------------
LOCAL cScreen
LOCAL cComm
LOCAL cOld
LOCAL nPos
LOCAL nFiles
LOCAL cErrText := ""
LOCAL aOrder := ListAsArray2( s_aBuildOrder[ 2 ], " " )
LOCAL lErrors
LOCAL xItem
LOCAL lLinux := s_lLinux
LOCAL cPrg := ""
LOCAL cOrder := ""
LOCAL nFile := 1
FOR EACH cOrder IN aOrder
IF cOrder == "$(CFILES)"
IF s_lGcc
nPos := AScan( s_aCommands, { | x | x[ 1 ] == ".c.o:" .OR. x[ 1 ] == ".cpp.o:" } )
ELSE
nPos := AScan( s_aCommands, { | x | x[ 1 ] == ".c.obj:" .OR. x[ 1 ] == ".cpp.obj:" } )
ENDIF
IF nPos > 0
cComm := s_aCommands[ nPos, 2 ]
cOld := cComm
ELSE
nPos := AScan( s_aCommands, { | x | x[ 1 ] == ".C.OBJ:" } )
IF nPos > 0
cComm := s_aCommands[ nPos, 2 ]
cOld := cComm
ENDIF
ENDIF
IF Len( s_aCFiles ) > 0
nFile := 1
FOR nFiles := 1 TO Len( s_aCFiles )
xItem := SUBSTR( s_aCFiles[ nFiles ], Rat( IIF( s_lGcc, "/", "\" ), ;
s_aCFiles[ nFiles ] ) + 1 )
nPos := AScan( s_aObjsC, { | x | x := SUBSTR( x, Rat( IIF( s_lGcc, "/", "\" ), x ) + 1 ), ;
Left( x, At( ".", x ) ) == Left( xitem, At( ".", xitem ) ) } )
IF nPos > 0
IF llinux
cComm := STRTRAN( cComm, "o$*", "o" + s_aObjsC[ nPos ] )
ELSE
IF s_lMSVcc //.OR. s_lPocc
cComm := STRTRAN( cComm, "-Fo$*", "-Fo" + STRTRAN( s_aObjsC[ nPos ], "/", "\" ) )
ELSE
cComm := STRTRAN( cComm, "o$*", "o" + STRTRAN( s_aObjsC[ nPos ], "/", "\" ) )
ENDIF
ENDIF
cComm := STRTRAN( cComm, "$**", s_aCFiles[ nFiles ] )
cComm += IIF( s_lLinux , " "," >>"+ (s_cLog))
nFile ++
if s_lMingw
cComm := STRTRAN(cComm ,"\","/")
endif
lErrors := IIF( hb_run( cComm ) != 0, .T., .F. )
s_lErrors := IIF( lErrors, .T., s_lErrors )
IF ! s_lIgnoreErrors .AND. lErrors
cScreen := SAVESCREEN()
hb_run( s_cEditor + " " + s_cLog )
RESTSCREEN( ,,,, cScreen )
QUIT
ENDIF
cComm := cOld
ENDIF
NEXT
ENDIF
ENDIF
IF cOrder == "$(OBJFILES)"
IF s_lGcc
nPos := AScan( s_aCommands, { | x | x[ 1 ] == ".prg.o:" } )
ELSE
nPos := AScan( s_aCommands, { | x | x[ 1 ] == ".prg.obj:" } )
ENDIF
IF nPos > 0
cComm := s_aCommands[ nPos, 2 ]
cOld := cComm
ELSE
IF s_lGcc
nPos := AScan( s_aCommands, { | x | x[ 1 ] == ".PRG.O:" } )
ELSE
nPos := AScan( s_aCommands, { | x | x[ 1 ] == ".PRG.OBJ:" } )
ENDIF
ENDIF
nFile := 1
FOR EACH cPrg IN s_aPrgs
IF EMPTY( cPrg )
LOOP
ENDIF
xItem := SUBSTR( cPrg, Rat( IIF( s_lGcc, "/", "\" ), cPrg ) + 1 )
nPos := AScan( s_aObjs, { | x | x := SUBSTR( x, Rat( IIF( s_lGcc, "/", "\" ), x ) + 1 ), ;
Left( x, At( ".", x ) ) == Left( xItem, At( ".", xitem ) ) } )
IF nPos > 0
IF llinux
cComm := STRTRAN( cComm, "o$*", "o" + s_aObjs[ nPos ] )
ELSE
IF s_lMSVcc //.OR. s_lPocc
cComm := STRTRAN( cComm, "-Fo$*", "-Fo" + STRTRAN( s_aObjs[ nPos ], "/", "\" ) )
ELSE
cComm := STRTRAN( cComm, "o$*", "o" + STRTRAN( s_aObjs[ nPos ], "/", "\" ) )
ENDIF
ENDIF
cComm := STRTRAN( cComm, "$**", cPrg )
cComm += IIF( s_lLinux , " > "+ (s_cLog)," >>"+ (s_cLog))
nFile ++
lErrors := IIF( hb_run( cComm ) != 0, .T., .F. )
s_lErrors := IIF( lErrors, .T., s_lErrors )
IF ! s_lIgnoreErrors .AND. lErrors
hb_run( s_cEditor + " " + s_cLog )
QUIT
ENDIF
cComm := cOld
ENDIF
NEXT
ENDIF
IF cOrder == "$(RESDEPEN)"
nPos := AScan( s_aCommands, { | x | x[ 1 ] == ".rc.res:" } )
IF nPos > 0
cComm := s_aCommands[ nPos, 2 ]
cOld := cComm
ENDIF
FOR nFiles := 1 TO Len( s_aResources )
IF ! EMPTY( s_aResources[ nFiles ] )
cComm := STRTRAN( cComm, "$<", s_aResources[ nFiles ] )
lErrors := IIF( hb_run( cComm ) != 0, .T., .F. )
ENDIF
cComm := cOld
NEXT
ENDIF
NEXT
RETURN lErrors
*-------------------------------
FUNCTION GetParaDefines( cTemp )
*-------------------------------
LOCAL nPos
LOCAL cRead
LOCAL aSet := {}
LOCAL nMakePos
IF "\.." $ cTemp
cTemp := SUBSTR( cTemp, 1, At( "\..", cTemp ) - 1 )
ELSEIF "/.." $ cTemp
cTemp := SUBSTR( cTemp, 1, At( "/..", cTemp ) - 1 )
ENDIF
IF AT( "=", ctemp ) == 0
cTemp += [=""]
ENDIF
aSet := ListAsArray2( cTemp, "=" )
nPos := AScan( s_aDefines, { | x | x[ 1 ] == aSet[ 1 ] } )
IF nPos == 0
cRead := ALLTRIM( STRTRAN( aSet[ 2 ], "$(", "" ) )
cRead := STRTRAN( cRead, ")", "" )
nMakePos := AScan( s_aDefines, { | x | x[ 1 ] == cRead } )
IF nMakePos == 0
IF aSet[1] == "MYDEFINES"
aSet[ 2 ] := STRTRAN( aSet[ 2 ], ",", ";" )
ELSE
aSet[ 2 ] := STRTRAN( aSet[ 2 ], ",", " " )
ENDIF
AADD( s_aDefines, { aSet[ 1 ], aSet[ 2 ] } )
AADD( s_aMacros, { aSet[ 1 ], aSet[ 2 ] } )
else
s_aDefines[nMakepos,2] += ";" + aSet[ 2 ]
s_aMacros[nMakepos,2] += ";" + aSet[ 2 ]
ENDIF
ENDIF
RETURN NIL
*---------------------
FUNCTION PrintMacros()
*---------------------
OutStd( HBMAKEID+ " "+COPYRIGHT+ s_cEOL )
OutStd( "" + s_cEOL )
OutStd( "Macros:" + s_cEOL )
AEval( s_aMacros, { | xItem | OutStd( " " + xItem[ 1 ] + " = " + xItem[ 2 ] + s_cEOL ) } )
OutStd( "Implicit Rules:" + s_cEOL )
AEval( s_aCommands, { | xItem | OutStd( " " + xItem[ 1 ] + s_cEOL + " " + xItem[ 2 ] + s_cEOL ) } )
OutStd( "" + s_cEOL )
OutStd( "Targets:" )
OutStd( " " + s_szProject + ":" + s_cEOL )
OutStd( " Flags :" + s_cEOL )
OutStd( " Dependents :" )
AEval( s_aCFiles, { | xItem | OutStd( xitem + " " ) } )
AEval( s_aObjs, { | xItem | OutStd( xitem + " " ) } )
OutStd( " " + s_cEOL )
OutStd( " commands:" + s_aBuildOrder[ Len( s_aBuildOrder ) ] )
OutStd( " " + s_cEOL )
OutStd( " " + s_cEOL )
OutStd( " " + s_cEOL )
RETURN NIL
*--------------------------------------------------
FUNCTION CreateMakeFile( cFile, lCreateAndCompile )
*--------------------------------------------------
LOCAL cAlertMsg
LOCAL cOldScreen := SAVESCREEN()
LOCAL nBuildReturn
LOCAL nMaxRow := MAXROW()
LOCAL aInFiles := {}
LOCAL aOutFiles := {}
LOCAL aOutc := {}
LOCAL aSrc := Directory( "*.prg" )
LOCAL nLenaSrc := Len( aSrc )
LOCAL lFwh := .F.
LOCAL lC4W := .F.
LOCAL lMiniGui := .F.
LOCAL lHwGui := .F.
LOCAL lWhoo := .F.
LOCAL lHBWhat := .F.
LOCAL lGtWvt := .F.
LOCAL lGtWvw := .F.
LOCAL lMWvw := .F.
LOCAL lXwt := .F.
LOCAL lxHGtk := .F.
LOCAL lRddAds := .F.
LOCAL lMediator := .F.
LOCAL lApollo := .F.
LOCAL cOS := IIF( s_lUnix, "Unix", IIF( s_lLinux, "Linux", iif(s_lOS2,"OS/2","Windows") ) )
LOCAL cCompiler := IIF( s_lLinux .OR. s_lGcc, "GCC",iif(s_lPocc,"POCC",iif(s_lMSVcc,"MSVC","BCC")))
// Contrib GUI Libs
LOCAL cFwhPath := Space( 200 )
LOCAL cC4WPath := Space( 200 )
LOCAL cMiniPath := Space( 200 )
LOCAL cHwPath := Space( 200 )
LOCAL cxHGPath := Space( 200 )
LOCAL cMedPath := Space( 200 )
LOCAL cApolloPath := Space( 200 )
LOCAL cObjDir := s_cObjDir + space( 20 )
LOCAL lAutoMemvar := .F.
LOCAL lVarIsMemvar := .F.
LOCAL lDebug := .F.
LOCAL lSupressLine := .F.
LOCAL nPos
LOCAL cHarbourFlags := ""
LOCAL lUseharbourDll := .F.
LOCAL lCompMod := .F.
LOCAL x
LOCAL getlist := {}
LOCAL cTopFile := Space(50)
LOCAL cAppName := PADR(s_cAppName,50)
LOCAL cDefaultLibs := "hblang.lib hbvm.lib hbrtl.lib hbrdd.lib hbmacro.lib hbpp.lib rddntx.lib rddcdx.lib rddfpt.lib hbcommon.lib gtwin.lib hbcpage.lib hbpcre.lib hbzlib.lib hbhsx.lib hbsix.lib"
LOCAL cDefaultLibsMt := "hblang.lib hbvmmt.lib hbrtl.lib hbrdd.lib hbmacro.lib hbpp.lib rddntx.lib rddcdx.lib rddfpt.lib hbcommon.lib gtwin.lib hbcpage.lib hbpcre.lib hbzlib.lib hbhsx.lib hbsix.lib"
LOCAL cDefGccLibs := "-lhbvm -lhbrtl -lhbpcre -lgtdos -lhblang -lhbrdd -lhbrtl -lhbvm -lhbmacro -lhbpp -lrddntx -lrddcdx -lrddfpt -lhbhsx -lhbsix -lhbcommon -lhbcpage -lm"
LOCAL cDefGccLibsMt := "-lhbvmmt -lhbrtl -lhbpcre -lgtdos -lhblang -lhbrdd -lhbrtl -lhbvmmt -lhbmacro -lhbpp -lrddntx -lrddcdx -lrddfpt -lhbhsx -lhbsix -lhbcommon -lhbcpage -lm"
LOCAL cDefGccLibsUnix := "-lhbvm -lhbcpage -ltef -lhbrtl -lhbrdd -lhbrtl -lhbvm -lhbmacro -lhbpp -lhblang -lhbcommon -lhbnulrdd -lbmrddcdx -lrddntx -lrddcdx -lrddfpt -lhbsix -lhbhsx -lhbusrrdd -lhbpcre -lgtsln -lshblang -lm -lrt"
LOCAL cDefGccLibsUnixMt := "-lhbvmmt -lhbcpage -ltef -lhbrtl -lhbrdd -lhbrtl -lhbvm -lhbmacro -lhbpp -lhblang -lhbcommon -lhbnulrdd -lbmrddcdx -lrddntx -lrddcdx -lrddfpt -lhbsix -lhbhsx -lhbusrrdd -lhbpcre -lgtsln -lshblang -lm -lrt"
LOCAL cDefGccLibsw := "-lhbvm -lhbrtl -lhbpcre -lgtwin -lhblang -lhbrdd -lhbrtl -lhbvm -lhbmacro -lhbpp -lrddntx -lrddcdx -lrddfpt -lhbhsx -lhbsix -lhbcommon -lhbcpage -lm"
LOCAL cDefGccLibsMtw := "-lhbvmmt -lhbrtl -lhbpcre -lgtwin -lhblang -lhbrdd -lhbrtl -lhbvmmt -lhbmacro -lhbpp -lrddntx -lrddcdx -lrddfpt -lhbhsx -lhbsix -lhbcommon -lhbcpage -lm"
LOCAL cGccLibsOs2 := "-lhbvm -lhbrtl -lhbpcre -lgtos2 -lhblang -lhbrdd -lhbrtl -lhbvm -lhbmacro -lhbpp -lrddntx -lrddcdx -lrddfpt -lhbhsx -lhbsix -lhbcommon -lhbcpage -lm"
LOCAL cGccLibsOs2Mt := "-lhbvmmt -lhbrtl -lhbpcre -lgtos2 -lhblang -lhbrdd -lhbrtl -lhbvmmt -lhbmacro -lhbpp -lrddntx -lrddcdx -lrddfpt -lhbhsx -lhbsix -lhbcommon -lhbcpage -lm"
LOCAL cDefLibGccLibs := "-lhbvm -lhbrtl -lhbpcre -lgtcrs -lhblang -lhbrdd -lhbrtl -lhbvm -lhbmacro -lhbpp -lrddntx -lrddcdx -lrddfpt -lhbhsx -lhbsix -lhbcommon -lhbcpage"
LOCAL cDefLibGccLibsMt := "-lhbvmmt -lhbrtl -lhbpcre -lgtcrs -lhblang -lhbrdd -lhbrtl -lhbvmmt -lhbmacro -lhbpp -lrddntx -lrddcdx -lrddfpt -lhbhsx -lhbsix -lhbcommon -lhbcpage"
LOCAL cHarbDll := "harbour.lib"
LOCAL cHARso := "-lharbour -lncurses -lgpm -lslang -lpthread -lm"
LOCAL cSystemLibs := iif( s_lUnix, "", "-lncurses " ) + "-lslang " + iif( s_lUnix, "", "-lgpm " ) + " -lpthread -lm"
LOCAL cLibs := ""
LOCAL citem := ""
LOCAL cExt := ""
LOCAL cDrive := ""
LOCAL cPath := ""
LOCAL cTest := ""
LOCAL cGuiLib := "None"
LOCAL aLibs
LOCAL aLibsIn := {}
LOCAL aLibsOut := {}
LOCAL cGt := ""
LOCAL cOldLib := ""
LOCAL cHtmlLib := ""
LOCAL lLinux := s_lLinux
LOCAL lUnix := s_lUnix
LOCAL nWriteFiles := 0
LOCAL cResName := space(200)
LOCAL aSelFiles
LOCAL cBuild := " "
LOCAL cBuildForced := " "
LOCAL aUserDefs
LOCAL cCurrentDef := ""
LOCAL cRdd := "None"
LOCAL cCurrentDir := ""
LOCAL nOption
LOCAL lNew := .F.
LOCAL oMake
LOCAL cAllRes := ""
LOCAL cTemp
LOCAL cExtraLibs := ""
LOCAL cTempLibs := ""
LOCAL aTempLibs
LOCAL aUserLibs
LOCAL cUserLib
LOCAL cHarbourLibDir := s_cHarbourDir + iif(s_lLinux,"/lib","\lib")
LOCAL lCancelMake := .F.
#IFdef HBM_USE_DEPENDS
LOCAL cIncl := ""
LOCAL lScanIncludes := .F.
// Provisions for recursive scanning
LOCAL lScanIncRecursive := .F.
LOCAL cExcludeExts := PADR(".ch",40)
#ENDIF
#ifndef __PLATFORM__WINDOWS
LOCAL lHashhso := File("/usr/lib/libharbour.so")
LOCAL lusexhb := FILE("/usr/bin/hb-build")
#ELSE
LOCAL lusexhb := .F.
#ENDIF
s_cUserInclude := space(200)
s_cUserDefine := space(200)
s_cUserLibs := space(200)
IF File( cFile )
IF s_nLang == LANG_PT /* portuguese brazilian */
nOption := ALERT( "O makefile <" + cFile +"> j  existe.",{ "Editar", "Criar Novo" , "Cancelar" } )
ELSEIF s_nLang == LANG_ES /* spanish */
nOption := ALERT( "Lo makefile <" + cFile +"> ya existe.",{ "Editar", "Crear Nuevo" , "Cancelar" } )
ELSE /* english */
nOption := ALERT( "The makefile <" + cFile +"> already exist ",{ "Edit" , "Create New" , "Cancel" } )
ENDIF
IF nOption == 1 // edit makefile
// Verify if "cFile" can be openned to write mode.
s_nMakeFileHandle := FOpen( cFile, FO_WRITE )
IF s_nMakeFileHandle == F_ERROR
IF s_nLang == LANG_PT /* portuguese brazilian */
cAlertMsg := "<"+cFile + "> nÆo pode ser aberto para edi‡Æo."
ELSEIF s_nLang == LANG_ES /* spanish */
cAlertMsg := "<"+cFile + "> no pode ser abierto para edici¢n."
ELSE /* english */
cAlertMsg := "<"+cFile + "> cannot be openned for editing."
ENDIF
ALERT( cAlertMsg+" FERROR ("+hb_NToS(FError())+")" )
RESTSCREEN( ,,,, cOldScreen )
RETURN RET_ERR
ELSE
FClose( s_nMakeFileHandle )
s_nMakeFileHandle:= F_ERROR // Invalid handle now file is closed
ENDIF
oMake :=THbMake():new()
oMake:cMakefile := cFile
oMake:cMacro := iif(s_lMSVcc,"#MSVC",iif(s_lPocc,"#POCC",iif(s_lGcc,"#GCC","#BCC")))
oMake:ReadMakefile(cFile)
FRename(cFile,cFile+".old")
IF LEN(oMake:aRes) > 0
FOR EACH cTemp IN oMake:aRes
cAllRes += cTemp + " "
NEXT
ENDIF
lAutoMemVar := oMake:lAutomemvar
lVarIsMemVar := oMake:lvarismemvar
lDebug := oMake:ldebug
lSupressline := oMake:lSupressline
lCompMod := oMake:lCompMod
s_lGenppo := oMake:lGenppo
s_lGui := oMake:lGui
cRdd := IIF( oMake:lRddAds, "RDDADS", IIF( oMake:lMediator, "Mediator", "None" ) )
cGuiLib := IIF( oMake:lFwh , "FWH", ;
IIF( oMake:lMini , "MINIGUI", ;
IIF( oMake:lWhoo , "WHOO", ;
IIF( oMake:lCw , "C4W", ;
IIF( oMake:lHwGui , "HWGUI", ;
IIF( oMake:lGtWvt , "GTWVT", ;
IIF( oMake:lMWvW , "GTWVW+MWVW", ;
IIF( oMake:lGtWvw , "GTWVW", ;
IIF( oMake:lXWt , "XWT", ;
IIF( oMake:lHBWhat, "HBWHAT", ;
IIF( oMake:lxHGtk , "XHGTK", "" ) ) ) ) ) ) ) ) ) ))
cFwhpath := PADR(oMake:cFmc,200)
cApolloPath := PADR(oMake:cFmc,200)
cC4WPath := PADR(oMake:cFmc,200)
cMiniPath := PADR(oMake:cFmc,200)
cHwPath := PADR(oMake:cFmc,200)
cxHGPath := PADR(oMake:cFmc,200)
cMedpath := PADR(oMake:cMedpath,200)
cAppName := PADR(oMake:cAppLibName,50)
s_cAppName := cAppName
s_lCompress := oMake:lCompress
s_lContribLib := oMake:lContribLib
s_cUserInclude := PADR(oMake:cUserInclude,200)
s_cUserDefine := PADR(oMake:cUserDef,200)
s_cUserLibs := PADR(oMake:cUserLib,200)
s_lxFwh := oMake:lxFwh
s_nFilesToAdd := oMake:cFilesToAdd
s_lMt := oMake:lMt
s_nWarningLevel := oMake:cWarningLevel
cTopFile := PADR(oMake:cTopModule,50," ")
cResName := PADR(oMake:cRes,200)
s_cObjDir := oMake:cObj
cObjDir := s_cObjDir + space(20)
s_lGenCsource := oMake:lGenCsource
s_cEditor := trim(oMake:cEditor)
IF EMPTY( s_cEditor )
IF s_lOS2 .OR. s_lLinux
s_cEditor := "mcedit"
ELSE
s_cEditor := "edit"
ENDIF
ENDIF
IF !s_lRecursive
s_lRecursive := oMake:lRecurse
ENDIF
IF nLenaSrc == 0 .and. !s_lRecursive
IF s_nlang == LANG_PT /* portuguese brazilan */
cAlertMsg := "NÆo h  nenhum prg na pasta "+CurDir()+". Use o modo recursivo -r"
ELSEIF s_nLang == LANG_ES /* spanish */
cAlertMsg := "No hay ning£n prg en la carpeta "+CurDir()+". Use lo modo recursivo -r"
ELSE /* english */
cAlertMsg := "Does not have any prg in "+CurDir()+" folder. Use the recursive mode -r"
ENDIF
ALERT( cAlertMsg )
RESTSCREEN( ,,,, cOldScreen )
RETURN RET_ERR
ENDIF
// after oMake read, recreate other clean makefile to edit.
s_nMakeFileHandle := FCREATE(cFile)
IF s_nMakeFileHandle == F_ERROR
IF s_nLang == LANG_PT /* portuguese brazilian */
cAlertMsg := "<"+cFile + "> nÆo pode ser aberto para edi‡Æo."
ELSEIF s_nLang == LANG_ES /* spanish */
cAlertMsg := "<"+cFile + "> no pode ser abierto para edici¢n."
ELSE /* english */
cAlertMsg := "<"+cFile + "> cannot be openned for edition."
ENDIF
ALERT( cAlertMsg + " FERROR (" + hb_NToS( FERROR() ) + ")" )
RESTSCREEN( ,,,, cOldScreen )
RETURN RET_ERR
ENDIF
WriteMakeFileHeader()
s_lEditMake := .T.
ELSEIF nOption == 2 // create a new makefile
IF nLenaSrc == 0 .and. ! s_lRecursive
IF s_nlang == LANG_PT /* portuguese brazilian */
cAlertMsg := "NÆo h  nenhum prg na pasta "+CurDir()+". Use o modo recursivo -r"
ELSEIF s_nLang == LANG_ES /* spanish */
cAlertMsg := "No hay ning£n prg en la carpeta "+CurDir()+". Use lo modo recursivo -r"
ELSE /* english */
cAlertMsg := "Does not have any prg in "+CurDir()+" folder. Use the recursive mode -r"
ENDIF
ALERT( cAlertMsg )
RESTSCREEN( ,,,, cOldScreen )
RETURN RET_ERR
ENDIF
s_lEditMake := .F.
s_nMakeFileHandle := FCREATE( cFile )
IF s_nMakeFileHandle == F_ERROR
IF s_nLang == LANG_PT /* portuguese brazilian */
cAlertMsg := "<"+cFile + "> nÆo pode ser criado."
ELSEIF s_nLang == LANG_ES /* spanish */
cAlertMsg := "<"+cFile + "> no pode ser criado."
ELSE /* english */
cAlertMsg := "<"+cFile + "> cannot be created."
ENDIF
ALERT( cAlertMsg+" FERROR ("+hb_NToS(FError())+")" )
RESTSCREEN( ,,,, cOldScreen )
RETURN RET_ERR
endif
WriteMakeFileHeader()
lNew := .T.
ELSE
SETCOLOR("W/N,N/W")
QUIT
ENDIF
ELSE
s_nMakeFileHandle := FCreate( cFile )
IF s_nMakeFileHandle == F_ERROR
IF s_nLang == LANG_PT /* portuguese brazilian */
cAlertMsg := "<"+cFile + "> nÆo pode ser criado."
ELSEIF s_nLang == LANG_ES /* spanish */
cAlertMsg := "<"+cFile + "> no pode ser criado."
ELSE /* english */
cAlertMsg := "<"+cFile + "> cannot be created."
ENDIF
ALERT( cAlertMsg+" FERROR ("+hb_NToS(FError())+")" )
RESTSCREEN( ,,,, cOldScreen )
RETURN RET_ERR
ENDIF
WriteMakeFileHeader()
nOption := 2 // create a new makefile
lNew := .T.
ENDIF
IF ! lCreateAndCompile
nMaxRow := MIN( nMaxRow, 24 )
While .t.
Setcolor( "w/b+,b+/w,w+/b,w/b+,w/b,w+/b" )
@ 0, 0, nMaxRow, Maxcol() BOX( Chr( 201 ) + Chr( 205 ) + Chr( 187 ) + Chr( 186 ) + Chr( 188 ) + Chr( 205 ) + Chr( 200 ) + Chr( 186 ) + Space( 1 ) )
Attention( HBMAKEID + space(10)+s_aLangMessages[ 27 ], 0 )
Attention( s_aLangMessages[ 47 ], nMaxRow )
@ 01,01 SAY s_aLangMessages[ 28 ]
@ 01,16,06,21 GET cOS;
LISTBOX { "Windows", "OS/2", "Linux","Unix" };
MESSAGE s_aLangMessages[ 49 ];
STATE OsSpec(getlist,1,@cOS);
DROPDOWN
@ 01,23 SAY s_aLangMessages[ 29 ]
@ 01,47,08,52 GET cCompiler;
LISTBOX { "BCC", "MSVC", "GCC", "POCC","MINGW" };
MESSAGE s_aLangMessages[ 50 ];
STATE OsSpec(getlist,2,@cCompiler);
DROPDOWN
@ 01,56 SAY s_aLangMessages[ 30 ]
@ 01,67,10,78 GET cGuiLib;
LISTBOX { "None","C4W","FWH","GTWVT","GTWVW","GTWVW+MWVW","HWGUI","MINIGUI","XWT","HBWHAT","WHOO","XHGTK"};
STATE OsSpec(getlist,3,@cGuiLib);
DROPDOWN;
WHEN CheckCompiler(cOS);
MESSAGE s_aLangMessages[ 51 ]
@ 02,01 SAY s_aLangMessages[ 48 ]
@ 02,16,08,26 GET cRdd;
LISTBOX { "None","RDDADS","Mediator","Apollo"};
WHEN cOS == "Windows" .or. cOS == "Linux";
DROPDOWN;
MESSAGE s_aLangMessages[ 52 ]
@ 02,30 GET s_lCompress;
CHECKBOX;
CAPTION s_aLangMessages[ 53 ];
STYLE "[X ]";
MESSAGE s_aLangMessages[ 54 ]
@ 02,53 GET lUseHarbourDll;
CHECKBOX;
CAPTION "use harbour[.dll|.so]" style "[X ]";
WHEN cOS == "Windows" .or. cOS == "Linux";
MESSAGE s_aLangMessages[ 55 ]
@ 03,01 SAY "Obj Files Dir";
GET cObjDir;
PICT "@S20";
MESSAGE s_aLangMessages[ 56 ]
@ 03,47 SAY s_aLangMessages[ 66 ]
#ifdef __PLATFORM__WINDOWS
@ 03,68,07,77 GET s_cEditor;
LISTBOX { "edit", "notepad" };
MESSAGE s_aLangMessages[ 67 ];
STATE OsSpec(getlist,4,@s_cEditor);
DROPDOWN
#endif
@ 04,01 SAY s_aLangMessages[ 45 ];
GET cAppName;
PICT "@S15";
VALID ! EMPTY( cAppName );
MESSAGE s_aLangMessages[ 57 ]
@ 04,53 GET s_lasdll;
CHECKBOX;
CAPTION "Create dll";
STYLE "[X ]"
READ MSG AT nMaxRow - 1, 1, MaxCol() - 1
s_cAppName := ALLTRIM( cAppName )
IF cOS != "Linux" .or. cOS != "Unix"
IF s_lasdll
s_cAppName += ".dll"
ELSE
s_cAppName += ".exe"
ENDIF
ENDIF
if s_lasdll
lUseharbourDll:= .T.
endif
lFwh := "FWH" $ ALLTRIM(cGuiLib)
lC4W := "C4W" $ ALLTRIM(cGuiLib)
lMiniGui := "MINIGUI" $ ALLTRIM(cGuiLib)
lHwGui := "HWGUI" $ ALLTRIM(cGuiLib)
lWhoo := "WHOO" $ ALLTRIM(cGuiLib)
lHBWhat := "HBWHAT" $ ALLTRIM(cGuiLib)
lGtWvt := "GTWVT" $ ALLTRIM(cGuiLib)
lGtWvw := "GTWVW" $ ALLTRIM(cGuiLib)
lMWvw := "MWVW" $ ALLTRIM(cGuiLib)
lXwt := "XWT" $ ALLTRIM(cGuiLib)
lxHGtk := "XHGTK" $ ALLTRIM(cGuiLib)
s_lGui := lWhoo .or. lFwh .or. lC4W .or. lMinigui .or. lGtWvt .or. lHwGui .or. lXwt .or. lHBWhat .or. lxHGtk .or. lGtWvw .or. lMWvw
lRddAds := "RDDADS" $ cRdd
lMediator := "Mediator" $ cRdd
lApollo := "Apollo" $ cRdd
IF lUseharbourDll
cDefLibGccLibs := cHARso
cDefaultLibs := cHarbDll + " dllmain.lib "
ENDIF
IF lFwh
@ 3, 40 SAY "FWH path";
GET cFwhPath;
PICT "@S25"
ELSEIF lC4W
@ 3, 40 SAY "C4W path";
GET cC4WPath;
PICT "@S25"
ELSEIF lMiniGui
@ 3, 40 SAY "MiniGui path";
GET cMiniPath;
PICT "@S25"
ELSEIF lHwGui
@ 3, 40 SAY "HwGUI path";
GET cHwPath;
PICT "@S25"
ELSEIF lxHGtk
@ 3, 40 SAY "xHGtk path";
GET cxHGPath;
PICT "@S25"
ENDIF
IF lMediator
@ 3, 40 SAY "Mediator path";
GET cMedPath;
PICT "@S25"
ENDIF
IF lApollo
@ 03, 40 SAY "Apollo path";
GET cApolloPath;
PICT "@S25"
ENDIF
IF nOption == 2 // create a new makefile
cResName := PADR(ALLTRIM(cResName)+iIF(!EMPTY(cResName)," ","")+ALLTRIM(cAllRes),200 )
ENDIF
Attention( s_aLangMessages[ 31 ], 5 )
@ 06, 01 GET lAutoMemVar;
CHECKBOX;
CAPTION s_aLangMessages[ 32 ];
STYLE "[X ]"
@ 06, 40 GET lVarIsMemVar;
CHECKBOX;
CAPTION s_aLangMessages[ 33 ];
STYLE "[X ]"
@ 07, 01 GET lDebug;
CHECKBOX;
CAPTION s_aLangMessages[ 34 ];
STYLE "[X ]"
@ 07, 40 GET lSupressLine;
CHECKBOX;
CAPTION s_aLangMessages[ 35 ];
STYLE "[X ]"
@ 08, 01 GET s_lGenppo;
CHECKBOX;
CAPTION s_aLangMessages[ 36 ];
STYLE "[X ]"
@ 08, 40 GET lCompMod;
CHECKBOX;
CAPTION s_aLangMessages[ 37 ];
STYLE "[X ]"
@ 09, 01 SAY s_aLangMessages[ 38 ];
GET s_cUserDefine;
PICT "@s23"
@ 09, 40 SAY s_aLangMessages[ 39 ];
GET s_cUserInclude;
PICT "@s18"
@ 10, 01 GET s_lContribLib;
CHECKBOX;
CAPTION s_aLangMessages[ 40 ];
STYLE "[X ]"
@ 10, 40 GET s_lxFwh;
CHECKBOX;
CAPTION "Harbour FWH";
STYLE "[X ]"
@ 11, 01 SAY "Resource file Name: ";
GET cResName;
PICT "@S55"
@ 12, 01 SAY s_aLangMessages[ 43 ];
GET s_nFilestoAdd;
PICT "99";
VALID s_nFilestoAdd > 0
@ 13, 01 GET s_lMt;
CHECKBOX;
CAPTION s_aLangMessages[ 44 ];
STYLE "[X ]"
@ 13, 40 SAY s_aLangMessages[ 46 ];
GET s_nWarningLevel;
PICT "9";
VALID s_nWarningLevel>=0 .AND. s_nWarningLevel <= 4
@ 14, 01 GET s_lGenCsource;
CHECKBOX;
CAPTION "Generate C-source, not PCode (-go3)";
STYLE "[X ]"
@ 15, 01 SAY s_aLangMessages[ 64 ];
GET s_cUserLibs;
PICT "@S58"
READ msg at nMaxRow - 1, 1, maxcol() - 1
IF LastKey() == K_ESC
RESTSCREEN( ,,,, cOldScreen )
RETURN RET_ERR
ENDIF
IF EMPTY( cAppName )
IF s_nLang == LANG_PT /* portuguese brazilian */
ALERT("Falta nome da aplica‡Æo.")
ELSEIF s_nLang == LANG_ES /* spanish */
ALERT("Falta lo nombre de la aplicacion.")
ELSE /* english */
ALERT("Application name is missing.")
ENDIF
ELSE
EXIT
ENDIF
Enddo
Endif // Create and compile
IF ! EMPTY( s_cUserDefine )
aUserDefs := ListasArray2(ALLTRIM( s_cUserDefine ), ";")
FOR EACH cCurrentDef in aUserDefs
cHarbourFlags += " -D" + ALLTRIM( cCurrentDef ) + " "
NEXT
ENDIF
IF ! EMPTY( s_cUserLibs )
aUserLibs := ListAsArray2( ALLTRIM(s_cUserLibs), ";" )
FOR EACH cUserLib IN aUserLibs
if !file( cUserLib )
ALERT( "User Lib: "+cUserLib +" not found.")
exit
endif
NEXT
ENDIF
IF ! EMPTY( s_cUserInclude )
cHarbourFlags += " -I" + ALLTRIM( s_cUserInclude ) + " "
ENDIF
s_lBcc := "BCC" $ cCompiler
s_lMSVcc := "MSVC" $ cCompiler
s_lGcc := "GCC" $ cCompiler
s_lPocc := "POCC" $ cCompiler
s_lMinGW := "MINGW" $ cCompiler
if s_lMinGW
s_lGcc := .T.
s_lBcc := s_lMSVcc := s_lPocc := .F.
endif
cObjDir := ALLTRIM( cObjDir )
IF "Linux" $ cOS .or. "Unix" $ cOS
cCurrentDir := "/"+CurDir()
ELSE
cCurrentDir := CurDrive()+":\"+CurDir()
ENDIF
IF ! EMPTY( cObjDir )
IF !hb_DirExists( cObjDir )
#ifdef HB_COMPAT_C53
MakeDir( cObjDir )
#endif
ENDIF
ENDIF
s_aMacros := GetSourceDirMacros( s_lGcc, cOS )
IF lLinux .or. lUnix
cObjDir := ALLTRIM( cObjDir )
IF ! EMPTY( cObjDir )
cObjDir += "/"
ENDIF
cTest := cObjDir
ELSE
cObjDir := ALLTRIM( cObjDir )
IF ! EMPTY( cObjDir )
cObjDir += "\"
ENDIF
cTest := cObjDir + "\"
ENDIF
AEval( s_aMacros, { | x, y | cItem := SUBSTR( x[ 2 ], 1, Len( x[ 2 ] ) ), IIF( At( citem, cTest ) > 0, ( s_aMacros[ y, 1 ] := "OBJDIR", s_aMacros[ y, 2 ] := cObjDir ), ) } )
IF lAutomemvar
cHarbourFlags += " -a "
ENDIF
IF lvarismemvar
cHarbourFlags += " -v "
ENDIF
IF lDebug
cHarbourFlags += " -b "
cDefaultLibs += " hbdebug.lib "
cDefGccLibs += " -lhbdebug "
cDefGccLibsw += " -lhbdebug "
cGccLibsOs2 += " -lhbdebug "
cDefLibGccLibs += " -lhbdebug "
cDefGccLibsUnix += " -lhbdebug "
cDefGccLibsUnixMt+= " -lhbdebug "
cDefaultLibsMt += " hbdebug.lib "
cDefGccLibsMt += " -lhbdebug "
cDefGccLibsMtw += " -lhbdebug "
cGccLibsOs2Mt += " -lhbdebug "
cDefLibGccLibsMt += " -lhbdebug "
ENDIF
IF lSupressline
cHarbourFlags += " -l "
ENDIF
IF s_lGenppo
cHarbourFlags += " -p "
ENDIF
IF lCompmod
cHarbourFlags += " -m "
ENDIF
if lMWvw
cHarbourFlags += " -u+mwvw.ch "
endif
IF s_nWarningLevel >= 0
cHarbourFlags += " -w" + Str(s_nWarningLevel,1)
ENDIF
IF s_lBcc
AAdd( s_aCommands, { ".cpp.obj:", "$(CC_DIR)\bin\bcc32 $(CFLAG1) $(CFLAG2) -o$* $**" } )
AAdd( s_aCommands, { ".c.obj:", "$(CC_DIR)\bin\bcc32 -I$(HB_DIR)\include $(CFLAG1) $(CFLAG2) -o$* $**" } )
AAdd( s_aCommands, { ".prg.obj:", "$(HB_DIR)\bin\harbour -n"+iif(s_lasdll,"1","")+" -go" + iif(s_lGenCsource,"3","") + " -I$(HB_DIR)\include $(HARBOURFLAGS)" + IIF( lFwh, " -I$(FWH)\include", IIF( lMinigui, " -I$(MINIGUI)\include",IIF( lHwgui, " -I$(HWGUI)\include","" ) ) )+IIF( lWhoo," -I$(WHOO)\include ","")+ IIF( lMediator," -I$(MEDIATOR)\include ","")+" -o$* $**" } )
AAdd( s_aCommands, { ".rc.res:", "$(CC_DIR)\bin\brcc32 $(RFLAGS) $<" } )
ELSEIF s_lGcc
IF ("LINUX" $ Upper( Getenv( "HB_ARCHITECTURE" ) ) .OR. cOS == "Linux" ) .or.;
("UNIX" $ Upper( Getenv( "HB_ARCHITECTURE" ) ) .OR. cOS == "Unix" .OR. cOS == "HP-UX" )
AAdd( s_aCommands, { ".cpp.o:", "gcc $(CFLAG1) $(CFLAG2) -o$* $**" } )
AAdd( s_aCommands, { ".c.o:", "gcc -I/usr/include/harbour $(CFLAG1) $(CFLAG2) -I. -g -o$* $**" } )
AAdd( s_aCommands, { ".prg.o:", "harbour -n"+iif(s_lasdll,"1","")+" -go" + iif(s_lGenCsource,"3","") + " -I/usr/include/harbour $(HARBOURFLAGS) -I. -o$* $**" } )
ELSE
AAdd( s_aCommands, { ".cpp.o:", "$(CC_DIR)\bin\gcc $(CFLAG1) $(CFLAG2) -o$* $**" } )
AAdd( s_aCommands, { ".c.o:", "$(CC_DIR)\bin\gcc -I$(HB_DIR)/include $(CFLAG1) $(CFLAG2) -I. -o$* $**" } )
AAdd( s_aCommands, { ".prg.o:", "$(HB_DIR)\bin\harbour -n"+iif(s_lasdll,"1","")+" -go" + iif(s_lGenCsource,"3","") + " -I$(HB_DIR)/include $(HARBOURFLAGS) " +IIF( lHwgui, " -I$(HWGUI)/include","" ) +" -o$* $**" } )
ENDIF
ELSEIF s_lMSVcc
AAdd( s_aCommands, { ".cpp.obj:", "$(CC_DIR)\bin\cl $(CFLAG1) $(CFLAG2) -Fo$* $**" } )
AAdd( s_aCommands, { ".c.obj:", "$(CC_DIR)\bin\cl -I$(HB_DIR)\include $(CFLAG1) $(CFLAG2) -Fo$* $**" } )
AAdd( s_aCommands, { ".prg.obj:", "$(HB_DIR)\bin\harbour -n -I$(HB_DIR)\include $(HARBOURFLAGS) -go" + iif(s_lGenCsource,"3","") + " -I$(C4W)\include" + IIF( lMediator," -I$(MEDIATOR)\include ","")+ "-o$* $**" } )
AAdd( s_aCommands, { ".rc.res:", "$(CC_DIR)\rc $(RFLAGS) $<" } )
ELSEIF s_lPocc
AAdd( s_aCommands, { ".cpp.obj:", "$(CC_DIR)\bin\pocc $(CFLAG1) $(CFLAG2) -Fo$* $**" } )
AAdd( s_aCommands, { ".c.obj:", "$(CC_DIR)\bin\pocc -I$(HB_DIR)\include $(CFLAG1) $(CFLAG2) -Fo$* $**" } )
AAdd( s_aCommands, { ".prg.obj:", "$(HB_DIR)\bin\harbour -n"+iif(s_lasdll,"1","")+" -go" + iif(s_lGenCsource,"3","") + " -I$(HB_DIR)\include $(HARBOURFLAGS)" + IIF( lFwh, " -I$(FWH)\include", IIF( lMinigui, " -I$(MINIGUI)\include",IIF( lHwgui, " -I$(HWGUI)\include","" ) ) )+IIF( lWhoo," -I$(WHOO)\include ","")+ IIF( lMediator," -I$(MEDIATOR)\include ","")+" -o$** $**" } )
AAdd( s_aCommands, { ".rc.res:", "$(CC_DIR)\bin\porc $(RFLAGS) $<" } )
ENDIF
// Selecting .prg files.
aInFiles := GetSourceFiles( s_lRecursive, s_lGcc, cOS )
nLenaSrc := Len( aInFiles )
IF nLenaSrc == 0
IF s_nlang == LANG_PT /* portuguese brazilian */
cAlertMsg := "Nenhum prg foi encontrado."
ELSEIF s_nLang == LANG_ES /* spanish */
cAlertMsg := "Ning£n prg foi encontrado."
ELSE /* english */
cAlertMsg := "No one prg were found."
ENDIF
lCancelMake := .T.
ALERT( cAlertMsg )
ENDIF
aOutFiles := AClone( aInFiles )
//if Len( aOutFiles ) > 1
if Len( aOutFiles ) > 1 .AND. ! lCreateAndCompile
// Attention( s_aLangMessages[ 41 ], 22 )
if s_nlang == LANG_PT /* portuguese brazilian */
cAlertMsg := "Selecione os .prgs a compilar"
elseif s_nLang == LANG_ES /* spanish */
cAlertMsg := "Seleccione los .prg a compilar"
ELSE /* english */
cAlertMsg := "Select the .prg files to compile"
endif
IF nOption !=2 // not create a makefile
PickArray( 11, 15, 20, 64, aInFiles, aOutFiles, ArrayAJoin( { oMake:aPrgs, oMake:aCs } ), .T., cAlertMsg )
ELSE
PickArray( 11, 15, 20, 64, aInFiles, aOutFiles, {}, .T., cAlertMsg )
ENDIF
AEval( aOutFiles, { | x, y | HB_SYMBOL_UNUSED( x ), aOutFiles[ y ] := Trim( SUBSTR( aOutFiles[ y ], 1, At( " ", aOutFiles[ y ] ) ) ) } )
aOutFiles := ASort( aOutFiles )
@ 22,01 say space( MAXCOL() - 1 )
aSelFiles := GetSelFiles( aInFiles, aOutFiles )
ASort( aSelFiles )
else
AEval( aOutFiles, { | x, y | HB_SYMBOL_UNUSED( x ), aOutFiles[ y ] := Trim( SUBSTR( aOutFiles[ y ], 1, At( " ", aOutFiles[ y ] ) ) ) } )
aSelFiles := aOutFiles
endif
if Len( aSelFiles ) == 1
cTopFile := aSelFiles[1]
cTopFile := PADR( Left(cTopfile,At(Upper(".prg"),Upper(cTopFile))+4 ), 50)
elseif Len( aSelFiles ) == 0
cTopFile := ""
IF s_nlang == LANG_PT /* portuguese brazilian */
cAlertMsg := "Nenhum .prg foi selecionado."
ELSEIF s_nLang == LANG_ES /* spanish */
cAlertMsg := "Ning£m .prg foi seleccionado."
ELSE /* english */
cAlertMsg := "No .prg files were selected."
ENDIF
ALERT( cAlertMsg )
endif
WHILE Len( aSelFiles ) > 1
IF !lCreateAndCompile
IF s_nlang == LANG_PT /* portuguese brazilian */
cAlertMsg := "Informe o .prg principal da sua aplica‡Æo:"
ELSEIF s_nLang == LANG_ES /* spanish */
cAlertMsg := "Informe o .prg principale de su aplicacion:"
ELSE /* english */
cAlertMsg := "Inform the main .prg of your application:"
ENDIF
@ 15,01 say cAlertMsg Get cTopFile pict "@S35" valid !EMPTY(cTopFile)
READ
if LastKey() == K_ESC
Exit
endif
ELSE
cTopFile := ALLTRIM(cAppName)+".prg"
ENDIF
IF ! File( ALLTRIM(cTopFile) )
IF s_nLang == LANG_PT /* portuguese brazilian */
cAlertMsg := "Arquivo "+ALLTRIM(cTopFile)+" nÆo encontrado."+iif(s_lRecursive," O flag -r est  ativo. Informe o subdir tambm se o .prg principal estiver dentro dele.","")
ELSEIF s_nLang == LANG_ES /* spanish */
cAlertMsg := "Fichero "+ALLTRIM(cTopFile)+" no encontrado."+iif(s_lRecursive," Lo flag -r esta activado. Informe lo subdir tambin si lo .prg principale est s dentro dele.","")
ELSE /* english */
cAlertMsg := "File "+ALLTRIM(cTopFile)+" not found."+iif(s_lRecursive," The flag -r is active. Inform the subdir also if the main .prg is within it.","")
ENDIF
ALERT( cAlertMsg )
IF lCreateAndCompile
FClose( s_nMakeFileHandle )
s_nMakeFileHandle:= F_ERROR // Invalid handle now file is closed
FErase( cFile )
RESTSCREEN( ,,,, cOldScreen )
RETURN RET_ERR
ENDIF
ELSE
EXIT
ENDIF
END
// Select Contrib Libs.
IF s_lContribLib
aLibs := GetLibs( s_lGcc, cHarbourLibDir )
if len(aLibs)=0
ALERT("aLibs is empty")
endif
IF s_nLang == LANG_PT /* portuguese brazilian */
cAlertMsg := "<Espa‡o> para selecionar. <Enter> para continuar o processo."
ELSEIF s_nLang == LANG_EN /* english */
cAlertMsg := "<Spacebar> to select. <Enter> to continue process"
ELSEIF s_nLang == LANG_ES /* spanish */
cAlertMsg := "<Espacio> para seleccionar. <Enter> para continuar o proceso."
ENDIF
Attention( cAlertMsg, 9 )
AEval( aLibs, { | x | AAdd( aLibsIn, x[ 1 ] ) } )
AEval( aLibs, { | x | AAdd( aLibsOut, x[ 2 ] ) } )
IF s_nlang == LANG_PT /* portuguese brazilian */
cAlertMsg := "Selecione as LIBs contrib a compilar"
ELSEIF s_nLang == LANG_ES /* spanish */
cAlertMsg := "Seleccione las LIB contrib a compilar"
ELSE /* english */
cAlertMsg := "Select the contrib LIBs to compile"
ENDIF
IF nOption != 2 // not create makefile
PickArray( 11, 15, 20, 64, aLibsIn, aLibsOut ,oMake:aExtLibs, .T. , cAlertMsg, .T. )
ELSE
PickArray( 11, 15, 20, 64, aLibsIn, aLibsOut ,{}, .T., cAlertMsg, .T. )
ENDIF
ENDIF
#IFDEF HBM_USE_DEPENDS
IF ! lCreateAndCompile
CLEAR TYPEAHEAD
Attention( "HbMake options", 16 )
@ 17, 01 GET lScanIncludes;
CHECKBOX;
CAPTION "Create #DEPENDS from #include";
STYLE "[X ]"
// Provisions for recursive scanning
@ 17, 40 GET lScanIncRecursive;
CHECKBOX;
CAPTION "Scan recursive" style "[X ]" //when lScanIncludes
@ 18, 01 SAY "Excluding these extensions :" ;
GET cExcludeExts;
WHEN lScanIncludes
READ
ENDIF
#ENDIF
IF ! lCreateAndCompile
AEval( aOutFiles, { | xItem | IIF( ".c" $ xItem .OR. ".C" $ xItem , AAdd( aOutc, xItem ), ) } )
AEval( aOutc, { | x, z | cItem := x, z := AScan( aOutFiles, { | t | t = cItem } ), IIF( z > 0, aSize( aDel( aOutFiles, z ), Len( aOutFiles ) - 1 ), ) } )
@ 22,01 say space(78)
aOutFiles := ASort( aOutFiles )
ELSE
aOutFiles := { ALLTRIM(cAppName) }
ENDIF
s_aPrgs := ACLONE( aOutFiles )
s_aObjs := ACLONE( aOutFiles )
s_aContribLibs := ACLONE( aLibsOut )
// searching for main prg file into obj array.
// TOFIX: Needs to be case sensitive for non-WinDOS [vszakats]
x := ASCAN( s_aObjs, { | x | LOWER( x ) $ LOWER( ALLTRIM(cTopFile) ) } )
// putting main prg in the top
IF x > 0
ADel( s_aObjs, x )
ASize( s_aObjs, Len( s_aObjs ) - 1 )
ASize( s_aObjs, Len( s_aObjs ) + 1 )
AIns( s_aObjs, 1 )
s_aObjs[ 1 ] := ALLTRIM( cTopFile )
ENDIF
// searching for main prg file into prg array.
// TOFIX: Needs to be case sensitive for non-WinDOS [vszakats]
x := ASCAN( s_aPrgs, { | x | LOWER( x ) $ LOWER( ALLTRIM(cTopFile) ) } )
// putting main prg in the top
IF x > 0
ADel( s_aPrgs, x )
ASize( s_aPrgs, Len( s_aPrgs ) - 1 )
ASize( s_aPrgs, Len( s_aPrgs ) + 1 )
AIns( s_aPrgs, 1 )
s_aPrgs[ 1 ] := ALLTRIM( cTopFile )
ENDIF
AEval( s_aObjs, { | xItem, x | hb_FNAMESPLIT( xiTem, @cPath, @cTest, @cExt, @cDrive ), cext := SUBSTR( cExt, 2 ), IIF( ! s_lGcc, s_aObjs[ x ] := cObjDir + cTest + "." + Exte( cExt, 2 ), s_aObjs[ x ] := cObjDir + cTest + "." + Exte( cExt, 3 ) ) } )
s_aCFiles := aClone( aOutc )
s_aObjsC := aClone( aOutc )
AEval( aOutc, { | xItem, x | hb_FNAMESPLIT( xiTem, @cPath, @cTest, @cExt, @cDrive ), cext := SUBSTR( cExt, 2 ), IIF( ! s_lGcc, s_aObjsC[ x ] := IIF( ! EMPTY( cObjDir ), cObjDir, "" ) + cTest + "." + Exten( cExt, 2 ), s_aObjsC[ x ] := IIF( ! EMPTY( cObjDir ), cObjDir, "" ) + cTest + "." + Exten( cExt, 1 ) ) } )
FWrite( s_nMakeFileHandle, ;
"RECURSE = " + IIF( s_lRecursive, " YES ", " NO " ) + s_cEOL +;
s_cEOL +;
"SHELL = " + s_cEOL +;
"COMPRESS = " + IIF( s_lCompress, "YES", "NO" ) + s_cEOL +;
"CONTRIBS = " + IIF( s_lContribLib, "YES", "NO" ) + s_cEOL +;
"XFWH = " + IIF( s_lxFwh, "YES", "NO" ) + s_cEOL +;
"FILESTOADD = " + hb_NToS( s_nFilesToAdd ) + s_cEOL +;
"WARNINGLEVEL = " + hb_NToS( s_nWarningLevel ) + s_cEOL +;
"USERDEFINE = " + ALLTRIM(s_cUserDefine) + s_cEOL +;
"USERINCLUDE = " + ALLTRIM(s_cUserInclude) + s_cEOL +;
"USERLIBS = " + ALLTRIM(s_cUserLibs) + s_cEOL +;
"EDITOR = " + s_cEditor + s_cEOL )
IF lFwh
FWrite( s_nMakeFileHandle, "FWH = " + ALLTRIM(cFwhPath) + s_cEOL )
ELSEIF lC4W
FWrite( s_nMakeFileHandle, "C4W = " + ALLTRIM(cC4WPath) + s_cEOL )
ELSEIF lMiniGui
FWrite( s_nMakeFileHandle, "MINIGUI = " + ALLTRIM(cMiniPath) + s_cEOL )
ELSEIF lHwGui
FWrite( s_nMakeFileHandle, "HWGUI = " + iif(!s_lMinGW,ALLTRIM(cHwPath),STRTRAN(ALLTRIM(cHwPath),"\","/")) + s_cEOL )
ELSEIF lGtwvt
FWrite( s_nMakeFileHandle, "GTWVT = " + s_cEOL )
ELSEIF lGtwvw
FWrite( s_nMakeFileHandle, "GTWVW = " + s_cEOL )
IF lMwvw
FWrite( s_nMakeFileHandle, "MWVW = " + s_cEOL )
endif
ELSEIF lXwt
FWrite( s_nMakeFileHandle, "XWT = " + s_cEOL )
ELSEIF lWhoo
FWrite( s_nMakeFileHandle, "WHOO = " + s_cEOL )
ELSEIF lHBWhat
FWrite( s_nMakeFileHandle, "HBWHAT = " + s_cEOL )
ELSEIF lxHGtk
FWrite( s_nMakeFileHandle, "XHGTK = " + s_cEOL )
ENDIF
IF lMediator
FWrite( s_nMakeFileHandle, "MEDIATOR = " + ALLTRIM(cMedPath) + s_cEOL )
ENDIF
IF lApollo
FWrite( s_nMakeFileHandle, "APOLLO = " + ALLTRIM(cApolloPath) + s_cEOL )
ENDIF
FWrite( s_nMakeFileHandle, "GUI = " + iif(lWhoo .or. lFwh .or. lC4W .or. lMinigui .or. lGtWvt .or. lHwGui .or. lXwt .or. lHBWhat .or. lxHGtk .or. lGtWvw , "YES", "NO" ) + s_cEOL +;
"MT = " + IIF( s_lMt, "YES", "NO" ) + s_cEOL )
FOR x := 1 TO Len( s_aMacros )
IF ! EMPTY( s_aMacros[ x, 2 ] )
cItem := s_aMacros[ x, 2 ]
nPos := AScan( s_aPrgs, { | z | hb_FNAMESPLIT( z, @cPath, @cTest, @cExt, @cDrive ), cPath == citem } )
IF nPos > 0
AEval( s_aPrgs, { | a, b | hb_FNAMESPLIT( a, @cPath, @cTest, @cExt, @cDrive ), IIF( cPath == citem, s_aPrgs[ b ] := STRTRAN( a, cPath, "$(" + s_aMacros[ x, 1 ] + IIF( s_lGcc, ")/", ")\" ) ), ) } )
IF ! s_aMacros[ x, 3 ]
FWrite( s_nMakeFileHandle, s_aMacros[ x, 1 ] + " = " + Left( s_aMacros[ x, 2 ], Len( s_aMacros[ x, 2 ] ) - 1 ) + " " + s_cEOL )
s_aMacros[ x, 3 ] := .T.
ENDIF
ENDIF
nPos := AScan( s_aCFiles, { | z | hb_FNAMESPLIT( z, @cPath, @cTest, @cExt, @cDrive ), cPath == citem } )
IF nPos > 0
IF ! s_aMacros[ x, 3 ]
AEval( s_aCFiles, { | a, b | hb_FNAMESPLIT( a, @cPath, @cTest, @cExt, @cDrive ), IIF( cPath == citem, s_aCFiles[ b ] := STRTRAN( a, cPath, "$(" + s_aMacros[ x, 1 ] + IIF( s_lGcc, ")/", ")\" ) ), ) } )
FWrite( s_nMakeFileHandle, s_aMacros[ x, 1 ] + " = " + Left( s_aMacros[ x, 2 ], Len( s_aMacros[ x, 2 ] ) - 1 ) + " " + s_cEOL )
s_aMacros[ x, 3 ] := .T.
ENDIF
ENDIF
nPos := AScan( s_aObjs, { | z | hb_FNAMESPLIT( z, @cPath, @cTest, @cExt, @cDrive ), cPath == citem } )
IF nPos > 0
IF ! EMPTY( cObjDir )
AEval( s_aObjs, { | a, b | hb_FNAMESPLIT( a, @cPath, @cTest, @cExt, @cDrive ), IIF( cPath == citem, s_aObjs[ b ] := STRTRAN( a, cPath, "$(" + s_aMacros[ x, 1 ] + IIF( s_lGcc, ")/", ")\" ) ), ) } )
FWrite( s_nMakeFileHandle, s_aMacros[ x, 1 ] + " = " + Left( s_aMacros[ x, 2 ], Len( s_aMacros[ x, 2 ] ) - 1 ) + " " + s_cEOL )
ENDIF
ENDIF
nPos := AScan( s_aObjsC, { | z | hb_FNAMESPLIT( z, @cPath, @cTest, @cExt, @cDrive ), cPath == citem } )
IF nPos > 0
IF ! EMPTY( cObjDir )
AEval( s_aObjsC, { | a, b | hb_FNAMESPLIT( a, @cPath, @cTest, @cExt, @cDrive ), IIF( cPath == citem, s_aObjsC[ b ] := STRTRAN( a, cPath, "$(" + s_aMacros[ x, 1 ] + IIF( s_lGcc, ")/", ")\" ) ), ) } )
ENDIF
ENDIF
ENDIF
NEXT
IF s_lGcc
IF ( "LINUX" $ Upper( Getenv( "HB_ARCHITECTURE" ) ) .OR. cOS == "Linux" ) .or.;
( "UNIX" $ Upper( Getenv( "HB_ARCHITECTURE" ) ) .OR. cOS == "Unix" .or. cOS == "HP-UX" )
FWrite( s_nMakeFileHandle, "PROJECT = " + ALLTRIM( cAppName ) + " $(PR) " + s_cEOL )
ELSE
FWrite( s_nMakeFileHandle, "PROJECT = " + ALLTRIM( cAppName ) + ".exe" + " $(PR) " + s_cEOL )
ENDIF
ELSE
FWrite( s_nMakeFileHandle, "PROJECT = " + ALLTRIM( cAppName ) + iif(s_lasdll,".dll",".exe" ) + " $(PR) " + s_cEOL )
ENDIF
FWrite( s_nMakeFileHandle, "OBJFILES =" )
IF Len( s_aObjs ) < 1
FWrite( s_nMakeFileHandle, + " $(OB) " + s_cEOL )
ELSE
AEval( s_aObjs, { | x, i | nWriteFiles ++, IIF( ( i <> Len( s_aObjs ) .AND. x <> ALLTRIM(cTopfile) ), FWrite( s_nMakeFileHandle, " " + ALLTRIM( x ) + IIF( nWriteFiles % s_nFilestoAdd == 0, " //" + s_cEOL, "" ) ), FWrite( s_nMakeFileHandle, " " + ALLTRIM( x ) + " $(OB) " + s_cEOL ) ) } )
ENDIF
nWriteFiles := 0
FWrite( s_nMakeFileHandle, "PRGFILES =" )
IF Len( s_aPrgs ) < 1
FWrite( s_nMakeFileHandle, + " $(PS)" + s_cEOL )
ELSE
AEval( s_aPrgs, { | x, i | nWriteFiles ++, IIF( i <> Len( s_aPrgs ), FWrite( s_nMakeFileHandle, " " + ALLTRIM( x ) + IIF( nWriteFiles % s_nFilestoAdd == 0, " //" + s_cEOL, "" ) ), FWrite( s_nMakeFileHandle, " " + ALLTRIM( x ) + " $(PS) " + s_cEOL ) ) } )
ENDIF
nWriteFiles := 0
FWrite( s_nMakeFileHandle, "OBJCFILES =" )
IF Len( s_aObjsC ) < 1
FWrite( s_nMakeFileHandle, + " $(OBC) " + s_cEOL )
ELSE
AEval( s_aObjsC, { | x, i | nWriteFiles ++, IIF( i <> Len( s_aObjsC ), FWrite( s_nMakeFileHandle, " " + ALLTRIM( x ) + IIF( nWriteFiles % s_nFilestoAdd == 0, " //" + s_cEOL, "" ) ), FWrite( s_nMakeFileHandle, " " + ALLTRIM( x ) + " $(OBC) " + s_cEOL ) ) } )
ENDIF
nWriteFiles := 0
FWrite( s_nMakeFileHandle, "CFILES =" )
IF Len( s_aCFiles ) < 1
FWrite( s_nMakeFileHandle, + " $(CF)" + s_cEOL )
ELSE
AEval( s_aCFiles, { | x, i | nWriteFiles ++, IIF( i <> Len( s_aCFiles ), FWrite( s_nMakeFileHandle, " " + ALLTRIM( x ) + IIF( nWriteFiles % s_nFilestoAdd == 0, " //" + s_cEOL, "" ) ), FWrite( s_nMakeFileHandle, " " + ALLTRIM( x ) + " $(OB) " + s_cEOL ) ) } )
ENDIF
cResName := ALLTRIM(cResName)
FWrite( s_nMakeFileHandle, ;
"RESFILES = " + cResName + s_cEOL +;
"RESDEPEN = " + STRTRAN( cResName, ".rc", ".res" ) + s_cEOL +;
"TOPMODULE = " + ALLTRIM(cTopFile) + s_cEOL )
IF lRddads
cDefaultLibs += " rddads.lib ace32.lib"
cDefLibGccLibs += " -lrddads -ladsloc "
cDefaultLibsMt += " rddads.lib ace32.lib"
cDefLibGccLibsMt += " -lrddads -ladsloc "
cDefGccLibsw += " -lrddads -lads32 "
cExtraLibs += " -lrddads -ladsloc "
ENDIF
// remove obsolete bcc640xx.lib
//
IF "bcc640" $ cDefaultLibs
cDefaultLibs := STRTRAN( cDefaultLibs, "bcc640.lib", "")
ENDIF
IF "bcc640" $ cDefaultLibsMt
cDefaultLibsMt := STRTRAN( cDefaultLibsMt, "bcc640mt.lib", "")
ENDIF
// if Contrib libs were selected...
IF Len( aLibsOut ) > 0 .AND. s_lContribLib
IF s_lMSVcc .OR. s_lBcc .OR. s_lPocc
IF ! s_lMt
cOldLib := cDefaultLibs
ELSE
cOldLib := cDefaultLibsMt
ENDIF
// searching for html lib...
nPos := AScan( aLibsOut, { | z | At( "html", Lower( z ) ) > 0 } )
IF nPos > 0
cHtmlLib += aLibsOut[ nPos ]
aDel( aLibsOut, nPos )
aSize( aLibsOut, Len( aLibsOut ) - 1 )
cOldLib := STRTRAN( cOldLib, "gtwin" , "gtcgi" )
ENDIF
// searching for mysql lib...
AEval( aLibsOut, { | cLib | cLibs += " " + cLib } )
nPos := AScan( aLibsOut, { | z | At( "mysql", Lower( z ) ) > 0 } )
IF nPos >0
cLibs += " libmysql.lib"
ENDIF
// searching for postgre lib...
nPos := AScan( aLibsOut, { | z | At( "hbpg", Lower( z ) ) > 0 } )
IF nPos >0
cLibs += " libpq.lib"
cLibs := STRTRAN(cLibs,"hbpg","hbpg")
ENDIF
IF ! s_lmt
cDefaultLibs := cHtmlLib + " " + cOldLib
ELSE
cDefaultLibsMt := cHtmlLib + " " +cOldLib
ENDIF
ENDIF
IF s_lGcc
nPos := AScan( aLibsOut, { | z | At( "html", Lower( z ) ) > 0 } )
IF nPos > 0
cHtmlLib += "-l" + STRTRAN( aLibsOut[ nPos ], ".a", "" )
aDel( aLibsOut, nPos )
aSize( aLibsOut, Len( aLibsOut ) - 1 )
ENDIF
AEval( aLibsOut, { | cLib | iif( Len(aTempLibs :=ListAsArray2( cLib, " ") )> 0 ,cLibs += SetthisLibs(AtempLibs) ,cLibs += " -l" + STRTRAN( cLib, ".a", "" ))} )
nPos := AScan( aLibsOut, { | z | At( "mysql", Lower( z ) ) > 0 } )
if nPos >0
cLibs += " -lmysqlclient"
endif
nPos := AScan( aLibsOut, { | z | At( "hbpg", Lower( z ) ) > 0 } )
if nPos >0
cLibs += " -lpq"
endif
cExtraLibs := cLibs
IF cOS == "Linux"
IF ! s_lMt
cOldLib := " " + cDefLibGccLibs
cDefLibGccLibs := cHtmlLib + " " + cOldLib + " " + cLibs
IF "html" $ cDefLibGccLibs
cDefLibGccLibs := STRTRAN( cDefLibGccLibs, "gtcrs" , "gtcgi" )
cDefLibGccLibs := STRTRAN( cDefLibGccLibs, "ncurses" , "" )
ENDIF
ELSE
cOldLib := " " + cDefLibGccLibsMt
cDefLibGccLibsMt := cHtmlLib + " " + cOldLib + " " + cLibs
IF "html" $ cDefLibGccLibsMt
cDefLibGccLibsMt := STRTRAN( cDefLibGccLibsMt, "gtcrs" , "gtcgi" )
cDefLibGccLibsMt := STRTRAN( cDefLibGccLibsMt, "ncurses" , "" )
ENDIF
ENDIF
ELSEIF cOS == "OS/2"
IF ! s_lMt
cOldLib := " " + cGccLibsOs2
cGccLibsOs2 := cHtmlLib + " " + cOldLib + " " + cLibs
IF "html" $ cGccLibsOs2
cGccLibsOs2 := STRTRAN( cGccLibsOs2, "gtos2" , "gtcgi" )
ENDIF
ELSE
cOldLib := " " + cGccLibsOs2Mt
cGccLibsOs2Mt := cHtmlLib + " " + cOldLib + " " + cLibs
IF "html" $ cGccLibsOs2Mt
cGccLibsOs2Mt := STRTRAN( cGccLibsOs2Mt, "gtos2" , "gtcgi" )
ENDIF
ENDIF
ELSE
IF s_lMt
cOldLib := " " + cDefGccLibsMt
cDefGccLibsMt := cHtmlLib + " " + cOldLib + " " + cLibs
else
cOldLib := " " + cDefGccLibsw
cDefGccLibsw := cHtmlLib + " " + cOldLib + " " + cLibs
endif
ENDIF
ENDIF
ENDIF
IF s_lBcc .OR. s_lMSVcc .OR. s_lPocc
if lFwh .or. lMiniGui .or. lC4W .or. lWhoo .or. lHwGui .or. lHBWhat
cDefaultLibs := STRTRAN(cDefaultLibs,"gtwin.lib","gtgui.lib")
cDefaultLibsMt := STRTRAN(cDefaultLibsMt,"gtwin.lib","gtgui.lib")
endif
IF lFwh
IF s_lxFwh
FWrite( s_nMakeFileHandle, "HBLIBS = $(FWH)\lib\fivehx.lib $(FWH)\lib\fivehc.lib " + IIF( ! s_lMt, cDefaultLibs, cDefaultLibsMt ) + s_cEOL )
ELSE
FWrite( s_nMakeFileHandle, "HBLIBS = $(FWH)\lib\fiveh.lib $(FWH)\lib\fivehc.lib " + IIF( ! s_lMt, cDefaultLibs, cDefaultLibsMt ) + s_cEOL )
ENDIF
ELSEIF lMiniGui
FWrite( s_nMakeFileHandle, "HBLIBS = minigui.lib " + IIF( ! s_lMt, cDefaultLibs, cDefaultLibsMt ) + s_cEOL )
ELSEIF lWhoo
FWrite( s_nMakeFileHandle, "HBLIBS = whoo.lib hbwhat.lib " + IIF( ! s_lMt, cDefaultLibs, cDefaultLibsMt ) + s_cEOL )
ELSEIF lHBWhat
FWrite( s_nMakeFileHandle, "HBLIBS = hbwhat.lib " + IIF( ! s_lMt, cDefaultLibs, cDefaultLibsMt ) + s_cEOL )
ELSEIF lHwGui
FWrite( s_nMakeFileHandle, "HBLIBS = hwgui.lib procmisc.lib hwg_qhtm.lib " + IIF( ! s_lMt, cDefaultLibs, cDefaultLibsMt ) + s_cEOL )
ELSEIF lC4W
FWrite( s_nMakeFileHandle, "HBLIBS = $(C4W)\c4wclass.lib $(C4W)\wbrowset.lib $(C4W)\otabt.lib $(C4W)\clip4win.lib " + IIF( ! s_lMt, cDefaultLibs, cDefaultLibsMt ) + s_cEOL )
ELSE
if lGtwvt
cDefaultLibs := STRTRAN(cDefaultLibs,"gtwin.lib","gtwvt.lib")
cDefaultLibsMt := STRTRAN(cDefaultLibsMt,"gtwin.lib","gtwvt.lib")
elseif lGtwvw
cDefaultLibs := iif(lMWvW,"mwvw.lib ", "") + STRTRAN(cDefaultLibs,"gtwin.lib","gtwvw.lib ")
cDefaultLibsMt := iif(lMWvW,"mwvw.lib ", "") + STRTRAN(cDefaultLibsMt,"gtwin.lib","gtwvw.lib ")
endif
FWrite( s_nMakeFileHandle, "HBLIBS = " + IIF( ! s_lMt, cDefaultLibs, cDefaultLibsMt ) + s_cEOL )
ENDIF
ELSEIF s_lGcc
IF cOS == "Linux"
FWrite( s_nMakeFileHandle, "HBLIBS = " + IIF(lusexhb, cExtraLibs , "-Wl,--start-group " + IIF( ! s_lMt, cDefLibGccLibs, cDefLibGccLibsMt ) + " -Wl,--end-group " + cSystemLibs ) + s_cEOL )
ELSEIF cOS == "Unix" .or. cOS == "UP-UX"
FWrite( s_nMakeFileHandle, "HBLIBS = " + IIF(lusexhb, cExtraLibs , " " + IIF( ! s_lMt, cDefGccLibsUnix, cDefGccLibsUnixmt ) + " " + cSystemLibs ) + s_cEOL )
ELSEIF cOS == "OS/2"
FWrite( s_nMakeFileHandle, "HBLIBS = " + IIF( ! s_lMt, cGccLibsOs2, cGccLibsOs2Mt ) + s_cEOL )
ELSEIF "MINGW" $ cCompiler
IF lHwGui
cDefGccLibsw :=STRTRAN( cDefGccLibsw,"-lgtwin" ,"-lgtgui")
cDefGccLibsMtw :=STRTRAN( cDefGccLibsMtw,"-lgtwin" ,"-lgtgui")
FWrite( s_nMakeFileHandle, "HBLIBS = -Wl,--allow-multiple-definition -Wl,--start-group -lhwgui -lprocmisc -lhwg_qhtm " + IIF( ! s_lMt, cDefGccLibsw, cDefGccLibsMtw ) + " -Wl,--end-group " + s_cEOL)
else
FWrite( s_nMakeFileHandle, "HBLIBS = -Wl,--allow-multiple-definition -Wl,--start-group " + IIF( ! s_lMt, cDefGccLibsw, cDefGccLibsMtw ) + " -Wl,--end-group " + s_cEOL )
endif
ELSE
FWrite( s_nMakeFileHandle, "HBLIBS = " + IIF( ! s_lMt, cDefGccLibs, cDefGccLibs ) + s_cEOL )
ENDIF
ENDIF
nWriteFiles := 0
FWrite( s_nMakeFileHandle, "CONTRIBLIBS =" )
if Len(s_aContribLibs) < 1
FWrite( s_nMakeFileHandle, s_cEOL )
else
AEval( s_aContribLibs, { | x | nWriteFiles ++, FWrite( s_nMakeFileHandle, " " + ALLTRIM( x ) ) } )
FWrite( s_nMakeFileHandle, s_cEOL )
endif
FWrite( s_nMakeFileHandle, ;
"DEFFILE = " + s_cEOL +;
"HARBOURFLAGS = " + cHarbourFlags + s_cEOL )
IF s_lBcc
FWrite( s_nMakeFileHandle, "CFLAG1 = -OS $(SHELL) $(CFLAGS) -d -c -L$(HB_DIR)\lib"+iif(lFwh,";$(FWH)\lib ","")+iif(!EMPTY(s_cUserInclude)," -I" + ALLTRIM( s_cUserInclude ),"") + " " +s_cEOL +;
"CFLAG2 = -I$(HB_DIR)\include;$(CC_DIR)\include" + iif( s_lMt, " -DHB_THREAD_SUPPORT " , "" ) + s_cEOL )
/* added "-x" flag to LFLAGS statment to suppress creation of map file and speed up link. */
FWrite( s_nMakeFileHandle, ;
"RFLAGS = " + s_cEOL +;
"LFLAGS = -L$(CC_DIR)\lib\obj;$(CC_DIR)\lib;$(HB_DIR)\lib -Gn -M -m -s -Tp"+ iif(s_lasdll,"d","e") + " -x" + IIF( lFWH .or. lMiniGui .or. lWhoo .or. lHwgui .or. lGtWvt .or. lGtWvw ," -aa"," -ap") + IIF( lMinigui, " -L$(MINIGUI)\lib",IIF( lFwh, " -L$(FWH)\lib",IIF( lHwgui, " -L$(HWGUI)\lib","" ))) + s_cEOL +;
"IFLAGS = " + s_cEOL +;
"LINKER = ilink32" + s_cEOL +;
" " + s_cEOL +;
"ALLOBJ = " + IIF( ( lWhoo .OR. lHBWhat .OR. lFwh .OR. lMinigui .OR. lHwgui .or. lGtWvt .or. lGtWvw .or. lXwt .or. lxHGtk ), "c0w32.obj", iif(s_lAsDll,"c0d32.obj","c0x32.obj" )) + " $(OBJFILES) $(OBJCFILES)" + s_cEOL +;
"ALLRES = $(RESDEPEN)" + s_cEOL +;
"ALLLIB = $(USERLIBS) $(CONTRIBLIBS) $(HBLIBS) import32.lib " + IIF( s_lMt,"cw32mt.lib", "cw32.lib" )+ s_cEOL +;
".autodepend" + s_cEOL )
ELSEIF s_lMSVcc
FWrite( s_nMakeFileHandle, ;
"CFLAG1 = -I$(INCLUDE_DIR) -W3 -nologo $(HB_USER_CFLAGS) $(SHELL) $(CFLAGS)" +IIF( s_lMt, " -DHB_THREAD_SUPPORT " , "" ) + s_cEOL +;
"CFLAG2 = -c" +" -I" + ALLTRIM( s_cUserInclude ) + " " + s_cEOL +;
"RFLAGS = " + s_cEOL +;
"LFLAGS = /LIBPATH:$(CC_DIR)\lib /LIBPATH1:$(HB_DIR)\lib /LIBPATH2:$(C4W)\lib" +IIF(s_lMt, " /Nodefaultlib:LIBC "," /Nodefaultlib:LIBCMT " ) + s_cEOL +;
"IFLAGS = " + s_cEOL +;
"LINKER = link" + s_cEOL +;
" " + s_cEOL +;
"ALLOBJ = " + IIF( lC4W, "$(C4W)\initc.obj", "" ) + "$(OBJFILES) $(OBJCFILES)" + s_cEOL +;
"ALLRES = $(RESDEPEN)" + s_cEOL +;
"ALLLIB = $(USERLIBS) $(CONTRIBLIBS) $(HBLIBS) kernel32.lib user32.lib gdi32.lib winspool.lib comctl32.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib mpr.lib vfw32.lib winmm.lib " + s_cEOL )
ELSEIF s_lPocc
FWrite( s_nMakeFileHandle, ;
"CFLAG1 = $(SHELL) /Ze /Go /Ot /Tx86-coff /I$(INCLUDE_DIR) $(HB_USER_CFLAGS) $(CFLAGS)" +IIF( s_lMt, ' /D"HB_THREAD_SUPPORT" /MT' , "" ) + s_cEOL +;
"CFLAG2 = " + s_cEOL +;
"RFLAGS = " + s_cEOL +;
"LFLAGS = /LIBPATH:$(CC_DIR)\lib /LIBPATH:$(CC_DIR)\lib\win /LIBPATH:$(HB_DIR)\lib /MACHINE:IX86"+IIF(!s_lGui," /SUBSYSTEM:CONSOLE"," /SUBSYSTEM:WINDOWS") + s_cEOL +;
"IFLAGS = " + s_cEOL +;
"LINKER = polink" + s_cEOL +;
" " + s_cEOL +;
"ALLOBJ = " + IIF( lC4W, "$(C4W)\initc.obj", "" ) + "$(OBJFILES) $(OBJCFILES)" + s_cEOL +;
"ALLRES = $(RESDEPEN)" + s_cEOL +;
"ALLLIB = $(USERLIBS) $(CONTRIBLIBS) $(HBLIBS) "+IIF(s_lMT,"crtmt.lib","crt.lib") + " kernel32.lib user32.lib gdi32.lib winspool.lib comctl32.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib mpr.lib winmm.lib wsock32.lib schannel.lib" + s_cEOL )
ELSEIF s_lGcc
FWrite( s_nMakeFileHandle, ;
"CFLAG1 = $(SHELL) " +IIF( !EMPTY(s_cUserInclude ) ," -I" + ALLTRIM( s_cUserInclude ) ,"") + IIF( "Unix" $ cOs , " -I/usr/include/harbour ", "" ) + IIF( "Linux" $ cOS, "-I/usr/include/harbour", " -I$(HB_DIR)/include" ) + " -c -Wall" + IIF( s_lMt, " -DHB_THREAD_SUPPORT " , "" ) + iif(s_lmingw, " -mno-cygwin "," " )+ s_cEOL +;
"CFLAG2 = " + IIF( "Linux" $ cOS, "-L$(HB_LIB_INSTALL)", " -L$(HB_DIR)/lib -L$(CC_DIR)/lib" ) + IIF( "Unix" $ cOs , " -L/usr/lib/harbour ", "" ) + IIF( lHwgui, " -L$(HWGUI)\lib","" ) + s_cEOL +;
"RFLAGS = " + s_cEOL +;
"LFLAGS = " + iif(!s_lLinux," ","-Wl,--noinhibit-exec ") + IIF(lUseXhb ,IIF(lUseharbourDll,"","-static ") + iif(lXwt .or. lhwgui ,"-gtcgi " , "-gtcrs "), "$(CFLAG2)") + iif(lXwt,"`pkg-config --libs gtk+-2.0` -lxwt -lxwt_gtk -lxwt","") + iif( lxHGtk, "`pkg-config --libs gtk+-2.0 libglade-2.0` -lxhgtk ","") + iif( lhwgui .and. !s_lMinGW, " `pkg-config --libs gtk+-2.0 libglade-2.0 libgnomeprint-2.2` -hwgui ","") + iif(lhwgui .and. s_lMinGW," -mwindows " ,"" )+ iif(s_lLinux .and. s_lmt ," -mt "," " ) +s_cEOL +;
"IFLAGS = " + s_cEOL +;
"LINKER = "+ IIF(lusexhb,"hblnk","gcc") + s_cEOL +;
" " + s_cEOL +;
"ALLOBJ = $(OBJFILES) $(OBJCFILES)" + s_cEOL +;
"ALLRES = $(RESDEPEN) " + s_cEOL +;
"ALLLIB = $(USERLIBS) $(CONTRIBLIBS) $(HBLIBS) " +iif(s_lMinGW," -luser32 -lwinspool -lgdi32 -lcomctl32 -lcomdlg32 -lole32 -loleaut32 -luuid -lmpr -lwsock32 -lws2_32 -lmapi32","") + s_cEOL +;
".autodepend" + s_cEOL )
ENDIF
#IFdef HBM_USE_DEPENDS
FWrite( s_nMakeFileHandle, ;
" " + s_cEOL +;
"#DEPENDS" + s_cEOL )
IF lScanIncludes
// Clipper/(x)Harbour sources: .prg
IF Len( s_aPrgs ) == Len( s_aObjs )
Attention("Scanning .prg sources...",19)
FOR nPos := 1 to Len(s_aPrgs)
cIncl := ScanInclude( ReplaceMacros( s_aPrgs[ nPos ] ), lScanIncRecursive, cExcludeExts )
// Only add in list if dependencies exist
IF ! EMPTY(cIncl)
FWrite( s_nMakeFileHandle, s_aObjs[ nPos ] + ": " + ALLTRIM( cIncl ) + s_cEOL, "" )
ENDIF
NEXT
ENDIF
// C-sources: .c
IF Len( s_aCFiles ) == Len( s_aObjsC )
Attention("Scanning .c sources...",19)
FOR nPos := 1 to Len(s_aCFiles)
cIncl := ScanInclude( s_aCFiles[ nPos ], lScanIncRecursive, cExcludeExts )
// Only add in list if dependencies exist
IF ! EMPTY(cIncl)
FWrite( s_nMakeFileHandle, s_aObjsC[ nPos ] + ": " + ALLTRIM( cIncl ) + s_cEOL, "" )
ENDIF
NEXT
ENDIF
// Cleanup message
@ 19, 1 say Space(MaxCol() - 2)
ENDIF
#ENDIF
FWrite( s_nMakeFileHandle, ;
" " + s_cEOL +;
"#COMMANDS" + s_cEOL )
AEval( s_aCommands, { | xItem | FWrite( s_nMakeFileHandle, xitem[ 1 ] + s_cEOL ), FWrite( s_nMakeFileHandle, xitem[ 2 ] + s_cEOL ), FWrite( s_nMakeFileHandle, " " + s_cEOL ) } )
IF s_lBcc .OR. s_lMSVcc .OR. s_lPocc
FWrite( s_nMakeFileHandle, ;
"#BUILD" + s_cEOL +;
" " + s_cEOL +;
"$(PROJECT): $(CFILES) $(OBJFILES) $(RESDEPEN) $(DEFFILE)" + s_cEOL +;
" $(CC_DIR)\bin\$(LINKER) @&&! " + s_cEOL +;
" $(LFLAGS) +" + s_cEOL +;
" $(ALLOBJ), +" + s_cEOL +;
" $(PROJECT),, +" + s_cEOL +;
" $(ALLLIB), +" + s_cEOL +;
" $(DEFFILE), +" + s_cEOL +;
" $(ALLRES) " + s_cEOL +;
"!" + s_cEOL )
ELSEIF s_lGcc
FWrite( s_nMakeFileHandle, ;
"#BUILD" + s_cEOL +;
" " + s_cEOL +;
"$(PROJECT): $(CFILES) $(OBJFILES) $(RESDEPEN) $(DEFFILE)" + s_cEOL )
IF "Linux" $ cOS
FWrite( s_nMakeFileHandle, " $(LINKER) @&&!" + s_cEOL )
ELSEIF "Unix" $ cOS .or. "HP-UX" $ cOS
FWrite( s_nMakeFileHandle, " $(LINKER) @&&!" + s_cEOL )
ELSE
FWrite( s_nMakeFileHandle, " $(CC_DIR)\bin\$(LINKER) @&&!" + s_cEOL )
ENDIF
FWrite( s_nMakeFileHandle, ;
" $(PROJECT) " + s_cEOL +;
" $(ALLOBJ) " + s_cEOL +;
" $(LFLAGS) " + s_cEOL +;
" $(ALLLIB) " + s_cEOL +;
"!" + s_cEOL )
ENDIF
FClose( s_nMakeFileHandle )
s_nMakeFileHandle:= F_ERROR // Makefile now file is closed
IF !lCancelMake
DO CASE
CASE s_nLang == LANG_PT /* portuguese brazilian */
cAlertMsg := "Compile tudo, mudado, ou nenhuns? (t, m, n)"
CASE s_nLang == LANG_ES /* spanish */
cAlertMsg := "Compilar todos, cambiado, o ningunos? (t, c, n)"
OTHERWISE /* english */
cAlertMsg := "Compile All, Changed, or None? (A, C, N)"
END CASE
IF ! lCreateAndCompile
@ 20,5 SAY cAlertMsg;
GET cBuild;
PICT "!";
VALID cBuild $ iif(s_nLang == LANG_EN,"ACN",IIF( s_nLang == LANG_PT, "TMN", "TCN" ) )
READ
ELSE
cBuild := "A" /* Build All Flag */
ENDIF
ENDIF
/* Set Parameter for how to continue
*/
DO CASE
CASE cBuild $ "AT"
nBuildReturn := BLD_ALL
CASE cBuild $ "CM"
nBuildReturn := BLD_CHNG
CASE cBuild $ "N"
nBuildReturn := BLD_NONE
OTHERWISE
nBuildReturn := RET_ERR
END CASE
RESTSCREEN( ,,,, cOldScreen )
RETURN nBuildReturn
#IfDef HBM_USE_DEPENDS
*------------------------------------------------------------
FUNCTION ScanInclude( cFile, lRecursive, cExclExtent, aFiles)
*------------------------------------------------------------
// Search for #include & Set Procedure To & Set Proc To
LOCAL cFileList := ""
LOCAL nHandle := -1
LOCAL lEof := .F.
LOCAL cTemp := ""
LOCAL cBuffer := ""
LOCAL aQuotes := {{'"','"'},{"'","'"},{"[","]"},{"<",">"}}
LOCAL cQuote := ""
LOCAL cQuoteA := ""
LOCAL cInclude := ""
LOCAL lPrg := .F.
LOCAL lC := .F.
LOCAL lCh := .F.
LOCAL cPath := ""
LOCAL cFnam := ""
LOCAL cExt := ""
LOCAL cDrive := ""
LOCAL cContinue := ""
DEFAULT lRecursive TO .F.
DEFAULT cExclExtent TO "" // specify extensions to exclude like ".ch.def" etc., including the dot
DEFAULT aFiles TO {}
IF File(cFile)
HB_FNAMESPLIT( cFile, @cPath, @cFnam, @cExt, @cDrive )
lPrg := (Lower(cExt) == ".prg")
lC := (Lower(cExt) == ".c")
lCh := (Lower(cExt) == ".ch")
cContinue := IIF(lPrg,";",IIF(lC,"\",""))
nHandle := FOpen(cFile)
IF nHandle != F_ERROR
// Provisions for recursive scanning
// Add current file to list, making it by default the first in the list
IF s_lWindows
IF AScan(aFiles, {| x | Lower( x ) == Lower( cFnam + cExt ) } ) == 0 // Case IN-sensitive!
AAdd(aFiles, cFnam + cExt )
ENDIF
ELSE
IF AScan(aFiles, cFnam + cExt ) == 0 // Case Sensitive!
AAdd(aFiles, cFnam + cExt )
ENDIF
ENDIF
lEof := ( HB_FReadLine( nHandle, @cTemp, s_aEOL ) == HB_FEOF )
cTemp := LTrim( cTemp )
// Loop reading file
WHILE !lEof
IF lPrg .OR. lC // Check for line-continuation
WHILE Right(cTemp, 1 ) == cContinue
cTemp := Left( cTemp , Len( cTemp ) - 1)
IF !lEof
lEof := (HB_FReadLine(nHandle,@cBuffer,s_aEOL) == HB_FEOF)
cTemp += LTrim( cBuffer)
ENDIF
ENDDO
ENDIF
// Dependencies
IF Lower(Left( cTemp, 8)) == "#include"
cTemp := ALLTRIM(SUBSTR( cTemp, 9))
Else
IF lPrg .and. Upper(Left( cTemp, 16)) == "SET PROCEDURE TO"
cTemp := ALLTRIM(SUBSTR( cTemp, 17))
ELSE
IF lPrg .and. Upper(Left( cTemp, 11)) == "SET PROC TO" // Alternative
cTemp := ALLTRIM(SUBSTR( cTemp, 12))
ELSE
cTemp := ""
ENDIF
ENDIF
Endif
// Something Ok?
IF Len(cTemp) > 0
cQuote := Left( cTemp, 1)
cQuoteA := ""
AEval(aQuotes,{| x |Iif(x[1] == cQuote,cQuoteA := x[2],)}) // Determine closing quote
IF cQuoteA == ""
cInclude := ALLTRIM(Left(cTemp, At(" ", cTemp + " ") - 1)) // Handle set procedure to, not using quotes
ELSE
cTemp := SUBSTR(cTemp, 2)
cInclude := ALLTRIM(Left(cTemp, At(cQuoteA, cTemp) - 1)) // Find closing quote
ENDIF
IF Len(cInclude) > 0 .and. Len(ALLTRIM(cExclExtent)) > 0
HB_FNAMESPLIT( cInclude, @cPath, @cFnam, @cExt, @cDrive )
IF lPrg .AND. Len(cExt) == 0
cInclude := cInclude + ".prg" // Handle set procedure to, using default extension
ENDIF
// TOFIX: Needs to be case sensitive for non-WinDOS? [vszakats]
IF AT(Lower(cExt), Lower(cExclExtent)) > 0
cInclude := ""
ENDIF
ENDIF
IF Len(cInclude) > 0
// Still Ok, add to list?
IF s_lWindows
IF AScan(aFiles, {| x | Lower( x ) == Lower( cInclude ) } ) == 0 // Case IN-sensitive!
AAdd(aFiles, (cInclude) )
// recursive scanning
IF lRecursive
ScanInclude(FileInIncludePath(cInclude), lRecursive, cExclExtent, aFiles )
ENDIF
ENDIF
ELSE
IF AScan(aFiles, cInclude ) == 0 // Case Sensitive!
AAdd(aFiles, (cInclude) )
// recursive scanning
IF lRecursive
ScanInclude(FileInIncludePath(cInclude), lRecursive, cExclExtent, aFiles )
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF !lEof
lEof := (HB_FReadLine(nHandle,@cTemp,s_aEOL) == HB_FEOF)
cTemp := LTrim( cTemp)
ENDIF
ENDDO
FClose( nHandle )
ENDIF
ENDIF
// Return results, a space-separated list of filenames, unsorted
IF Len(aFiles) > 1 // Skip generation of list if only main source (1) was added, caller knows what to do
AEval(aFiles,{| x | cFileList := cFileList + " " + x } )
ENDIF
RETURN cFileList
#Endif
*-----------------------------
FUNCTION CompileUpdatedFiles()
*-----------------------------
LOCAL cComm
LOCAL cOld
LOCAL nPos
LOCAL cTest
LOCAL aCtocompile := {}
LOCAL aOrder := ListAsArray2( s_aBuildOrder[ 2 ], " " )
LOCAL cErrText := ""
LOCAL xItem
LOCAL cOrder := ""
LOCAL cPrg := ""
LOCAL nFiles
LOCAL nFile := 1
LOCAL lNewer := .F.
LOCAL lErrors
#IfDef HBM_USE_DEPENDS
LOCAL nPos1 := 0
LOCAL cDepSrc := ""
#Endif
FOR EACH cOrder in aOrder
IF cOrder == "$(CFILES)"
nPos := AScan( s_aCommands, { | x | x[ 1 ] == ".c.obj:" .OR. x[ 1 ] == ".cpp.obj:" .or. x[ 1 ] == ".cpp.o:" .or. x[ 1 ] == ".c.o:" } )
cTest:= s_aCommands[nPos]
IF nPos > 0
cComm := s_aCommands[ nPos, 2 ]
cOld := cComm
ELSE
nPos := AScan( s_aCommands, { | x | x[ 1 ] == ".C.OBJ:" } )
IF nPos > 0
cComm := s_aCommands[ nPos, 2 ]
cOld := cComm
ENDIF
ENDIF
FOR nFiles := 1 TO Len( s_aCFiles )
@ 4, 16 SAY Space( 50 )
xItem := SUBSTR( s_aCFiles[ nFiles ], Rat( IIF( s_lGcc, "/", "\" ), s_aCFiles[ nFiles ] ) + 1 )
nPos := AScan( s_aObjsC, { | x | x := SUBSTR( x, Rat( IIF( s_lGcc, "/", "\" ), x ) + 1 ), Left( x, At( ".", x ) ) == Left( xitem, At( ".", xitem ) ) } )
#IfDef HBM_USE_DEPENDS
lNewer := .F.
// TOFIX: Needs to be case sensitive for non-WinDOS? [vszakats]
nPos1 := AScan( s_aDepends, { | x |lower(x[1]) == lower( s_aObjs[ npos ] )})
IF nPos1 > 0
FOR EACH cDepSrc in s_aDepends[ nPos1 , 2 ]
lNewer := lNewer .OR. Fileisnewer( cDepSrc, s_aObjs[ npos ], .T. )
NEXT
ENDIF
#Endif
IF lNewer .or. Fileisnewer( s_aCFiles[ nFiles ], s_aObjsC[ nPos ] )
IF nPos > 0
IF s_lMSVcc //.OR. s_lPocc
cComm := STRTRAN( cComm, "-Fo$*", "-Fo" + s_aObjsC[ nPos ] )
ELSE
cComm := STRTRAN( cComm, "o$*", "o" + s_aObjsC[ nPos ] )
ENDIF
cComm := STRTRAN( cComm, "$**", s_aCFiles[ nFiles ] )
cComm += IIF( s_lLinux , " > "+ (s_cLog)," >>"+ (s_cLog))
nFile ++
lErrors := IIF( hb_run( cComm ) != 0, .T., .F. )
s_lErrors := IIF( lErrors, .T., s_lErrors )
IF ! s_lIgnoreErrors .AND. lErrors
hb_run( s_cEditor + " " + s_cLog )
QUIT
ENDIF
cComm := cOld
ENDIF
ENDIF
NEXT
//nFile++
ENDIF
IF cOrder == "$(OBJFILES)"
IF s_lGcc
nPos := AScan( s_aCommands, { | x | x[ 1 ] == ".prg.o:" } )
ELSE
nPos := AScan( s_aCommands, { | x | x[ 1 ] == ".prg.obj:" } )
ENDIF
IF nPos > 0
cComm := s_aCommands[ nPos, 2 ]
cOld := cComm
ELSE
IF s_lGcc
nPos := AScan( s_aCommands, { | x | x[ 1 ] == ".PRG.O:" } )
ELSE
nPos := AScan( s_aCommands, { | x | x[ 1 ] == ".PRG.OBJ:" } )
ENDIF
ENDIF
nFile := 1
FOR EACH cPrg IN s_aPrgs
@ 4, 16 SAY PADR( cPrg, 50, " " )
xItem := SUBSTR( cPrg, Rat( IIF( s_lGcc, "/", "\" ), cPrg ) + 1 )
nPos := AScan( s_aObjs, { | x | x := SUBSTR( x, Rat( IIF( s_lGcc, "/", "\" ), x ) + 1 ), Left( x, At( ".", x ) ) == Left( xItem, At( ".", xitem ) ) } )
#IfDef HBM_USE_DEPENDS
lNewer := .F.
// TOFIX: Needs to be case sensitive for non-WinDOS? [vszakats]
nPos1 := AScan( s_aDepends, { | x |lower(x[1]) == lower( s_aObjs[ npos ] )})
IF nPos1 > 0
FOR EACH cDepSrc in s_aDepends[ nPos1 , 2 ]
lNewer := lNewer .OR. Fileisnewer( cDepSrc, s_aObjs[ npos ], .T. )
NEXT
ENDIF
#Endif
IF !EMPTY( cPrg ) .AND. (lNewer .OR. Fileisnewer( cPrg, s_aObjs[ npos ] ))
IF nPos > 0
IF s_lMSVcc //.OR. s_lPocc
cComm := STRTRAN( cComm, "-Fo$*", "-Fo" + s_aObjs[ nPos ] )
ELSE
cComm := STRTRAN( cComm, "o$*", "o" + s_aObjs[ nPos ] )
ENDIF
cComm := STRTRAN( cComm, "$**", cPrg )
cComm += IIF( s_lLinux , " > "+ (s_cLog)," >>"+ (s_cLog))
nFile ++ // moved from outside "FOR EACH", Ath 2004-06-08
lErrors := IIF( hb_run( cComm ) != 0, .T., .F. )
s_lErrors := IIF( lErrors, .T., s_lErrors )
IF ! s_lIgnoreErrors .AND. lErrors
hb_run( s_cEditor + " " + s_cLog )
QUIT
ENDIF
cComm := cOld
ENDIF
ENDIF
NEXT
ENDIF
IF cOrder == "$(RESDEPEN)"
nPos := AScan( s_aCommands, { | x | x[ 1 ] == ".rc.res:" } )
IF nPos > 0
cComm := s_aCommands[ nPos, 2 ]
cOld := cComm
ENDIF
FOR nFiles := 1 TO Len( s_aResources )
IF ! EMPTY( s_aResources[ nFiles ] )
cComm := STRTRAN( cComm, "$<", s_aResources[ nFiles ] )
lErrors := IIF( hb_run( cComm ) != 0, .T., .F. )
s_lErrors := IIF( lErrors, .T., .F. )
ENDIF
cComm := cOld
NEXT
ENDIF
NEXT
RETURN s_lErrors
*------------------------------------------
FUNCTION FileIsNewer( cFile, as, lInclude )
*------------------------------------------
LOCAL nCount := 0
LOCAL cSrcPath := ""
DEFAULT lInclude TO .F.
// Check all paths in INCLUDE environment variable, if requested
IF lInclude
cFile := FileInIncludePath(cFile)
ENDIF
s_aDir := { cFile,, Hbmake_Filedate( cFile ), hbmake_filetime( cFile ), ;
as, Hbmake_Filedate( as ), hbmake_filetime( as ) }
IF EMPTY( s_aDir[ 7 ] )
s_aDir[ 2 ] := .T.
ELSE
s_aDir[ 2 ] := td2jul( s_aDir[ 4 ], s_aDir[ 3 ] ) > td2jul( s_aDir[ 7 ], s_aDir[ 6 ] )
ENDIF
RETURN s_aDir[ 2 ]
*--------------------------------
FUNCTION FileInIncludePath(cFile)
*--------------------------------
LOCAL cFilePath := ""
LOCAL cSrcPath := ""
IF Len(s_aSrcPaths) == 0
s_aSrcPaths := ListAsArray2( GetEnv( "INCLUDE" ) , HB_OSPATHLISTSEPARATOR() )
ENDIF
IF ! File(cFile)
FOR EACH cSrcPath IN s_aSrcPaths
IF Len(cSrcPath) > 0 .and. Right(cSrcPath,1) <> HB_OSPATHSEPARATOR()
cSrcPath := cSrcPath + HB_OSPATHSEPARATOR()
ENDIF
IF File(cSrcPath + cFile)
cFile := cSrcPath + cFile
EXIT
ENDIF
NEXT
ENDIF
RETURN cFile
*----------------------------------
FUNCTION CreateLibMakeFile( cFile )
*----------------------------------
LOCAL cAlertMsg
LOCAL nBuildReturn
LOCAL cOldScreen:= SAVESCREEN()
LOCAL nMaxRow := MAXROW()
LOCAL aInFiles := {}
LOCAL aOutFiles := {}
LOCAL aSrc := Directory( "*.prg" )
LOCAL nLenaSrc := Len( aSrc )
LOCAL aOutC := {}
LOCAL aSrcC := Directory( "*.c" )
LOCAL cOS := IIF( s_lLinux, "Linux", "Windows")
LOCAL cCompiler := IIF( s_lLinux, "GCC",IIF(s_lMSVcc,"MSVC",IIF(s_lPocc,"POCC","BCC")))
LOCAL cLibName := PADR( Left( cFile, At( ".", cFile ) - 1 ) ,40)
LOCAL lAutomemvar := .F.
LOCAL lVarIsMemvar := .F.
LOCAL lDebug := .F.
LOCAL lSupressline := .F.
LOCAL cHarbourFlags := ""
LOCAL cObjDir := s_cObjDir + space( 20 )
LOCAL lCompMod := .F.
LOCAL lInstallLib := .F.
LOCAL x
LOCAL nPos
// LOCAL lGenppo := .F.
LOCAL GetList := {}
LOCAL cItem := ""
LOCAL cExt := ""
LOCAL cDrive := ""
LOCAL cPath := ""
LOCAL cTest := ""
LOCAL cLast := ""
LOCAL nWriteFiles := 0
LOCAL aUserDefs
LOCAL cCurrentDef := ""
LOCAL cBuild := " "
LOCAL cBuildForced := " "
LOCAL lCancelMake := .F.
LOCAL nOption
LOCAL lNew := .F.
LOCAL oMake
LOCAL cAllRes := ""
LOCAL cTemp
IF nLenaSrc == 0 .AND. !s_lRecursive
IF s_nLang == LANG_PT /* portuguese brazilian */
cAlertMsg := "NÆo h  prg na pasta "+curdir()
ELSEIF s_nLang == LANG_ES /* spanish */
cAlertMsg := "No hay ning£n prg en la carpeta "+curdir()
ELSE /* english */
cAlertMsg := "Have not any prg in "+curdir()+" folder."
ENDIF
ALERT( cAlertMsg )
RETURN RET_ERR
ENDIF
s_cUserInclude := space(200)
s_cUserDefine := space(200)
IF File( cFile )
IF s_nLang == LANG_PT /* portuguese brazilian */
nOption := ALERT( "O makefile <" + cFile +"> j  existe.",{ "Editar", "Criar Novo" , "Cancelar" } )
ELSEIF s_nLang == LANG_ES /* spanish */
nOption := ALERT( "Lo makefile <" + cFile +"> ya existe.",{ "Editar", "Crear Nuevo" , "Cancelar" } )
ELSE /* english */
nOption := ALERT( "The makefile <" + cFile +"> already exist ",{ "Edit" , "Create New" , "Cancel" } )
ENDIF
IF nOption == 1 // edit makefile
// Verify if "cFile" can be openned to write mode.
s_nMakeFileHandle := FOpen( cFile, FO_WRITE )
if s_nMakeFileHandle == F_ERROR
IF s_nLang == LANG_PT /* brazilian portuguese */
cAlertMsg := "<"+cFile + "> nÆo pode ser aberto para edi‡Æo."
ELSEIF s_nLang == LANG_ES /* spanish */
cAlertMsg := "<"+cFile + "> no pode ser abierto para edici¢n."
ELSE /* english */
cAlertMsg := "<"+cFile + "> cannot be openned for edition."
ENDIF
ALERT( cAlertMsg+" FERROR ("+hb_NToS(FError())+")" )
RETURN RET_ERR
else
FClose( s_nMakeFileHandle )
s_nMakeFileHandle:= F_ERROR // Invalid handle now file is closed
endif
oMake :=THbMake():new()
oMake:cMakefile := cFile
oMake:cMacro := iif(s_lMSVcc,"#MSVC",iif(s_lPocc,"#POCC",iif(s_lGcc,"#GCC","#BCC")))
oMake:ReadMakefile(cFile)
FRename(cFile,cFile+".old")
IF LEN(oMake:aRes) >0
FOR EACH cTemp IN oMake:aRes
cAllRes += cTemp+ " "
NEXT
ENDIF
lAutoMemVar := oMake:lAutomemvar
lVarIsMemVar := oMake:lVarIsMemvar
lDebug := oMake:ldebug
lSupressline := oMake:lSupressline
lCompMod := oMake:lCompMod
s_lGenppo := oMake:lGenppo
lInstallLib := oMake:lInstallLib
s_cUserInclude := PADR(oMake:cUserInclude,200 )
s_cUserDefine := PADR(oMake:cUserDef,200 )
s_cUserLibs := PADR(oMake:cUserLib,200 )
s_cEditor := trim(oMake:cEditor)
if EMPTY( s_cEditor )
if s_lOS2 .OR. s_lLinux
s_cEditor := "mcedit"
else
s_cEditor := "edit"
endif
endif
if !EMPTY(oMake:cFmc)
cLibName := PADR(oMake:cFmc,200)
endif
if !s_lRecursive
s_lRecursive := oMake:lRecurse
endif
IF nLenaSrc == 0 .and. !s_lRecursive
IF s_nlang == LANG_PT /* portuguese brazilian */
cAlertMsg := "NÆo h  nenhum prg na pasta "+CurDir()+". Use o modo recursivo -r"
ELSEIF s_nLang == LANG_ES /* spanish */
cAlertMsg := "No hay ning£n prg en la carpeta "+CurDir()+". Use lo modo recursivo -r"
ELSE /* english */
cAlertMsg := "Does not have any prg in "+CurDir()+" folder. Use the recursive mode -r"
ENDIF
ALERT( cAlertMsg )
QUIT
ENDIF
// after oMake read, recreate other clean makefile to edit.
s_nMakeFileHandle := FCreate(cFile)
if s_nMakeFileHandle == F_ERROR
IF s_nLang == LANG_PT /* portuguese brazilian */
cAlertMsg := "<"+cFile + "> nÆo pode ser aberto para edi‡Æo."
ELSEIF s_nLang == LANG_ES /* spanish */
cAlertMsg := "<"+cFile + "> no pode ser abierto para edici¢n."
ELSE /* english */
cAlertMsg := "<"+cFile + "> cannot be openned for edition."
ENDIF
ALERT( cAlertMsg+" FERROR ("+hb_NToS(FError())+")" )
RETURN RET_ERR
endif
WriteMakeFileHeader()
s_lEditMake := .T.
ELSEIF nOption == 2 // create a new makefile
IF nLenaSrc == 0 .and. !s_lRecursive
IF s_nlang == LANG_PT /* portuguese brazilian */
cAlertMsg := "NÆo h  nenhum prg na pasta "+CurDir()+". Use o modo recursivo -r"
ELSEIF s_nLang == LANG_ES /* spanish */
cAlertMsg := "No hay ning£n prg en la carpeta "+CurDir()+". Use lo modo recursivo -r"
ELSE /* english */
cAlertMsg := "Does not have any prg in "+CurDir()+" folder. Use the recursive mode -r"
ENDIF
ALERT( cAlertMsg )
SetColor("W/N,N/W")
QUIT
ENDIF
s_lEditMake := .F.
s_nMakeFileHandle := FCreate( cFile )
if s_nMakeFileHandle == F_ERROR
IF s_nLang == LANG_PT /* portuguese brazilian */
cAlertMsg := "<"+cFile + "> nÆo pode ser criado."
ELSEIF s_nLang == LANG_ES /* spanish */
cAlertMsg := "<"+cFile + "> no pode ser criado."
ELSE /* english */
cAlertMsg := "<"+cFile + "> cannot be created."
ENDIF
ALERT( cAlertMsg+" FERROR ("+hb_NToS(FError())+")" )
RETURN RET_ERR
endif
WriteMakeFileHeader()
lNew := .T.
ELSE
SetColor("W/N,N/W")
QUIT
ENDIF
ELSE
s_nMakeFileHandle := FCreate( cFile )
if s_nMakeFileHandle == F_ERROR
IF s_nLang == LANG_PT /* portuguese brazilian */
cAlertMsg := "<"+cFile + "> nÆo pode ser criado."
ELSEIF s_nLang == LANG_ES /* spanish */
cAlertMsg := "<"+cFile + "> no pode ser criado."
ELSE /* english */
cAlertMsg := "<"+cFile + "> cannot be created."
ENDIF
ALERT( cAlertMsg+" FERROR ("+hb_NToS(FError())+")" )
RETURN RET_ERR
ENDIF
WriteMakeFileHeader()
nOption := 2 // create a new makefile
lNew := .T.
ENDIF
Setcolor( "w/b+,b+/w,w+/b,w/b+,w/b,w+/b" )
nMaxRow := MIN( 24, nMaxRow )
@ 0, 0, nMaxRow, Maxcol() BOX( Chr( 201 ) + Chr( 205 ) + Chr( 187 ) + Chr( 186 ) + Chr( 188 ) + Chr( 205 ) + Chr( 200 ) + Chr( 186 ) + Space( 1 ) )
Attention( HBMAKEID + space(10)+s_aLangMessages[ 27 ], 0 )
@ 01,01 SAY s_aLangMessages[ 28 ]
@ 01,17,06,24 GET cOS;
LISTBOX { "Windows", "OS/2", "Linux" };
MESSAGE s_aLangMessages[ 49 ];
STATE OsSpec(getlist,1,@cOS);
DROPDOWN
@ 01,30 SAY s_aLangMessages[ 29 ]
@ 01,54,06,59 GET cCompiler;
LISTBOX { "BCC", "MSVC", "POCC", "GCC","MINGW" };
MESSAGE s_aLangMessages[ 50 ];
STATE OsSpec(getlist,2,@cCompiler);
DROPDOWN
@ 02,47 SAY s_aLangMessages[ 66 ]
#ifdef __PLATFORM__WINDOWS
@ 02,68,06,77 GET s_cEditor;
LISTBOX { "edit", "notepad" };
MESSAGE s_aLangMessages[ 67 ];
STATE OsSpec(getlist,3,@s_cEditor);
DROPDOWN
#endif
@ 03,01 SAY s_aLangMessages[ 59 ];
GET cLibName;
PICT "@S15";
MESSAGE s_aLangMessages[ 58 ]
@ 03,35 SAY s_aLangMessages[ 60 ];
GET cObjDir;
PICT "@S15"
Attention( "Harbour Options", 5 )
@ 06,01 GET lAutoMemvar;
CHECKBOX;
CAPTION s_aLangMessages[ 32 ];
STYLE "[X ]"
@ 06,40 GET lVarIsMemvar;
CHECKBOX;
CAPTION s_aLangMessages[ 33 ];
STYLE "[X ]"
@ 07,01 GET lDebug;
CHECKBOX;
CAPTION s_aLangMessages[ 34 ];
STYLE "[X ]"
@ 07,40 GET lSupressLine;
CHECKBOX;
CAPTION s_aLangMessages[ 35 ];
STYLE "[X ]"
@ 08,01 GET s_lGenppo;
CHECKBOX;
CAPTION s_aLangMessages[ 36 ];
STYLE "[X ]"
@ 08,40 GET lCompMod;
CHECKBOX;
CAPTION s_aLangMessages[ 37 ];
STYLE "[X ]"
@ 09,01 SAY s_aLangMessages[ 38 ];
GET s_cUserDefine;
PICT "@S23"
@ 09,40 SAY s_aLangMessages[ 39 ];
GET s_cUserInclude;
PICT "@S18"
@ 10,01 GET lInstallLib;
CHECKBOX;
CAPTION s_aLangMessages[ 61 ];
STYLE "[X ]"
READ MSG AT MaxRow() - 1, 1, MaxCol() - 1
IF ! EMPTY( s_cUserDefine )
aUserDefs := ListasArray2(ALLTRIM( s_cUserDefine ), ";")
FOR EACH cCurrentDef in aUserDefs
cHarbourFlags += " -D" + ALLTRIM( cCurrentDef ) + " "
NEXT
ENDIF
IF ! EMPTY( s_cUserInclude )
cHarbourFlags += " -I" + ALLTRIM( s_cUserInclude ) + " "
ENDIF
s_lBcc := "BCC" $ cCompiler
s_lMSVcc := "MSVC" $ cCompiler
s_lGcc := "GCC" $ cCompiler
s_lPocc := "POCC" $ cCompiler
s_lMinGW := "MINGW" $ cCompiler
if s_lMinGW
s_lGcc := .T.
s_lBcc := s_lMSVcc := s_lPocc := .F.
endif
cObjDir := ALLTRIM( cObjDir )
IF ! EMPTY( cObjDir )
IF !hb_DirExists( cObjDir )
#ifdef HB_COMPAT_C53
MakeDir( cObjDir )
#endif
ENDIF
ENDIF
s_aMacros := GetSourceDirMacros( s_lGcc, cOS )
IF s_lGcc
cObjDir := ALLTRIM( cObjDir )
IF ! EMPTY( cObjDir )
cObjDir += "/"
ENDIF
cTest := cObjDir + "/"
ELSE
cObjDir := ALLTRIM( cObjDir )
IF ! EMPTY( cObjDir )
cObjDir += "\"
ENDIF
cTest := cObjDir + "\"
ENDIF
AEval( s_aMacros, { | x, y | cItem := SUBSTR( x[ 2 ], 1, Len( x[ 2 ] ) ), IIF( At( citem, cTest ) > 0, ( s_aMacros[ y, 1 ] := "OBJ", s_aMacros[ y, 2 ] := cObjDir ), ) } )
IF lAutoMemvar
cHarbourFlags += " -a "
ENDIF
IF lVarIsMemvar
cHarbourFlags += " -v "
ENDIF
IF lDebug
cHarbourFlags += " -b "
ENDIF
IF lSupressline
cHarbourFlags += " -l "
ENDIF
IF s_lGenppo
cHarbourFlags += " -p "
ENDIF
IF lCompmod
cHarbourFlags += " -m "
ENDIF
IF s_lBcc
AAdd( s_aCommands, { ".cpp.obj:", "$(CC_DIR)\bin\bcc32 $(CFLAG1) $(CFLAG2) -o$* $**" } )
AAdd( s_aCommands, { ".c.obj:", "$(CC_DIR)\bin\bcc32 -I$(HB_DIR)\include $(CFLAG1) $(CFLAG2) -o$* $**" } )
AAdd( s_aCommands, { ".prg.obj:", "$(HB_DIR)\bin\harbour -n -go" + iif(s_lGenCsource,"3","") + " -I$(HB_DIR)\include $(HARBOURFLAGS) -I$(FWH)\include -o$* $**" } )
AAdd( s_aCommands, { ".rc.res:", "$(CC_DIR)\bin\brcc32 $(RFLAGS) $<" } )
ELSEIF s_lGcc
IF "LINUX" $ Upper( Getenv( "HB_ARCHITECTURE" ) ) .OR. cOS == "Linux"
AAdd( s_aCommands, { ".cpp.o:", "gcc $(CFLAG1) $(CFLAG2) -o$* $**" } )
AAdd( s_aCommands, { ".c.o:", "gcc -I/usr/include/harbour $(CFLAG1) $(CFLAG2) -I. -o$* $**" } )
AAdd( s_aCommands, { ".prg.o:", "harbour -n $(HARBOURFLAGS) -I/usr/include/harbour -I. -go" + iif(s_lGenCsource,"3","") + " -o$* $**" } )
ELSE
AAdd( s_aCommands, { ".cpp.o:", "$(CC_DIR)\bin\gcc $(CFLAG1) $(CFLAG2) -o$* $**" } )
AAdd( s_aCommands, { ".c.o:", "$(CC_DIR)\bin\gcc -I$(HB_DIR)/include $(CFLAG1) $(CFLAG2) -I. -o$* $**" } )
AAdd( s_aCommands, { ".prg.o:", "$(HB_DIR)\bin\harbour -n -go" + iif(s_lGenCsource,"3","") + " -I$(HB_DIR)/include $(HARBOURFLAGS) -o$* $**" } )
ENDIF
ELSEIF s_lMSVcc
AAdd( s_aCommands, { ".cpp.obj:", "$(CC_DIR)\bin\cl $(CFLAG1) $(CFLAG2) -Fo$* $**" } )
AAdd( s_aCommands, { ".c.obj:", "$(CC_DIR)\bin\cl -I$(HB_DIR)\include $(CFLAG1) $(CFLAG2) -Fo$* $**" } )
AAdd( s_aCommands, { ".prg.obj:", "$(HB_DIR)\bin\harbour -go" + iif(s_lGenCsource,"3","") + " -n -I$(HB_DIR)\include $(HARBOURFLAGS) -I$(C4W)\include -o$* $**" } )
AAdd( s_aCommands, { ".rc.res:", "$(CC_DIR)\bin\rc $(RFLAGS) $<" } )
ELSEIF s_lPocc
AAdd( s_aCommands, { ".cpp.obj:", "$(CC_DIR)\bin\pocc $(CFLAG1) $(CFLAG2) -Fo$* $**" } )
AAdd( s_aCommands, { ".c.obj:", "$(CC_DIR)\bin\pocc -I$(HB_DIR)\include $(CFLAG1) $(CFLAG2) -Fo$* $**" } )
AAdd( s_aCommands, { ".prg.obj:", "$(HB_DIR)\bin\harbour -n -go" + iif(s_lGenCsource,"3","") + " -I$(HB_DIR)\include $(HARBOURFLAGS) -I$(FWH)\include -o$** $**" } )
AAdd( s_aCommands, { ".rc.res:", "$(CC_DIR)\bin\porc $(RFLAGS) $<" } )
ENDIF
if s_nlang == LANG_PT /* portuguese brazilian */
cAlertMsg := "Selecione os .prgs a compilar"
elseif s_nLang == LANG_ES /* spanish */
cAlertMsg := "Seleccione los .prg a compilar"
ELSE /* english */
cAlertMsg := "Select the .prg files to compile"
endif
aInFiles := GetSourceFiles( s_lRecursive, s_lGcc, cOS )
nLenaSrc := Len( aInFiles )
aOutFiles := aClone( aInFiles )
IF nOption !=2 // not create a makefile
PickArray( 10, 15, 19, 64, aInFiles, aOutFiles, ArrayAJoin( { oMake:aPrgs, oMake:aCs } ), .T., cAlertMsg )
ELSE
PickArray( 10, 15, 19, 64, aInFiles, aOutFiles, {}, .T., cAlertMsg )
ENDIF
AEval( aOutFiles, { | x, y | HB_SYMBOL_UNUSED( x ), aOutFiles[ y ] := Trim( SUBSTR( aOutFiles[ y ], 1, At( " ", aOutFiles[ y ] ) ) ) } )
AEval( aOutFiles, { | xItem | IIF( At( ".c", xItem ) > 0 .OR. At( ".C", xItem ) > 0 .OR. At( ".cpp", xItem ) > 0 .OR. At( ".CPP", xItem ) > 0, AAdd( aOutc, xitem ), ) } )
AEval( aOutc, { | x, z | citem := x, z := AScan( aOutFiles, { | t | t = citem } ), IIF( z > 0, aSize( aDel( aOutFiles, z ), Len( aOutFiles ) - 1 ), ) } )
aOutFiles := aSort( aOutFiles )
s_aPrgs := aClone( aOutFiles )
s_aObjs := aClone( aOutFiles )
AEval( s_aObjs, { | xItem, x | hb_FNAMESPLIT( xiTem, @cPath, @cTest, @cExt, @cDrive ), cext := SUBSTR( cExt, 2 ), IIF( ! s_lGcc, s_aObjs[ x ] := cObjDir + cTest + "." + Exte( cExt, 2 ), s_aObjs[ x ] := cObjDir + cTest + "." + Exte( cExt, 3 ) ) } )
s_aCFiles := aClone( aOutc )
s_aObjsC := aClone( aOutc )
AEval( aOutc, { | xItem, x | hb_FNAMESPLIT( xiTem, @cPath, @cTest, @cExt, @cDrive ), cext := SUBSTR( cExt, 2 ), IIF( ! s_lGcc, s_aObjsC[ x ] := cObjDir + cTest + "." + Exten( cExt, 2 ), s_aObjsC[ x ] := cObjDir + cTest + "." + Exten( cExt, 1 ) ) } )
FOR x := 1 TO Len( s_aMacros )
IF ! EMPTY( s_aMacros[ x, 2 ] )
cItem := s_aMacros[ x, 2 ]
nPos := AScan( s_aPrgs, { | z | hb_FNAMESPLIT( z, @cPath, @cTest, @cExt, @cDrive ), cPath == citem } )
IF nPos > 0
AEval( s_aPrgs, { | a, b | hb_FNAMESPLIT( a, @cPath, @cTest, @cExt, @cDrive ), IIF( cPath == citem, s_aPrgs[ b ] := STRTRAN( a, cPath, "$(" + s_aMacros[ x, 1 ] + IIF( s_lGcc, ")/", ")\" ) ), ) } )
IF ! s_aMacros[ x, 3 ]
FWrite( s_nMakeFileHandle, s_aMacros[ x, 1 ] + " = " + Left( s_aMacros[ x, 2 ], Len( s_aMacros[ x, 2 ] ) - 1 ) + " " + s_cEOL )
s_aMacros[ x, 3 ] := .T.
ENDIF
ENDIF
nPos := AScan( s_aCFiles, { | z | hb_FNAMESPLIT( z, @cPath, @cTest, @cExt, @cDrive ), cPath == citem } )
IF nPos > 0
AEval( s_aCFiles, { | a, b | hb_FNAMESPLIT( a, @cPath, @cTest, @cExt, @cDrive ), IIF( cPath == citem, s_aCFiles[ b ] := STRTRAN( a, cPath, "$(" + s_aMacros[ x, 1 ] + IIF( s_lGcc, ")/", ")\" ) ), ) } )
IF ! s_aMacros[ x, 3 ]
FWrite( s_nMakeFileHandle, s_aMacros[ x, 1 ] + " = " + Left( s_aMacros[ x, 2 ], Len( s_aMacros[ x, 2 ] ) - 1 ) + " " + s_cEOL )
s_aMacros[ x, 3 ] := .T.
ENDIF
ENDIF
nPos := AScan( s_aObjs, { | z | hb_FNAMESPLIT( z, @cPath, @cTest, @cExt, @cDrive ), cPath == citem } )
IF nPos > 0
IF ! EMPTY( cObjDir )
AEval( s_aObjs, { | a, b | hb_FNAMESPLIT( a, @cPath, @cTest, @cExt, @cDrive ), IIF( cPath == citem, s_aObjs[ b ] := STRTRAN( a, cPath, "$(" + s_aMacros[ x, 1 ] + IIF( s_lGcc, ")/", ")\" ) ), ) } )
FWrite( s_nMakeFileHandle, s_aMacros[ x, 1 ] + " = " + Left( s_aMacros[ x, 2 ], Len( s_aMacros[ x, 2 ] ) - 1 ) + " " + s_cEOL )
ENDIF
ENDIF
nPos := AScan( s_aObjsC, { | z | hb_FNAMESPLIT( z, @cPath, @cTest, @cExt, @cDrive ), cPath == citem } )
IF nPos > 0
IF ! EMPTY( cObjDir )
AEval( s_aObjsC, { | a, b | hb_FNAMESPLIT( a, @cPath, @cTest, @cExt, @cDrive ), IIF( cPath == citem, s_aObjsC[ b ] := STRTRAN( a, cPath, "$(" + s_aMacros[ x, 1 ] + IIF( s_lGcc, ")/", ")\" ) ), ) } )
ENDIF
ENDIF
ENDIF
NEXT
IF s_lGcc
FWrite( s_nMakeFileHandle, "PROJECT = " + IIF( lInstallLib, "$(HB_DIR)/lib/", "" ) + ALLTRIM( cLibName ) + ".a " + s_cEOL )
ELSE
FWrite( s_nMakeFileHandle, "PROJECT = " + IIF( lInstallLib, "$(HB_DIR)\lib\", "" ) + ALLTRIM( cLibName ) + ".lib $(PR)" + s_cEOL )
ENDIF
FWrite( s_nMakeFileHandle, "OBJFILES =" )
nWriteFiles := 0
IF Len( s_aObjs ) < 1
FWrite( s_nMakeFileHandle, + " $(OB) " + s_cEOL )
ELSE
AEval( s_aObjs, { | x, i | nWriteFiles ++, IIF( i <> Len( s_aObjs ), FWrite( s_nMakeFileHandle, " " + ALLTRIM( x ) + IIF( nWriteFiles % 10 == 0, " //" + s_cEOL, "" ) ), FWrite( s_nMakeFileHandle, " " + ALLTRIM( x ) + " $(OB) " + s_cEOL ) ) } )
ENDIF
FWrite( s_nMakeFileHandle, "PRGFILES =" )
nWriteFiles := 0
IF Len( s_aPrgs ) < 1
FWrite( s_nMakeFileHandle, + " $(PS)" + s_cEOL )
ELSE
AEval( s_aPrgs, { | x, i | nWriteFiles ++, IIF( i <> Len( s_aPrgs ), FWrite( s_nMakeFileHandle, " " + ALLTRIM( x ) + IIF( nWriteFiles % 10 == 0, " //" + s_cEOL, "" ) ), FWrite( s_nMakeFileHandle, " " + ALLTRIM( x ) + " $(PS) " + s_cEOL ) ) } )
ENDIF
nWriteFiles := 0
IF Len( s_aObjsC ) > 0
FWrite( s_nMakeFileHandle, "OBJCFILES =" )
IF Len( s_aObjsC ) < 1
FWrite( s_nMakeFileHandle, + " $(OBC) " + s_cEOL )
ELSE
AEval( s_aObjsC, { | x, i | nWriteFiles ++, IIF( i <> Len( s_aObjsC ), FWrite( s_nMakeFileHandle, " " + ALLTRIM( x ) + IIF( nWriteFiles % 10 == 0, " //" + s_cEOL, "" ) ), FWrite( s_nMakeFileHandle, " " + ALLTRIM( x ) + " $(OBC) " + s_cEOL ) ) } )
ENDIF
ENDIF
nWriteFiles := 0
IF Len( s_aCFiles ) > 0
FWrite( s_nMakeFileHandle, "CFILES =" )
IF Len( s_aCFiles ) < 1
FWrite( s_nMakeFileHandle, + " $(CF)" + s_cEOL )
ELSE
AEval( s_aCFiles, { | x, i | nWriteFiles ++, IIF( i <> Len( s_aCFiles ), FWrite( s_nMakeFileHandle, " " + ALLTRIM( x ) + IIF( nWriteFiles % 10 == 0, " //" + s_cEOL, "" ) ), FWrite( s_nMakeFileHandle, " " + ALLTRIM( x ) + " $(CF) " + s_cEOL ) ) } )
ENDIF
ENDIF
FWrite( s_nMakeFileHandle, ;
"RESFILES =" + s_cEOL +;
"RESDEPEN = $(RESFILES)" + s_cEOL +;
"DEFFILE = " + s_cEOL +;
"HARBOURFLAGS = " + cHarbourFlags + s_cEOL +;
"INSTALLLIB = " + IIF( lInstallLib, "YES","NO" ) + s_cEOL +;
"USERDEFINE = " + ALLTRIM(s_cUserDefine) + s_cEOL +;
"USERINCLUDE = " + ALLTRIM(s_cUserInclude) + s_cEOL +;
"EDITOR = " + s_cEditor + s_cEOL )
IF s_lBcc
FWrite( s_nMakeFileHandle, ;
"CFLAG1 = -OS $(SHELL) $(CFLAGS) -d -L$(HB_DIR)\lib;$(FWH)\lib -c" + s_cEOL +;
"CFLAG2 = -I$(HB_DIR)\include -I$(CC_DIR)\include -I" + ALLTRIM( s_cUserInclude ) + s_cEOL +;
"RFLAGS = " + s_cEOL +;
"LFLAGS = /P32 /0" + s_cEOL +;
"IFLAGS = " + s_cEOL +;
"LINKER = tlib $(LFLAGS) $(PROJECT)" + s_cEOL +;
" " + s_cEOL +;
"ALLOBJ = $(OBJFILES) $(OBJCFILES)" + s_cEOL +;
"ALLRES = $(RESDEPEN)" + s_cEOL +;
"ALLLIB = " + s_cEOL +;
".autodepend" + s_cEOL )
ELSEIF s_lMSVcc
FWrite( s_nMakeFileHandle, ;
"CFLAG1 = -I$(INCLUDE_DIR) -W3 -nologo $(HB_USER_CFLAGS) $(SHELL) $(CFLAGS)" + s_cEOL +;
"CFLAG2 = -c -I" + ALLTRIM( s_cUserInclude ) + s_cEOL +;
"RFLAGS = " + s_cEOL +;
"LFLAGS = " + s_cEOL +;
"IFLAGS = " + s_cEOL +;
"LINKER = lib $(PROJECT)" + s_cEOL +;
" " + s_cEOL +;
"ALLOBJ = $(OBJFILES) $(OBJCFILES) " + s_cEOL +;
"ALLRES = $(RESDEPEN)" + s_cEOL +;
"ALLLIB = " + s_cEOL )
ELSEIF s_lPocc
FWrite( s_nMakeFileHandle, ;
"CFLAG1 = " + s_cEOL +;
"CFLAG2 = " + s_cEOL +;
"RFLAGS = " + s_cEOL +;
"LFLAGS = " + s_cEOL +;
"IFLAGS = " + s_cEOL +;
"LINKER = polib " + s_cEOL +; // was LINKER = polib $(PROJECT)
" " + s_cEOL +;
"ALLOBJ = $(OBJFILES) $(OBJCFILES) " + s_cEOL +;
"ALLRES = $(RESDEPEN)" + s_cEOL +;
"ALLLIB = " + s_cEOL )
ELSEIF s_lGcc
FWrite( s_nMakeFileHandle, ;
"CFLAG1 = " + IIF( s_lLinux , "-I/usr/include/harbour", " -I$(HB_DIR)/include " ) + " $(SHELL) -c -Wall" + s_cEOL +;
"CFLAG2 = " + IIF( s_lLinux , "-L /usr/lib/harbour", " -L $(HB_DIR)/lib" ) + s_cEOL +;
"RFLAGS = " + s_cEOL +;
"LFLAGS = " + s_cEOL +;
"IFLAGS = " + s_cEOL )
FWrite( s_nMakeFileHandle, "LINKER = ar -M " + s_cEOL )
FWrite( s_nMakeFileHandle, ;
" " + s_cEOL +;
"ALLOBJ = $(OBJFILES) $(OBJCFILES) " + s_cEOL +;
"ALLRES = $(RESDEPEN) " + s_cEOL +;
"ALLLIB = $(HBLIBS) " + s_cEOL +;
".autodepend" + s_cEOL )
ENDIF
FWrite( s_nMakeFileHandle, ;
" " + s_cEOL +;
"#COMMANDS" + s_cEOL )
AEval( s_aCommands, { | xItem | FWrite( s_nMakeFileHandle, xitem[ 1 ] + s_cEOL ), FWrite( s_nMakeFileHandle, xitem[ 2 ] + s_cEOL ), FWrite( s_nMakeFileHandle, " " + s_cEOL ) } )
IF s_lBcc
FWrite( s_nMakeFileHandle, ;
"#BUILD" + s_cEOL +;
" " + s_cEOL +;
"$(PROJECT): $(CFILES) $(OBJFILES)" + s_cEOL +;
" $(CC_DIR)\bin\$(LINKER) @&&!" + s_cEOL +;
" $(ALLOBJ)" + s_cEOL +;
"!" + s_cEOL )
ELSEIF s_lMSVcc .OR. s_lPocc
FWrite( s_nMakeFileHandle, ;
"#BUILD" + s_cEOL +;
" " + s_cEOL +;
"$(PROJECT): $(CFILES) $(OBJFILES)" + s_cEOL +;
" $(CC_DIR)\bin\$(LINKER) @&&!" + s_cEOL +;
" $(PROJECT)" + s_cEOL +;
" $(ALLOBJ)" + s_cEOL +;
"!" + s_cEOL )
ELSEIF s_lGcc
FWrite( s_nMakeFileHandle, ;
"#BUILD" + s_cEOL +;
" " + s_cEOL +;
"$(PROJECT): $(CFILES) $(OBJFILES) " + s_cEOL )
IF "LINUX" $ Upper( Getenv( "HB_ARCHITECTURE" ) ) .OR. cOS == "Linux"
FWrite( s_nMakeFileHandle, " $(LINKER) @&&!" + s_cEOL )
ELSE
FWrite( s_nMakeFileHandle, " $(CC_DIR)\bin\$(LINKER) @&&!" + s_cEOL )
ENDIF
FWrite( s_nMakeFileHandle, ;
" $(PROJECT) " + s_cEOL +;
" $(ALLOBJ) " + s_cEOL +;
"!" + s_cEOL )
ENDIF
FClose( s_nMakeFileHandle )
s_nMakeFileHandle:= F_ERROR // Invalid handle now file is closed
IF !lCancelMake
IF s_nLang == LANG_PT .OR.; /* portuguese brazilian */
s_nLang == LANG_ES /* spanish */
cAlertMsg := "Compilar lib ? (S/N) "
ELSE /* english */
cAlertMsg := "Build lib ? (Y/N) "
ENDIF
@ 20,5 Say cAlertMsg Get cBuild PICT "!" Valid cBuild $ iif(s_nLang == LANG_EN,"YN","SN")
READ
ENDIF
/* Set Parameter for how to continue
* Cancell Make : -1
* Compile All : 1
*/
RESTSCREEN( ,,,, cOldScreen )
RETURN nBuildReturn := IIF( cBuild $ "SY", BLD_ALL, BLD_NONE )
*---------------------
FUNCTION SetBuildLib( nFHandle )
*---------------------
LOCAL cAlertMsg
LOCAL cRead as String
LOCAL nPos as Numeric
LOCAL aMacro as Array
LOCAL aTemp as Array
LOCAL nCount as Numeric
LOCAL aCurobjs as Array
LOCAL nObjPos as Numeric
LOCAL cLib
LOCAL xInfo
s_lEof:= (hb_FReadLine( nFHandle, @cRead, s_aEOL ) == HB_FEOF)
cRead := ALLTRIM( cRead )
s_nMakeFileHandle := FCreate( s_cLinkFile )
IF s_nMakeFileHandle == F_ERROR
s_lErrors := .T.
IF s_nLang == LANG_PT /* portuguese brazilian */
cAlertMsg := "<"+s_cLinkFile + "> nÆo pode ser criado."
ELSEIF s_nLang == LANG_ES /* spanish */
cAlertMsg := "<"+s_cLinkFile + "> no pode ser criado."
ELSE /* english */
cAlertMsg := "<"+s_cLinkFile + "> cannot be created."
ENDIF
ALERT( cAlertMsg+" FERROR ("+hb_NToS(FError())+")" )
RETURN RET_ERR
ENDIF
s_szProject := cRead
aMacro := ListAsArray2( cRead, ":" )
IF Len( aMacro ) > 1
aTemp := ListAsArray2( aMacro[ 2 ], " " )
AEval( aTemp, { | xItem | AAdd( s_aBuildOrder, xItem ) } )
ENDIF
AAdd( s_aBuildOrder, aMacro[ 1 ] )
cRead := STRTRAN( cRead, "@&&!", "" )
aMacro := ListAsArray2( cRead, "\" )
AEval( aMacro, { | xMacro | Findmacro( xMacro, @cRead ) } )
IF s_lBcc .OR. s_lMSVcc .OR. s_lPocc
s_cLinkCommands := cRead + " @" + s_cLinkFile
ELSE
s_cLinkCommands := cRead + " < " + s_cLinkFile
ENDIF
FOR nPos := 1 TO 7
s_lEof := (hb_FReadLine( nFHandle, @cRead, s_aEOL ) == HB_FEOF)
cRead := ALLTRIM( cRead )
aMacro := ListAsArray2( cRead, " " )
FOR nCount := 1 TO Len( aMacro )
IF "$" $ aMacro[ nCount ]
IF ( aMacro[ nCount ] = "$(PROJECT)" ) .AND. (s_lGcc .OR. s_lMSVcc .OR. s_lPocc)
FindMacro( aMacro[ nCount ], @cRead )
IF s_lGcc
FWrite( s_nMakeFileHandle, "CREATE lib" + cRead + s_cEOL )
cLib := "lib" + cRead
ELSE
cRead := STRTRAN(cRead,",","")
cRead := STRTRAN(cRead,"+","")
xInfo := iif(s_lMSVcc," -out:","/out:")
xInfo += cRead
cRead := xInfo
FWrite( s_nMakeFileHandle, cRead + s_cEOL )
ENDIF
ELSEIF ( aMacro[ nCount ] == "$(ALLOBJ)" )
Findmacro( aMacro[ nCount ], @cRead )
aCurObjs := ListAsArray2( cRead, " " )
FOR nObjPos := 1 TO Len( aCurObjs )
IF s_lGcc
FWrite( s_nMakeFileHandle, "ADDMOD " + aCurObjs[ nObjPos ] + s_cEOL )
ENDIF
IF s_lBcc .OR. s_lMSVcc .OR. s_lPocc
IF nObjPos < Len( aCurObjs )
FWrite( s_nMakeFileHandle, iif(s_lBcc,"+-","") + aCurObjs[ nObjPos ] + iif(s_lBcc," &","") + s_cEOL )
ELSE
FWrite( s_nMakeFileHandle, iif(s_lBcc,"+-","") + aCurObjs[ nObjPos ] + s_cEOL )
ENDIF
ENDIF
NEXT
ENDIF
ENDIF
NEXT
NEXT
IF s_lGcc
FWrite( s_nMakeFileHandle, "SAVE" + s_cEOL +;
"END " + s_cEOL )
ENDIF
FClose( s_nMakeFileHandle )
s_nMakeFileHandle:= F_ERROR // Makefile handle is closed
IF s_lLinux
s_cLinkCommands += " || rm -f " + cLib
ENDIF
RETURN RET_OK
*----------------------------
FUNCTION CheckIFfile( nFHandle, cFile )
*----------------------------
LOCAL cNextLine := ""
LOCAL cCommand := ""
LOCAL cTemp
LOCAL lErrors
cTemp := SUBSTR( cFile, At( " ", cFile ) + 1 )
IF File( cTemp )
s_lEof := (hb_FReadLine( nFHandle, @cNextLine, s_aEOL ) == HB_FEOF)
cNextLine := Trim( cNextLine )
IF "!" $ cNextLine
cCommand := SUBSTR( cNextLine, At( " ", cNextLine ) + 1 )
lErrors := IIF( hb_run( cCommand ) != 0, .T., .F. )
s_lErrors := IIF( lErrors, .T., s_lErrors )
ENDIF
RETURN .T.
ENDIF
RETURN .F.
*----------------------------
FUNCTION Checkstdout( cText )
*----------------------------
cText := STRTRAN( cText, "!stdout", "" )
OutStd( cText )
RETURN NIL
*---------------------------
FUNCTION CheckIFdef( nFHandle, cTemp )
*---------------------------
LOCAL nPos
LOCAL cRead := ""
LOCAL aSet := {}
LOCAL nMakePos
LOCAL nFilePos
IF cTemp == "!endif"
RETURN NIL
ENDIF
WHILE At( "!endif", cRead ) == 0
nFilePos:= FSEEK( nFHandle, 0, FS_RELATIVE )
s_lEof:= (hb_FReadLine( nFHandle, @cRead, s_aEOL ) == HB_FEOF)
cRead := Trim( cRead )
IF "!endif" $ cRead
FSEEK( nFHandle, nFilePos, FS_SET )
EXIT
ENDIF
cTemp := STRTRAN( cTemp, "!ifdef ", "" )
IF "=" $ cRead
IF "\.." $ cRead
cRead := SUBSTR( cRead, 1, At( "\..", cRead ) - 1 )
ELSEIF "/.." $ cRead
cRead := SUBSTR( cRead, 1, At( "/..", cRead ) - 1 )
ENDIF
aSet := ListAsArray2( cRead, "=" )
nPos := AScan( s_aDefines, { | x | x[ 1 ] == cTemp } )
IF nPos > 0
cRead := ALLTRIM( STRTRAN( aSet[ 1 ], "$(", "" ) )
cRead := STRTRAN( cRead, ")", "" )
nMakePos := AScan( s_aMacros, { | x | x[ 1 ] == cRead } )
IF nMakePos == 0
AAdd( s_aMacros, { aSet[ 1 ], aSet[ 2 ] } )
ENDIF
ELSE /* Locate For !ELSE */
WHILE At( "!endif", cRead ) == 0
s_lEof:= (hb_FReadLine( nFHandle, @cRead, s_aEOL ) == HB_FEOF)
cRead := Trim( cRead )
IF "!ELSE" $ cRead
WHILE At( "!endif", cRead ) == 0
nFilePos:= FSEEK( nFHandle, 0, FS_RELATIVE )
s_lEof:= (hb_FReadLine( nFHandle, @cRead, s_aEOL ) == HB_FEOF)
cRead := Trim( cRead )
IF "!endif" $ cRead
FSEEK( nFHandle, nFilePos, FS_SET )
EXIT
ENDIF
aSet := ListAsArray2( cRead, "=" )
AAdd( s_aMacros, { aSet[ 1 ], aSet[ 2 ] } )
ENDDO
ENDIF
ENDDO
ENDIF
ELSEIF "!stdout" $ cRead
Checkstdout( cRead )
ENDIF
ENDDO
RETURN NIL
*-------------------
FUNCTION GetGccDir()
*-------------------
LOCAL cPath AS STRING := ""
LOCAL cEnv AS STRING
LOCAL aEnv AS Array of string
LOCAL nPos as Numeric
IF s_lLinux
cPath := "."
ELSE
cEnv := Gete( "PATH" )
aEnv := ListAsArray2( cEnv, ";" )
FOR nPos := 1 TO Len( aEnv )
IF File( aEnv[ nPos ] + "\gcc.exe" )
cPath := aEnv[ nPos ]
cPath := Left( cPath, Rat( "\", cPath ) - 1 )
EXIT
ENDIF
NEXT
ENDIF
RETURN cPath
*-----------------------------
FUNCTION WriteMakeFileHeader()
*-----------------------------
/*
TODO:
FWrite( s_nMakeFileHandle, ;
"#" + s_cEOL +;
"# "+HBMAKEID + s_cEOL +;
"# "+COPYRIGHT + s_cEOL +;
"# "+Version() + s_cEOL +;
"# "+HB_Compiler() + s_cEOL +;
"# "+OS() + s_cEOL +;
"# Makefile created at: " + dtoc( date() ) + " - " + time() + s_cEOL +;
"#" + s_cEOL + s_cEOL )
*/
IF s_lMSVcc
FWrite( s_nMakeFileHandle, "#MSVC" + s_cEOL )
ELSEIF s_lPocc
FWrite( s_nMakeFileHandle, "#POCC" + s_cEOL )
ELSEIF s_lGcc
FWrite( s_nMakeFileHandle, "#GCC" + s_cEOL )
ELSE
FWrite( s_nMakeFileHandle, ;
"#BCC" + s_cEOL + ;
"VERSION=BCB.01" + s_cEOL )
ENDIF
FWrite( s_nMakeFileHandle, ;
"!ifndef CC_DIR" + s_cEOL +;
"CC_DIR = $(MAKE_DIR)" + s_cEOL +;
"!endif" + s_cEOL + s_cEOL +;
"!ifndef HB_DIR" + s_cEOL +;
"HB_DIR = $(HARBOUR_DIR)" + s_cEOL +;
"!endif" + s_cEOL + s_cEOL )
// FWrite( s_nMakeFileHandle, "RECURSE=" + IIF( s_lRecursive, " YES ", " NO " ) + s_cEOL )
// FWrite( s_nMakeFileHandle, " " + s_cEOL )
RETURN NIL
*-------------------------------
FUNCTION BuildLangArray( nLang )
*-------------------------------
LOCAL aLang := Array( 67 )
DEFAULT nLang TO LANG_EN
AFill( aLang, "" )
aLang[1] := HBMAKEID // Hbmake identification.
IF nLang == LANG_EN /* english */
aLang[ 2] := "Syntax: hbmake <cFile>.bc [options] - Example: hbmake hello.bc /ex"
aLang[ 3] := "Options: /e[x] Create a new Makefile. If /ex is used it create a"
aLang[ 4] := " new make file in extended mode."
aLang[ 5] := " /el[x] Create a new Makefile. If /elx is used it create a"
aLang[ 6] := " new make file to build a LIB in extended mode."
aLang[ 7] := " /D Define a macro."
aLang[ 8] := " /p Print all commands and depedencies."
aLang[ 9] := " /b Use Borland C/C++ as C compiler"
aLang[10] := " /g+ Use GNU C/C++ as C compiler"
aLang[11] := " /b+ Use Borland C/C++ as C compiler"
aLang[12] := " /g Use GNU C/C++ as C compiler"
aLang[13] := " /gl Use GNU C/C++ as C compiler in Linux"
aLang[14] := " /gl+ Use GNU C/C++ as C compiler in Linux"
aLang[15] := " /v Use MS-Visual C/C++ as C compiler"
aLang[16] := " /f Force recompiltion of all files"
aLang[17] := " /i Ignore errors returned by command"
aLang[18] := " /r /nr Activate recursive mode. /nr Deactivate recursive mode."
aLang[19] := " Note: /p and /D can be used together"
aLang[20] := " /r and /e[x]/el[x] can be used together"
aLang[21] := " Options with + are the default values"
aLang[22] := " -D switch can accept multiple macros on the same line"
aLang[23] := " or use one macro per -D switch"
aLang[24] := " /l[LANGID] Specify the language to be used on hbmake"
aLang[25] := " LANGID= (EN/PT/ES). On Windows, the default will be the S.O."
aLang[26] := " language. On OS/2, FreeBSD and LINUX will be English."
aLang[27] := "Environment options"
aLang[28] := "Select the OS"
aLang[29] := "Select the C Compiler"
aLang[30] := "Graph Lib"
aLang[31] := "Harbour Options"
aLang[32] := "Automatic memvar declaration /a"
aLang[33] := "Variables are assumed M-> /v"
aLang[34] := "Debug info /b"
aLang[35] := "Suppress line number information /l"
aLang[36] := "Generate pre-processed output /p"
aLang[37] := "compile module only /m"
aLang[38] := "User Defines "
aLang[39] := "User include Path"
aLang[40] := "Use contrib libs"
aLang[41] := "<Spacebar>-Select <Enter>-Continue process <F5> Sel/Unsel All"
aLang[42] := "Warning level /w"
aLang[43] := "Numbers of source files per line on makefile"
aLang[44] := "Use Multi Thread Library"
aLang[45] := "Executable file name"
aLang[46] := "Warning level /w"
aLang[47] := "<Tab>-Next <Sh-Tab>-Prev <Enter>-Sel <"+chr(24)+chr(25)+">-Change Sel <Spacebar>-Open Box"
/* Messages Start Here */
aLang[48] := "3rd Party RDD"
aLang[49] := "What OS you use"
aLang[50] := "What C compiler you have"
aLang[51] := "This app use Graphical libraries"
aLang[52] := "Do you use 3rd Party RDD"
aLang[53] := "Compress this app"
aLang[54] := "Compress the app after Linked (use upx ?)"
aLang[55] := "Your app will be linked to user harbour.dll"
aLang[56] := "Where the .obj/.o files will be generated"
aLang[57] := "Specify executable name (without .exe extension)"
/* More messages for LIB build */
aLang[58] := "Specify the lib name (without extension)"
/* More Harbour options for LIB build */
aLang[59] := "Lib name:"
aLang[60] := "Obj dir files:"
aLang[61] := "Install the lib at the Harbour lib folder"
aLang[62] := " /pc Use Pelles C/C++ as C compiler"
aLang[63] := " /m Use MinGW (GCC) as C compiler"
aLang[64] := "User Libs: "
aLang[65] := "Errorlog Editor:"
aLang[66] := "Inform the log error editor for your choice."
ELSEIF nLang == LANG_ES /* spanish */
aLang[ 2] := "Sintaxe: hbmake <cArchivo>.bc [opciones] - Exemplo: hbmake hello.bc /ex"
aLang[ 3] := "Opciones: /e[x] Crea un Makefile nuevo. Si se usa /ex se crea un nuevo"
aLang[ 4] := " makefile en modo extendido."
aLang[ 5] := " /el[x] Crea un Makefile nuevo. Si se usa /elx se crea un nuevo"
aLang[ 6] := " makefile para construir una LIB en modo extendido."
aLang[ 7] := " /D Define una macro."
aLang[ 8] := " /p Imprime todos los comandos y dependencias."
aLang[ 9] := " /b Usa Borland C/C++ como compilador C"
aLang[10] := " /g+ Usa GNU C/C++ como compilador C"
aLang[11] := " /b+ Usa Borland C/C++ como compilador C"
aLang[12] := " /g Usa GNU C/C++ como compilador C"
aLang[13] := " /gl Usa GNU C/C++ como compilador C en Linux"
aLang[14] := " /gl+ Usa GNU C/C++ como compilador C en Linux"
aLang[15] := " /v Usa MS-Visual C/C++ como compilador C"
aLang[16] := " /f Forza la recompilaci¢n de todos los archivos"
aLang[17] := " /i Ignora los errores devueltos por el comando"
aLang[18] := " /r /nr Activa modo recursivo. /nr Desactivar modo recursivo."
aLang[19] := " Nota: /p y /D pueden ser usados juntos"
aLang[20] := " /r y /e[x]/el[x] pueden ser usados juntos"
aLang[21] := " Las opciones con + son los valores por omisi¢n"
aLang[22] := " El parametro -D puede aceptar multiplas macros en la misma"
aLang[23] := " linea ou use una macro por parametro -D"
aLang[24] := " /l[LANGID] especifica una linguagem a ser utilizada por"
aLang[25] := " hbmake. LANGID = (EN/PT/ES). En sistemas Windows, Lo PADR¢n"
aLang[26] := " es la linguagem de SO. En OS/2, FreeBSD y LINUX ser n Ingls."
aLang[27] := "Opciones de Ambiente"
aLang[28] := "Seleccione SO"
aLang[29] := "Seleccione Compilador C"
aLang[30] := "Lib Grafica"
aLang[31] := "Opciones de lo Harbour"
aLang[32] := "Declaraci¢n automatica de memvar /a"
aLang[33] := "Variables ser n assumidas M-> /v "
aLang[34] := "Info. Debug /b"
aLang[35] := "Suprime info del n£mero de linea /l"
aLang[36] := "Gera salida pre-processada /p"
aLang[37] := "Compila solamente lo modulo /m"
aLang[38] := "Define del usuarios:"
aLang[39] := "Path includes del usuario:"
aLang[40] := "Usar libs externas"
aLang[41] := "<Espacio>-Seleccionar <Enter>-Continuar proceso <F5> Selec/Deselec todo."
aLang[42] := "Nivel del aviso de lo compilador /w"
aLang[43] := "Cuantos .prgs por linea no makefile:"
aLang[44] := "Usar la libreria Multi Thread"
aLang[45] := "Nombre del ejecutable"
aLang[46] := "Nivel de Avisos /w"
aLang[47] := "<Tab>-Avanzar <Sh-Tab>-Volver <Enter>-Selec <"+chr(24)+chr(25)+">-Mudar Selec <Espacio>-Caja"
/* Messages Start Here */
aLang[48] := "Rdd Terceros"
aLang[49] := "Cual OS usted usa"
aLang[50] := "Cual compilador C usted usa"
aLang[51] := "Esta App usa Lib Grafica o No"
aLang[52] := "Usted usa Rdd de terceros"
aLang[53] := "Comprimir app"
aLang[54] := "Prensar la App despus de enlazada (usar upx) ?"
aLang[55] := "Su aplicacion ser  ligada para usar la harbour.dll"
aLang[56] := "Donde los ficheros *.obj ser n generados"
aLang[57] := "Informe lo nombre de lo executable (sin la extension .exe)"
/* More messages for LIB build */
aLang[58] := "Informe lo nombre de la lib (sin la extension)"
/* More Harbour options for LIB build */
aLang[59] := "Nombre de la Lib:"
aLang[60] := "Direct¢rio de los Obj:"
aLang[61] := "Alojar la lib en el direct¢rio lib de Harbour"
aLang[62] := " /pc Usa Pelles C/C++ como compilador C"
aLang[63] := " /m Usa MinGW (GCC) como compilador C"
aLang[64] := "Libs del usuario: "
aLang[65] := "Editor de errorlog:"
aLang[66] := "Informe lo editor de log de errores de su preferencia."
ELSEIF nLang == LANG_PT /* brazilian portuguese */
aLang[ 2] := "Sintaxe: hbmake <arquivo>.bc [op‡äes] - Exemplo: hbmake hello.bc /ex"
aLang[ 3] := "Op‡äes: /e[x] Cria um Makefile novo. Se for usado /ex cria um makefile"
aLang[ 4] := " em modo extendido."
aLang[ 5] := " /el[x] Cria um Makefile novo. Se for usado /elx cria um makefile"
aLang[ 6] := " para construir uma LIB, em modo extendido."
aLang[ 7] := " /D Define uma macro."
aLang[ 8] := " /p Imprime todos os comandos e dependˆncias."
aLang[ 9] := " /b Usa Borland C/C++ como compilador C"
aLang[10] := " /g+ Usa GNU C/C++ como compilador C"
aLang[11] := " /b+ Usa Borland C/C++ como compilador C"
aLang[12] := " /g Usa GNU C/C++ como compilador C"
aLang[13] := " /gl Usa GNU C/C++ como compilador C no Linux"
aLang[14] := " /gl+ Usa GNU C/C++ como compilador C no Linux"
aLang[15] := " /v Usa MS-Visual C/C++ como compilador C"
aLang[16] := " /f For‡a a recompila‡Æo de todos os arquivos."
aLang[17] := " /i Ignora os erros devolvidos pelo comando."
aLang[18] := " /r /nr Ativa modo recursivo. /nr Desativar modo recursivo."
aLang[19] := " Nota: /p e /D podem ser usados juntos"
aLang[20] := " /r e /e[x]/el[x] podem ser usados juntos"
aLang[21] := " As op‡äes com + sÆo os valores PADRÆo."
aLang[22] := " O parƒmetro -D pode aceitar m£ltiplas macros na mesma linha"
aLang[23] := " ou use uma macro por parƒmetro -D"
aLang[24] := " /l[LANGID] especifica a linguagem a ser utilizada pelo hbmake,"
aLang[25] := " LANGID = (EN/PT/ES). Em Windows, o PADRÆo ser  a linguagem"
aLang[26] := " definida no S.O. Em OS/2, FreeBSD e LINUX o PADRÆo ser  Inglˆs."
aLang[27] := "Op‡äes de Ambiente"
aLang[28] := "Selecione o SO"
aLang[29] := "Selecione Compilador C"
aLang[30] := "Lib Gr f."
aLang[31] := "Op‡äes do Harbour"
aLang[32] := "Declara‡Æo Autom tica de Memvar /a"
aLang[33] := "Vari veis sÆo assumidas M-> /v"
aLang[34] := "Info. Debug /b"
aLang[35] := "Suprime info de n£mero da linha /l"
aLang[36] := "Gera sa¡da pr-processada /p"
aLang[37] := "Compila apenas o m¢dulo /m"
aLang[38] := "User Defines:"
aLang[39] := "User Include Path:"
aLang[40] := "Usa Libs Externas ?"
aLang[41] := "<Espa‡o>-Seleciona <Enter> p/ continuar processo <F5>-Sel/DeSel. tudo."
aLang[42] := "N¡vel de aviso do compilador /w"
aLang[43] := "Qtd de .prgs por linha, no makefile: "
aLang[44] := "Usar a biblioteca Multi Thread ?"
aLang[45] := "Nome Execut vel:"
aLang[46] := "N¡vel de Warnings /w"
aLang[47] := "<Tab>-Avan‡a <Sh-Tab>-Volta <Enter>-Sel. <"+chr(24)+chr(25)+">-Muda Sel. <Espc>-Abre Box"
/* Messages Start Here */
aLang[48] := "Rdd Terceiros"
aLang[49] := "Selecione o Sistema Operacional"
aLang[50] := "Selecione o compilador C/C++"
aLang[51] := "Esta aplica‡Æo vai usar Lib Grafica ? Qual ?"
aLang[52] := "Esta aplica‡Æo vai usar Rdd de terceiros ? Qual ?"
aLang[53] := "Comprimir App ?"
aLang[54] := "Comprimir a aplica‡Æo ap¢s linkada (usar upx) ?"
aLang[55] := "Sua aplica‡Æo ser  linkada para usar a harbour.dll ?"
aLang[56] := "Informe a pasta onde os arquivos *.obj serÆo gerados"
aLang[57] := "Informe o nome do execut vel (sem a extensÆo .exe)"
/* More messages for LIB build */
aLang[58] := "Informe o nome da lib (sem a extensÆo)"
/* More Harbour options for LIB build */
aLang[59] := "Nome da Lib:"
aLang[60] := "Diret¢rio dos Obj:"
aLang[61] := "Instalar a lib no diret¢rio lib do Harbour"
aLang[62] := " /pc Usa Pelles C/C++ como compilador C"
aLang[63] := " /m Usa MinGW (GCC) como compilador C"
aLang[64] := "Libs de usu rio: "
aLang[65] := "Editor de errorlog:"
aLang[66] := "Informe o editor de log de erros de sua preferˆncia."
ENDIF
RETURN aLang
*------------------------------------------
FUNCTION GetSelFiles( aInFiles, aOutFiles )
*------------------------------------------
LOCAL aRet := {}
LOCAL cItem
LOCAL nPos
FOR EACH cItem IN aInFiles
nPos := AScan( aOutFiles, { | x | x == Left( cItem, At( " ", citem ) - 1 ) } )
IF nPos > 0
AAdd( aRet, cItem )
ENDIF
NEXT
RETURN aRet
*----------------------------------
FUNCTION OsSpec(GetList,nPos,cSpec)
*----------------------------------
LOCAL oGet := GetList[nPos]
LOCAL oControl
oControl := oGet:Control
IF oControl != NIL
cSpec := oControl:GetData( oControl:Value )
// keyboard chr( K_TAB )
ENDIF
RETURN .T.
*--------------------------
FUNCTION CheckCompiler(cOS)
*--------------------------
RETURN ("Windows" $ cOS) .or. ("Linux" $ cOS)
*------------------------------
FUNCTION SetThisLibs(aTempLibs)
*------------------------------
LOCAL c := ""
LOCAL n
for Each n In aTempLibs
c += "-l"
c += STRTRAN( n, ".a", "" )
c+= " "
next
RETURN c
*------------------
FUNCTION ShowHelp( cMsg )
*------------------
LOCAL cCmdLine := ""
LOCAL nCmdArgs := 0
/* Create Command Line Args */
WHILE ! EMPTY( hb_argv( ++nCmdArgs ) )
cCmdLine += hb_argv( nCmdArgs ) + " "
ENDDO
/* Changed from OutStd to OutErr so the Help Message can't be redirected */
/* NOTE: Please don't modify the formatting or layout. We have a common
header/help layout for all Harbour command-line tools, and
- in case an update - they need to be modified together. Thank you.
[vszakats] */
OutErr( ;
s_cEOL +;
"Syntax: hbmake <makefile> [options]" + s_cEOL +;
s_cEOL +;
"Options: -bc Use BCC for the C compiler. (Default Windows)" + s_cEOL +;
" -gc Use GCC for the C compiler. (Default non-Windows)" + s_cEOL +;
" -vc Use MSVC for the C compiler" + s_cEOL +;
" -pc Use Pelles for the C compiler" + s_cEOL +;
" -e Editor mode" + s_cEOL +;
" -el Editor mode for libraries" + s_cEOL +;
" -f Force all files to be rebuilt" + s_cEOL +;
" -h This help screen" + s_cEOL +;
" -i Ignore errors returned by commands" + s_cEOL +;
" -r Recurse directories for source code" + s_cEOL +;
" -s Show the commands and defines created" + s_cEOL +;
" Need to redirect the output to a file." + s_cEOL )
IF ! EMPTY( cCmdLine ) .OR. ! EMPTY( cMsg )
OutErr( s_cEOL )
ENDIF
IF ! EMPTY( cCmdLine )
OutErr( "Entered: " + cCmdLine + s_cEOL )
ENDIF
IF ! EMPTY( cMsg )
OutErr( "Message: " + cMsg + s_cEOL )
ENDIF
RETURN NIL
*-------------------
FUNCTION hbMakeID()
*-------------------
RETURN "Harbour Make"
*--------------------------
FUNCTION hbMakeCopyright()
*--------------------------
RETURN "Copyright (c) 2000-2009, http://www.harbour-project.org/"
*-------------------------------------------------------------------
* Former tmake.prg
*-------------------------------------------------------------------
CLASS THBMAKE
EXPORTED:
DATA aDefines INIT {}
DATA aBuildOrder INIT {}
DATA aCommands INIT {}
DATA aMacros INIT {}
DATA aPrgs INIT {}
DATA aExtLibs INIT {}
DATA aCs INIT {}
DATA aObjs INIT {}
DATA aObjsc INIT {}
DATA aRes INIT {}
DATA nLinkHandle
DATA cLinkcomm INIT ""
DATA lCompress INIT .F.
DATA lForce INIT .F.
DATA lLinux INIT .F.
DATA szProject INIT ""
DATA lLibrary INIT .F.
DATA lInstallLib INIT .F.
DATA lIgnoreErrors INIT .F.
DATA lExtended INIT .T.
DATA lOs2 INIT .F.
DATA lRecurse INIT .F.
DATA lEditMode INIT .F.
DATA aDir
DATA aLangMessages INIT {}
DATA cDefLang
DATA lFwh INIT .F.
DATA lxFwh INIT .F.
DATA lCw INIT .F.
DATA lMini INIT .F.
DATA lHwgui INIT .F.
DATA lGui INIT .F.
DATA lGtwvt INIT .F.
DATA lGtwvw INIT .F.
DATA lMWvW INIT .F.
DATA lXWT INIT .F.
DATA lxHGtk INIT .F.
DATA lWhoo INIT .F.
DATA lHBWhat INIT .F.
DATA lRddAds INIT .F.
DATA lMediator INIT .F.
DATA cMakefile INIT ""
DATA lContribLib INIT .F.
DATA cObj INIT ""
DATA cUserdef INIT ""
DATA cUserInclude INIT ""
DATA cUserLib INIT ""
DATA lGenppo INIT .F.
DATA lCompMod INIT .F.
DATA lAutomemvar INIT .F.
DATA lvarismemvar INIT .F.
DATA ldebug INIT .F.
DATA lSupressline INIT .F.
DATA StartPath INIT ""
DATA cFmc INIT ""
DATA cMedpath INIT ""
DATA cAppLibName INIT ""
DATA cOs INIT ""
DATA cTopfile INIT ""
DATA aOut INIT {}
DATA cFilesToAdd INIT 5
DATA lMT INIT .F.
DATA cWarningLevel INIT 0
DATA cTopModule INIT ""
DATA cRes INIT ""
DATA cMacro INIT ""
DATA lGenCsource INIT .F. // Ath added 31-05-2006
DATA cShell INIT ""
DATA cEditor INIT ""
METHOD New()
METHOD ReadMakefile(cFile)
METHOD ReplaceMacros( cMacros )
METHOD FindMacro( cMacro, cRead )
ENDCLASS
METHOD New() CLASS THbMake
::cObj := "obj" + Space( 40 )
::cUserdef := Space( 200 )
::cUserInclude := Space( 200 )
::cUserLib := Space( 200 )
::cFMC := Space( 200 )
::cAppLibName := Space( 20 )
::cTopModule := Space( 20 )
::cEditor := ""
RETURN Self
METHOD ReadMakefile(cFile) CLASS THbMake
LOCAL cBuffer := ""
LOCAL cMacro := ::cMacro
LOCAL cDep := "#DEPENDS"
LOCAL cOpt := "#OPTS"
LOCAL cCom := "#COMMANDS"
LOCAL cBuild := "#BUILD"
LOCAL cTemp := ""
LOCAL cTemp1 := ""
LOCAL aTemp := {}
LOCAL lMacrosec := .F.
LOCAL lBuildSec := .F.
LOCAL lComSec := .F.
LOCAL aTemp1 := {}
LOCAL cCfg := ""
LOCAL aTempCFiles := {}
LOCAL nHandle
LOCAL cObjitem
LOCAL cRes := ""
LOCAL cItem
LOCAL lLinux := At( "LINUX", Upper( Os() ) ) > 0
LOCAL lExtended := .T., szProject
LOCAL lPrgObjRule := .F.
LOCAL lEof
nHandle := FOpen( cFile )
IF nHandle < 0
RETURN self
ENDIF
lEof := hb_FReadLine( nHandle, @cBuffer, s_aEOL ) == HB_FEOF
cBuffer := Trim( cBuffer )
::lLibrary :=.F.
WHILE !lEof
IF At( cMacro, cBuffer ) > 0
lMacroSec := .T.
lBuildSec := .F.
lComSec := .F.
ELSEIF At( cBuild, cBuffer ) > 0
lMacroSec := .F.
lBuildSec := .T.
lComSec := .F.
ELSEIF At( cCom, cBuffer ) > 0
lBuildSec := .F.
lComSec := .T.
lMacroSec := .F.
ELSE
? "Invalid Make File"
Fclose( nHandle )
RETURN Nil
ENDIF
lEof := hb_FReadLine( nHandle, @cTemp, s_aEOL ) == HB_FEOF
cTemp := Trim( cTemp )
IF At( "//", ctemp ) > 0
WHILE At( "//", ctemp ) > 0
ctemp := STRTRAN( ctemp, " //", "" )
lEof := hb_FReadLine( nHandle, @cTemp1, s_aEOL ) == HB_FEOF
cTemp += Trim( cTemp1 )
ENDDO
ctemp := STRTRAN( ctemp, " //", "" )
ENDIF
aTemp := ListasArray2( ALLTRIM( cTemp ), "=" )
IF lmacrosec
IF ALLTRIM( Left( ctemp, 7 ) ) <> "!ifndef" .and. ALLTRIM( Left( ctemp, 6 ) ) <> "!endif" .and. ALLTRIM( Left( ctemp, 7 ) ) <> "!iffile" .and. ALLTRIM( Left( ctemp, 7 ) ) <> "!stdout" .and. ALLTRIM( Left( ctemp, 6 ) ) <> "!ifdef"
IF Len( aTemp ) > 1
IF At( "$", aTemp[ 2 ] ) > 0
Aadd( ::aMacros, { aTemp[ 1 ], ::replacemacros( aTemp[ 2 ] ) } )
ELSE
Aadd( ::aMacros, { aTemp[ 1 ], aTemp[ 2 ] } )
// tracelog(aTemp[ 1 ], aTemp[ 2 ])
ENDIF
ENDIF
IF aTemp[ 1 ] == "PROJECT"
::cAppLibName := aTemp[ 2 ]
::cAppLibName := STRTRAN(::cAppLibName ,"$(PR)","")
::cAppLibName := STRTRAN(::cAppLibName ,".exe","")
::cAppLibName := STRTRAN(::cAppLibName ,".lib","")
ENDIF
IF aTemp[ 1 ] == "HBLIBS"
::lRddAds := "rddads" $ aTemp[ 2 ]
ENDIF
IF aTemp[ 1 ] == "C4W"
::cFMC := aTemp[2]
::lCw := .T.
endif
IF aTemp[ 1 ] == "FWH"
::cFMC := aTemp[2]
::lFwh := .T.
endif
IF aTemp[ 1 ] == "MINIGUI"
::cFMC := aTemp[2]
::lmini := .T.
endif
IF aTemp[ 1 ] == "HWGUI"
::cFMC := aTemp[2]
::lHwGui := .T.
endif
IF aTemp[ 1 ] == "GTWVT"
::cFMC := ""
::lGtwvt := .T.
endif
IF aTemp[ 1 ] == "GTWVW"
::cFMC := ""
::lGtwvw := .T.
endif
IF aTemp[ 1 ] == "MWVW"
::cFMC := ""
::lGtwvw := .T.
::lMWvW := .T.
endif
IF aTemp[ 1 ] == "XWT"
::cFMC := ""
::lXWT := .T.
endif
IF aTemp[ 1 ] == "WHOO"
::cFMC := aTemp[2]
::lWhoo := .T.
endif
IF aTemp[ 1 ] == "HBWHAT"
::cFMC := aTemp[2]
::lHBWhat := .T.
endif
IF aTemp[ 1 ] == "XHGTK"
::cFMC := aTemp[2]
::lxHGtk := .T.
endif
IF aTemp[ 1 ] == "MEDIATOR"
::cMedpath := aTemp[2]
::lmEDIATOR := .T.
endif
IF aTemp[ 1 ] == "COMPRESS"
::lCompress := "YES" $ aTemp[ 2 ]
endif
IF aTemp[ 1 ] == "SHELL"
::cShell := aTemp[ 2 ]
endif
IF aTemp[ 1 ] == "CONTRIBS"
::lContribLib := "YES" $ aTemp[ 2 ]
endif
IF aTemp[ 1 ] == "XFWH"
::lxFwh := "YES" $ aTemp[ 2 ]
endif
IF aTemp[ 1 ] == "FILESTOADD"
::cFilesToAdd := Val( aTemp[ 2 ] )
endif
IF aTemp[ 1 ] == "MT"
::lMt := "YES" $ aTemp[ 2 ]
endif
IF aTemp[ 1 ] == "GUI"
::lGUI := "YES" $ aTemp[ 2 ]
endif
IF aTemp[ 1 ] == "WARNINGLEVEL"
::cWarningLevel := Val( aTemp[ 2 ] )
endif
IF aTemp[ 1 ] == "OBJFILES"
cObjitem := Left( atemp[ 2 ], at(")",atemp[ 2 ]))
::cObj := ::replacemacros( cObjItem )
::aObjs := Listasarray2( ::replacemacros( atemp[ 2 ] ), " " )
ENDIF
IF aTemp[ 1 ] == "OBJCFILES"
aTemp1 := Listasarray2( ::replacemacros( atemp[ 2 ] ), " " )
IF Len( atemp1 ) == 1
IF !EMPTY( atemp[ 1 ] )
::aObjsC := Listasarray2( ::replacemacros( atemp[ 2 ] ), " " )
ENDIF
ELSE
::aObjsC := Listasarray2( ::replacemacros( atemp[ 2 ] ), " " )
ENDIF
ENDIF
IF aTemp[ 1 ] == "PRGFILES"
::aPrgs := Listasarray2( ::replacemacros( atemp[ 2 ] ), " " )
lExtended := .T.
ENDIF
IF aTemp[ 1 ] == "PRGFILE"
::aPrgs := Listasarray2( ::replacemacros( atemp[ 2 ] ), " " )
ENDIF
IF atemp[ 1 ] == "CFILES"
IF lExtended
aTempCFiles := Listasarray2( ::replacemacros( atemp[ 2 ] ), " " )
IF ( Len( aTempCFiles ) == 1 )
IF !EMPTY( aTempCFiles[ 1 ] )
::aCs := Listasarray2( ::replacemacros( atemp[ 2 ] ), " " )
ENDIF
ELSE
::aCs := Listasarray2( ::replacemacros( atemp[ 2 ] ), " " )
ENDIF
ELSE
::aCs := Listasarray2( ::replacemacros( atemp[ 2 ] ), " " )
ENDIF
ENDIF
IF aTemp[ 1 ] == "CONTRIBLIB"
::aExtLibs := Listasarray2( ::replacemacros( atemp[ 2 ] ), " " )
ENDIF
IF atemp[ 1 ] == "RESFILES"
::aRes := Listasarray2( ::replacemacros( atemp[ 2 ] ), " " )
FOR EACH cItem in :: aRes
::cRes += cItem +" "
NEXT
ENDIF
IF aTemp[ 1 ] == "RECURSE"
::lRecurse := AT( "YES" , aTemp[ 2 ] ) > 0
ENDIF
IF aTemp[ 1 ] == "LIBRARY"
::lLibrary := AT( "YES", aTemp[ 2 ] ) > 0
ENDIF
IF aTemp[ 1 ] == "INSTALLLIB"
::lInstallLib := AT( "YES", aTemp[ 2 ] ) > 0
ENDIF
IF aTemp[ 1 ] == "HARBOURFLAGS"
::lGenppo := AT( "-p" , aTemp[ 2 ] ) > 0
::lCompMod := AT( "-m" , aTemp[ 2 ] ) > 0
::lAutomemvar := AT( "-a" , aTemp[ 2 ] ) > 0
::lvarismemvar := AT( "-v" , aTemp[ 2 ] ) > 0
::ldebug := AT( "-b" , aTemp[ 2 ] ) > 0
::lSupressline := AT( "-l" , aTemp[ 2 ] ) > 0
aTemp[ 2 ] := STRTRAN(aTemp[ 2 ],"-p","")
aTemp[ 2 ] := STRTRAN(aTemp[ 2 ],"-m","")
aTemp[ 2 ] := STRTRAN(aTemp[ 2 ],"-a","")
aTemp[ 2 ] := STRTRAN(aTemp[ 2 ],"-v","")
aTemp[ 2 ] := STRTRAN(aTemp[ 2 ],"-b","")
aTemp[ 2 ] := STRTRAN(aTemp[ 2 ],"-l","")
aTemp[ 2 ] := ALLTRIM( aTemp[ 2 ] )
endif
IF aTemp[ 1 ] == "USERDEFINE"
::cUserDef := aTemp[ 2 ]
endif
IF aTemp[ 1 ] == "USERINCLUDE"
::cUserInclude := aTemp[ 2 ]
endif
IF aTemp[ 1 ] == "USERLIBS"
::cUserLib := aTemp[ 2 ]
endif
IF aTemp[ 1 ] == "TOPMODULE"
::cTopModule := aTemp[ 2 ]
endif
IF aTemp[ 1 ] == "EDITOR"
::cEditor := aTemp[ 2 ]
endif
ENDIF
ENDIF
IF lbuildSec
szProject := cTemp
::aBuildOrder := Listasarray2( cTemp, ":" )
ENDIF
IF lComSec // Ath added 31-05-2006
IF lPrgObjRule
::lGenCsource := "-go3" $ LOWER(cTemp)
lPrgObjRule := .F.
ENDIF
IF aTemp[ 1 ] == ".prg.obj:" .OR. aTemp[ 1 ] == ".prg.o:"
lPrgObjRule := .T.
ENDIF
ENDIF // end Ath added 31-05-2006
IF cTemp == "#BUILD" .OR. cTemp == "#COMMANDS"
cBuffer := cTemp
ENDIF
ENDDO
FClose( nHandle )
RETURN self
METHOD ReplaceMacros( cMacros ) CLass THBMAKE
LOCAL nCount := 0
LOCAL aTempMacros := {}
LOCAL aLocalMacros := {}
aTempMacros := Listasarray2( cMacros, " " )
AEval( aTempMacros, { | xMacro | iif( At( "$", xMacro ) > 0, ;
iif( At( ";", xMacro ) > 0, ( aLocalMacros := Listasarray2( xMacro, ";" ), ;
Aeval( aLocalMacros, { | x | ::FindMacro( x, @cMacros ) } ) ), ;
::FindMacro( xMacro, @cMacros ) ), ) } )
RETURN cMacros
METHOD FindMacro( cMacro, cRead ) CLASS THBMAKE
LOCAL nPos
LOCAL cTemp
LOCAL aLocalMacros := {}
cMacro := Left( cMacro, At( ")", cMacro ) )
IF At( "-", cMacro ) > 0
cMacro := SUBSTR( cMacro, 3 )
ENDIF
IF At( ";", cMacro ) > 0
cMacro := SUBSTR( cMacro, At( ";", cMacro ) + 1 )
ENDIF
nPos := Ascan( ::aMacros, { | x | "$(" + ALLTRIM( x[ 1 ] ) + ")" == cMacro } )
IF nPos == 0
cTemp := STRTRAN( cMacro, "$(", "" )
cTemp := STRTRAN( cTemp, ")", "" )
IF !EMPTY( cTemp )
cRead := ALLTRIM( STRTRAN( cRead, cMacro, Gete( cTemp ) ) )
ENDIF
ELSE
cRead := ALLTRIM( STRTRAN( cRead, cMacro, ::aMacros[ nPos, 2 ] ) )
ENDIF
RETURN cRead
*-------------------------------------------------------------------
* Former pickarry.prg
*-------------------------------------------------------------------
*-------------------------------------------------------------------
FUNCTION PickArray( T, L, B, R, InArray, OutArray, aDefault, lAllowAll, cTitle, lLib )
*-------------------------------------------------------------------
LOCAL aNewArray := {}
LOCAL aTemp
LOCAL cItem
LOCAL cMarkChar := "*"
LOCAL cOldColor := Setcolor( "gr+/rb,b+/w,w+/b,w/b+,w/b,w+/b" )
LOCAL cOldScreen := SAVESCREEN()
LOCAL lAdd := .F.
LOCAL lIsChecked := .F.
LOCAL nChoice := 1
LOCAL nLenArray := Len( InArray )
LOCAL nOffset // Calculate an offset to L to center on screen
LOCAL nOnItem := 0
LOCAL nPadLen := ( R - 1 ) - ( L + 1 )
LOCAL x
LOCAL nMaxWidth := MAX( R - L + 3, LEN( s_aLangMessages[ 41 ] ) + 2 )
DEFAULT cTitle TO ""
DEFAULT lAllowAll TO .F.
DEFAULT lLib TO .F.
nOffSet := INT( ( MAXCOL() - ( R - L ) ) / 2 )
R := nOffSet + ( R - L ) // Right 1st order is important
L := nOffSet
B := MIN( MAXROW() - 1, T + nLenArray )
x := INT( ( MAXCOL() - nMaxWidth )/2 )
@ T - 2, x - 1 CLEAR TO B + 1, x + nMaxWidth
@ T - 1, L - 1 TO B, R + 1 double
@ T - 2, L SAY cTitle
Attention( s_aLangMessages[ 41 ], B + 1 )
FOR x := 1 TO nLenArray
InArray[ X ] := PADR( " " + InArray[ X ], nPadLen )
OutArray[ X ] := " " + OutArray[ X ]
NEXT
IF LEN( aDefault ) > 0
FOR EACH cItem IN aDefault
IF !lLib
x := AScan( InArray, { | a | SUBSTR( a, 4, At(" ", ALLTRIM(a) ) - 1 ) == cItem } )
ELSE
x := AScan( InArray, { | a | ALLTRIM(cItem) $ a } )
ENDIF
IF x != 0
InArray[ x ] := Stuff( InArray[ x ] , 2, 1, IIF( lIsChecked, " ", cMarkChar ) )
OutArray[ x ] := Stuff( OutArray[ x ], 1, 1, IIF( lIsChecked, " ", cMarkChar ) )
nOnItem++
ELSE
cItem := SUBSTR( cItem, Rat( "\", cItem ) - 1 )
IF ! lLib
x := AScan( aTemp, { | a | SUBSTR( a, 4, At( " ", a ) - 1 ) == cItem } )
ELSE
x := AScan( InArray, { | a | ALLTRIM(cItem) $ a } )
ENDIF
IF x != 0
InArray[ x ] := Stuff( InArray[ x ] , 2, 1, IIF( lIsChecked, " ", cMarkChar ) )
OutArray[ x ] := Stuff( OutArray[ x ], 1, 1, IIF( lIsChecked, " ", cMarkChar ) )
nOnItem++
ENDIF
ENDIF
NEXT
ENDIF
Clear TypeAhead
B-- // aChoice bottom 1-less for border
WHILE nChoice != 0
nChoice := ACHOICE( T, L, B, R, InArray,, {|mode| PickArray_keys( mode, @nOnItem, @lAdd ) }, nChoice, 1 )
IF nChoice > 0
IF lAllowAll
IF lAdd // only if F5 was pressed
/* If any are checked, Turn all off
* Else turn all on
*/
FOR nChoice := 1 TO nLenArray
lIsChecked := IIF( SUBSTR( InArray[ nChoice ], 2, 1 ) == cMarkChar, .T., lIsChecked )
NEXT nChoice
IF lIsChecked
FOR nChoice := 1 TO nLenArray
InArray[ nChoice ] := STUFF( InArray[ nChoice ] , 2, 1, " " )
OutArray[ nChoice ] := STUFF( Outarray[ nChoice ], 1, 1, " " )
NEXT nChoice
lIsChecked := .F.
ELSE
FOR nChoice := 1 TO nLenArray
InArray[ nChoice ] := STUFF( InArray[ nChoice ] , 2, 1, cMarkChar )
OutArray[ nChoice ] := STUFF( Outarray[ nChoice ], 1, 1, cMarkChar )
NEXT nChoice
lIsChecked := .T.
ENDIF
lAdd := .F.
nChoice := 1
nOnItem := 0
ELSE
lIsChecked := SUBSTR( InArray[ nChoice ], 2, 1 ) == cMarkChar
InArray[ nChoice ] := Stuff( InArray[ nChoice ] , 2, 1, IIF( lIsChecked, " ", cMarkChar ) )
OutArray[ nChoice ] := Stuff( OutArray[ nChoice ], 1, 1, IIF( lIsChecked, " ", cMarkChar ) )
IF lIsChecked
nOnItem--
ELSE
nOnItem++
ENDIF
nChoice++
ENDIF
ELSE
lIsChecked := SUBSTR( InArray[ nChoice ], 2, 1 ) == cMarkChar
InArray[ nChoice ] := Stuff( InArray[ nChoice ] , 2, 1, IIF( lIsChecked, " ", cMarkChar ) )
OutArray[ nChoice ] := Stuff( OutArray[ nChoice ], 1, 1, IIF( lIsChecked, " ", cMarkChar ) )
IF lIsChecked
nOnItem--
ELSE
nOnItem++
ENDIF
ENDIF
ENDIF
ENDDO
FOR x := 1 TO nLenArray
IF LEFT( OutArray[ X ], 1 ) == cMarkChar
AADD( aNewArray, SUBSTR( OutArray[ X ], 2 ) )
ENDIF
InArray[ X ] := SUBSTR( InArray[ X ], 4 )
NEXT
ASIZE( OutArray, Len( aNewArray ) )
ACOPY( aNewArray, OutArray )
SETCOLOR( coldColor )
RESTSCREEN( ,,,, cOldScreen )
RETURN LEN( aNewArray )
*-------------------------------------------------------------------
STATIC FUNCTION PickArray_Keys( MODE, nOnItem, lAdd )
*-------------------------------------------------------------------
LOCAL RETVAL := AC_CONT
LOCAL THEKEY := Lastkey()
IF MODE == AC_HITTOP
KEYBOARD Chr( K_CTRL_PGDN )
ELSEIF MODE == AC_HITBOTTOM
KEYBOARD Chr( K_CTRL_PGUP )
ELSEIF MODE == AC_EXCEPT
IF THEKEY == K_SPACE // space bar to select/unselect
RETVAL := AC_SELECT
ELSEIF THEKEY == K_F5 // (select all itens)
lAdd := !lAdd
RETVAL := AC_SELECT
ELSEIF THEKEY == K_ESC
RETVAL := AC_ABORT
ELSEIF THEKEY == K_ENTER .AND. nOnItem < 1
RETVAL := AC_ABORT
KEYBOARD CHR( K_ENTER )
ELSEIF THEKEY == K_ENTER
KEYBOARD CHR( K_DOWN )
RETVAL := AC_ABORT
ENDIF
ENDIF
RETURN RETVAL
*-------------------------------------------------------------------
* Former hbmutils.prg
*-------------------------------------------------------------------
*--------------------------------------------
FUNCTION GetSourceFiles( lSubDir, lGcc, cOs )
*--------------------------------------------
LOCAL aDirs
LOCAL aRet := {}
LOCAL lLinux := AT( "LINUX", Upper( cOs ) ) > 0 .OR. lGcc
LOCAL cDir := IIF( ! lLinux, "\" + CURDIR() + "\", "/" + CURDIR() + "/" )
LOCAL aStru := { cDir }
LOCAL aData
LOCAL nCounter := 0
LOCAL nArrayLen
LOCAL nDatalen
LOCAL y
LOCAL cItem
LOCAL cExt
LOCAL cPath
LOCAL cDrive
LOCAL nPos
LOCAL xItem
LOCAL nLen
LOCAL cFile
LOCAL nPADR
DEFAULT lSubDir TO .t.
WHILE ++ nCounter <= LEN( aStru )
IF ! EMPTY( aDirs := GetDirs( aStru[ nCounter ], lGcc ) ) // There are elements!
AEVAL( aDirs, { | xItem | AADD( aStru, xItem ) } )
ENDIF
ENDDO
aDirs := {}
ASort( aStru )
nArrayLen := LEN( aStru )
FOR nCounter := 1 TO nArrayLen
IF LEN( aData := DIR_MULTI( aStru[ nCounter ] + "*.prg |" + aStru[ nCounter ] + "*.c |" + aStru[ nCounter ] + "*.cpp" ) ) != 0
nDataLen := LEN( aData )
nPADR := 12 // maximum Clipper/DOS source file name length with extension.
// if this lenght is greater than 12, then reset nPADR.
FOR y := 1 TO nDataLen
nPADR := Max( AT(".prg", Lower( aData[ y, 1 ] ) )+3 , nPADR )
nPADR := Max( AT(".c", Lower( aData[ y, 1 ] ) )+1 , nPADR )
nPADR := Max( AT(".cpp", Lower( aData[ y, 1 ] ) )+3 , nPADR )
NEXT
FOR y := 1 TO nDataLen
IF AT( ".prg", Lower( aData[ y, 1 ] ) ) > 0 .OR. AT( ".c", Lower( aData[ y, 1 ] ) ) > 0 .OR. AT( ".cpp", Lower( aData[ y, 1 ] ) ) > 0
IF lSubDir
nLen := AT( " ", aData[ y, 1 ] ) + 1
AADD( aRet, STRTRAN( aStru[ nCounter ], cDir, "" ) +;
PADR(aData[ y,1 ] ,nPADR) + ; // prg name
STR(aData[ y, 2 ] , 8 ) + " " + ; // prg size
DTOC(aData[ y, 3 ] ) + " " + ; // prg date
aData[ y, 4 ] ) // prg time
ELSEIF ! lSubDir .AND. AT( IIF( lLinux, "/", "\" ), STRTRAN( aStru[ nCounter ], cDir, "" ) ) == 0
AADD( aRet, PADR(aData[ y, 1 ],nPADR) + ; // prg name
STR( aData[ y, 2 ], 8 ) + " " + ; // prg size
DTOC( aData[ y, 3 ] ) + " " + ; // prg date
aData[ y, 4 ] ) // prg time
ENDIF
ENDIF
NEXT
ENDIF
NEXT
// For nCounter := 1 To Len( aRet )
FOR EACH cFile IN aRet
xItem := SUBSTR( cFile, RAT( IIF( lLinux, "/", "\" ), cFile ) + 1 )
nPos := ASCAN( aStru, { | x | x := SUBSTR( x, RAT( IIF( lLinux, "/", "\" ), x ) + 1 ), LEFT( x, AT( ".", x ) ) == LEFT( xitem, AT( ".", xitem ) ) } )
IF nPos > 0
ADEL( aStru, nPos )
ASIZE( aStru, LEN( aStru ) - 1 )
ENDIF
NEXT
FOR EACH cFile IN aStru
HB_FNAMESPLIT( LEFT( cFile, AT( " ", cFile ) - 1 ), @cPath, @cItem, @cExt, @cDrive )
IF ( cExt == ".C" ) .OR. ( cExt == ".c" ) .OR. ( cExt == ".CPP" ) .OR. ( cExt == ".cpp" )
AADD( aRet, cFile )
ENDIF
NEXT
RETURN aRet
*----------------------------------------
STATIC FUNCTION GetDirs( cPattern, lGcc )
*----------------------------------------
LOCAL aDir := {}
LOCAL lLinux := AT( "LINUX", Upper( OS() ) ) > 0 .OR. lGcc
AEVAL( DIRECTORY( cPattern + IIF( lLinux, "*", "*.*" ), "D" ), ;
{ | xItem | IIF( xItem[ F_ATTR ] == "D" .AND. ;
( !( xItem[ F_NAME ] == "." ) .AND. !( xItem[ F_NAME ] == ".." ) ), ;
AADD( aDir, cPattern + xItem[ F_NAME ] + IIF( lLinux, "/", "\" ) ), ;
) } )
RETURN aDir
*-----------------------
FUNCTION GetHarbourDir()
*-----------------------
LOCAL lUnix := "LINUX" $ Upper( OS() ) .OR. ;
"UNIX" $ Upper( OS() ) .OR. ;
"HP-UX" $ Upper( OS() ) .OR. ;
"DARWIN" $ Upper( OS() )
LOCAL cBar := iif( lUnix, "/" , "\" )
LOCAL HBSTRG := iif( lUnix, "harbour", "harbour.exe" )
LOCAL cPathUni := GetEnv( "PATH_HARBOUR" )
LOCAL aEnv := hb_ATokens( GetEnv( "PATH" ), iif( lUnix, ":", ";" ) )
LOCAL cCurEnv
AAdd( aEnv, "." + cBar )
IF !EMPTY( cPathUni )
AAdd( aEnv, cPathUni )
ENDIF
FOR EACH cCurEnv IN aEnv
IF File( cCurEnv + cBar + hbstrg )
RETURN Left( cCurEnv, RAt( cBar, cCurEnv ) - 1 )
ENDIF
NEXT
RETURN ""
*-------------------
FUNCTION GetBccDir()
*-------------------
LOCAL cPath := ""
LOCAL cEnv := GETE( "PATH" )
LOCAL aEnv := HB_ATokens( cEnv, ";" )
LOCAL cCurEnv := ""
FOR EACH cCurEnv IN aEnv
IF FILE( cCurEnv + "\bcc32.exe" )
cPath := cCurEnv
cPath := LEFT( cPath, RAT( "\", cPath ) - 1 )
EXIT
ENDIF
NEXT
RETURN cPath
*-------------------
FUNCTION GetVccDir()
*-------------------
LOCAL cPath := ""
LOCAL cEnv := GETE( "PATH" )
LOCAL aEnv := HB_ATokens( cEnv, ";" )
LOCAL cCurEnv := ""
FOR EACH cCurEnv IN aEnv
IF FILE( cCurEnv + "\cl.exe" )
cPath := cCurEnv
cPath := LEFT( cPath, RAT( "\", cPath ) - 1 )
EXIT
ENDIF
NEXT
RETURN cPath
*--------------------
FUNCTION GetPoccDir()
*--------------------
LOCAL cPath := ""
LOCAL cEnv := GETE( "PATH" )
LOCAL aEnv := HB_ATokens( cEnv, ";" )
LOCAL cCurEnv := ""
FOR EACH cCurEnv IN aEnv
IF FILE( cCurEnv + "\pocc.exe" )
cPath := cCurEnv
cPath := LEFT( cPath, RAT( "\", cPath ) - 1 )
EXIT
ENDIF
NEXT
RETURN cPath
*----------------------------
FUNCTION Exten( cExt, nType )
*----------------------------
LOCAL aExt := { "C", "c", "CPP", "cpp" }
LOCAL nPos
LOCAL cTemp := ""
nPos := ASCAN( aExt, { | a | a == cExt } )
IF nPos > 0
SWITCH nType
CASE 1
cTemp := STRTRAN( cExt, aExt[ nPos ], "o" )
EXIT
CASE 2
cTemp := STRTRAN( cExt, aExt[ nPos ], "obj" )
EXIT
END
ENDIF
RETURN cTemp
*----------------------------
FUNCTION GetSourceDirMacros()
*----------------------------
LOCAL aDirs
LOCAL lLinux := AT( "LINUX", Upper( OS() ) ) > 0
LOCAL cDir := IIF( lLinux, "/" + CURDIR() + "/", "\" + CURDIR() + "\" )
LOCAL aStru := { cDir }
LOCAL nCounter := 0
LOCAL aMacros := {}
WHILE ++ nCounter <= LEN( aStru )
IF ! EMPTY( aDirs := GetDirs( aStru[ nCounter ], lLinux ) ) // There are elements!
AEVAL( aDirs, { | xItem | AADD( aStru, xItem ) } )
ENDIF
ENDDO
FOR nCounter := 1 TO LEN( aStru )
AADD( aMacros, { "SRC" + STRZERO( nCounter, 2, 0 ), STRTRAN( aStru[ nCounter ], cDir, "" ), .f. } )
NEXT
RETURN aMacros
*------------------------------------
FUNCTION HbMake_FileDate( cFileName )
*------------------------------------
LOCAL aFiles := DIRECTORY( cFileName )
RETURN IIF( LEN( aFiles ) == 1, aFiles[ 1, 3 ], CTOD( "" ) )
*------------------------------------
FUNCTION HbMake_FileTime( cFileName )
*------------------------------------
LOCAL aFiles := DIRECTORY( cFileName )
RETURN IIF( LEN( aFiles ) == 1, aFiles[ 1, 4 ], "" )
*------------------------------
FUNCTION TD2JUL( CTIME, DDATE )
*------------------------------
RETURN DDATE - CTOD( "01/01/1900" ) + ( PRB_INT( TTOS( CTIME ) / 100000,, 5 ) )
*---------------------
STATIC FUNCTION TTOS( CTIME )
*---------------------
RETURN ( VAL( SUBSTR( CTIME, 7, 2 ) ) ) + ;
( VAL( SUBSTR( CTIME, 4, 2 ) ) * 60 ) + ;
( VAL( SUBSTR( CTIME, 1, 2 ) ) * 3600 )
*---------------------------------------------------
FUNCTION PRB_INT( SOMENUMBER, length, NUM_DECIMALS )
*---------------------------------------------------
LOCAL NEGATIVE := ( SOMENUMBER < 0 )
LOCAL SOMESTRING
LOCAL dotat
DEFAULT NUM_DECIMALS TO 0
DEFAULT length TO 19
IF NEGATIVE
SOMENUMBER := ABS( SOMENUMBER )
ENDIF
SOMENUMBER += .0000000000000005
SOMESTRING := hb_NToS( SOMENUMBER )
dotat := AT( ".", somestring )
DO CASE
CASE NUM_DECIMALS == 0
IF dotat > 0
somestring := LEFT( somestring, dotat - 1 )
ENDIF
CASE NUM_DECIMALS > 0
IF dotat > 0
somestring := LEFT( somestring, dotat + num_decimals )
ENDIF
ENDCASE
IF NEGATIVE
SOMESTRING := "-" + SOMESTRING
ENDIF
RETURN VAL( SOMESTRING )
*---------------------------
FUNCTION Exte( cExt, nType )
*---------------------------
LOCAL aExt := { "prg", "prG", "pRg", "Prg", "PRg", "PrG", "PRG" }
LOCAL nPos
LOCAL cTemp := ""
nPos := ASCAN( aExt, { | a | a == cExt } )
IF nPos > 0
IF nType == 1
cTemp := STRTRAN( cExt, aExt[ nPos ], "c" )
ELSEIF nType == 2
cTemp := STRTRAN( cExt, aExt[ nPos ], "obj" )
ELSEIF nType == 3
cTemp := STRTRAN( cExt, aExt[ nPos ], "o" )
ENDIF
ENDIF
RETURN cTemp
*-----------------------------------------------
PROCEDURE ATTENTION( CSTRING, NLINENUM, CCOLOR )
*-----------------------------------------------
LOCAL COLDCOLOR
LOCAL nColPos
DEFAULT NLINENUM TO 24
DEFAULT CCOLOR TO "GR+/R"
COLDCOLOR := SETCOLOR( CCOLOR )
CSTRING := " " + ALLTRIM( CSTRING ) + " "
nColPos := MAX( INT( ( MAXCOL() - LEN( cString ) ) / 2 ), 0 )
DEVPOS( NLINENUM, nColPos )
DEVOUT( CSTRING )
SETCOLOR( COLDCOLOR )
RETURN
*--------------------------------------
FUNCTION GetInstaledLibs( clibs, lGcc )
*--------------------------------------
LOCAL cSuffix := IIF( lGCC, ".a", ".lib" )
LOCAL aReturnLibs := {}
LOCAL aLibs := DIRECTORY( clibs )
LOCAL cItem
LOCAL nCount
LOCAL aDefLib := {}
aadd( aDefLib, "ace32" + cSuffix )
aadd( aDefLib, "hbcpage" + cSuffix )
aadd( aDefLib, "hbcommon" + cSuffix )
aadd( aDefLib, "hbct" + cSuffix )
aadd( aDefLib, "rdddbt" + cSuffix )
aadd( aDefLib, "rddcdx" + cSuffix )
aadd( aDefLib, "rddfpt" + cSuffix )
aadd( aDefLib, "rddntx" + cSuffix )
aadd( aDefLib, "hbdebug" + cSuffix )
aadd( aDefLib, "gtcgi" + cSuffix )
aadd( aDefLib, "gtdos" + cSuffix )
aadd( aDefLib, "gtpca" + cSuffix )
aadd( aDefLib, "gtsln" + cSuffix )
aadd( aDefLib, "gtstd" + cSuffix )
aadd( aDefLib, "gttrm" + cSuffix )
aadd( aDefLib, "gtwin" + cSuffix )
aadd( aDefLib, "gtwvt" + cSuffix )
aadd( aDefLib, "hbodbc" + cSuffix )
aadd( aDefLib, "hbpgsql" + cSuffix )
aadd( aDefLib, "hblang" + cSuffix )
aadd( aDefLib, "hbmisc" + cSuffix )
aadd( aDefLib, "hbnf" + cSuffix )
aadd( aDefLib, "hbgt" + cSuffix )
aadd( aDefLib, "hbmysql" + cSuffix )
aadd( aDefLib, "hbmacro" + cSuffix )
aadd( aDefLib, "hbnulrdd" + cSuffix )
aadd( aDefLib, "hbpp" + cSuffix )
aadd( aDefLib, "hbrdd" + cSuffix )
aadd( aDefLib, "rddads" + cSuffix )
aadd( aDefLib, "hbrtl" + cSuffix )
aadd( aDefLib, "hbclipsm" + cSuffix )
aadd( aDefLib, "hbtip" + cSuffix )
aadd( aDefLib, "hbwin" + cSuffix )
aadd( aDefLib, "hbvm" + cSuffix )
aadd( aDefLib, "hbziparc" + cSuffix )
IF lGcc
AEval( aLibs, { | x, y | cItem := x[1], IIF( Left( cItem, 3 ) == "lib", aLibs[ y, 1 ] := SUBSTR( cItem, 4 ), ) } )
ENDIF
FOR nCount := 1 TO LEN( aLibs )
IF AScan( aDefLib, { | a | hb_FileMatch( a, aLibs[ nCount, 1 ] ) } ) == 0
AAdd( aReturnLibs, aLibs[ nCount, 1 ] )
ENDIF
NEXT
RETURN aReturnLibs
*-----------------------------
FUNCTION GetLibs( lGcc, cDir )
*-----------------------------
LOCAL lLinux := AT( "LINUX", Upper( OS() ) ) > 0
LOCAL cEnv := GETENV( "HB_LIB_INSTALL" )
LOCAL aInstaledLibs := GetInstaledLibs( IIF( ! lLinux, IIF( ! lGcc, cDir + "\*.lib", cDir + "\*.a" ), "/usr/lib/harbour/*.a" ), lGcc )
LOCAL cExt := iif(lGcc,".a",".lib")
/* 1234567890123456789 */
LOCAL aLibsDesc := { { "Harbour hbmisc lib - hbmisc" + cExt , "hbmisc" + cExt },;
{ "Harbour NanFor Lib lib - hbnf" + cExt , "hbnf" + cExt },;
{ "Harbour GT Lib lib - hbgt"+cExt , "hbgt" + cExt },;
{ "Harbour ZipArchive lib - hbziparc"+cExt , "hbziparc" + cExt },;
{ "Harbour ole (old) lib - hbole"+ cExt , "hbole" + cExt + " ole2" + cExt },;
{ "Harbour MySQL lib - hbmysql" + cExt , "hbmysql" + cExt },;
{ "Harbour PostgreSQL lib - hbpgsql"+cExt , "hbpgsql" + cExt },;
{ "Harbour samples lib - hbclipsm"+cExt , "hbclipsm" + cExt } }
AEVAL( aInstaledLibs, { | x | AAdd( aLibsDesc, { PADR("Harbour contrib",19)+" lib - " + PADR(x,15), x } ) } )
RETURN aLibsDesc
*-----------------------------------------
FUNCTION DIR_MULTI( cFileMaskList, cAttr )
*-----------------------------------------
LOCAL aList := listasarray2( cFileMaskList, "|" )
AEVAL( aList, { | tmp, tmp1 | aList[ tmp1 ] := DIRECTORY( tmp, cAttr ) } )
RETURN ArrayAJoin( alist )
*----------------------------
FUNCTION ArrayAJoin( aArray )
*----------------------------
LOCAL tmp
LOCAL nLenArray := LEN( aArray )
LOCAL nLen
LOCAL nPos := LEN( aArray[ 1 ] ) + 1
nLen := 0
FOR tmp := 1 TO nLenArray
nLen += LEN( aArray[ tmp ] )
NEXT
ASIZE( aArray[ 1 ], nLen )
FOR tmp := 2 TO nLenArray
ACOPY( aArray[ tmp ], aArray[ 1 ],,, nPos )
nPos += LEN( aArray[ tmp ] )
NEXT
RETURN aArray[ 1 ]
*-----------------------------------------
FUNCTION ListAsArray2( cList, cDelimiter )
*-----------------------------------------
LOCAL nPos
LOCAL aList := {} // Define an empty array
DEFAULT cDelimiter TO ","
DO WHILE ( nPos := AT( cDelimiter, cList ) ) != 0
AADD( aList, ALLTRIM( SUBSTR( cList, 1, nPos - 1 ) ) ) // Add a new element
cList := SUBSTR( cList, nPos + 1 )
ENDDO
AADD( aList, ALLTRIM( cList ) ) // Add final element
RETURN aList // Return the array
*--------------------
FUNCTION CreateLink()
*--------------------
LOCAL nHandle := FCreate( "hbtemp.c" )
FWrite( nHandle, ;
'#include "hbapi.h"' + s_cEOL +;
"extern HB_FUNC( HB_GT_CRS );" + s_cEOL +;
"void hb_lnk_ForceLink_build( void )" + s_cEOL +;
"{" + s_cEOL +;
" HB_FUNCNAME( HB_GT_CRS )();" + s_cEOL +;
"}" + s_cEOL )
FClose( nHandle )
RETURN NIL
*-------------------------------------------------------------
FUNCTION CmdLineParam( cFile, cCmdParams )
* Params must be by reference not value
*-------------------------------------------------------------
LOCAL aDef := {}
LOCAL cTemp
LOCAL cFlag
LOCAL nParam := 0 /* Steps thourgh params */
LOCAL xReturn := RET_OK /* Default to OK */
/* Set the statics we know about. Some may be
* reset after command line is parsed
*/
s_aEOL := { CHR(13) + CHR(10), CHR(10) }
s_cEOL := hb_OSNewLine()
s_nLang := GETUSERLANG() /* In hbmlang.c */
cTemp := UPPER( OS() )
s_lOS2 := ( "OS/2" $ cTemp )
s_lLinux := ( "LINUX" $ cTemp )
s_lWindows := ( "WINDOWS" $ cTemp )
s_lUnix := ( "UNIX" $ cTemp .OR. ;
"HP-UX" $ cTemp )
DO CASE
CASE s_lOS2 /* OS/2 */
s_lOS2 := s_lGcc := .T.
s_cEditor := "mcedit"
CASE s_lLinux /* Linux */
s_lLinux := s_lGcc := .T.
s_cEditor := "mcedit"
CASE s_lWindows /* Windows */
s_lWindows := s_lBcc := .T.
s_cEditor := "edit"
CASE s_lUnix /* UXIX */
s_lUnix := s_lGcc := .T.
s_cEditor := "mcedit"
OTHERWISE /* Unknown OS - setup for windows as default */
s_lWindows := s_lBcc := .T.
s_cEditor := "edit"
END CASE
/* Get & Set Command Line Parameters
*/
cCmdParams := "" /* Starts Empty Params */
WHILE ! EMPTY( (cFlag:= hb_argv( ++nParam ) ) )
/* Change '/' flags to '-'
*/
cFlag := UPPER( STRTRAN( cFlag, "/", "-" ) )
/* Capture FileName & Remove trailing 'X', -EC changed to -E
*/
IF LEFT( cFlag, 1 ) != '-'
cFile := hb_argv( nParam )
LOOP
ELSE
cFlag := STRTRAN( cFlag, "X" , "" )
cFlag := STRTRAN( cFlag, "EC", "E" )
ENDIF
DO CASE
CASE cFlag == "-BC" /* Borland Bcc Default */
s_lBcc := .T.
s_lGcc := s_lMSVcc := s_lPocc := .F.
CASE cFlag == "-GC" /* GNU Gcc Default */
s_lGcc := .T.
s_lBcc := s_lMSVcc := s_lPocc := .F.
CASE cFlag == "-VC" /* MS Visual Cc Default */
s_lMSVcc := .T.
s_lBcc := s_lGcc := s_lPocc := .F.
CASE cFlag == "-PC" /* Pelles Cc Default */
s_lPocc := .T.
s_lBcc := s_lGcc := s_lMSVcc := .F.
CASE cFlag == "-F" /* Force Rebuild All */
s_lForce := .T.
CASE cFlag == "-E" /* Programs Edit Mode */
s_lEdit := .T.
CASE cFlag == "-EL" /* Library Edit Mode */
s_lLibrary := .T.
s_lEdit := .T.
CASE cFlag == "-I" /* Ignore Errors */
s_lIgnoreErrors := .T.
CASE cFlag == "-R" /* Recursive Dir Search */
s_lRecursive := .T.
CASE cFlag == "-S" /* Show Make Details */
s_lPrint := .T.
CASE "-L" == LEFT( cFlag, 2 ) /* Language Flag */
cFlag := SUBSTR( cFlag, 3, 2 )
DO CASE
CASE cFlag == "PT" /* portuguese brazilian */
s_nLang := LANG_PT
CASE cFlag == "ES" /* Spanish */
s_nLang := LANG_ES
OTHERWISE /* English default */
s_nLang := LANG_EN
END CASE
CASE cFlag == "-?" .OR. ; /* Show Help */
cFlag == "-H"
xReturn := RET_ERR /* Flag to show help() */
CASE LEFT( cFlag, 2 ) == "-D" /* Define a macro */
cFlag := "-D" + STRTRAN( cFlag, "-D", ";" )
cFlag := STRTRAN( cFlag, "-D;", "-D" )
aDef := ListAsArray2( ALLTRIM( SUBSTR( cFlag, 3 ) ), ";" )
AEval( aDef, { | xDef | IIF( At( "=", xDef ) > 0, GetParaDefines( xDef ), ) } )
OTHERWISE /* Unknown flag set '-H' flag */
xReturn := RET_ERR
ALERT( "Unknown Cmd-Line Parameter: " + cFlag +;
"Setting Help flag." )
END CASE
cCmdParams += cFlag
END WHILE
DO CASE
CASE EMPTY( cFile )
xReturn := RET_ERR
CASE nParam == 2 /* Was Incremed 1-past actual number */
cCmdParams := "-F" /* -F probably not needed - check it */
s_lForce := .T.
END CASE
RETURN xReturn
STATIC FUNCTION GETUSERLANG()
SWITCH Upper( Left( hb_UserLang(), 2 ) )
CASE "PT" ; RETURN 1
CASE "ES" ; RETURN 3
ENDSWITCH
RETURN 2 /* EN */
STATIC FUNCTION HBRawVersion()
RETURN StrTran( Version(), "Harbour ", "" )