我怎么可以添加目录到$ 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执行的PATH
variables的扩展,而不是shell。 如果它打印出预期的值,那么我猜你已经在Makefile中的某个地方或者在调用Make的shell中设置了PATH
variables。 为了防止这种行为,你应该逃避美元:
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的时候提供PATH
variables。 例如:
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中设置PATH
variables,请使用如下所示的内容:
PATH := $(PATH):/my/dir test: @echo my new PATH = $(PATH)