【发布时间】:2019-01-03 05:41:21
【问题描述】:
在我正在尝试的 makefile 中
- 运行 shell 命令并在 make 变量中捕获输出
- 如果变量不为空就做点什么
我创建了这个简化的 makefile 来演示我的问题。 make a 或 make b 都不执行 if 的主体,我不明白为什么不。
.PHONY: a b
a:
$(eval MY_VAR = $(shell echo whatever))
@echo MY_VAR is $(MY_VAR)
$(info $(MY_VAR))
ifneq ($(strip $(MY_VAR)),)
@echo "should be executed"
endif
@echo done
b:
$(eval MY_VAR = $(shell echo ''))
@echo MY_VAR is $(MY_VAR)
$(info $(MY_VAR))
ifneq ($(strip $(MY_VAR)),)
@echo "should not be executed"
endif
@echo done
我正在使用
$ make --version
GNU Make 3.81
编辑:正如所指出的,vars 不需要是 make vars
【问题讨论】:
-
有几个问题和误解。您的
MY_VAR是一个make变量,将其设置为没有<tab>的值,并且不需要$(eval ...)。MY_VAR:=$(shell echo whatever)就够了。没有<tab>在$(info ...)之前也没有,这是make -
如果不为空就要做某事,需要在配方行中使用
$(if $(strip $(MY_VAR)),do if,do else) -
@Zelnes 我只想在运行目标
a或b时设置MY_VAR(真正的命令很昂贵,并且还有其他不需要它的目标),如果我删除我得到语法错误的标签。 -
啊,if的另一种形式,有效!请回答,以便我接受。
-
如果您只想在
a和b目标中设置/使用这些变量,为什么要让它们成为make变量?为什么不在配方中使用 shell 变量?在这里尝试使用make变量会增加很多复杂性。
标签: makefile