Files
agent_compositor_test/references/igraph-1.0.1/CMakeLists.txt
T
Abdelrahman Said a11edf0c53 Add graph references
2026-06-28 13:49:01 +01:00

196 lines
6.9 KiB
CMake

# Minimum CMake that we require is 3.18.
# Some of the recent features we use:
# * --ignore-eol when comparing unit test results with expected outcomes (3.14)
# * CROSSCOMPILING_EMULATOR can be a semicolon-separated list to pass arguments (3.15)
# * SKIP_REGULAR_EXPRESSION to handle skipped tests properly (3.16)
# * CheckLinkerFlag for HAVE_NEW_DTAGS test (3.18)
# * cmake -E cat (3.18)
cmake_minimum_required(VERSION 3.18...3.31)
# CMake 3.31.0 issues warnings due to the following bug:
# https://gitlab.kitware.com/cmake/cmake/-/issues/26449
# Setting policy CMP0175 to OLD avoids the warnings.
if(CMAKE_VERSION VERSION_EQUAL "3.31.0")
cmake_policy(SET CMP0175 OLD)
endif()
# Add etc/cmake to CMake's search path so we can put our private stuff there
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/etc/cmake)
# Set a default build type if none was specified
# This must precede the project() line, which would set the CMAKE_BUILD_TYPE
# to 'Debug' with single-config generators on Windows.
# Note that we must do this only if PROJECT_NAME is not set at this point. If
# it is set, it means that igraph is being used as a subproject of another
# project.
if(NOT PROJECT_NAME)
include(BuildType)
endif()
# Prevent in-source builds
include(PreventInSourceBuilds)
# Make use of ccache if it is present on the host system -- unless explicitly
# asked to disable it
include(UseCCacheWhenInstalled)
# Figure out the version number from Git
include(version)
# Declare the project, its version number and language
project(
igraph
VERSION ${PACKAGE_VERSION_BASE}
DESCRIPTION "A library for creating and manipulating graphs"
HOMEPAGE_URL https://igraph.org
LANGUAGES C CXX
)
# Include some compiler-related helpers and set global compiler options
include(compilers)
# Detect is certain attributes are supported by the compiler
include(attribute_support)
# Set default symbol visibility to hidden
set(CMAKE_C_VISIBILITY_PRESET hidden)
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
# Set C and C++ standard version
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED True)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED True)
# Expose the BUILD_SHARED_LIBS option in the ccmake UI
option(BUILD_SHARED_LIBS "Build shared libraries" OFF)
# Add switches to use sanitizers and debugging helpers if needed
include(debugging)
include(sanitizers)
# Enable fuzzer instrumentation if needed
# FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION is a conventional
# macro used to adapt code for fuzzability, for example by
# reducing largest allowed graph sizes when reading various
# file formats.
if(BUILD_FUZZING)
add_compile_options(-fsanitize=fuzzer-no-link)
add_compile_definitions(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
endif()
# Add version information
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/include/igraph_version.h.in
${CMAKE_CURRENT_BINARY_DIR}/include/igraph_version.h
)
# Create configuration options for optional features
include(features)
# Handle dependencies and dependency-related configuration options
include(dependencies)
find_dependencies()
# Run compile-time checks, generate config.h and igraph_threading.h
include(CheckSymbolExists)
include(CheckIncludeFiles)
include(CMakePushCheckState)
# First we check for some functions and symbols
cmake_push_check_state()
if(NEED_LINKING_AGAINST_LIBM)
list(APPEND CMAKE_REQUIRED_LIBRARIES m)
endif()
check_symbol_exists(strcasecmp strings.h HAVE_STRCASECMP)
check_symbol_exists(strncasecmp strings.h HAVE_STRNCASECMP)
check_symbol_exists(_stricmp string.h HAVE__STRICMP)
check_symbol_exists(_strnicmp string.h HAVE__STRNICMP)
check_symbol_exists(strdup string.h HAVE_STRDUP)
check_symbol_exists(strndup string.h HAVE_STRNDUP)
check_include_files(xlocale.h HAVE_XLOCALE)
if(HAVE_XLOCALE)
# On BSD, uselocale() is in xlocale.h instead of locale.h.
# Some systems provide xlocale.h, but uselocale() is still in locale.h,
# thus we try both.
check_symbol_exists(uselocale "xlocale.h;locale.h" HAVE_USELOCALE)
else()
check_symbol_exists(uselocale locale.h HAVE_USELOCALE)
endif()
check_symbol_exists(_configthreadlocale locale.h HAVE__CONFIGTHREADLOCALE)
cmake_pop_check_state()
# Check for 128-bit integer multiplication support, floating-point endianness,
# support for built-in overflow detection and fast bit operation support.
include(ieee754_endianness)
include(uint128_support)
include(bit_operations_support)
include(safe_math_support)
if(NOT HAVE_USELOCALE AND NOT HAVE__CONFIGTHREADLOCALE)
message(WARNING "igraph cannot set per-thread locale on this platform. igraph_enter_safelocale() and igraph_exit_safelocale() will not be safe to use in multithreaded programs.")
endif()
# Check for code coverage support
option(IGRAPH_ENABLE_CODE_COVERAGE "Enable code coverage calculation" OFF)
if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME AND IGRAPH_ENABLE_CODE_COVERAGE)
include(CodeCoverage)
append_coverage_compiler_flags()
setup_target_for_coverage_lcov(
NAME coverage
EXECUTABLE "${CMAKE_COMMAND}" "--build" "${PROJECT_BINARY_DIR}" "--target" "check"
# The base directory is changed to allow finding the generated parser sources.
# The following works with 'Ninja'. For 'Unix Makefiles', this requires ${PROJECT_BINARY_DIR}/src.
BASE_DIRECTORY "${PROJECT_BINARY_DIR}"
# /Applications and /Library/Developer are for macOS -- they exclude files from the macOS SDK.
EXCLUDE "/Applications/Xcode*" "/Library/Developer/*" "examples/*" "interfaces/*" "tests/*" "vendor/infomap/*" "vendor/pcg/*"
# These errors, present with lcov 2.x, are likely due to incompatibility with llvm-cov on macOS.
LCOV_ARGS --ignore-errors inconsistent,format,unused
GENHTML_ARGS --ignore-errors inconsistent,corrupt,category,unmapped
)
endif()
# Generate configuration headers
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/src/config.h.in
${CMAKE_CURRENT_BINARY_DIR}/src/config.h
)
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/include/igraph_config.h.in
${CMAKE_CURRENT_BINARY_DIR}/include/igraph_config.h
)
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/include/igraph_threading.h.in
${CMAKE_CURRENT_BINARY_DIR}/include/igraph_threading.h
)
# Enable unit tests. Behave nicely and do this only if we are not being
# included as a sub-project in another CMake project
if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
include(CTest)
endif()
# Traverse subdirectories. vendor/ should come first because code in
# src/CMakeLists.txt depends on targets in vendor/
add_subdirectory(vendor)
add_subdirectory(src)
add_subdirectory(interfaces)
if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME AND BUILD_TESTING)
add_subdirectory(tests)
endif()
if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME AND BUILD_FUZZING)
add_subdirectory(fuzzing)
endif()
if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
add_subdirectory(doc)
endif()
# Configure packaging -- only if igraph is the top-level project and not a
# subproject
if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
include(packaging)
endif()
# Show result of configuration
include(summary)