Makefile ifndef变量在定义变量时触发

Makefile ifndef变量在定义变量时触发,makefile,gnu-make,Makefile,Gnu Make,为什么,当我运行make run-e2e-docker时,ifndef被激活了?应该设置变量,但make决定不设置。它可用于运行的echo命令。如果我删除ifndef并运行make,它将打印变量 run-e2e: ifndef environment $(error "You can't run run-e2e directly, choose one of the run-e2e-* tasks ${environment}") endif @echo extra_

为什么,当我运行
make run-e2e-docker
时,ifndef被激活了?应该设置变量,但make决定不设置。它可用于运行的echo命令。如果我删除ifndef并运行make,它将打印变量

run-e2e:
ifndef environment
$(error "You can't run run-e2e directly, choose one of the run-e2e-* tasks ${environment}")
endif
    @echo extra_profiles=${extra_profiles}
    @echo environment=${environment}

run-e2e-docker: override extra_profiles = docker-e2e,dev-performance
run-e2e-docker: override environment = docker
run-e2e-docker: run-e2e

不能在上下文中使用make条件句。当你显然在思考时,它们不会被评估。但您可以使用shell条件:

run-e2e:
    @if [ -z "$(environment)" ]; then \
        echo "You can't run run-e2e directly, choose one of the run-e2e-* tasks"; \
        exit 1; \
    fi
    @echo extra_profiles=${extra_profiles}
    @echo environment=${environment}
GNU Make手册上说

条件控制make在makefile中实际“看到”的内容,因此 它们不能用于在执行时控制配方


如何设置
环境
?您不会在makefile中显示设置它的任何内容,命令行也不会设置它。那么,在你看来,它的位置在哪里?您是否使用了
export-environment=climate
之类的工具?它可以从文件顶部设置,也可以从命令行设置,但目前它是从run-e2e-docker使用覆盖选项设置的。我不熟悉
override
(它不是经典
make
的一部分)。就我所理解的条件而言,我希望在解析makefile时对它们进行操作,而不是在执行操作时对它们进行操作。我通常在菜谱的上下文之外看到这样的条件句。我怀疑如果您将条件移动到
run-e2e
目标之前,您将得到相同的消息。但我可能是找错人了,或者只是发疯了。把这当作一个答案,我会接受的。在你提到这一点后,我在文档中发现了这一点,所以请将其也写在答案中。。。“因此,它们不能在执行时用于控制配方。”从中不清楚您是否可以在规则后放置
覆盖
——示例没有显示这一点。这并不是说你不能,但从我(古老的)观点来看,你有奇怪的依赖关系。OTOH,条件可以出现在规则中-。另一个选择,如果你想完全停止make,是在配方中使用make的
$(if…
条件<代码>$(如果$(环境),,$(错误…)响应良好。它不允许我编辑文章,因为我的更改少于6个字符。我只想在“if”之前添加一个“@”,这样它就不会将条件代码打印为输出。也许作者有能力?再加上这位疯狂的科学家所说的。这很有效$(如果ndef$(环境),,$(错误“您不能直接运行run-e2e,请选择一个run-e2e-*任务”))