在我的一个makefile中有一个变量,其中包含需要生成以下格式的归档文件的列表:
/libpath/mylib1/obj/mylib1.a
/libpath/mylib2/obj/mylib2.a
/libpath/mylib3/obj/mylib3.a诸若此类。我已经建立了一个规则来创建它们,基本上它会扫描父文件夹中的.cpp文件,并在mylib1子文件夹中创建.o先决条件(所以如果/ /obj /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)))))这工作得很好,但我不禁觉得我正在以一种过于复杂的方式来处理这件事。有没有更好/更干净的方法来做这样的事情?
发布于 2012-01-30 18:56:57
我只建议将逻辑提取到宏中,并使用后者作为先决条件。另外,我更喜欢patsubst function而不是notdir + basename + addsuffix,更喜欢$(@D) automatic variable而不是$(dir $@)。
lib_objects = $(patsubst %.cpp,$(@D)/%.o,$(notdir $(wildcard $(@D)/../*.cpp)))
%.a: $$(lib_objects)IMO,看起来好多了,不是吗?
https://stackoverflow.com/questions/9058421
复制相似问题