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?
Did you try
export
directive of Make itself (assuming that you use GNU Make)?Also, there is a bug in you example:
First, the value being
echo
ed is an expansion ofPATH
variable performed by Make, not the shell. If it prints the expected value then, I guess, you've setPATH
variable somewhere earlier in your Makefile, or in a shell that invoked Make. To prevent such behavior you should escape dollars:Second, in any case this won't work because Make executes each line of the recipe in a separate shell. This can be changed by writing the recipe in a single line:
To set the
PATH
variable, within the Makefile only, use something like:What I usually do is supply the path to the executable explicitly:
I also use this technique to run non-native binaries under an emulator like QEMU if I'm cross compiling:
If make is using the sh shell, this should work:
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 changes appear to be persistent if you set the SHELL variable in your makefile first:
I don't know if this is desired behavior or not.