我怎么可以添加目录到$ PATH在Makefile中?

我想写一个运行testing的Makefile。 testing位于“./tests”目录中,待testing的可执行文件位于“./bin”目录下。

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

当我做这样的事情时:

EXPORT PATH=bin:$PATH make test 

一切正常。 不过,我需要改变Makefile中的$ PATH。

简单的Makefile内容:

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

它正确地打印path,但它没有find文件x。

当我手动执行此操作时:

 $ export PATH=bin:$PATH $ x 

一切都好了。

我怎么能改变Makefile中的$ PATH?

您是否尝试了Make自己的export指令 (假设您使用GNU Make)?

 export PATH := bin:$(PATH) test all: x 

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

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

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

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

其次,在任何情况下这都不起作用,因为Make在单独的shell中执行配方的每一行。 这可以通过在一行中写入配方来改变:

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

如果您首先在您的生成文件中设置SHELLvariables,path更改似乎是持久的:

 SHELL := /bin/bash PATH := bin:$(PATH) test all: x 

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

当shell被make调用时,它可能仍然使用旧的PATH。 所以最好在调用shell的时候提供PATHvariables。 例如:

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

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

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

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

 EXE = qemu-mips ./bin/ 

如果make使用sh shell,这应该工作:

 test all: PATH=bin:$PATH x 

要仅在Makefile中设置PATHvariables,请使用如下所示的内容:

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