Makefile的执行流程,包括其他makefile

时间:2014-04-25 18:43:48

标签: makefile gnu-make

1)makefile执行流程如何工作,假设makefile-1包含另一个makefile-2而makefile-2包含另一个makefile-3?

2)如果包含的makefile包含一些应该被所有三个使用的规则和变量 - 它是如何工作的?如果一个人不止一次包含同一个makefile会怎么样?

3)使用导出包含makefile的变量? - 它们是否在所有makefile中都可用,

我的理解是什么, makefile解释器(或者我不知道哪个术语更适合这里)在makefile中作为行读取,如果有任何include指令,它会使makefile中的所有变量/规则可用(顶级make - 包括其他)

4)但如果两个包含的makefile重写变量或彼此的规则会发生什么? 它是否像最后一个包含的makefile一样优先?

5)如果包含的makefile中的任何规则调用顶级makefile的规则,它是否完全执行顶级makefile(从第一行开始)?

6)make中有两种赋值:

i)在使用时扩展(=)

ii)在申报时扩大(:=)    这种变量在多级makefile中如何处理?

7)如果我在创建列表时使用gdumake的函数(如notdir,patsubt)会发生什么

File = abc def ghi 
File += $(notdir ghi/jkl)

这个notdir呼叫何时发生?

(and also if I use ':=' what will be the difference ?)

考虑make包含以下规则,是否在解析依赖关系时调用它?

rule : File

1 个答案:

答案 0 :(得分:2)

包含makefile时,没有任何特殊的WRT排序。为了制作它,好像你构造了一个大的makefile,其中插入了包含的makefile的内容,其中include语句出现在父makefile中,然后传递一个大的makefile来制作。

因此,覆盖事物(变量等)的规则与覆盖单个makefile中的变量的情况相同:变量的每个后续赋值都会替换先前赋值的值。

如果使用目标的配方定义(单冒号)规则,然后稍后再次执行,则会收到错误消息并忽略其中一个。

任何makefile中列出的第一个显式目标(包括与否)都将是默认目标。

请记住,make never"执行"任何makefile完全。 Make不是一种过程语言,就像shell脚本一样。它首先解析所有makefile并在内部构造依赖图。然后它选择默认目标,并从每个目标开始遍历图形的各个部分。

编辑:

如果上述内容无法帮助您回答其他问题,那么我认为您应该尝试一下。尝试一下,看看会发生什么!比要求我们解释它更容易,而且如果你自己弄明白的话,你会更好地理解它。