Как я могу добавить dir в $PATH в Makefile?
Я хочу написать Makefile, который будет запускать тесты. Тест находится в директории "./tests" и исполняемые файлы, которые нужно протестировать, в каталоге "./bin".
Когда я запускаю тесты, они не видят файлы exec, так как каталог. /bin не находится в $PATH.
Когда я делаю что-то вроде этого:
EXPORT PATH=bin:$PATH
make test
все работает. Однако мне нужно изменить $PATH в Makefile.
Простой контент Makefile:
test all:
PATH=bin:${PATH}
@echo $(PATH)
x
Он правильно печатает путь, однако он не находит файл x.
Когда я делаю это вручную:
$ export PATH=bin:$PATH
$ x
все в порядке.
Как я могу изменить $PATH в Makefile?
Ответы
Ответ 1
Вы попробовали export
директиву сделать сам (предполагая, что используете GNU Make)?
export PATH := bin:$(PATH)
test all:
x
Кроме того, в вашем примере есть ошибка:
test all:
PATH=bin:${PATH}
@echo $(PATH)
x
Во-первых, значение echo
ed является расширением переменной PATH
, выполняемой Make, а не оболочкой. Если он печатает ожидаемое значение, то, я думаю, вы установили переменную PATH
где-то раньше в Makefile или в оболочку, которая вызывается Make. Чтобы предотвратить такое поведение, вы должны избегать доллара:
test all:
PATH=bin:$$PATH
@echo $$PATH
x
Во-вторых, в любом случае это не сработает, потому что Make выполняет каждую строку рецепта в отдельной оболочке. Это можно изменить, написав рецепт в одной строке:
test all:
export PATH=bin:$$PATH; echo $$PATH; x
Ответ 2
Изменения пути кажутся постоянными, если вы сначала установите переменную SHELL в свой файл:
SHELL := /bin/bash
PATH := bin:$(PATH)
test all:
x
Я не знаю, является ли это желательным поведением или нет.
Ответ 3
Когда оболочка вызывается make
, она, вероятно, все еще использует старый PATH. Поэтому лучше всего указать переменную PATH
в момент вызова оболочки. Например:
PATH := $(PATH):$(PWD)/bin:/my/other/path
SHELL := env PATH=$(PATH) /bin/bash
Ответ 4
То, что я обычно делаю, это явно указать путь к исполняемому файлу:
EXE=./bin/
...
test all:
$(EXE)x
Я также использую этот метод для запуска невзаимодействующих двоичных файлов под эмулятором, например, QEMU, если я перекрестно компилирую:
EXE = qemu-mips ./bin/
Если make использует оболочку sh, это должно работать:
test all:
PATH=bin:$PATH x
Ответ 5
Чтобы установить переменную PATH
, только в Makefile, используйте что-то вроде:
PATH := $(PATH):/my/dir
test:
@echo my new PATH = $(PATH)