Diretiva de compilação

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Diretiva de compilação

Mensagem por asimoes »

Pessoal,

Passando uma diretiva de compilação -dTESTE tem como ver essa diretiva em uma lib?
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

Diretiva de compilação

Mensagem por bencz »

Uma definição de pre-processamento "-d" só tem como ser visualizada pelo compilador em momento de pré-processamento... se ela estiver definida o compilador processa, caso contrario, o compilador ignora...
Então, não, não é possivel ver se a definição "TESTE" está compilada e definida para a sua lib utilizando a opção de definição de pre-processamento.
Processos semelhantes são realizados com libs em C/C++, onde é gerada uma lib de debug, teste e release, para cada uma existe um define especifico...
"#if DEBUG"
"#elif TESTE"
"#else"
Imagem
marcosgambeta
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 16 Jun 2005 22:53

Diretiva de compilação

Mensagem por marcosgambeta »

asimoes escreveu:Passando uma diretiva de compilação -dTESTE tem como ver essa diretiva em uma lib?
É possível criar uma função que retorne um valor lógico, de forma que seja possível saber se uma diretiva está definida ou não:

Código: Selecionar todos

PROCEDURE Main ()

   ? DiretivaTesteDefinida()

RETURN

STATIC FUNCTION DiretivaTesteDefinida ()

#ifdef TESTE
RETURN .T.
#endif

RETURN .F.
Compile das duas formas abaixo:

Código: Selecionar todos

hbmk2 teste -DTESTE <ENTER>
teste <ENTER>
hbmk2 teste <ENTER>
teste <ENTER>
Não se se era exatamente isto que você queria, mas é assim que costumo fazer quando preciso.
Atenciosamente,
Marcos Antonio Gambeta
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20420
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

Diretiva de compilação

Mensagem por JoséQuintas »

Dependendo do que está querendo, poderia criar algo pra isso.
Exemplo:

Código: Selecionar todos

// Na LIB
IF LibAlgumNomeTeste()
...
ENDIF

FUNCTION LibAlgumNomeTeste( xNewValue )
   STATIC xValue := .F.
   IF xNewValue != NIL
      xValue := xNewValue
   ENDIF
   RETURN xNewValue
A partir daí, pode setar pelo programa principal: LibAlgumNomeTeste( .T. )
Incluindo colocar no programa principal uma opção de ativar/desativar teste.
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"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 do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Diretiva de compilação

Mensagem por asimoes »

Pessoal,

Eu acabei criando um recurso para essa necessidade:

A equipe responsável pela compilação em produção passa a diretiva -dPRODUCAO
As equipes de desenvolvimento não podem passar a diretiva acima, pois existe outros controles de verificação de ambiente de rede
então se alguém copiar o executável de produção da rede para o local (pc) não vai conseguir executá-lo.
O include ambientecomp.ch é obrigatório informar em todas as aplicações.

hbmk2 aplicacao -dPRODUCAO -rebuild
hbmk2 aplicacao -dDESENVOL -rebuild
hbmk2 aplicacao -rebuild

Aplicação

Código: Selecionar todos

#include "ambientecomp.ch"

Function Main

   VERCOMP()
   
Return Nil
ambientecomp.ch

Código: Selecionar todos

FUNCTION AMBIENTECOMP(cVarPar)
   #ifdef PRODUCAO
      cVarPar:="Versão Produção"
   #else
      cVarPar:="Versão Desenvolvimento"
   #endif
RETURN Nil
Lib

Código: Selecionar todos

FUNCTION VERCOMP
LOCAL cVar:=""
   Eval({||AmbienteComp(@cVar)}) //ambientecomp.ch
   If cVar = "Versão Produção"
      MsgInfo("Versão Produção")
   Else
      MsgInfo("Versão Desenvolvimento")
   Endif
RETURN Nil
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Euclides
Usuário Nível 3
Usuário Nível 3
Mensagens: 154
Registrado em: 12 Mai 2007 14:07
Localização: São Paulo, Capital

Diretiva de compilação

Mensagem por Euclides »

Olá pessoal,
desde ois tempos de Clipper eu fazia assim:

Código: Selecionar todos

#define aTst "Teste"
#define aPrd "Producao"
Function Main()
   ? ambiente
return nil
... e para compilar (no Harbour):
hbmk2 teste -dambiente=aTst // para teste
hbmk2 teste -dambiente=aPrd // para produção
É só isso:
T+ Euclides
Responder