Подтвердить что ты не робот

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

4b9b3361

Ответ 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)