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


87

테스트를 실행할 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를 어떻게 변경할 수 있습니까?


다음과 같이 실행 가능한 디렉토리에서 테스트를 호출 할 수 없습니까 ../test/test_to_run? 질문을 잘못 이해했다면 죄송합니다.
Chris

이 파일이 정상적으로 테스트에 표시되기를 원합니다. 나는 리팩토링이 거의 될 것이기 때문에 디렉토리를 가지고 놀고 싶지 않습니다.
Szymon Lipiński

이것에 접근 할 수있는 유일한 방법은 makefile이 변수 decls를 포함하는 쉘 스크립트를 작성하고 그 스크립트가 .. 그러나 이것은 아마도 비실용적입니다.
Michael Smith

나는 unix.stackexchange.com/questions/11530/… 이 당신과 는 매우 다른 (어리석은) 질문 이라고 생각합니다 .
IMZ - 이반 Zakharyaschev

답변:


106

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

7
$(PATH)PATHmake를 호출하는 쉘 의 값으로 설정됩니다 . 에 따라 수동 , "이 같은 이름과 값을 가진 메이크업 변수로 변환된다 시작될 때 모든 환경 변수 메이크업은보고있다."
에밀 앉아

내보내기 지시문은 저에게 효과적이었습니다 (감사합니다!).하지만 GNU Make 4.3을 설치 한 후에야합니다. 버전 3.81 (맥 OS 카탈리나의 기본)에서이 업데이트 PATH올바르게 변수 (에 반영 echo $(PATH)) 및 명령 '환경 (내 env, which python, bash -c python)하지만, 명령의 실행 파일을 찾을 때 사용하지 않는 것 : 명령이 python여전히 실행 원본 PATH.
doctaphred

27

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

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

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

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

2
나는 접근 방식을 좋아합니다!
Alan Franzoni

2
이것은 $(shell)호출 에서도 작동하기 때문에 최고입니다 ! : D 예제 : pastebin.com/Pii8pmkD
PsychoX

dev.azure에서 다음을 얻습니다. env : 'env': 그러한 파일이나 디렉토리가 없습니다. 로컬 작업; /
Kamil Dziedzic

make 4.2가 설치된 Debian 10에서는 작동하지 않습니다. make : env PATH = <path> / bin / sh : 명령을 찾을 수 없습니다. 수출 작품 사용. 홈 디렉토리의 경로에 ~가 아닌 $ (HOME)을 사용해야합니다.
MKesper

25

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

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

test all:
    x

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


이것은 내가 가진 문제를 해결했습니다 (저는 zsh를 실행 중입니다). 감사!
Jezen Thomas 2014

그래, 이것은 실제로 OP가 원하는 것을 수행하지만 기능 또는 버그입니까? 메이크 매뉴얼의 SHELL 섹션 을 읽은 후에도 잘 모르겠습니다.
pje 2014

5
이것은 나에게도 작동하지 않습니다. whichenv은 원래 하나에, 이제 새 경로를 선택하지만, 직접 바이너리를 실행하는 것은 여전히 수정 된 PATH에서 찾을 수 없습니다.
Konrad Rudolph 2014

3

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

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

또한 크로스 컴파일을하는 경우이 기술을 사용하여 QEMU와 같은 에뮬레이터에서 네이티브가 아닌 바이너리를 실행합니다.

EXE = qemu-mips ./bin/

make가 sh 쉘을 사용하는 경우 다음과 같이 작동합니다.

test all:
    PATH=bin:$PATH x

그래, 멋진 soulution, 그러나 나는 내 테스트를 perl로 작성했으며 makefile에서 직접이 아닌 perl 스크립트에서 exe를 호출해야합니다. 나는 :)이 물건의 전체 테스트 재고있어
인 Szymon 리핀 스키

알았어. 명령 줄 자체에 PATH를 설정하는 것은 어떻습니까? 위의 편집을 참조하십시오.
Richard Pennington 2012 년

-2

PATH변수 를 설정하려면 Makefile 내에서만 다음과 같이 사용하십시오.

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

test:
@echo my new PATH = $(PATH)

내가 원하는 방식으로 작동하지 않습니다. 내가 성취하고 싶은 것에 대한 예를 들어 질문을 업데이트했습니다.
Szymon Lipiński
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.