CMake - 구조화(소스 트리, 바이너리 트리)

mohadang·2022년 8월 14일
0

CMake

목록 보기
12/24
post-thumbnail

구조화

일반적으로 소스코드를 빌드하기 위해 IDE(Makefile, Visual Studio, XCode)에서 프로젝트를 구성할때 모든 소스 코드를 하나의 프로젝트에 추가하는 경우는 없다.(물론 작은 시스템을 만든다면 하나의 프로젝트에 추가하는 경우도 있다.) 이렇게 어떤 시스템을 만들때 작은 모듈로 나누는 것을 구조화라고 한다.

cmake는 빌드 시스템을 만드는 프로그램이다 빌드 시스템은 각 플랫폼에 따라 Makefile, Visual Studio, XCode 프로젝트 형태로 구성된다. cmake로 빌드 시스템을 작성할때 시스템이 커지면 작은 모듈로 나누어 구성하도록 해야한다. 결국 cmake 작성시 구조화에 대한 처리를 해주어야 한다.

구조화가 고려된 cmake를 실행하면 각 플랫폼 방식에 맞게 소스 코드를 모듈화한 프로젝트를 구성하고 의존성도 알아서 설정하여 빌드 시스템을 생성한다.

cmake로 구조화된 빌드 시스템을 만들기

cmake로 구조화된 빌드 시스템을 만들기 위해서는 add_subdirectory 명령어, project 명령어, 리스트 파일(CMakeLists.txt)을 사용하여 소스 트리 구조를 만들어야 한다.

  • add_subdirectory, project, 리스트 파일에 대해서는 이 시리즈 후반에 다시 설명할 것이며 우선 여기서는 이것들을 사용하여 빌드 시스템이 모듈화를 한다는 것으로 이해하면 된다.

여기서 소스 트리의 소스는 실제 소스 코드 파일(.cpp, .cc ...)을 말하는 것이 아닌 CMakeLists.txt를 소스 코드 파일로 인식한 것이다.

만약 만들고 싶은 빌드 시스템 구조를 다음과 같이 만들고 싶다면

root
|_foo
|_boo
  |_bar
  |_baz

cmake에서는 다음과 같이 소스 트리를 구성해야 한다.

red@DESKTOP-G15ND3V:~/cgold$ tree .
.
├── CMakeLists.txt    # root
├── boo
│   ├── CMakeLists.txt    # root/boo
│   ├── bar
│   │   └── CMakeLists.txt    # root/boo/bar
│   └── baz
│       └── CMakeLists.txt    # root/boo/baz
├── foo
│   └── CMakeLists.txt    # root/foo
└── main.cc

4 directories, 6 files

root 디렉터리에 하위의 디렉터리를 만들고 각 하위 디렉터리마다 리스트 파일을 하나씩 생성해 두었다.
CMakeLists.txt가 현재 디렉터리가 소스 트리상에 하나의 노드라는 것을 알리는 것이다.
각 CMakeLists.txt에서는 상위 노드에서 하위 노드로 단방향 엣지 연결을 하듯 add_subdirectory() 명령어를 사용하여 트리를 구성한다.

  • EX) add_subdirectory(boo), add_subdirectory(bar) ...

또한 CMakeLists.txt 내에는 project 명령어를 호출하여 현재 리스트 파일이 프로젝트 하나를 생성하게끔 지정한다.

이렇게 구성된 소스 트리를 기반으로 cmake를 실행하면 구조화된 프로젝트를 생성하게 되고 cmake에서는 이를 바이너리 트리라고 지칭한다.

red@DESKTOP-G15ND3V:~/cgold$ cmake -B _build
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: /home/red/cgold/_build
red@DESKTOP-G15ND3V:~/cgold$ tree _build/
_build/
├── CMakeCache.txt
├── CMakeFiles
│   ├── 3.18.2
│   │   └── CMakeSystem.cmake
│   ├── CMakeDirectoryInformation.cmake
│   ├── CMakeOutput.log
│   ├── Makefile.cmake
│   ├── Makefile2
│   ├── TargetDirectories.txt
│   ├── cmake.check_cache
│   └── progress.marks
├── Makefile                      # root
├── boo
│   ├── CMakeFiles
│   │   ├── CMakeDirectoryInformation.cmake
│   │   └── progress.marks
│   ├── Makefile                  # root/boo
│   ├── bar
│   │   ├── CMakeFiles
│   │   │   ├── CMakeDirectoryInformation.cmake
│   │   │   └── progress.marks
│   │   ├── Makefile              # root/boo/bar
│   │   └── cmake_install.cmake
│   ├── baz
│   │   ├── CMakeFiles
│   │   │   ├── CMakeDirectoryInformation.cmake
│   │   │   └── progress.marks
│   │   ├── Makefile              # root/boo/baz
│   │   └── cmake_install.cmake
│   └── cmake_install.cmake
├── cmake_install.cmake
└── foo
    ├── CMakeFiles
    │   ├── CMakeDirectoryInformation.cmake
    │   └── progress.marks
    ├── Makefile                  # root/foo
    └── cmake_install.cmake

10 directories, 27 files

_build에 생성된 빌드 시스템(바이너리 트리) 역시 소스트리와 같은 구조를 가지는 것을 확인 할 수 있다.

profile
mohadang

0개의 댓글