From e65a0b24b38592ca915640f8f6ac4a831925b52e Mon Sep 17 00:00:00 2001 From: kevin Heifner Date: Thu, 26 Mar 2026 11:09:31 -0500 Subject: [PATCH 1/3] Fix magic_enum discovery when using CDT build directory When using a CDT build directory as CDT_ROOT (instead of a proper install prefix), magic_enum headers are not in CDT_ROOT/include but in the vcpkg_installed directory. Add vcpkg path as a fallback in find_cdt_magic_enum using VCPKG_INSTALLED_DIR and VCPKG_TARGET_TRIPLET. Also uncomment the CDT_CONTRACT_INCLUDE_PATH search path and add a diagnostic message when the contract include path is active. --- cmake/CDTMacros.cmake.in | 17 ++++++++++++----- cmake/CDTWasmToolchain.cmake.in | 1 + 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/cmake/CDTMacros.cmake.in b/cmake/CDTMacros.cmake.in index 36bb44fd0..5522b3aca 100644 --- a/cmake/CDTMacros.cmake.in +++ b/cmake/CDTMacros.cmake.in @@ -7,11 +7,18 @@ 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}" -# ) + 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}" + ) + 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}") 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 From c81cecc8c566ffce195e5f93a42f8f3fc341e92c Mon Sep 17 00:00:00 2001 From: kevin Heifner Date: Mon, 30 Mar 2026 07:36:24 -0500 Subject: [PATCH 2/3] Handle CDT_CONTRACT_INCLUDE_PATH as semicolon-delimited list Add find_in_cdt_contract_paths() helper macro that iterates over CDT_CONTRACT_INCLUDE_PATH entries to find matching directories or files, instead of treating it as a single path. --- cmake/CDTMacros.cmake.in | 100 +++++++++++++++++++++++++++------------ 1 file changed, 71 insertions(+), 29 deletions(-) diff --git a/cmake/CDTMacros.cmake.in b/cmake/CDTMacros.cmake.in index 5522b3aca..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,37 +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}" - ) - 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 ${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() From 983f2df3b73f66be4d2061a5aa3f1fb65330aba7 Mon Sep 17 00:00:00 2001 From: kevin Heifner Date: Mon, 30 Mar 2026 07:36:40 -0500 Subject: [PATCH 3/3] Forward CMAKE_PREFIX_PATH to tools ExternalProject The tools sub-build could not find vcpkg packages like protobuf because CMAKE_PREFIX_PATH was not forwarded. Also reformats the CMAKE_ARGS to one-per-line for readability. --- cmake/ToolsExternalProject.cmake | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) 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 ""