- make란
make는 Program을 유지하는데 필요한 Utility이다. make 유틸리티는 프로그램이 커져서 파일들이 분리되어 있을 때, 어떤 파일들이 다시 컴파일 되어야 하는지 결정하고 컴파일하는 명령들을 자동으로 실행해준다. 프로그램 개발자는 make가 자동으로 컴파일하고 관리할 수 있도록 'Makefile'을 작성해야 한다.
- make 는 cmd 창에서 make 명령을 실행하면 된다.
- 쉘 명령으로 실행 가능한 컴파일러는 make를 사용할 수 있다.
- GNU make는 파일명이 'GNUmakefile, Makefile, makefile'로 되어있으면 make가 찾아서 실행할 수 있다. 일반적으로는 'Makefile'을 추천한다.
- 어떤 파일을 어떻게 컴파일 할지 제어하기 위해서는 make 명령에 parameter들을 사용하면 된다.
- Makefile
'Makefile'은 make가 이해할 수 있도록 쉘 스크립트 언어처럼 되어 있다. Makefile에는 결과 파일 생성을 위해서 프로그램안에 있는 파일들간의 관계, 파일을 컴파일하는 명령어 등을 기술해줘야 한다.
- make의 필요성
프로그램 개발 시 여러 개의 파일로 나누어 개발을 하게되면, 파일들이 서로 관계를 갖고 있기 때문에 어떤 파일을 변경하면 그걸 이용하는 다른 파일도 새로 컴파일 되어야 한다. 이렇게 컴파일이 필요한 것과 아닌 것을 관리해준다는 장점이 있다.
<ex> 아래 예제를 보면, write.c, read.c 파일이 io.h 파일을 include하고 있다. 컴파일을 하면 test.exe가 생성된다. 그 후 io.h 파일에 수정사항이 있을 경우, 모든 파일을 재컴파일 할 필요가 없다. io.h 파일과 의존관계에 있는 파일들만 재컴파일 하면 변경이 적용된 test.exe 가 생성된다.
Targets : Dependencies...
<Tab> command
Makefile은 기본적으로 target(목표), dependency(의존관계), command(명령어) 세개의 기본 규칙들이 나열되어 있다고 볼 수 있다. make가 지능적으로 파일을 갱신할 수 있는 것도 이 간단한 규칙을 따르기 때문이다.
target(목표): 명령이 수행되고 나온 결과 파일이다. object file 혹은 실행파일이 될 것이다. 또한 'clean'과 같은 실행할 액션의 이름이 될 수도 있다.
dependency(의존관계): target 을 만들기 위해 입력으로 사용되는 파일들이다.
command(명령): dependency 부분에 정의된 파일의 내용이 변경되었거나, 목표 파일이 없는 경우 실행될 명령이다. 일반적으로 쉘에서 쓸 수 있는 모든 명령어들을 사용할 수 있으며, bash에 기반한 쉘 스크립트도 지원한다.
* 반드시 command 앞에는 Tab으로 띄어쓰기를 해야 make가 command고 인식할 수 있다.
- make가 Makefile을 처리하는 방법
make 실행시 규칙 이름이 주어지지 않으면, Makefile에서 만나는 첫 번째 규칙을 처리한다. make는 이 규칙을 처리하는데 필요한 dependencies를 전부 처리해야 한다. dependency들은 각각 자신의 규칙에 따라서 처리된다.
소스파일 또는 dependencies에 있는 파일들이 오브젝트 파일보다 더 최근에 update 되었거나, 오브젝트 파일이 없는 경우에만 recompile된다.