blob: 5e2aa015a1d01fb17c4c16e0f0ac800334ec6207 [file] [log] [blame]
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
= Verificação da Dependência de Make
:jbake-type: tutorial
:jbake-tags: tutorials
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Verificação da Dependência de Make - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Verificação da Dependência de Make
Contribuição de Alexey Vladykin
Março de 2014 [Número da revisão: V8.0-1]
Este tutorial mostra como ativar o NetBeans IDE para verificar as dependências do arquivo em seus projetos durante a criação. A verificação de dependência é executada pelo utilitário ``make`` por meio de instruções em ``Makefile`` .
image::images/netbeans-stamp-80-74-73.png[title="O conteúdo desta página se aplica ao NetBeans IDE 7.3, 7.4 e 8.0"]
== Requisitos
*Para seguir este tutorial, são necessários os recursos e o software a seguir.*
|===
|Software |Versão Necessária
|NetBeans IDE (incluindo o suporte ao C/C++) |link:https://netbeans.org/downloads/index.html[+versão 7.3, 7.4 ou 8.0 do NetBeans com o plug-in C/C+++]
|Java Development Kit (JDK) |link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+versão 7 ou 8+]
|===
Consulte as link:../../../community/releases/80/install.html[+Instruções de Instalação do NetBeans IDE+] e a link:../../../community/releases/80/cpp-setup-instructions.html[+ Configuração do NetBeans IDE para o C/C++/Fortran+]
para obter informações sobre o download e a instalação do software necessário.
== Introdução
Grandes projetos C/C++ consistem em milhares de arquivos. Por exemplo, o kernel Linux tem cerca de 20.000 arquivos. Se estiver desenvolvendo um projeto e quiser recriá-lo após uma pequena alteração, por exemplo, correção de uma linha, há duas opções.
* Recriação integral (ação Limpar e Construir). É menor, mas garante um resultado de construção consistente.
* Reconstrução incremental (ação Construir). É mais rápida, mas recriará corretamente tudo que deve ser recriado?
O maior problema da recriação incremental é a presença de diretivas ``#include`` , que incluem o conteúdo de um arquivo em outro arquivo. O arquivo incluído é conhecido como dependência de arquivo. A modificação do arquivo incluído deve ser tratada como modificação de todos os arquivos que o incluem. As inclusões indiretas (A inclui B, B inclui C => A inclui C) tornam o problema até mais difícil.
O NetBeans IDE suporta verificação automática das dependências do arquivo e faz seu melhor para tornar o trabalho de construção incremental correto. Se você alterar um arquivo do cabeçalho que estiver incluído em algum de seus arquivos de código-fonte e, em seguida, clicar em Construir, o IDE recriará somente estas partes do projeto que realmente dependem do cabeçalho alterado. Esta funcionalidade economiza tempo e garante resultados de construção consistentes.
=== Ativando a Verificação de Dependência de um Projeto
A verificação de dependência pode ser controlada para cada projeto específico. Talvez você queira certificar-se de que ela está ativada.
*Para ativar a verificação de dependência para um projeto:*
1. clique com o botão direito do mouse no projeto na janela Projetos e escolha Propriedades.
2. Na caixa de diálogo Propriedades do Projeto, selecione o nó Construir na lista Categorias.
3. Nas propriedades de construção, marque a caixa de seleção Ativar Verificação de Dependência de Make.
image::images/project-checkbox.png[]
=== Ativando a Verificação de Dependência por Default para Novos Projetos
Você pode definir um estado default para verificação de dependência, de forma que novos projetos que você criar sejam ativados automaticamente para verificação de dependência de make.
*Para ativar a verificação de dependência para todos os novos projetos criados no IDE:*
1. Escolha Ferramentas > Opções no menu principal do IDE.
2. Clique no botão C/C++ no painel superior.
3. Clique na guia Opções do Projeto.
4. Marque a caixa de seleção para Ativar verificação de dependência nos makefiles gerados
image::images/global-checkbox.png[]
=== Observações
* A verificação de dependência automática trabalha para projetos C/C++ que foram criados no IDE (projetos gerenciados). O IDE cria lógica de verificação de dependência para o ``Makefile`` gerado. Para projetos criados com os códigos-fonte existentes você pode contar com a lógica de verificação de dependência (se houver) no ``Makefile`` existente.
* A verificação de dependência requer suporte de sua coleção de ferramentas ( ``make`` e compiladores). Ela foi testada com a coleção de ferramentas do Oracle Solaris Studio e as coleções de ferramentas GNU, incluindo Cygwin e MinGW.
* A verificação de dependência funciona quando os compiladores do Oracle Solaris Studio são usados com o ``make`` do Oracle Solaris e quando os compiladores GNU são usados com ``gmake`` de GNU. A mistura de ``make`` do Oracle Solaris com os compiladores GNU e vice-versa não é suportada.
O restante do artigo é para os usuários avançados que querem saber o que acontece nos bastidores do IDE.
== Processo de Construção (make e makefiles)
O processo de construção de cada projeto C/C++ no NetBeans é descrito em um ``Makefile`` , um arquivo de formato especial conhecido pelo utilitário ``make`` . Quando você constrói ou limpa seu projeto do GUI, o IDE chama ``make`` , que executa o Makefile. Esta abordagem permite que você construa facilmente seu projeto fora do IDE usando ``make`` : vá para seu diretório de projeto e digite ``make help`` para obter instruções.
Os Makefiles usados pelo NetBeans IDE para um projeto C/C++ são mostrados abaixo.
image::images/makefiles.png[]
O ``Makefile`` mestre é gerado uma vez e você pode editá-lo manualmente. Os makefiles no diretório ``nbproject`` não são destinados para edição manual; eles são atualizados automaticamente pelo IDE. O arquivo ``Makefile-_CONF_.mk`` na ilustração representa vários arquivos para todas as configurações de seu projeto, como ``Makefile-Release.mk`` , ``Makefile-Debug.mk`` etc.
Para um projeto gerenciado, o IDE gera todos os makefiles e insere instruções adequadas para a verificação de dependência. Para um projeto criado dos códigos de origem existentes, a verificação de dependência funcionará só se o ``Makefile`` contiver tais instruções, porque o NetBeans IDE não altera o ``Makefile`` existente.
== Conceitos Básicos sobre a Geração de Dependência
Se quiser que o ``make`` verifique as dependências do arquivo incluídas durante a construção, então insira as informações de dependência no ``Makefile`` . Infelizmente não há nenhuma forma conveniente de fazer isso para todos os utilitários e compiladores de ``make`` . Primeiro, você deve detectar qual ``make`` está sendo executado e, em seguida, gerar as instruções de verificação de dependência correspondentes.
O ``make`` do Oracle Solaris tem uma solução muito simples. Uma regra especial ``.KEEP_STATE:`` no ``Makefile`` instrui ``make`` para consultar o compilador sobre as dependências de arquivo e as armazena em um arquivo temporário. Na próxima vez que o projeto for reconstruído, o ``make`` carrega esse arquivo temporário, analisa as dependências armazenadas lá e determina quais cabeçalhos foram alterados e quais arquivos de objetos devem ser recompilados.
Para ``make`` de GNU (chamado ``gmake`` ) a solução é muito mais complexa. Você deve solicitar explicitamente ao compilador para gerar as informações de dependência e, em seguida, incluí-la no ``Makefile`` . A ideia é informar flags especiais para o compilador, de forma que o compilador gere informações de dependência para cada arquivo do código-fonte compilado. Na próxima vez que o projeto for recriado, as informações de dependência serão coletadas e incluídas no ``Makefile`` .
== Implementação
O código a seguir é adicionado ao ``nbproject/Makefile-impl.mk`` . Ele detecta qual ``make`` está sendo executado e coloca o código de verificação de dependência correspondente no arquivo ``.dep.inc`` . O ``make`` de GNU detectou a presença da variável ``MAKE_VERSION`` . Se ``MAKE_VERSION`` não for definida, então as instruções específicas de ``make`` do Solaris são geradas.
[source,java]
----
# dependency checking support
.depcheck-impl:
@echo "# This code depends on make tool being used" >.dep.inc
@if [ -n "${MAKE_VERSION}" ]; then \
echo "DEPFILES=\$$(wildcard \$$(addsuffix .d, \$${OBJECTFILES}))" >>.dep.inc; \
echo "ifneq (\$${DEPFILES},)" >>.dep.inc; \
echo "include \$${DEPFILES}" >>.dep.inc; \
echo "endif" >>.dep.inc; \
else \
echo ".KEEP_STATE:" >>.dep.inc; \
echo ".KEEP_STATE_FILE:.make.state.\$${CONF}" >>.dep.inc; \
fi
----
O código a seguir é adicionado ao ``nbproject/Makefile-${CONF}.mk`` . Ele instruiu ``make`` para ler o ``.dep.inc`` gerado anteriormente e executa instruções dele.
[source,java]
----
# Enable dependency checking
.dep.inc: .depcheck-impl
include .dep.inc
----
A regra ``.dep.inc: .depcheck-impl`` é adicionada para evitar a falha de construção quando ``.dep.inc`` não existe. Há apenas um caso em que isso ocorre: quando você compila o arquivo único da janela Projetos. Neste caso, ``make`` executa o arquivo ``nbproject/Makefile-${CONF}.mk`` diretamente.
== Referências
1. link:http://en.wikipedia.org/wiki/Make_%28software%29[+Artigo da Wikipédia sobre ``make`` +]
2. link:http://make.paulandlesley.org/autodep.html[+Geração de Dependência Automática Avançada+]
== Consulte Também
Consulte a link:https://netbeans.org/kb/trails/cnd.html[+Trilha do Aprendizado C/C+++] para obter mais artigos sobre o desenvolvimento com C/C++/Fortran no NetBeans IDE.
link:mailto:users@cnd.netbeans.org?subject=Feedback:%20Make%20Dependency%20Checking%20-%20NetBeans%20IDE%208.0%20Tutorial[+Enviar Feedback neste Tutorial+]