【问题标题】:Make include in makefiles be relative to the file's location使 makefile 中的包含相对于文件的位置
【发布时间】:2011-12-25 20:08:25
【问题描述】:

this question 直接相关。如何使 makefile 中的 include 指令的行为与当前脚本的位置相关?

假设 当前 路径是任意的,您无法控制它。只有生成文件的位置是已知的。您的 makefile 不是根文件 - 它已包含在内。在 Android NDK 中就是这样。

是否有带有当前 makefile 名称的内置变量?我可以去掉文件名,只留下路径吗?在 Cygwin 上使用 make 3.81。

【问题讨论】:

  • 问题不清楚:您是说生成文件的位置是已知的。那么,你就没有问题了!
  • Include 查找当前文件夹以及初始 makefile 所在的文件夹。我的 makefile 包含在初始 makefile 中;包括没有按预期工作。也就是说,几年前我找到了一种解决方法 - 我用项目位置创建了一个环境变量。
  • 所以,您甚至没有使用答案。叹。顺便说一句,初始makefile的文件夹不在包含路径中。
  • 它们都不适用于ndk-buildndk-gdb :( 现在无论如何,NDK 构建架构已经完全不同了。

标签: makefile cygwin android-ndk


【解决方案1】:

您可以从MAKEFILE_LIST builtin variable 获取当前正在处理的makefile 的名称。

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

SELF_DIR := $(dir $(lastword $(MAKEFILE_LIST)))

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

include $(SELF_DIR)another.mk

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

lastword = $(if $(firstword $1),$(word $(words $1),$1))

【讨论】:

  • 在我的例子中,MAKEFILE_LIST 返回一些不相关的东西。
  • 看起来很奇怪,我也刚刚在 Cygwin 上尝试了解决方案,一切都按预期工作......在你的情况下,MAKEFILE_LIST 的价值是什么?
  • 不知道,但是出来的路径 /cygdrive/c/android-ndk-r6b/buil d/core/ 。这是 Android NDK,我的 makefile 只是一个相当大的构建框架中的一个小片段。
  • 唯一剩下的想法是检查您是否将SELF_DIR 分配为您的makefile 的第一条语句,然后再包含其他任何内容。此外,赋值必须是简单的 (:=),而不是递归的 (=)。
  • 顾名思义,MAKEFILE_LIST 是一个列表,可能包含的不仅仅是当前的 makefile。您不能依赖它来始终指向当前的 Makefile。
【解决方案2】:

是否存在具有当前 makefile 名称的内置变量?

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

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

【讨论】:

  • 不错,但有问题。 CURDIR 似乎有时以 / 终止(在调用 ndk-gdb 时),有时 (ndk-build) 不是。有什么办法吗?
  • 没关系,因为 foo//bar 是合法路径,它等于 foo/bar。所以你可以只使用 ${CURDIR}/...
  • Funny... 现在 ndk-build 工作正常,ndk-gdb 的行为就好像 CURDIR 比我的项目位置高一级。现在我完全困惑了。
  • 我不认为操作问你回答了什么。从手册中“[...] 特别注意,如果您包含来自其他目录的文件,则 CURDIR 的值不会改变”。所以你不能用它来计算一个包含的makefile目录。
  • 错了。 $(CURDIR) 与任何 Makefile 位置都没有关系。它只是启动初始 make 命令的目录(并且在递归调用 make 时不会改变)。
【解决方案3】:

我发现相对路径有效(GNUMake 3.81),但如果它们不适合你,试试这个:

include $(abspath ../whatever)

【讨论】:

  • 很好,但是在 ndk-gdb 构建时它会错误地解析,上一级太多了。我想假设是相对路径相对于当前目录(而不是文件的目录)仍然存在。
  • 重复错误:这不适用于树外构建。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 2012-12-26
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多