본문 바로가기

Tech/Trouble Shooting

CMake에서 소스 파일 추가·삭제가 자동으로 반영되지 않을 때, 이렇게 해결하세요!

CMake 프로젝트를 관리하다 보면, 어느 날 갑자기 새로 만든 .c 파일이 빌드 목록에 안 올라가거나, 삭제한 파일을 여전히 컴파일하려고 하는 상황을 겪게 됩니다. “왜 이게 안 되지…?” 하며 cmake .를 다시 치거나 캐시를 지우는 일에 지치셨다면, 다음 단계를 따라 한 번만 설정해 보세요. 이후부터는 파일 추가·삭제가 있을 때마다 오직 make 만으로 알아서 따라와 줍니다.


1. Out-of-Source 빌드를 기본으로

왜 이게 중요한가요?

  • 소스 트리(프로젝트 루트) 안에 CMake 캐시와 빌드 아티팩트가 뒤섞이면, 변경 감지가 엉키기 쉽습니다.
  • 소스와 빌드는 분리할수록 깔끔하고 안전합니다.

어떻게 쓰나요?

터미널에서 이 두 줄만 기억하세요!

cmake -S . -B build        # 소스(.)와 빌드(build/) 디렉터리 분리
cmake --build build        # build/에서 자동으로 재실행 후 빌드
  • IDE에서도 “Build Directory”를 프로젝트 외부(예: …/MyProject/build)로 지정해 주세요.

2. 최소 CMake 버전은 3.12

file(GLOB … CONFIGURE_DEPENDS) 옵션을 쓰려면 CMake 3.12 이상이 필요합니다.
프로젝트 최상단 CMakeLists.txt에 이렇게 적어주세요:

cmake_minimum_required(VERSION 3.12)
project(MyAwesomeApp C)

구버전 지원이 꼭 필요하다면, 이 글의 3번 대신 “소스 파일을 수동으로 명시”하는 방법으로 해결할 수 있지만, 조금 귀찮아집니다.

3. GLOB에 CONFIGURE_DEPENDS 달기

가장 핵심이 되는 한 줄! 이 옵션이 있으면 CMake가 디렉터리 변화를 감지해 자동으로 재실행합니다.

# 예시: any_module/CMakeLists.txt
file(GLOB MY_SRCS
    CONFIGURE_DEPENDS           # ← 여기 추가
    "${CMAKE_CURRENT_SOURCE_DIR}/*.c"
)

add_library(my_module STATIC ${MY_SRCS})
  • 없으면: CMakeLists.txt를 수정해야만 목록이 갱신돼요.
  • 있으면: 디렉터리 안에 .c/.cpp 파일이 바뀌는 순간 CMake가 다시 동작하죠.

4. CMAKE_BINARY_DIR 직접 설정은 NO!

어떤 예제에서는

set(CMAKE_BINARY_DIR ${CMAKE_SOURCE_DIR}/build)

를 쓰라고 하지만, 실제로는 CMake 내부 변수가 꼬여 이상한 에러를 부릅니다.
절대로 빼고, 위의 Out-of-Source 빌드 방식을 사용하세요.

5. 디렉터리 구조는 취향껏

core/, plugins/, utils/ 등 폴더 이름과 깊이는 전혀 상관없습니다.
어느 위치에서든 각 모듈의 CMakeLists.txt에 반드시 2번과 3번 설정만 적용하면 끝!

MyProject/
├── CMakeLists.txt      # 최상위: 최소 버전 지정, add_subdirectory 호출
├── core/
│   ├── CMakeLists.txt  # file(GLOB…CONFIGURE_DEPENDS)
│   └── foo.c
└── plugins/
    ├── CMakeLists.txt  # 같은 패턴 적용
    └── bar.cpp

 

6. 마무리: 설정 네 줄로 자동 감지 끝!

  1. cmake_minimum_required(VERSION 3.12)
  2. Out-of-Source 빌드 (cmake -S . -B build)
  3. file(GLOB … CONFIGURE_DEPENDS)
  4. set(CMAKE_BINARY_DIR …) 제거

이제부터는 소스 파일을 추가하거나 지워도,

make

만으로도 CMake가 알아서 폴더를 스캔하고, Makefile을 다시 만들고, 컴파일까지 해 줍니다.
불필요한 재설정 없이 코딩에만 집중하세요! 🎉

'Tech > Trouble Shooting' 카테고리의 다른 글

OVS와 UNIX 도메인 소켓 연결 삽질기  (0) 2025.04.29