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
이것은 나에게도 작동하지 않습니다. which및 env은 원래 하나에, 이제 새 경로를 선택하지만, 직접 바이너리를 실행하는 것은 여전히 수정 된 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.