Página 1 de 1

Diretiva de compilação

Enviado: 07 Ago 2015 17:42
por asimoes
Pessoal,

Passando uma diretiva de compilação -dTESTE tem como ver essa diretiva em uma lib?

Diretiva de compilação

Enviado: 09 Ago 2015 11:17
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"

Diretiva de compilação

Enviado: 09 Ago 2015 16:48
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.

Diretiva de compilação

Enviado: 09 Ago 2015 20:46
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.

Diretiva de compilação

Enviado: 10 Ago 2015 07:42
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

Diretiva de compilação

Enviado: 11 Ago 2015 09:09
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