我想创建一个Makefile(在父目录中)来调用其他几个Makefile(在子目录中),这样我就可以通过调用一个父Makefile来构建几个二进制文件(每个项目子目录一个)。
我的研究受到了在递归Makefile上查找大量内容的阻碍,但我认为这是您尝试将几个目录Makefile构建为单个二进制文件的地方?
也许我想要做的事情是由shell脚本更好地处理,可能依次在每个子目录中调用make,但我认为Makefile可能是一个更优雅的解决方案?
感谢任何指针PS使用linux和GNU工具链
答案 0 :(得分:2)
上面第一个答案中给出的for循环解决方案实际上不应该按原样使用。在该方法中,如果您的某个子制作失败,则构建不会失败(应该如此),而是继续使用其他目录。不仅如此,构建的最终结果将是最后一个子目录的退出代码,因此如果成功,即使某些其他子目录失败,构建也会成功。不好!!
您可以通过执行以下操作来解决此问题:
all:
@for dir in $(SUBDIRS); \
do \
$(MAKE) -C $${dir} $@ || exit $$?; \
done
但是现在你遇到了相反的问题:如果你运行“make -k”(即使有错误也继续),那么在这种情况下就不会遵守。它仍将在失败时退出。
上述两种方法的另一个问题是它们序列化了所有子目录的构建,因此如果启用并行构建(使用make的-j选项),这只会发生在单个子目录中,而不是发生在所有子目录中。
Eregrith和sinsedrix有更接近你想要的解决方案,虽然你永远不应该在调用递归make调用时使用“make”。和johfel的例子一样,你应该总是使用$(MAKE)。
这样的事情就是你想要的:
SUBDIRS = subdir1 subdir1 subdir3 ...
all: $(addprefix all.,$(SUBDIRS))
all.%:
@ $(MAKE) -C '$*' '$(basename $@)'
.PHONY: $(addprefix all.,$(SUBDIRS))
当然,您可以为其他目标添加更多这样的节,例如“安装”或其他任何目标。有更多奇特的方法来处理使用任何通用目标构建子目录,但这需要更多细节。
如果要支持并行构建,可能需要在此级别声明依赖项,以避免相互依赖的目录的并行构建。例如在上面的例子中,如果在完成subdir1和subdir2之后你不能构建subdir3(但是对于subdir1和subdir2并行构建是可以的)那么你可以在你的makefile中添加这样的东西:
all.subdir3 : all.subdir1 all.subdir2
答案 1 :(得分:0)
您可以通过
调用子目录makefile中的目标all:
$(MAKE) -C subdirectory1 $@
$(MAKE) -C subdirectory2 $@
...
或更好
SUBDIRS=subd1 subd2 subd3
all:
@for dir in $(SUBDIRS); \
do \
$(MAKE) -C $${dir} $@; \
done
答案 2 :(得分:0)
您确实应该使用cmake
从给定的CMakeLists.txt
配置文件自动生成Makefile。
这是一个random link来帮助您入门。 Here您可以找到一个简单的示例项目,包括多个子目录,可执行文件和共享库。
答案 3 :(得分:-1)
每个makefile都可以有多个目标,它仍然适用于递归的makefile,通常是写的:
all: target1 target2 target3
target1 :
make -C subdir
然后make all