Makefile не будет присваивать значения переменных в выражении `ifeq` в определении функции - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь присвоить значение переменной в make при выполнении условия внутри функции:

Без $() вокруг ifeq операторов:

VARIABLE=true

define test_ifeq
    FOO := foo
    ifeq (${VARIABLE}, true)
        FOO := true
    else
        FOO := false
    endif

    echo "value: ${FOO}"
endef

all:
    $(call test_ifeq)

Результат:

FOO := foo
make: FOO: No such file or directory
make: *** [Makefile:15: all] Error 127

С $() вокруг операторов ifeq и переменных:

VARIABLE=true

define test_ifeq
    $(FOO := foo)
    $(ifeq (${VARIABLE}, true)
        FOO := true
    else
        FOO := false
    endif)

    echo "value: ${FOO}"
endef

all:
    $(call test_ifeq)

Результат:

echo "value: "
value:

Почему это не работает?

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Чтобы сделать это с помощью Make:

VARIABLE=true

define test_ifeq
  FOO := foo
  ifeq (${VARIABLE}, true)
    FOO := true
  else
    FOO := false
  endif

$$(info "value: $${FOO}")

endef

$(eval $(call test_ifeq))

Чтобы сделать это из командной строки (при условии bash):

VARIABLE=true; FOO=foo; if [ $VARIABLE = true ]; then FOO=true; else FOO=false; fi; echo $FOO

Чтобы сделать это внутри правила в make-файле :

all:
    VARIABLE=true; \                                                                                  
  FOO=foo; \
  if [ $$VARIABLE = true ]; then \
  FOO=true; else \
  FOO=false; \
  fi; \
  echo $$FOO

Чтобы сделать это в правиле, используйте функцию:

VARIABLE=true

define test_ifeq2
  FOO=foo; \
  if [ $(VARIABLE) = true ]; then \
  FOO=true; else \
  FOO=false; \
  fi; \
  echo $$FOO
endef

all:
    $(call test_ifeq2)
0 голосов
/ 27 марта 2020

ifeq и лайки оцениваются в тот момент, когда make читает makefile, это означает, что в назначенном значении вашей переменной test_ifeq нет фактического ifeq.

Чтобы достичь того, что вам нужно, вы должны использовать встроенные функции $(if ...) и $(filter ...) вместе с $(eval ...).

Это должно выглядеть примерно так:

VARIABLE=true

define test_ifeq
    $(eval FOO := $(if $(filter $(VARIABLE),true), true, false))

    echo "value: $(FOO)"
endef

all:
    $(call test_ifeq)

ПРИМЕЧАНИЕ : Я не проверял, написал прямо из головы ...

...