【问题标题】:Non Recursive Make非递归制作
【发布时间】:2017-01-11 14:13:40
【问题描述】:

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

+--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

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

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

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

【问题讨论】:

  • 让我向您推荐我的非递归模板库:github.com/igagis/prorab 它有教程。如果您需要帮助,我可以帮助您将其应用到您的项目中。
  • 我们不是“提供代码!”社区。如果您有一个具体的问题,请将其与您迄今为止所做的一起说明。并且不要使用不相关的标签。这与嵌入式系统无关。
  • 这与嵌入式系统有关,因为它用于生成嵌入式处理器所需的二进制文件。我们目前正在努力从专用 IDE 转变为与 IDE 无关的更简化的方法。

标签: makefile build non-recursive


【解决方案1】:

要使构建结果具有与源目录结构相同的目录结构,模式规则必须采用以下形式:

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

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

.SECONDEXPANSION:
${obj_dir}/%.o : ${src_dir}/%.c | $$(dir $$@)
${obj_dir}/% : mkdir -p $@ 

根据目标,可以使用/不使用多线程编译一个源文件,作为位置无关/非位置无关代码等。处理这种情况的一种方法是拥有单独的顶级对象文件目录(除了 debug/release 顶级目录),例如:

${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 $@; do echo -n ""; done

【讨论】:

    猜你喜欢
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 2011-05-06
    • 2018-03-17
    • 1970-01-01
    相关资源
    最近更新 更多