Как я могу добавить dir к $ PATH в Makefile? - PullRequest
67 голосов
/ 20 января 2012

Я хочу написать Makefile, который будет запускать тесты.Test находится в каталоге «./tests», а исполняемые файлы для тестирования находятся в каталоге «./bin» .

Когда я запускаю тесты, они не видят исполняемые файлы, как каталог./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 ]

84 голосов
/ 20 января 2012

Пробовали ли вы export директиву для Make себя (при условии, что вы используете 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
22 голосов
/ 20 ноября 2012

Изменения пути кажутся постоянными, если вы сначала установили переменную SHELL в вашем файле:

SHELL := /bin/bash
PATH := bin:$(PATH)

test all:
    x

Я не знаю, является ли это желаемым поведением или нет.

17 голосов
/ 25 марта 2016

По замыслу make парсер выполняет строки в отдельных вызовах оболочки, поэтому при изменении переменной (например, PATH) в одной строке это изменение может не применяться к следующим строкам (см. Эту запись * 1004)*).

Одним из способов решения этой проблемы является преобразование нескольких команд в одну строку (разделенных ;) или использование специальной цели One Shell (.ONESHELL,начиная с GNU Make 3.82).

В качестве альтернативы вы можете указать переменную PATH во время вызова оболочки.Например:

PATH  := $(PATH):$(PWD)/bin:/my/other/path
SHELL := env PATH=$(PATH) /bin/bash
3 голосов
/ 20 января 2012

Обычно я явно указываю путь к исполняемому файлу:

EXE=./bin/
...
test all:
    $(EXE)x

Я также использую эту технику для запуска не собственных двоичных файлов под эмулятором, таким как QEMU, если я кросс-компилирую:

EXE = qemu-mips ./bin/

Если make использует оболочку sh, это должно работать:

test all:
    PATH=bin:$PATH x
0 голосов
/ 20 января 2012

Чтобы установить переменную PATH, только внутри Makefile, используйте что-то вроде:

PATH := $(PATH):/my/dir

test:
@echo my new PATH = $(PATH)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...