blob: 258dc984df0626b1fb1d7b50bc49cac0024a854e [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.
//
= Проверка зависимостей с помощью утилиты make
:jbake-type: tutorial
:jbake-tags: tutorials
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Проверка зависимостей с помощью утилиты make - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Проверка зависимостей с помощью утилиты make
Составитель: Алексей Владыкин
Март 2014 г. [Номер версии: V8.0-1]
В этом практическом руководстве показано, как включить проверку зависимостей файлов при сборке проектов в IDE NetBeans. Проверка зависимостей выполняется утилитой ``make`` в соответствии с инструкциями в файле ``Makefile`` .
image::images/netbeans-stamp-80-74-73.png[title="Содержимое этой страницы применимо к IDE NetBeans 7.3, 7.4 и 8.0"]
== Требования
*Для работы с этим учебным курсом требуется следующее программное обеспечение и ресурсы.*
|===
|Программное обеспечение |Требуемая версия
|IDE NetBeans (включая поддержку C/C++) |link:https://netbeans.org/downloads/index.html[+версия 7.3, 7.4 или 8.0 с подключаемым модулем NetBeans C/C+++]
|Комплект для разработчика на языке Java (JDK) |link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+версия 7 или 8+]
|===
Дополнительные сведения о загрузке и установке необходимого программного обеспечения см. в разделах link:../../../community/releases/80/install.html[+Инструкции по установке IDE NetBeans+] и link:../../../community/releases/80/cpp-setup-instructions.html[+Настройка IDE NetBeans для C/C++/Fortran+]
.
== Введение
Крупные проекты C/C++ могут содержать тысячи файлов. Например, в ядре Linux насчитывается около 20 000 файлов. Если вы работаете над таким проектом и хотите пересобрать его после внесения небольшого изменения, например исправления в одной строке кода, у вас есть два варианта.
* Полная повторная сборка (команда 'Очистить и собрать'). На выполнение этой команды затрачивается больше времени, но она гарантирует более стабильные результаты сборки.
* Инкрементальная сборка (команда 'Собрать'). Эта команда выполняется быстрее, но сможет ли она корректно пересобрать все, что необходимо?
Главная проблема инкрементальной сборки заключается в наличии инструкций ``#include`` , которые используются для включения содержимого одного файла в другой файл. Включенный файл называется файловой зависимостью. Изменение включенного файла предполагает изменение всех файлов, в которые он включен. Опосредованные включения (A включает в себя B, B включает в себя C => A включает в себя C) создают еще более сложную проблему.
IDE NetBeans поддерживает автоматическую проверку файловых зависимостей для получения максимально корректных результатов повторной инкрементальной сборки. Если изменить файл заголовка, включенный в какой-либо другой исходный файл, и нажать кнопку 'Собрать', IDE пересоберет только те части проекта, которые находятся в зависимости от измененного заголовка. Эта функция позволяет сэкономить время и обеспечивает стабильные результаты сборки.
=== Включение проверки зависимостей для проекта
Проверку зависимостей можно включить для каждой отдельной части проекта. Проверка не всегда включена по умолчанию, и в этом следует убедиться.
*Включение проверки зависимостей для проекта:*
1. Щелкните правой кнопкой мыши окно "Проекты" и выберите команду "Свойства".
2. В диалоговом окне "Свойства проекта" выберите в списке "Категории" узел "Сборка".
3. В свойствах сборки установите флажок 'Разрешить проверку зависимостей с помощью make'.
image::images/project-checkbox.png[]
=== Включение проверки зависимостей по умолчанию для новых проектов
Для проверки зависимостей можно задать состояние по умолчанию, чтобы эта проверка автоматически включалась при создании новых проектов.
*Включение проверки зависимостей для всех новых проектов, создаваемых в IDE:*
1. Выберите Сервис > Параметры в главном меню IDE.
2. Нажмите кнопку 'C/C++' на верхней панели.
3. Перейдите на вкладку 'Свойства проекта'.
4. Установите флажок 'Включить проверку зависимостей в созданных файлах makefile'
image::images/global-checkbox.png[]
=== Примечания
* Автоматическая проверка зависимостей работает в проектах C/C++, созданных в IDE (управляемые проекты). Логика выполнения проверки зависимостей в IDE содержится в созданном файле ``Makefile`` . Для проектов, созданных на основе существующих исходных файлов, при проверке зависимостей используется существующий файл ``Makefile`` (при его наличии).
* Для проверки зависимостей требуется определенный набор средств (утилита ``make`` и компиляторы). Функция проверки зависимостей была протестирована с наборами средств Oracle Solaris Studio и GNU, в том числе Cygwin и MinGW.
* Проверка зависимостей работает, когда компиляторы Oracle Solaris Studio используются совместно с утилитой ``make`` для Oracle Solaris и когда компиляторы GNU используются с утилитой ``gmake`` для GNU. Совместное использование утилиты ``make`` для Oracle Solaris с компиляторами GNU и наоборот не поддерживается.
Последующая часть статьи предназначена для опытных пользователей, которых интересует, какие процессы происходят внутри IDE.
== Процесс сборки (утилита make и файлы makefile)
Процесс сборки каждого проекта C/C++ в NetBeans описывается в файле ``Makefile`` , имеющем специальный формат и обрабатываемом утилитой ``make`` . Когда в графическом интерфейсе выбирается команда сборки или очистки проекта, IDE вызывает утилиту ``make`` , которая исполняет файл Makefile. Такой подход позволяет с легкостью собирать проекты за пределами IDE с помощью утилиты ``make`` : достаточно перейти в каталог проекта, ввести команду ``make help`` и выполнить полученные инструкции.
Ниже приведены файлы Makefile, используемые в IDE NetBeans для проектов C/C++.
image::images/makefiles.png[]
Главный файл ``Makefile`` создается один раз, и его можно редактировать вручную. Файлы Makefile в каталоге ``nbproject`` не предназначены для редактирования вручную; они автоматически обновляются средой IDE. Файл ``Makefile-_CONF_.mk`` , показанный на иллюстрации, представляет собой множество файлов для всех конфигураций проекта, таких как ``Makefile-Release.mk`` , ``Makefile-Debug.mk`` и т.д.
Для управляемых проектов IDE создает все файлы makefile самостоятельно и включает в них соответствующие инструкции для проверки зависимостей. В проектах, созданных на основе существующих исходных файлов, проверка зависимостей работает, только если существующий файл ``Makefile`` содержит соответствующие инструкции. IDE NetBeans не вносит изменения в существующий файл ``Makefile`` .
== Основы создания зависимостей
Если требуется, чтобы утилита ``make`` проверяла зависимости включенных файлов при сборке, необходимо включить данные об этих зависимостях в файл ``Makefile`` . К сожалению, единого способа создания инструкций для всех утилит ``make`` и компиляторов не существует. Во-первых, следует проверить тип используемой утилиты ``make`` , а затем создать соответствующие инструкции для проверки зависимостей.
Утилита ``make`` для Oracle Solaris представляет собой очень простую программу. Специальное правило ``.KEEP_STATE:`` в файле ``Makefile`` заставляет утилиту ``make`` запрашивать файловые зависимости у компилятора и сохранять их во временном файле. При следующей повторной сборке проекта утилита ``make`` загружает этот временный файл, анализирует сохраненные в нем зависимости и определяет, какие заголовки были изменены и какие файлы объекта подлежат повторной сборке.
В основе утилиты ``make`` GNU ( ``gmake`` ) лежит более сложный механизм. В этом случае потребуется явно попросить компилятор создать данные о зависимостях и явно включить их в файл ``Makefile`` . Смысл заключается в том, что компилятору передаются специальные флаги, чтобы он создал данные о зависимостях для каждого скомпилированного исходного файла. При следующей повторной сборке проекта осуществляется сбор данных о зависимостях и их включение в файл ``Makefile`` .
== Реализация
В ``nbproject/Makefile-impl.mk`` добавляется следующий код. Он определяет тип утилиты ``make`` и помещает соответствующий код проверки зависимостей в файл ``.dep.inc`` . На присутствие утилиты ``make`` для GNU указывает переменная ``MAKE_VERSION`` . Если для переменной ``MAKE_VERSION`` не задано значение, создаются инструкции для утилиты ``make`` Solaris.
[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
----
В файл ``nbproject/Makefile-${CONF}.mk`` добавляется следующий код. Он заставляет утилиту ``make`` читать ранее созданный файл ``.dep.inc`` и выполнять инструкции из этого файла.
[source,java]
----
# Enable dependency checking
.dep.inc: .depcheck-impl
include .dep.inc
----
Правило ``.dep.inc: .depcheck-impl`` добавлено с целью предотвращения сбоя при сборке, если файл ``.dep.inc`` не существует. Это может произойти только в одном случае: при компиляции одиночного файла в окне 'Проекты'. В этом случае утилита ``make`` непосредственно исполняет файл ``nbproject/Makefile-${CONF}.mk`` .
== Ссылки
1. link:http://en.wikipedia.org/wiki/Make_%28software%29[+Статья об утилите ``make`` +] в Википедии
2. link:http://make.paulandlesley.org/autodep.html[+Расширенные возможности создания автоматических зависимостей+]
== См. также
Дополнительные статьи о разработке с помощью C/C++/Fortran в IDE NetBeans см. в разделе link:https://netbeans.org/kb/trails/cnd.html[+Учебные карты C/C+++].
link:mailto:users@cnd.netbeans.org?subject=Feedback:%20Make%20Dependency%20Checking%20-%20NetBeans%20IDE%208.0%20Tutorial[+Отправить отзыв по этому учебному курсу+]