自动生成makefile先决条件(gnu-make)

时间:2012-01-30 01:26:22

标签: makefile gnu-make

我的一个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,那么先决条件是/lpathpath/mylib1/obj/foo.o和/lpathpath/mylib1/obj/bar.o等)。我能够使用它的唯一方法是使用.SECONDEXPANSION:我创建一个.cpp文件列表,剥离文件夹和扩展名,后缀为.o扩展名,然后将其作为目标文件夹的前缀:

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

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

1 个答案:

答案 0 :(得分:1)

我只建议将逻辑提取到宏中,并使用后者作为先决条件。另外,我希望patsubst function代替notdir + basename + addsuffix$(@D) automatic variable代替$(dir $@)

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

%.a: $$(lib_objects)
IMO,看起来好一点,不是吗?