Как пропустить один из файлов зависимостей, чтобы не включать при создании целевой библиотеки - PullRequest
0 голосов
/ 18 февраля 2020

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

Например: -

liba.so: a.o b.o c.o test.psm
        <command for creating liba.so, which includes all its dependencies.> 

Здесь, когда есть изменение, любой из его зависимости я должен создать liba.so файл. Но файл .so должен включать только файлы .o, а не файл test.psm.

Будет выдано сообщение об ошибке при попытке создать файл .so с необъектным файлом.

Пожалуйста, помогите мне, как мы можем добиться этого с помощью GNUmake.

1 Ответ

0 голосов
/ 19 февраля 2020

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

  • 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)
...