【问题标题】:Automatically generating makefile prerequisites (gnu-make)自动生成 makefile 先决条件 (gnu-make)
【发布时间】:2012-02-21 22:12:35
【问题描述】:

我的一个 makefile 中有一个变量,其中包含我需要生成的归档文件列表,格式如下:

/libpath/mylib1/obj/mylib1.a
/libpath/mylib2/obj/mylib2.a
/libpath/mylib3/obj/mylib3.a

等等。我已经设置了一个规则来创建每一个,基本上它会扫描父文件夹中的 .cpp 文件并在 /obj 子文件夹中创建 .o 先决条件(因此,如果 /libpath/mylib1 包含 foo.cpp 和 bar.cpp 那么先决条件是 /libpath/mylib1/obj/foo.o 和 /libpath/mylib1/obj/bar.o 等)。我可以让它工作的唯一方法是使用 .SECONDEXPANSION:我创建一个 .cpp 文件列表,剥离文件夹和扩展名,使用 .o 扩展名作为后缀,然后使用目标文件夹作为前缀:

%.a: $$(addprefix $$(dir $$@),$$(addsuffix .o,$$(basename $$(notdir $$(wildcard $$(dir $$@)../*.cpp)))))

这很好用,但我不禁觉得我正在以一种过于复杂的方式来解决这个问题。有没有更好/更清洁的方法来做这样的事情?

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    我只建议将逻辑提取到宏中,并使用后者作为先决条件。另外我更喜欢patsubst function 而不是notdir + basename + addsuffix,以及$(@D) automatic variable 而不是$(dir $@)

    lib_objects = $(patsubst %.cpp,$(@D)/%.o,$(notdir $(wildcard $(@D)/../*.cpp)))
    
    %.a: $$(lib_objects)
    

    IMO,看起来好多了,不是吗?

    【讨论】:

    • 感谢埃尔达。我使用了addsiffix,因为实际上有四个不同的扩展我试图过滤掉,我需要仔细看看patsubst,看看它是否可以处理。干杯!
    猜你喜欢
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    相关资源
    最近更新 更多