Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -54,3 +54,4 @@ __pycache__/
.ccls-cache/

tmp/
/.env
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)


Expand Down
108 changes: 91 additions & 17 deletions cmake/CDTMacros.cmake.in
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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)
Expand All @@ -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)
Expand Down Expand Up @@ -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=$<TARGET_FILE:cdt::protoc-gen-zpp>
--zpp_out
${OUTPUT_DIR}
${ADD_PROTOBUF_FILES}
DEPENDS cdt::protoc-gen-zpp ${INPUT_FILES}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)

Expand All @@ -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})
Expand All @@ -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
Expand All @@ -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)
Expand Down
36 changes: 16 additions & 20 deletions cmake/InstallCDT.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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/ )
Expand Down Expand Up @@ -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()
12 changes: 11 additions & 1 deletion cmake/TestsExternalProject.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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 ""
Expand Down
15 changes: 15 additions & 0 deletions cmake/cdt-config.cmake.in
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
1 change: 1 addition & 0 deletions tools/protoc-gen-zpp/protoc-gen-zpp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -419,6 +419,7 @@ struct zpp_generator {
}

strm << "#include <zpp_bits.h>\n"
<< "#include <magic_enum/magic_enum.hpp>\n"
<< "// @@protoc_insertion_point(includes)\n";

std::string indent = "";
Expand Down
Loading