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
변수를 만들기 위한 할당을 반영하는 것은 아닙니다.PATH
GNU 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