Несколько правил для одной цели - PullRequest
2 голосов
/ 14 февраля 2020

У меня большой проект, и он по требованию компилируется на нескольких разных машинах с разными ОС. Одна из целей имеет foo.res в своих зависимостях. Этот файл ресурсов может быть скомпилирован с использованием одного из двух разных правил:

Первое правило требует наличия текстового файла foo.txt. Это правило также требует, чтобы в системе было установлено не кроссплатформенное программное обеспечение. Это правило не может использоваться нашими инженерами в полевых условиях, так как оно не работает под старой MacOS.

Второе правило использует предварительно скомпилированный файл ресурсов foo.res в каталоге ресурсов и просто копирует его в build/. Очевидно, что это нежелательный обходной путь, но у меня нет другого выбора.

Я пытался описать 2 правила в одном файле Makefile, но у меня есть такая ошибка:

Makefile:78: warning: overriding recipe for target 'build/foo.res'
Makefile:75: warning: ignoring old recipe for target 'build/foo.res'

В настоящее время Я использую Makefile с одним из закомментированных правил:

.PHONY: compile
build/app.bin: some_files... build/foo.res
    (Here is compiler call)

build/:
    -mkdir build/

.PHONY: clear
clear:
    -rm -rf ./build

... Lots of stuff here ...

# build/foo.res: res/foo.res | build/.
#     cp res/foo.res build/foo.res

build/foo.res: res/foo.txt | build/.
    some_app -o build/foo.res res/foo.txt

Я развертываю скомпилированный res/foo.res на некоторых машинах, а затем меняю закомментированные правила, поэтому используется обычный cp. Это работает нормально, пока в Makefile не внесены некоторые изменения в некоторых коммитах. Затем он блокирует ускоренное обновление в git.

Как настроить make для запуска только одного из правил, основанных на сопоставленных зависимостях?

1 Ответ

1 голос
/ 14 февраля 2020

Вы не можете сделать это с явными правилами. Явное правило говорит make THIS , как вы строите эту цель. Вы можете создать два разных шаблонных правила, которые могут создать одну и ту же цель. Шаблонное правило гласит, что в одну сторону вы можете построить эту цель.

Итак, измените ваш make-файл на:

build/%.res: res/%.res | build/.
        cp $< $@

build/%.res: res/%.txt | build/.
        some_app -o $@ $<
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...