diff --git a/cmake/CDTMacros.cmake.in b/cmake/CDTMacros.cmake.in index 36bb44fd0..11ab467ee 100644 --- a/cmake/CDTMacros.cmake.in +++ b/cmake/CDTMacros.cmake.in @@ -1,4 +1,42 @@ +# Search CDT_CONTRACT_INCLUDE_PATH (semicolon-delimited list) for a matching +# directory or file suffix. +# +# Usage: +# find_in_cdt_contract_paths(_result MATCH magic_enum DIRECTORY) +# find_in_cdt_contract_paths(_result MATCH magic_enum/magic_enum.hpp FILE +# MATCH_VAR_FULL _full_path) +# +# Sets to the matching base path, or empty string if not found. +# MATCH_VAR_FULL optionally receives the full path including the suffix. +macro(find_in_cdt_contract_paths _out_var) + cmake_parse_arguments(_FICCP "" "MATCH;MATCH_VAR_FULL" "" ${ARGN}) + # Remaining unparsed args: first is DIRECTORY or FILE + list(GET _FICCP_UNPARSED_ARGUMENTS 0 _ficcp_mode) + + set(${_out_var} "") + if(_FICCP_MATCH_VAR_FULL) + set(${_FICCP_MATCH_VAR_FULL} "") + endif() + + foreach(_ficcp_dir IN LISTS CDT_CONTRACT_INCLUDE_PATH) + set(_ficcp_candidate "${_ficcp_dir}/${_FICCP_MATCH}") + if("${_ficcp_mode}" STREQUAL "DIRECTORY" AND IS_DIRECTORY "${_ficcp_candidate}") + set(${_out_var} "${_ficcp_dir}") + if(_FICCP_MATCH_VAR_FULL) + set(${_FICCP_MATCH_VAR_FULL} "${_ficcp_candidate}") + endif() + break() + elseif("${_ficcp_mode}" STREQUAL "FILE" AND EXISTS "${_ficcp_candidate}") + set(${_out_var} "${_ficcp_dir}") + if(_FICCP_MATCH_VAR_FULL) + set(${_FICCP_MATCH_VAR_FULL} "${_ficcp_candidate}") + endif() + break() + endif() + endforeach() +endmacro() + macro(find_cdt_magic_enum) if(NOT TARGET magic_enum::magic_enum) if(IS_DIRECTORY "${CDT_ROOT}/include/magic_enum") @@ -7,30 +45,41 @@ macro(find_cdt_magic_enum) INTERFACE_INCLUDE_DIRECTORIES "${CDT_ROOT}/include" ) -# elseif(IS_DIRECTORY "${CDT_CONTRACT_INCLUDE_PATH}/magic_enum") -# add_library(magic_enum::magic_enum INTERFACE IMPORTED) -# set_target_properties(magic_enum::magic_enum PROPERTIES -# INTERFACE_INCLUDE_DIRECTORIES "${CDT_CONTRACT_INCLUDE_PATH}" -# ) else() - get_property(all_includes DIRECTORY PROPERTY INCLUDE_DIRECTORIES) - message(STATUS "Searching for magic_enum in include directories: ${all_includes}") - foreach(dir IN LISTS all_includes) - file(GLOB_RECURSE matches "${dir}/magic_enum/*.hpp") - if(matches) - message(NOTICE "Found ${HEADER_TO_FIND} in: ${matches}") - add_library(magic_enum::magic_enum INTERFACE IMPORTED) - set_target_properties(magic_enum::magic_enum PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${dir}" - ) - break() + find_in_cdt_contract_paths(_magic_enum_inc MATCH magic_enum DIRECTORY) + if(_magic_enum_inc) + add_library(magic_enum::magic_enum INTERFACE IMPORTED) + set_target_properties(magic_enum::magic_enum PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${_magic_enum_inc}" + ) + + elseif(VCPKG_INSTALLED_DIR AND VCPKG_TARGET_TRIPLET AND IS_DIRECTORY "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include/magic_enum") + set(_vcpkg_include "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include") + message(NOTICE "Using vcpkg magic_enum include directory: ${_vcpkg_include}") + add_library(magic_enum::magic_enum INTERFACE IMPORTED) + set_target_properties(magic_enum::magic_enum PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${_vcpkg_include}" + ) + else() + get_property(all_includes DIRECTORY PROPERTY INCLUDE_DIRECTORIES) + message(STATUS "Searching for magic_enum in include directories: ${all_includes}") + foreach(dir IN LISTS all_includes) + file(GLOB_RECURSE matches "${dir}/magic_enum/*.hpp") + if(matches) + message(NOTICE "Found magic_enum in: ${matches}") + add_library(magic_enum::magic_enum INTERFACE IMPORTED) + set_target_properties(magic_enum::magic_enum PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${dir}" + ) + break() + endif() + endforeach() + + if(NOT TARGET magic_enum::magic_enum) + message(FATAL_ERROR "magic_enum library not found. Please ensure it is installed and available in either + ${CDT_ROOT}/include + ${CDT_CONTRACT_INCLUDE_PATH}") endif() - endforeach() - - if(NOT TARGET magic_enum::magic_enum) - message(FATAL_ERROR "magic_enum library not found. Please ensure it is installed and available in either - ${CDT_ROOT}/include - ${CDT_CONTRACT_INCLUDE_PATH}") endif() endif() endif() diff --git a/cmake/CDTWasmToolchain.cmake.in b/cmake/CDTWasmToolchain.cmake.in index 6d4511144..c8b5e79ae 100644 --- a/cmake/CDTWasmToolchain.cmake.in +++ b/cmake/CDTWasmToolchain.cmake.in @@ -40,5 +40,6 @@ set(CMAKE_OSX_DEPLOYMENT_TARGET="") # ADD ANY PROVIDED INCLUDE DIRECTORIES # `-DCDT_CONTRACT_INCLUDE_PATH=` if(IS_DIRECTORY ${CDT_CONTRACT_INCLUDE_PATH}) + message(NOTICE "Adding CDT contract include path: ${CDT_CONTRACT_INCLUDE_PATH}") include_directories(BEFORE ${CDT_CONTRACT_INCLUDE_PATH}) endif() \ No newline at end of file diff --git a/cmake/ToolsExternalProject.cmake b/cmake/ToolsExternalProject.cmake index 94da766ac..dd2335401 100644 --- a/cmake/ToolsExternalProject.cmake +++ b/cmake/ToolsExternalProject.cmake @@ -15,8 +15,24 @@ endif() ExternalProject_Add( CDTTools - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} -DVERSION_FULL=${VERSION_FULL} -DCMAKE_INSTALL_BINDIR=${CMAKE_INSTALL_BINDIR} -DVERSION_MAJOR=${VERSION_MAJOR} -DVERSION_MINOR=${VERSION_MINOR} -DVERSION_PATCH=${VERSION_PATCH} -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} -DVCPKG_INSTALLED_DIR=${CMAKE_BINARY_DIR}/vcpkg_installed -DCDT_INSTALL_PREFIX=${CDT_INSTALL_PREFIX} -DLLVM_DIR=${LLVM_DIR} -DClang_DIR=${Clang_DIR} -DCMAKE_EXPORT_COMPILE_COMMANDS=ON - + CMAKE_ARGS + -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} + -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} + -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} + -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} + -DCMAKE_PREFIX_PATH=${_vcpkg_share}/.. + -DCMAKE_INSTALL_BINDIR=${CMAKE_INSTALL_BINDIR} + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON + -DVCPKG_INSTALLED_DIR=${CMAKE_BINARY_DIR}/vcpkg_installed + -DCDT_INSTALL_PREFIX=${CDT_INSTALL_PREFIX} + -DLLVM_DIR=${LLVM_DIR} + -DClang_DIR=${Clang_DIR} + -DVERSION_FULL=${VERSION_FULL} + -DVERSION_MAJOR=${VERSION_MAJOR} + -DVERSION_MINOR=${VERSION_MINOR} + -DVERSION_PATCH=${VERSION_PATCH} SOURCE_DIR "${CMAKE_SOURCE_DIR}/tools" BINARY_DIR "${CMAKE_BINARY_DIR}/tools" UPDATE_COMMAND ""