Clipper On Line • Ver Tópico - Compilando HELLO.PRG com HBMK2.exe e HARBOUR.

Compilando HELLO.PRG com HBMK2.exe e HARBOUR.

Discussão sobre a biblioteca Fivewin - O Clipper para Windows.

Moderador: Moderadores

 

Compilando HELLO.PRG com HBMK2.exe e HARBOUR.

Mensagempor JoséQuintas » 30 Nov 2021 13:36

Só uma organizada.
Tem gente que prefere a configuração antes dos fontes/rc, tem gente que prefere depois

# $Id: WINORCAM.hbp $

# Nome do arquivo gerado (EXE,LIB,DLL)
-oWINORCAM

# DIRETORIO DOS TEMPORARIOS
-workdir=.\OBJs

# RODA O PROGRAMA GERADO. - Nao quero aqui. Chamo no GO.BAT
# -run

########## INICIO - MENU PRINCIPAL. #PRG # ------ MODULO PRINCIPAL -------

WINORCAM.PRG
ERRSYSW.PRG
DIALOG.PRG
CONTROL.PRG
MSGBAR.PRG
DSAY.PRG
SSAY.PRG
FUNCOES.PRG
PROPOSTA.PRG
CRIARDBF.PRG
REINDEXA.PRG
CADGRUPO.PRG
CADGPPAG.PRG
CADGPREF.PRG
CADGPLIM.PRG
CADOBLIM.PRG
CADOBREC.PRG
CADGPMAN.PRG
CADGPREC.PRG
CADGPVAS.PRG
CADGPMAO.PRG
CADGPPOD.PRG
CADGPFOR.PRG
CADFOROB.PRG
CADPODOB.PRG
CADGARAN.PRG
CADGARPL.PRG
PMSPOBS.PRG
RESPONSA.PRG
CADPAISA.PRG
CADORSER.PRG
CADFERRA.PRG
CADMANUT.PRG
CHAMADO.PRG
ORCAMENT.PRG
MICHIGAN.PRG
LIMPJARD.PRG
MANUJARD.PRG
MANUVASO.PRG
REMOCAO.PRG
RECOJARD.PRG
DUPLRECO.PRG
PESQPROD.PRG
PESQMAOB.PRG
IMPRECOJ.PRG
IMPORDEJ.PRG
GRAVAREC.PRG
APROVAR.PRG
CADNECES.PRG
PRODUNFE.PRG
ABERTURA.PRG
CADFABRI.PRG
FABRICAN.PRG
COMPRAS.PRG
RMAILAMB.PRG
AGENDA.PRG
OPERADOR.PRG
PRINTER.PRG
RPREVIEW.PRG
RCOLUMN.PRG
PCINFO.PRG
REDE.PRG
ALTTAB.PRG
NUM_CAPS.PRG
ANIMABMP.PRG
CALEND.PRG
TCALENDA.PRG
CALCULAD.PRG
PRV2PDF.PRG
DISPLAY.PRG
PBACKUP.PRG
TRADUTOR.PRG
PROC9995.PRG
PROC9996.PRG

########## RESOURCES - Perfeito com .RC ou .RES. Exemplo/Ejemplo:
#RC

# RES\PBACKUP.RC
# RES\IMAGENES.RC

########## PREFIRO USAR .RES - USO NO LOCAL DOS *.PRGs.
#RES

AMBIENTY.RES
AMBIENT2.RES
AMBIENT3.RES
AMBIENT4.RES
EMAILAMB.RES
IMAGENS.RES
IMAGENS2.RES
PBACKUP.RES
IMAGENES.RES
XPLOOK.RES

#flags

-inc
#-trace
#-static
-fullstatic
-beep
-nodefgt
-gtgui
-gui
-m -n -w2 -gc3 -q -ge1
-prgflag=/n /m /d__FLAT__
-resflag=-D__FLAT__

########## FIVEWIN SETUP

-Ic:\fwh1905\include
-Lc:\fwh1905\lib
-lfiveh
-lfivehc

#LIBRERIAS HARBOUR (se anaden las cabeceras .hbc)

hbct.hbc
xhb.hbc
hbziparc.hbc
hbfoxpro.hbc
hbwin.hbc
hbmzip.hbc
hbhpdf.hbc
hbtip.hbc

#LIBRERIAS DE TERCEROS - EJEMPLO:
#-Lc:\GestObras\lib
#-ljvchwin

# FIN / END


Detalhe: -workdir=
Isso é pra "lixo", se jogar todo conteúdo fora não faz falta.
Costumo usar -workdir=c:\temp
Mas tenho um programa que confere meu PATH atual, e limpa a pasta ao trocar de projeto.
O perigoso é misturar fontes com mesmo nome, de projetos diferentes.
O default do HBMK2 é usar uma pasta .hbmk junto do projeto, que fica escondida por causa do nome.

No seu bat, pode colocar del c:\temp\*.obj, del c:\temp\*.c, etc.

Recursos extras:

HBP = projeto

HBMK.HBM numa pasta
Qualquer fonte que compilar na mesma pasta, vai usar essa configuração
Bom pra uma pasta cheia de exemplos, pra não ter que criar um hbp pra cada fonte
Ou fontes que precisam ser compilados diferentes dos demais, e deixa na pasta deles um HBM
Coloca parâmetros que colocaria no HBP

Se sua pasta do projeto é limpa, só tem arquivos do projeto, alternativamente pode usar:
-oteste
*.prg
*.rc
*.res
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Compilando HELLO.PRG com HBMK2.exe e HARBOUR.

Mensagempor JoséQuintas » 30 Nov 2021 13:41

@ECHO OFF
@ECHO ON
@CLS

SET BCDIR=C:\BCC74

@If Exist .obj\*.Obj      Del .obj\*.Obj
@If Exist .obj\*.Map      Del .obj\*.Map
@If Exist .obj\*.TDS      Del .obj\*.TDS
@If Exist .obj\*.Bc       Del .obj\*.bc
@If Exist .obj\*.C        Del .obj\*.C
@If Exist .obj\*.HC       Del .obj\*.HC

IF EXIST WINORCAM.exe DEL WINORCAM.exe

SET PATH=C:\BCC74\BIN;C:\HBBCC74\BIN

rem é path diferente do anterior?
%bcdir%\bin\BRC32.Exe -R XPLOOK.RC

@REM hbmk2.exe WINORCAM.hbp -rebuild -comp=bcc

hbmk2.exe WINORCAM.hbp -rebuild -comp=bcc %* > Erro.log 2> ERROS.LOG

Echo * Aplicacao Foi Desenvolvida Com Sucesso Usando HBMK2.exe
Echo .

@REM Compactador de .EXE
@C:\PECOMPACT\PEC2 /NB /EMP:Y /TM:Y /CR:Y /MC WINORCAM.EXE

@WINORCAM


detalhe aqui:
hbmk2.exe WINORCAM.hbp -rebuild -comp=bcc %* > Erro.log 2> ERROS.LOG


%* representa tudo que foi digitado pra chamar o BAT.
Significa que se quiser acrescentar -b, por exemplo, pra debug, é só digitar na linha, e usar o mesmo bat
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Compilando HELLO.PRG com HBMK2.exe e HARBOUR.

Mensagempor Kapiaba » 30 Nov 2021 14:22

Very good. Algumas coisas eu gostei e vou usar. já vou implementar e posto como vai ficar. Obg. abs.
Kapiaba
Colaborador

Colaborador
 
Mensagens: 1765
Data de registro: 07 Dez 2012 15:14
Cidade/Estado: São Paulo
Curtiu: 310 vezes
Mens.Curtidas: 119 vezes

Compilando HELLO.PRG com HBMK2.exe e HARBOUR.

Mensagempor Kapiaba » 30 Nov 2021 15:01

Mister Quintas:

GO.BAT final:

@ECHO OFF
@ECHO ON
@CLS

@If Exist .OBJs\*.OBJ      Del .OBJs\*.OBJ
@If Exist .OBJs\*.Map      Del .OBJs\*.Map
@If Exist .OBJs\*.TDS      Del .OBJs\*.TDS
@If Exist .OBJs\*.Bc       Del .OBJs\*.bc
@If Exist .OBJs\*.C        Del .OBJs\*.C
@If Exist .OBJs\*.HC       Del .OBJs\*.HC

IF EXIST WINORCAM.exe DEL WINORCAM.exe

SET PATH=C:\BCC74\BIN;C:\HBBCC74\BIN

@C:\BCC74\BIN\BRC32.Exe -R XPLOOK.RC

hbmk2.exe WINORCAM.hbp -rebuild -comp=bcc %* > Erro.log 2> ERROS.LOG

Echo * Aplicacao Foi Desenvolvida Com Sucesso Usando HBMK2.exe
Echo .

@REM Compactador de .EXE
@C:\PECOMPACT\PEC2 /NB /EMP:Y /TM:Y /CR:Y /MC WINORCAM.EXE

@WINORCAM.EXE


Many thanks.

Abs.
Kapiaba
Colaborador

Colaborador
 
Mensagens: 1765
Data de registro: 07 Dez 2012 15:14
Cidade/Estado: São Paulo
Curtiu: 310 vezes
Mens.Curtidas: 119 vezes

Compilando HELLO.PRG com HBMK2.exe e HARBOUR.

Mensagempor Kapiaba » 30 Nov 2021 15:02

Mister Quintas,

WINORCAM.hbp Final:

# $Id: WINORCAM.hbp $

# Nome do arquivo gerado (EXE,LIB,DLL)
-o.\WINORCAM

# DIRETORIO DOS TEMPORARIOS
-workdir=.\OBJs

# RODA O PROGRAMA GERADO. - Nao quero aqui. Chamo no GO.BAT
# -run

########## INICIO - MENU PRINCIPAL. #PRG # ------ MODULO PRINCIPAL -------

WINORCAM.PRG
ERRSYSW.PRG
DIALOG.PRG
CONTROL.PRG
MSGBAR.PRG
DSAY.PRG
SSAY.PRG
FUNCOES.PRG
PROPOSTA.PRG
CRIARDBF.PRG
REINDEXA.PRG
CADGRUPO.PRG
CADGPPAG.PRG
CADGPREF.PRG
CADGPLIM.PRG
CADOBLIM.PRG
CADOBREC.PRG
CADGPMAN.PRG
CADGPREC.PRG
CADGPVAS.PRG
CADGPMAO.PRG
CADGPPOD.PRG
CADGPFOR.PRG
CADFOROB.PRG
CADPODOB.PRG
CADGARAN.PRG
CADGARPL.PRG
PMSPOBS.PRG
RESPONSA.PRG
CADPAISA.PRG
CADORSER.PRG
CADFERRA.PRG
CADMANUT.PRG
CHAMADO.PRG
ORCAMENT.PRG
MICHIGAN.PRG
LIMPJARD.PRG
MANUJARD.PRG
MANUVASO.PRG
REMOCAO.PRG
RECOJARD.PRG
DUPLRECO.PRG
PESQPROD.PRG
PESQMAOB.PRG
IMPRECOJ.PRG
IMPORDEJ.PRG
GRAVAREC.PRG
APROVAR.PRG
CADNECES.PRG
PRODUNFE.PRG
ABERTURA.PRG
CADFABRI.PRG
FABRICAN.PRG
COMPRAS.PRG
RMAILAMB.PRG
AGENDA.PRG
OPERADOR.PRG
PRINTER.PRG
RPREVIEW.PRG
RCOLUMN.PRG
PCINFO.PRG
REDE.PRG
ALTTAB.PRG
NUM_CAPS.PRG
ANIMABMP.PRG
CALEND.PRG
TCALENDA.PRG
CALCULAD.PRG
PRV2PDF.PRG
DISPLAY.PRG
PBACKUP.PRG
TRADUTOR.PRG
PROC9995.PRG
PROC9996.PRG

########## RESOURCES - Perfeito com .RC ou .RES. Exemplo/Ejemplo:
#RC

# RES\PBACKUP.RC
# RES\IMAGENES.RC

########## PREFIRO USAR .RES - USO NO LOCAL DOS *.PRGs.
#RES

AMBIENTY.RES
AMBIENT2.RES
AMBIENT3.RES
AMBIENT4.RES
EMAILAMB.RES
IMAGENS.RES
IMAGENS2.RES
PBACKUP.RES
IMAGENES.RES
XPLOOK.RES

#flags

-inc
#-trace
#-static
-fullstatic
-beep
-nodefgt
-gtgui
-gui
-m -n -w2 -gc3 -q -ge1
-prgflag=/n /m /d__FLAT__
-resflag=-D__FLAT__

########## FIVEWIN SETUP

-Ic:\fwh1905\include
-Lc:\fwh1905\lib
-lfiveh
-lfivehc

#LIBRERIAS HARBOUR (se anaden las cabeceras .hbc)

hbct.hbc
xhb.hbc
hbziparc.hbc
hbfoxpro.hbc
hbwin.hbc
hbmzip.hbc
hbhpdf.hbc
hbtip.hbc

#LIBRERIAS DE TERCEROS - EJEMPLO:
#-Lc:\GestObras\lib
#-ljvchwin

# FIN / END


Super many thanks.

Regards, saludos.
Kapiaba
Colaborador

Colaborador
 
Mensagens: 1765
Data de registro: 07 Dez 2012 15:14
Cidade/Estado: São Paulo
Curtiu: 310 vezes
Mens.Curtidas: 119 vezes

Compilando HELLO.PRG com HBMK2.exe e HARBOUR.

Mensagempor JoséQuintas » 30 Nov 2021 17:23

O que eu uso aqui:

rem d:\tools\util\c.bat
D:\fontes\build\build.exe %*
...


E no build.exe, coloquei tudo que é checagem que eu achei que valeria a pena
/*
BUILD - PRE-COMPILACAO
José Quintas

2021.10.22 - ShellExecuteOpen() não STATIC pra atender errorsys
*/

// HB_USER_CFLAGS
// -Wno-null-dereference -Wno-cast-function-type -Wno-return-local-addr

ANNOUNCE HB_GTSYS
REQUEST errorsys

#include "directry.ch"

STATIC stErro := .F.

FUNCTION Main( ... )

   LOCAL aParams, aSignList := {}

   SetMode( 28, 90 )
   SetColor( "W/B" )
   aParams := hb_AParams()
   CheckGetEnv()
   CheckPath( @aSignList )
   checkHbmkHbc()
   CheckBuild()
   WriteBat( aParams, aSignList )
   AEval( Directory( "c:\temp\ze_resXML.*" ), { | e | fErase( "c:\temp\" + e[ F_NAME ] ) } )
   IF stErro
      Inkey(0)
   ENDIF

   RETURN Nil

STATIC FUNCTION WriteBat( aParams, aSignList )

   LOCAL oElement, cPath, cCmd := "", cBatFile := "d:\tools\util\c.bat", cFile

   cPath := Upper( hb_cwd() )
   IF ! Empty( aSignList )
      FOR EACH cFile IN aSignList
         cCmd += "call assina " + cFile + hb_Eol()
      NEXT
   ENDIF

   IF Len( aParams ) != 0 .AND. aParams[ 1 ] == "/cmd"
      hb_ADel( aParams, 1, .T. )
   ELSE
      IF AScan( aParams, { | e | e $ "|-w0|-w1|-w2|-w3|"  } ) == 0
         AAdd( aParams, "-w3" )
      ENDIF
      IF AScan( aParams, { | e | e $ "|-es0|-es1|-es2|" } ) == 0
         AAdd( aParams, "-es2" )
      ENDIF
      IF AScan( aParams, "-m" ) == 0
         AAdd( aParams, "-m" )
      ENDIF
      IF ASCan( aParams, "-n" ) == 0
         AAdd( aParams, "-n" )
      ENDIF
      IF Len( Directory( "*.hbp" ) ) != 0
         AAdd( aParams, "*.hbp" )
      ELSEIF Len( Directory( "*.prg" ) ) != 0
         AAdd( aParams, "*.prg" )
         AAdd( aParams, "*.rc" )
      ELSE
         ShowNormal( hb_cwd() )
      ENDIF
   ENDIF
   AAdd( aParams, "-strip" )
   AAdd( aParams, "-compr" )
   AAdd( aParams, "-workdir=c:\temp" )
   AAdd( aParams, "-q" )
   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; cCmd += "if exist ..\sjpa.exe call assina.bat ..\sjpa.exe" + hb_Eol()
   CASE "\HAROLDO\"  $ cPath; cCmd += "if exist hl.exe      call assina.bat hl.exe"      + hb_Eol()
   CASE "\BUILD\"    $ cPath; cCmd += "if exist build.exe   call assina.bat build.exe"   + hb_Eol()
   CASE "\INTEGRA\"  $ cPath; cCmd += "if exist jpa.exe     call assina.bat jpa.exe"     + hb_Eol()
   ENDCASE
   IF ! hb_DirExists( "c:\temp" )
      hb_DirCreate( "c:\temp" )
      ShowAlert( "Created c:\temp" )
   ENDIF
   //ShowNormal( "Atualizando " + cBatFile )
   hb_MemoWrit( cBatFile, cCmd )

   RETURN Nil

STATIC FUNCTION CheckHbmkHbc()

   LOCAL lUpdate := .F., cParam, cTxt := "", cFileHbmk, cPath
   LOCAL aParams := { ;
      "mt=yes", ;
      "gui=yes", ;
      "strip=yes", ;
      "fullstatic=yes", ;
      "{hbexe}compr=yes", ;
      "libpaths=d:/github/sefazclass", ;
      "libpaths=d:/fontes/integra/libjpa", ;
      "libpaths=d:/github/hwgui", ;
      "PRGFLAGS=-m -n -w3 -es2 -ge1 -DMT_EXPERIMENTAL -DLEGACY_LEVEL5" }
      //"{mingw}CFLAGS=" + ;
      //" -Wno-implicit-fallthrough" + ;
      //" -Wno-cast-function-type" + ;
      //" -Wno-misleading-indentation", ;

   cPath := CheckFileOnPath( "hbmk2.exe" )
   IF Empty( cPath )
      ShowAlert( "hbmk2.exe not found on PATH to check hbmk.hbc" )
      RETURN Nil
   ENDIF
   IF Right( cPath, 1 ) != "\"
      cPath += "\"
   ENDIF
   cFileHbmk := cPath + "hbmk.hbc"
   IF File( cFileHbmk )
      cTxt := MemoRead( cFileHbmk )
      IF Right( cTxt, 2 ) != hb_Eol()
         cTxt += hb_Eol()
      ENDIF
   ENDIF
   IF "xharbour" $ Lower( cPath  )
      AAdd( aParams, "-xhb" )
   ENDIF
   FOR EACH cParam IN aParams
      IF ! cParam $ cTxt
         cTxt += cParam + hb_Eol()
         ShowAlert( "hbmk.hbc adding " + cParam )
         stErro  := .T.
         lUpdate := .T.
      ENDIF
   NEXT
   IF lUpdate
      hb_MemoWrit( cFileHbmk, cTxt )
   ENDIF

   RETURN Nil

STATIC FUNCTION CheckGetEnv()

   LOCAL oElement
   LOCAL aList := { ;
      { "HB_BUILD_DYN",         "no" }, ;
      { "HB_BUILD_CONTRIB_DYN", "no" }, ;
      { "HB_BUILD_STRIP",       "all" }, ;
      { "HB_BUILD_SHARED",      "no" }, ;
      { "HB_COMPILER",          "mingw" }, ;
      { "HB_INSTALL_PREFIX",    "d:\harbour" }, ;
      { "HG_ROOT",              "d:\github\oohg" } }
      //{ "HB_BUILD_MODE",        "cpp" } }
//      { "HB_USER_CFLAGS",       "-Wno-null-dereference -Wno-cast-function-type -Wno-return-local-addr" }  }

   /*
   { "HB_WITH_ADS",          "no" }, ;
   { "HB_WITH_CURL",         "no" }, ;
   { "HB_WITH_CAIRO",        "no" }, ;
   { "HB_WITH_RABBITMQ",     "no" }, ;
   { "HB_WITH_FIREBIRD",     "no" }, ;
   { "HB_WITH_FREEIMAGE",    "no" }, ;
   { "HB_WITH_ICU",          "no" }, ;
   { "HB_WITH_GD",           "no" }, ;
   { "HB_WITH_GS",           "no" }, ;
   { "HB_WITH_LIBMAGIC",     "no" }, ;
   { "HB_WITH_MYSQL",        "no" }, ;
   { "HB_WITH_OPENSSL",      "no" }, ;
   { "HB_WITH_PGSQL",        "no" }, ;
   { "HB_WITH_OCILIB",       "no" } }
   */

   FOR EACH oElement IN aList
      IF GetEnv( oElement[ 1 ] ) != oElement[ 2 ] .OR. Empty( GetEnv( oElement[ 1 ]  ) )
         ShowAlert( "Not found SET " + oElement[ 1 ] + "=" + oElement[ 2 ] )
         ShellExecuteOpen( "setx", oElement[ 1 ] + " " + oElement[ 2 ],, 0 )
      ENDIF
   NEXT

   RETURN Nil

STATIC FUNCTION CheckPath( aSignList )

   LOCAL cFile, cPathFile, cPath, aPathList, cItem, lChanged := .F., cDefault

   aPathList := hb_RegExSplit( ";", GetEnv( "PATH" ) )
   FOR EACH cPath IN { "d:\harbour\bin", "d:\harbour\comp\mingw32\bin", "d:\harbour\comp\mingw64\bin", "d:\tools\util" } // "c:\msys64\mingw32\bin",
      IF ASCan( aPathList, { | e | Lower( cPath ) $ Lower( e ) } ) == 0
         ShowAlert( "Adding PATH " + cPath )
         AAdd( aPathList, cPath )
         lChanged := .T.
      ENDIF
   NEXT
   IF lChanged
      ShellExecuteOpen( "setx", "PATH ." )
      cDefault := GetEnv( "PATH" )
      cPath := ""
      FOR EACH cItem IN aPathList
         IF ! Lower( cItem ) + ";" $ Lower( cDefault + ";" + cPath + ";" )
            IF ! Empty( cPath )
               cPath += ";"
            ENDIF
            IF " " $ cItem
               cPath += ["] + cItem + ["]
            ELSE
               cPath += cItem
            ENDIF
         ENDIF
      NEXT
      ShellExecuteOpen( "setx", "PATH " + cPath )
   ENDIF

   FOR EACH cFile IN { "c.bat" }
      IF Empty( CheckFileOnPath( cFile ) )
         ShowAlert( cFile + " not in PATH" )
         ShowAlert( "Remember run build.exe from explorer, and re-open cmd window" )
      ENDIF
   NEXT
   FOR EACH cFile IN { "hbmk2.exe", "harbour.exe" } // "upx.exe", "mingw32-make.exe", "gcc.exe" }
      cPathFile := CheckFileOnPath( cFile )
      IF Empty( cPathFile )
         ShowAlert( cFile + " not in PATH" )
      ELSEIF ! TestExeAssinado( cPathFile + cFile )
         AAdd( aSignList, cPathFile + cFile )
         ShowAlert( cPathFile + cFile + " nao assinado" )
      ENDIF
   NEXT

   RETURN Nil

STATIC FUNCTION CheckFileOnPath( cFile )

   LOCAL cPath, cPathFile

   cFile := Lower( cFile )
   FOR EACH cPath IN hb_RegExSplit( ";", GetEnv( "PATH" ) )
      IF Right( cPath, 1 ) != "\"
         cPath := cPath + "\"
      ENDIF
      IF File( cPath + cFile )
         cPathFile := cPath
         EXIT
      ENDIF
   NEXT

   RETURN cPathFile

STATIC FUNCTION CheckBuild()

   LOCAL cDateTime, cTxt, cFileName, hSetup, cLastPath

   cFileName := hb_FNameDir( hb_ProgName() ) + hb_FNameName( hb_ProgName() )
   hSetup    := hb_JsonDecode( MemoRead( cFileName + ".json" ) )
   IF ValType( hSetup ) != "H"
      hSetup := hb_Hash()
   ENDIF
   IF ! hb_HHasKey( hSetup, "LastPath" )
      hb_HSet( hSetup, "LastPath", "" )
   ENDIF
   IF ! hb_HHasKey( hSetup, "TotalCount" )
      hb_HSet( hSetup, "TotalCount", 0 )
   ENDIF
   IF ! hb_HHasKey( hSetup, "YearCount" )
      hb_HSet( hSetup, "YearCount", 0 )
   ENDIF
   IF ! hb_HHasKey( hSetup, "MonthCount" )
      hb_HSet( hSetup, "MonthCount", 0 )
   ENDIF
   IF ! hb_HHasKey( hSetup, "DayCount" )
      hb_HSet( hSetup, "DayCount", 0 )
   ENDIF
   IF ! hb_HHasKey( hSetup, "LastBuildDate" )
      hb_HSet( hSetup, "LastBuildDate", Dtos( Date() ) )
   ENDIF

   cDateTime := Dtos( Date() ) + Substr( Time(), 1, 2 ) + Substr( Time(), 4, 2 )
   cLastPath := hSetup[ "LastPath" ]

   IF Day( Date() ) != Day( Stod( hSetup[ "LastBuildDate" ] ) )
      hSetup[ "DayCount" ] := 0
   ENDIF
   IF Month( Date() ) != Month( Stod( hSetup[ "LastBuildDate" ] ) )
      hSetup[ "MonthCount" ] := 0
   ENDIF
   IF Year( Date() ) != Year( Stod( hSetup[ "LastBuildDate" ] ) )
      hSetup[ "YearCount" ] := 0
   ENDIF
   hSetup[ "TotalCount" ] += 1
   hSetup[ "YearCount" ]  += 1
   hSetup[ "MonthCount" ] += 1
   hSetup[ "DayCount" ]   += 1
   hSetup[ "LastPath" ]   := hb_cwd()
   hSetup[ "LastBuildDate" ] := Dtos( Date() )

   hb_MemoWrit( cFileName + ".json", hb_JsonEncode( hSetup ) )

   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
   AEval( Directory( "*.upx" ), { | e | fErase( e[ F_NAME ] ) } )

   //ShowNormal( "Build atual " + cDateTime )

   RETURN Nil

STATIC FUNCTION DeleteContent( cFolder, lDeleteFolder )

   LOCAL oFiles, oFile, lDelete

   hb_Default( @lDeleteFolder, .F. )

   ShowNormal( "Delete on  " + cFolder )
   oFiles := Directory( cFolder + "\*.*", "D" )
   FOR EACH oFile IN oFiles
      IF "D" $ oFile[ F_ATTR ]
         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 ASCan( { ".PRG", ".DBF", ".CH", ".HBP", ".RC" }, { | e | e == Upper( hb_FNameExt( oFile[ F_NAME ] ) ) } ) != 0
            lDelete := .F.
         CASE oFile[ F_DATE ] != Date()
         CASE Left( oFile[ F_TIME ], 4 ) != Left( Time(), 4 )
         OTHERWISE
            lDelete := .F.
         ENDCASE
         IF lDelete
            ShowNormal( "Deleting " + cFolder + "\" + oFile[ F_NAME ] )
            fErase( cFolder + "\" + oFile[ F_NAME ] )
         ENDIF
      ENDIF
   NEXT
   IF lDeleteFolder .AND. Len( Directory( cFolder + "\*.*" ) ) == 0
      DirRemove( cFolder )
   ENDIF

   RETURN Nil

FUNCTION HB_GT_SYS()

   REQUEST HB_GT_WVG_DEFAULT

   RETURN Nil

FUNCTION AppVersaoExe()

   RETURN ""

FUNCTION AppUserName()

   RETURN ""

STATIC FUNCTION TestExeAssinado( cFileName )

   LOCAL oSignedCode, lOk := .F.

   BEGIN SEQUENCE WITH __BreakBlock()
      oSignedCode := win_OleCreateObject( "CAPICOM.SignedCode" )
      oSignedCode:FileName := cFileName
      oSignedCode:Verify()
      lOk := .T.
   ENDSEQUENCE
   IF ! lOk
      ShowAlert( "Not installed CAPICOM and/or EXE not signed" )
   ENDIF

   RETURN lOk

STATIC FUNCTION ShowNormal( cText )

   ? cText

   RETURN Nil

STATIC FUNCTION ShowAlert( cText )

   LOCAL cSetColor := SetColor( "N/GR*" )

   ? cText
   SetColor( cSetColor )
   stErro := .T.
   Inkey(2)

   RETURN Nil

FUNCTION ShellExecuteOpen( cFileName, cParameters, cPath, nShow )

   wapi_ShellExecute( Nil, "open", cFileName, cParameters, cPath, hb_DefaultValue( nShow, 1 ) )

   RETURN Nil

PROCEDURE HB_GTSYS

   REQUEST HB_GT_WVG_DEFAULT

   RETURN
   /*
   STATIC FUNCTION ShellExecuteRunAs( cFileName, cParameters, nShow )

   wapi_ShellExecute( Nil, "RunAs", cFileName, cParameters,, hb_DefaultValue( nShow, WIN_SW_SHOWNORMAL ) )

   RETURN Nil
   */
/*
dialog em resource com mingw
#include <afxres.h>
*/


Note que pelo programa:
- assino os EXEs que precisam ser assinados
- confiro e CRIO variáveis de ambiente
- confiro se os programas necessários estão no PATH
- confiro se HBMK2.EXE e HARBOUR.EXE estão assinados
- confiro se o harbour\bin\hbmk.hbc está criado e contém minha configuração default
- verifico se mudei de projeto/path de projeto, e apago \temp\*.*
- acrescento meus defaults de compilação
- procuro se a pasta tem HBP, se tiver mais de um já gera pra todos
- se não existir HBP, uso toda a pasta como compilação
- APAGO ARQUIVOS DE RESOURCE HARBOUR, porque o HBMK2 não consegue validar se teve alteração nisso
(aquilo de #pragma binarystreaminclude "arquivo.jpg" por exemplo)

Se eu pegar uma máquina zerada, é só rodar meu build.exe como administrador e ela fica pronta.
e pra compilar, digito C<ENTER>

pode aproveitar pra isso de usar o compilador de resource do borland c.

nota: no Borland C, se compilar .RES com nome repetido tudo bem, mas no mingw acusa erro e não deixa. De qualquer forma, é esquisito ter ícones com mesmo nome.... se não me engano na minigui isso acontece, ter ícone de impressora em mais de um RES.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Compilando HELLO.PRG com HBMK2.exe e HARBOUR.

Mensagempor JoséQuintas » 30 Nov 2021 17:37

No \harbour\bin\hbmk.hbc

mt=yes
gui=yes
strip=yes
fullstatic=yes
{hbexe}compr=yes
libpaths=d:/github/sefazclass
libpaths=d:/fontes/integra/libjpa
libpaths=d:/github/hwgui
PRGFLAGS=-m -n -w3 -es2 -ge1 -DMT_EXPERIMENTAL -DLEGACY_LEVEL5


E finalmente, no projeto
*.prg
*.c
libjpa/prg/*.prg
jpa.rc
toppetro/*.prg
topnfe/*.prg

-ojpa

###-winuni
-prgflag=-D__NO_LEGACY__

# Optimize build time and make sure we build even with this option
-cflag=-DWIN32_LEAN_AND_MEAN

-i.
-i..\build

## force libjpa
-Llibjpa
libjpa.hbc
-llibjpa

-Lsefazclass
sefazclass.hbc

gtwvg.hbc
#hwgui.hbc

hbct.hbc

-workdir=c:/temp
-m -n -w3 -es2 -q -ge1
-quiet
-inc
-strip
-mt
-compr


na sefazclass, deve saber
hbp

#
# sefazclass.hbp
#

sefazclass.hbc

-stop{!allwin}

hbhpdf.hbc
hbzebra.hbc
hbct.hbc
hbwin.hbc
-w3 -es2 -m -n -q

-hblib

-olib/${hb_plat}/${hb_comp}/sefazclass

-hbx=sefazclass.hbx

source/ze_atmseguroclass.prg
source/ze_sefazclass.prg
source/ze_sefazcapicom.prg
source/ze_sefazAssina.prg
source/ze_sefazAssinachk.prg
source/ze_sefazDaCte.prg
source/ze_sefazDaEvento.prg
source/ze_sefazDaMdfe.prg
source/ze_sefazDaNfe.prg
source/ze_sefazDaNFCe.prg
source/ze_sefazDadfe.prg
source/ze_sefazxmlclass.prg
source/ze_xmlfunc.prg
source/ze_miscfunc.prg
source/ze_xharbour.prg
source/ze_digitodoc.prg
source/ze_extenso.prg
source/ze_inscestadual.prg


hbc
#
# sefazclass.hbc
#

incpaths=include
{!hblib}libs=hbhpdf.hbc hbzebra.hbc hbwin.hbc
{!hblib}libs=sefazclass
libpaths=lib/${hb_plat}/${hb_comp}


Note acima, ! hblib, é pra só acrescentar as libs se NÃO FOR GERAÇÃO DE LIB
Se eu for criar a lib, eu não vou ter a lib criada, é óbvio, mas assim uso o HBC até pra criar a lib.
${hb_plat}\${hb_comp} é plataforma (win/linux) e compilador (bcc,bcc64,mingw,mingw64,etc), já gerar cada lib numa pasta conforme compilador

Também deixo umas variáveis fixas:
HB_COMPILER=mingw
HB_INSTALL_PREFIX=d:\harbour


É que meu mingw é 32/64 bits, então deixo o default como 32 bits, senão o hbmk2 vai pegar automaticamente 64 bits.
o HB_INSTALL_PREFIX é porque ainda existe dependência pra essa pasta de instalação do Harbour, no Harbour 3.2 e XHarbour isso faz mais diferença ainda - a preferências pra algumas coisas continuam sendo essa pasta.

Acabo padronizando minhas compilações ao usar build.exe e \harbour\bin\hbmk.hbc

Nota para o hbct.hbc: tem relatos no harbour-users disso causar problema, se não for a última coisa da lista, e aqui também já tive problema com isso.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Compilando HELLO.PRG com HBMK2.exe e HARBOUR.

Mensagempor JoséQuintas » 30 Nov 2021 17:42

Ah sim... o build.exe também gera o build.ch

#define JOSEQUINTAS_VERSAO    "2021.11.29.2106"
#define JOSEQUINTAS_VERSAO_RC  2021,11,29,2106


Isso é a versão usada no EXE, e também no arquivo de resource.
O próprio build já atualiza com data/hora.
O hbmk2 tem recurso pra isso, mas na época não era no meu formato.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Compilando HELLO.PRG com HBMK2.exe e HARBOUR.

Mensagempor Kapiaba » 02 Jan 2022 12:27

melhorando o GO.BAT

@ECHO OFF
@ECHO ON
@CLS

@If Exist .OBJs\*.OBJ      Del .OBJs\*.OBJ
@If Exist .OBJs\*.Map      Del .OBJs\*.Map
@If Exist .OBJs\*.TDS      Del .OBJs\*.TDS
@If Exist .OBJs\*.Bc       Del .OBJs\*.bc
@If Exist .OBJs\*.C        Del .OBJs\*.C
@If Exist .OBJs\*.HC       Del .OBJs\*.HC

IF EXIST WINORCAM.exe DEL WINORCAM.exe

Echo * Aguarde, Compilando com HBMK2.exe do Harbour.
Echo .

SET PATH=C:\BCC74\BIN;C:\HBBCC74\BIN;C:\UTIL

@C:\BCC74\BIN\BRC32.Exe -R XPLOOK.RC

hbmk2.exe WINORCAM.hbp -rebuild -comp=bcc %* > Erro.log 2> ERROS.LOG

@REM Compactador de .EXE
IF EXIST WINORCAM.exe @C:\PECOMPACT\PEC2 /NB /EMP:Y /TM:Y /CR:Y /MC WINORCAM.EXE

Echo .

IF EXIST WINORCAM.exe @Echo * Aplicacao Foi Desenvolvida Com Sucesso Usando HBMK2.exe

IF EXIST WINORCAM.exe @WINORCAM.EXE

GOTO EXIT

:LINKERROR

PAUSE * PROBLEMAS NA COMPILACAO: Veja o Arquivo: ERROS.LOG

GOTO EXIT

Echo .

:EXIT


Obg. abs.
Kapiaba
Colaborador

Colaborador
 
Mensagens: 1765
Data de registro: 07 Dez 2012 15:14
Cidade/Estado: São Paulo
Curtiu: 310 vezes
Mens.Curtidas: 119 vezes

Compilando HELLO.PRG com HBMK2.exe e HARBOUR.

Mensagempor JoséQuintas » 02 Jan 2022 12:52

Faça que nem eu, e crie um EXE intermediário com isso.
Só tente deixar meio genérico.

O meu BAT é C.BAT
d:\fontes\build\build.exe %*
dfsdfdssd
dfsdfsdfd


A função de build.exe é alterar as linhas seguintes do BAT pra chamar o HBMK2 usando parâmetros default.
O HBMK2 vai ser executado pelo BAT, sem qualquer programa na memória que possa interferir.
Pelo EXE pode colocar pra apagar esses temporários, definir uma pasta temporária default, parâmetros default, etc. etc.
Como faço backup dos fontes nas nuvens, o build.prg fica salvo também.
Isso vale pra qualquer compilação que eu faça aqui.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Compilando HELLO.PRG com HBMK2.exe e HARBOUR.

Mensagempor Kapiaba » 02 Jan 2022 16:18

Perdão mestre, tô meio "loira" hoje. Como seria esse BUILDX.EXE? FOR WINDOWS? MODO CONSOLE? Eu colcaria nele os Parâmetros do GO.BAT? Pode mostrar algo mais "pegável"? Se bem que a preguiça mental de inicio de ano está em todos os poros da minha alma. kkkkkkkkkkkkkkkkkk

Obg. abs.
Kapiaba
Colaborador

Colaborador
 
Mensagens: 1765
Data de registro: 07 Dez 2012 15:14
Cidade/Estado: São Paulo
Curtiu: 310 vezes
Mens.Curtidas: 119 vezes

Compilando HELLO.PRG com HBMK2.exe e HARBOUR.

Mensagempor JoséQuintas » 02 Jan 2022 22:35

Tá no post.
O BAT chama o EXE passando os parâmetros que recebeu.
o EXE chama o HBMK2 e acrescenta o que você costuma usar sempre.
Digamos c projeto.hbp

O EXE acrescenta -w3 -es2 -compress -workdir=c:\temp -comp=mingw e tudo mais que você costuma usar.
Se não passar nada, o EXE testa se temp HBP e chama *.HBP ou *.PRG, só um facilitador pra diminuir a parte burocrática.
Ao invés de ficar criando BAT pra cada projeto, o EXE substituiria todos os BATs, ficando só mesmo o HBP de cada projeto.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Compilando HELLO.PRG com HBMK2.exe e HARBOUR.

Mensagempor Kapiaba » 03 Jan 2022 09:50

Bom dia Mestre Quintas, fiz alguma modificações para adaptar ao FiveWin, mas algumas coisas, não me fez sentido. Dê uma olhadinha, por favor.

// \samples\buildh build

/*
BUILD - PRE-COMPILACAO
José Quintas

2021.10.22 - ShellExecuteOpen() não STATIC pra atender errorsys
*/

// HB_USER_CFLAGS
// -Wno-null-dereference -Wno-cast-function-type -Wno-return-local-addr

// ANNOUNCE HB_GTSYS // FiveWin, nao.

// REQUEST errorsys  // FiveWin, nao.

#include "FiveWin.ch"
#Include "directry.ch"

STATIC stErro := .F.

FUNCTION Main( ... )

   LOCAL aParams, aSignList := {}

   // Modo conolse - > FiveWin, nao suporta.
   // SetMode( 28, 90 )
   // SetColor( "W/B" )

   aParams := hb_AParams()

   CheckGetEnv()

   CheckPath( @aSignList )

   checkHbmkHbc()

   CheckBuild()

   WriteBat( aParams, aSignList )

   // ??? ze_resXML.*
   AEval( Directory( "c:\temp\ze_resXML.*" ), { | e | fErase( "c:\temp\" + e[ F_NAME ] ) } )

   IF stErro
      // Inkey(0)
      ? "What is this? <Enter>"
   ENDIF

RETURN Nil

STATIC FUNCTION WriteBat( aParams, aSignList )

   LOCAL oElement, cPath, cCmd := "", cBatFile := "d:\tools\util\c.bat", cFile

   cPath := Upper( hb_cwd() )

   IF .NOT. Empty( aSignList )

      FOR EACH cFile IN aSignList
         cCmd += "call assina " + cFile + hb_Eol()
      NEXT

   ENDIF

   IF Len( aParams ) != 0 .AND. aParams[ 1 ] == "/cmd"

      hb_ADel( aParams, 1, .T. )

   ELSE

      IF AScan( aParams, { | e | e $ "|-w0|-w1|-w2|-w3|"  } ) == 0
         AAdd( aParams, "-w3" )
      ENDIF

      IF AScan( aParams, { | e | e $ "|-es0|-es1|-es2|" } ) == 0
         AAdd( aParams, "-es2" )
      ENDIF

      IF AScan( aParams, "-m" ) == 0
         AAdd( aParams, "-m" )
      ENDIF

      IF ASCan( aParams, "-n" ) == 0
         AAdd( aParams, "-n" )
      ENDIF

      IF Len( Directory( "*.hbp" ) ) != 0
         AAdd( aParams, "*.hbp" )
      ELSEIF Len( Directory( "*.prg" ) ) != 0
         AAdd( aParams, "*.prg" )
         AAdd( aParams, "*.rc" )
      ELSE
         ShowNormal( hb_cwd() )
      ENDIF

   ENDIF

   AAdd( aParams, "-strip" )
   AAdd( aParams, "-compr" )
   AAdd( aParams, "-workdir=c:\temp" )
   AAdd( aParams, "-q" )
   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; cCmd += "if exist ..\sjpa.exe call assina.bat ..\sjpa.exe" + hb_Eol()

      CASE "\HAROLDO\"  $ cPath; cCmd += "if exist hl.exe      call assina.bat hl.exe"      + hb_Eol()

      CASE "\BUILD\"    $ cPath; cCmd += "if exist build.exe   call assina.bat build.exe"   + hb_Eol()

      CASE "\INTEGRA\"  $ cPath; cCmd += "if exist jpa.exe     call assina.bat jpa.exe"     + hb_Eol()

   ENDCASE

   IF .NOT. hb_DirExists( "c:\temp" )

      hb_DirCreate( "c:\temp" )

      ShowAlert( "Created c:\temp" )

   ENDIF

   //ShowNormal( "Atualizando " + cBatFile )
   hb_MemoWrit( cBatFile, cCmd )

RETURN Nil

STATIC FUNCTION CheckHbmkHbc()

   LOCAL lUpdate := .F., cParam, cTxt := "", cFileHbmk, cPath
   LOCAL aParams := { ;
      "mt=yes", ;
      "gui=yes", ;
      "strip=yes", ;
      "fullstatic=yes", ;
      "{hbexe}compr=yes", ;
      "libpaths=d:/github/sefazclass", ;
      "libpaths=d:/fontes/integra/libjpa", ;
      "libpaths=d:/github/hwgui", ;
      "PRGFLAGS=-m -n -w3 -es2 -ge1 -DMT_EXPERIMENTAL -DLEGACY_LEVEL5" }

   cPath := CheckFileOnPath( "hbmk2.exe" )

   IF Empty( cPath )

      cPath := "C:\HBBCC74\BIN"

      // ShowAlert( "hbmk2.exe not found on PATH to check hbmk.hbc" )

      MsgInfo( "170: HBMK2.exe Não Encontrado no PATH:  " +cPath+ ;
               " Para Verificar o HBMK.hbc",  "HBMK2.exe Não Encontrado" )

      RETURN Nil

   ENDIF

   IF Right( cPath, 1 ) != "\"
      cPath += "\"
   ENDIF

   cFileHbmk := cPath + "hbmk.hbc"

   IF File( cFileHbmk )

      cTxt := MemoRead( cFileHbmk )

      IF Right( cTxt, 2 ) != hb_Eol()

         cTxt += hb_Eol()

      ENDIF

   ENDIF

   IF "xharbour" $ Lower( cPath  )
      AAdd( aParams, "-xhb" )
   ENDIF

   FOR EACH cParam IN aParams

      IF .NOT. cParam $ cTxt

         cTxt += cParam + hb_Eol()

         ShowAlert( "hbmk.hbc adding " + cParam )

         stErro  := .T.
         lUpdate := .T.

      ENDIF

   NEXT

   IF lUpdate

      hb_MemoWrit( cFileHbmk, cTxt )

   ENDIF

RETURN Nil

STATIC FUNCTION CheckGetEnv()

   LOCAL oElement
   // ISTO AQUI NAO ME FAZ SENTIDO E NAO FUNCIONA
   LOCAL aList := { ;
      { "HB_BUILD_DYN",         "no" }, ;
      { "HB_BUILD_CONTRIB_DYN", "no" }, ;
      { "HB_BUILD_STRIP",       "all" }, ;
      { "HB_BUILD_SHARED",      "no" },  ;
      { "HB_COMPILER",          "BCC" }, ;
      { "HB_INSTALL_PREFIX",    "C:\HBBCC74" }, ;
      { "HG_ROOT",              "d:\github\oohg" } } //???

   /*
   { "HB_WITH_ADS",          "no" }, ;
   { "HB_WITH_CURL",         "no" }, ;
   { "HB_WITH_CAIRO",        "no" }, ;
   { "HB_WITH_RABBITMQ",     "no" }, ;
   { "HB_WITH_FIREBIRD",     "no" }, ;
   { "HB_WITH_FREEIMAGE",    "no" }, ;
   { "HB_WITH_ICU",          "no" }, ;
   { "HB_WITH_GD",           "no" }, ;
   { "HB_WITH_GS",           "no" }, ;
   { "HB_WITH_LIBMAGIC",     "no" }, ;
   { "HB_WITH_MYSQL",        "no" }, ;
   { "HB_WITH_OPENSSL",      "no" }, ;
   { "HB_WITH_PGSQL",        "no" }, ;
   { "HB_WITH_OCILIB",       "no" } }
   */

   FOR EACH oElement IN aList

      IF GetEnv( oElement[ 1 ] ) != oElement[ 2 ] .OR. Empty( GetEnv( oElement[ 1 ]  ) )

         ShowAlert( "256: Não Encontrado: SET " + oElement[ 1 ] + "=" + oElement[ 2 ] )

         ShellExecuteOpen( "setx", oElement[ 1 ] + " " + oElement[ 2 ],, 0 )

      ENDIF

   NEXT

RETURN Nil

STATIC FUNCTION CheckPath( aSignList )

   LOCAL cFile, cPathFile, cPath, aPathList, cItem, lChanged := .F., cDefault

   aPathList := hb_RegExSplit( ";", GetEnv( "PATH" ) )

   // Mudei em: 03/10/2022 - Joao
   // FOR EACH cPath IN { "d:\harbour\bin", "d:\harbour\comp\mingw32\bin", "d:\harbour\comp\mingw64\bin", "d:\tools\util" } // "c:\msys64\mingw32\bin",
   FOR EACH cPath IN { "C:\HBBCC74\bin" }

      IF ASCan( aPathList, { | e | Lower( cPath ) $ Lower( e ) } ) == 0

         ShowAlert( "Adicionando PATH: " + cPath )

         AAdd( aPathList, cPath )

         lChanged := .T.

      ENDIF

   NEXT

   IF lChanged

      ShellExecuteOpen( "setx", "PATH ." )

      cDefault := GetEnv( "PATH" )

      cPath := ""

      FOR EACH cItem IN aPathList

         IF .NOT. Lower( cItem ) + ";" $ Lower( cDefault + ";" + cPath + ";" )

            IF .NOT. Empty( cPath )

               cPath += ";"

            ENDIF

            IF " " $ cItem

               cPath += ["] + cItem + ["]

            ELSE

               cPath += cItem

            ENDIF

         ENDIF

      NEXT

      ShellExecuteOpen( "setx", "PATH " + cPath )

   ENDIF

   // FOR EACH cFile IN { "c.bat" }
   FOR EACH cFile IN { "GO.bat" }  // MUDEI EM: 03/10/2022 - Joao

      IF Empty( CheckFileOnPath( cFile ) )

         ShowAlert( cFile + " Não Encontrado no PATH." )

         // ShowAlert( "Remember run build.exe from explorer, and re-open cmd window" )

         ShowAlert ("Lembre-se de executar build.exe a partir do explorer e reabrir a janela cmd")

      ENDIF

   NEXT

   FOR EACH cFile IN { "hbmk2.exe", "harbour.exe" } // "upx.exe", "mingw32-make.exe", "gcc.exe" }

      cPathFile := CheckFileOnPath( cFile )

      IF Empty( cPathFile )

         ShowAlert( cFile + " Não Encontrado no PATH" )

      ELSEIF .NOT. TestExeAssinado( cPathFile + cFile )

         AAdd( aSignList, cPathFile + cFile )

         ShowAlert( cPathFile + cFile + " não assinado" )

      ENDIF

   NEXT

RETURN Nil

STATIC FUNCTION CheckFileOnPath( cFile )

   LOCAL cPath, cPathFile

   cFile := Lower( cFile )

   FOR EACH cPath IN hb_RegExSplit( ";", GetEnv( "PATH" ) )

      IF Right( cPath, 1 ) != "\"

         cPath := cPath + "\"

      ENDIF

      IF File( cPath + cFile )

         cPathFile := cPath

         EXIT

      ENDIF

   NEXT

RETURN cPathFile

STATIC FUNCTION CheckBuild()

   LOCAL cDateTime, cTxt, cFileName, hSetup, cLastPath

   cFileName := hb_FNameDir( hb_ProgName() ) + hb_FNameName( hb_ProgName() )

   hSetup    := hb_JsonDecode( MemoRead( cFileName + ".json" ) )

   IF ValType( hSetup ) != "H"
      hSetup := hb_Hash()
   ENDIF

   IF .NOT. hb_HHasKey( hSetup, "LastPath" )
      hb_HSet( hSetup, "LastPath", "" )
   ENDIF

   IF .NOT. hb_HHasKey( hSetup, "TotalCount" )
      hb_HSet( hSetup, "TotalCount", 0 )
   ENDIF

   IF .NOT. hb_HHasKey( hSetup, "YearCount" )
      hb_HSet( hSetup, "YearCount", 0 )
   ENDIF

   IF .NOT. hb_HHasKey( hSetup, "MonthCount" )
      hb_HSet( hSetup, "MonthCount", 0 )
   ENDIF

   IF .NOT. hb_HHasKey( hSetup, "DayCount" )
      hb_HSet( hSetup, "DayCount", 0 )
   ENDIF

   IF .NOT. hb_HHasKey( hSetup, "LastBuildDate" )
      hb_HSet( hSetup, "LastBuildDate", Dtos( Date() ) )
   ENDIF

   cDateTime := Dtos( Date() ) + Substr( Time(), 1, 2 ) + Substr( Time(), 4, 2 )
   cLastPath := hSetup[ "LastPath" ]

   IF Day( Date() ) != Day( Stod( hSetup[ "LastBuildDate" ] ) )
      hSetup[ "DayCount" ] := 0
   ENDIF

   IF Month( Date() ) != Month( Stod( hSetup[ "LastBuildDate" ] ) )
      hSetup[ "MonthCount" ] := 0
   ENDIF

   IF Year( Date() ) != Year( Stod( hSetup[ "LastBuildDate" ] ) )
      hSetup[ "YearCount" ] := 0
   ENDIF

   hSetup[ "TotalCount" ] += 1
   hSetup[ "YearCount" ]  += 1
   hSetup[ "MonthCount" ] += 1
   hSetup[ "DayCount" ]   += 1
   hSetup[ "LastPath" ]   := hb_cwd()
   hSetup[ "LastBuildDate" ] := Dtos( Date() )

   hb_MemoWrit( cFileName + ".json", hb_JsonEncode( hSetup ) )

   IF .NOT. Upper( cLastPath )  == Upper( hb_cwd() )

      DeleteContent( "c:\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

   // Nao uso, prefiro o PECOMPACT,exe
   AEval( Directory( "*.upx" ), { | e | fErase( e[ F_NAME ] ) } )

   //ShowNormal( "Build atual " + cDateTime )

RETURN Nil

STATIC FUNCTION DeleteContent( cFolder, lDeleteFolder )

   LOCAL oFiles, oFile, lDelete

   hb_Default( @lDeleteFolder, .F. )

   ShowNormal( "Apagar Folder em: " + cFolder )

   oFiles := Directory( cFolder + "\*.*", "D" )

   FOR EACH oFile IN oFiles

      IF "D" $ oFile[ F_ATTR ]

         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 ASCan( { ".PRG", ".DBF", ".CH", ".HBP", ".RC" }, { | e | e == Upper( hb_FNameExt( oFile[ F_NAME ] ) ) } ) != 0

               lDelete := .F.

            CASE oFile[ F_DATE ] != Date()

            CASE Left( oFile[ F_TIME ], 4 ) != Left( Time(), 4 )

         OTHERWISE

            lDelete := .F.

         ENDCASE

         IF lDelete

            ShowNormal( "Deletando o Folder: " + cFolder + "\" + oFile[ F_NAME ] )

            fErase( cFolder + "\" + oFile[ F_NAME ] )

         ENDIF

      ENDIF

   NEXT

   IF lDeleteFolder .AND. Len( Directory( cFolder + "\*.*" ) ) == 0

      DirRemove( cFolder )

   ENDIF

RETURN Nil

FUNCTION HB_GT_SYS()

   // REQUEST HB_GT_WVG_DEFAULT // FiveWin, nao. Deus me livre. kkkk

RETURN Nil

FUNCTION AppVersaoExe()  //???

RETURN ""

FUNCTION AppUserName() //???

RETURN ""

STATIC FUNCTION TestExeAssinado( cFileName )

   LOCAL oSignedCode, lOk := .F.

   BEGIN SEQUENCE WITH __BreakBlock()

      oSignedCode := win_OleCreateObject( "CAPICOM.SignedCode" )

      oSignedCode:FileName := cFileName

      oSignedCode:Verify()

      lOk := .T.

   ENDSEQUENCE

   IF .NOT. lOk  // who is this? nao preciso disso. Eu acho.

      ShowAlert( "Not installed CAPICOM and/or EXE not signed" )

   ENDIF

RETURN lOk

STATIC FUNCTION ShowNormal( cText )

   ? "Texto: ", cText

RETURN Nil

STATIC FUNCTION ShowAlert( cText )

   LOCAL cSetColor := SetColor( "N/GR*" )

   ? " Texto 2: ", cText

   // SetColor( cSetColor ) // modo console, nao uso.

   stErro := .T.

   // Inkey(2)  // Modo consele

RETURN Nil

FUNCTION ShellExecuteOpen( cFileName, cParameters, cPath, nShow )

   wapi_ShellExecute( Nil, "open", cFileName, cParameters, cPath, hb_DefaultValue( nShow, 1 ) )

RETURN Nil

PROCEDURE HB_GTSYS

   // REQUEST HB_GT_WVG_DEFAULT  // Fivewin, nao

RETURN NIL

// fin / end


Obg. abs.
Kapiaba
Colaborador

Colaborador
 
Mensagens: 1765
Data de registro: 07 Dez 2012 15:14
Cidade/Estado: São Paulo
Curtiu: 310 vezes
Mens.Curtidas: 119 vezes

Compilando HELLO.PRG com HBMK2.exe e HARBOUR.

Mensagempor JoséQuintas » 03 Jan 2022 11:20

O que estranhou:
Aí também tem parâmetros pra quando vai gerar o Harbour do zero, inclusive pra não deixar dependente de DLL.

-strip é mais para o mingw, isso elimina fonte extra de debug, que só deixa o EXE maior
-compress é pra chamar automaticamente o UPX pra compactar
-fullstatic é pra não deixar nada como DLL - aonde possível

O resto é conforme seu uso.

Então ele confere se tudo está no path, no meu caso confiro se os principais EXEs estão assinados porque conforme antivírus isso dá diferença de velocidade, cria um arquivo json de curiosidade com as quantidades de compilação por período, cria um arquivo que fornece a versão baseada na data/hora, adiciona os PATHS aonde tem as ferramentas, confere se tudo que precisa está no PATH, etc., e por fim grava no BAT o comando adicionando os parâmetros.

Costumo configurar o harbour\bin\HBMK.HBC com alguns defaults, ele confere isso também.

Além de ajudar a compilar, se eu pegar uma máquina ZERADA, sem configuração nenhuma, ele configura tudo pra mim.
Variáveis de ambiente e PATHs, mas pra mexer na máquina, o que só precisa uma vez, roda como administrador.
No dia a dia é como usuário comum, pelo bat.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Compilando HELLO.PRG com HBMK2.exe e HARBOUR.

Mensagempor Kapiaba » 03 Jan 2022 12:00

Master, estes caminhos(paths) não me fazem sentido, e não sei pelo que substituir em fivewin. Qualquer coisa, tô no skype. Abs.
Kapiaba
Colaborador

Colaborador
 
Mensagens: 1765
Data de registro: 07 Dez 2012 15:14
Cidade/Estado: São Paulo
Curtiu: 310 vezes
Mens.Curtidas: 119 vezes

Anterior Próximo



Retornar para FiveWin

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 13 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro