[linux] Makefile의 $ PATH에 dir을 어떻게 추가 할 수 있습니까?

테스트를 실행할 Makefile을 작성하고 싶습니다. 테스트는 ‘./tests’디렉토리에 있으며 테스트 할 실행 파일은 ‘./bin’디렉토리에 있습니다.

테스트를 실행할 때 ./bin 디렉토리가 $ PATH에 없기 때문에 exec 파일을 볼 수 없습니다.

다음과 같이 할 때 :

EXPORT PATH=bin:$PATH
make test

모든 것이 작동합니다. 그러나 Makefile에서 $ PATH를 변경해야합니다.

간단한 Makefile 내용 :

test all:
    PATH=bin:${PATH}
    @echo $(PATH)
    x

경로를 올바르게 인쇄하지만 x 파일을 찾지 못합니다.

수동으로 수행하는 경우 :

$ export PATH=bin:$PATH
$ x

그러면 모든 것이 괜찮습니다.

Makefile에서 $ PATH를 어떻게 변경할 수 있습니까?



답변

Make 자체의 export지시문 을 시도 했습니까 (GNU Make를 사용한다고 가정)?

export PATH := bin:$(PATH)

test all:
    x

또한 예제에 버그가 있습니다.

test all:
    PATH=bin:${PATH}
    @echo $(PATH)
    x

첫째, echoed 값 PATH은 쉘이 아닌 Make에 의해 수행되는 변수 의 확장입니다 . 예상 값을 인쇄하면 PATHMakefile의 초기 어딘가 또는 Make를 호출 한 쉘에서 변수를 설정 한 것 같습니다 . 이러한 행동을 방지하려면 다음과 같이 달러를 피해야합니다.

test all:
    PATH=bin:$$PATH
    @echo $$PATH
    x

둘째, Make는 별도의 shell 에서 레시피의 각 줄을 실행하기 때문에 어떤 경우에도 작동하지 않습니다 . 레시피를 한 줄로 작성하여 변경할 수 있습니다.

test all:
    export PATH=bin:$$PATH; echo $$PATH; x


답변

설계 상 make파서는 별도의 셸 호출로 행을 실행하므로 PATH한 행에서 변수 (예 :)를 변경 하면 다음 행에 변경 사항이 적용되지 않을 수 있습니다 (이 게시물 참조 ).

이 문제를 해결하는 한 가지 방법은 여러 명령을 단일 행 (으로 구분 ;) 으로 변환 하거나 One Shell 특수 대상 ( .ONESHELL, GNU Make 3.82 기준)을 사용하는 것입니다.

또는 PATH쉘이 호출 될 때 변수를 제공 할 수 있습니다 . 예를 들면 :

PATH  := $(PATH):$(PWD)/bin:/my/other/path
SHELL := env PATH=$(PATH) /bin/bash


답변

makefile에서 SHELL 변수를 먼저 설정하면 경로 변경이 영구적 인 것처럼 보입니다.

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

test all:
    x

이것이 바람직한 행동인지 아닌지 모르겠습니다.


답변

내가 보통하는 일은 실행 파일의 경로를 명시 적으로 제공하는 것입니다.

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)


답변