正在获取可以位于任何文件夹中的共享库的依赖项



我正在创建一个Rules.make文件,类似于Linux的2.0版本,它包含各种目标,包括.so文件。我的目标是只需要制作这样的极简主义Makefile:

include $(DIR_TOP)/Rules.make

在包含我需要编译的任何源文件的目录中。这些规则还使我能够在";主";Makefile:

something: something_else lib.so

,使得首先完成something_else,然后构建lib.so

一切都很顺利,直到我决定向前面提到的共享库目标添加依赖项。我想下面这样的东西会起作用:

${DIR_OUT}/%.so: $(shell find $(dir $@) -name *.o)
$(CC) $(CFLAGS) -o $@ $(CLIBS) -shared $^

然而,令我死亡的是,$(dir $@)显然扩展到了$(dir ${DIR_OUT}/%.so),然后产生了简单的${DIR_OUT},这正是我所需要的。DIR_OUT只是顶级目录字符串,但目标可以从任何子目录调用,或者像target: $(DIR_OUT)/path/to/lib.so一样调用。我希望%不仅可以匹配文件名,还可以匹配任何目录(确实如此(,然后在确定完整路径后将其扩展到$@。有了这个解决方案,不仅我需要的对象文件被包括在构建过程中,而且输出文件夹中的任何其他对象文件都会产生multiple definition of x y z等错误。

有没有其他方法可以获得我想要构建的共享库的依赖项列表?理想情况下,这是一个纯粹基于Makefile的解决方案,但如果没有,我也喜欢一些bash脚本。

解决方案是二次扩展

.SECONDEXPANSION:
${DIR_OUT}/%.so: $$(shell find $$(dir $$@) -name *.o)
$(CC) $(CFLAGS) -o $@ $(CLIBS) -shared $^

最新更新