Makefile赢得';t在函数定义中的'ifeq'语句中分配变量值

Makefile赢得';t在函数定义中的'ifeq'语句中分配变量值,makefile,gnu-make,Makefile,Gnu Make,当满足条件时,我试图在函数中为make中的变量赋值: VARIABLE=true define test_ifeq2 FOO=foo; \ if [ $(VARIABLE) = true ]; then \ FOO=true; else \ FOO=false; \ fi; \ echo $$FOO endef all: $(call test_ifeq2) 在ifeq语句周围没有$(): VARIABLE=true define test_ifeq

当满足条件时,我试图在函数中为
make
中的变量赋值:

VARIABLE=true

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

all:
    $(call test_ifeq2)
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)
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
echo "value: "
value:
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)
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
echo "value: "
value:

为什么不起作用?

make
读取
makefile
时,会对
ifeq
等进行评估,这意味着
test\u 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)
注意:我还没有测试过它,只是直接写出来的…

要使用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):

要在makefile中的规则内执行此操作,请执行以下操作:

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)

您似乎混合了Make和shell语法。你想让我做所有这些,还是想把它传给贝壳,放在食谱里?我真的不在乎。我只是想让它发挥作用,但似乎没有办法将字符串与纯make进行比较,或者糟糕的文档没有一个分支和为变量分配不同值的好例子。谢谢!这对我有用。让我重新考虑在长期的构建过程中使用makefile,并转向更像magefile的东西。一旦你超越了hello world的复杂性,Makefile就像是一个邪恶的骗子。我有自己的非递归构建系统,用
GNU make
,检查它的复杂性:)如果你想使用它,有一个很好的教程