Как я могу использовать make для поддержки общего каталога заголовка C++?
Мой проект состоит из примерно дюжины компонентов и исходного кода для каждого из этих жизней в своем собственном подкаталоге в главном каталоге исходного кода. Многие из компонентов используют файлы заголовков из других компонентов, и я пытаюсь упорядочить вещи так, чтобы все эти файлы заголовков были доступны в одном include/
каталог. Остановите меня сейчас, если это плохая идея или если есть лучший способ сделать заголовки из одного компонента легко доступными для другого.
Достаточно просто скопировать заголовки компонента в include/
после сборки компонента: cp *.hpp ../include
в make-файле работает хорошо. Но когда make clean
выполняется на отдельном компоненте, я хочу удалить заголовки этого компонента из include/
без удаления каких-либо других. Насколько я могу судить, это означает, что я должен поддерживать список файлов заголовка компонента в команде "remove" в make-файле, например:
clean:
rm -fv ../include/header1.hpp ../include/header2.hpp ...
Ведение этого списка - ручная работа, которую я хотел бы автоматизировать. Я хочу сделать это правильно, потому что я ожидаю проблем, если компонент, который зависит от скопированного заголовка, будет создан до того, как новая версия того же заголовка будет скопирована на место - очень много времени для диагностики проблем.
Как я могу получить свой make-файл для очистки списка заголовков в отдельном каталоге? В качестве альтернативы, есть ли лучший способ сделать мои заголовочные файлы доступными для других компонентов в том же проекте?
2 ответа
В качестве альтернативы, есть ли лучший способ сделать мои заголовочные файлы доступными для других компонентов в том же проекте?
Есть два очевидных и простых способа:
- держать все заголовки в
include
реж в первую очередь - настроить
CPPFLAGS
для каждого компонента, чтобы сказать ему, где найти его зависимости.
Я бы рекомендовал первый подход для небольших, тесно связанных проектов. Второй подход лучше подходит для действительно компонентных систем, так как он заставляет задуматься о внутренних зависимостях в вашем проекте.
Копирование файлов и использование копий для создания других компонентов подвержено ошибкам независимо от того, как вы это делаете, вручную или нет. Ларсман предложил несколько альтернатив выше.
Но если вы хотите остаться с методом копирования при сборке, очистка через make может быть сделана так:
TO_COPY = $(wildcard *.hpp)
TO_REMOVE = $(patsubst %.hpp, ../include/%.hpp, $(TO_COPY))
Первая переменная будет содержать все файлы.hpp в текущем каталоге, вторая - те же файлы с ../include/
добавляется к каждому имени файла. Таким образом, вы можете скопировать файлы в папку include с помощью:
cp $(TO_COPY) ../include/
и удалите их в конце:
rm $(TO_REMOVE)