Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在调用特定的Makefile规则时强制定义特定的环境变量_Makefile - Fatal编程技术网

在调用特定的Makefile规则时强制定义特定的环境变量

在调用特定的Makefile规则时强制定义特定的环境变量,makefile,Makefile,考虑下面的Makefile rulea: echo rulea ruleb: echo ruleb 我希望在调用ruleb时定义环境变量SPL\u VAR,否则中止。调用rulea时,不应强制执行此约束。如何实现相同的功能?首先假设“已定义”表示“不扩展为空字符串”,而“中止”表示“停止并以非零退出状态退出” 解决方案1:您可以使用shell条件来实现这一点: ruleb: @if [ -n "$$SPL_VAR" ]; then \ echo rul

考虑下面的Makefile

rulea:
    echo rulea

ruleb:
    echo ruleb
我希望在调用
ruleb
时定义环境变量
SPL\u VAR
,否则中止。调用
rulea
时,不应强制执行此约束。如何实现相同的功能?

首先假设“已定义”表示“不扩展为空字符串”,而“中止”表示“停止并以非零退出状态退出”

解决方案1:您可以使用shell条件来实现这一点:

ruleb:
    @if [ -n "$$SPL_VAR" ]; then \
        echo ruleb; \
    else \
        echo "SPL_VAR undefined, aborting"; \
        exit 1; \
    fi
ruled:
ifeq ($(SPL_VAR),)
    $(error "SPL_VAR undefined, aborting")
else
    @echo ruled
endif
解决方案2:相同想法的更紧凑形式:

rulec:
    @[ -n "$$SPL_VAR" ] && echo rulec || \
    { echo "SPL_VAR undefined, aborting"; exit 1; }
解决方案3:制作文档说明:

make启动时看到的每个环境变量都被转换为具有相同名称和值的make变量

因此,还可以使用make条件:

ruleb:
    @if [ -n "$$SPL_VAR" ]; then \
        echo ruleb; \
    else \
        echo "SPL_VAR undefined, aborting"; \
        exit 1; \
    fi
ruled:
ifeq ($(SPL_VAR),)
    $(error "SPL_VAR undefined, aborting")
else
    @echo ruled
endif
解决方案4:最后,您还可以使用make
if
功能:

rulee:
    $(if $(SPL_VAR),@echo rulee,$(error "SPL_VAR undefined, aborting"))
演示

host> unset SPL_VAR
host> make ruleb
SPL_VAR undefined, aborting
make: *** [Makefile:4: ruleb] Error 1
host> make rulec
SPL_VAR undefined, aborting
make: *** [Makefile:12: rulec] Error 1
host> make ruled
Makefile:17: *** "SPL_VAR undefined, aborting".  Stop.
host> make rulee
Makefile:23: *** "SPL_VAR undefined, aborting".  Stop.
host> export SPL_VAR=foo
host> make ruleb rulec ruled rulee
ruleb
rulec
ruled
rulee

注意:如果“中止”表示“不执行此规则,但不停止”,只需将
退出1
替换为
退出0
$(错误…
替换为
$(警告…
)。

您是否尝试添加
规则a
,并调用它?根据我的说明,它应该不需要设置
SPL\u VAR
set。我没有尝试,因为我知道它会像您期望的那样工作。我认为解决方案3和4不适用,因为Makefile条件更像是预处理器指令,不管调用的规则如何,都会被解析和处理。另外
exit 1
不会中止规则的处理,不幸的是。它从子shell退出。@Holmes.Sherlock:您在
rule c
中使用了空格而不是制表符。请记住,“制作食谱”的前缀是制表符。