Makefile을 통해 PATH에 디렉터리 추가

Makefile을 통해 PATH에 디렉터리 추가

Makefile에서 수정된 PATH를 현재 터미널로 내보내는 데 몇 가지 문제가 있습니다. Makefile 디렉터리가 있는 bin 폴더를 PATH에 추가하려고 합니다.

makefile의 관련 부분은 다음과 같습니다.

PATH := $(shell pwd)/bin:$(PATH)

install:
    mkdir -p ./bin 
    export PATH
    echo $(PATH)

echo는 이를 올바르게 인쇄하지만 터미널에서 echo를 다시 실행하면 PATH가 동일하게 유지됩니다.

답변1

당신은 그렇게 할 수 없습니다. make 프로세스는 상위 환경(또는 다음에 생각하는 현재 디렉토리)을 변경할 수 없습니다.

실제로 생각보다 적은 일이 발생합니다.

  • 모든 구현이 환경에서 make변수를 만들기 위한 할당을 반영하는 것은 아닙니다. PATHGNU make(Linux 및 기타 시스템에 있음)는 반영하지만 BSD make는 그렇지 않습니다.
  • 대상 아래의 각 명령줄은 별도의 하위 셸에서 실행됩니다. (일부 이전 BSD make 구현을 제외하고) 따라서 이 export PATH줄은 쉘에서 실행된 다음 즉시 종료됩니다. 이 줄이 처음부터 어떤 작업도 수행하는 것은 아닙니다. PATH나중에 정의된 경우 이는 이미 셸 환경에 있기 때문입니다.

Make는 자동으로 물건을 만드는 것입니다. 대화형 환경에 대한 변수를 설정하려는 경우 이는 고려해야 할 도구가 아닙니다. 대신 쉘 조각을 작성하고원천현재 셸에서:

. ./define-my-variables.sh

makefile에서 스크립트를 얻으십시오.각 서브쉘에서. 백슬래시를 사용하여 긴 명령을 작성할 수 있습니다.

  • 백슬래시 줄 바꿈 시퀀스는 make에 의해 제거되므로 쉘은 거기에 있는 줄 바꿈을 볼 수 없습니다.
  • 그래도 각 줄 앞에 탭 문자를 추가하는 것을 잊지 마세요.
  • Make의 잘못된 동작은 명령 실패 시 중단되는 것입니다. 셸에서는 기본적으로 이 작업을 수행하지 않으며, 마지막 명령을 제외한 모든 명령의 실패는 기본적으로 감지되지 않으므로 를 실행해야 합니다 set -e.
install:
    set -e; \
    . ./define-my-variables.sh; \
    mkdir -p bin; \

1 주의해야 할 점: 현명한 방법은 없습니다. 디버거에서 원격 chdir으로 호출하는 경우에도 ptrace현재 디렉터리를 변경하는 것을 좋아하지 않기 때문에 대부분의 셸처럼 작동하지 않습니다.

답변2

여기서 답을 찾을 수 있습니다:https://stackoverflow.com/a/8942216/367461

기본적으로 다음과 같이 해야 합니다.

export PATH := $(shell pwd)/bin:$(PATH)

test:
    mkdir -p ./bin
    @echo $(PATH)

저는 이것을 GNU Make 4.0을 사용하여 Fedora 23에서 테스트했고 제게는 잘 작동했습니다.

답변3

당신은 할 수 없습니다. 하위 프로세스(예:) make가 상위 프로세스의 환경을 변경하는 것은 불가능합니다 .

당신은 다음과 같은 것을 할 수 있습니다

$ eval `make pathupdate`

목표는 pathupdate다음과 같습니다:

pathupdate:
    @echo PATH=\"$(PATH)\"

답변4

다음과 같이 수정된 환경을 사용하여 Make 호출 자체를 재귀적으로 만들 수 있습니다.

dummy: build_all

all: 
    PATH=/new/directory:$(PATH) $(MAKE) build_all

build_all:
    your make rules 

셸 조각을 사용하려면 다음을 수행하세요.

dummy: build_all

all:
    . ./define-my-variables.sh ; $(MAKE) build_all

build_all:
   your make rules

관련 정보