# EnTT cmake_minimum_required(VERSION 3.15.7) # Read project version set(ENTT_VERSION_REGEX "#define ENTT_VERSION_.*[ \t]+(.+)") file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/src/entt/config/version.h" ENTT_VERSION REGEX ${ENTT_VERSION_REGEX}) list(TRANSFORM ENTT_VERSION REPLACE ${ENTT_VERSION_REGEX} "\\1") string(JOIN "." ENTT_VERSION ${ENTT_VERSION}) # Project configuration project( EnTT VERSION ${ENTT_VERSION} DESCRIPTION "Gaming meets modern C++ - a fast and reliable entity-component system (ECS) and much more" HOMEPAGE_URL "https://github.com/skypjack/entt" LANGUAGES C CXX ) if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Debug) endif() message(VERBOSE "*") message(VERBOSE "* ${PROJECT_NAME} v${PROJECT_VERSION} (${CMAKE_BUILD_TYPE})") message(VERBOSE "* Copyright (c) 2017-2025 Michele Caini ") message(VERBOSE "*") # CMake stuff list(INSERT CMAKE_MODULE_PATH 0 ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules) # Compiler stuff option(ENTT_USE_LIBCPP "Use libc++ by adding -stdlib=libc++ flag if available." OFF) option(ENTT_USE_SANITIZER "Enable sanitizers by adding -fsanitize=address -fno-omit-frame-pointer -fsanitize=undefined flags if available." OFF) option(ENTT_USE_CLANG_TIDY "Enable static analysis with clang-tidy" OFF) if(ENTT_USE_LIBCPP) if(NOT WIN32) include(CheckCXXSourceCompiles) include(CMakePushCheckState) cmake_push_check_state() set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -stdlib=libc++") check_cxx_source_compiles(" #include int main() { return std::is_same_v; } " ENTT_HAS_LIBCPP) cmake_pop_check_state() endif() if(NOT ENTT_HAS_LIBCPP) message(VERBOSE "The option ENTT_USE_LIBCPP is set but libc++ is not available.") endif() endif() if(ENTT_USE_SANITIZER) if(CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU") set(ENTT_HAS_SANITIZER TRUE CACHE BOOL "" FORCE) mark_as_advanced(ENTT_HAS_SANITIZER) endif() if(NOT ENTT_HAS_SANITIZER) message(VERBOSE "The option ENTT_USE_SANITIZER is set but sanitizer support is not available.") endif() endif() if(ENTT_USE_CLANG_TIDY) find_program(ENTT_CLANG_TIDY_EXECUTABLE "clang-tidy") if(NOT ENTT_CLANG_TIDY_EXECUTABLE) message(VERBOSE "The option ENTT_USE_CLANG_TIDY is set but clang-tidy executable is not available.") endif() endif() # Add EnTT target include(GNUInstallDirs) add_library(EnTT INTERFACE) add_library(EnTT::EnTT ALIAS EnTT) target_include_directories( EnTT INTERFACE $ $ ) target_compile_features(EnTT INTERFACE cxx_std_17) if(ENTT_HAS_LIBCPP) target_compile_options(EnTT BEFORE INTERFACE -stdlib=libc++) endif() if(ENTT_HAS_SANITIZER) target_compile_options(EnTT INTERFACE $<$:-fsanitize=address -fno-omit-frame-pointer -fsanitize=undefined>) target_link_libraries(EnTT INTERFACE $<$:-fsanitize=address -fno-omit-frame-pointer -fsanitize=undefined>) endif() if(ENTT_CLANG_TIDY_EXECUTABLE) set(CMAKE_CXX_CLANG_TIDY "${ENTT_CLANG_TIDY_EXECUTABLE};--config-file=${EnTT_SOURCE_DIR}/.clang-tidy;--header-filter=${EnTT_SOURCE_DIR}/src/entt/.*") endif() # Add EnTT goodies option(ENTT_INCLUDE_HEADERS "Add all EnTT headers to the EnTT target." OFF) option(ENTT_INCLUDE_NATVIS "Add EnTT natvis files to the EnTT target." OFF) if(ENTT_INCLUDE_HEADERS) set( HEADERS_FILES config/config.h config/macro.h config/version.h container/dense_map.hpp container/dense_set.hpp container/table.hpp container/fwd.hpp core/algorithm.hpp core/any.hpp core/attribute.h core/bit.hpp core/compressed_pair.hpp core/enum.hpp core/family.hpp core/fwd.hpp core/hashed_string.hpp core/ident.hpp core/iterator.hpp core/memory.hpp core/monostate.hpp core/ranges.hpp core/tuple.hpp core/type_info.hpp core/type_traits.hpp core/utility.hpp entity/component.hpp entity/entity.hpp entity/fwd.hpp entity/group.hpp entity/handle.hpp entity/mixin.hpp entity/helper.hpp entity/organizer.hpp entity/ranges.hpp entity/registry.hpp entity/runtime_view.hpp entity/snapshot.hpp entity/sparse_set.hpp entity/storage.hpp entity/view.hpp graph/adjacency_matrix.hpp graph/dot.hpp graph/flow.hpp graph/fwd.hpp locator/locator.hpp meta/adl_pointer.hpp meta/container.hpp meta/context.hpp meta/factory.hpp meta/fwd.hpp meta/meta.hpp meta/node.hpp meta/pointer.hpp meta/policy.hpp meta/range.hpp meta/resolve.hpp meta/template.hpp meta/type_traits.hpp meta/utility.hpp poly/fwd.hpp poly/poly.hpp process/fwd.hpp process/process.hpp process/scheduler.hpp resource/cache.hpp resource/fwd.hpp resource/loader.hpp resource/resource.hpp signal/delegate.hpp signal/dispatcher.hpp signal/emitter.hpp signal/fwd.hpp signal/sigh.hpp tools/davey.hpp entt.hpp fwd.hpp tools.hpp ) list(TRANSFORM HEADERS_FILES APPEND ">" OUTPUT_VARIABLE HEADERS_BUILD_INTERFACE) list(TRANSFORM HEADERS_BUILD_INTERFACE PREPEND "$" OUTPUT_VARIABLE HEADERS_INSTALL_INTERFACE) list(TRANSFORM HEADERS_INSTALL_INTERFACE PREPEND "$" OUTPUT_VARIABLE NATVIS_BUILD_INTERFACE) list(TRANSFORM NATVIS_BUILD_INTERFACE PREPEND "$" OUTPUT_VARIABLE NATVIS_INSTALL_INTERFACE) list(TRANSFORM NATVIS_INSTALL_INTERFACE PREPEND "$