# Install targets install(TARGETS my_lib EXPORT MyProjectTargets LIBRARY DESTINATION lib ARCHIVE DESTINATION lib INCLUDES DESTINATION include ) install(DIRECTORY include/ DESTINATION include) install(EXPORT MyProjectTargets FILE MyProjectTargets.cmake NAMESPACE MyProject:: DESTINATION lib/cmake/MyProject ) Write config version file include(CMakePackageConfigHelpers) write_basic_package_version_file( "$CMAKE_CURRENT_BINARY_DIR/MyProjectConfigVersion.cmake" VERSION $PROJECT_VERSION COMPATIBILITY SameMajorVersion )
Introduction CMake is the de facto standard build system generator for C and C++ projects. Unlike traditional build systems (Make, Ninja, Visual Studio), CMake doesn’t build your code directly. Instead, it generates platform-native build scripts that compile and link your software reliably across Linux, macOS, Windows, and embedded systems. mastering cmake pdf
include_directories(include) link_directories(/custom/lib) add_executable(my_app main.cpp) not by dependents (e.g.
add_library(utils STATIC utils.cpp) target_include_directories(utils PUBLIC include/private) # Both utils and my_app need it target_compile_definitions(utils PRIVATE UTILS_BUILD=1) add_executable(my_app main.cpp) target_link_libraries(my_app PRIVATE utils) # utils's PUBLIC includes propagate A master-level CMake project looks like this: not by this target (e.g.
add_executable(my_app main.cpp) target_include_directories(my_app PRIVATE include) target_link_directories(my_app PRIVATE /custom/lib) Why? Target properties don’t pollute sibling directories or subprojects. | Modifier | Effect | |------------|-------------------------------------------------------------------------| | PRIVATE | Used only by this target, not by dependents (e.g., internal .cpp includes) | | PUBLIC | Used by this target and all dependents (e.g., header include dirs) | | INTERFACE | Used only by dependents, not by this target (e.g., header-only libs) |