CMake - 소스 트리, 바이너리 트리 관련 예약 변수

mohadang·2022년 8월 14일
0

CMake

목록 보기
13/24
post-thumbnail

CMAKECURRENT_LIST*

  • 현재 리스트 파일에 대한 정보는 CMAKE_CURRENT_LIST_FILE 및 CMAKE_CURRENT_LIST_DIR 변수에서 가져올 수 있다.
# 최상위 CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(foo NONE)

message("root directory : ${CMAKE_CURRENT_LIST_DIR}")
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") # 모듈 참조 경로 추가

include(mymodule) # 모듈 추가
# cmake/mymodule.cmake, 모듈

# 현재 리스트 파일 경로 출력
# /.../cmake-sources/path-to-module/cmake/mymodule.cmake
message("Full path to module: ${CMAKE_CURRENT_LIST_FILE}") 

# 현재 리스트 파일 위치한 디렉터리 경로 출력
# /.../cmake-sources/path-to-module/cmake
message("Module located in directory: ${CMAKE_CURRENT_LIST_DIR}")
# 실행

root directory : /home/red/cgold    # root dir path
Full path to module: /home/red/cgold/cmake/mymodule.cmake    # 모듈 전체 경로
Module located in directory: /home/red/cgold/cmake    # 모듈 디렉터리 경로
-- Configuring done
-- Generating done
-- Build files have been written to: /home/red/cgold/build

CMAKE_CURRENT_LIST_FILE, CMAKE_CURRENT_LIST_LINE

  • CMAKE_CURRENT_LIST_FILE : 현재 파일 전체 경로
  • CMAKE_CURRENT_LIST_LINE : 현재 파일 라인

CMAKE_CURRENT_LIST_DIR vs CMAKE_CURRENT_SOURCE_DIR

  • CMAKE_CURRENT_LIST_DIR : 현재 리스트 파일의 디렉터리 경로

  • CMAKE_CURRENT_SOURCE_DIR : 현재 리스트 파일의 소스 디렉터리 경로(소스 트리 구조상 디렉터리 경로)

  • 소스 디렉터리 경로

    • 아래의 예제를 참고
    • 예제에서 .cmake가 나오는데 이는 리스트 파일이 아니다 따라서 CMakeLists.txt 처럼 프로젝트를 생성하지 않으며 소스 트리 구조상 노드에 해당하지도 았는다. .cmake는 단순히 중복 코드를 막기 위하여 공통으로 사용되는 코드를 적어둔 모듈이라고 생각하면 될것이다.
    • .cmake는 CMakeLists.txt에서 add_subdirectory가 아닌 include로 포함 시킨다.
# CMakeLists.txt, .cmake 안에서 CMAKE_CURRENT_LIST_DIR, CMAKE_CURRENT_SOURCE_DIR 출력

~
Message(STATUS "@@@@@@@@@@@@@@@ ${current} @@@@@@@@@@@@@@@")
message(STATUS "CMAKE_CURRENT_LIST_DIR : ${CMAKE_CURRENT_LIST_DIR}")
# message(STATUS "CMAKE_CURRENT_LIST_FILE : ${CMAKE_CURRENT_LIST_FILE}")
# message(STATUS "CMAKE_CURRENT_LIST_LINE : ${CMAKE_CURRENT_LIST_LINE}")
# message(STATUS "CMAKE_PARENT_LIST_FILE : ${CMAKE_PARENT_LIST_FILE}")
message(STATUS "CMAKE_CURRENT_SOURCE_DIR : ${CMAKE_CURRENT_SOURCE_DIR}")
# message(STATUS "CMAKE_CURRENT_BINARY_DIR : ${CMAKE_CURRENT_BINARY_DIR}")
# message(STATUS "CMAKE_SOURCE_DIR : ${CMAKE_SOURCE_DIR}")
# message(STATUS "CMAKE_BINARY_DIR : ${CMAKE_BINARY_DIR}")
# message(STATUS "PROJECT_SOURCE_DIR : ${PROJECT_SOURCE_DIR}")
# message(STATUS "PROJECT_BINARY_DIR : ${PROJECT_BINARY_DIR}")
~
# 소스 트리 구조

.
├── CMakeLists.txt    <-- root
├── bar
│   ├── CMakeLists.txt    <-- root/bar
│   └── modules
│       └── bar_module.cmake    <-- root/bar/modules
├── main.cc
└── modules    
    └── root_module.cmake    <-- modules/root

3 directories, 6 files
# 실행 1

# 현재 디렉터리와 소스 디렉터리가 같다
-- @@@@@@@@@@@@@@@CMakeLists.txt@@@@@@@@@@@@@@@ 
-- CMAKE_CURRENT_LIST_DIR : /home/red/cgold
-- CMAKE_CURRENT_SOURCE_DIR : /home/red/cgold

# include로 포함된 .cmake 모듈, 새 프로젝트가 생성되지 않고 포함이다
-- @@@@@@@@@@@@@@@modules/root_module.cmake@@@@@@@@@@@@@@@ 
-- CMAKE_CURRENT_LIST_DIR : /home/red/cgold/modules    # 현재 .cmake의 디렉터리 경로
-- CMAKE_CURRENT_SOURCE_DIR : /home/red/cgold    # 여전히 소스 디렉터리는 root를 가리킨다.
# .cmake는 CMakeLists.txt에 프로젝트로서 포함된 것이 아니다. 단순히 코드를 모아둔 모듈로서 포함된 것이다.
# 따라서 현재 소스 트리 구조상 소드 트리 디렉터리 경로는 root가 된다.

# add_subdirectory로 포함된 모듈, bar라는 새로운 프로젝트가 생성 되었다.
-- @@@@@@@@@@@@@@@root/bar/CMakeLists.txt@@@@@@@@@@@@@@@
-- CMAKE_CURRENT_LIST_DIR : /home/red/cgold/bar    # 현재 .cmake의 디렉터리 경로
-- CMAKE_CURRENT_SOURCE_DIR : /home/red/cgold/bar    # 현재 소스 디렉터리는 bar
# root/bar/CMakeLists.txt가 위치한 소스 디렉터리를 출력하게 된다.

-- @@@@@@@@@@@@@@@root/bar/modules/bar_module.cmake@@@@@@@@@@@@@@@
-- CMAKE_CURRENT_LIST_DIR : /home/red/cgold/bar/modules    # 현재 .cmake의 디렉터리 경로
-- CMAKE_CURRENT_SOURCE_DIR : /home/red/cgold/bar    # 현재 소스 디렉터리는 bar
# bar_module.cmake 역시 include로 포함 되었으며 새 프로젝트를 생성하지 않았기에 
# 현재 소스 디렉터리는 root/bar/CMakeLists.txt가 위치한 bar 이다.

-- Configuring done
-- Generating done
-- Build files have been written to: /home/red/cgold/build
  • 바이너리 트리까지 같이 출력
    • 바이너리 트리는 cmake 실행시 지정한(-B) 출력 디렉터리에 생성된다.
    • 바이너리 트리는 소스 트리와 같은 구조를 가지며 다만 디렉터리 경로사 출력 디렉터리가 반영된 것 뿐이다.
$ cmake -B build

실행 2 : 주석 처리한 meesage들을 모두 해제하고 다시 실행

-- @@@@@@@@@@@@@@@root@@@@@@@@@@@@@@@
-- CMAKE_CURRENT_LIST_DIR : /home/red/cgold
-- CMAKE_CURRENT_LIST_FILE : /home/red/cgold/CMakeLists.txt
-- CMAKE_CURRENT_LIST_LINE : 8
-- CMAKE_PARENT_LIST_FILE : /home/red/cgold/CMakeLists.txt
-- CMAKE_CURRENT_SOURCE_DIR : /home/red/cgold
-- CMAKE_CURRENT_BINARY_DIR : /home/red/cgold/build
-- CMAKE_SOURCE_DIR : /home/red/cgold
-- CMAKE_BINARY_DIR : /home/red/cgold/build
-- PROJECT_SOURCE_DIR : /home/red/cgold
-- PROJECT_BINARY_DIR : /home/red/cgold/build
-- @@@@@@@@@@@@@@@modules/root@@@@@@@@@@@@@@@
-- CMAKE_CURRENT_LIST_DIR : /home/red/cgold/modules
-- CMAKE_CURRENT_LIST_FILE : /home/red/cgold/modules/root_module.cmake
-- CMAKE_CURRENT_LIST_LINE : 5
-- CMAKE_PARENT_LIST_FILE : /home/red/cgold/CMakeLists.txt
-- CMAKE_CURRENT_SOURCE_DIR : /home/red/cgold
-- CMAKE_CURRENT_BINARY_DIR : /home/red/cgold/build
-- CMAKE_SOURCE_DIR : /home/red/cgold
-- CMAKE_BINARY_DIR : /home/red/cgold/build
-- PROJECT_SOURCE_DIR : /home/red/cgold
-- PROJECT_BINARY_DIR : /home/red/cgold/build
-- @@@@@@@@@@@@@@@root/bar@@@@@@@@@@@@@@@
-- CMAKE_CURRENT_LIST_DIR : /home/red/cgold/bar
-- CMAKE_CURRENT_LIST_FILE : /home/red/cgold/bar/CMakeLists.txt
-- CMAKE_CURRENT_LIST_LINE : 7
-- CMAKE_PARENT_LIST_FILE : /home/red/cgold/bar/CMakeLists.txt
-- CMAKE_CURRENT_SOURCE_DIR : /home/red/cgold/bar
-- CMAKE_CURRENT_BINARY_DIR : /home/red/cgold/build/bar
-- CMAKE_SOURCE_DIR : /home/red/cgold
-- CMAKE_BINARY_DIR : /home/red/cgold/build
-- PROJECT_SOURCE_DIR : /home/red/cgold/bar
-- PROJECT_BINARY_DIR : /home/red/cgold/build/bar
-- @@@@@@@@@@@@@@@root/bar/modules@@@@@@@@@@@@@@@
-- CMAKE_CURRENT_LIST_DIR : /home/red/cgold/bar/modules
-- CMAKE_CURRENT_LIST_FILE : /home/red/cgold/bar/modules/bar_module.cmake
-- CMAKE_CURRENT_LIST_LINE : 5
-- CMAKE_PARENT_LIST_FILE : /home/red/cgold/bar/CMakeLists.txt
-- CMAKE_CURRENT_SOURCE_DIR : /home/red/cgold/bar
-- CMAKE_CURRENT_BINARY_DIR : /home/red/cgold/build/bar
-- CMAKE_SOURCE_DIR : /home/red/cgold
-- CMAKE_BINARY_DIR : /home/red/cgold/build
-- PROJECT_SOURCE_DIR : /home/red/cgold/bar
-- PROJECT_BINARY_DIR : /home/red/cgold/build/bar
-- Configuring done
-- Generating done
-- Build files have been written to: /home/red/cgold/build
profile
mohadang

0개의 댓글