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. 마무리: 설정 네 줄로 자동 감지 끝!
- cmake_minimum_required(VERSION 3.12)
- Out-of-Source 빌드 (cmake -S . -B build)
- file(GLOB … CONFIGURE_DEPENDS)
- set(CMAKE_BINARY_DIR …) 제거
이제부터는 소스 파일을 추가하거나 지워도,
make
만으로도 CMake가 알아서 폴더를 스캔하고, Makefile을 다시 만들고, 컴파일까지 해 줍니다.
불필요한 재설정 없이 코딩에만 집중하세요! 🎉
'Tech > Trouble Shooting' 카테고리의 다른 글
| OVS와 UNIX 도메인 소켓 연결 삽질기 (0) | 2025.04.29 |
|---|