1장 컴파일, 실행, 디버그
타깃
make를 사용할 때 위 예제에서 나오는 program 같은 파일을 작업할 타깃(target)이라고 한다.
target은 필요 항목(prerequisites) 또는 종속 항목(dependents)이라는 파일들을 기반으로 빌드된다.
그리고 이들 각 파일들은 또 다시 파일들을 필요 항목으로 갖고 있다.
예를 들어, 오브젝트 파일들을 링크하여 실행 프로그램을 작성하는 경우, 소스파일이나 헤더 파일이 변경되면 개발자는 오브젝트 파일을 링크하기 전에 컴파일부터 다시 해야 한다.
따라서 소스 파일 각각은 그에 연결되는 해당 오브젝트 파일의 필요 항목이 되는 셈이다.
기술 파일
makefile이나 Makefile을 기술 파일(description file)이라 부른다.
make는 기술 파일(description file)에 설정된 환경을 스스로 이해하여 의존 관계를 직접 결정할 수 있다.
기존 파일의 이름, 그들이 최종 수정된 시각, 내장된 규칙 등을 이용하여 작성할 파일을 골라내고 또 어떻게 작성할지 결정한다.
예시
아래와 같은 구성 요소로 프로그램을 작성한다고 가정하다.
-c 소스 파일 3개 (main.c iodat.c dorun.c)
-c 소스 중 하나에서 호출하는 어셈블리어 코드 (lo.s)
-라이브러리 루틴(/usr/fred/lib/crtn.a)
프로그램을 직접 컴파일하려면 아래와 같은 명령을 일일이 입력해야 한다.
$ cc -c main.c
$ cc -c iodat.c
$ cc -c dorun.c
$ as -o lo.o lo.s
$ cc -o program main.o iodat.o dorun.o lo.o /usr/fred/lib/crtn.a
주요 애플리케이션의 경우 하나를 컴파일하는 데만도 시간이 오래 걸리므로 가능하면 컴파일한 이후 코드를 변경하지 않은 오브젝트 파일은 다시 컴파일하기 보다는 그대로 사용하는 편이 좋다. 따라서 makefile을 활용한다.
program : main.o iodta.o dorun.o lo.o /usr/fred/lib/crtn.a
cc -o program main.o iodta.o dorun.o lo.o /usr/fred/lib/crtn.a
main.o : main.c
cc -c main.c
iodta.o : iodat.c
cc -c iodat.c
dorun.o : dorun.c
cc -c dorun.c
lo.o : lo.s
as -o lo.o lo.s
종속행과 명령행
콜론(:)을 포함하는 행을 종속 행 또는 규칙 행이라고 부른다.
콜론 왼쪽은 타깃이며, 콜론 오른쪽은 타깃의 필요 항목이다.
탭 문자로 시작하는 행은 명령행이라고 부른다.
명령 행은 타깃을 필요 항목에서 가져와 작성하는 방법을 제시한다.
역방향 연결 방법 (backward-chainig) - 목적 중심의 관리 방법
기술 파일을 사용해 타깃(program)을 작성하도록 요청하더라도 make는 2행의 명령을 곧바로 실행하지 않는다.
make는 의존관계를 지닌 명령들 간의 연결고리르 거슬러 추적하여 어떤 명령을 실행할지 찾아낸 다음, 최종적으로 그 연결 고리를 따라가면서 프로그래머가 작성한 타깃 파일이 갱신될 때까지 각 명령을 실행한다.
이같은 프로그램 개발 기법을 역방향 연결 방법(backward-chainig)이라고 한다.
-Make의 작업
1) 각 .o 파일과 그들의 필요 항목들을 먼저 검사한다. 여기에 필요한 정보는 기술 파일 내의 후속 항목들이 제공한다.
2) program이란 이름을 가진 파일이 존재하는지 유무를 먼저 확인한 다음, program 파일이 존재할 경우 main.o iodat.o dorun.o lo.o 파일과 /usr/fred/lib/crtn.a 라이버리 등을 검사하여 그 가운데 program보다 나중에 생긴 것만 빌드한다.
(필요항목들이 마지막으로 작성한 이후 다시 수정하지 않았다면 make는 program을 다시 빌드할 필요가 없다고 판단하고 별다른 명령을 내리지 않는채 종료한다.)
필수 항목이 없는 타깃 / 타깃이 파일 이름이 아닌 경우
$ make clean
clean:
/bin/rm -f core *.o
make는 clean이란 이름의 실제 파일이 존재하지 않는 한, 명단에 표시된 명령 스크립트를 반드시 실행한다.
이는 make가 존재하지 않는 모든 타깃을 최신이 아닌 타깃으로 간주하기 때문이다.
참고
참고1. 구문 규칙
-모든 명령들은 탭 문자로 시작한다. 여백(space) 아님
Make는 첫 문자로 나오는 탭을 통해 명령을 인식하기 때문에, 다른 행들이 탭으로 시작하지 않도록 반드시 확인이 필요하다.
기술 파일에서 탭 문자를 확인하려면 다음 명령을 실행시키면 된다.
$ cat -v -t -e makefile
-v와 -t 옵션이 모든 탭들을 ^I로 표시하며, -e 옵션은 각 행의 마지막에 달러 기호($)를 표시한다.
-역슬래시(\) 위치
행이 길어질 경우, 끝에 역슬래시를 추가하여 계속 이어나갈 수 있는데,
역슬래시는 행이 바뀌는 문자 바로 앞에 위치해야 한다.
역슬래시와 새 행이 시작되는 문자 사이에 어떤 여백 문자도 두어서는 안된다.
참고2. 하이픈
명령어 앞에 하이픈(-)을 두게 되면, make 는 해당 명령어에서 오류가 발생하더라도 계속 진행한다.
https://flower0.tistory.com/460?category=683682