在嵌套目录中使用makefile

在嵌套目录中使用makefile,makefile,gnu-make,Makefile,Gnu Make,我正在从事的一个项目涉及多种体系结构。代码分为特定于体系结构的模块和可在体系结构之间共享的通用模块 我计划将代码组织如下 TOP | |---- Makefile | |---- src (arch independent) |---- inc (arch independent) | |----arch1 (arch specific) |---- src |---- inc |---- Makefile |----arch2 (arch specific)

我正在从事的一个项目涉及多种体系结构。代码分为特定于体系结构的模块和可在体系结构之间共享的通用模块

我计划将代码组织如下

TOP
|
|---- Makefile
|
|---- src (arch independent)
|---- inc (arch independent)
|
|----arch1 (arch specific)
     |---- src 
     |---- inc 
     |---- Makefile
|----arch2 (arch specific)
     |---- src
     |---- src
     |---- Makefile
特定于arch的项目将由arch目录中的Makefile编译。此makefile包含顶层的makefile

其思想是,在arch特定的makefile中,将包含来自arch目录中的所有src代码,顶级makefile定义了一个变量,该变量只是顶级目录的路径,因此arch特定的makefile可以包含顶级src文件夹中的代码

但是,当包含顶级Makefile时,通过shell pwd命令定义的路径变量将在特定于arch的目录级别进行求值

我怎样才能解决这个问题?这是一种更好的方法吗


现在是两层结构。但在未来,我计划将顶层设置为多个层次,最里面的层次是特定于拱门的,当一个人移动到顶层时,层次将变得越来越通用。

我为您提供了两个选项

archX/目录的通用makefile模板 现在,您已经可以使用

$make-C arch1 顶级目录生成文件 现在,您可以使用

$make ARCH=arch1 就我个人而言,我根本不会编写顶级makefile,而只使用前一种方法


我认为你应该避免像$shell这样的东西。但这可能只是我个人的观点,请恕我直言……

您的顶级makefile在做什么我是说,你能独立运行make吗?如果不是这样,那么您真正从中获得的似乎只是源文件和头位置的列表-只需在公共_make.mk或somthing中指定这些文件和头位置会更容易,其中只包含:

SOURCES += ../src/test1.c
SOURCES += ../src/test2.c
SOURCES += ../src/test3.c
INC += ../inc
然后,两个较低级别的文件都包含这个非常基本的makefile片段,您不必担心路径

通常,我会将公共元素放入单独的配置控制回购协议中,而我的项目则相反:

arch1/
   |--src
   |--inc
   |--common (repo)
       |--inc
       |--src 

arch2/
   |--src
   |--inc
   |--common (repo)
       |--inc
       |--src 
所以这里我有两个单独的回购协议和一个共享子回购协议。如果您想将两个archx项目绑定在一起,您可以使用它自己的makefile将它们添加到super repo中,该makefile只需执行以下操作:

make -C arch1
make -C arch2

看一看。它已经很老了,但我认为它仍然是相关的。简而言之,它打破了并行构建;建议包括所有子makefile,让make计算出最佳构建顺序。该文档忽略了。基于我在大型软件构建系统中20多年的丰富经验,认为单个makefile有害是更合适的说法。当您的构建在16核系统上几乎不使用2核时,它绝对不会忽略阿姆达尔定律。“make for a大型系统构建的总体适用性是值得怀疑的,”维克多斯吉恩科说,“那么,你的经验和我的不同。就这样吧。
SOURCES += ../src/test1.c
SOURCES += ../src/test2.c
SOURCES += ../src/test3.c
INC += ../inc
arch1/
   |--src
   |--inc
   |--common (repo)
       |--inc
       |--src 

arch2/
   |--src
   |--inc
   |--common (repo)
       |--inc
       |--src 
make -C arch1
make -C arch2