非递归生成
Non Recursive 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 的所有资源,但现在还没有点击。任何帮助深表感谢。
要使构建结果具有与源目录结构相同的目录结构,模式规则必须采用以下形式:
${obj_dir}/%.o : ${src_dir}/%.c
其中 %
部分包括所有子目录。目标文件也必须依赖于它的目录,以便make
先建立目录:
.SECONDEXPANSION:
${obj_dir}/%.o : ${src_dir}/%.c | $$(dir $$@)
${obj_dir}/% : mkdir -p $@
根据目标,一个源文件可以编译with/without多线程,如position-independent/non-position-independent代码等。解决这个问题的一种方法是拥有单独的顶级对象文件目录(除了 debug/release 顶级目录),例如:
${obj_dir}/obj
${obj_dir}/obj-pic
${obj_dir}/obj-mt
${obj_dir}/obj-mt-pic
一旦您使这些规则正常工作并尝试并行构建,您会注意到当其中两个竞争创建 /a/b/a
和 /a/b/b
时 mkdir -p
失败。修复是:
${obj_dir}/% : while ! mkdir -p $@; do echo -n ""; done
我有一个项目,我想将其从递归生成转换为非递归生成。结构如下所示
+--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 的所有资源,但现在还没有点击。任何帮助深表感谢。
要使构建结果具有与源目录结构相同的目录结构,模式规则必须采用以下形式:
${obj_dir}/%.o : ${src_dir}/%.c
其中 %
部分包括所有子目录。目标文件也必须依赖于它的目录,以便make
先建立目录:
.SECONDEXPANSION:
${obj_dir}/%.o : ${src_dir}/%.c | $$(dir $$@)
${obj_dir}/% : mkdir -p $@
根据目标,一个源文件可以编译with/without多线程,如position-independent/non-position-independent代码等。解决这个问题的一种方法是拥有单独的顶级对象文件目录(除了 debug/release 顶级目录),例如:
${obj_dir}/obj
${obj_dir}/obj-pic
${obj_dir}/obj-mt
${obj_dir}/obj-mt-pic
一旦您使这些规则正常工作并尝试并行构建,您会注意到当其中两个竞争创建 /a/b/a
和 /a/b/b
时 mkdir -p
失败。修复是:
${obj_dir}/% : while ! mkdir -p $@; do echo -n ""; done