首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非递归制造

非递归制造
EN

Stack Overflow用户
提问于 2017-01-11 14:13:40
回答 1查看 613关注 0票数 0

我有一个项目,我想把它从递归转换成非递归的make。该结构如下所示

代码语言:javascript
复制
+--app
|  +-- Makefile
+--lib1
|  +-- Makefile
|  +-- x.c
|  +-- y.c
|
+--lib2
|  +-- Makefile
|  +-- x.c

我想做的是在构建之后有一个这样的结构

代码语言:javascript
复制
+--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

其主要思想是构建文件夹包含所有对象和依赖关系文件,并且目标具有应该加载的程序文件。

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

我已经阅读了关于非递归make的所有资源,现在它还没有被点击。任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-11 15:59:16

要使生成结果具有与源相同的目录结构,模式规则必须以以下形式出现:

代码语言:javascript
复制
${obj_dir}/%.o : ${src_dir}/%.c

其中%部件包含所有子目录。对象文件还必须依赖于其目录,以便make首先构建该目录:

代码语言:javascript
复制
.SECONDEXPANSION:
${obj_dir}/%.o : ${src_dir}/%.c | $$(dir $$@)
${obj_dir}/% : mkdir -p $@ 

根据目标,一个源文件可以通过/不使用多线程编译,如位置无关/非位置无关的代码等。解决这一问题的一种方法是拥有单独的顶级对象文件目录(除了调试/发布顶级目录之外),例如:

代码语言:javascript
复制
${obj_dir}/obj
${obj_dir}/obj-pic
${obj_dir}/obj-mt
${obj_dir}/obj-mt-pic

一旦这些规则正确工作并尝试并行构建,您将注意到当其中两个规则争相创建/a/b/a/a/b/b时,它们都会失败。解决办法是:

代码语言:javascript
复制
${obj_dir}/% : while ! mkdir -p $@; do echo -n ""; done
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41593176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档