재정리용..
변수 정의
Makefile은 변수 정의 가능
ex)
CC = gcc # 문자열로 치환
foo.o: foo.h foo.c
$(CC) -c foo.c
bar.o: bar.h bar.c
$(CC) -c bar.c
main.o: main.c foo.h bar.h
$(CC) -c main.c
main: main.o foo.o bar.o
$(CC) main.o foo.o bar.o -o main
PHONY
파일의 유무와 상관없이 해당 타겟 명령 항상 실행
CC = gcc
OBJS = main.o foo.o bar.o
foo.o: foo.h foo.c
$(CC) -c foo.c
bar.o: bar.h bar.c
$(CC) -c bar.c
main.o: main.c foo.h bar.h
$(CC) -c main.c
main: main.o foo.o bar.o
$(CC) main.o foo.o bar.o -o main
clean:
rm -rf $(OBJS) main
여기서 make clean 명령 실행하면 모든 목적파일들, main실행파일 삭제.
근데 만약 clean파일이 실제로 있다면 디펜던시가 없으니, 최신인줄 알고 계속 make clean명령을 무시.
so, .PHONY clean으로 지정하고 실행. 그러면 무조건 실행.
.PHONY clean # 지정
CC = gcc
OBJS = main.o foo.o bar.o
foo.o: foo.h foo.c
$(CC) -c foo.c
bar.o: bar.h bar.c
$(CC) -c bar.c
...
...
패턴
.PHONY: clean
CC = gcc
OBJS = main.o foo.o bar.o
foo.o: foo.h foo.c
$(CC) -c foo.c
bar.o: bar.h bar.c
$(CC) -c bar.c
main.o: main.c foo.h bar.h
$(CC) -c main.c
main: $(OBJS)
$(CC) $(OBJS) -o main
clean:
rm -rf $(OBJS) main
이 Makefile에서 동일한 패턴을 찾을 수 있다.
foo.o: foo.c foo.h
$(CC) -c foo.c
bar.o: bar.c bar.h
$(CC) -c bar.c
%.o: %.c %.h
$(CC) -c $^
따라서 이렇게 작성한다.
$^는 foo.c나 bar.c같은 디펜던시의 가장 첫번재 원소를 가리킨다.
- $@ : 타겟 이름에 대응
- $< : 의존 파일 목록에 첫 번째 파일에 대응
- $^ : 의존 파일 목록 전체에 대응
- $? : 타겟 보다 최신인 의존 파일들에 대응
- $+ : $^ 와 비슷하지만, 중복된 파일 이름들 까지 모두 포함
멀티코어 사용 -> Make속도 up
단순히 make를 입력하면 단일 쓰레드 실행으로 빌드 속도가 매우 느리다.
-j<코어수>를 활용해서 빌드 속도를 올려보자.
본인 리눅스의 코어수는 4개 이므로
make -j4를 입력.
적용

공부한걸 토대로 실제로 제작중인 프로젝트의 Makefile을 만들어보았다.
좀 더 패턴화, 자동화 할 수 있을 것 같긴함
'Linux' 카테고리의 다른 글
| Kernel 및 System call 디버그 with GDB (0) | 2025.07.28 |
|---|---|
| 커널 시스템콜 추가 (3) | 2025.07.25 |
| OS 기초 이론 (0) | 2025.07.23 |
| Rootfs와 Kernel 빌드 (feat Makefile) (0) | 2025.07.21 |
| Linux개발 환경 (4) | 2025.07.17 |