我有以下makefile:
C_FILE=""
cfg:
## C to CFG ####
@ echo $(C_FILE)
ifndef C_FILE
$(error variable C_FILE not set)
endif
$(eval CFG_FILE := ./outputs/temp/$(shell basename $(C_FILE) .c).cfg)
gcc -fdump-tree-cfg=$(CFG_FILE) $(C_FILE)
当我一直运行命令make cfg C_FILE="./inputs/Fib.c"
时
终止说变量C_FILE
未设置。
答案 0 :(得分:1)
以制表符开头的行(默认情况下)不会被make解析(除了变量扩展),它们会被直接发送到shell,去掉带有条件的行上的缩进
C_FILE=""
cfg:
## C to CFG ####
@ echo $(C_FILE)
ifndef C_FILE
$(error variable C_FILE not set)
endif
$(eval CFG_FILE := ./outputs/temp/$(shell basename $(C_FILE) .c).cfg)
gcc -fdump-tree-cfg=$(CFG_FILE) $(C_FILE)
答案 1 :(得分:0)
我想在user657267的回答中添加一些评论。
ifndef C_FILE
总是假的。 C_FILE在第一行或命令行中定义。考虑使用ifeq "" "$(C_FILE)"
。引用("
)是makefile中的普通字符。以这种方式定义空变量:
C_FILE=
而不是使用$(shell )
功能,请使用makefile built-ins:
$(basename $(notdir $(C_FILE)))
如果不是真的需要,请避免使用$(eval )
。提取食谱外的相关代码。
我的建议是:
C_FILE=
ifeq "" "$(C_FILE)"
$(error variable C_FILE not set)
endif
CFG_FILE=./outputs/temp/$(basename $(notdir $(C_FILE))).cfg
cfg:
## C to CFG ####
@ echo $(C_FILE)
gcc -fdump-tree-cfg=$(CFG_FILE) $(C_FILE)