Лучший способ решить проблему - это избегать этого. Я не вижу абсолютно никакой причины перестраивать библиотеку, которая уже существует и чьи предварительные условия не изменились с момента ее последней сборки , Если по какой-то странной причине кто-то хочет убедиться, что временная метка библиотеки не раньше, чем у некоторого связанного файла документации, то лучшие альтернативы будут выполняться по аналогии с созданием отдельного процесса вокруг поддержки или распространения этого файла. Например,
touch
соответствующий исходный файл при каждом изменении файла документации; или - создайте документацию из соответствующего источника, например, с помощью Doxygen или подобного инструмента, так чтобы это был встроенный артефакт, который имеет те же предпосылки, что и библиотека; или
- управление метками времени как частью процесса установки / распространения, а не процесса сборки. Например, сделайте копию без сохранения метки времени перед установкой или распространением встроенных файлов, чтобы все файлы в копии были помечены меткой времени на момент копирования.
Но если вы должны подчиняться указаниям остроконечного босса, который не примет отталкивание, тогда ответ на реальный вопрос заключается в том, что make
не имеет какой-либо специальной переменной или оператора для обозначения подмножеств предварительных списков правил, но вы тем не менее есть много вариантов для написания рецепта соответственно. Затем речь пойдет о деталях рецепта правила.
Если начинать с
liba.so: a.o b.o c.o
$(archiver_command) $(archiver_options) a.o b.o c.o
, то можно добавить test.psm
в список предварительных условий без каких-либо других изменений.
Предположим, кто-то начинает с правила этой формы:
liba.so: a.o b.o c.o
$(archiver_command) $(archiver_options) $^
. В рецепте используется автоматическая c переменная $^
для ссылки на (весь) список предпосылок, поэтому, если добавить в качестве новой предпосылки test.psm
, он также будет включен, что вам не нужно. У вас есть несколько вариантов здесь, среди них
- Использование шелл-кода в рецепте для обработки списка необходимых компонентов и удаления последнего элемента. Это немного неприятно.
- Переписать рецепт в предыдущей форме с явным списком объектов в рецепте вместо переменной. Однако это несет дополнительную нагрузку на обслуживание.
- Назначьте real предварительные условия через пользовательскую переменную и используйте ее также в рецепте. Это может быть особенно естественно, учитывая тот факт, что уже существует такая переменная.
Последней альтернативой будет моя рекомендация. В частности, это будет выглядеть примерно так:
A_OBJS = a.o b.o c.o
# ...
liba.so: $(A_OBJS) test.psm
$(archiver_command) $(archiver_options) $(A_OBJS)