# make-файлов из директорий johnpaul и georgeringo
.PHONY: hellobeatles
hellobeatles: johnpaul georgeringo
Чтобы собрать make
. Чтобы скопировать файлы make TARGET=install
. Чтобы очистить проект, введите make TARGET=clean
.
Подход к управлению сложными проектами, продемонстрированный в этом рецепте, известен как
Пример 1.23 — это прямое применение методик, продемонстрированных в рецептах 1.15, 1,16 и 1.17. В нем есть один очень интересный момент. Как показано в рецепте 1.15, при компиляции
hellobeatles.o: hellobeatles.cpp
g++ -с -I.. -о hellobeatles.o hellobeatles.cpp
Вместо этого я использовал точку настройки CPPFLAGS
, описанную в рецепте 1.15, и указал, что всегда, когда происходит компиляция объектного файла из файла
CPPFLAGS += -I..
Вместо оператора присвоения =
я использовал +=
, так что новое значение будет добавляться к тому значению CPPFLAGS
, которое могло быть указано в командной строке или в переменной среды.
Теперь давайте посмотрим на то, как работает пример 1.24. Наиболее важным правилом является то, которое заставляет
johnpaul georgeringo hellobeatles:
$(MAKE) --directory=$@ $(TARGET)
Чтобы понять это правило, вы должны знать три вещи. Во-первых, переменная MAKE
раскрывается как имя запущенного в данный момент экземпляра make
, но на некоторых системах это может быть gmake
. Во-вторых, опция командной строки <
в качестве текущей директории. В-третьих, правило с несколькими целями эквивалентно набору правил, каждое из которых имеет по одной цели и которые содержат одинаковые командные сценарии. Так что приведенное выше правило эквивалентно следующим.
johnpaul:
$(MAKE) --directory=$@ $(TARGET)
georgeringo:
$(MAKE) --directory=$@ $(TARGET)
hellobeatles:
$(MAKE) --directory=$@ $(TARGET)
В свою очередь это эквивалентно:
johnpaul:
$(MAKE) --directory=johnpaul $(TARGET)
georgeringo:
$(MAKE) --directory=georgeringo $(TARGET)
hellobeatles:
$(MAKE) -directory=hellobeatles $(TARGET)
Следовательно, эффект от этого правила состоит в вызове make-файлов в каждой из директорий TARGET
. В результате для сборки цели
в каждом из подчиненных make-файлов требуется выполнить главный make-файл с опцией TARGET=
.
Последнее правило make-файла гарантирует, что подчиненные make-файлы вызываются в правильном порядке; оно просто объявляет цель hellobeatles
, зависящую от целей johnpaul
и georgeringo
.
hellobeatles: johnpaul georgeringo
В более сложном приложении может иметься большое количество зависимостей между исполняемым файлом и входящими в него библиотеками. Для каждой такой компоненты требуется объявить правило, указывающее другие компоненты, от которых она явно зависит.
Рецепты 1.5, 1.10 и 1.13.
1.19. Определение макроса
Вы хотите определить символ препроцессора
, присвоив ему либо неопределенное значение, либо значение
.
Опции компилятора для определения макросов в командной строке показаны в табл. 1.16. Инструкции для определения макросов в IDE приведены в табл. 1.17. Чтобы определить макрос с помощью Boost.Build, просто добавьте в требования цели свойство вида <define>
, как показано в табл. 1.15 и примере 1.12.
Инструментарий |
---|