add_subdirectory
- add_subdirectory 명령어로 로드된 CMakeLists.txt는 소스트리의 노드를 만든다.
- add_subdirectory는 CMakeLists.txt를 포함하고 있는 하위 디렉터리를 지정한다.
- 생성된 바이너리 트리 역시 add_subdirectory로 구성된 소스 디렉터리 구조처럼 하위 구조를 가진다.
- 바이너리 트리는 -B 로 지정한 프로젝트 결과물의 디렉터리 구조를 말한다.
# 예제 디렉 터리 구조
top level
|_foo
|_boo
|_bar
|_baz
# CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(foo NONE)
message("Top level CMakeLists.txt")
add_subdirectory(foo) # 서브 디렉터리 foo 추가
add_subdirectory(boo) # 서브 디렉터리 boo 추가
# foo/CMakeLists.txt
message("Processing foo/CMakeList.txt")
# boo/CMakeLists.txt
message("Processing boo/CMakeList.txt")
add_subdirectory(baz)
add_subdirectory(bar)
# boo/bar/CMakeLists.txt
message("Processing boo/bar/CMakeLists.txt")
# boo/baz/CMakeLists.txt
message("Processing boo/baz/CMakeLists.txt")
# 실행
[cmake-sources]> rm -rf _builds
[cmake-sources]> cmake -H simple-tree -B _builds
Top level CMakeLists.txt
Processing foo/CMakeList.txt
Processing boo/CMakeList.txt
Processing boo/baz/CMakeLists.txt
Processing boo/bar/CMakeLists.txt
-- Configuring done
-- Generating done
-- Build files have been written to: /.../cmake-sources/_builds
$ tree _builds
.
├── CMakeCache.txt
├── CMakeFiles
│ ├── 3.18.2
│ │ └── CMakeSystem.cmake
│ ├── CMakeDirectoryInformation.cmake
│ ├── CMakeOutput.log
│ ├── Makefile.cmake
│ ├── Makefile2
│ ├── TargetDirectories.txt
│ ├── cmake.check_cache
│ └── progress.marks
├── Makefile
├── boo
│ ├── CMakeFiles
│ │ ├── CMakeDirectoryInformation.cmake
│ │ └── progress.marks
│ ├── Makefile
│ ├── bar
│ │ ├── CMakeFiles
│ │ │ ├── CMakeDirectoryInformation.cmake
│ │ │ └── progress.marks
│ │ ├── Makefile
│ │ └── cmake_install.cmake
│ ├── baz
│ │ ├── CMakeFiles
│ │ │ ├── CMakeDirectoryInformation.cmake
│ │ │ └── progress.marks
│ │ ├── Makefile
│ │ └── cmake_install.cmake
│ └── cmake_install.cmake
├── cmake_install.cmake
└── foo
├── CMakeFiles
│ ├── CMakeDirectoryInformation.cmake
│ └── progress.marks
├── Makefile
└── cmake_install.cmake
10 directories, 27 files
- 소스 트리 구조처럼 바이너리 트리 구조도 boo, foo, bar, baz 같은 디렉터리 구조를 가지고 있다
- 각 서브 디렉터리마다 빌드 할 수 있는 Makefile도 존재한다
소스 트리(-H, -S)
- CMAKE_CURRENT_SOURCE_DIR : 현재 노드의 전체 경로
- CMAKE_SOURCE_DIR : 트리의 루트 노드의 전체 경로
- cmake 실행시 -H, -S 로 소스 트리 루트 경로 설정 가능
# foo/CMakeLists.txt
message("Processing foo/CMakeList.txt")
# /.../cmake-sources/simple-tree-source-vars
message("CMAKE_SOURCE_DIR: ${CMAKE_SOURCE_DIR}")
# /.../cmake-sources/simple-tree-source-vars/foo
message("CMAKE_CURRENT_SOURCE_DIR: ${CMAKE_CURRENT_SOURCE_DIR}")
바이너리 트리(-B)
- 동일한 구조가 바이터리 트리에 복제 된다
- CMAKE_CURRENT_BINARY_DIR
- CMAKE_BINARY_DIR
- cmake 실행시 -B 로 바이너리 트리 루트 경로 설정 가능
# foo/CMakeLists.txt
message("Processing foo/CMakeList.txt")
# /.../cmake-sources/_builds, 경로가 _builds를 나타낸다
message("CMAKE_BINARY_DIR: ${CMAKE_BINARY_DIR}")
# /.../cmake-sources/_builds/foo, 경로가 _builds를 나타낸다
message("CMAKE_CURRENT_BINARY_DIR: ${CMAKE_CURRENT_BINARY_DIR}")