makefile中的条件执行

时间:2016-05-28 08:30:58

标签: makefile gnu-make

我有以下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未设置。

2 个答案:

答案 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)