Makefile: условия внутри определяют - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь проверить, что значение переменной равно yes или no, но всегда происходит следующее:

FLAG1 ?= no
FLAG2 ?= yes

define check_
    ifneq ($(filter $(2),$($(1))),$($(1)))
        $(error Bad $(1) argument)
    endif
endef

$(call check_,FLAG1,yes no)
$(call check_,FLAG2,yes no)

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 16 октября 2019
FLAG1 ?= no
FLAG2 ?= yes

define check_
    $(if $(filter $($(1)),$(2)),,$(error BAD $(1) argument))
endef

$(call check_,FLAG1,yes no)
$(call check_,FLAG2,yes no)

Обратите внимание, что вы добавили пробел перед FLAG1, что означает, что $$(1) разрешается в $( FLAG1), что, в свою очередь, приводит к пустому. Следующая часть заключается в том, что я не уверен насчет использования if ifneq внутри определения. Вы можете использовать $(if ) вместо

---- РЕДАКТИРОВАТЬ ------

На самом деле это комбинация отсутствующего пробела и ответа @MadScientists ... Следующее также работает:

define check_
    ifneq ($(filter $($(1)),$(2)),$($(1)))
        $$(error Bad $(1) argument [$($(1))] / [$(filter $($(1)),$(2))])
    endif
endef

$(eval $(call check_,FLAG1,yes no))

Таким образом, ifneq может использоваться внутри макроса ... (и, как указал @MadScientist, вы должны экранировать $ перед $(error), чтобы предотвратить егорасширяется по вызову ...)

1 голос
/ 16 октября 2019

Нельзя использовать обычный call с многострочным макросом. Вы должны использовать $(eval $(call ...)), если результат функции call состоит из более чем одной строки содержимого make-файла.

Вы можете использовать это:

define check_
    ifneq ($$(filter $(2),$$($(1))),$$($(1)))
        $$(error Bad $(1) argument)
    endif
endef

По сути, все, что выхочу, чтобы eval нужно было интерпретировать, нужно экранировать, чтобы call его не увидел.

...