【问题标题】:Setting PATH variable from inside makefile does not work for make 3.81从 makefile 内部设置 PATH 变量不适用于 make 3.81
【发布时间】:2012-07-31 17:21:21
【问题描述】:

在 Makefile 中更改环境变量 `PATH' 对 CLT 中的 make 无效,而我从原始源编译的 make util 可以。

简单的 Makefile

PATH := $(PATH):/opt/bin

export PATH

all:
      @cscope --version

我的测试

/tmp $ echo $PATH
/usr/bin:/bin:/usr/sbin:/sbin
/tmp $ ls /opt/bin/cscope
/opt/bin/cscope
/tmp $ which make
/usr/bin/make
/tmp $ make
make: cscope: No such file or directory
make: *** [all] Error 1
/tmp $ ./_install/bin/make
cscope: version 15.7a
/tmp $ make --version
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.


This program built for i386-apple-darwin11.3.0
/tmp $ ./_install/bin/make --version
GNU Make 3.82
Built for x86_64-apple-darwin12.0.0
Copyright (C) 2010  Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

谁能帮忙?

【问题讨论】:

  • cscope 是您唯一担心的工具,还是 /opt/bin/ 中的其他工具?
  • 不,它只是一个简单的测试工具,不在系统'PATH'中。

标签: xcode makefile osx-mountain-lion


【解决方案1】:

您将make 变量与shell 变量混淆了。通过您的设置,调用的 shell 命令不受您设置的 make 变量 PATH 的影响。

您应该在配方中设置PATH 变量,例如

all:
    @PATH=$(PATH):/opt/bin; cscope --version

您必须在一行中同时设置,因为配方中的每一行都将在另一个 shell 中运行,实际上丢失了您刚刚所做的 PATH 设置。或者,您可以通过在每行末尾添加反斜杠 \ 将其分成多行:

all:
    @PATH=$(PATH):/opt/bin; \
    cscope --version

更新

抱歉,我错过了使用 make 3.82 的 makefile 的重要性。我尝试了这两个版本,确实,3.813.82 在这种情况下表现不同。

我确实通过如下方式调用make 使其与3.81 一起工作:

make SHELL="/bin/sh -c"

make SHELL=/bin/bash

【讨论】:

  • 先谢谢你的回答。按照您的方式,我必须将“@PATH = $(PATH):/opt/bin”添加到每个目标的命令中。而从原始源构建的 make util 没有这个问题。
  • 有问题的 Makefile 是一个简单的例子,不是真正使用的。
  • 是的,它有效。但是env可以看到已经在环境变量中的'SHELL=/bin/bash'。
  • 谢谢。但是我尝试从源代码构建 v3.81,它可以工作。然后我在make中回显'SHELL'内部变量,它是'/bin/sh',Xcode的make和我自己构建的。
  • 在 Reinier Torenbeek 的帮助下,我找到了解决方案,在 Makefile 的头部添加以下行 export SHELL := $(shell echo $$SHELL)。但我还不知道原因。因为程序'make'中的内部变量'SHELL'是'/bin/sh',无论是Xcode的版本还是我自己构建的。
猜你喜欢
  • 1970-01-01
  • 2022-01-21
  • 2014-01-05
  • 2014-01-28
  • 2012-06-19
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 2014-11-13
相关资源
最近更新 更多