Как предотвратить предварительное условие цели, когда цель не используется? - PullRequest
0 голосов
/ 01 апреля 2019

В Makefile с несколькими целями, как можно предотвратить расширение предпосылок для целей, которые не используются? Смотрите следующий пример:

thisexpands = $(warning Expanded!)

.PHONY: target1
target1: $(thisexpands)
    @echo Target 1

.PHONY: target2
target2:
    @echo Target 2

Вызов target2 заставляет thisexpands расширяться, даже если он лениво оценивается и target1 никогда не используется.

В моем случае раскрытие thisexpands при вызове target1 является проблемой, поскольку это команда оболочки, которая печатает ошибки при вызове вне контекста target1 и его родительских целей (здесь не показаны).

Ответы [ 2 ]

2 голосов
/ 01 апреля 2019

Make-файлы полностью анализируются перед запуском первого правила. В рамках синтаксического анализа все цели и предпосылки должны быть расширены. Подробности о том, когда происходит расширение для различных частей make-файла, можно найти в Как make Читает Makefile в руководстве по сборке GNU.

Один из способов - использовать рекурсию:

thisexpands = $(warning Expanded!)

target1: ; $(MAKE) target1-recurse T1_DEPS='$(value thisexpands)'

T1_DEPS =
target1-recurse: $(T1_DEPS)
        @echo Target 1

Это не работает:

Вероятно, вы можете отложить расширение, используя вторичное расширение , что-то вроде этого:

.SECONDEXPANSION:
target1: $$(thisexpands)

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

1 голос
/ 01 апреля 2019

Нет способа полностью отменить расширение.Однако вы можете использовать условное присвоение на основе значения $(MAKECMDGOALS):

thisexpands = $(if $(filter target1,$(MAKECMDGOALS)),$(warning Expanded!))

.PHONY: target1
target1: $(thisexpands)
    @echo Target 1

.PHONY: target2
target2:
    @echo Target 2

Обратите внимание, что оно работает, если target1 создается только явно (make target1), а не по умолчанию или какчасть строительства другой цели.

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