Eu uso aqui também meu pré-compilador.
Nada demais, só adequando ao meu uso, chamado antes do HBMK2
/*
BUILD - PRE-COMPILACAO
José Quintas
*/
REQUEST errorsys
#include "directry.ch"
FUNCTION Main( ... )
LOCAL cDateTime, cTxt, nBuildNum, cFileName, cLastPath, aParams
SetMode( 38, 132 )
CheckVar( "HB_BUILD_DYN", "no" )
CheckVar( "HB_BUILD_CONTRIB_DYN", "no" )
CheckVar( "HB_BUILD_STRIP", "all" )
CheckVar( "HB_COMPILER", "mingw" )
CheckVar( "HB_INSTALL_PREFIX", "\bin\hbmk2.exe" )
CheckVar( "PATH", "hbmk2.exe" )
CheckVar( "PATH", "gcc.exe" )
aParams := hb_AParams()
cFileName := hb_FNameDir( hb_ProgName() ) + hb_FNameName( hb_ProgName() )
cDateTime := Dtos( Date() ) + Substr( Time(), 1, 2 ) + Substr( Time(), 4, 2 )
cTxt := MemoRead( cFileName + ".xml" )
nBuildNum := Val( XmlNode( cTxt, "BuildNum" ) ) + 1
cLastPath := XmlNode( cTxt, "LastPath" )
IF ! Upper( cLastPath ) == Upper( hb_cwd() )
DeleteContent( "c:\temp", .F. )
DeleteContent( "c:\users\joseq\appdata\local\temp", .F. )
ENDIF
cTxt := "#define JOSEQUINTAS_VERSAO " + ["] + Transform( cDateTime, "@R 9999.99.99.9999" ) + ["] + hb_Eol()
cTxt += "#define JOSEQUINTAS_VERSAO_RC " + Transform( cDateTime, "@R 9999,99,99,9999" ) + hb_Eol()
hb_MemoWrit( cFileName + ".ch", cTxt )
IF File( "build.ch" ) // BHP ou projeto extra
hb_MemoWrit( "build.ch", cTxt )
ENDIF
cTxt := XmlTag( "BuildNum", Ltrim( Str( nBuildNum ) ) ) + hb_Eol()
cTxt += XmlTag( "LastPath", hb_cwd() ) + hb_Eol()
cTxt += XmlTag( "BuildDate", Dtos( Date() ) ) + hb_Eol()
cTxt += XmlTag( "BuildTime", Time() ) + hb_Eol()
hb_MemoWrit( cFileName + ".xml", cTxt )
Compile( aParams )
RETURN NIL
STATIC FUNCTION DeleteContent( cFolder, lDeleteFolder )
LOCAL oFiles, oFile, lDelete
hb_Default( lDeleteFolder, .F. )
? "Delete " + cFolder
oFiles := Directory( "c:\temp\*.*" )
FOR EACH oFile IN oFiles
IF oFile[ F_ATTR ] == "D"
IF oFile[ F_NAME ] != "." .AND. oFile[ F_NAME ] != ".."
DeleteContent( cFolder + "\" + oFile[ F_NAME ], .T. )
ENDIF
ELSE
lDelete := .T.
DO CASE
CASE hb_FNameExt( oFile[ F_NAME ] ) == ".c"
CASE hb_FNameExt( oFile[ F_NAME ] ) == ".o"
CASE oFile[ F_DATE ] != Date()
CASE Left( oFile[ F_TIME ], 4 ) != Left( Time(), 4 )
OTHERWISE
lDelete := .F.
ENDCASE
IF lDelete
? "Deleting " + cFolder + "\" + oFile[ F_NAME ]
fErase( cFolder + "\" + oFile[ F_NAME ] )
ENDIF
ENDIF
NEXT
IF lDeleteFolder
DirRemove( cFolder )
ENDIF
RETURN NIL
FUNCTION HB_GT_SYS()
REQUEST HB_GT_WVG_DEFAULT
RETURN NIL
STATIC FUNCTION Compile( aParams )
LOCAL oElement, cPath, cCmd := ""
cPath := Upper( hb_cwd() )
DO CASE
CASE "\HMGE\" $ cPath ; AAdd( aParams, "hmge.hbc" )
CASE "\HMG3\" $ cPath ; AAdd( aParams, "hmg3.hbc" )
CASE "\OOHG" $ cPath ; AAdd( aParams, "oohg.hbc" )
CASE "\HWGUI\" $ cPath ; AAdd( aParams, "hwgui.hbc" )
ENDCASE
IF Len( aParams ) != 0 .AND. aParams[ 1 ] == "/cmd"
hb_ADel( aParams, 1, .T. )
ELSEIF Len( Directory( "*.hbp" ) ) != 0
AAdd( aParams, "*.hbp" )
ELSEIF Len( Directory( "*.prg" ) ) != 0
Aadd( aParams, "*.prg" )
AAdd( aParams, "*.rc" )
ELSE
? hb_cwd()
Inkey(0)
ENDIF
AAdd( aParams, "-m" )
AAdd( aParams, "-n" )
IF ! "\ALLGUI\" $ cPath
IF aScan( aParams, { | e | Left( e, 2 ) == "-w" } ) == 0
AAdd( aParams, "-w3" )
ENDIF
IF aScan( aParams, { | e | Left( e, 3 ) == "-es" } ) == 0
AAdd( aParams, "-es2" )
ENDIF
ENDIF
AAdd( aParams, "-workdir=c:\temp" )
AAdd( aParams, "-compr" )
AAdd( aParams, "-strip" )
AAdd( aParams, "-mt" )
AAdd( aParams, "-quiet" )
//AAdd( aParams, "-q0" )
AAdd( aParams, "-ge1" )
AAdd( aParams, "-I" + hb_FNameDir( hb_ProgName() ) )
cCmd += "HBMK2 "
FOR EACH oElement IN aParams
cCmd += oElement + " "
NEXT
cCmd := ;
hb_ProgName() + " %*" + hb_Eol() + ;
cCmd + hb_Eol()
DO CASE
CASE "\SJPA\" $ cPath .AND. File( "..\sjpa.exe" ); cCmd += "assina ..\sjpa.exe" + hb_Eol()
CASE "\HAROLDO\" $ cPath .AND. File( "hl.exe" ); cCmd += "assina hl.exe" + hb_Eol()
CASE "\LABOROIL\" $ cPath .AND. File( "nfe.exe" ); cCmd += "assina nfe.exe" + hb_Eol()
CASE "\BUILD\" $ cPath .AND. File( "build.exe" ); cCmd += "assina build.exe" + hb_Eol()
CASE "\INTEGRA\" $ cPath .AND. File( "jpa.exe" ); cCmd += "assina jpa.exe" + hb_Eol()
ENDCASE
hb_MemoWrit( "d:\tools\util\c.bat", cCmd )
RETURN NIL
STATIC FUNCTION CheckVar( cVar, cDefault )
LOCAL lOk := .F., aList, oElement
IF Empty( GetEnv( cVar ) )
? "not found set " + cVar
ENDIF
IF cVar == "HB_INSTALL_PREFIX"
IF ! File( GetEnv( "HB_INSTALL_PREFIX" ) + cDefault )
? "HB_INSTALL_PREFIX não indica pasta com " + cDefault
ENDIF
ENDIF
IF cVar == "PATH"
aList := hb_RegExSplit( ";", GetEnv( "PATH" ) )
FOR EACH oElement IN aList
IF File( oElement + cDefault )
lOk := .T.
ENDIF
NEXT
IF ! lOk
? "Não encontrado no PATH " + cDefault
ENDIF
ENDIF
RETURN NIL
Vamos lá... tenho o C.BAT
d:\cdrom\FONTES\build\build.exe %*
nada
nada
só a primeira linha é fixa, as demais são alteradas depois da chamada do build.exe
Ou seja, vai ser tudo executado diretamente sem nada na memória a não ser o bat.
- Checa algumas variáveis de ambiente. Isso é bom pra quando usar máquina nova ou formatada, pra lembrar do que precisa (ou do que usava).
- Ele atualiza build.ch que vai incluir no projeto a versão do meu EXE
- Caso o projeto tenha um build.ch, copio pra pasta (isso quando é fonte pra terceiros, pra não faltar esse arquivo)
- Desvio todo lixo resultado do HBMK2 para c:\temp, e não pra .HBMK que é o default
- Limpo a pasta c:\temp, apagando arquivos "antigos". Com isso, mesmo que um projeto seja incremental, pra compilar só o que foi alterado, de tempos em tempos apago os arquivos
- Também limpo quando troca de projeto, pra não misturar arquivos com mesmo nome, isto é importante
- Pra compilar HMGE, HMG3, OOHG, HWGUI, não pode ser o mesmo default que uso, então identifico se na pasta atual tem alguma delas (\HMGE\ por exemplo)
- Acrescento os defaults de compilação
- Se for um dos projetos que precisa assinatura digital, acrescento pra assinar
- Por fim, gravo os comandos no C.BAT
Com isso, o BAT chama o build na primeira linha, e executa toda saÃda do build nas linhas seguintes.
Basicamente é uma chamada do HBMK2, e se precisar, a chamada pra assinatura digital.
Vantagem:
Se tudo que preciso está aÃ, se trocar de máquina, ele mesmo já me lembra.
Já não aconteceu com alguém de não lembrar tudo que precisava?
Que será mais que precisa configurar na máquina? ????
Antes compilava e agora não... o que será que esqueci ???
Ué... se criar um programa que confere, é só chamar esse programa, e ele vai te lembrar.
É como eu digo sempre: você tem que facilitar seu trabalho
É aproveitar enquanto o cérebro está funcionando bem, pra te ajudar quando o cérebro funcionar mal.
E o mesmo com fontes. Fontes fáceis, trabalho fácil.
Pode servir pra quando ficar velho, mas serve pra quando está novo, pra sobrar tempo.
Aritmética básica: Com o que ganhamos dinheiro?
NOSSO TEMPO
Então... precisamos de ferramentas que economizem nosso tempo.
Aonde encontrar essas ferramentas?
Ué... somos programadores... é só fazer.
A simples conferência da configuração da máquina já faz economizar tempo.
Às vezes porque é demorado configurar, ou às vezes porque demora tanto pra precisar disso que não lembramos mais.... rs
Compilar é a base de todo nosso trabalho.
Está aà um bom item pra começar a facilitar !!
Com tudo isso, aqui pra compilar um projeto digito:
c <ENTER>
E se sai do normal, parâmetros adicionais:
c sefazclass.hbc <enter>
c hwgui.hbc <enter>
c hmge.hbc <enter>
c -w0 -es0 <enter> (desliga meu default -w3 -es2)
Exemplo prático, estava testando aqui:
PROCEDURE Main
LOCAL cTime, nMinutos, nCont
cTime := Left( Time(), 5 )
nMinutos := Val( Substr( cTime, 1, 2 ) ) * 60 + Val( Substr( cTime, 4, 2 ) )
FOR nCont = 1 TO 10
? MtoH( nMinutos )
nMinutos += 10
NEXT
Inkey(0)
FUNCTION AppVersaoExe(); RETURN ""
c<ENTER>
Faltou mtoh, e agora, aonde está isso?
hbmk2 -find mtoh
Legal, só acrescentar josequintas.hbc
c josequintas.hbc <enter>
Pra curiosidade o resultado final, mostrar horários somando de 10 em 10 minutos.
- test4.png (7.21 KiB) Visualizado 3940 vezes
Comentário final:
nada demais, só um programa que acrescenta o que eu teria que digitar.
build.exe - facilitou compilar
hbx de josequintas - facilitou encontrar a função que faltava usando hbmk2 -find
hbp/hbc de josequintas - facilitou gerar o hbx e usar a lib
hbmk2 -find - facilitou encontrar a função que faltava, e até mostrou o que acrescentar
Pequenas ajudas, que se tornam grandes ajudas, e fazem economizar tempo, que é nosso ganha pão.