Clipper On Line • Ver Tópico - Compilando/facilitando

Compilando/facilitando

Discussão sobre a linguagem CA-Clipper.

Moderador: Moderadores

 

Compilando/facilitando

Mensagempor JoséQuintas » 13 Jul 2019 02:26

Seria interessante um programa pra conferir toda configuração de sua máquina?
Ou pra compilar?
E porque ainda não fez?
Vai por parte, não queira tudo de uma vez.

Um recurso superinteressante, desde os tempos do DOS 3.0, é poder alterar o BAT que está sendo executado.
Até a IBM criou um menu que tirava vantagem disso.

Primeiro a pasta que será usada:
\tools\útil

porque tools? tools é ferramentas em inglês, um nome apropriado, e curto, poucas letras.
porque útil? porque vai conter utilitários variados e pequenos. UTIL=Utilitários

Aonde vai ficar esse programa de compilação?
Que tal \trabalho\compila ?
Faz parte de seus fontes de trabalho, e vai servir pra compilar.

primeiro o PATH
SET PATH=%PATH%;\tools\útil

depois o BAT, a linha depois do comando tanto faz:
\tools\útil\c.bat
@echo off
\trabalho\compila\compila.exe %*
xxx


Agora o programa:
//   \trabalho\compila\compila.prg
PROCEDURE Main

   LOCAL cTxt
 
   cTxt := "@echo off" + hb_Eol()
   cTxt += "rem \tools\útil\c.bat" + hb_Eol()
   cTxt += "\trabalho\compila\compila.exe %*" + hb_Eol()
   cTxt += "echo somente teste"
   MemoWrit( "\tools\útil\c.bat", cTxt )

   RETURN

FUNCTION hb_Eol() // se compilar com clipper

   RETURN Chr(13) + Chr(10)


compilar e linqueditar

Ao digitar C <ENTER>
Vai aparecer "somente teste"

porque?
porque o bat chamou o EXE, e o EXE regravou o BAT colocando como próximo comando o ECHO somente teste

Ok.
Agora temos um BAT, que chama o programa, que grava no BAT os comandos que quiser.
Porque não direto no EXE?
Porque o BAT vai ter toda memória disponível, e o EXE não, então podemos executar qualquer coisa com o 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/facilitando

Mensagempor JoséQuintas » 13 Jul 2019 02:45

Pra compilar, é bom relembrar "if not errorlevel 1"
Isso testa se tudo deu certo no comando anterior, antes de executar o próximo comando.
Também há a opção de usar arquivo .LNK, porque a linha de comando pode ser muito grande, e não ser aceita no prompt/bat

// \trabalho\compila\compila.prg
// compilar usando -n
#include "directry.ch"

PROCEDURE Main

   LOCAL cTxt, aList := {}, oFiles := {}, nCont, cFIleName
 
   cTxt := "@echo off" + hb_Eol()
   cTxt += "rem \tools\útil\c.bat" + hb_Eol()
   cTxt += "\trabalho\compila\compila.exe %*" + hb_Eol()
   cTxt += "echo somente teste"

   // pegar a lista
   oFiles := Directory( "*.prg" )
   FOR nCont = 1 TO Len( oFiles )
      cFileName := oFiles[ nCont, F_NAME ]
      cFileName := Substr( cFileName, 1, At( ".", cFileName ) - 1 ) // só o nome, sem o .prg
      AAdd( aList, cFileName )
   NEXT

   // gravar a compilação
   FOR nCont = 1 TO Len( aList )
      IF nCont != 1
         cTxt += "if not errorlevel 1 "
      ENDIF
      cTxt += "\tools\cl52\bin\clipper " + aList[ nCont ] + " -m -o\temp\" + hb_Eol()
   NEXT
   cTxt += "if not errorlevel 1 \tools\cl52\rtlink @\temp\link.lnk" + hb_Eol()
   MemoWrit( "\tools\útil\.c.bat" )

   // agora o arquivo lnk com a lista de arquivos/comandos para o linqueditor

   cTxt := ""
   FOR nCont = 1 TO Len( aList )
      cTxt += "file \temp\" + aList[ nCont ] + hb_Eol()
   NEXT
   MemoWrit( "\temp\link.lnk", cTxt )

   RETURN

FUNCTION hb_Eol() // se compilar com clipper

   RETURN Chr(13) + Chr(10)


Pronto.
O que vamos ter agora?
Em qualquer pasta, digitando C<ENTER> vão ser executados comandos pra compilar e linqueditar tudo dentro da pasta.
Não vamos pensar ainda na opção de compilar somente o que foi alterado, economizar mais tempo, etc.
A intenção é mostrar um programa que ajude no dia a dia, o "começo da brincadeira".
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/facilitando

Mensagempor JoséQuintas » 13 Jul 2019 02:54

Faltou dizer: o lixo dos temporários vai ficar em \temp\

Aí, começando a usar, notamos uma coisa: qual vai ser o nome do EXE?
Ué... vai ser o nome do primeiro fonte.... que pode ser qualquer um da pasta.
Isso não é bom... melhor seria pelo menos o primeiro nome em ordem alfabética.

Tudo bem... acrescentamos Asort( aList ) no nosso fonte.

Mas... faltaram as LIBs do Clipper....

Tudo bem... acrescentamos no nosso fonte, na parte que cria o arquivo LNK, mais comandos

cTxt += "LIB \tools\cl52\lib\clipper" + hb_Eol()
cTxt += "LIB \tools\cl52\lib\extend" + hb_Eol()
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/facilitando

Mensagempor JoséQuintas » 13 Jul 2019 02:59

Mas temos o SET PATH, SET INCLUDE, SET LIB, que poderiam estar configurados.....

Que tal o programa conferir?

IF Empty( GetEnv( "INCLUDE" ) )
    cTxt += "ECHO Faltou configurar SET INCLUDE" + hb_Eol()
ENDIF
IF Empty( GetEnv( "LIB" ) )
   cTxt += "ECHO Faltou configurar SET LIB" + hb_Eol()
ENDIF
IF Empty( GetEnv( "OBJ" ) )
   cTxt += "ECHO Faltou configurar SET OBJ" + hb_Eol()
ENDIF
cPath := GetEnv( "PATH" )
// este aqui vai precisar de mais fonte, pra analisar cada um dos PATHs em SET PATH, e confirmar se tem CLIPPER.EXE e RTLINK.EXE


Pronto.
Além de ter um programa pra facilitar compilação, ele ainda confere a configuração de nossa máquina.

E por aí vai...
É ir acrescentando nesse programa, tudo que pode facilitar nossa vida.
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/facilitando

Mensagempor JoséQuintas » 13 Jul 2019 03:08

Seria interessante ter um controle de versão.....
Que tal usar data/hora da compilação?

Uma função talvez?
Num arquivo.... z_versao.prg (o "z" é pra em ordem alfabética ficar no final)
FUNCTION AppVersaoExe()

   RETURN "201907130300"


Putz... mas toda hora alterar esse fonte? muito ruim.
Ué... vamos colocar no programa de compilação.

cTxt := ""
cTxt += "FUNCTION AppVersaoExe()" + hb_Eol()
cTxt += hb_Eol()
cTxt += [   RETURN "] + Dtos( Date() ) + Substr( Time(), 1, 2 ) + Substr( Time(), 4, 2 ) + ["] + hb_Eol()
MemoWrit( "z_versao.prg", cTxt )


Pronto.
Nosso "programinha" confere a configuração da máquina, compila qualquer pasta, e ainda gera número automático de versão.
Além de desviar todo lixo pra \temp\.

Numa máquina nova, basta rodar esse "programinha" e ele vai te avisar o que falta configurar.
Pode ser interessante, então, mostrar sobre essas coisas no EXE, e não no BAT, porque provavelmente o bat não vai existir.
Talvez até uma mensagem adicional no EXE:

? "se não acontecer nada depois desta mensagem, é porque não foi chamado por c.bat"


talvez até uma mensagem adicional no BAT:

if not exists \trabalho\compila\compila.exe echo não encontrado o programa compila.exe


Você é o programador, o computador é seu, a ferramenta é sua.
Melhore a ferramenta pra ela te ajudar cada vez mais.
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/facilitando

Mensagempor JoséQuintas » 13 Jul 2019 03:25

E que tal uma pra backup?
Qual o comando pra backup?
arj -a backup-2019-07-13-0300 trabalho\*.*

Então um programa pra facilitar isso:

PROCEDURE Main

   LOCAL cFileName

   cFileName := "\backup\backup-" + Transform( Dtos( Date() ), "@R 9999-99-99" ) + "-" + Substr( Time(), 1, 2 ) + Substr( Time(), 4, 2 )
   RUN ( "arj -a " + cFileName + " trabalho\*.*" )

  RETURN


Pronto. Simples, mas ajuda a não errar no nome.
Backup pra pasta \backup, e o nome contém data/hora, o que vai deixar os backups com nome único e auto-explicativo.
Se não funcionar no RUN, existe a opção de fazer igual ao programa de compilar.
E também existe a opção de colocar no iniciar do Windows, pra fazer automático sempre que ligar a máquina.
Ou no agendador de tarefas, pra executar uma vez por dia, ou depois da meia noite, ou qualquer outra opção.
Já não esqueceríamos de fazer backup todo dia.

mas pra que backup de EXE?
Tudo bem, depois de criar o compactado, eliminamos os EXEs de lá.
RUN ( "arj -d " + cFileName + " *.exe" )

Até que são coisas relativamente simples, mas extremamente úteis.
Quantas vezes não precisamos de alguma coisa assim?
Ué... somos programadores.... só esquecemos de trabalhar pra nós mesmos.... que também podemos usar programas pra facilitar a vida.
E tudo dando certo, podemos usar isso pra melhorar nas máquinas dos clientes também.

Vai ser muito backup..... muita tranqueira....
Ué... coloca no programa pra apagar os backups antigos, ou de determinadas datas, ou o critério que achar interessante.
Até mesmo testar se o espaço em disco está sendo pouco, ou se os backups estão ocupando muito espaço.
Coloca no programa pra controlar isso, e é menos trabalho pra você.

Vai ajustando os programas, testando, e pensando se dá pra facilitar mais seu trabalho com ferramentas adicionais.
De preferência, agrupando as ferramentas em poucos EXEs, pra não fugir do controle.
Talvez um programa com parâmetros.

programa BACKUP

PROCEDURE Main
   PARAMETERS cParametro

   DO CASE
   CASE PCount() == 0
      ? "Faltou indicar se quer BACKUP, ou sei lá mais o que"
   CASE cParametro == "BACKUP"
      RotinaBackup()
   ENDCASE


Pronto. Um programa multiuso, uma super-ferramenta.
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/facilitando

Mensagempor JoséQuintas » 13 Jul 2019 03:36

Faltou dizer:

Passaram-se anos... esqueceu como se compila e como se configura a máquina....
É só olhar o fonte da sua ferramenta, tá tudo lá.
Ou execute... ela sabe como é...

Vai treinar alguém....
Ensine essa pessoa a digitar C <ENTER>
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/facilitando

Mensagempor JoséQuintas » 13 Jul 2019 23:55

Eu uso algo assim no Harbour, um pré-hbmk2, que é executado antes do HBMK2.
Mas faltou indicar uma coisa importante:

Ao desviar tudo pra \temp\ existe uma complicação: todos os aplicativos compilados vão pra lá.
O perigo é.... dois aplicativos com mesmo nome de fonte, e misturar conteúdo dos dois aplicativos.

Relativamente simples de resolver...
No "nosso" gerenciador de compilação, é só salvar o último nome de pasta utilizado.
No Harbour seria hb_cwd(), e no Clipper vai o CurDir() mesmo

O teste será simples: if ! CurDir() == cPathAnterior, e se for diferente, limpar a pasta temp

Eu também coloquei pra limpar a cada 4 horas .
Se ficar trabalhando sempre no mesmo projeto, após 4 horas obrigatoriamente tudo será recompilado.

Isso são detalhes que fui percebendo com o tempo, e fui acrescentando nesse "gerenciador".

No Harbour também tenho isso, mas chamo o HBMK2 *.hbp se existir HBP na pasta, ou hbmk2 *.PRG se não existir hbp.
Também a limpeza da pasta \temp, o desvio de tudo pra pasta \temp, etc.
O conceito de compilação é o mesmo pra qualquer linguagem, seja Clipper ou Harbour ou outra, então os princípios podem ser usados pra todas.

Em linguagens novas a gente não vê isso, porque a IDE é que trata disso sem a gente perceber.

fugindo um pouco do Clipper/Harbour.... Na IDE do VB6 também dava pra perceber, olhando "por fora".
Era gerado um OBJ pra cada fonte/resource/form, e depois tudo era linqueditado no EXE e apagados os OBJs.
Na IDE não se via isso, só olhando a pasta durante o processo de compilação que dava pra ver arquivos aparecendo/sumindo.

Agora pra comparar fontes alterados, pra compilar somente o necessário....
seria pegar data/hora do PRG e comparar com data/hora do OBJ, e se o OBJ for mais velho que o PRG, sinal de que o fonte foi alterado e precisa ser recompilado.

Ainda tenho meu utilitário que usava no Clipper.
É só usá-lo.

O bom de usar a pasta como projeto, é que não se deixa fonte lixo nela.
Se quiser manter fonte lixo, vai ter que renomear de .prg pra outra coisa.

Uma coisa que sempre fiz foi adicionar pequenos PRG usados como quebra-galho no menu do aplicativo, aparecendo só na minha senha.
O legal disso é que acabam ficando sempre disponíveis, e vão ser úteis na próxima vez.
Se deixar largado na pasta... nem vai lembrar que aquilo existe, vai acabar virando lixo mesmo.
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/facilitando

Mensagempor JoséQuintas » 13 Jul 2019 23:57

JoséQuintas escreveu:Uma coisa que sempre fiz foi adicionar pequenos PRG usados como quebra-galho no menu do aplicativo, aparecendo só na minha senha.
O legal disso é que acabam ficando sempre disponíveis, e vão ser úteis na próxima vez.
Se deixar largado na pasta... nem vai lembrar que aquilo existe, vai acabar virando lixo mesmo.


menu no aplicativo atual:

teste.png
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/facilitando

Mensagempor JoséQuintas » 14 Jul 2019 13:40

Outra forma de facilitar....
Em programação... você não cria variáveis? não usa FOR/NEXT?
Em BAT também dá...

SET PRGLIST=MENU CADCLI CADFOR RELEST1 RELEST2
FOR %%A IN ( PRGLIST ) DO Clipper -m %%a
ECHO. > arquivo.lnk
FOR %%A IN ( PRGLIST ) DO ECHO FILE %%a >> arquivo.lnk
RTLINK @arquivo.lnk


cria variável
SET PRGLIST=MENU CADCLI CADFOR RELEST1 RELEST2

for/next pra cada nome, chamando clipper
FOR %%A IN ( PRGLIST ) DO Clipper -m %%a

zera o arquivo.lnk
ECHO. > arquivo.lnk

acrescenta cada nome no arquivo de linquedicao
FOR %%A IN ( PRGLIST ) DO ECHO FILE %%a >> arquivo.lnk

linquedita usando o arquivo lnk
RTLINK @arquivo.lnk

Também dá pra usar *.prg, existe uma opção no BAT de extrair o primeiro nome (sem a extensão .prg), mas não lembro de cabeça, porque não é uma coisa que uso todo dia. (lembrando que não daria pra usar no linqueditor menu.prg por exemplo)
Mas... somos programadores Clipper/Harbour, mais eficiente fazer por PRG.

Lembrando: o importante não é apenas agilizar, é entender como se faz, ou olhar o BAT e/ou PRG e enxergar como se compila.
É básico, então talvez melhor voltar às origens e decorar isso, talvez fazer primeiro centenas de vezes antes de pensar em agilizar, pra saber decorado como se faz.

Também é só lembrar do básico:
Você é programador. Clipper é um programa.
No seu programa... você chamaria passando parâmetros, e no Clipper também.
No seu programa... você poderia ter arquivo de configuração... no Clipper também.
No seu programa... você poderia considerar variáveis de ambiente (GetEnv)... no Clipper também
Então... são programas, não foi você quem fez, mas dá pra imaginar que eles devem ter recursos que você também usa (ou poderia usar).
Com base nisso... você volta a "usar a cabeça", passando a considerar tudo "normal".

Lembram que a gente fala: o usuário, se mudar alguma coisa de lugar, o usuário já não sabe mexer.
A gente até reclama disso... então não podemos fazer igual a um usuário desses.
Não falamos pro usuário: olha, se mostra que impressora deu erro, é porque tem problema com a impressora...
Então... na programação é igual... deu erro na tela, é olhar a que se refere o erro.
Tá em inglês? .... Ué... Clipper usa comandos em inglês... Harbour usa comandos em inglês... mensagens em inglês é relativamente normal... Não precisa aprender tudo, bastam as palavras comuns à programação.
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




Retornar para CA-Clipper

Quem está online

Usuários vendo este fórum: Google [Bot] e 4 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