Я хочу написать 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?
../test/test_to_run
? Извините, если я неправильно понял вопрос..
. Однако это, вероятно, непрактично.Ответы:
Вы пробовали использовать
export
директиву Make (при условии, что вы используете GNU Make)?Кроме того, в вашем примере есть ошибка:
Во-первых, редактируемое значение
echo
- это расширениеPATH
переменной, выполняемое Make, а не оболочкой. Если он печатает ожидаемое значение, то, я полагаю, вы установилиPATH
переменную где-то раньше в вашем Makefile или в оболочке, которая вызвала Make. Чтобы предотвратить такое поведение, вам следует избегать долларов:Во-вторых, в любом случае это не сработает, потому что Make выполняет каждую строку рецепта в отдельной оболочке . Это можно изменить, записав рецепт в одну строку:
источник
$(PATH)
будет установлено значениеPATH
оболочки, вызывающей make. Согласно руководству : «Каждая переменная среды, которую видит программа make при запуске, преобразуется в переменную make с тем же именем и значением».PATH
правильно отражено в переменных (echo $(PATH)
) и в среде команд (env
,which python
,bash -c python
), но , кажется, не будет использоваться при поиске исполняемого файла для команды: командаpython
все еще бежит Исполняемый файл Python на оригиналеPATH
.По задумке
make
парсер выполняет строки в отдельных вызовах оболочки, поэтому при изменении переменной (напримерPATH
) в одной строке изменение может не применяться для следующих строк (см. Этот пост ).Один из способов решения этой проблемы - преобразовать несколько команд в одну строку (разделенных символом
;
) или использовать специальную цель One Shell (.ONESHELL
как в GNU Make 3.82).В качестве альтернативы вы можете указать
PATH
переменную во время вызова оболочки. Например:источник
$(shell)
вызовами! : D Пример: pastebin.com/Pii8pmkDИзменения пути кажутся постоянными, если вы сначала установите переменную SHELL в вашем make-файле:
Я не знаю, желаемое ли это поведение или нет.
источник
which
иenv
теперь выберите новый PATH, но прямое выполнение двоичного файла все еще не найдено в измененном PATH, а только в исходном.Обычно я указываю путь к исполняемому файлу явно:
Я также использую этот метод для запуска неродных двоичных файлов под эмулятором, например QEMU, если я выполняю кросс-компиляцию:
Если make использует оболочку sh, это должно сработать:
источник
Чтобы установить
PATH
переменную только в Makefile, используйте что-то вроде:источник