2017-01-11 72 views
0

我有一个项目,我想从递归转换为非递归制作。结构如下所示非递归制作

+--app 
| +-- Makefile 
+--lib1 
| +-- Makefile 
| +-- x.c 
| +-- y.c 
| 
+--lib2 
| +-- Makefile 
| +-- x.c 

我所试图做的是后一个版本是有这样

+--app 
| +-- build/ 
| | +-- debug(or release or test)/ 
| | | +-- lib1/ 
| | | | +-- *.o 
| | | | +-- *.d 
| | | +-- lib2/ 
| | | | +-- *.o 
| | | | +-- *.d 
| | 
| +-- target/ 
| | +-- main.bin 
| | 
| +-- Makefile 
| 
+--lib1 
| +-- module.mk 
| +-- x.c 
| +-- y.c 
| 
+--lib2 
| +-- module.mk 
| +-- x.c 

主要思想是构建文件夹中包含的所有对象和相关文件的结构并且target有应该加载的程序文件。

我遇到的问题是make永远不会想要创建这个结构。当我定义我的规则时,make只会运行隐式规则,而不会运行我定义的规则。

我已经阅读了所有有关非递归制作的资源,现在它只是没有点击。任何帮助深表感谢。

+0

让我建议你我的非递归模板库:https://github.com/igagis/prorab它有教程。如果您需要帮助,我可以帮助您将其应用到您的项目中。 – igagis

+0

我们不是“提供我的代码!”社区。如果您有**特定的**问题,请将它与您迄今所做的一起说明。并且不要使用不相关的标签。这与嵌入式系统无关。 – Olaf

+0

这与嵌入式系统有关,因为它用于生成嵌入式处理器所需的二进制文件。目前,我们正致力于从专用IDE转向更加简化的IDE方法。 – user7404994

回答

0

对于构建结果具有这样的源的相同的目录结构中,图案规则必须是以下形式:

${obj_dir}/%.o : ${src_dir}/%.c 

%部分包括所有的子目录。对象文件也必须取决于其目录make先建立的目录:

.SECONDEXPANSION: 
${obj_dir}/%.o : ${src_dir}/%.c | $$(dir [email protected]) 
${obj_dir}/% : mkdir -p [email protected] 

根据目标,一个源文件可以用被编译/无多线程,作为位置无关/非位置无关的代码,等等。来处理那些的一种方式是具有单独的顶层对象文件目录(除了调试/发布顶级目录),例如:

${obj_dir}/obj 
${obj_dir}/obj-pic 
${obj_dir}/obj-mt 
${obj_dir}/obj-mt-pic 

一旦你有这些规则正常工作,并尝试一个并行版本,你会注意到mkdir -p失败时,其中两人竞相创建/a/b/a/a/b/b。修复是:

${obj_dir}/% : while ! mkdir -p [email protected]; do echo -n ""; done