【问题标题】:Setting PATH within Makefile on Mac OS X (but it works on Linux)在 Mac OS X 上的 Makefile 中设置 PATH(但它适用于 Linux)
【发布时间】:2014-10-19 19:00:48
【问题描述】:

我可以在 Linux 上的 Makefile 中设置 PATH,但不能在 Mac OS X 上设置。对于 OS X,PATH 已设置但未使用。这是一个演示:

在带有 bash 4.1.2(1)-release 和 GNU Make 3.81 的 CentOS 6 上

$ pwd
/tmp/experiment
$ find * -type f -ls
132133    4 -rw-rw-r--   1 tlim tlim      113 Aug 26 11:01 Makefile
132132    4 -rwxrwxr-x   1 tlim tlim       28 Aug 26 10:59 bin/myprog
$ cat Makefile 
export PATH := $(shell /bin/pwd)/bin:$(PATH)

what:
    @echo PATH=$$PATH
    @echo PATH=$(PATH)
    which myprog
    myprog
$ cat bin/myprog 
#!/bin/bash
echo HERE I AM.
$ make what
PATH=/tmp/experiment/bin:/usr/stack/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin
PATH=/tmp/experiment/bin:/usr/stack/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin
which myprog
/tmp/experiment/bin/myprog
myprog
HERE I AM.

下面是在带有 GNU Make 3.81 的 Mac OS X 10.9.4 上运行的完全相同的文件:

$ pwd
/tmp/experiment
$ find * -type f -ls
51838886        8 -rw-rw-r--    1 tal              wheel                 113 Aug 26 07:01 Makefile
51838887        8 -rwxrwxr-x    1 tal              wheel                  28 Aug 26 06:59 bin/myprog
$ cat Makefile 
export PATH := $(shell /bin/pwd)/bin:$(PATH)

what:
    @echo PATH=$$PATH
    @echo PATH=$(PATH)
    which myprog
    myprog
$ cat bin/myprog 
#!/bin/bash
echo HERE I AM.
$ make what
PATH=/tmp/experiment/bin:/Users/tal/bin:/opt/local/sbin:/opt/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin
PATH=/tmp/experiment/bin:/Users/tal/bin:/opt/local/sbin:/opt/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin
which myprog
/tmp/experiment/bin/myprog
myprog
make: myprog: No such file or directory
make: *** [what] Error 1

如您所见,PATH 正在设置并导出到环境中。 “echo $PATH”和“which myprog”都表明路径已设置。但是,当运行“myprog”时,shell 找不到它。

更新:如果我将这两行添加到 Makefile 中的 what 配方中:

@echo SHELL=$$SHELL
@echo SHELL=$(SHELL)

Linux 和 Mac 输出:

SHELL=/bin/bash
SHELL=/bin/sh

在运行 make 之前,环境中的 SHELL 等于 /bin/bash。这让我觉得在 Makefile 中设置 SHELL 很神奇,这也是 GNU Make 手册说总是设置 SHELL 的众多原因之一。

【问题讨论】:

  • /bin/bash 是 OS X 上bash 的正确路径?如果您以./myprog(从makefile 内部或外部)运行脚本,它是否可以正常工作?
  • 是的,/bin/bash 是两个系统上的正确路径。 ./myprog 运行没有任何问题。
  • 还有 md5/等。总和确认脚本是相同的?没有意外插入 UTF-8 BOM 或转换为非 unix 换行符或其他任何东西?

标签: macos makefile gnu-make


【解决方案1】:

事实证明 PATH 变量是特殊的,除非"SHELL" is also set 否则不会导出。换句话说,如果我将这一行添加到 Makefile 它适用于 Mac 和 Linux:

SHELL=/bin/bash

当然,这让我想知道为什么 Mac 与众不同。希望通过在此处记录此问题,其他看到此问题的人也将受益。另外,我想知道为什么 Mac 是不同的,如果真的不同的话。

【讨论】:

  • 使用SHELL=/bin/sh 有效吗?那是SHELL 的设置或正在使用的shell 的问题吗? (也许 OS X /bin/sh 不尊重 PATH 的环境值。)
  • 嗯,不是 make 问题恕我直言。 which 只是说在您的$PATH 上有一个具有给定名称的可执行文件,并没有说该文件可以执行。什么可能导致它无法加载?一大堆问题。依赖的共享库文件可能。您的$LD_LIBRARY_PATH 是否包含.?甚至不确定 Mac 是否使用 $LD_LIBRARY_PATH,可能需要访问正确的框架。 bash 可能会为您正确设置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-28
  • 1970-01-01
  • 2011-12-16
  • 2013-07-27
  • 2012-04-03
  • 1970-01-01
相关资源
最近更新 更多