【发布时间】:2026-01-26 22:35:02
【问题描述】:
背景:我有一个定制的工具链,应该由 Makefile 使用。工具链被检出(通过 svn:externals)到项目的工作副本中。 Makefile 必须适应 PATH 变量。否则无法找到工具链二进制文件。在 '.bashrc' 或 '.profile' 中调整 'PATH' 是没有选择的,因为有多个项目使用不同版本的工具链。
查看这个最小的 Makefile 演示对交叉编译器 'cc' 的调用,它位于 '/home/edeviser/bin' 中的其他几个工具旁边:
export PATH:=/home/edeviser/bin:$(PATH)$
$(info Compiler used: $(shell which cc))
all:
@echo "Compiler used: $(shell which cc)"
@echo -n "Compiler used: "
@which cc
调用make后的输出:
Compiler used: /usr/bin/cc
Compiler used: /usr/bin/cc
Compiler used: /home/edeviser/bin/cc
我的期望是:
Compiler used: /home/edeviser/bin/cc
Compiler used: /home/edeviser/bin/cc
Compiler used: /home/edeviser/bin/cc
如何在 GNU Make 中修改 PATH 并成功使用 $(shell ...) 执行命令?
【问题讨论】:
-
exportin make 不会导出到执行的 shell 或配方中的命令。它将变量导出到子制作中。 -
哦,我不知道。但我想知道它在一种情况下是否有效,而不是在 sub-make 调用中执行。
-
这是因为最后一次调用在一个额外的进程(shell)中运行,它确实从 make 接收修改后的环境。恕我直言,没有为运行过程本身修改的环境一定是从远古时代遗留下来的,因为它是一个非常令人费解和奇怪的不一致。
标签: shell makefile path gnu-make