使用make来构建几个二进制文件

时间:2012-02-16 15:13:07

标签: makefile

我想创建一个Makefile(在父目录中)来调用其他几个Makefile(在子目录中),这样我就可以通过调用一个父Makefile来构建几个二进制文件(每个项目子目录一个)。

我的研究受到了在递归Makefile上查找大量内容的阻碍,但我认为这是您尝试将几个目录Makefile构建为单个二进制文件的地方?

也许我想要做的事情是由shell脚本更好地处理,可能依次在每个子目录中调用make,但我认为Makefile可能是一个更优雅的解决方案?

感谢任何指针

PS使用linux和GNU工具链

4 个答案:

答案 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

相关问题