Makefile

  • Compile 방법을 기술하는 파일
  • 다수의 파일을 한번에 컴파일 가능

Make

  • 주어진 Makefile에 따라 compile을 수행하고 실행파일을 생성
  • 최초 컴파일 이후에는, 변경이 있는 파일만 컴파일 함

Rule Block

<Target>:<Dependencies>

    <Recipe>

  • Target : Build 대상 이름, 일반적으로 최종 결과 파일명 사용
  • Dependency : Build 대상이 의존하는 Target이나 파일 목록
  • Recipe : Build 대상을 생성하는 명령어
app.out: main.o foo.o bar.o
    gcc -o app.out main.o foo.o bar.o
    
main.o: foo.h bar.h main.c
    gcc -c -o main.o main.c
foo.o: foo.h foo.c
    gcc -c -o foo.o foo.c
bar.o: bar.h bar.c
    gcc -c -o bar.o bar.c
    
    
$ make
  • Implicit rules : 자주 사용되는 규칙을 자동 처리 해줌
app.out: main.o foo.o bar.o
    gcc -o app.out main.o foo.o bar.o
    
main.o: foo.h bar.h main.c
foo.o: foo.h foo.c
bar.o: bar.h bar.c
  • Variables(or Macro)
CC=gcc
CFLAGS=-g -Wall
OBJS=main.o foo.o bar.o
TARGET=app.out

$(TARGET):$(OBJS)
    $(CC) -o $@ $^ # $@: current target name $^: current dependencies
    
main.o:foo.h bar.h main.c
foo.o:foo.h foo.c
bar.o:bar.h bar.c
  • Clean rule : Build로 생성된 파일들 삭제하는 규칙
clean:
    rm -f *.o
    rm -f $(TARGET)
    
    
$ make clean

CMake

  • Makefile을 기술하는 파일
  • Makefile을 자동으로 생성
  • 소스 코드 내부까지 분석해 의존성 정보를 스스로 파악
  • object 파일과 의존성 정보를 일일이 작성하지 않아도 됨
  • cmake 명령어는 최초 한 번만 실행하고, 이후로는 Makefile을 실행할 때 필요에 따라 자동 재생성

기본 사용법

# CMakeLists.txt
ADD_EXECUTABLE(app.out main.c foo.c bar.c)
cmake CMakeLists.txt # Makefile 생성
make

주요 명령과 변수

  • 빌드 형상
    • Debug
    • Release
    • RelWithDebInfo : 배포 목적의 빌드지만, 디버깅 정보 포함
    • MinSizeRel : 최소 크기로 최적화한 배포 목적 빌드
  • 변수 정의
SET(SRC_FILES main.c foo.c bar.c)
ADD_EXECUTABLE(app.out ${SRC_FILES})
  • 프로젝트 이름 설정
PROJECT(TEST) # 이름 설정
MESSAGE(${CMAKE_PROJECT_NAME}) # 이름을 콘솔에 출력
  • 빌드 대상 바이너리 추가
ADD_EXECUTABLE(app.out main.c foo.c bar.c)
  • 컴파일 옵션 추가
ADD_COMPILE_OPTIONS(-g -Wall)
  • 빌드 형상 별 컴파일 옵션
SET(CMAKE_C_FLAGS_빌드_형상 "options")
  • 헤더 디렉토리 추가
TARGET_INCLUDE_DIRECTORIES(include)

Reference

https://www.tuwlab.com/ece/27234

'💻 Computer Science > C & C++' 카테고리의 다른 글

[C++] 네임스페이스  (0) 2024.02.05
[C++] 함수  (1) 2024.02.05
[C] 전처리기  (0) 2024.01.12
[C] 컴파일 최적화  (0) 2024.01.10
[C] 구조체와 공용체  (0) 2024.01.10