Makefile 如何在目录列表上应用通配符

Makefile 如何在目录列表上应用通配符,makefile,pattern-matching,wildcard,Makefile,Pattern Matching,Wildcard,我有以下目录结构: 根/ 构建/#我在这个目录中 dir1/ 建造 obj#.o此文件中的文件 dir2/ 建造 obj#.o此文件中的文件 dir3/ 建造 obj#.o此文件中的文件 如您所见,我的makefile位于根目录/build中-makefile将变量定义为: DIRS = dir1 dir2 dir3 #there could be many OBJDIRS = $(DIRS:%=../%/build/obj) $(info $(OBJDIRS

我有以下目录结构:

  • 根/
    • 构建/
      #我在这个目录中
    • dir1/
      • 建造
        • obj
          #.o此文件中的文件
    • dir2/
      • 建造
        • obj
          #.o此文件中的文件
    • dir3/
      • 建造
        • obj
          #.o此文件中的文件
如您所见,我的makefile位于
根目录/build
中-makefile将变量定义为:

DIRS = dir1 dir2 dir3  #there could be many
OBJDIRS = $(DIRS:%=../%/build/obj)
$(info $(OBJDIRS))                  #lets print the list
然后我尝试创建一个变量,如下所示:

DIRS = dir1 dir2 dir3  #there could be many
OBJDIRS = $(DIRS:%=../%/build/obj)
$(info $(OBJDIRS))                  #lets print the list
此处
info
打印此列表:

../dir1/build/obj ../dir2/build/obj ../dir3/build/obj
现在我想获得所有
dir*
目录的
obj
目录中所有对象文件的列表。怎么弄到的?我试过这个:

OBJECTS = $(wildcard $(OBJDIRS)/*.o)
$(info $(OBJECTS))  
它只打印此文件:

../dir1/build/obj 

通配符在目录列表上似乎不起作用。有什么办法可以做到这一点吗?

我认为你目前的尝试有两个地方不对劲

  • $(通配符)
    不使用%作为其通配符。它使用*。所以您需要
    $(通配符$(OBJDIRS)/*.o)
    来解决这个问题

  • $(OBJDIRS)/*.o
    将扩展到
    。/dir1/build/obj../dir2/build/obj../dir3/build/obj/*.o
    。你会注意到,这不是你想要的。因此,您需要使用
    $(addsuffix/*.o,$(OBJDIRS))
    或其他替换来生成所需的通配符模式列表


  • 1.Oops
    %
    是一个打字错误。我修好了。我的makefile同时尝试了
    %
    *
    。两种情况下的结果是相同的。2.我明白了。使用
    *
    通配符,我希望
    $(通配符)调用会列出
    dir1`条目和
    dir3
    下匹配的任何内容(或最后出现的任何其他路径)。