반응형
크로스 플랫폼(Cross Platform) 빌드
플랫폼 대응
- 플랫폼이 다르면 System API, 혹은 같은 API더라도 구현 형태나 지원 범위가 상이할 수 있습니다.
- 조건부 분기문을 사용해 플랫폼에 맞게 미리 작성된 라이브러리를 선택하도록 하면 상대적으로 부담이 줄어들 것입니다.
- 크로스 컴파일을 위한 라이브러리라면 변수를 검사하는 순서, 조건문에 주의를 기울여야 합니다.
- CMake는 플랫폼 관련 변수들을 제공하고 있으며, Android 혹은 iOS로 크로스 컴파일을 하기 위해 CMake Toolchain을 사용한 경우 그 값을 참고해 처리를 다르게 할 수 있습니다.
- 단, 이는 가장 윗 줄에 주석으로 적은 것처럼 현재 시스템을 변수로 알려주는 것이라는 점에 주의하시기 바랍니다.
예제) 크로스 플랫폼(Cross Platform) 대응
# *현재* CMake가 실행되는 시스템을 알려진 변수들로 확인하는 방법
# wrapper::system 같은 별명을 붙이면 상대적으로 편해진다
if(WIN32)
add_subdirectory(external/winrt)
add_subdirectory(impl/win32)
elseif(APPLE)
add_subdirectory(impl/posix)
# additional implementation for MacOS
add_subdirectory(impl/macos)
elseif(UNIX)
add_subdirectory(impl/posix)
# additional implementation with Linux API
if(${CMAKE_SYSTEM} MATCHES Linux)
add_subdirectory(impl/linux)
endif()
else()
# 지원하지 않음.
# android.toolchain.cmake 혹은 ios.toolchain.cmake 에서 지정하는 변수들
if(ANDROID OR IOS)
message(FATAL_ERROR "No implementation for the platform")
endif()
# ...
endif()
컴파일러 대응
- 플랫폼이 달라지면 컴파일러도 달라질 수 있으며, 프로그램 생성에 사용할 수 있는 컴파일 옵션들이 달라지게 됩니다.
- 하단의 튜토리얼에서 간단히 Warning, Optimization를 다르게 적용하는 예시를 보이겠습니다.
컴파일러 확인
message(STATUS "Compiler")
message(STATUS " - ID \t: ${CMAKE_CXX_COMPILER_ID}")
message(STATUS " - Version \t: ${CMAKE_CXX_COMPILER_VERSION}")
message(STATUS " - Path \t: ${CMAKE_CXX_COMPILER}")
- CMAKE_CXX_COMPILER_ID: 컴파일러의 이름
- CMAKE_CXX_COMPILER_VERSION: 컴파일러의 버전
- CMAKE_CXX_COMPILER: 컴파일러 실행파일의 경로
예시) 컴파일러 확인
Windows에서 별다른 조작 없이 Visual Studio 15 2017 Win64를 Generator로 지정하면, 아래와 같이 출력될 것입니다. (Community 버전 기준)
-- Compiler
-- - ID : MSVC
-- - Version : 19.16.27024.1
-- - Path : C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x64/cl.exe
컴파일러를 Clang-cl을 명시하면 아래와 같은 출력을 확인할 수 있습니다.
-- Compiler
-- - ID : Clang
-- - Version : 7.0.0
-- - Path : C:/Program Files/LLVM/bin/clang-cl.exe
Mac OS에서는 아래와 AppleClang에 대한 정보를 보여줍니다.
-- Compiler
-- - ID : AppleClang
-- - Version : 9.1.0.9020039
-- - Path : /Applications/Xcode-9.4.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++
아래와 같이 CMake 내에서 컴파일러에 따라서 처리를 다르게 할 수 있습니다.
if(MSVC) # Microsoft Visual C++ Compiler
# ...
elseif(${CMAKE_CXX_COMPILER_ID} MATCHES Clang) # Clang + AppleClang
# ...
elseif(${CMAKE_CXX_COMPILER_ID} MATCHES GNU) # GNU C Compiler
# ...
endif()
선술한 플랫폼 변수들을 함께 고려하면 조합이 많이 발생할 수 있기 때문에, CMake 파일들을 간결히 유지하려면 플랫폼에 따라서 특정 컴파일러만을 지원하는 것이 타당할 것입니다.
참고
- [Github]CMake 할때 쪼오오금 도움이 되는 문서:
https://gist.github.com/luncliff/6e2d4eb7ca29a0afd5b592f72b80cb5c?permalink_comment_id=3037466
반응형
'Study: DeveloperTools(DevTool) > DevTool: CMake' 카테고리의 다른 글
[CMake] configure_file(): CMake 변수값을 소스코드에서 사용! (0) | 2022.07.04 |
---|---|
[CMake] function: 반복되는 작업은 함수화하자! (0) | 2022.06.28 |
[CMake] FetchContent: 외부 라이브러리를 사용하자~ (0) | 2022.06.24 |
[CMake] Effective Modern CMake 정리 (0) | 2022.06.24 |
[CMake] An Introduction to Modern CMake 정리 (0) | 2022.06.24 |