做非递归make的正确方法?

时间:2014-09-26 22:39:38

标签: c++ makefile

创建一个非递归的make系统似乎只有少数几个资源,在我找到的那些系统中,我都找不到如何处理我的用例。我的层次结构如下所示:

project/
project/libA/...
project/libB/...
...
project/appA/...
project/appB/...

因此project/appA/makefile取决于libAlibBproject/appB/makefile取决于libAlibClibF或一些东西。我希望能够在每个目录中make并完成这项工作。我已经有了一个递归解决方案。

所有资源总是定义一个根project/makefile include上面的所有目录。但我需要倒退。野外有没有这方面的例子?我认为理想情况下我希望给定的库makefile看起来像:

include ../../rules.mk

SRC := $(wildcard src/*.cpp)
INCDIR := ./include

$(add_build_target)

...其中,rules.mk将定义add_build_target以将给定SRCINCDIR的正确规则附加到build。这是正确的方法吗?我如何实际编写add_build_target来添加正确的目标(所有.cxx的.o) - 我尝试过的所有东西都给了我“没有规则来制作目标无论什么。”问题,尽管我认为我已经定义了它们......

2 个答案:

答案 0 :(得分:1)

我已经实施并扩展了论文中的想法

http://evbergen.home.xs4all.nl/nonrecursive-make.html

在企业环境中多次使用,并且在小型或大型环境中运行良好。基本上,实现了一个"目录堆栈"那里和递归包容。就像我说的那样,对我有用。阅读本文,我推荐它。

答案 1 :(得分:0)

看一下名为 prorab 的非递归构建系统实现: https://github.com/igagis/prorab

它可以实现您想要的。因此,您将在每个目录makefile中拥有独立appA, appB, libA, libB,...,如果您cd到该目录,则只需键入make即可构建项目。在该makefile中,您将能够包含来自另一个目录的makefile,并在库二进制文件中为您的app二进制文件添加依赖项。因此,如果您对库代码进行一些更改并构建应用程序,它将检测到并重建库。 然后,也可以有一个顶级makefile,其中包含来自这些子目录的所有makefile,用于构建所有内容。 如果您在使用 prorab 时需要帮助,请与我们联系。