Make
makefile을 이용하여 프로그램을 자동으로 컴파일
다수 소스 코드가 포함된 프로젝트에서 유용하게 사용
makefile 구조
- 기본적으로 세가지 구조
- 목표(Target)
- 의존 관계(Dependency)
- 명령(Command)
- 라인에 #이 나오면 해당 라인의 그 이후는 무시
[Target] [Dependency]
[Tab] [Command]
[Tab] [Command]
[Target]
- 아래의 [Command]들이 실행되어 나온 결과 파일
[Dependency]
- 여기 지정된 파일들이 존재하지 않거나 내용이 변하면 아래의 명령을 실행
[Tab] [Command]
make에 의해 실형되는 명령
반드시 탭 문자로 공백을 넣어야 함
make 명령어로 실행
매크로
C언어의 변수와 유사하게 사용 가능
특정 단어를 다른 구문으로 치환
매크로 작성은 등호를 이용
- ex) INCLUDE = -l/user/include
매크로로 정의된 변수의 값을 사용
- ex) $(INCLUDE)
작성된 기존 매크로에 += 를 사용하여 내용 추가 가능
- ex) INCLUDE += -l/user/local/include ----> INCLUDE = -l/user/include -l/user/local/include
매크로의 '=' 이후에 아무런 문자열이 없는 매크로
해당 매크로에는 NULL 문자열이 할당됨
매크로를 정의하지 않고 사용하는 경우
해당 매크로는 NULL 문자열로 치환됨
같은 이름으로 정의된 여러 개의 매크로가 존재
가장 마지막에 정의된 매크로를 이용하여 실행
커맨드라인에서 정의한 매크로
커맨드라인에서 매크로를 정의할 수 있음
- ex) make test DIR=/user/project
여러 단어들로 구성된 매크로는 따옴표(" " 또는 ' ') 필요
- ex) make test DIR="user/project user/project/lib"
매크로를 make 명령어 이전에 정의 가능 (makefile에 매크로가 정의되어 있다면 적용되지 않는다)
- ex) DIR="user/project user/project/lib" make test
make 내부에 정의된 매크로
- $@ : [Target]으로 하는 이름
- ex) test: main.o foo.o bar.o
- gcc -o $@ main.o foo.o bar.o
- $* : [Target]으로 하는 이름에서 확장자를 뺀 이름
- ex) main.o: main.c main.h
- gcc -c $*.c
- $< : [Dependency] 열거된 이름 중 첫 번째 이름
- ex) bar.o: bar.c bar.h
- gcc -c $< (bar.c)
- $^ : [Dependency] 에 존재하는 모든 이름
- ex) test: main.o foo.o bar.o
- gcc -o $@ $^ (main.o foo.o bar.o)
매크로 사용 예
옵션
-c [Directory]
현재 디렉토리에서 makefile을 읽지 말고 [Directory]로 이동
- ex) tt/makefile 일때, make -c tt ----> cd tt; make; cd ..
-d
make 수행 중 각종 정보 출력
파일로 출력하여 make의 동작 확인 가능
-f [File]
makefile이 아닌 [file] 을 makefile로 취급하여 컴파일
- ex) make -f mymakefile
-v
make의 버전 출력
헤더 파일 의존 관계 생성
- gcc 컴파일러의 옵션 (-M)을 통해 의존파일의 리스트 작성 가능
- ex) gcc -M test1.c
make를 이용한 프로젝트 관리
- make를 makefile에서 명령어로 사용
- 대부분의 프로젝트에서는 소스 파일을 계층 구조로 구성
- 디렉토리 계층 구조를 통한 make 과정
- 각 하위 디렉토리에 별도의 makefile 존재
- 마스터 makefile에서 각 하위 디렉토리의 makefile을 재귀적으로 실행
반응형
댓글