cmake - message, 상속 속성, include, link

markyang92·2021년 7월 28일
1

CMake

목록 보기
1/1
post-thumbnail

variable

  • CMake에서 변수의 값은 string타입이다. (일부 경우 제외)

  1. Variable 설정, 해제
set( )	 # 설정
unset( ) # 해제

Scope

1-1. CMake에서 Variable Scope

  • dynamic 스코프를 가진다. set으로 현재 스코프에 변수 바인딩을 생성함

1-2. function() 에서 Variable Scope

  • function() 명령은 다수의 명령의 하나의 명령으로 정의
  • function 단위 스코프를 가짐
  • 즉, function 내부에서 set(), unset() 명령으로 변수를 설정하면, function 안쪽과 거기서 호출된 명령에서만 유효

1-3. directory Variable Scope

  • 소스트리의 각 디렉토리는 각각의 스코프를 가짐
  • CMake는 새로운 디렉토리에 CMakeLists.txt 파일이 있으면, parent directory에 정의된 모든 변수 바인딩을 복사
  • CMake 스크립트를 cmake -P로 처리하면, 하나의 디렉토리 스코프를 바인딩
  • function 외부에서 set(), unset() 명령으로 변수를 설정하면 현재 디렉토리 스코프에 변수를 바인딩

CMake 예약어

  • CMAKE_로 시작하는 스트링 (대, 소, 대소 혼합)
  • _CMAKE_로 시작하는 스트링 (대, 소, 대소 혼합)
  • _any_cmake_command로 시작하는 스트링

Cache

  • CMake는 캐시 변수캐시 항목을 보관
  • 캐시 값은 프로젝트 빌드 트리에서 여러번 실행될 때 값이 유지
  • 캐시 영역은 격리된 바인딩 스코프를 가져오며 이것은 set()unset()CACHE 옵션으로 명시적 요청으로만 변경된다.
  • CMake는 변수 값을 구할 때, 변수 바인딩을 먼저, function 스코프, 디렉토리 스코프를 찾음
  • 변수 set 바인딩이 찾아지면 사용
  • 변수 unset 바인딩이 찾아지거나 변수 바인딩이 없는 경우, CMake는 캐시 변수를 찾는다.
  • 여기서도 못찾으면 빈 스트링 "" 으로 처리
  • $CACHE{VAR} 구문으로 캐시 변수에서 직접 찾을 수 있음
  • 다음 매뉴얼에는 CMake가 제공하는 다수의 변수와 프로젝트 코드에서 설정하는 변수를 기술한다.

CMake 명령어

Scripting Commands

항상 사용 가능

  • break
  • cmake_host_system_information
  • cmake_language
  • cmake_parse_arguments
  • cmake_path
  • cmake_policy
  • continue
  • else
  • elseif
  • endfunction
  • endif
  • endmacro
  • execute_process
  • file
  • find_file
  • find_package
  • find_path
  • find_program
  • function
  • get_cmake_property
  • get_directory_property
  • get_property
  • if
  • include
  • list
  • macro
  • mark_as_advanced
  • message
  • option
  • return
  • set
  • set_directory_properties
  • set_property
  • string
  • unset
  • variable_watch

Project Commands

CMake 프로젝트 코드에서 사용

  • add_compile_definitions
  • add_compile_options
  • add_custom_command
  • add_definitions
  • add_Dependencies
  • add_executable
  • add_link_options
  • add_subdirectory
  • add_test
  • build_command
  • create_test_sourcelist
  • define_property
  • enable_testing
  • export
  • fltk_wrap_ui
  • get_target_property
  • get_test_property
  • include_directories
  • include_regular_expression
  • install
  • link_directories
  • load_cache
  • project
  • remove_definitions
  • set_target_properties
  • set_tests_properties
  • source_group
  • target_compile_features
  • target_compile_options
  • target_include_directories
  • target_link_libraries
  • target_link_options
  • target_precompile_headers
  • try_compile
  • try_run

CTest Commands

CTest 스크립트에서 사용

  • ctest_build
  • ctest_configure
  • ctest_coverage
  • ctest_memcheck
  • ctest_read_custom_files
  • ctest_run_script
  • ctest_start
  • ctest_submit
  • ctest_test
  • ctest_upload

Deprecated Commands

이전 버전 코드에서만 호환성을 위해 사용하고, 새 코드에서는 사용하지 말 것

  • build_name
  • exec_program
  • export_library_dependencies
  • install_programs
  • install_targets
  • load_command
  • output_required_files
  • qt_wrap_cpp
  • qt_wrap_ui
  • subdir_depends
  • subdirs
  • use_mangled_mesa
  • variable_requires
  • write_file

CMake 모듈

Utility 모듈

Utility 모듈을 사용하려면 include() 명령으로 로드

  • AndroidTestUtilities
  • BundleUtilities
  • CheckCCompilerFlag
  • ChekcCSourceCompiles
  • CheckCSourceRuns
  • CheckCXXCompilerFlag
  • CheckCXXSourceRuns
  • CheckCXXSymbolExists
  • CheckFortranCompilerFlags
  • CheckFortranSourceCompiles
  • CheckFortranSourceRuns
  • CheckFunctionExists
  • CheckIncludeFile
  • CheckIncludeFiles
  • CheckIPOSupported
  • CheckLibraryExists
  • CheckLinkerFlag
  • CheckOBJCompilerFlag
  • CheckOBJSourceRuns
  • CheckOBJCXXCompilerFlag
  • CheckOBJCXXSourceCompiles
  • CheckPIESupported
  • CheckPrototypeDefinition
  • CheckSourceCompiles
  • CheckStructHasMember
  • CheckSymbolExists
  • CheckTypeSize
  • CMakeAddFortranSubdirectory
  • CMakeBackwardCompatibilityCXX
  • CMakeDependentOption
  • CMakeFindFrameworks
  • CMakeFindPackageMode
  • CMakeGraphVizOptions
  • CMakePrintHelpers
  • CMakePrintSystemInformation
  • CMakePushCheckState
  • CPack
  • CPackComponent
  • CPackIFW
  • CSharpUtilities
  • CTest
  • CTestCoverageCollectGCOV
  • CTestUseLaunchers
  • Dart
  • DeployQt4
  • ExternalProject
  • FeatureSummary
  • FetchContent
  • FindPackageManager
  • FortranCInterface
  • GenerateExportHeader
  • GNUInstallDirs
  • GoogleTest
  • InstallRequiredSystemLibraries
  • SelectLibraryConfigurations
  • SquishTestScript
  • TestBigEndian
  • TestForANSIStreamHeaders
  • TestForSSTREAM
  • TestForSTDNamespace
  • UseJava
  • UseSWIG
  • UsewxWidgets

Find 모듈

Find 모듈은 외부 항목을 찾는데 사용하며 보통 find_package() 명령을 통해서 호출된다.
뭐 이런 것 까지 다 필요해? 라겠지만.. Full automated 배포를 위해서..

  • FindALSA
  • FindArmadillo
  • FindASPELL
  • FindAVIFile
  • FindBacktrace
  • FindBISON
  • FindBLAS
  • FindBoost
  • FindBullet
  • FindBZip2
  • FindCABLE
  • FindCoin3D
  • FindCUDAToolkit
  • FindCups
  • FindCURL
  • FindCurses
  • FindCVS
  • FindCxxTest
  • FindCygwin
  • FindDart
  • FindDCMTK
  • FindDevIL
  • FindDoxygen
  • FindEnvModules
  • FindEXPAT
  • FindFLEX
  • FindFLTK
  • FindFLTK2
  • FindFontconfig
  • FindFreetype
  • FindGCCXML
  • FindGDAL
  • FindGettext
  • FindGIF
  • FindGit
  • FindGLEW
  • FindGLUT
  • FindGnuplot
  • FindGnuTLS
  • FindGSL
  • FindGTest
  • FindGTK
  • FindGTK2
  • FindHDF5
  • FindHg
  • FindHSPELL
  • FindHTMLHelp
  • FindIce
  • FindIconv
  • FindIcotool
  • FindICU
  • FindImageMagick
  • FindIntl
  • FindITK
  • FindJasper
  • FindJava
  • FindJNI
  • FindJPEG
  • FindKDE3
  • FindKDE4
  • FindLAPACK
  • FindLATEX
  • FindLibArchive
  • FindLibinput
  • FindLibLZMA
  • FindLibXml2
  • FindLibXslt
  • FindLTTngUST
  • FindLua
  • FindLua50
  • FindLua51
  • FindMatlab
  • FindMFC
  • FindMotif
  • FindMPEG
  • FindMPEG2
  • FindMPI
  • FindODBC
  • FindOpenACC
  • FindOpenAL
  • FindOpenCL
  • FindOpenGL
  • FindOpenMP
  • FindOpenSceneGraph
  • FindOpenSSL
  • FindOpenThreads
  • Findosg
  • Findosg_functions
  • FindosgAnimation
  • FindosgDB
  • FindosgFX
  • FindosgGA
  • FindosgIntrospection
  • FindosgManipulator
  • FindosgParticle
  • FindosgPresentation
  • FindosgProducer
  • FindosgQt
  • FindosgShadow
  • FindosgSim
  • FindosgTerrain
  • FindosgText
  • FindosgUtil
  • FindosgViewer
  • FindosgVolume
  • FindosgWidget
  • FindPatch
  • FindPerl
  • FindPerlLibs
  • FindPHP4
  • FindPhysFS
  • FindPike
  • FindPkgConfig
  • FindPNG
  • FindPostgreSQL
  • FindProducer
  • FindProtobuf
  • FindPython
  • FindPython2
  • FindPython3
  • FindQt3
  • FindQt4
  • FindQuickTime
  • FindRTI
  • FindRuby
  • FindSDL
  • FindSDL_image
  • FindSDL_mixer
  • FindSDL_net
  • FindSDL_sound
  • FindSDL_ttf
  • FindSelfPackers
  • FindSquish
  • FindSQLite3
  • FindSubversion
  • FindSWIG
  • FindTCL
  • FindTclsh
  • FindTclStub
  • FindThreads
  • FindTIFF
  • FindUnixCommands
  • FindVTK
  • FindVulkan
  • FindWget
  • FindWish
  • FindwxWidgets
  • FindX11
  • FindXalanC
  • FindXCTest
  • FindXercesC
  • FindXMLRPC
  • FindZLIB

Build Specification, Usage Requirements

  1. Build Specification: 현재 target을 빌드할 때 필요한 항목
    1-1. Build Specification은 현재 target 빌드에 적용하는 속성
  2. Usage Requirements: 현재 target의존하는 항목을 빌드할 때 필요한 항목
    2-1. Usage RequirementsCOMPILE_OPTIONSCOMPILE_DEFINITIONS의 특정 항목은 전파되지 않음
    2-2. 설정하는 target의 속성은 권장 사항, 편의 사항, 요구 사항!
    2-3. '재배포'를 위한 '패키지 작성'에서 Usage Requirements 사용에 대한 주의할 점은 재배치 가능 패키지 작성을 참조한다.
  • targetBuild SpecificationUsage Requirements를 설정하는 명령

상속 속성에 따라 다음과 같은 target 속성에 추가한다.

cmake commandPUBLICPRIVATEINTERFACE
target_include_directories()INCLUDE_DIRECTORIES
INTERFACE_INCLUDE_DIRECTORIES
INCLUDE_DIRECTORIESINTERFACE_INCLUDE_DIRECTORIES
target_compile_definitions()COMPILE_DEFINITIONS
INTERFACE_COMPILE_DEFINITIONS
COMPILE_DEFINITIONSINTERFACE_COMPILE_DEFINITIONS
target_compile_options()COMPILE_OPTIONS
INTERFACE_COMPILE_OPTIONS
COMPILE_OPTIONSINTERFACE_COMPILE_OPTIONS

  • 명령 형식은 아래와 같이 키워드를 바꾸어가며, 여러번 호출 할 수 있다.
  • 명령을 여러번 호출되면 순서대로 append 된다.
target_compile_definitions(archive PRIVATE BUILDING_WITH_LZMA INTERFACE USING_ARCHIVE_LIB)

Usage Requirements의 전파

  • targetUsage Requirements는 '종속' 항목에 전파될 수 있다.
  • target_link_libraries() 명령에는 전파 범위를 제어하는

메시지

message()

message( [<Type>] <message> )
  • Makefile 생성 과정 中, message를 콘솔에 출력한다.

  • Type은 생략할 수 있고, 생략시 그냥 콘솔에 메시지를 출력한다.

  • messagevariable 도 들어갈 수 있다.

TypeDescription
STATUS상태 메시지 출력
'--' 가 추가되어 메시지 출력
WARNING경고 메시지 출력하고, 계속 진행
AUTHOR_WARNING프로젝트 개발자용 경고 메시지를 출력하고, 계속 진행
SEND_ERROR오류 메시지를 출력하고 계속 진행하지만 Makefile 생성 안함
FATAL_ERROR오류 메시지를 출력하고, 작업을 즉시 중단

message(FATAL_ERROR "Fatal error occurred!")

위 명령은 FATAL_ERRORMakefile 작성을 즉시 중단한다.


add_custom_command()

add_custom_command(TARGET ${MY_LIBRARY_NAME} POST_BUILD COMMAND echo Hello world! USES_TERMINAL)
  • Makefile 생성 후, Makefile로 빌드할 때 메시지를 출력한다.
    • COMMAND echo를 사용하는 방식

상속 속성

  • CMake에서는 default로 PUBLIC
속성설명
PUBLIC설정한 경로는
- INCLUDE_DIRECTORIES
- INTERFACE_INCLUDE_DIRECTORIES 에 추가된다.
PRIVATE설정한 경로는
- INCLUDE_DIRECTORIES 에 추가
INTERFACE설정한 경로는
- INTERFACE_INCLUDE_DIRECTORIES 에 추가된다.
현재 target에서는 사용되지 않고, 현재 target에 의존한 target에 사용된다.
  • target_include_directories()
  • target_link_libraries()
    에서 상속 속성이 사용된다.

include 추가

target_include_directories()

  • include 디렉토리를 target에 추가한다.
target_include_directories(<target> [SYSTEM] [BEFORE]
   <INTERFACE|PUBLIC|PRIVATE> [items1...]
   [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
  • CMake는 모든 target에 대해 사전 처리 단계에서 빌드를 위해, 아래를 사용하여 헤더 파일 검색한다.
    • INCLUDE_DIRECTORIES: 현재 target에만 사용
    • INTERFACE_INCLUDE_DIRECTORIES: 현재 target + 종속된 다른 대상의 INCLUDE_DIRECTORIES에 추가
  • target_include_directories()PUBLIC | PRIVATE | INTERFACE 키워드에 따라 지정한 경로를 INCLUDE_DIRECTORIESINTERFACE_INCLUDE_DIRECTORIES에 추가한다.

link 추가

target_link_libraries(<target> <PUBLIC | PRIVATE | INTERFACE > <item>)
  • target에 link할 라이브러리(<item>)을 추가한다.
    • gcc 에서 libpthread.so를 링크할 때 -lpthread 와 같다고 생각하면 됨
  • 종속 <item>은 동일한 프로젝트에서 빌드된 경우 <item>INTERFACE_INCLUDE_DIRECTORIES<target>INCLUDE_DIRECTORIES에 추가한다.
profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글