2015. 7. 27. 10:40

하나의 Makefile은 의존성 정의들과 규칙들로 구성된다


* 의존성(Dependency) - 하나의 대상(생성할 파일)과 그것이 의존하는 일단의 소스 파일들로 정의

* 규칙(rule) - 의존 파일들로부터 대상 파일을 생성하는 방법을 정의

* 대상(target) - 하나의 실행 가능 파일


다시 생성해야 하는 경우에는 해당 규칙을 찾아서 실행한다

make 명령은 Makefile의 의존성 정의들을 분석해서 적절한 대상 생성 순서를 결정한다


make의 옵션과 매개변수


-k : 오류가 발생했을 때에도 작업을 계속 진행

     이것을 지정하지 않으면 make는 첫 번째 오류가 났을 때 작업을 완전히      중단

     어떤 소스 파일들이 컴파일에 실패하는지 전반적으로 파악하고자 할 때      유용

-n : 빌드 명령을 실제로 수행하지 않고, 그냥 명령문들을 출력

      make가 어떤 일을 수행할 지 미리 파악할 때 유용

-f <파일이름> : Makefile로 사용할 때 파일을 명시적으로 지정

          명시적으로 지정하지 않으면

       1. 현재 디렉토리에서 makefile이라는 이름을 찾게 됨

       2. 그렇지 않으면 Makefile이라는 파일을 찾음


make로 특정한 하나의 대상(실행파일)을 빌드하는 경우에는 그 대상의 이름을 make의 한 매개변수로 지정


대상 이름을 주지 않는 경우, make는 Makefile의 첫 대상의 이름을 all로 하고 그 다음에 all이 의존하는 대상들을 나열하는 것.

이 관례는 make 명령에 대상을 지정하지 않았을 때 어떤 것이 만들어지는지를 명확하게 알 수 있다는 장점


* 의존성

- 최종 응용 프로그램의 각 파일이 소스 파일들과 어떻게 연관되는지를 지정. 다중 파일의 문제점을 이야기할 때 나온 예제의 경우, 최종 응용프로그램은 main.o, 2.o, 3.o에 의존하며 main.o는 main.c와 a.h에, 2.o는 2.c, a.h, b.h에, 그리고 3.o는 3.c, b.h, c.h에 의존한다

즉, main.o는 main.c와 a.h의 변화에 영향을 받는다

따라서 두 파일들 중 하나라도 변경되면 main.c를 다시 컴파일 해야 한다


Makefil 안에서 이러한 의존 관계를 명시할 때는 대상 이름을 쓰고 콜론을 쓴 다음 빈칸이나 탭으로 칸을 띄운 후에 대상을 만드는 데 필요한 파일들을 빈칸이나 탭으로 구분해서 나열해야 한다

다음은 앞의 예의 의존성들을 정의한 것이다

myapp : main.o 2.o 3.0

main.o : main.c a.h

2.o : 2.c a.h b.h

3.o : 3.c b.h c.h


이와 같이 의존성들은 소스 파일들이 서로 어떻게 연관되는지를 나타내는 하나의 계통구조를 형성한다고 할 수 있다. 이들을 통해서, 예를 들어 b.h가 변했다면, 2.o와 3.o가 갱신되어야 하며, 2.o와 3.o가 갱신되었으므로 myapp 역시 갱신되어야 함을 어렵지 않게 알 수 있다


여러 개의 최종 파일들을 생성해야 하는 경우 all이라는 유사 대상(phony target)을 사용하는 것이 관례이다. 예를 들어 응용 프로그램이 이진 파일 myapp와 매뉴얼 페이지 파일 myapp.1로 구성될 때, 이에 대한 all 대상을 다음과 같이 정의할 수 있다


all: myapp, myapp1


make 실행 시 all이라는 대상을 지정하지 않으면 make는 Makefile에 있는 첫 대상을 빌드하게 된다


* 규칙

해당 대상의 생성 방법을 서술하는 규칙도 지정

앞에 나온 의존성 예들은 2.o가 2.c와 a.h, b.h에 의존한다는 점만 make에게 알려줄 뿐, 그 파일들로부터 2.o를 어떻게 만들어야 하는지 알려주지 않는다

이를 알려주는 역할은 규칙(rule)이 담당

예를 들어 2.o의 경우 gcc -c 2.c 라는 규칙이면 충분

물론 헤더 파일 디렉토리라던가 디버깅을 위한 매크로 기호 같은 것을 추가할 수도 있다


모든 규칙은 하나의 탭 문자로 시작해야 한다


ex) Makefile1

myapp : main.o 2.o 3.o

gcc -o myapp main.o 2.o 3.o


main.o : main.c a.h

gcc -c main.c


2.o : 2.c a.h b.h

gcc -c 2.c


3.o : 3.c b.h c.h

gcc -c 3.c


makefile이나 Makefile이 아닌 파일 이름을 사용했기 때문에, 이 파일로 make를 실행하기 위해서는 반드시 -f 옵션을 이용해서 파일 이름을 명시적으로 지정해주어야 함


make 명령은  Makefile의 의존성들을 분석해서 어떤 파일들을 어떤 순서로 만들 것인지 결정한다. Makefile 상에서는 myapp이 제일 먼저 나오지만, make는 그 대상을 만들기 위해서 다른 파일들부터 만들어야 함을 알아내고는 규칙 부분들을 해석해서 해당 파일들을 생성하는 데 필요한 적절한 명령들을 실행한다. 또한 그 명령들을 실행하면서 그 명령들을 콘솔에 출력한다