Как я могу использовать make для поддержки общего каталога заголовка C++?

Мой проект состоит из примерно дюжины компонентов и исходного кода для каждого из этих жизней в своем собственном подкаталоге в главном каталоге исходного кода. Многие из компонентов используют файлы заголовков из других компонентов, и я пытаюсь упорядочить вещи так, чтобы все эти файлы заголовков были доступны в одном include/ каталог. Остановите меня сейчас, если это плохая идея или если есть лучший способ сделать заголовки из одного компонента легко доступными для другого.

Достаточно просто скопировать заголовки компонента в include/ после сборки компонента: cp *.hpp ../include в make-файле работает хорошо. Но когда make clean выполняется на отдельном компоненте, я хочу удалить заголовки этого компонента из include/ без удаления каких-либо других. Насколько я могу судить, это означает, что я должен поддерживать список файлов заголовка компонента в команде "remove" в make-файле, например:

clean:
    rm -fv ../include/header1.hpp ../include/header2.hpp ...

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

Как я могу получить свой make-файл для очистки списка заголовков в отдельном каталоге? В качестве альтернативы, есть ли лучший способ сделать мои заголовочные файлы доступными для других компонентов в том же проекте?

2 ответа

Решение

В качестве альтернативы, есть ли лучший способ сделать мои заголовочные файлы доступными для других компонентов в том же проекте?

Есть два очевидных и простых способа:

  1. держать все заголовки в include реж в первую очередь
  2. настроить CPPFLAGS для каждого компонента, чтобы сказать ему, где найти его зависимости.

Я бы рекомендовал первый подход для небольших, тесно связанных проектов. Второй подход лучше подходит для действительно компонентных систем, так как он заставляет задуматься о внутренних зависимостях в вашем проекте.

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

Но если вы хотите остаться с методом копирования при сборке, очистка через make может быть сделана так:

TO_COPY = $(wildcard *.hpp)
TO_REMOVE = $(patsubst %.hpp, ../include/%.hpp, $(TO_COPY))

Первая переменная будет содержать все файлы.hpp в текущем каталоге, вторая - те же файлы с ../include/ добавляется к каждому имени файла. Таким образом, вы можете скопировать файлы в папку include с помощью:

cp $(TO_COPY) ../include/

и удалите их в конце:

rm $(TO_REMOVE)
Другие вопросы по тегам