Página 1 de 1

Compilação Condicional

Enviado: 22 Jan 2010 11:46
por JefTookuni
Galera se alguém puder me ajudar ficaria muito agradecido;
Estou com o seguinte problema, converti um sistema de clipper para xharbour, no entranto era utilizado alguns parâmetros de compilação no rtlink, porém não consigo utilizá-los no hbmake. Haviam duas formas de compilação, cada uma com algumas configurações diferentes em saus definições, tenho o arquivo de linkagem .bc do hbmake com as definições padrão para as duas formas, porém não consigo passar mais nenhuma na compilação sem alterar esse arquivo (-D). Teria como fazer??

No fonte utilizava o seguinte:

#ifDef X (Padrão compilação tipo 1)
Configuracões
#endif

#ifdef Y (Padrão compilação tipo 2)
Comfigurações
#endif

#ifdef Z (Padrão compilação tipo 1e 2)
Configurações
#endif

Haveria como passar as definições sem alterar o arquivo de linkagem? ambos utilizam os mesmos programas, porém as configurações são diferentes.

Agradeço desde já

Re: Compilação Condicional

Enviado: 22 Jan 2010 15:31
por clodoaldomonteiro
Eu fiz a converssão, pois usara clipper + GAS.lib e ainda uso essas configurações.
Veja o q o manual do xHarbour comercial diz:

Código: Selecionar todos

#ifdef
Compiles a section of code depending on the presence of a #define constant. 
Syntax
#ifdef <constant>
  <statements1>
[ #else
  <statements2> ]
#endif

Arguments
<constant> 
This is the symbolic name of a #define constant. 
<statements1> .. <statements2> 
These are program statements to include or exclude in the preprocessor output. <statements1> is included when <constant> is defined. Otherwise, the statements following #else, if present, are included. Description
The #ifdef..#else..#endif directives are used for conditional compilation. They work similar to the IF..ELSE..ENDIF statements, but are resolved by the preprocessor, rather than the compiler. #ifdef tests if a #define constant exists. When the constant is defined, the statements following #ifdef are included in the preprocessor output. When the constant does not exist, the statements folowing #else, if present, are used. #endif closes the conditional compilation block. 
Info
See also: #define, #if, #ifndef, #undef 
Category: Preprocessor directives 

Example
// The example demonstrates how to implement an extended error
// checking in the DEBUG version of a program. When DEBUG is not
// defined, all ErrCheck() pseudo-functions are removed from
// the PRG code by the preprocessor.

   #define DEBUG

   #ifdef DEBUG
      #xtranslate ErrCheck(<errCond>,<msg>) => ;
         IF (<errCond>) ;;
            IF Alert( "Error:;"+<(msg)>,{"Continue","Ouit"}) <> 1 ;;
               QUIT ;;
            ENDIF ;;
         ENDIF
   #else
      #xtranslate ErrCheck(<errCond>,<msg>) =>
   #endif

   PROCEDURE Main( cParams )
      ErrCheck( Empty(cParams), "Command line params missing" )

      ? "Error check OK"
   RETURN


Re: Compilação Condicional

Enviado: 22 Jan 2010 15:38
por JefTookuni
Então continuo usando as diretivas poré eu as definia na compilação, agora me encontro com o problema pois se tento passar o parâmetro para o hbmake ele pede se vou alterar o arquivo .bc, eu queria encontrar uma forma de passar esse parâmetro pra ser definido sem ter que mexer com o arquivo .bc, pois versiono meus fontes. Na sua conversão como ficou?
Brigado pela ajuda :]

Re: Compilação Condicional

Enviado: 22 Jan 2010 18:58
por clodoaldomonteiro
Bom!
Eu não uso o HBMake pois no xDev Studio do Vailton já tem tudo.

Re: Compilação Condicional

Enviado: 22 Jan 2010 21:42
por sygecom
Já tentou com -D ? ex:
hbmake arquivo.bc -DX

Re: Compilação Condicional

Enviado: 25 Jan 2010 08:34
por JefTookuni
Então o problema ocorre porque no meu arquivo .bc ja tem as configurações e definições da compilação, quando atribuo o -D ele não executa nada de diferente, apenas quando eu mudo o arquivo .bc que obtenho resultado :s
Eu queria encontrar uma forma de passar esse valor sem alterar o arquivo .bc :s

Re: Compilação Condicional

Enviado: 25 Jan 2010 14:16
por rochinha
Amiguinho,

O arquivo .BC contém os parametros necessários para a compilação, neste caso para acrescentar mais um parametro, este deverá estar dentro do arquivo .BC.

Reconfigure o .BC para que já contenha o parâmetro requerido.

Re: Compilação Condicional

Enviado: 25 Jan 2010 14:21
por JefTookuni
A :/ intão sem lterá-lo, algo amis genérico não conseguirei fazer ? :s
bom tenho dois tipos de parâmetros a passar, qual seria a melhor solução? alterar todas as vezes ou deixar dois arquivos BC cada um com seus parâmetros?
Vlw a ajuda ai gente :]

Re: Compilação Condicional

Enviado: 25 Jan 2010 21:44
por rochinha
Amiguinho,

Não sei como funciona o HBMake mas assim como em um arquivo de lote que posso passar mais parametros ao compilar eu tenho algo assim:

%HBDIR%\BIN\\HARBOUR %1 -m -p %2 %3 %4

Veja que meu comando de lote já tem alguns parametros fixos e recebe mais alguns passados interativamente, portanto se eu quizer acrescentar mais um parametro e o mesmo é fixo então apenas acrescentarei assim:

%HBDIR%\BIN\\HARBOUR %1 -m -p %2 %3 %4 -o

Tenho pra mim que o HBMake é usado apenas para preparar o .BC inicial e este mesmo sera usado várias vezes.

Mas se quiser acrescentar mais um trecho ao .BC sem mexer no principal(se não houver como, o que acho dificil) voce pode usar a técnica de concatenação. Neste caso voce usará o seu .BC original somado ao .BC secundário gerando um .BC destino.

COPY arquivo.BC+arquivo.BC2 arquivo.BC3

Ai voce executa o .BC3 ao invés do .BC original.

Re: Compilação Condicional

Enviado: 26 Jan 2010 07:12
por asimoes
Olá,

Faça como eu fiz, você tem ai na sua máquina os fontes do xharbour, incluindo o hbmake, altere o hbmake.prg para sua necessidade fazendo com o seu .bc seja criado com os parâmetros que você precisa.

Eu fiz assim:

Copiei todos os fontes do hbmake pra uma pasta nova: \hbm renome-ei o hbmake.prg para hbm.prg, modifiquei o hbm.prg incluindo alguns parametros
que o hbmake original não faz, como o do seu caso, para gerar o script do jeito que eu precisava. A partir dai, os meus sistemas são compilados corretamente, sem precisar alterar o .bc

Não se esqueça que depois você vai ter que criar um hbm.bc com todos os fontes do hbmake para gerar o hbm.exe

[]´s

Re: Compilação Condicional

Enviado: 26 Jan 2010 11:37
por JefTookuni
Então tenho uma configuração de compilação para exibir erros, no caso um executável de teste, e outra configuração onde não exibe os erros, apenas encerra o programa. Poderia me explicar melhor sua solução asimoes ?
Brigadão ai gente, to vendo uma luz! lo/

Re: Compilação Condicional

Enviado: 26 Jan 2010 14:44
por asimoes
JefTookuni escreveu:Então tenho uma configuração de compilação para exibir erros, no caso um executável de teste, e outra configuração onde não exibe os erros, apenas encerra o programa. Poderia me explicar melhor sua solução asimoes ?
Explicando:

x = unidade onde está instalado o seu xharbour.

Hoje você usa o hbmake do xharbour que é gerado na compilação do xharbour e que está na pasta x:\xharbour\bin. Ok.
Os fontes do hbmake estão na pasta x:\xHarbour\utils\hbmake.

Para resolver o seu caso de forma não ter que modificar o seu programa.bc por fora, como segestão você irá criar o seu próprio hbmake com outro nome, por exemplo hbm.exe como explicado no post anterior.

[]´s

Re: Compilação Condicional

Enviado: 27 Jan 2010 10:53
por JefTookuni
Ai galera encontrei uma forma \o/
Pela ajuda que recebi o mínimo a fazer é compartilhar minha solução =]

Eu fiz o seguinte:
eu utilizava um .Bat para a compilação antes de migrar para o xharbour, nesse bat passava as definições e os parâmetros necessários.
Então no meu arquivo BC eu criei uma variável, assim como HB_DIR, eu criei uma variavel pois analisando o BC percebi que o mesmo pegava variáveis de ambiente, pensando dessa forma criei a variável e no meu bat, quando preciso de outra configuração eu defino a variável de ambiente, após a compilação eu cancelo a variável, mais ou menos assim :

Arquivo BC inseri a variável onde são feitas as definições :
HARBOURFLAGS = -Dsistema -Ddefinicao2 -D$(VARIAVEL_DEFINICAO) -b -m -w0

e no meu arquivo bat fiz o seeguinte:
se enviar a variavel de definção para o bat, ele executa o seguinte:
set VARIAVEL_DEFINICAO=configuracao
hbmake ARQUIVO.BC -f
set VARIAVEL_DEFINICAO=

Ai é criada a variavel com o valor que preciso, utilizo ela no BC depois a destruo.
Bom acho que fica como uma opção, pois só mudar a variavel passada para o BAT, sem alterar arquivo algum.
Vlw ai galera pela ajuda, espero que minha solução ajude.
abraços.