【问题标题】:Syntax for assigning variable in makefile via $(if ...)通过 $(if ...) 在 makefile 中分配变量的语法
【发布时间】:2013-06-02 11:55:22
【问题描述】:

Makefile 中的以下行通过 echo 的输出显示,尝试分配 $(if ... ) 的各种语法都是不正确的($(if ... ) 下面显示的只是我尝试过的一些变体):

exes  =  $(patsubst %.cc,%.exe,$(wildcard *.cc))    

#depends_on = $(ifeq "$@" "the_file.exe",fooinc.h,nothing)    
#depends_on = $(if (ifeq($@,the_file.exe),1,0),`echo true $@`,`echo false $@`)    
depends_on = $(if "a" eq "ha",fooinc.h,nothing)    

all:  ${exes}     

%.exe:%.cc       
    @echo depends on: $(depends_on)      
    $(VERBOSE)${gcc} ${flags} ${INC}  -o $@  $<   

gnu makefile 的文档解释了多行 if ... else .. endif 的语法,但我找不到单行 $(if ...) 的任何解释。

更新:@MadScientist 的解释和插图确实回答了上面提出的问题。要完全实现所需的功能,需要Secondary Expansion的概念;如下图所示——注意 .SECONDEPANSION:、用于扩展 depends_on 的双 $,以及 echo 操作中的 $^(而不是 $

depends_on = $(if $(filter the_file.exe,$@),fooinc.h,)  

.SECONDEXPANSION:  
%.exe: $$(depends_on)  %.cc     
    @echo depends on: $(depends_on) carat: $^  ampersand: $@      
    $(VERBOSE)${gcc} ${flags} ${INC}  -o $@  $<     

【问题讨论】:

    标签: if-statement makefile variable-assignment


    【解决方案1】:

    if 函数的文档说它扩展了它的第一个参数,如果结果是空字符串,则为 false。如果不是空字符串,那就是真的。

    所以你必须找到一种方法来构造一个语句,如果你想要 then 部分,它会在评估时扩展为非空字符串,如果你想要 else 部分,则扩展为空字符串。如果您要对单个单词进行字符串比较,那么$(filter ...) 是一个不错的选择:

    depends_on = $(if $(filter the_file.exe,$@),fooinc.h,nothing)
    

    【讨论】:

      猜你喜欢
      • 2018-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-02
      • 2021-02-02
      • 2015-05-17
      • 2017-10-25
      • 1970-01-01
      相关资源
      最近更新 更多