Makefile (4): Makefile 규칙 의 명령

규칙 중의 명령 은 셸 에 전달 되 어 해석 집행 된다.뒤에 의존 하 는 첫 번 째 명령 을 제외 하고 다른 명령 은 tab 키 와 시작 해 야 합 니 다.다음 과 같다.
  :  ;  1
      2

일반적인 상황 에서 도 이런 쓰 기 를 추천 하지 않 습 니 다. 추천 하 는 쓰 기 는 명령 1 을 다른 줄 로 하고 tab 키 로 시작 하 는 것 이 좋 습 니 다. 이렇게 하 는 것 은 관찰 하기 쉽 지만 빈 명령 을 제외 하고 빈 명령 1 절 을 참조 하 십시오.
명령 의 회 현
Makefile 은 명령 을 실행 할 때 표준 출력 에 명령 을 표시 합 니 다. 표준 출력 에 표시 하지 않 으 려 면 다음 방법 을 사용 하 십시오. 1. 각 명령 앞에서 @ 문자열 을 사용 하면 다음 과 같 습 니 다.
wanbiao:
    @echo $(name)

이렇게 명령 을 실행 할 때 이 명령 이 표준 출력 에 나타 나 는 것 을 말 하지 않 습 니 다. 2. 명령 행 인 자 를 사용 하여 make 가 실행 하 는 명령 입력 에 - s, – silent 옵션 을 입력 하면 모든 명령 이 표준 출력 에 나타 나 지 않 음 을 표시 합 니 다.구체 적 으로 어떤 방식 을 사용 하 는 지 는 구체 적 으로 정 하 는 것 입 니 다. 일반적인 상황 에서 @ 더욱 유연 합 니 다. 3. LIENT 를 사용 하여 LIENT 목표 에 의존 을 추가 하면 의존 목록 에 나타 난 목표, 재 구축 시 명령 을 표시 하지 않 습 니 다.
명령 의 집행
서로 다른 tab 키 로 시작 하 는 명령 어 는 서로 다른 셸 스 레 드, 즉 첫 번 째 줄 을 사용 합 니 다. 두 번 째 줄 에서 사용 하 는 셸 스 레 드 와 다 르 기 때문에 첫 번 째 줄 에서 디 렉 터 리 를 전환 한 후 두 번 째 줄 에서 전환 하 는 디 렉 터 리 에서 다시 사용 하지 않 습 니 다. 디 렉 터 리 를 바 꾼 후에 정상적으로 사용 하려 면 같은 줄 에 써 야 합 니 다. 줄 을 바 꾸 려 면'\' 줄 바 꿈 부 호 를 사용 하여 줄 을 바 꿀 수 있 습 니 다. 예 를 들 어 다음 과 같 습 니 다.
all:
    cd prog
    cp -a * out

위의 예 에서 cd 에서 prog 디 렉 터 리 에 이 르 면 두 번 째 줄 의 cp 명령 이 실 행 될 때 prog 디 렉 터 리 에 있 지 않 기 때문에 prog 디 렉 터 리 에 도달 하려 면 같은 줄 에 써 야 합 니 다.아래 와 같다
all:
    cd prog;cp -a * out

셸 에 서 는 분점 으로 분할 명령 을 하기 때문에 첫 번 째 명령 과 두 번 째 명령 사이 에 분 호 를 사용 하여 분할 합 니 다. 여러 줄 에 쓰 려 면 반사 선 을 사용 할 수 있 습 니 다. 다음 과 같 습 니 다.
all:
    cd prog;\
cp -a * out

3. 명령 의 오류
make 명령 이 잘못 되 었 을 때 현재 실행 환경 을 종료 하고 오 류 를 보고 합 니 다.어떤 때 는 명령 의 실행 오류 가 최종 목표 의 생 성에 영향 을 주지 않 는 다.만약 rm 명령 이 삭제 할 파일 이 이미 존재 한다 면 rm 명령 은 삭제 에 성공 하고 삭제 할 파일 이 존재 하지 않 으 면 rm 은 오 류 를 보고 합 니 다.그러나 이런 실 수 는 최종 목표 수립 에 영향 을 미 치지 않 기 때문에 우 리 는 이런 실 수 를 무시 할 수 있다.makefile 에서 오 류 를 무시 하 는 방법 은 세 가지 가 있 습 니 다. 1. @ 기 호 를 사용 하 는 것 과 마찬가지 로 우 리 는 기 호 를 사용 합 니 다. - 명령 의 오 류 를 무시 합 니 다.2. - s 옵션 을 사용 하 는 것 과 마찬가지 로 - i 옵션 과 - igoner - errors 를 사용 하여 모든 명령 오 류 를 무시 합 니 다.첫 번 째 잘못 을 수정 한 후에 야 뒤에 잘못 이 있 는 지 아 닌 지 를 알 수 있어 서 매우 번거롭다.이러한 번 거 로 움 을 피하 기 위해 서 는 명령 행 에서 – keep - going 을 사용 하여 make 에 오류 가 발생 했 을 때 잠시 물 러 나 지 않 고 뒤의 명령 을 계속 수행 할 수 있 으 며 후속 목 표를 계속 수행 할 수 없 을 때 까지 물 러 날 수 있 습 니 다.이렇게 하면 한 번 에 여러 개의 원본 파일 을 수정 한 상황 에서 어떤 수정 에 문제 가 있 을 때 까지 최대한 할 수 있다.
메모: – keep - going 을 사용 하 는 것 이 좋 지만 그 가 만 든 중간 파일 은 이미 업데이트 되 었 습 니 다. 그러나 그의 내용 은 틀 릴 수 있 습 니 다. 따라서 다음 make 전에 생 성 된 중간 파일 을 삭제 하 십시오.일반적으로 컴 파일 시스템 마다 clean 의 위조 목표 가 있 습 니 다.직접 make clean 을 사용 하여 중간 파일 을 삭제 할 수 있 습 니 다.
4. 명령 패키지 정의 (Makefile 의 사용자 정의 함수)
대부분의 언어 에 서 는 내 장 된 함 수 를 사용 하 는 것 외 에 도 사용자 정의 함 수 를 사용 할 수 있다.하나의 함 수 는 바로 일부 열 집행 문장의 집합 이다.Makefile 에서 도 실행 문장의 집합 을 정의 할 수 있 습 니 다.그것 의 형식 은 다음 과 같다.
define    
    
endef

메모: 여 기 는 변수 이름 이 라 고 합 니 다. 함수 이름 이 라 고 부 르 지 않 습 니 다. Makefile 의 매 뉴 얼 에 있 기 때 문 입 니 다. 이 문법 은 본질 적 으로 여러 줄 변 수 를 정의 하 는 것 입 니 다. 즉, 위의 실행 문 구 는 변수의 값 입 니 다.
예 를 들 면 다음 과 같다.
define name
wanbiao
zhangsan
lisi
endef

변 수 를 정의 합 니 다 name. 값 은 세 줄 입 니 다. 각각
wanbiao
zhangsan
lisi

Makefile 의 변수 인용 은 c 언어의 매크로 교체 에 해당 하기 때문에 우 리 는 여기에서 변수의 값 을 각종 실행 문 으로 바 꿀 수 있 습 니 다. 그러면 자동화 변수 와 내 장 된 call 함수 에 맞 춰 다른 언어의 함수 기능 을 실현 할 수 있 습 니 다.예 를 들 면 아래 와 같다.
define catfunction
$(1)$(2).png
endef
$(warning $(call catfunction,wanbiao,20171016))

위의 코드 를 직접 실행 하면 다음 과 같은 출력 을 얻 을 수 있 습 니 다.
wanbiao20171016.png

call 함수 와 warning 함수 에 대한 상세 한 설명 은 뒤에 내 장 된 함수 1 소절 을 참고 할 수 있 습 니 다. 이 문법 은 call 함수 와 eval 함수 에 맞 춰 모듈 화 된 기능 을 실현 합 니 다.상세 한 내용 은 뒤의 소 개 를 참고 하 시기 바 랍 니 다.
5. 제어 명령 의 집행
1. 파 라 메 터 를 사용 하여 명령 을 병행 하 는 make 옵션 매개 변수 에서 - j 또는 – job 의 매개 변수 옵션 을 제공 하여 명령 의 실행 을 제어 하고 몇 개의 스 레 드 를 사용 합 니 다.이 인 자 를 사용 하지 않 았 을 때 기본적으로 스 레 드 를 사용 합 니 다. -j. 뒤에 정수 와 함께 몇 개의 스 레 드 를 사용 하 는 것 을 나타 낸다.다 중 스 레 드 는 make 의 운행 효율 을 높 일 수 있 지만 이것 은 스 레 드 수가 많 을 수록 효율 이 높다 는 것 을 의미 하지 않 습 니 다.운영 체제 가 스 레 드 위 에서 전환 하려 면 일정한 자원 을 소모 해 야 한다.따라서 합 리 적 인 분배 라인 수 는 make 컴 파일 효율 을 제공 하 는 전제 조건 이다.프로젝트 를 컴 파일 할 때 cpu 와 메모리 의 많은 자원 을 소모 해 야 할 수도 있 습 니 다.그러면 우리 가 같은 컴퓨터 에서 다른 일 을 해 야 할 때 매우 멈 출 수 있 습 니 다. 따라서 우 리 는 make 에 최대 부하 하 나 를 지정 할 수 있 습 니 다. 이 최대 부하 가 초과 되면 make 는 - j 를 통 해 스 레 드 수 를 지정 하 더 라 도 새로운 스 레 드 를 다시 만 들 지 않 습 니 다.인자 - l 또는 – max - load 를 사용 하여 부동 소수점 을 추가 하여 최대 부하 임 을 표시 합 니 다.부동 소수점 에 있 는 이 매개 변 수 는 앞의 부하 제한 을 취소 하 는 것 을 표시 합 니 다.2. 취소 명령 의 실행 은 make 에서 실 행 될 때 ctrl + c 키 를 누 르 면 현재 make 의 실행 을 취소 할 수 있 습 니 다.make 가 중단 되면 자동 으로 삭 제 됩 니 다. 생 성 된 중간 파일 입 니 다.이렇게 하면 다음 집행 의 정확성 을 보장 할 수 있다.
6. make 의 재 귀 집행
make 의 재 귀 는 명령 행 에서 make 명령 을 사용 하여 다른 Makefile 파일 을 호출 하 는 것 을 말 합 니 다.
주의: 이곳 의 귀속 과 c 언어의 귀속 은 약간의 차이 가 있 습 니 다. c 언어의 귀속 은 함수 가 스스로 자신 을 호출 하 는 것 을 말 합 니 다.
make 의 귀속 예 는 다음 과 같다.
subsystem:
cd subdir && $(MAKE)

subdir 디 렉 터 리 에 들 어간 다음 make 명령 을 실행 합 니 다. 아래 규칙 과 같 습 니 다.
subsystem:
$(MAKE) -C subdir

메모: 이 변수 MAKE 는 make 명령 에 대한 참조 입 니 다. make 명령 을 직접 사용 할 수 있 지만 이러한 용법 을 추천 하지 않 습 니 다. 다음 과 같은 이유 가 있 습 니 다. 1. 맨 위 make 에서 make 프로그램 을 지정 한 후에 MAKE 변 수 를 사용 합 니 다. 아래쪽 make 에 서 는 같은 make 프로그램 을 사용 합 니 다. MAKE 변 수 를 사용 하지 않 으 면,기본 make 프로그램 을 사용 합 니 다. 맨 위 에 있 는 make 프로그램 과 다 를 수 있 습 니 다.2. 옵션 - t (– touch), - n (– just - print), - q (– question) 를 사용 할 때 모든 명령 은 실행 되 지 않 지만 MAKE 변 수 를 사용 한 명령 은 제외 합 니 다.MAKE 변 수 를 대체 하기 위해 make 명령 을 사용 하면, 아래 makefile 에 서 는 실행 되 지 않 습 니 다. 대응 하 는 - t, - n, - q 옵션 은 우리 가 원 하 는 효과 가 아 닙 니 다.
6. 변수의 아래로 전달 과 절단
맨 위 makefile 에서 정 의 된 변 수 는 맨 아래 makefile 파일 에 전달 되 지 않 습 니 다.따라서 같은 이름 의 두 변 수 는 서로 다른 등급 의 Makefiile 에 있 습 니 다.맨 위 에 있 는 Makefile 의 변 수 를 아래쪽 Makefile 에 전달 하려 면 다음 방법 을 사용 할 수 있 습 니 다. export 키 워드 를 사용 하여 다음 층 에 전달 해 야 할 Makefile 의 변 수 를 추가 하 는 환경 변수 에 전달 할 수 있 습 니 다.하층 의 변수 이름과 상층 의 변수 이름 이 같 으 면 하층 의 변수 이름 을 덮어 쓰 지 않 습 니 다.하층부 환경 변 수 를 덮어 쓰 려 면 - e (– environment - overrides) 인 자 를 사용 할 수 있 습 니 다.
export   

변 수 를 가 진 export 는 모든 변 수 를 환경 변수 로 바 꾸 고 하층부 Makefile 에 전달 합 니 다.어떤 변 수 를 하층부 에 전달 하지 않 으 려 면 unexport 키 워드 를 사용 할 수 있 습 니 다.
  :unexport   

특히 주의해 야 할 것 은: 1. 명령 행 을 통 해 설명 하 는 변수 도 하층부 Makefile 에 전 달 됩 니 다.2. MAKEFILES, MAKEFLAGS, SHELL 변 수 는 unexport 키 워드 를 사용 하지 않 는 한 하층 makefile 에 전 달 됩 니 다.사실 위의 주의 에서 첫 번 째 항목 은 두 번 째 항목 의 MAKEFLAGS 에 배치 할 수 있 습 니 다. 명령 행 매개 변 수 를 통 해 지정 한 변 수 는 MAKEOVRRIDES 변수 에 저장 되 고 MAKEOVRRIDES 변 수 는 MAKEFLAGS 변수 에 의 해 참조 되 기 때 문 입 니 다.MAKEFLAGS 변수의 값 은 명령 행 안의 매개 변수 이지 만 몇 개의 매개 변 수 는 MAKEFALGS 에 할당 되 지 않 습 니 다. 그들 은 '- C', '- f', '- o' 와 '- W' 입 니 다.이 몇 개의 매개 변수의 구체 적 인 의 미 는 뒤의 Makefile 매개 변수 설명 장 을 참조 합 니 다.

좋은 웹페이지 즐겨찾기