2012-01-30 73 views
0

我已经包含的存档文件,我需要生成以下形式的列表,我的makefile的一个有一个变量:自动生成的makefile的先决条件(GNU-MAKE)

/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文件列表,删除.cpp文件,删除文件夹和扩展名,后缀为.o扩展名,然后将其作为目标文件夹的前缀:

%.a: $$(addprefix $$(dir [email protected]),$$(addsuffix .o,$$(basename $$(notdir $$(wildcard $$(dir [email protected])../*.cpp))))) 

这工作正常,但我不禁感到我正在以一种过于复杂的方式解决这个问题。有没有更好的/更清洁的方式来做这样的事情?

回答

1

我只会建议将逻辑提取到宏中,并使用后者作为先决条件。我也希望patsubst function而不是notdir + basename + addsuffix$(@D) automatic variable而不是$(dir [email protected])

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

%.a: $$(lib_objects) 

IMO,看起来好一点,不是吗?

+0

谢谢埃尔达尔。我使用的是addsiffix,因为实际上有四种不同的扩展名我试图过滤出来,我需要仔细看看patsubst是否可以处理。干杯! – 2012-02-02 01:20:48

+0

@Mark,不客气! – 2012-02-02 08:11:58