Makefile с несколькими правилами для создания одного файла - PullRequest
0 голосов
/ 12 декабря 2018

Я хотел бы создать Makefile с несколькими способами для создания файла:

.PHONY: app bin tgt

app file: app-dependency ; touch file

bin file: bin-dependency ; touch file

tgt: file ; touch tgt

Так, чтобы я мог запустить make tgt и в зависимости от того, присутствовал файл app-dependency или bin-dependencyбудет решать, какие целевые объекты запускать.

Когда я пишу что-то подобное, я получаю следующие предупреждения:

предупреждение: переопределение рецепта для целевого «файла»предупреждение: игнорирование старого рецепта для целевого «файла»

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Ваша спецификация не завершена на 100%, поэтому давайте придумаем, чего не хватает: если существует app-dependency, используйте app-rule, если существует bin-dependency, используйте bin-rule, иначе выведите ошибку.Если это не то, что вам нужно, отредактируйте ваш вопрос и попробуйте добавить недостающие биты спецификации.

Сделать условные выражения - это способ сделать то, что вы хотите:

.PHONY: app bin tgt

ifeq ($(wildcard app-dependency),app-dependency)

app file: app-dependency
    app-rule

else ifeq ($(wildcard bin-dependency),bin-dependency)

bin file: bin-dependency
    bin-rule

else

app bin file:
    $(error app-dependency and bin-dependency not found)

endif

tgt: file
    tgt-rule
0 голосов
/ 13 декабря 2018

Поскольку app, bin и tgt являются фальшивыми, зависимости все равно не будут использоваться, кроме как для предотвращения создания правила, если оно отсутствует.

У tgt нет способа узнать, какая версияфайла для сборки.Если файл создается одинаково как приложением, так и bin, то выделите его:

file: ; touch file
app: file ; ...
bin: file ; ...
tgt: file ; ...

Если приложение и bin создают разные версии файла, нет необходимости делать его целью.Tgt не будет знать, какой из них собрать в любом случае:

app: ; touch file
bin: ; touch file
tgt: file ; ...

Если подразумевается, что tgt должен собрать и приложение, и bin, если файл отсутствует (он действует как зависимость "или"), вы можете учестьэто из:

app: ; touch file
bin: ; touch file
file: app bin
tgt: file ; ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...