代码之家  ›  专栏  ›  技术社区  ›  Him

使用make的条件语句

  •  0
  • Him  · 技术社区  · 8 年前

    我对make中的条件语句有问题。关于so的现有问题只能在makefile的最高级别上工作。

    以下是我所拥有的:

    .PHONY: all
    
    all: bar/*.o
    
    bar/%.o: foo/%.cc
    ifeq (,$(wildcard $(@D)))
        @echo $(wildcard $(@D))
    endif
    

    下面有两个空文件 foo , a.cc b.cc . 文件夹 bar 存在。

    输出如下:

    PS C:\Users\cbrown2\Src> mingw32-make
    bar
    bar
    

    它进入 ifeq $(wildcard $(@D)) 给予 酒吧 .

    给什么?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Renaud Pacalet    8 年前

    你不能这样使用条件句。当make求值时,条件自动变量还没有值。所以make会看到:

    bar/%.o: foo/%.cc
        @echo $(wildcard $(@D))
    

    因为 $(@D) 作为空字符串展开。当make将配方传递给shell时,它将首先展开 $(@) 这一次,它有一个价值: bar .

    一个与你的问题无关的旁注:什么时候 酒吧 尚未包含所有对象文件,

    all: bar/*.o
    

    不会做你想做的事。你可能想要的是:

    SRC := $(wildcard foo/*.cc)
    OBJ := $(patsubst foo/%.cc,bar/%.o,$(SRC))
    
    all: $(OBJ)