| // |
| // 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[+Отправить отзыв по этому учебному курсу+] |