명령 을 쓰다
7372 단어 Makefile
Tab
키 를 누 르 면 명령 이 규칙 뒤에 있 는 분점 뒤에 바짝 붙 어 있 지 않 습 니 다.명령 줄 사이 의 빈 칸 이나 빈 줄 은 무시 되 지만, 이 빈 칸 이나 빈 줄 이 Tab 키 로 시작 하면 make 는 빈 명령 이 라 고 생각 합 니 다.명령 보이 기
보통 make 는 명령 이 실행 되 기 전에 실행 할 명령 행 을 화면 에 출력 합 니 다.우리
@
문자 가 명령 줄 앞 에 있 으 면 이 명령 은 make 에 표시 되 지 않 습 니 다. 가장 대표 적 인 예 는 이 기능 으로 화면 에 정 보 를 표시 하 는 것 입 니 다.예:@echo XXX ......
make 가 실 행 될 때 "XXX 모듈 을 컴 파일 하고 있 습 니 다..."문자열 을 출력 하지만 명령 을 출력 하지 않 습 니 다. "@"이 없 으 면 make 는 출력 합 니 다:
echo XXX ......
XXX ......
make 가 실 행 될 때 make 인 자 를 가 져 옵 니 다.
-n
혹시 --just-print
,그러면 명령 만 표시 하지만 명령 을 실행 하지 않 습 니 다. 이 기능 은 우리 가 작성 한 명령 이 어떤 모양 이나 순서 로 실행 되 는 지 디 버 깅 하 는 데 유리 합 니 다.make 매개 변수
-s
혹시 --silent
혹시 --quiet
전면 금지 명령 의 표시 입 니 다.명령 실행
목표 에 의존 하여 새로운 목표, 즉 규칙 의 목표 가 업데이트 되 어야 할 때 make 는 그 후의 명령 을 하나씩 수행 합 니 다.주의해 야 할 것 은 이전 명령 의 결 과 를 다음 명령 에 적용 하려 면 이 두 명령 을 구분 하 는 분 호 를 사용 해 야 한 다 는 것 이다.예 를 들 어 첫 번 째 명령 은 cd 명령 입 니 다. 두 번 째 명령 이 cd 이후 에 실행 되 기 를 바 랍 니 다. 그러면 이 두 명령 을 두 줄 에 쓸 수 없고 이 두 명령 을 한 줄 에 쓰 고 분점 으로 구분 해 야 합 니 다.예:
exec:
cd /home/hchen
pwd
exec:
cd /home/hchen; pwd
우리 가 집행 할 때
make exec
첫 번 째 예 에 서 는 cd 가 작 동 하지 않 습 니 다. pwd 는 현재 Makefile 디 렉 터 리 를 출력 합 니 다. 두 번 째 예 에 서 는 cd 가 작 동 합 니 다. pwd 는 '/home/hchen' 을 출력 합 니 다.make 는 일반적으로 환경 변수 SHELL 에서 정의 하 는 시스템 Shell 을 사용 하여 명령 을 수행 합 니 다. 기본적으로 UNIX 의 표준 Shell -/bin/sh 를 사용 하여 명령 을 수행 합 니 다.우선 make 는 SHELL 이 지정 한 경로 에서 명령 해석 기 를 찾 습 니 다. 찾 지 못 하면 현재 디스크 에 있 는 현재 디 렉 터 리 에서 찾 습 니 다. 찾 지 못 하면 PATH 환경 변수 에서 정의 하 는 모든 경로 에서 찾 습 니 다.
명령 오류
명령 이 실 행 될 때마다 make 는 모든 명령 의 반환 코드 를 검사 합 니 다. 명령 이 성공 하면 make 는 다음 명령 을 실행 합 니 다. 규칙 에 있 는 모든 명령 이 성공 적 으로 돌아 온 후에 이 규칙 은 성공 적 으로 완 료 된 것 입 니 다.만약 규칙 중의 어떤 명령 이 잘못 되 었 다 면, make 는 현재 규칙 의 실행 을 중지 합 니 다. 이것 은 모든 규칙 의 실행 을 중지 할 수 있 습 니 다.
어떤 때 는 명령 의 오류 가 잘못 되 었 다 는 것 을 나타 내지 않 는 다.예 를 들 어 mkdir 명령 은 디 렉 터 리 를 만들어 야 합 니 다. 디 렉 터 리 가 존재 하지 않 으 면 mkdir 가 성공 적 으로 실 행 됩 니 다. 만사 가 다 잘 됩 니 다. 디 렉 터 리 가 존재 하면 오류 가 발생 합 니 다.우리 가 mkdir 를 사용 하 는 이 유 는 반드시 이러한 디 렉 터 리 가 있어 야 한 다 는 뜻 입 니 다. 그래서 우 리 는 mkdir 가 잘못 되 어 규칙 의 운행 을 중지 하 는 것 을 원 하지 않 습 니 다.
이 를 위해 명령 의 오 류 를 무시 하고 Makefile 명령 줄 앞 에 마이너스 번 호 를 추가 할 수 있 습 니 다.
-
(Tab 키 이후) 명령 이 잘못 되 었 든 안 되 었 든 성공 적 이 라 고 표 시 됩 니 다.예:clean:
-rm -f *.o
또 하나의 전체적인 방법 은 make 에
-i
혹은 --ignore-errors
인자, 그러면 Makefile 의 모든 명령 이 오 류 를 무시 합 니 다.만약 하나의 규칙 이 .IGNORE
목표 로 서 이 규칙 의 모든 명령 은 오 류 를 무시 합 니 다.명령 오 류 를 방지 하 는 단계별 방법 입 니 다. 좋아 하 는 설정 에 따라 설정 할 수 있 습 니 다.그리고 언급 할 make 의 매개 변 수 는?
-k
혹은 --keep-going
,이 매개 변 수 는 어떤 규칙 의 명령 이 잘못 되면 이 규칙 의 실행 을 중지 하지만 다른 규칙 을 계속 실행 한 다 는 뜻 이다.끼 워 넣 기 실행 make
일부 큰 프로젝트 에서 우 리 는 서로 다른 모듈 이나 서로 다른 기능 의 소스 파일 을 서로 다른 디 렉 터 리 에 넣 을 것 입 니 다. 우 리 는 모든 디 렉 터 리 에 이 디 렉 터 리 의 Makefile 을 쓸 수 있 습 니 다. 이것 은 우리 의 Makefile 을 더욱 간결 하 게 만 드 는 데 유리 합 니 다. 모든 것 을 하나의 Makefile 에 쓰 지 않 으 면 우리 의 Makefile 을 유지 하기 어렵 습 니 다.이 기술 은 우리 모듈 의 컴 파일 과 세그먼트 컴 파일 에 매우 큰 장점 을 가지 고 있다.
예 를 들 어 subdir 라 는 하위 디 렉 터 리 가 있 습 니 다. 이 디 렉 터 리 아래 에 Makefile 파일 이 있 습 니 다. 이 디 렉 터 리 아래 파일 의 컴 파일 규칙 을 가 리 킵 니 다.그러면 우리 가 총 제어 하 는 Makefile 은 이렇게 쓸 수 있다.
subsystem:
cd subdir && $(MAKE)
그 등 가 는 다음 과 같다.
subsystem:
$(MAKE) -C subdir
$(MAKE) 매크로 변 수 를 정의 하 는 것 은 make 에 인자 가 필요 할 수도 있 기 때문에 하나의 변수 로 정의 하 는 것 이 유지보수 에 유리 하 다 는 뜻 입 니 다.이 두 가지 예 는 'subdir' 디 렉 터 리 에 먼저 들 어간 다음 make 명령 을 실행 한 다 는 뜻 이다.
저 희 는 이 Makefile 을 "총 제어 Makefile"이 라 고 부 릅 니 다. Makefile 을 제어 하 는 변 수 는 하위 Makefile 에 전달 할 수 있 습 니 다.
-e
매개 변수.다음 Makefile 에 변 수 를 전달 하려 면 다음 과 같은 설명 을 사용 할 수 있 습 니 다.
export ;
다음 Makefile 에 변 수 를 전달 하지 않 으 려 면 다음 과 같이 설명 할 수 있 습 니 다.
unexport ;
예:
예시 1:
export variable = value
그 등 가 는 다음 과 같다.
variable = value
export variable
그 등 가 는 다음 과 같다.
export variable := value
그 등 가 는 다음 과 같다.
variable := value
export variable
예시 2:
export variable += value
그 등 가 는 다음 과 같다.
variable += value
export variable
모든 변 수 를 전달 하려 면 export 하나만 있 으 면 됩 니 다.뒤 에는 아무것도 따 르 지 않 고 모든 변 수 를 전달 하 는 것 을 나타 낸다.
주의해 야 할 것 은 두 개의 변수 가 있 는데 하 나 는?
SHELL
,네, 맛 없어 요. MAKEFLAGS
,이 두 변 수 는 export 여부 와 상 관 없 이 항상 하층부 Makefile 에 전달 되 어야 합 니 다. 특히... MAKEFLAGS
변 수 는 make 의 매개 변수 정 보 를 포함 하고 있 습 니 다. 만약 에 저희 가 '총 제어 Makefile' 을 실행 할 때 make 매개 변수 가 있 거나 상층 Makefile 에서 이 변 수 를 정의 하면 MAKEFLAGS
변 수 는 이러한 매개 변수 이 고 하층부 Makefile 에 전 달 됩 니 다. 이것 은 시스템 급 환경 변수 입 니 다.그러나 make 명령 의 몇 가지 매개 변 수 는 아래로 전달 되 지 않 습 니 다.
-C
, -f
, -h
, -o
화해시키다 -W
(Makefile 매개 변수 에 대한 자세 한 내용 은 뒤에서 설명 합 니 다) 매개 변 수 를 아래로 전달 하고 싶 지 않 으 면 이렇게 할 수 있 습 니 다.subsystem:
cd subdir && $(MAKE) MAKEFLAGS=
하면, 만약, 만약...
MAKEFLAGS
,그러면 그 중의 옵션 은 모두 가 사용 할 것 이 라 고 확신 해 야 한다. 만약 그 중 에 있다 면. -t
, -n
화해시키다 -q
매개 변수, 그러면 예상 치 못 한 결과 가 있 을 것 입 니 다. 아마도 당신 을 매우 놀 라 게 할 것 입 니 다."끼 워 넣 기 실행"에서 비교적 유용 한 인자 가 있 습 니 다.
-w
혹은 --print-directory
make 과정 에서 현재 작업 디 렉 터 리 를 볼 수 있 도록 정 보 를 출력 합 니 다.예 를 들 어, 만약 우리 의 하급 make 디 렉 터 리 가 "/home/hcen/gnu/make"라면, 만약 우리 가 사용한다 면 make -w
실행 합 니 다. 그러면 이 디 렉 터 리 에 들 어 갈 때 다음 을 볼 수 있 습 니 다.make: Entering directory `/home/hchen/gnu/make'.
하위 make 를 완성 하고 디 렉 터 리 를 떠 날 때 다음 을 볼 수 있 습 니 다.
make: Leaving directory `/home/hchen/gnu/make'
하면, 만약, 만약...
-C
인자 가 make 하층부 Makefile 을 지정 할 때, -w
자동 으로 열 려 요.하면, 만약, 만약... -s
( --slient
)혹은 --no-print-directory
,그럼, -w
항상 효력 을 잃 는 다.정의 명령 패키지
Makefile 에서 같은 명령 시퀀스 가 나타 나 면 같은 명령 시퀀스 에 변 수 를 정의 할 수 있 습 니 다. 이 명령 시퀀스 의 문법 을 정의 합 니 다.
define
시작 하 다 endef
끝나다define run-yacc
yacc $(firstword $^)
mv y.tab.c $@
endef
"run - yacc"는 이 명령 패키지 의 이름 입 니 다. Makefile 의 변수 와 이름 을 바 꾸 지 마 십시오.
define
화해시키다 endef
이 명령 패키지 의 첫 번 째 명령 은 Yacc 프로그램 을 실행 하 는 것 입 니 다. Yacc 프로그램 은 항상 "y. tab. c"파일 을 만 들 기 때문에 두 번 째 줄 의 명령 은 이 파일 의 이름 을 바 꾸 는 것 입 니 다. 이 명령 패 키 지 를 예제 에 넣 어 보 세 요.foo.c : foo.y
$(run-yacc)
이 명령 패 키 지 를 사용 하려 면 변 수 를 사용 하 는 것 과 같 습 니 다. 이 명령 패 키 지 를 사용 할 때 명령 패 키 지 는 "run - yacc"에 있 습 니 다.
$^
바로... 이다 foo.y
, $@
바로... 이다 foo.c
,make 명령 패 키 지 를 실행 할 때 명령 패키지 의 모든 명령 은 순서대로 독립 적 으로 실 행 됩 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Golang 테스트 커버리지를 효율적으로 확인이전 기사에서 테스트 커버리지를 쉘 스크립트로 만들고 그것을 실행하여 확인했습니다. 이번 이를 Dockerfile과 Makefile에 정리해 보다 테스트 커버리지를 확인하기 쉽게 한 메모. 멀티 스테이지 빌드의 st...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.