
CMake에서 C++ 표준이나 컴파일 설정을 다루는 CMake 명령어들은 소개한다.
타겟의 속성을 설정하는 명령어로, 특정 C++ 표준을 명시적으로 설정할 때 사용된다.
set_target_properties(MyApp PROPERTIES CXX_STANDARD 17)
타겟별로 C++ 표준을 지정하고, 다른 타겟에는 영향을 미치지 않는다. 그리고 명시적으로 C++17을 설정하며, 이 타겟은 반드시 해당 표준을 따르게 강제한다.
타겟이 요구하는 C++ 기능을 설정하는 명령어로, CMake가 자동으로 해당 기능을 지원하는 최소한의 표준을 설정한다.
target_compile_features(MyApp PRIVATE cxx_std_17)
C++ 표준 그 자체보다는, 타겟이 특정 기능을 사용할 수 있도록 CMake에 지시한다. 즉, CMake가 해당 기능을 사용하기 위한 적절한 C++ 표준을 자동으로 설정한다.
CMake 전체에서 사용되는 기본 C++ 표준을 지정한다.모든 타겟에 적용되지만, 타겟별로 따로 설정된 표준이 있으면 그것이 우선된다.
set(CMAKE_CXX_STANDARD 17)
이 명령어는 프로젝트 전반에 걸쳐 C++ 표준을 설정하고, 개별 타겟에서 추가적인 설정이 없다면 이를 사용한다.
이 명령어는 특정 C++ 표준을 강제할지 여부를 설정한다. ON으로 설정하면 컴파일러가 명시한 C++ 표준보다 낮은 버전으로 후퇴할 수 없다.
set(CMAKE_CXX_STANDARD_REQUIRED ON)
기본적으로 OFF이며, 이 경우 컴파일러가 지원하는 낮은 표준으로 후퇴할 수 있다. 이를 ON으로 설정하면 후퇴가 불가능해진다.
이 명령어는 GNU 확장 기능을 사용할 지 여부를 결정한다. 기본적으로 CMake는 g++ 컴파일러에서 확장 기능이 포함된 표준(-std=gnu++17)을 사용하지만, 이를 OFF로 설정하면 순수한 C++ 표준(-std=c++17)만 사용한다.
set(CMAKE_CXX_EXTENSIONS OFF)
GNU 확장 기능이 필요한 경우에는 ON으로 설정하고, 순수한 표준을 원할 때는 OFF로 설정한다.
타겟별로 컴파일러 옵션을 세부적으로 설정할 수 있다. 이는 C++ 표준을 지정하는 데도 사용할 수 있으며, 보다 세밀한 플래그를 설정하는 데 유용하다.
target_compile_options(MyApp PRIVATE -std=c++17)
C++ 표준뿐만 아니라 최적화 옵션, 경로 제어 등도 함께 설정할 수 있다.
이 명령어는 전체 프로젝트에 대해 컴파일러 옵션을 설정한다. 타겟별 설정이 아니라 전체 프로젝트의 모든 타겟에 적용된다.
add_compile_options(-Wall -Wextra -std=c++17)
타겟이 아니라 글로버하게 설정된다.
이 명령어는 특정 타겟에 속성(PROPERTY)을 설정하는 것으로 이를 통해 컴파일러나 링커의 플래그를 보다 세밀하게 제어할 수 있다.
set_property(TARGET MyApp PROPERTY CXX_STANDARD 17)
set_target_properties와 비슷하지만 더 세부적인 속성까지 제어할 수 있다.
이 명령어는 컴파일러가 특정 C++ 플래그를 지원하는지 여부를 확인한다.
check_cxx_compiler_flag("-std=c++17" COMPILER_SUPPORTS_CXX17)
특정 플래그에 대한 지원 여부를 확인하고 그 결과를 기반으로 조건부로 C++ 표준을 설정하는 데 유용하다.
CMake의 option() 명령어는 프로젝트 내에서 사용자가 선택할 수 있는 설정 옵션 을 정의하는 데 사용된다. 이는 주로 프로젝트를 빌드할 때 특정 기능을 활성화하거나 비활성화할 수 있도록 하는 설정을 제공한다.
기본적인 문법은 다음과 같다.
option(<option_name> "설명" <초기값>)
<option_name>"설명"<초기값>ON 또는 OFF로 설정 가능)다음은 option 명령어의 예시이다.
option(USE_CUSTOM_LIB "Use a custom library instead of the default" OFF)
위의 예시에서 USE_CUSTOM_LIB 옵션은 기본값이 OFF로 설정된다. 사용자가 빌드할 때 이 옵션을 ON으로 변경하면, 프로젝트는 이를 반영한 설정을 진행하게 된다.
이 옵션은 cmake 명령을 호출할 때 -D (Define) 플래그를 사용해 설정할 수 있다.
$ cmake -DUSE_CUSTOM_LIB=ON ..
이렇게 설정하면 USE_CUSTOM_LIB 옵션이 활성화되어, 해당 옵션에 따라 빌드 구성이 변경될 수 있다.
set_target_properties와 target_compile_features는 C++ 표준을 설정하는 데 사용되지만, 그 동작 방식과 적용 방식에 차이가 있다.
set_target_properties(MyTarget PROPERTIES CXX_STANDARD 17)
이 명령어는 타겟의 속성으로 C++ 표준을 명시적으로 설정한다. 이 경우, 타겟의 컴파일러가 C++17 표준을 준수하도록 명령하는 것이다. 주로 특정 타겟의 속성을 수동으로 설정하는데 사용된다.
target_compile_features(MyTarget PRIVATE cxx_std_17)
이 명령어는 타겟이 요구하는 C++ 표준 기능을 선언하는데 사용된다. CMake는 이 명령을 통해 타겟이 특정 표준을 준수할 수 있는 컴파일러 기능을 자동으로 설정한다.
즉, C++17에서 제공하는 기능을 컴파일할 수 있도록 필요한 플래그를 컴파일러에 설정한다.
CMake가 해당 표준의 모든 관련 컴파일러 플래그를 자동으로 추가해 준다. 또한, CMake는 타겟이 요구하는 기능에 따라 자동으로 적절한 C++ 표준을 설정할 수 있다.C++ 표준을 설정하는 것보다 조금 더 복잡하지만, 기능 중심의 설정에 유용하다.set_target_propertiestarget_comile_featuresCMake는 해당 기능을 활성화할 수 있는 최소한의 C++ 표준을 자동으로 선택해 준다.두 명령어 모두 같은 C++ 표준을 설정하는 것으로 보일 수 있지만, target_compile_features는 기능 기반으로 설정되어 있으며 set_target_properties는 표준을 직접적으로 명시하는 방식이라는 점에서 차이가 있다.
set_target_propertiesC++17을 사용해야 한다 라는 요구사항이 있을 때 사용target_compile_featuresstd::optional)을 사용한다 와 같은 요구사항이 있을 때 사용C++ 표준 그 자체를 지정하고 싶다면, set_target_properties를 사용한다.CMake가 필요한 표준을 자동으로 설정하게 하려면 target_compile_features를 사용한다.C++ 표준과 컴파일 설정을 다루는 명령어들을 정리하면 다음과 같다.
set_target_propertiestarget_compile_featuresCMAKE_CXX_STANDARDCMAKE_CXX_STANDARD_REQUIREDCMAKE_CXX_EXTENSIONStarget_compile_optionsadd_compile_optionsset_property(TARGET ...)check_cxx_compiler_flag이 명령어들을 활용하여 C++ 프로젝트에서 컴파일러의 동작과 표준 준수를 더욱 세밀하게 제어할 수 있다.