Как я могу добавить 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?

700   5  

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

    Ничего не найдено.