【问题标题】:how to set the directory where Makefile exists so that I can run make from different directory using `make -C` option?如何设置 Makefile 所在的目录,以便我可以使用 `make -C` 选项从不同的目录运行 make?
【发布时间】:2021-05-19 05:15:00
【问题描述】:

~/prj/abc/abcsim/abctsim/abcxyz/Makefile下面有一行。

TOOLCHAIN_DIR   := $(PWD)/../../../prj1/tools/gcc_tools  

如果我在目录~/test 中,并且如果我运行make -C ~/prj/abc/abcsim/abctsim/abcxyz,这不起作用,因为$(PWD) 变量设置为~/test,而不是~/prj/abc/abcsim/abctsim/abcxyz。如何获取Makefile 所在的目录路径?
在 bash 中有这样的东西:How can I get the source directory of a Bash script from within the script itself?

【问题讨论】:

  • 为了完全清楚,make 对变量PWD 根本没有特殊处理。就 make 而言,PWD 只是它从 shell 继承的另一个变量,如 PATHUSER 等。所以,你的 makefile 中 PWD 的值是你的 shell 的任何值 传入,这是你调用 make 之前 shell 的工作目录。正如下面所指出的,CURDIR 是一个 make 变量,它将设置为在处理-C 之后,make 正在运行的工作目录。

标签: makefile gnu-make


【解决方案1】:

如果你真的使用make -C(不是make -f)并且你的Makefile没有包含在另一个中,你可以简单地使用CURDIR variable。 GNU make 在启动时将其设置为当前目录的绝对路径,“在它处理了任何-C 选项之后”。因此,在您的情况下,它应该完全按照您的意愿行事。

否则,如果您有时使用 make -f 或者如果您包含了 Makefile,您可以将其作为任何 Makefile 的第一行(或至少在任何 include 语句之前):

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

然后使用$(HERE) 来引用这个Makefile 的目录。详情请见the GNU make manual

注意:我几乎可以肯定这个问题会重复。令人惊讶的是,我搜索了一个明确的答案,只找到了在使用 make 内置函数或错误答案之前首先建议 shell 调用的旧答案(例如,使用 firstword 而不是 lastword)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-30
    • 2021-04-08
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 2010-10-01
    相关资源
    最近更新 更多