如何在Makefile中将$ dir添加到$ PATH?

时间:2012-01-20 11:59:31

标签: linux makefile

我想编写一个可以运行测试的Makefile。测试位于“./tests”目录中,要测试的可执行文件位于“./bin”目录中。

当我运行测试时,他们没有看到exec文件,因为目录./bin不在$ PATH中。

当我做这样的事情时:

EXPORT PATH=bin:$PATH
make test
一切正常。但是我需要在Makefile中更改$ PATH。

简单的Makefile内容:

test all:
    PATH=bin:${PATH}
    @echo $(PATH)
    x

它正确打印路径,但是找不到文件x。

当我手动执行此操作时:

$ export PATH=bin:$PATH
$ x

一切都好。

如何更改Makefile中的$ PATH?

5 个答案:

答案 0 :(得分:82)

您是否尝试过制作本身的export directive(假设您使用的是GNU Make)?

export PATH := bin:$(PATH)

test all:
    x

另外,你的例子中有一个错误:

test all:
    PATH=bin:${PATH}
    @echo $(PATH)
    x

首先,值echo ed是由Make执行的PATH变量的扩展,而不是shell。如果它打印出预期值,那么,我想,你已经在Makefile中的某个地方或者在调用Make的shell中设置了PATH变量。为了防止这种行为,你应该逃避美元:

test all:
    PATH=bin:$$PATH
    @echo $$PATH
    x

其次,无论如何这都行不通,因为Make在separate shell中执行配方的每一行。这可以通过在一行中编写配方来改变:

test all:
    export PATH=bin:$$PATH; echo $$PATH; x

答案 1 :(得分:21)

如果首先在makefile中设置SHELL变量,则路径更改似乎是持久的:

SHELL := /bin/bash
PATH := bin:$(PATH)

test all:
    x

我不知道这是否是所希望的行为。

答案 2 :(得分:17)

通过设计make解析器在单独的shell调用中执行行,这就是为什么在一行中更改变量(例如PATH),更改可能不会应用于下一行(请参阅此{{ 3}})。

解决此问题的一种方法是将多个命令转换为单行(由;分隔),或使用post特殊目标(.ONESHELL,从GNU Make 3.82开始)。

或者,您可以在调用shell时提供PATH变量。例如:

PATH  := $(PATH):$(PWD)/bin:/my/other/path
SHELL := env PATH=$(PATH) /bin/bash

答案 3 :(得分:3)

我通常做的是明确提供可执行文件的路径:

EXE=./bin/
...
test all:
    $(EXE)x

如果我正在交叉编译,我也会使用这种技术在像QEMU这样的模拟器下运行非原生二进制文件:

EXE = qemu-mips ./bin/

如果make正在使用sh shell,这应该有效:

test all:
    PATH=bin:$PATH x

答案 4 :(得分:-2)

要在Makefile中设置PATH变量,请使用以下内容:

PATH := $(PATH):/my/dir

test:
@echo my new PATH = $(PATH)