make 명령
용도
프로그램 그룹을 유지, 갱신 및 재생성합니다.
구문
make [ -D변수 ] [ -d 옵션 ] [ -e ] [ -i ] [ -j[채용 정보]] [ -k ] [ -n ] [ -p ] [ -q ] [ -r ] [ -S ] [ -s ] [ -t ] [ -f MakeFile ... ] [ 대상 ... ]
설명
make 명령은 프로그램 세트를 유지하는 데 도움을 줍니다. make 명령에 대한 입력은 파일 종속성 스펙의 리스트입니다.
makefile에는 4가지 유형의 행, 파일 종속성 스펙, 쉘 명령어, 변수 할당과 주석이 있습니다. 일반적으로 행은 한 행에서 \(백슬래시)로 끝나는 다음 행까지 계속 이어집니다. 다음 행에서 이어지는 줄 바꾸기 문자 및 처음 공백 문자는 단일 공백으로 압축됩니다.
파일 종속성 스펙
종속 행은 하나 이상의 목표, 연산자, 0 이상의 전제조건(소스)로 구성됩니다. 목표가 전제조건에 따라 다르며 이 전제조건으로부터 일반적으로 작성되는 관계를 작성합니다. 목표와 전제조건 간의 정확한 관계는 이를 구분하는 연산자에 의해 결정됩니다. 연산자는 다음과 같습니다.
| 항목 | 설명 |
|---|---|
| : | 수정 시간이 전제조건의 시간보다 짧은 경우, 목표는 이전의 것으로 간주됩니다. 목표의 전제조건은 이 연산자를 사용할 때 종속 행에 누적합니다. make 명령이 인터럽트되는 경우, 목표에 .PRECIOUS 속성이 없으면 제거됩니다. |
| :: | 전제조건이 지정되어 있지 않은 경우에는 목표가 항상 재작성됩니다. 그렇지 않으면, 전제조건이 목표보다 최근에 수정된 경우 목표는 이전의 것으로 간주됩니다. 이 연산자를 사용하는 경우, 목표의 전제조건은 종속 행에 누적하지 않습니다. make 명령이 인터럽트되면 목표가 제거되지 않습니다. |
파일 종속제품 스펙에는 두 가지 유형의 규칙, 추론과 목표가 있습니다. 추론 규칙은 목표를 갱신하는 방법을 지정합니다. 이 규칙에는 /(슬래시)가 없으며 최소 하나의 . (마침표)로 구성되는 행을 작성할 수 없습니다. 목표 규칙은 목표를 빌드하는 방법을 지정합니다. 이 규칙은 둘 이상의 목표를 가질 수 있습니다.
Makefile 실행
make 명령은 makefile의 명령을 한 행씩 실행합니다. make가 각 명령을 수행할 때, 명령을 표준 출력으로 작성합니다(다르게 지정하지 않으면 예를 들어 -s 플래그 사용). makefile에서 각 행의 명령 앞에는 탭이 있어야 합니다.
주석: 주석은 쉘 명령행을 제외한 어디에서나 # 문자로 시작해서 행의 끝까지 계속됩니다.
환경: 존재하는 경우 make 명령은 MAKEFLAGS 환경 변수를 사용합니다.
대상 규칙
목표 규칙은 다음 형식이 있습니다.
target[target...] : [prerequisite...] [;command]
<Tab>command특수 목표
특수 목표는 다른 목표와 함께 포함될 수 없습니다. 즉, 지정된 유일한 목표여야 합니다. 이들 목표는 make 명령 작업을 제어합니다. 이러한 목표는 다음과 같습니다.
| 항목 | 설명 |
|---|---|
| .DEFAULT | make 명령이 또다른 작성 방법을 알 수 없는 모든 목표(전제조건으로만 사용된)에 대한 규칙으로 사용됩니다. 쉘 스크립트만 사용됩니다. .DEFAULT 명령을 상속하는 대상의 < (왼쪽 대괄호) 변수는 대상의 고유 이름으로 설정됩니다. |
| .IGNORE | 이 목표의 전제조건은 목표 자체입니다. 이렇게 함으로써 목표와 연관된 명령의 오류는 무시됩니다. 전제조건이 지정되지 않은 경우 이는 -i 플래그를 지정하는 것과 같습니다. |
| .POSIX | make 명령이 다른 디폴트 규칙 파일을 작성하게 됩니다. 파일 /usr/ccs/lib/posix.mk는 POSIX 표준에서 지정한 것과 같은 디폴트 규칙을 제공합니다. |
| .PRECIOUS | 이 목표의 전제조건은 목표 자체입니다. .PRECIOUS는 목표가 제거되는 것을 금지합니다. 전제조건이 지정되지 않은 경우, .PRECIOUS 속성은 파일의 모든 목표에 적용됩니다. 일반적으로 make가 인터럽트되면(예를 들어 SIGHUP, SIGTERM, SIGINT 또는 SIGQUIT), 부분적으로 작성된 목표를 제거합니다. make가 -n, -p 또는 -q 플래그로 호출되었던 경우, 목표는 .PRECIOUS 속성이 있는 것으로 간주됩니다. |
| .SCCS_GET | 이 특수 목표는 전제조건 없이 지정해야 합니다. 특수 목표가 makefile에 포함된 경우, 이 특수 목표와 연관된 명령을 사용하여 현재 디렉토리에 없는 모든 SCCS 파일을 얻습니다. SCCS에서 소스 파일을 검색하는 데 사용되는 디폴트 명령은 이 특수 목표와 연관된 명령에 의해 대체됩니다. 종속성 목록에 소스 파일의 이름이 지정되면 ' make '은 다른 대상과 마찬가지로 처리합니다. 대상에 종속성이 없지만 디렉터리에 있는 경우 ' make 파일이 최신 상태인 것으로 가정합니다. 그러나 ' source_file 대상에 대해 ' SCCS/s.source_file '이라는 이름의 SCCS 파일이 발견되면 ' make 추가로 확인하여 대상이 최신 상태인지 확인합니다. 대상이 누락되었거나 SCCS 파일이 최신 버전인 경우 ' make ' .SCCS_GET ' 특수 대상에 지정된 명령을 자동으로 실행하여 가장 최신 버전을 검색합니다. 그러나 대상이 누구나 쓸 수 있는 경우 ' make '은 새 버전을 검색하지 않습니다. |
| .SILENT | 목표의 전제조건이 목표 자체입니다. 이렇게 함으로써 목표와 연관된 명령이 실행 전에 표준 출력으로 기록되지 않도록 합니다. 전제조건이 지정되지 않은 경우 .SILENT 속성은 파일에서 모든 명령에 적용됩니다. |
| .SUFFIX | make가 인식하는 파일 접미어 리스트에 접미어를 더 추가하려면 이 이름을 사용하십시오. 목표 전제조건이 알려진 접미어 리스트에 추가됩니다. 접미어를 지정하지 않으면, 이전에 지정된 접미어가 삭제됩니다. 이 접미어는 인터페이스 규칙에 사용됩니다. 접미어의 순서를 변경하려면 비어 있는 .SUFFIXES 항목 다음에 .SUFFIXES 항목의 새 리스트를 지정해야 합니다. makefile은 .SUFFIXES와 연관되어서는 안됩니다. |
추론 규칙
make 명령에는 makefile에서 추가적인 추론 규칙 정의를 보충하거나 겹쳐쓸 수 있는 일련의 디폴트 추론 규칙이 있습니다. 디폴트 규칙은 외부 파일, /usr/ccs/lib/aix.mk에 저장됩니다. 명령행에서 사용자 고유의 파일 이름에 MAKERULES 변수를 설정하여 사용자 고유의 규칙 파일을 대체할 수 있습니다. 다음 행은 명령행에서 규칙 파일을 변경하는 방법을 표시합니다.
make MAKERULES=/pathname/filename추론 규칙은 목표 접미어와 명령으로 구성됩니다. 접미어에서 make 명령은 전제조건을 판별하며, 접미어와 해당 전제조건 모두에서 make 명령은 목표를 최신으로 make하는 방법을 판별합니다. 추론 규칙은 다음과 같은 형식으로 되어 있습니다.
rule:
<Tab>command
...여기서rule에는 다음 형식 중 하나가 있습니다:
| 항목 | 설명 |
|---|---|
| .s1 | 단일 접미어 중 하나가 추가된 목표를 빌드하는 방법을 설명하는 단일 접미어 추론 규칙입니다. |
| .s1.s2 | .s1이 추가된 전제조건을 사용하여 .s2가 추가된 목표를 빌드하는 방법을 설명하는 이중 접미어 추록 규칙입니다. |
.s1 및 .s2 접미어는 특별 목표, .SUFFIXES의 전제조건으로 정의됩니다. 접미어 .s1 및 .s2는 makefile에 추론 규칙이 표시될 때 알려진 접미어여야 합니다. 추론 규칙은 .SUFFIXES에 지정된 순서대로 접미어를 사용합니다. 새 줄이 ㄱ으로 시작하지 않으면 새 추론 규칙이 시작됩니다<Tab>또는 # 문자를 입력합니다.
Ifrule가 비어있는 경우 등을 예로 들 수 있습니다:
rule: ;실행은 적용되지 않으며 make 명령은 접미어가 존재함을 인식하지만 목표가 이전의 것일 때 어떠한 조치도 취하지 않습니다.
앞의 규칙에서 ~(물결 표시)는 SCCS 파일을 말합니다. 그러므로 규칙, .c~.o은 SCCS C 언어 전제조건 파일을 오브젝트 파일( .o)로 변환합니다. ' s.' 가 접두사이면 make 명령의 접미사 보기와 호환되지 않습니다. ~(물결 표시)는 임의의 파일 참조를 SCCS 파일 참조로 변경하는 방법입니다.
라이브러리
목표나 전제조건은 또한 아카이브 라이브러리의 멤버일 수 있고, 이름에 괄호가 있는 것처럼 처리됩니다. 예를 들어, library(name)은 name이 아카이브 라이브러리 library의 멤버임을 표시합니다. 특정 파일에서 라이브러리의 멤버를 갱신하려면 .s1.a 형식을 사용할 수 있는데, 이때 .s1 접미어를 가진 파일이 아카이브 라이브러리의 멤버를 갱신하는 데 사용됩니다. .a는 아카이브 라이브러리를 참조합니다.
매크로 사용
makefile에서 매크로 정의는 다음과 같은 형식으로 정의됩니다.
variable=value매크로는 makefile 전체에 걸쳐서 다음과 같이 표시될 수 있습니다.
- 매크로가 목표 행에 표시되는 경우, 목표 행을 읽을 때 평가됩니다.
- 매크로가 명령행에 표시되는 경우, 명령을 실행할 때 평가됩니다.
- 매크로가 매크로 정의 행에 표시되는 경우, 새 매크로가 규칙 또는 명령에 표시될 때 평가됩니다.
매크로에 정의가 없는 경우 디폴트는 NULL입니다. 새로운 매크로 정의는 같은 이름의 기존 매크로를 겹쳐씁니다. 매크로 지정은 다음에서 지정된 순서대로 제공될 수 있습니다.
- 디폴트 추론 규칙
- 환경의 컨텐츠
- Makefile
- 명령행참고: -e 플래그를 사용하면 환경 변수가 메이크파일에 정의된 환경 변수를 재정의합니다.
쉘 명령
각 목표는 보통 목표를 작성하는 데 사용하는 일련의 shell 명령과 연관되었을 수도 있습니다. 이 스크립트의 각 명령 앞에는 탭이 있어야 합니다. 목표가 종속 행에 표시될 수 있는 반면, :: 연산자가 사용되지 않으면, 이들 종속제품 중 하나에서만 작성 스크립트가 뒤에 표시될 수 있습니다.
명령행의 최초 문자나 처음 두 개의 문자가 @(at 부호), -(하이픈), +(더하기 부호) 중 하나 또는 모두로 구성된 경우, 명령은 다음과 같이 특별하게 처리됩니다.
| 항목 | 설명 |
|---|---|
| @ | 명령이 실행되기 전에 반향되지 않습니다. |
| - | 명령행의 제로가 아닌 종료 상태는 무시됩니다. |
| + | 옵션이 -n, -q, -t 등으로 지정된 경우에도 명령행이 실행됩니다. |
메타 문자가 없는 명령은 make 명령으로 직접 실행됩니다. 예를 들어, make 명령은 다음 예제의 첫 번째 명령이 >(보다 큼 부호) 쉘 메타 문자를 포함하기 때문에 이를 쉘에 넘깁니다. 다음 예의 두 번째 명령은 쉘 메타 문자가 없기 때문에 make 명령이 이를 직접 실행합니다.
target: dependency
cat dependency > target
chmod a+x target쉘을 생략하면 시간이 절약되지만 문제점을 일으킬 수 있습니다. 예를 들어, SHELL 매크로를 다음과 같이 설정하여 메이크파일 내에서 C 셸 스크립트를 실행하려고 시도합니다/bin/csh명령줄에 셸 메타문자가 하나 이상 포함되어 있지 않으면 작동하지 않습니다.
SHELL=/bin/csh
target: dependency
my_csh_script이 make파일은 make 명령이 다음을 실행하려고 시도하기 때문에 실패합니다my_csh_script대신 C 셸에 위탁하는 것이 좋습니다.
변수 지정
make 명령의 변수는 쉘의 변수와 아주 유사하고 모두 대문자로 구성됩니다. = 연산자는 값을 변수에 지정합니다. 그러면, 이전 변수는 모두 재정의됩니다. 지정된 값 앞에 있는 공백은 제거됩니다.
macro += word ...
macro += macro1 = 대신 사용될 경우 += 연산자는 새 값을 추가하며, 변수의 이전 내용과 추가된 값 사이에 단일 공백이 삽입됩니다.
변수의 이름을 { }(중괄호) 또는 ( )(괄호)로 묶고 $(달러 부호)를 앞에 두어서 변수를 확장합니다. 변수 이름이 단일 문자로 구성된 경우에는 중괄호나 괄호로 묶을 필요가 없습니다. 이 짧은 양식은 권장되지 않습니다.
변수 치환은 변수가 어디에 사용되는지에 따라 상이한 두 시기에 발생합니다. 종속 행의 변수는 행을 읽을 때 확장됩니다. 쉘 명령의 변수는 shell 명령을 실행할 때 확장됩니다.
네 개의 변수 클래스(우선순위가 낮은 것부터)는 다음과 같습니다.
| 항목 | 설명 |
|---|---|
| 환경 | make 명령 환경의 일부로 정의된 변수입니다. |
| 글로벌 | makefile 또는 포함된 makefile에서 정의되는 변수입니다. |
| 명령행 | 명령행의 일부로 정의되는 변수입니다. |
| 로컬 | 특정 목표에 고유하게 정의되는 변수입니다. 로컬 변수는 다음과 같습니다.
D 또는 F으로 추가된 이러한 로컬 변수를 사용할 수도 있습니다.
또한 make 명령은 다음 변수를 설정하고 이를 이해합니다. |
| $ | 단일 $(달러 부호); 즉, $$은 단일 달러 부호까지 확장합니다. |
| Lang | LC_ALL 및 대응되는 환경 변수(LC_로 시작함) 모두가 로케일을 지정하지 않은 경우, 로케일 범주에 사용할 로케일을 판별합니다. |
| LC_ALL | LANG 또는 기타 LC_ 환경 변수의 설정에서 지정하는 로케일 범주의 값을 대체하는 데 사용되는 로케일을 판별합니다. |
| LC_CTYPE | 문자로서의 텍스트 데이터의 연속적인 바이트를 해석하기 위한 로케일을 결정합니다. 예를 들어, 인수에서 단일 바이트 문자 대 복수 바이트 문자 등입니다. |
| LC_MESSAGES | 메시지를 작성할 언어를 결정합니다. |
| 메이크플래그 | 환경 변수 MAKEFLAGS는 make 명령행에 지정하는 모든 것을 포함할 수 있습니다. make의 명령행에서 지정되는 것은 MAKEFLAGS 변수에 추가되며, 그 후 make가 실행하는 모든 프로그램의 환경에 입력됩니다. MAKEFLAGS 변수에서 -f 및 -p 플래그의 작업은 정의되지 않았다는 점에 유의하십시오. 명령행 플래그는 이 변수의 -f 및 -p 플래그에 우선합니다. |
| Vpath | 전제조건을 검색하기 위한 디렉토리 리스트를 지정할 수 있습니다. 디렉토리 리스트는 SHELL의 PATH 변수처럼 작동합니다. VPATH 변수는 콜론으로 구분된 다중 디렉토리를 지정할 수 있습니다. 예를 들어 다음과 같습니다.make 명령에게 주어진 순서에 따라 다음의 디렉토리를 검색하라고 지시합니다.
|
플래그
| 항목 | 설명 |
|---|---|
| -D변수 | Variable 값을 1로 설정합니다. |
| -d옵션 | make가 검사하는(디버깅 모드) 파일과 시간에 대한 자세한 정보를 표시합니다. 옵션이 없거나 A 옵션과 함께 -d 플래그를 사용하면 사용 가능한 모든 디버그 정보를 표시합니다. 개별적으로 선택 가능한 디버그 옵션은 다음과 같습니다.
|
| -e | 환경 변수가 makefile 내의 매크로 지정을 재정의하도록 지정합니다. |
| -f MakeFile | 디폴트 makefile 대신에 읽을 makefile을 지정합니다. MakeFile이 -(하이픈)인 경우, 표준 입력을 읽습니다. 다중 makefile을 지정할 수 있으며, 지정된 순서대로 읽습니다. |
| -i | makefile에서 shell 명령의 제로가 아닌 종료를 무시합니다. makefile의 각 행 앞에 -(하이픈)을 지정하는 것과 동일합니다. |
| -j[Jobs] | ' make 독립 타깃을 빌드하는 데 사용할 병렬 작업의 수를 지정합니다. Jobs 매개변수는 모든 양의 정수 값을 받을 수 있습니다. Jobs가 지정되지 않은 경우, ' make ' 명령은 주 대상을 빌드하기 위한 병렬 작업의 수를 제한하지 않습니다. |
| -k | 오류가 발생한 후에도 처리를 계속하지만, 작성으로 인해 오류를 발생시키는 목표에 의존하지 않는 목표에 한합니다. |
| -n | 명령을 표시하지만 실행하지는 않습니다. 그러나 +(더하기 부호)로 시작하는 행은 실행됩니다. |
| -p | 명령을 수행하기 전에 완전한 매크로 정의 및 목표 설명 세트를 표시합니다. |
| -q | 목표 파일이 최신 파일인 경우에는 제로 상태 코드를 리턴하고, 목표 파일이 최신 파일이 아닌 경우에는 하나의 상태 코드를 리턴합니다. 이 옵션이 지정될 때 목표는 갱신되지 않습니다. 그러나, +(더하기 부호) 접두어가 있는 명령행은 실행됩니다. |
| -r | 디폴트 규칙을 사용하지 않습니다. |
| -s | 오류가 발생한 경우 make 명령을 종료합니다. 이것이 디폴트이며, -k 플래그의 반대입니다. |
| -s | 명령을 수행할 때 화면에 표시하지 않습니다. |
| -t | 목표를 작성하거나 목표를 최신 목표로 make하기 위한 수정 시간을 갱신합니다. +(더하기 부호)로 시작하는 명령행을 실행합니다. |
| 대상 | Target 양식의 목표 이름을 지정하거나 변수 값을 설정합니다. |
종료 상태
-q 플래그가 지정되는 경우, 이 명령은 다음과 같은 종료값을 리턴합니다.
| 항목 | 설명 |
|---|---|
| 0 | 정상적으로 완료되었습니다. |
| 1 | 최신 목표가 아닙니다. |
| >1 | 오류가 발생했습니다. |
그 밖의 경우, 이 명령은 다음과 같은 종료값을 리턴합니다.
| 항목 | 설명 |
|---|---|
| 0 | 정상적으로 완료되었습니다. |
| >1 | 오류가 발생했습니다. |
예
- makefile에서 발견된 첫 번째 목표를 make하려면 다음을 입력하십시오.
make - make 명령이 파일을 make하는 데 사용하는 명령을 표시하고 실행은 하지 않으려면 다음을 입력하십시오.make -n search.o이를 통해 새로운 설명 파일을 사용하기 전에 올바른지 검증하게 됩니다.
- pgm이 두 파일, a.o 및 b.o에 종속되며,
차례로 해당 전제조건 파일(a.c 및 b.c) 및 공통 파일, incl.h에 종속됨을 알리는 makefile을 작성하려면 다음을 입력하십시오.
pgm: a.o b.o c89 a.o b.o -o pgm a.o: incl.h a.c c89 -c a.c b.o: incl.h b.c c89 -c b.c - .c 파일에서 최적화된 .o 파일을 make하려면 다음을 입력하십시오.
.c.o: c89 -c -o $*.c or: .c.o: c89 -c -o $< - 내장 규칙의 컨텐츠를 보려면 다음을 입력하십시오.
- 병렬 모드에서 ' make 명령을 사용하여 메이크파일에 지정된 대상을 빌드하는 데 사용할 최대 10개의 병렬 작업을 사용하려면 다음과 같이 입력합니다:
make -j10
파일
| 항목 | 설명 |
|---|---|
| make 파일 | 종속제품의 리스트를 포함합니다. |
| MAKEFILE | 종속제품의 리스트를 포함합니다. |
| s.makefile | 종속제품의 리스트를 포함합니다. SCCS 파일입니다. |
| s.Makefile | 종속제품의 리스트를 포함합니다. SCCS 파일입니다. |
| /usr/ccs/lib/posix.mk | make 명령에 대한 디폴트 POSIX 규칙이 포함됩니다. |
| /usr/ccs/lib/aix.mk | make 명령에 대한 디폴트 규칙을 포함합니다. |