cmake -B build | 빌드 구성 |
cmake --build build | 프로젝트 빌드 |
cmake --build build --target install | 설치 |
cmake -B build -DCMAKE_BUILD_TYPE=Release | 릴리스 빌드 |
cmake -B build -G "Ninja" | Ninja 사용 |
cmake -B build -G "Visual Studio 17 2022" | VS 사용 |
ctest --test-dir build | 테스트 실행 |
cmake --install build --prefix /usr/local | 접두사로 설치 |
cmake_minimum_required(VERSION 3.20)
project(MyProject VERSION 1.0.0 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_executable(myapp
src/main.cpp
src/utils.cpp
)
target_include_directories(myapp PRIVATE
${CMAKE_SOURCE_DIR}/include
) # Static library
add_library(mylib STATIC
src/lib.cpp
)
# Shared library
add_library(mylib_shared SHARED
src/lib.cpp
)
# Header-only
add_library(mylib_header INTERFACE)
target_include_directories(mylib PUBLIC
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
# Link library
target_link_libraries(myapp PRIVATE mylib) # Find installed package
find_package(OpenSSL REQUIRED)
find_package(Boost 1.80 REQUIRED COMPONENTS filesystem system)
find_package(Threads REQUIRED)
target_link_libraries(myapp PRIVATE
OpenSSL::SSL
OpenSSL::Crypto
Boost::filesystem
Threads::Threads
) include(FetchContent)
FetchContent_Declare(
googletest
GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG v1.14.0
)
FetchContent_Declare(
json
URL https://github.com/nlohmann/json/releases/download/v3.11.2/json.tar.xz
)
FetchContent_MakeAvailable(googletest json)
target_link_libraries(myapp PRIVATE
GTest::gtest_main
nlohmann_json::nlohmann_json
) # Set variable
set(MY_VAR "value")
set(MY_LIST "a" "b" "c")
# Cache variable (user-configurable)
set(MY_OPTION "default" CACHE STRING "Description")
# Option (boolean)
option(ENABLE_TESTS "Build tests" ON)
# Conditional
if(ENABLE_TESTS)
enable_testing()
add_subdirectory(tests)
endif()
# Environment variable
set(ENV{PATH} "$ENV{PATH}:/new/path") # Paths
${CMAKE_SOURCE_DIR} # Root source
${CMAKE_BINARY_DIR} # Build directory
${CMAKE_CURRENT_SOURCE_DIR} # Current CMakeLists.txt dir
${PROJECT_SOURCE_DIR} # Project root
# System
${CMAKE_SYSTEM_NAME} # Linux, Windows, Darwin
${CMAKE_CXX_COMPILER_ID} # GNU, Clang, MSVC
# Build type
${CMAKE_BUILD_TYPE} # Debug, Release, etc.
# Compiler flags
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
set(CMAKE_CXX_FLAGS_DEBUG "-g -O0")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG") enable_testing()
add_executable(test_main
tests/test_main.cpp
)
target_link_libraries(test_main PRIVATE
mylib
GTest::gtest_main
)
include(GoogleTest)
gtest_discover_tests(test_main)
# Or manual test
add_test(NAME MyTest COMMAND test_main)
add_test(NAME ScriptTest COMMAND ${CMAKE_SOURCE_DIR}/test.sh) install(TARGETS mylib myapp
EXPORT MyProjectTargets
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
RUNTIME DESTINATION bin
INCLUDES DESTINATION include
)
install(DIRECTORY include/
DESTINATION include
)
install(FILES ${CMAKE_BINARY_DIR}/config.h
DESTINATION include
)
# Export for find_package
install(EXPORT MyProjectTargets
FILE MyProjectTargets.cmake
NAMESPACE MyProject::
DESTINATION lib/cmake/MyProject
)