Я знаю, что об этом уже спрашивали, но ни одно из решений, которые я нашел, не сработало для меня, потому что они анти-СУХИЕ.
У меня есть ряд целей, которые зависят от того, что может 't легко помечаются метками времени - например, файлы, скопированные из другой системы.То, что я хотел бы , чтобы иметь возможность делать, - это перечислять зависимости в переменной, например nobuild=this,that
, и иметь эти цели , предполагаемые актуальными.Так как у меня их много, я не хочу ifdef
вокруг каждого;то, что было бы псевдокодически предпочтительнее, было бы что-то вроде
ignorable-target: dependencies
$(call ifnobuild,$@)
.. rest of normal build steps ..
, где макрос ifnobuild
расширился до какой-то инструкции выхода из этого рецепта с успехом gmake
если ignorable-target
было упомянуто в переменной nobuild
.
Я также не хочу войти в многострочные продолженные команды оболочки, чтобы отложить условие на сам рецепт;Я хочу сказать make: «Предположим, что эти цели актуальны, и не пытайтесь их создавать», поэтому я могу проверить другие аспекты с помощью локальных копий, уже полученных из проблемных рецептов.
Там нет какого-либо механизма выхода-рецепта-с-успехом в gmake
, есть?
[Отредактировано, чтобы, надеюсь, сделать ситуацию болееясно.]
Вот пример.Каждая из целей remote1
и remote2
предполагает использование ssh
для выполнения чего-то трудоемкого в удаленной системе, а затем копирование результатов локально.Цель local1
создана локально и не требует временных затрат.target-under-work
зависит от всех трех вышеперечисленных.
local1: local1.c Makefile
remote1: local1
scp local1 remote-host:/tmp/
ssh remote-host /tmp/local1 some-args # takes a long time
scp remote-host:/tmp/local1.out remote1
remote2: local1
scp local1 other-host:/tmp/
ssh other-host /tmp/local1 other-args # takes a long time
scp other-host:/tmp/local1.out remote2
target-under-work: local1 remote1 remote2
do-something-with remote1,remote2
Теперь, когда я просто запустите make target-under-work
, он будет запускать рецепты для remote1
и remote2
.Однако локальные копии этих файлов «достаточно хороши» для моего тестирования, поэтому я не хочу, чтобы они запускались каждый раз.Как только все пойдет в производство, они будут запускаться каждый раз, но пока я занимаюсь разработкой target-under-work
, я просто хочу использовать уже созданные копии, и я могу перестраивать их ежедневно (или что-то еще) длянеобходимая гранулярность тестирования.
Вышеуказанное упрощено;Есть несколько шагов и целей, которые зависят от remote1
и / или remote2
.Я вижу, как получить желаемый эффект, создав для них предварительные условия только для заказа, но это будет означать изменение списка зависимостей каждой цели, для которой они есть в качестве предварительных условий, вместо того, чтобы single изменить на remote1
и remote2
, поэтому я могу использовать некоторую переменную из командной строки, чтобы сказать их рецептам «притвориться, что это было сделано, на самом деле не собирать его, если уже есть копия».
Я надеюсь, что это делаетмой вопрос более понятен.