Makefile

2025. 7. 24. 12:00·Linux

재정리용..

변수 정의

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
'Linux' 카테고리의 다른 글
  • Kernel 및 System call 디버그 with GDB
  • 커널 시스템콜 추가
  • OS 기초 이론
  • Rootfs와 Kernel 빌드 (feat Makefile)
Jminu
Jminu
  • Jminu
    뇌 구조가 바이너리
    Jminu
  • 전체
    오늘
    어제
    • 분류 전체보기
      • C프로그래밍
        • 오류해결
        • 개인 공부
        • Programming Lab(학교수업)
        • MemoryTracker
      • C++
        • 개인 공부
      • 자료구조(Data Structure)
      • ARM arch
        • Cortex-M
        • FreeRTOS
      • 컴퓨터 공학(Computer Science)
        • OS
        • 컴퓨터 구조
      • Qualcomm 기업과제
      • Linux
      • Web
      • 똥글
      • 백준
      • Git 학습
        • 오류해결
        • 학습중
      • Python
        • 오류해결
        • 개인 공부
  • 블로그 메뉴

    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    c언어
    INIT
    피보나치
    버퍼
    스택
    Git
    소수
    이진 트리
    백준
    Qualcomm
    rubikpi3
    arm
    드라이버 분석
    순환
    시스템콜
    동적메모리
    포인터
    리눅스
    yolo
    자료구조
    rubik pi
    커널 기여
    파일 입출력
    토발즈
    C++
    commit
    Branch
    파이썬
    앤드류모튼
    커널
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Jminu
Makefile
상단으로

티스토리툴바