Проверка зависимостей с помощью утилиты make

В этом практическом руководстве показано, как включить проверку зависимостей файлов при сборке проектов в IDE NetBeans. Проверка зависимостей выполняется утилитой make в соответствии с инструкциями в файле Makefile.

Содержание

Содержимое на этой странице применимо к IDE NetBeans 7.3, 7.4 и 8.0

Требования

Для работы с этим учебным курсом требуется следующее программное обеспечение и ресурсы.

Программное обеспечение Требуемая версия
IDE NetBeans (включая поддержку C/C++) версия 7.3, 7.4 или 8.0 с подключаемым модулем NetBeans C/C++
Комплект для разработчика на языке Java (JDK) версия 7 или 8

Дополнительные сведения о загрузке и установке необходимого программного обеспечения см. в разделах Инструкции по установке IDE NetBeans и Настройка IDE NetBeans для C/C++/Fortran
.

Введение

Крупные проекты C/C++ могут содержать тысячи файлов. Например, в ядре Linux насчитывается около 20 000 файлов. Если вы работаете над таким проектом и хотите пересобрать его после внесения небольшого изменения, например исправления в одной строке кода, у вас есть два варианта.

  • Полная повторная сборка (команда 'Очистить и собрать'). На выполнение этой команды затрачивается больше времени, но она гарантирует более стабильные результаты сборки.
  • Инкрементальная сборка (команда 'Собрать'). Эта команда выполняется быстрее, но сможет ли она корректно пересобрать все, что необходимо?

Главная проблема инкрементальной сборки заключается в наличии инструкций #include, которые используются для включения содержимого одного файла в другой файл. Включенный файл называется файловой зависимостью. Изменение включенного файла предполагает изменение всех файлов, в которые он включен. Опосредованные включения (A включает в себя B, B включает в себя C => A включает в себя C) создают еще более сложную проблему.

IDE NetBeans поддерживает автоматическую проверку файловых зависимостей для получения максимально корректных результатов повторной инкрементальной сборки. Если изменить файл заголовка, включенный в какой-либо другой исходный файл, и нажать кнопку 'Собрать', IDE пересоберет только те части проекта, которые находятся в зависимости от измененного заголовка. Эта функция позволяет сэкономить время и обеспечивает стабильные результаты сборки.

Включение проверки зависимостей для проекта

Проверку зависимостей можно включить для каждой отдельной части проекта. Проверка не всегда включена по умолчанию, и в этом следует убедиться.

Включение проверки зависимостей для проекта:

  1. Щелкните правой кнопкой мыши окно "Проекты" и выберите команду "Свойства".
  2. В диалоговом окне "Свойства проекта" выберите в списке "Категории" узел "Сборка".
  3. В свойствах сборки установите флажок 'Разрешить проверку зависимостей с помощью make'.

Флажок 'Проверка зависимостей с помощью make' в свойствах проекта

Включение проверки зависимостей по умолчанию для новых проектов

Для проверки зависимостей можно задать состояние по умолчанию, чтобы эта проверка автоматически включалась при создании новых проектов.

Включение проверки зависимостей для всех новых проектов, создаваемых в IDE:

  1. Выберите Сервис > Параметры в главном меню IDE.
  2. Нажмите кнопку 'C/C++' на верхней панели.
  3. Перейдите на вкладку 'Свойства проекта'.
  4. Установите флажок 'Включить проверку зависимостей в созданных файлах makefile'

Флажок 'Проверка зависимостей' в параметрах NetBeans

Примечания

  • Автоматическая проверка зависимостей работает в проектах 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++.

Файлы Makefile, используемые в NetBeans для проектов C/C++

Главный файл 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.

# 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 и выполнять инструкции из этого файла.

# Enable dependency checking
.dep.inc: .depcheck-impl

include .dep.inc

Правило .dep.inc: .depcheck-impl добавлено с целью предотвращения сбоя при сборке, если файл .dep.inc не существует. Это может произойти только в одном случае: при компиляции одиночного файла в окне 'Проекты'. В этом случае утилита make непосредственно исполняет файл nbproject/Makefile-${CONF}.mk.

Ссылки

  1. Статья об утилите make в Википедии
  2. Расширенные возможности создания автоматических зависимостей

См. также

Дополнительные статьи о разработке с помощью C/C++/Fortran в IDE NetBeans см. в разделе Учебные карты C/C++.

get support for the NetBeans

Support


By use of this website, you agree to the NetBeans Policies and Terms of Use. © 2015, Oracle Corporation and/or its affiliates. Sponsored by Oracle logo