Mastering Cmake Pdf !!exclusive!! «90% Ultimate»
project/ ├── CMakeLists.txt (top-level) ├── cmake/ │ └── FindMyCustomLib.cmake ├── src/ │ ├── CMakeLists.txt │ └── app.cpp ├── libs/ │ ├── core/ │ │ ├── CMakeLists.txt │ │ └── core.cpp │ └── utils/ │ ├── CMakeLists.txt │ └── utils.h (header-only) └── tests/ ├── CMakeLists.txt └── test_core.cpp cmake_minimum_required(VERSION 3.20) project(MyProject VERSION 1.0.0 LANGUAGES CXX) Options option(BUILD_TESTS "Build unit tests" ON) option(BUILD_SHARED_LIBS "Build shared libs instead of static" OFF) Global settings set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) Add subdirectories add_subdirectory(libs/core) add_subdirectory(libs/utils) add_subdirectory(src)
add_custom_command( OUTPUT $CMAKE_CURRENT_BINARY_DIR/version.h COMMAND $CMAKE_COMMAND -DVERSION=$PROJECT_VERSION -P write_version.cmake DEPENDS write_version.cmake COMMENT "Generating version.h" ) add_custom_target(generate_version DEPENDS $CMAKE_CURRENT_BINARY_DIR/version.h) add_dependencies(my_app generate_version) toolchain_arm.cmake :
add_executable(test_core test_core.cpp) target_link_libraries(test_core PRIVATE core) add_test(NAME CoreSanity COMMAND test_core) add_test(NAME CoreEdgeCase COMMAND test_core --edge) Presets: The Future of CMake Workflows (3.19+) CMakePresets.json standardizes configuring, building, and testing across teams: mastering cmake pdf
find_path(MyLib_INCLUDE_DIR mylib.h PATHS /usr/include /usr/local/include) find_library(MyLib_LIBRARY mylib PATHS /usr/lib /usr/local/lib) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(MyLib DEFAULT_MSG MyLib_LIBRARY MyLib_INCLUDE_DIR)
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: project/ ├── CMakeLists
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) |
:
find_package(OpenCV 4.5 REQUIRED) target_link_libraries(my_app PRIVATE opencv::core opencv::imgproc) # Propagates includes automatically cmake/FindMyLib.cmake :