테스트를 실행할 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
첫째, echo
ed 값 PATH
은 쉘이 아닌 Make에 의해 수행되는 변수 의 확장입니다 . 예상 값을 인쇄하면 PATH
Makefile의 초기 어딘가 또는 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)