# Generated by `boostdep --cmake dynamic_bitset`
# Copyright 2020 Peter Dimov
# Copyright 2025 Gennaro Prota
# Distributed under the Boost Software License, Version 1.0.
# https://www.boost.org/LICENSE_1_0.txt

cmake_minimum_required(VERSION 3.5...3.16)

project(boost_dynamic_bitset VERSION "${BOOST_SUPERPROJECT_VERSION}" LANGUAGES CXX)
set(BOOST_DYNAMIC_BITSET_IS_ROOT OFF)
if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
    set(BOOST_DYNAMIC_BITSET_IS_ROOT ON)
endif ()

add_library(boost_dynamic_bitset INTERFACE)
add_library(Boost::dynamic_bitset ALIAS boost_dynamic_bitset)

target_include_directories(boost_dynamic_bitset INTERFACE include)

if (BOOST_DYNAMIC_BITSET_IS_ROOT)
    # This means this script will be executed as the root CMakeLists.txt
    # so the Boost:: targets are not available unless we explicitly include
    # them here. MrDocs executes this script as root too.
    if (NOT DEFINED BOOST_SRC_DIR AND DEFINED ENV{BOOST_SRC_DIR})
        set(DEFAULT_BOOST_SRC_DIR "$ENV{BOOST_SRC_DIR}")
    else ()
        set(DEFAULT_BOOST_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../..")
    endif ()
    set(BOOST_SRC_DIR ${DEFAULT_BOOST_SRC_DIR} CACHE STRING "Boost source dir to use when running CMake from this directory")
    if (NOT IS_ABSOLUTE ${BOOST_SRC_DIR})
        set(BOOST_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${BOOST_SRC_DIR}")
    endif ()

    # Validate BOOST_SRC_DIR
    set(BOOST_SRC_DIR_IS_VALID ON)
    foreach (F "CMakeLists.txt" "Jamroot" "boost-build.jam" "bootstrap.sh" "libs")
        if (NOT EXISTS "${BOOST_SRC_DIR}/${F}")
            message(STATUS "${BOOST_SRC_DIR}/${F} does not exist. Fallback to find_package.")
            set(BOOST_SRC_DIR_IS_VALID OFF)
            break()
        endif ()
    endforeach ()
    if (NOT BOOST_SRC_DIR_IS_VALID)
        message(FATAL_ERROR "BOOST_SRC_DIR is not valid. Please set it to the root of a Boost checkout.")
    endif ()

    # If BOOST_SRC_DIR is valid, fallback to find_package
    set(CMAKE_FOLDER Dependencies)
    set(BOOST_INCLUDE_LIBRARIES assert config container_hash core throw_exception)
    set(BOOST_EXCLUDE_LIBRARIES dynamic_bitset)
    set(PREV_BUILD_TESTING ${BUILD_TESTING})
    set(BUILD_TESTING OFF CACHE BOOL "Build the tests." FORCE)
    add_subdirectory(${BOOST_SRC_DIR} Dependencies/boost EXCLUDE_FROM_ALL)
    set(BUILD_TESTING ${PREV_BUILD_TESTING} CACHE BOOL "Build the tests." FORCE)
    set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${BOOST_SRC_DIR}/tools/cmake/include")
    unset(CMAKE_FOLDER)
endif()

target_link_libraries(boost_dynamic_bitset
  INTERFACE
    Boost::assert
    Boost::config
    Boost::container_hash
    Boost::core
    Boost::throw_exception
)

if(BUILD_TESTING AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/test/CMakeLists.txt")

  add_subdirectory(test)

endif()

if (DYNAMIC_BITSET_MRDOCS_BUILD)
    set(INCLUDE_DIR "${CMAKE_SOURCE_DIR}/include")

    # Create a temporary source file that includes boost/dynamic_bitset.hpp.
    set(TEMP_CPP_FILE "${CMAKE_CURRENT_BINARY_DIR}/dynamic_bitset_for_mrdocs.cpp")
    file(WRITE ${TEMP_CPP_FILE} "// This file is generated automatically by CMake\n\n")
    file(APPEND ${TEMP_CPP_FILE} "#include \"boost/dynamic_bitset.hpp\"\n")

    # Create a custom target for MrDocs.
    add_library(dynamic_bitset_mrdocs_target ${TEMP_CPP_FILE})

    # This is to get the documentation of the constructor from basic_string_view.
    set_target_properties(dynamic_bitset_mrdocs_target PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED YES)

    # Set any other target properties here.
    target_include_directories(dynamic_bitset_mrdocs_target PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include")
    target_link_libraries(dynamic_bitset_mrdocs_target PRIVATE boost_dynamic_bitset)
    file(GLOB BOOST_MODULE_PATHS "$ENV{BOOST_SRC_DIR}/libs/*/include")
    target_include_directories(dynamic_bitset_mrdocs_target PRIVATE ${BOOST_MODULE_PATHS})

    # Don't create any other targets.
    return()
endif()
