sudo apt install g++
) (ppa:ubuntu-toolchain-r/test)
sudo apt install clang
) (apt.llvm.org)brew install llvm
)brew install gcc
)
CMakeLists.txt
)
meson.build
)
BUILD
)
SConstruct
)
xmake.lua
)
autogen.sh
,
configure.sh
)
pkg-config
)Makefile
)
build.ninja
)
poly
├── src -- library source code
│ ├── include -- public API header files
│ │ └── poly
│ │ ├── interpolate.hpp
│ │ └── poly.hpp
│ ├── src -- implementation files
│ │ └── interpolate.cpp
│ └── CMakeLists.txt -- library build script
├── test -- unit tests
│ ├── CMakeLists.txt -- testing framework build script
│ └── test-interpolate.cpp
└── CMakeLists.txt -- user-facing build script
poly
├── src
│ ├── include
│ │ └── poly
│ │ ├── interpolate.hpp
│ │ └── poly.hpp
│ ├── src
│ │ └── interpolate.cpp
│ └── CMakeLists.txt
├── test
│ ├── CMakeLists.txt
│ └── test-interpolate.cpp
└── CMakeLists.txt
poly
├── src
│ ├── include
│ │ └── poly
│ │ ├── interpolate.hpp
│ │ └── poly.hpp
│ ├── src
│ │ └── interpolate.cpp
│ └── CMakeLists.txt
├── test
│ ├── CMakeLists.txt
│ └── test-interpolate.cpp
└── CMakeLists.txt
poly
├── src
│ ├── include
│ │ └── poly
│ │ ├── interpolate.hpp
│ │ └── poly.hpp
│ ├── src
│ │ └── interpolate.cpp
│ └── CMakeLists.txt
├── test
│ ├── CMakeLists.txt
│ └── test-interpolate.cpp
└── CMakeLists.txt
poly
├── src
│ ├── include
│ │ └── poly
│ │ ├── interpolate.hpp
│ │ └── poly.hpp
│ ├── src
│ │ └── interpolate.cpp
│ └── CMakeLists.txt
├── test
│ ├── CMakeLists.txt
│ └── test-interpolate.cpp
└── CMakeLists.txt
poly
├── src
│ ├── include
│ │ └── poly
│ │ ├── interpolate.hpp
│ │ └── poly.hpp
│ ├── src
│ │ └── interpolate.cpp
│ └── CMakeLists.txt
├── test
│ ├── CMakeLists.txt
│ └── test-interpolate.cpp
└── CMakeLists.txt
poly
├── src
│ ├── include
│ │ └── poly
│ │ ├── interpolate.hpp
│ │ └── poly.hpp
│ ├── src
│ │ └── interpolate.cpp
│ └── CMakeLists.txt
├── test
│ ├── CMakeLists.txt
│ └── test-interpolate.cpp
└── CMakeLists.txt
poly
├── src
│ ├── include
│ │ └── poly
│ │ ├── interpolate.hpp
│ │ └── poly.hpp
│ ├── src
│ │ └── interpolate.cpp
│ └── CMakeLists.txt
├── test
│ ├── CMakeLists.txt
│ └── test-interpolate.cpp
└── CMakeLists.txt
# Configure
cmake -S . -B build -G "Ninja Multi-Config" -D POLY_INIT_NAN=On
# Build
cmake --build build --config Debug -j
# Run tests
cmake --build build --config Debug --target test
# Configure
cmake -S . -B build -G "Ninja Multi-Config" -D POLY_INIT_NAN=On
-- The CXX compiler identification is GNU 11.4.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found GTest: /usr/lib/x86_64-linux-gnu/cmake/GTest/GTestConfig.cmake (found version "1.11.0")
-- Configuring done (0.5s)
-- Generating done (0.0s)
-- Build files have been written to: /home/pieter/GitHub/Cpp-Presentation/code/poly/build
# Build
cmake --build build --config Debug -j
[1/4] Building CXX object test/CMakeFiles/tests.dir/Debug/test-interpolate.cpp.o
[2/4] Building CXX object src/CMakeFiles/poly.dir/Debug/src/interpolate.cpp.o
[3/4] Linking CXX static library src/Debug/libpoly.a
[4/4] Linking CXX executable test/Debug/tests
# Run tests
cmake --build build --config Debug --target test
[0/1] Running tests...
Test project /home/pieter/GitHub/Cpp-Presentation/code/poly/build
Start 1: poly.interpolateCheby
1/1 Test #1: poly.interpolateCheby ............ Passed 0.00 sec
100% tests passed, 0 tests failed out of 1
Total Test time (real) = 0.00 sec
find_package(name)
add_library(target sources...)
add_executable(target sources...)
add_custom_target(target command args...)
target_compile_features(target SCOPE features...)
target_compile_definitions(target SCOPE definitions...)
target_compile_options(target SCOPE options...)
target_include_directories(target SCOPE directories...)
target_link_options(target SCOPE options...)
set_target_properties(targets PROPERTIES property value)
target_link_libraries(target SCOPE dependency)
PUBLIC
PRIVATE
INTERFACE
PUBLIC |
PRIVATE |
INTERFACE |
|
---|---|---|---|
liba |
-flag |
-flag |
|
libb |
-flag |
-flag |
poly
example from earlier:
PRIVATE
# Interface libraries have no source files, only compiler flags etc.
add_library(warnings INTERFACE)
# Add compiler warnings for GCC
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
target_compile_options(warnings INTERFACE "-Wall" "-Wextra" "-pedantic")
endif()
# Create an actual library target
add_library(poly "src/interpolate.cpp" ...)
# Apply warnings only when building poly, not when building dependents
target_link_libraries(poly PRIVATE warnings)
# This could be a user program that uses the poly library
add_executable(user_program "main.cpp")
# Compiled without warnings, thanks to private link between poly and warnings
target_link_libraries(user_program PRIVATE poly)
add_subdirectory
)
conanfile.txt
or conanfile.py
fileCMakeDeps
generator to make packages available using
find_package
CMakeToolchain
generator to pass options to CMake using a toolchain
file
poly
├── src
│ ├── include
│ │ └── poly
│ │ ├── interpolate.hpp
│ │ └── poly.hpp
│ ├── src
│ │ └── interpolate.cpp
│ └── CMakeLists.txt
├── test
│ ├── CMakeLists.txt
│ └── test-interpolate.cpp
├── conanfile.txt
└── CMakeLists.txt
[requires]
eigen/3.4.0
[test_requires]
gtest/1.12.1
[generators]
CMakeDeps
CMakeToolchain
[layout]
cmake_layout
conan profile detect --force
poly
project
conan install . # Default generator and default build type
conan install . \
-c tools.cmake.cmaketoolchain:generator="Ninja" \
-s build_type=Debug \
--build=missing
cmake --preset conan-debug # Configure
cmake --build --preset conan-debug # Build
ctest --preset conan-debug # Run tests
cmake --preset conan-debug # Configure
Preset CMake variables:
CMAKE_BUILD_TYPE="Debug"
CMAKE_POLICY_DEFAULT_CMP0091="NEW"
CMAKE_TOOLCHAIN_FILE:FILEPATH="~/poly/build/Debug/generators/conan_toolchain.cmake"
-- Using Conan toolchain: ~/poly/build/Debug/generators/conan_toolchain.cmake
-- Conan toolchain: C++ Standard 17 with extensions ON
-- The CXX compiler identification is GNU 11.4.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Conan: Component target declared 'Eigen3::Eigen'
-- Conan: Component target declared 'GTest::gtest'
-- Conan: Component target declared 'GTest::gtest_main'
-- Conan: Component target declared 'GTest::gmock'
-- Conan: Component target declared 'GTest::gmock_main'
-- Conan: Target declared 'gtest::gtest'
-- Configuring done (0.3s)
-- Generating done (0.0s)
-- Build files have been written to: ~/poly/build/Debug
cmake --build --preset conan-debug # Build
[1/4] Building CXX object test/CMakeFiles/tests.dir/Debug/test-interpolate.cpp.o
[2/4] Building CXX object src/CMakeFiles/poly.dir/Debug/src/interpolate.cpp.o
[3/4] Linking CXX static library src/Debug/libpoly.a
[4/4] Linking CXX executable test/Debug/tests
ctest --preset conan-debug # Run tests
[0/1] Running tests...
Test project ~/poly/build
Start 1: poly.interpolateCheby
1/1 Test #1: poly.interpolateCheby ............ Passed 0.00 sec
100% tests passed, 0 tests failed out of 1
Total Test time (real) = 0.00 sec
conanfile.txt
, flexible and extensible using Python
scripting in conanfile.py
vcpkg.json
manifest file, CMake scripting in
portfile.cmake
-Wall -Wextra -Wpedantic -pedantic-errors
absolute minimum/W3
absolute minimum, preferably /W4
-Werror
/WX
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wxxx"
/* code that would otherwise raise warning xxx */
#pragma GCC diagnostic pop
#pragma warning(push)
#pragma warning(disable:xxxx)
/* code that would otherwise raise warning xxxx */
#pragma warning(pop)
-Wno-error=xxx
suppresses errors for warning -Wxxx
,
-Wno-xxx
disables warning entirely-fdiagnostics-show-option
to include the warning name in the
message
/wdxxxx
disables warning with code xxxx
-D CMAKE_CXX_CLANG_TIDY='clang-tidy;--warnings-as-errors=*'
(cmake.org/cmake/help/latest/variable/CMAKE_LANG_CLANG_TIDY.html)
NOLINT(name-of-check)
comments
HeaderFilterRegex
so it also checks your header files!
poly
├── src
│ ├── include
│ │ └── poly
│ │ ├── interpolate.hpp
│ │ └── poly.hpp
│ ├── src
│ │ └── interpolate.cpp
│ └── CMakeLists.txt
├── test
│ ├── CMakeLists.txt
│ └── test-interpolate.cpp
├── .clang-tidy
├── conanfile.txt
└── CMakeLists.txt
---
WarningsAsErrors: ''
HeaderFilterRegex: '(include/poly)'
FormatStyle: file
Checks: |
*,
-abseil*,-altera*,-android*,-fuchsia*,-google*,-llvm*,-zircon*,
-modernize-use-trailing-return-type,
-*-magic-numbers,
google-build-using-namespace,
CheckOptions:
- key: readability-implicit-bool-conversion.AllowPointerConditions
value: true
-fanalyzer
option
-fsanitize=address
)
-fsanitize=undefined
)
-fsanitize=thread
)
GDB TUI
layout).gitignore
poly
├── src
│ ├── include
│ │ └── poly
│ │ ├── interpolate.hpp
│ │ └── poly.hpp
│ ├── src
│ │ └── interpolate.cpp
│ └── CMakeLists.txt
├── test
│ ├── CMakeLists.txt
│ └── test-interpolate.cpp
├── .clang-format
├── .clang-tidy
├── conanfile.txt
└── CMakeLists.txt
perf
profiles, github.com/Netflix/flamescope)
Release
mode (with optimizations enabled)-march=native
, to get SSE/AVX supportCMAKE_INTERPROCEDURAL_OPTIMIZATION=On
)Debug
mode is slow, use -Og
instead of -O0
pybind11
(github.com/pybind/pybind11)
nanobind
(github.com/wjakob/nanobind)
pandas
or scikit-learn
matplotlib
py-build-cmake
(github.com/tttapa/py-build-cmake)