I want to write a Makefile which would run tests. Test are in a directory './tests' and executable files to be tested are in the directory './bin'.
When I run the tests, they don't see the exec files, as the directory ./bin is not in the $PATH.
When I do something like this:
EXPORT PATH=bin:$PATH
make test
everything works. However I need to change the $PATH in the Makefile.
Simple Makefile content:
test all:
PATH=bin:${PATH}
@echo $(PATH)
x
It prints the path correctly, however it doesn't find the file x.
When I do this manually:
$ export PATH=bin:$PATH
$ x
everything is OK then.
How could I change the $PATH in the Makefile?
What I usually do is supply the path to the executable explicitly:
EXE=./bin/
...
test all:
$(EXE)x
I also use this technique to run non-native binaries under an emulator like QEMU if I'm cross compiling:
EXE = qemu-mips ./bin/
If make is using the sh shell, this should work:
test all:
PATH=bin:$PATH x
Path changes appear to be persistent if you set the SHELL variable in your makefile first:
SHELL := /bin/bash
PATH := bin:$(PATH)
test all:
x
I don't know if this is desired behavior or not.
By design make
parser executes lines in a separate shell invocations, that's why changing variable (e.g. PATH
) in one line, the change may not be applied for the next lines (see this post).
One way to workaround this problem, is to convert multiple commands into a single line (separated by ;
), or use One Shell special target (.ONESHELL
, as of GNU Make 3.82).
Alternatively you can provide PATH
variable at the time when shell is invoked. For example:
PATH := $(PATH):$(PWD)/bin:/my/other/path
SHELL := env PATH=$(PATH) /bin/bash
To set the PATH
variable, within the Makefile only, use something like:
PATH := $(PATH):/my/dir
test:
@echo my new PATH = $(PATH)
Source: Stackoverflow.com