使makefile中的include包含在文件的位置

Sev*_*yev 19 cygwin makefile android-ndk

此问题直接相关.如何使includemakefile中的指令相对于当前脚本的位置?

假设当前路径是任意的,您无法控制它.只有makefile位置是已知的.你的makefile不是根文件 - 它包含在内.这就是Android NDK的确切方式.

是否有一个内置变量与当前的makefile名称?我可以从中删除文件名,只留下路径吗?在Cygwin上使用make 3.81.

Eld*_*mov 17

您可以从MAKEFILE_LIST内置变量获取当前正在处理的makefile的名称.

鉴于当前的makefile是已包含的最后一个(换句话说,include自当前脚本开始以来你没有使用另一个指令),脚本本身的路径将是:

SELF_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
Run Code Online (Sandbox Code Playgroud)

现在你可以在同一个目录中包含一个脚本(注意没有斜杠,它已被添加$(dir ...)):

include $(SELF_DIR)another.mk
Run Code Online (Sandbox Code Playgroud)

注意:在GNU Make 3.80中没有lastword内置函数.在这种情况下,您可以按如下方式实现它,替换$(lastword ...)$(call lastword,...):

lastword = $(if $(firstword $1),$(word $(words $1),$1))
Run Code Online (Sandbox Code Playgroud)

  • 顾名思义,“ MAKEFILE_LIST”是一个列表,可能不仅仅包含当前的makefile。您不能依靠它始终指向当前的Makefile。 (2认同)

小智 6

是否有一个内置变量与当前的makefile名称?

是的,有,使用$ {CURDIR}.这是顶级Makefile所在的目录,因此您无需从中删除任何内容.

http://www.gnu.org/software/make/manual/make.html#Recursion

  • 大错特错。`$(CURDIR)` 与任何 Makefile 位置完全无关。它只是启动初始 make 命令的目录(并且在递归调用 make 时不会改变)。 (3认同)
  • 我不认为操作问你回答了什么.从手册"[...]特别注意,如果你包含来自其他目录的文件,CURDIR的值不会改变".所以你不能用它来计算一个包含的makefile目录. (2认同)