Как я могу добавить dir в $PATH в Makefile?
Я хочу написать Makefile, который будет выполнять тесты. Тест в каталог.и исполняемые файлы /тесты для тестирования в каталог.- бин.
когда я запускаю тесты, они не видят файлы 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?
5 ответов:
ты
exportдиректива самого Make (предполагая, что вы используете GNU Make)?export PATH := bin:$(PATH) test all: xкроме того, есть ошибка в тебе пример:
test all: PATH=bin:${PATH} @echo $(PATH) xво-первых, стоимостью
echoed-это расширениеPATHпеременная, выполняемая Make, а не оболочкой. Если он печатает ожидаемое значение, то, я думаю, вы установилиPATHпеременная где-то раньше в вашем Makefile, или в оболочке, которая вызвала Make. Чтобы предотвратить такое поведение, вы должны бежать доллары:test all: PATH=bin:$$PATH @echo $$PATH xво-вторых, в любом случае это не будет работать потому что выполняет каждая строка рецепта в отдельная раковина. Это можно изменить, написав рецепт в одной строке:
test all: export PATH=bin:$$PATH; echo $$PATH; x
изменения пути кажутся постоянными, если вы сначала установите переменную оболочки в свой makefile:
SHELL := /bin/bash PATH := bin:$(PATH) test all: xЯ не знаю, если это желаемое поведение или нет.
конструкция
makeпарсер выполняет строки в отдельной оболочке вызовов, поэтому изменение переменной (напримерPATH) в одной строке изменение не может быть применено для следующих строк (см. Это post).один из способов обойти эту проблему-преобразовать несколько команд в одну строку (разделенную
;), или использовать Один Снаряд специальные цели (.ONESHELL, по состоянию на GNU составляют 3.82).в качестве альтернативы вы можете предоставить
PATHпеременная в момент вызова оболочки. Например:PATH := $(PATH):$(PWD)/bin:/my/other/path SHELL := env PATH=$(PATH) /bin/bash
то, что я обычно делаю, это явно указать путь к исполняемому файлу:
EXE=./bin/ ... test all: $(EXE)xЯ также использую этот метод для запуска неродных двоичных файлов под эмулятором, таким как QEMU, если я кросс-компиляция:
EXE = qemu-mips ./bin/Если make использует оболочку sh, это должно работать:
test all: PATH=bin:$PATH x
установить
PATHпеременная, только в файле Makefile, используйте что-то вроде:PATH := $(PATH):/my/dir test: @echo my new PATH = $(PATH)
Comments