|
| 1 | +cmake_minimum_required(VERSION 3.23) |
| 2 | +project(netgraph_core LANGUAGES CXX) |
| 3 | +# Optional C++ tests |
| 4 | +option(NETGRAPH_CORE_BUILD_TESTS "Build C++ unit tests" OFF) |
| 5 | +if(NETGRAPH_CORE_BUILD_TESTS) |
| 6 | + include(FetchContent) |
| 7 | + FetchContent_Declare( |
| 8 | + googletest |
| 9 | + URL https://github.com/google/googletest/archive/refs/tags/v1.14.0.zip |
| 10 | + DOWNLOAD_EXTRACT_TIMESTAMP TRUE |
| 11 | + ) |
| 12 | + FetchContent_MakeAvailable(googletest) |
| 13 | + enable_testing() |
| 14 | + add_executable(netgraph_core_tests tests/cpp/smoke_test.cpp) |
| 15 | + target_link_libraries(netgraph_core_tests PRIVATE netgraph_core GTest::gtest_main) |
| 16 | + if(NETGRAPH_CORE_COVERAGE AND (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")) |
| 17 | + target_compile_options(netgraph_core_tests PRIVATE -O0 -g --coverage) |
| 18 | + target_link_options(netgraph_core_tests PRIVATE --coverage) |
| 19 | + endif() |
| 20 | + include(GoogleTest) |
| 21 | + gtest_discover_tests(netgraph_core_tests) |
| 22 | +endif() |
| 23 | + |
| 24 | +set(CMAKE_CXX_STANDARD 20) |
| 25 | +set(CMAKE_CXX_STANDARD_REQUIRED ON) |
| 26 | +set(CMAKE_CXX_EXTENSIONS OFF) |
| 27 | +set(CMAKE_POSITION_INDEPENDENT_CODE ON) |
| 28 | + |
| 29 | +# Dependencies |
| 30 | +find_package(pybind11 CONFIG QUIET) |
| 31 | +if(NOT pybind11_FOUND) |
| 32 | + message(STATUS "pybind11 not found via config; using FetchContent") |
| 33 | + include(FetchContent) |
| 34 | + FetchContent_Declare( |
| 35 | + pybind11 |
| 36 | + GIT_REPOSITORY https://github.com/pybind/pybind11.git |
| 37 | + GIT_TAG v2.12.0 |
| 38 | + DOWNLOAD_EXTRACT_TIMESTAMP TRUE |
| 39 | + ) |
| 40 | + FetchContent_MakeAvailable(pybind11) |
| 41 | +endif() |
| 42 | + |
| 43 | +add_library(netgraph_core STATIC |
| 44 | + src/strict_multidigraph.cpp |
| 45 | + src/shortest_paths.cpp |
| 46 | + src/k_shortest_paths.cpp |
| 47 | + src/max_flow.cpp |
| 48 | + src/cpu_backend.cpp |
| 49 | +) |
| 50 | +target_include_directories(netgraph_core PUBLIC |
| 51 | + $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> |
| 52 | + $<INSTALL_INTERFACE:include> |
| 53 | +) |
| 54 | +target_compile_definitions(netgraph_core PRIVATE _USE_MATH_DEFINES) |
| 55 | +## C++ standard is set globally above. |
| 56 | +target_compile_features(netgraph_core PUBLIC cxx_std_20) |
| 57 | + |
| 58 | +# Warnings |
| 59 | +if(MSVC) |
| 60 | + target_compile_options(netgraph_core PRIVATE /W4 /permissive-) |
| 61 | +else() |
| 62 | + target_compile_options(netgraph_core PRIVATE -Wall -Wextra -Wpedantic) |
| 63 | +endif() |
| 64 | + |
| 65 | +# Python extension |
| 66 | +pybind11_add_module(_netgraph_core bindings/python/module.cpp) |
| 67 | +target_link_libraries(_netgraph_core PRIVATE netgraph_core) |
| 68 | +target_compile_features(_netgraph_core PRIVATE cxx_std_20) |
| 69 | + |
| 70 | +# Optional coverage instrumentation for GCC/Clang |
| 71 | +option(NETGRAPH_CORE_COVERAGE "Enable C++ coverage instrumentation" OFF) |
| 72 | +if(NETGRAPH_CORE_COVERAGE) |
| 73 | + message(STATUS "Enabling coverage instrumentation for C++ targets") |
| 74 | + if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") |
| 75 | + foreach(tgt netgraph_core _netgraph_core) |
| 76 | + # Use no optimizations and include debug info for accurate line mapping |
| 77 | + target_compile_options(${tgt} PRIVATE -O0 -g --coverage) |
| 78 | + # Link coverage runtime |
| 79 | + target_link_options(${tgt} PRIVATE --coverage) |
| 80 | + endforeach() |
| 81 | + else() |
| 82 | + message(WARNING "NETGRAPH_CORE_COVERAGE is set but compiler '${CMAKE_CXX_COMPILER_ID}' is not supported") |
| 83 | + endif() |
| 84 | +endif() |
| 85 | + |
| 86 | +# Optional sanitizers for debug testing |
| 87 | +option(NETGRAPH_CORE_SANITIZE "Enable Address/Undefined sanitizers" OFF) |
| 88 | +if(NETGRAPH_CORE_SANITIZE) |
| 89 | + if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") |
| 90 | + set(SAN_FLAGS "-fsanitize=address,undefined -fno-omit-frame-pointer") |
| 91 | + foreach(tgt netgraph_core _netgraph_core) |
| 92 | + target_compile_options(${tgt} PRIVATE ${SAN_FLAGS}) |
| 93 | + target_link_options(${tgt} PRIVATE ${SAN_FLAGS}) |
| 94 | + endforeach() |
| 95 | + else() |
| 96 | + message(WARNING "NETGRAPH_CORE_SANITIZE is set but compiler '${CMAKE_CXX_COMPILER_ID}' is not supported") |
| 97 | + endif() |
| 98 | +endif() |
| 99 | + |
| 100 | +# Install |
| 101 | +install(TARGETS _netgraph_core |
| 102 | + LIBRARY DESTINATION . |
| 103 | + RUNTIME DESTINATION . |
| 104 | +) |
0 commit comments