diff --git a/.gitignore b/.gitignore index 758d6ea7b..acbd44325 100644 --- a/.gitignore +++ b/.gitignore @@ -54,3 +54,4 @@ __pycache__/ .ccls-cache/ tmp/ +/.env diff --git a/CMakeLists.txt b/CMakeLists.txt index b14b31a22..10e88c924 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -71,7 +71,7 @@ configure_file(${CMAKE_SOURCE_DIR}/cmake/cdt-config.cmake.in ${CMAKE_BINARY_DIR} # Find zpp_bits header (from vcpkg) for contract compilation find_path(ZPP_BITS_INCLUDE_DIR zpp_bits.h - HINTS ${CMAKE_PREFIX_PATH}/include ${VCPKG_INSTALLED_DIR}/x64-linux/include + HINTS ${CMAKE_PREFIX_PATH}/include ${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include REQUIRED) diff --git a/cmake/CDTMacros.cmake.in b/cmake/CDTMacros.cmake.in index 8723825a2..36bb44fd0 100644 --- a/cmake/CDTMacros.cmake.in +++ b/cmake/CDTMacros.cmake.in @@ -1,6 +1,45 @@ + +macro(find_cdt_magic_enum) + if(NOT TARGET magic_enum::magic_enum) + if(IS_DIRECTORY "${CDT_ROOT}/include/magic_enum") + add_library(magic_enum::magic_enum INTERFACE IMPORTED) + set_target_properties(magic_enum::magic_enum PROPERTIES + 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() + 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() +endmacro() + # Sets the include directories for a CDT target # @param TARGET The target to set include directories for macro(set_cdt_include_directories TARGET) + find_cdt_magic_enum() target_include_directories(${TARGET} PUBLIC ${CDT_ROOT}/include/sysiolib/capi ${CDT_ROOT}/include/sysiolib/core @@ -16,6 +55,7 @@ endmacro() # @param TARGET The target name # @param ARGN Additional source files macro(add_contract CONTRACT_NAME TARGET) + find_cdt_magic_enum() if(CMAKE_SYSTEM_PROCESSOR MATCHES "wasm") add_executable(${TARGET} ${ARGN}) get_target_property(BINOUTPUT ${TARGET} BINARY_DIR) @@ -27,6 +67,7 @@ macro(add_contract CONTRACT_NAME TARGET) if(contracts) set_source_files_properties(${ARGN} PROPERTIES OBJECT_DEPENDS ${contracts}) endif() + set_cdt_include_directories(${TARGET}) else() add_executable(${TARGET} ${ARGN}) set_target_properties(${TARGET} PROPERTIES EXCLUDE_FROM_ALL TRUE) @@ -219,50 +260,77 @@ endmacro() function(target_add_protobuf TARGET) cmake_parse_arguments(ADD_PROTOBUF "" "INPUT_DIRECTORY;OUTPUT_DIRECTORY" "FILES" ${ARGN}) - if (ADD_PROTOBUF_OUTPUT_DIRECTORY AND IS_ABSOLUTE ${ADD_PROTOBUF_OUTPUT_DIRECTORY}) + if(ADD_PROTOBUF_OUTPUT_DIRECTORY AND IS_ABSOLUTE ${ADD_PROTOBUF_OUTPUT_DIRECTORY}) message(FATAL_ERROR "The OUTPUT_DIRECTORY for function target_add_protobuf must be a relative directory") endif() - if (ADD_PROTOBUF_OUTPUT_DIRECTORY) - set(OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/${ADD_PROTOBUF_OUTPUT_DIRECTORY}) + if(ADD_PROTOBUF_OUTPUT_DIRECTORY) + set(OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/${ADD_PROTOBUF_OUTPUT_DIRECTORY}) else() - set(OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}) + set(OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}) endif() - foreach (protofile ${ADD_PROTOBUF_FILES}) + foreach(protofile ${ADD_PROTOBUF_FILES}) if(IS_ABSOLUTE ${protofile}) message(FATAL_ERROR "The FILES parameters for function target_add_protobuf must be relative paths, illegal path `${protofile}`") endif() cmake_path(GET protofile EXTENSION LAST_ONLY proto_ext) - if (NOT proto_ext STREQUAL ".proto") + if(NOT proto_ext STREQUAL ".proto") message(FATAL_ERROR "The illegal parameter `${protofile}` for function target_add_protobuf") endif() cmake_path(REPLACE_EXTENSION protofile LAST_ONLY ".pb.hpp" OUTPUT_VARIABLE hdr) list(APPEND OUTPUT_HDRS ${OUTPUT_DIR}/${hdr}) - if (ADD_PROTOBUF_INPUT_DIRECTORY) + if(ADD_PROTOBUF_INPUT_DIRECTORY) list(APPEND INPUT_FILES ${ADD_PROTOBUF_INPUT_DIRECTORY}/${protofile}) else() list(APPEND INPUT_FILES ${CMAKE_CURRENT_SOURCE_DIR}/${protofile}) endif() endforeach() - if (NOT ADD_PROTOBUF_INPUT_DIRECTORY) + if(NOT ADD_PROTOBUF_INPUT_DIRECTORY) set(ADD_PROTOBUF_INPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) endif() - find_program(PROTOC cdt-protoc - HINTS ${CMAKE_FIND_ROOT_PATH}/bin - REQUIRED) + # CREATE IMPORTED TARGETS FOR CDT'S PROTOC AND PROTOC-GEN-ZPP TO USE IN THE CUSTOM COMMAND + if(NOT TARGET cdt::protoc) + find_program(PROTOC cdt-protoc + HINTS ${CMAKE_FIND_ROOT_PATH}/bin + REQUIRED) - if (CMAKE_GENERATOR STREQUAL "Unix Makefiles" AND NOT EXISTS ${OUTPUT_DIR}) + add_executable(cdt::protoc IMPORTED) + set_target_properties(cdt::protoc PROPERTIES + IMPORTED_LOCATION "${PROTOC}" + ) + endif() + + if(NOT TARGET cdt::protoc-gen-zpp) + find_program(PROTOC_ZPP_PLUGIN cdt-protoc-gen-zpp + HINTS ${CMAKE_FIND_ROOT_PATH}/bin + REQUIRED) + + add_executable(cdt::protoc-gen-zpp IMPORTED) + set_target_properties(cdt::protoc-gen-zpp PROPERTIES + IMPORTED_LOCATION "${PROTOC_ZPP_PLUGIN}" + ) + endif() + + # IF MAKEFILES GENERATOR IS USED, ENSURE OUTPUT DIRECTORY EXISTS BEFORE RUNNING CUSTOM COMMAND + if(CMAKE_GENERATOR STREQUAL "Unix Makefiles" AND NOT EXISTS ${OUTPUT_DIR}) file(MAKE_DIRECTORY ${OUTPUT_DIR}) endif() + # GENERATE PROTOBUF HEADERS WITH CUSTOM COMMAND add_custom_command( COMMENT "Generating ${OUTPUT_HDRS} from ${INPUT_FILES}" OUTPUT ${OUTPUT_HDRS} - COMMAND ${PROTOC} -I ${ADD_PROTOBUF_INPUT_DIRECTORY} -I ${CMAKE_FIND_ROOT_PATH}/include --plugin=protoc-gen-zpp=${CMAKE_FIND_ROOT_PATH}/bin/cdt-protoc-gen-zpp --zpp_out ${OUTPUT_DIR} ${ADD_PROTOBUF_FILES} - DEPENDS ${CMAKE_FIND_ROOT_PATH}/bin/cdt-protoc-gen-zpp ${INPUT_FILES} + COMMAND cdt::protoc + -I ${ADD_PROTOBUF_INPUT_DIRECTORY} + -I ${CMAKE_FIND_ROOT_PATH}/include + --plugin=protoc-gen-zpp=$ + --zpp_out + ${OUTPUT_DIR} + ${ADD_PROTOBUF_FILES} + DEPENDS cdt::protoc-gen-zpp ${INPUT_FILES} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) @@ -271,9 +339,10 @@ function(target_add_protobuf TARGET) ) get_target_property(type ${TARGET} TYPE) - if ("${type}" STREQUAL "INTERFACE_LIBRARY") + if("${type}" STREQUAL "INTERFACE_LIBRARY") target_sources(${TARGET} INTERFACE ${OUTPUT_HDRS}) target_include_directories(${TARGET} INTERFACE ${CMAKE_CURRENT_BINARY_DIR}) + target_link_libraries(${TARGET} INTERFACE magic_enum::magic_enum) else() target_sources(${TARGET} PRIVATE ${OUTPUT_HDRS}) target_include_directories(${TARGET} PUBLIC ${CMAKE_CURRENT_BINARY_DIR}) @@ -290,6 +359,11 @@ endfunction() # contract_use_protobuf(contract_target protobuf_target) # function(contract_use_protobuf CONTRACT_TARGET PROTOBUF_TARGET) + find_cdt_magic_enum() + target_link_libraries(${CONTRACT_TARGET} + INTERFACE + magic_enum::magic_enum + ) get_target_property(PROTO_DIR ${PROTOBUF_TARGET} PROTOBUF_DIR) get_target_property(PROTO_FILES ${PROTOBUF_TARGET} PROTOBUF_FILES) set_target_properties(${CONTRACT_TARGET} PROPERTIES @@ -298,11 +372,11 @@ function(contract_use_protobuf CONTRACT_TARGET PROTOBUF_TARGET) ) # Propagate include directories from protobuf target for generated headers get_target_property(PROTO_INCLUDES ${PROTOBUF_TARGET} INTERFACE_INCLUDE_DIRECTORIES) - if (PROTO_INCLUDES) + if(PROTO_INCLUDES) target_include_directories(${CONTRACT_TARGET} PUBLIC ${PROTO_INCLUDES}) endif() # Ensure protobuf headers are generated before the contract is compiled - if (TARGET ${PROTOBUF_TARGET}.protos) + if(TARGET ${PROTOBUF_TARGET}.protos) add_dependencies(${CONTRACT_TARGET} ${PROTOBUF_TARGET}.protos) endif() # Pass protobuf info to cdt-codegen via compile options (picked up by cdt-cpp) diff --git a/cmake/InstallCDT.cmake b/cmake/InstallCDT.cmake index 4a8fba808..22093a643 100644 --- a/cmake/InstallCDT.cmake +++ b/cmake/InstallCDT.cmake @@ -38,26 +38,18 @@ foreach(tool llvm-ranlib llvm-ar llvm-nm llvm-objcopy llvm-objdump llvm-readobj endforeach() # CDT symlinks -add_custom_command( TARGET CDTTools POST_BUILD COMMAND cd ${CMAKE_BINARY_DIR}/bin && ln -sf llvm-ranlib cdt-ranlib 2>/dev/null || true ) -add_custom_command( TARGET CDTTools POST_BUILD COMMAND cd ${CMAKE_BINARY_DIR}/bin && ln -sf llvm-ar cdt-ar 2>/dev/null || true ) -add_custom_command( TARGET CDTTools POST_BUILD COMMAND cd ${CMAKE_BINARY_DIR}/bin && ln -sf llvm-nm cdt-nm 2>/dev/null || true ) -add_custom_command( TARGET CDTTools POST_BUILD COMMAND cd ${CMAKE_BINARY_DIR}/bin && ln -sf llvm-objcopy cdt-objcopy 2>/dev/null || true ) -add_custom_command( TARGET CDTTools POST_BUILD COMMAND cd ${CMAKE_BINARY_DIR}/bin && ln -sf llvm-objdump cdt-objdump 2>/dev/null || true ) -add_custom_command( TARGET CDTTools POST_BUILD COMMAND cd ${CMAKE_BINARY_DIR}/bin && ln -sf llvm-readobj cdt-readobj 2>/dev/null || true ) -add_custom_command( TARGET CDTTools POST_BUILD COMMAND cd ${CMAKE_BINARY_DIR}/bin && ln -sf llvm-readelf cdt-readelf 2>/dev/null || true ) -add_custom_command( TARGET CDTTools POST_BUILD COMMAND cd ${CMAKE_BINARY_DIR}/bin && ln -sf llvm-strip cdt-strip 2>/dev/null || true ) +foreach(tool ranlib ar nm objcopy objdump readobj readelf strip) + add_custom_command( TARGET CDTTools POST_BUILD COMMAND cd ${CMAKE_BINARY_DIR}/bin && ln -sf llvm-${tool} cdt-${tool} 2>/dev/null || true ) +endforeach() # CDT tools -cdt_tool_install_and_symlink(sysio-pp cdt-pp) -cdt_tool_install_and_symlink(sysio-wast2wasm cdt-wast2wasm) -cdt_tool_install_and_symlink(sysio-wasm2wast cdt-wasm2wast) -cdt_tool_install_and_symlink(cdt-cc cdt-cc) -cdt_tool_install_and_symlink(cdt-cpp cdt-cpp) -cdt_tool_install_and_symlink(cdt-ld cdt-ld) -cdt_tool_install_and_symlink(cdt-abidiff cdt-abidiff) -cdt_tool_install_and_symlink(cdt-init cdt-init) -cdt_tool_install_and_symlink(cdt-codegen cdt-codegen) -cdt_tool_install_and_symlink(cdt-protoc-gen-zpp cdt-protoc-gen-zpp) +foreach(tool pp wast2wasm wasm2wast) + cdt_tool_install_and_symlink(sysio-${tool} cdt-${tool}) +endforeach() + +foreach(tool cdt-cc cdt-cpp cdt-ld cdt-abidiff cdt-init cdt-codegen cdt-protoc-gen-zpp) + cdt_tool_install_and_symlink(${tool} ${tool}) +endforeach() # Install cdt-protoc (protoc from vcpkg, copied during tools build) add_custom_command( TARGET CDTTools POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/tools/bin/cdt-protoc ${CMAKE_BINARY_DIR}/bin/ ) @@ -87,7 +79,11 @@ add_custom_command( TARGET CDTTools POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${ZPP_BITS_INCLUDE_DIR}/google/protobuf/descriptor.proto ${CMAKE_BINARY_DIR}/include/google/protobuf/ ) install(FILES ${CMAKE_BINARY_DIR}/tools/include/zpp/zpp_options.proto DESTINATION ${CDT_INSTALL_PREFIX}/include/zpp) -install(FILES ${ZPP_BITS_INCLUDE_DIR}/google/protobuf/descriptor.proto - DESTINATION ${CDT_INSTALL_PREFIX}/include/google/protobuf) +install(DIRECTORY ${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include/google/protobuf + DESTINATION ${CDT_INSTALL_PREFIX}/include/google) + +# Install magic_enum headers +install(DIRECTORY ${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include/magic_enum + DESTINATION ${CDT_INSTALL_PREFIX}/include) cdt_libraries_install() diff --git a/cmake/TestsExternalProject.cmake b/cmake/TestsExternalProject.cmake index 569a5d81a..5e9ae7469 100644 --- a/cmake/TestsExternalProject.cmake +++ b/cmake/TestsExternalProject.cmake @@ -18,12 +18,22 @@ message(STATUS "==========================") string(REPLACE ";" "|" _TEST_MODULE_PATH "${CMAKE_MODULE_PATH}") +set(VCPKG_LOCAL_INCLUDE_DIR "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include") + ExternalProject_Add( CDTWasmTests SOURCE_DIR "${CMAKE_SOURCE_DIR}/tests/unit" BINARY_DIR "${CMAKE_BINARY_DIR}/tests/unit" LIST_SEPARATOR | - CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_BINARY_DIR}/lib/cmake/cdt/CDTWasmToolchain.cmake -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCDT_BIN=${CMAKE_BINARY_DIR}/lib/cmake/cdt/ -DBASE_BINARY_DIR=${CMAKE_BINARY_DIR} -D__APPLE=${APPLE} -DCMAKE_MODULE_PATH=${_TEST_MODULE_PATH} -DCMAKE_EXPORT_COMPILE_COMMANDS=ON + CMAKE_ARGS + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_BINARY_DIR}/lib/cmake/cdt/CDTWasmToolchain.cmake + -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DCDT_BIN=${CMAKE_BINARY_DIR}/lib/cmake/cdt/ + -DBASE_BINARY_DIR=${CMAKE_BINARY_DIR} + -D__APPLE=${APPLE} + -DCMAKE_MODULE_PATH=${_TEST_MODULE_PATH} + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON + -DCDT_CONTRACT_INCLUDE_PATH=${VCPKG_LOCAL_INCLUDE_DIR} UPDATE_COMMAND "" PATCH_COMMAND "" TEST_COMMAND "" diff --git a/cmake/cdt-config.cmake.in b/cmake/cdt-config.cmake.in index 2c3ea8961..6dfeb68f3 100644 --- a/cmake/cdt-config.cmake.in +++ b/cmake/cdt-config.cmake.in @@ -27,6 +27,21 @@ set(CDT_VERSION "@VERSION_FULL@") list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}) list(APPEND CMAKE_MODULE_PATH ${CDT_ROOT}/lib/cmake/cdt) +# Imported executable targets for CDT protobuf tools +if(NOT TARGET cdt::protoc) + add_executable(cdt::protoc IMPORTED) + set_target_properties(cdt::protoc PROPERTIES + IMPORTED_LOCATION "${CDT_ROOT}/bin/cdt-protoc" + ) +endif() + +if(NOT TARGET cdt::protoc-gen-zpp) + add_executable(cdt::protoc-gen-zpp IMPORTED) + set_target_properties(cdt::protoc-gen-zpp PROPERTIES + IMPORTED_LOCATION "${CDT_ROOT}/bin/cdt-protoc-gen-zpp" + ) +endif() + include(CDTMacros) function(EXTRACT_MAJOR_MINOR_FROM_VERSION version success major minor) diff --git a/tools/protoc-gen-zpp/protoc-gen-zpp.cpp b/tools/protoc-gen-zpp/protoc-gen-zpp.cpp index 334538c19..40b0b0871 100644 --- a/tools/protoc-gen-zpp/protoc-gen-zpp.cpp +++ b/tools/protoc-gen-zpp/protoc-gen-zpp.cpp @@ -419,6 +419,7 @@ struct zpp_generator { } strm << "#include \n" + << "#include \n" << "// @@protoc_insertion_point(includes)\n"; std::string indent = "";