compilando projetos delphi por linha de comando

8
Compilando projetos Delphi por linha de comando Neste artigo será demonstrada a utilização do compilador do Delphi por linha de comando Jeferson Oliveira TechTips.com.br

Upload: john-klaus-kanenberg

Post on 08-Jun-2015

3.623 views

Category:

Documents


3 download

DESCRIPTION

Neste artigo será demonstrada a utilização do compilador do Delphi por linha de comando: como acioná-lo manualmente, como automatizar a compilação de um projeto, e as diferentes possibilidades de configurações permitidas.

TRANSCRIPT

Page 1: Compilando projetos Delphi por linha de comando

Compilando projetos Delphipor linha de comando

Neste artigo será demonstrada a utilização do compilador do Delphi por linha de comando

Jeferson OliveiraTechTips.com.br

Page 2: Compilando projetos Delphi por linha de comando

Compilando projetos Delphi por linha de comando

- 2 -

Introdução

Neste artigo será demonstrada a utilização do compilador do Delphi por linha de comando:como acioná-lo manualmente, como automatizar a compilação de um projeto, e asdiferentes possibilidades de configurações permitidas.

Para os exemplos apresentados aqui será utilizado o Delphi 7, mas as mesmasconfigurações poderão ser utilizadas sem muitas alterações em qualquer versão do Delphi.

O problema

A compilação de um projeto precisa ser um processo rápido e eficiente. O tempo gasto paraabrir o IDE do Delphi, aguardar que ele esteja completamente carregado, abrir o projetoque precisa ser liberado, para só então dar início à compilação, será sempre maior do que otempo realmente necessário pelo compilador para a geração do arquivo final.

A solução

Para simplificar essa tarefa, tornando-a mais ágil e confiável, temos a possibilidade deacionar o compilador por linha de comando. Esse processo, se corretamente configurado,produzirá o mesmo resultado que seria obtido ao compilar o projeto pelo IDE do Delphi.

O compilador

O compilador do Delphi é o arquivo dcc32.exe que fica localizado em $(DELPHI)\Bin. Paralistar os parâmetros do compilador, basta digitar dcc32 no prompt de comando do Windows.

Nota: Se houver mais de uma versão do Delphi instalada nocomputador, digitar apenas dcc32 acionará a primeira versão docompilador encontrada na variável de ambiente “PATH” doWindows. Nesses casos, para acionar uma versão específica docompilador, indique o caminho completo do arquivo dcc32.exe.

Abaixo um exemplo das informações exibidas no prompt de comando ao executar odcc32.exe sem informar qualquer parâmetro:

C:\>dcc32Borland Delphi Version 15.0Copyright (c) 1983,2002 Borland Software Corporatio n

Syntax: dcc32 [options] filename [options]

-A<unit>=<alias> = Set unit alias -LU<package> = Use package -B = Build all units -M = Make modi fied units -CC = Console target -N<path> = DCU output directory -CG = GUI target -O<paths> = Ob ject directories -D<syms> = Define conditionals -P = look for 8.3 file names also -E<path> = EXE output directory -Q = Quiet com pile -F<offset> = Find error -R<paths> = Re source directories -GD = Detailed map file -U<paths> = Un it directories -GP = Map file with publics -V = Debug inf ormation in EXE -GS = Map file with segments -VR = Generate remote debug (RSM) -H = Output hint messages -W = Output wa rning messages -I<paths> = Include directories -Z = Output 'n ever build' DCPs -J = Generate .obj file -$<dir> = Comp iler directive -JP = Generate C++ .obj file --help = Show this help screen -K<addr> = Set image base addr --version = Sh ow name and version

Page 3: Compilando projetos Delphi por linha de comando

Compilando projetos Delphi por linha de comando

- 3 -

Compiler switches: -$<letter><state> (defaults are shown below) A8 Aligned record fields P+ Open stri ng params B- Full boolean Evaluation Q- Integer o verflow checking C+ Evaluate assertions at runtime R- Range che cking D+ Debug information T- Typed @ o perator G+ Use imported data references U- Pentium(t m)-safe divide H+ Use long strings by default V+ Strict va r-strings I+ I/O checking W- Generate stack frames J- Writeable structured consts X+ Extended syntax L+ Local debug symbols Y+ Symbol re ference info M- Runtime type info Z1 Minimum s ize of enum types O+ Optimization

Todos os parâmetros do compilador devem ser precedidos por hífen (-) ou por barra (/).

Entre os diversos parâmetros existentes, os mais relevantes para nosso exemplo são:

B: Indica que deverão ser compiladas todas as units do projeto. É equivalente à opção“Build” disponível no menu “Projects” do Delphi;

H: Habilita (-H+) ou desabilita (-H-) a exibição de hints.

Q: será realizada uma compilação silenciosa, não emitindo informações sobre todos osarquivos processados pelo compilador. Hints, warnings e erros serão exibidos normalmente.

R: Lista de diretórios nos quais o compilador irá buscar por arquivos de recursos (.RC,.RES) utilizados no projeto;

U: Lista de diretórios nos quais o compilador irá procurar arquivos .PAS ou .DCU utilizadosno projeto;

W: Habilita (-W+) ou desabilita (-W-) a exibição de mensagens do compilador. Parahabilitar ou desabilitar um alerta específico, basta citar os alertas após o parâmetro,precedidos de + ou -. Exemplo: -W-UNIT_PLATFORM +UNIT_DEPRECATED

Nota: Nos parâmetros que indicam diretórios, caso mais de umdiretório seja listado, eles deverão estar separados por ponto evírgula (;).

Nosso projeto de exemplo

Vamos criar um novo projeto, que não fará nada além de produzir algumas situações quenos permitirão tirar proveito dos recursos do compilador. No Delphi 7 acesseFile/New/Aplication. Adicione ao form um TFileListBox e um TButton. No evento OnClick dobotão, defina o código abaixo:

procedure TfrmPrincipal.btnFazNadaClick(Sender: TObject);var i: Integer; s: string;begin s := 'alo mamae'; ShowMessage(s);end;

Salve a unit como Principal.pas, salve o projeto como Compila.dpr e defina a propriedadeName do form como frmPrincipal.

Page 4: Compilando projetos Delphi por linha de comando

Compilando projetos Delphi por linha de comando

- 4 -

Compilação manual

Vamos então começar o uso do compilador. Inicie o prompt de comando do Windows edigite o caminho do compilador seguido do caminho completo do arquivo DPR. Por exemplo:

C:\>dcc32 T:\ProjetoExemplo\Compila.dpr

Ao executar esse comando será retornado um erro, indicando que o arquivo Principal.dcunão foi encontrado. Esse erro ocorre porque nenhum Principal.pas nem Principal.dcu foramencontrados nos diretórios conhecidos pelo dcc32. Uma forma simples de evitar esseproblema é sempre iniciar a compilação a partir do diretório do projeto. Para isso bastaalterar o diretório corrente antes de executar o compilador. Como exemplificado abaixo:

C:\>T:T:\>cd ProjetoExemploT:\ProjetoExemplo>dcc32 Compila.dpr

Se tudo correu bem, nesse ponto a compilação foi executada sem erros, e o arquivoCompila.exe foi gerado corretamente. Porém, algumas mensagens foram exibidas pelocompilador:

Principal.pas(7) Warning: Unit 'FileCtrl' is specif ic to a platformPrincipal.pas(29) Hint: Variable 'i' is declared bu t never used inTfrmPrincipal.btnFazNadaClick'

Os hints foram exibidos porque nas propriedades do projeto a opção “Show hints” estámarcada, o que seria equivalente a passar o parâmetro /H+. Os hints são importantes, poisindicam situações que podem ser melhoradas no nosso código. Afinal, se a variável “s” nãoé utilizada em nenhum ponto do código, para quê declará-la? É possível desabilitar aexibição de hints passando o parâmetro /H-, mas a melhor forma mesmo de evitar essasmensagens é fazendo os ajustes necessários no seu código. No nosso caso vamos entãoremover a declaração da variável i, que é desnecessária.

Mas, para quem desenvolve somente aplicações para Windows, qual a relevância do alertaque indica que a unit FileCtrl é específica dessa plataforma? Nenhuma. Nesse caso, paradeixarmos o log enxuto, contendo apenas as mensagens realmente necessárias, podemosdesabilitar esse warning listando-o no parâmetro W. Como o arquivo Principal.dcu já seencontra no diretório e nenhuma alteração foi realizada em Principal.pas ele não precisaráser compilado novamente. Para forçar a compilação de todos os arquivos do projeto vamosinserir também o parâmetro B, que indica ao compilador que deve ser realizada umacompilação de todos os arquivos. O compilador exibe informações sobre cada arquivo sendocompilado. Se desejar omitir essas informações acrescente o parâmetro Q. Ficamos entãocom o seguinte comando:

T:\ProjetoExemplo>dcc32 -B Compila.dpr -Q -W-UNIT_P LATFORM

Nesse ponto a compilação deve ser executada sem qualquer dica ou alerta, ficando a saídaparecida com o exemplo abaixo:

Borland Delphi Version 15.0Copyright (c) 1983,2002 Borland Software Corporatio n52 lines, 0.20 seconds, 358352 bytes code, 7749 byt es data.

Automatizando a compilação

Já conseguimos compilar nosso projeto invocando manualmente o compilador pelo promptde comando. Mas, como o processo de compilação precisa ser repetido inúmeras vezes, aqualquer tempo, não seria conveniente a cada compilação digitarmos os comandos no

Page 5: Compilando projetos Delphi por linha de comando

Compilando projetos Delphi por linha de comando

- 5 -

prompt. Para automatizar esse processo, podemos criar um arquivo de script com oscomandos necessários. Crie um novo arquivo .CMD e insira nele os comandos. Segue oconteúdo do meu arquivo Compila.cmd:

@echo offset PRJ=Compila.dprset DRIVE_PRJ=T:set DIR_PRJ=ProjetoExemploset DIR_DELPHI=c:\Progra~1\Borland\Delphi7\Binset COMP_MSGS=-UNIT_PLATFORM

%DRIVE_PRJ%cd %DIR_PRJ%%DIR_DELPHI%\dcc32.exe -B %PRJ% -Q -W%COMP_MSGS%

Algumas variáveis foram criadas no arquivo para simplificar a manutenção dos comandos decompilação. Embora a definição dessas variáveis não seja indispensável para esse processo,seu uso é recomendável.

Agora temos uma forma automatizada de compilar nosso projeto, bastando para tantoexecutar o arquivo Compila.cmd, seja pelo prompt de comando, ou mesmo pelo WindowsExplorer.

Definindo os diretórios de componentes

Se utilizássemos em nosso projeto componentes de terceiros, os diretórios onde seencontram seus arquivos de recursos e units precisariam ser informados para o compilador.Para isso são disponibilizados os parâmetros R e U.

Se, por exemplo, utilizássemos um TJvFileListBox, que é um componente da JVCL, bastariaindicar os diretórios da JVCL em nosso arquivo. Como no exemplo abaixo:

@echo offset PRJ=Compila.dprset DRIVE_PRJ=T:set DIR_PRJ=ProjetoExemploset DIR_DELPHI=c:\Progra~1\Borland\Delphi7\Binset COMP_MSGS=-UNIT_PLATFORMset SEARCH_PATH=D:\Delphi\jcl\lib\d7;D:\Delphi\jvcl \lib\d7set RES_PATH=D:\Delphi\jvcl\resources

%DRIVE_PRJ%cd %DIR_PRJ%%DIR_DELPHI%\dcc32.exe -U%SEARCH_PATH% -R%RES_PATH% -B %PRJ% -Q -W%COMP_MSGS%

Configurações por projeto

Em alguns projetos é comum utilizarmos vários componentes de terceiros, habilitarmos oudesabilitarmos mensagens do compilador, entre tantas outras configurações que podem seralteradas com freqüência. Embora o nosso arquivo de script permita configurar todas essasopções atualizá-lo à cada mudança das configurações do projeto não será uma tarefa tãocômoda. Uma maneira mais simples de realizar essas configurações é através das opçõesdo projeto (menu Project/Options). As configurações alteradas pelas opções do projetoserão salvas nos arquivos Compila.cfg e Compila.res, que serão automaticamente lidos pelodcc32.exe.

Page 6: Compilando projetos Delphi por linha de comando

Compilando projetos Delphi por linha de comando

- 6 -

Nota: ao utilizar configurações personalizadas por projeto, nãose esqueça de adicionar os arquivos .CFG .RES ao controle deversão.

Vamos tirar proveito da facilidade das configurações visuais e organizar um pouco nossoprojeto. Crie os diretórios bin e dcu dentro do diretório do projeto. Nesses diretórios serãocolocados respectivamente o arquivo de saída do nosso projeto (.EXE, .DLL, etc.) e osarquivos .DCU. Para indicar ao compilador como usar esses diretórios acesse as opções doprojeto. Na aba “Directories/Conditionals” preencha os campos “Output directory” e “Unitoutput directory”.

No campo “Search path” indique os diretórios dos componentes utilizados no projeto.

Page 7: Compilando projetos Delphi por linha de comando

Compilando projetos Delphi por linha de comando

- 7 -

Caso no projeto sejam utilizadas diretivas de compilação, bastaria indicá-las no campo“Conditional defines”.

Na aba “Compiler messages” certifique-se que as opções “Show hints” e “Show warnings”estejam selecionadas. Uma lista de warnings é exibida nessa aba, permitindo desabilitaraquelas que não são relevantes para o projeto.

Após concluir essas configurações não será mais necessário indicar no nosso arquivo descript os diretórios de recuros e de units, nem mesmo indicar os alertas que deverão serdesabilitados, o que reduzirá o conteúdo do arquivo:

@echo offset PRJ=Compila.dprset DRIVE_PRJ=T:set DIR_PRJ=ProjetoExemploset DIR_DELPHI=c:\Progra~1\Borland\Delphi7\Bin

%DRIVE_PRJ%cd %DIR_PRJ%%DIR_DELPHI%\dcc32.exe -B %PRJ% -Q

Configurações por máquina

Com a utilização do arquivo de configurações do projeto ganhamos a possibilidade derealizar uma edição visual das configurações da compilação.

Normalmente um build completo só é realizado na máquina de liberação de versão, o quefica a cargo do administrador do projeto, mas é possível que um projeto possua váriosdesenvolvedores, trabalhando cada um em sua máquina, ou mesmo trabalhandoremotamente, em ambientes diferentes, e seja necessário ou desejado que todos possamutilizar as mesmas configurações de compilação nos diversos ambientes. Nesses casos,utilizar um único arquivo de configuração por projeto exigirá que em todas as máquinas oscomponentes estejam instalados nos mesmos diretórios, ou ao menos estejam em umaestrutura de diretórios que possa ser referenciada por caminhos relativos. O que pode ser

Page 8: Compilando projetos Delphi por linha de comando

Compilando projetos Delphi por linha de comando

- 8 -

um problema se no projeto trabalharem desenvolvedores free-lancers. Uma forma decontornar esse problema é referenciando os componentes por diretórios virtuais, criadospelo comando subst no prompt de comando do Windows. Mas, ainda assim, seria necessárioque os mesmos diretórios virtuais fossem criados em todos os computadores. Outramaneira é utilizar configurações gerais por máquina.

Sempre que o compilador é acionado ele busca por configurações no arquivo dcc32.cfg quese encontra no mesmo diretório que o arquivo dcc32.exe, depois procura pelo arquivodcc32.cfg no diretório do projeto e, finalmente, pelo arquivo NomeDoProjeto.cfg, no nossocaso Compila.cfg, no diretório do projeto. Todas as configurações são consideradas, o quesignifica que podemos fazer uso de mais de um arquivo ao mesmo tempo. Para o problemacitado acima, onde cada máquina pode possuir configurações diferentes, os parâmetrosreferentes a diretórios componentes poderiam ser definidos em $(Delphi)\Bin\dcc32.cfg,pois podem variar por máquina, e as demais configurações que são gerais, como exibiçãode alertas, diretivas de compilação, e diretórios para geração de dcus e binários, poderiamser mantidas no arquivo de configuração do projeto.

O dcc32.cfg pode também ser utilizado para definir configurações e diretórios que seapliquem a todos os projetos utilizados em um determinado ambiente. Fazendo umaanalogia com o IDE do Delphi, os diretórios definidos no dcc32.cfg seriam equivalentesaqueles definidos no library path (Tools/Environment options/Library/Library path) tendo,portanto, visibilidade global, válida para todos os projetos; já os diretórios definidos emNomeDoProjeto.cfg são aqueles visíveis pelo Search path(Project/Options/Directories/Conditionals/Search path) e são específicas do projeto emquestão.

O arquivo dcc32.cfg deve ser editado manualmente. Para facilitar pode-se copiar o conteúdodo arquivo de configurações do projeto, mas a cada alteração em diretórios ele precisaráser atualizado novamente.

Recursos não disponíveis

Um recurso do qual você pode sentir falta ao utilizar o compilador por linha de comando é oincremento automático do número da versão do arquivo. Ainda que essa opção tenha sidoselecionada nas configurações do projeto, ela não terá efeito, pois não se trata de umafuncionalidade do compilador, mas sim do IDE do Delphi. Uma saída para continuarincrementando a versão do arquivo, seria desenvolver um utilitário com essafuncionalidade, e invocá-lo no arquivo de script, mas isso é assunto para outro artigo.

Considerações finais

Como vimos, a compilação de projetos por linha de comando é um recurso simples de serutilizado que pode nos auxiliar muito na padronização do processo de compilação eliberação de versões, tornando essa tarefa mais ágil e confiável.

Caso precise de uma automação completa do processo de liberação de versão, vale a penaconhecer algumas das ferramentas interessantes disponíveis atualmente para essafinalidade, entre as quais tem destaque a comercial FinalBuilder (http://www.finalbuilder.com/), eas gratuitas Rake (http://rake.rubyforge.org/) e MSBuild, sendo essa última a ferramenta padrãode build do Delphi2007.

Espero com esse artigo ter contribuído de alguma forma para a melhoria do seu processo decompilação.

Fonte.: http://www.techtips.com.br/programacao/delphi/ide/compilando-projetos-delphi-por-linha-de-comando/