sábado, 12 de novembro de 2011

Integração contínua - Compilar projeto delphi por linha de comando (dcc32)

Olá pessoal, tudo bem? Nessa série de posts sobre Integração Contínua, precisamos compilar nosso projeto de forma automatizada, para conseguir rodas os testes sempre com a última versão disponível do código fonte, e é sobre isso que vou falar hoje.

A partir do delphi 2007 há integração com msbuild, o que facilita muito a nossa vida, sem falar que no Delphi XE uma das ferramentas incluídas no pacote é o Final Builder, excelente ferramente de build automatizado. Infelizmente, muita gente ainda utiliza o delphi 7 (eu sou um deles) e nesse caso o trabalho é mais braçal. Esse post tem como foco aqueles que por algum motivo ainda utilizam - principalmente - o delphi 7.



Para compilar os projetos, é utilizado o dcc32.exe, que é o compilador que vem junto com o delphi e que o mesmo usa para compilar nossos projetos. Ele fica localizado na pasta $(Delphi)\bin. Se digitar dcc32 no prompt de comando, será listado os parâmetros existentes para o mesmo. Caso haja mais de uma versão do delphi instalado, é recomendado utilizar o caminho absoluto do compilador para garantir que está utilizando a versão correta.

Primeiro, vamos falar dos parâmetros mais importantes.

  • -B: Indica que serão compiladas todas as units do projeto, ou seja, é equivalente ao Build da IDE.
  • -Q: Executa uma compilação silenciosa. A compilação normal lista todas as units que estão sendo compiladas, na compilação silenciosa, apenas Hints, Warnings e erros serão exibidos.
  • -H: Habilita (-H+) ou desabilita (-H-) a exibição de hints.
  • -W: Habilita (-W+) ou desabilita (-W-) a exibição dos Warnings emitidos pelo compilador. Para habilitar ou desabilitar um warning específico, é preciso especificá-lo após o parâmetro, precedidos de + ou -. Exemplo: -W-SYMBOL_PLATFORM+UNIT_DEPRECATED
  • -R: Conjunto de diretórios onde o compilador irá buscar por arquivos de resources (.RC, .RES) utilizados no projeto;
  • -U: Conjunto de diretórios onde o compilador irá procurar os arquivos .PAS ou .DCU utilizados no projeto. Isso inclui os arquivos do projeto e as biblietecas externas.

Os diretórios passados no parâmetro devem ser estar separados por ponto e vírgula (;) e entre aspas duplas - para cada diretório - caso haja espaço em branco em alguma parte do caminho

Isso já é suficiente para compilar a maior parte dos projetos, então vamos por esse conhecimento em prática.

Primeiro, vamos criar um novo projeto que terá apenas fim didático para conhecer melhor os recursos do compilador. No form principal adicione um botão e dê a ele o nome de btnFacaAlgo e no evento OnClick insira o código abaixo:

procedure TFrm_Main.btnFacaAlgoClick(Sender: TObject);
var
  i: Integer;
  k: Integer; //Hint - variable never used
begin
  if (DebugHook <> 0) then; //Warning - Symbol specific to a platform

  while i < 10 do //Warning - variable not initialized
  begin
    Inc(i);
  end;
end;
Esse código produz dois Warnings e um Hint, e não faz absolutamente nada além disso. Salve o form principal como uMain.pas e o projeto como ExemploDcc32.dpr. Agora já podemos brincar com o compilador. Abra o prompt de comando e digite dcc32. Você deve ver uma saída como essa:
Pelo prompt, navegue até o diretório do projeto para não precisar digitar o caminho absoluto do projeto. Feito isso, vamos a nosso primeira tentativa de compilação:
>ExemploDCC32>dcc32.exe -b ExemploDCC32.dpr
Borland Delphi Version 15.0
Copyright (c) 1983,2002 Borland Software Corporation
uMain.pas(29) Warning: Symbol 'DebugHook' is specific to a platform
uMain.pas(31) Warning: Variable 'i' might not have been initialized
uMain.pas(27) Hint: Variable 'k' is declared but never used in 'TFrm_Main.btnFacaAlgoClick'
uMain.pas(38)
ExemploDCC32.dpr(16)
56 lines, 0.14 seconds, 314356 bytes code, 7433 bytes data.
>ExemploDCC32>
Como podem ver, foram listados dois warnings, um hint e os arquivos contidos no projeto, no caso, uMain e ExemploDCC32.dpr. É fácil imaginar que uma saída de console assim ficaria um tanto quanto poluída quando lidamos com um projeto grande, então, vamos dar uma enxugada nisso. Primeiro, vamos deixar de fora a listagem das units incluídas no projeto, pois não será relevante para o nosso caso, e para isso, vou incluir a diretiva -Q (Quiet Compile) na linha de comando.
>\ExemploDCC32>dcc32.exe -b ExemploDCC32.dpr -Q
Borland Delphi Version 15.0
Copyright (c) 1983,2002 Borland Software Corporation
uMain.pas(29) Warning: Symbol 'DebugHook' is specific to a platform
uMain.pas(31) Warning: Variable 'i' might not have been initialized
uMain.pas(27) Hint: Variable 'k' is declared but never used in 'TFrm_Main.btnFacaAlgoClick'
56 lines, 0.14 seconds, 314356 bytes code, 7433 bytes data.
>ExemploDCC32>
Já melhorou, mais ainda há muita informação, por exemplo, o alerta de que DebugHook é específico para uma plataforma não é relevante na maioria dos casos, pois a aplicações delphi em geral só rodam no windows de forma nativa(há opções como o Kylix e o Delphi XE2 que compila para iOS), então podemos tranquilamente desativar esse warning. Para isso, incluirei o parâmetro -W-DiretivaQueVouDesabilitar, no caso, "-W-Symbol_Platform".
>ExemploDCC32>dcc32.exe -b ExemploDCC32.dpr -Q -W-Symbol_Platform
Borland Delphi Version 15.0
Copyright (c) 1983,2002 Borland Software Corporation
uMain.pas(31) Warning: Variable 'i' might not have been initialized
uMain.pas(27) Hint: Variable 'k' is declared but never used in 'TFrm_Main.btnFacaAlgoClick'
56 lines, 0.14 seconds, 314356 bytes code, 7433 bytes data.
>ExemploDCC32>
Para desativar todos os warnings, bastaria o parâmetro "-W-".
>ExemploDCC32>dcc32.exe -b ExemploDCC32.dpr -Q -W-
Borland Delphi Version 15.0
Copyright (c) 1983,2002 Borland Software Corporation
uMain.pas(27) Hint: Variable 'k' is declared but never used in 'TFrm_Main.btnFacaAlgoClick'
56 lines, 0.14 seconds, 314356 bytes code, 7433 bytes data.
>ExemploDCC32>
Agora só restou o Hint, e também vamos desativar ela pois não vão agregar valor para o nosso objetivo. Como dito anteriormente, basta incluir o parâmetro "-H-", e veja-mos o resultado final.
>ExemploDCC32>dcc32.exe -b ExemploDCC32.dpr -Q -W- -H-
Borland Delphi Version 15.0
Copyright (c) 1983,2002 Borland Software Corporation
56 lines, 0.14 seconds, 314356 bytes code, 7433 bytes data.
>ExemploDCC32>

No próximo post, vamos fazer isso com um projeto que utiliza bibliotecas externas e explorar recursos mais avançados do compilador.

Até a próxima.

Nenhum comentário:

Postar um comentário