#[===================================================================[ import protobuf (lib and compiler) and create a lib from our proto message definitions. If the system protobuf is not found, fallback on EP to download and build a version from official source. #]===================================================================] if (static) set (Protobuf_USE_STATIC_LIBS ON) endif () find_package (Protobuf 3.8) if (is_multiconfig) set(protobuf_protoc_lib ${Protobuf_PROTOC_LIBRARIES}) else () string(TOUPPER ${CMAKE_BUILD_TYPE} upper_cmake_build_type) set(protobuf_protoc_lib ${Protobuf_PROTOC_LIBRARY_${upper_cmake_build_type}}) endif () if (local_protobuf OR NOT (Protobuf_FOUND AND Protobuf_PROTOC_EXECUTABLE AND protobuf_protoc_lib)) include (GNUInstallDirs) message (STATUS "using local protobuf build.") set(protobuf_reqs Protobuf_PROTOC_EXECUTABLE protobuf_protoc_lib) foreach(lib ${protobuf_reqs}) if(NOT ${lib}) message(STATUS "Couldn't find ${lib}") endif() endforeach() if (WIN32) # protobuf prepends lib even on windows set (pbuf_lib_pre "lib") else () set (pbuf_lib_pre ${ep_lib_prefix}) endif () # for the external project build of protobuf, we currently ignore the # static option and always build static libs here. This is consistent # with our other EP builds. Dynamic libs in an EP would add complexity # because we'd need to get them into the runtime path, and probably # install them. ExternalProject_Add (protobuf_src PREFIX ${nih_cache_path} GIT_REPOSITORY https://github.com/protocolbuffers/protobuf.git GIT_TAG v3.8.0 SOURCE_SUBDIR cmake CMAKE_ARGS -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} -DCMAKE_INSTALL_PREFIX=/_installed_ -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_BUILD_EXAMPLES=OFF -Dprotobuf_BUILD_PROTOC_BINARIES=ON -Dprotobuf_MSVC_STATIC_RUNTIME=ON -DBUILD_SHARED_LIBS=OFF -Dprotobuf_BUILD_SHARED_LIBS=OFF -DCMAKE_DEBUG_POSTFIX=_d -Dprotobuf_DEBUG_POSTFIX=_d -Dprotobuf_WITH_ZLIB=$,ON,OFF> $<$:-DCMAKE_VERBOSE_MAKEFILE=ON> $<$:-DCMAKE_UNITY_BUILD=ON}> $<$>:-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}> $<$: "-DCMAKE_CXX_FLAGS=-GR -Gd -fp:precise -FS -EHa -MP" > LOG_BUILD ON LOG_CONFIGURE ON BUILD_COMMAND ${CMAKE_COMMAND} --build . --config $ --parallel ${ep_procs} TEST_COMMAND "" INSTALL_COMMAND ${CMAKE_COMMAND} -E env --unset=DESTDIR ${CMAKE_COMMAND} --build . --config $ --target install BUILD_BYPRODUCTS /_installed_/${CMAKE_INSTALL_LIBDIR}/${pbuf_lib_pre}protobuf${ep_lib_suffix} /_installed_/${CMAKE_INSTALL_LIBDIR}/${pbuf_lib_pre}protobuf_d${ep_lib_suffix} /_installed_/${CMAKE_INSTALL_LIBDIR}/${pbuf_lib_pre}protoc${ep_lib_suffix} /_installed_/${CMAKE_INSTALL_LIBDIR}/${pbuf_lib_pre}protoc_d${ep_lib_suffix} /_installed_/bin/protoc${CMAKE_EXECUTABLE_SUFFIX} ) ExternalProject_Get_Property (protobuf_src BINARY_DIR) ExternalProject_Get_Property (protobuf_src SOURCE_DIR) if (CMAKE_VERBOSE_MAKEFILE) print_ep_logs (protobuf_src) endif () exclude_if_included (protobuf_src) if (NOT TARGET protobuf::libprotobuf) add_library (protobuf::libprotobuf STATIC IMPORTED GLOBAL) endif () file (MAKE_DIRECTORY ${BINARY_DIR}/_installed_/include) set_target_properties (protobuf::libprotobuf PROPERTIES IMPORTED_LOCATION_DEBUG ${BINARY_DIR}/_installed_/${CMAKE_INSTALL_LIBDIR}/${pbuf_lib_pre}protobuf_d${ep_lib_suffix} IMPORTED_LOCATION_RELEASE ${BINARY_DIR}/_installed_/${CMAKE_INSTALL_LIBDIR}/${pbuf_lib_pre}protobuf${ep_lib_suffix} INTERFACE_INCLUDE_DIRECTORIES ${BINARY_DIR}/_installed_/include) add_dependencies (protobuf::libprotobuf protobuf_src) exclude_if_included (protobuf::libprotobuf) if (NOT TARGET protobuf::libprotoc) add_library (protobuf::libprotoc STATIC IMPORTED GLOBAL) endif () set_target_properties (protobuf::libprotoc PROPERTIES IMPORTED_LOCATION_DEBUG ${BINARY_DIR}/_installed_/${CMAKE_INSTALL_LIBDIR}/${pbuf_lib_pre}protoc_d${ep_lib_suffix} IMPORTED_LOCATION_RELEASE ${BINARY_DIR}/_installed_/${CMAKE_INSTALL_LIBDIR}/${pbuf_lib_pre}protoc${ep_lib_suffix} INTERFACE_INCLUDE_DIRECTORIES ${BINARY_DIR}/_installed_/include) add_dependencies (protobuf::libprotoc protobuf_src) exclude_if_included (protobuf::libprotoc) if (NOT TARGET protobuf::protoc) add_executable (protobuf::protoc IMPORTED) exclude_if_included (protobuf::protoc) endif () set_target_properties (protobuf::protoc PROPERTIES IMPORTED_LOCATION "${BINARY_DIR}/_installed_/bin/protoc${CMAKE_EXECUTABLE_SUFFIX}") add_dependencies (protobuf::protoc protobuf_src) else () if (NOT TARGET protobuf::protoc) if (EXISTS "${Protobuf_PROTOC_EXECUTABLE}") add_executable (protobuf::protoc IMPORTED) set_target_properties (protobuf::protoc PROPERTIES IMPORTED_LOCATION "${Protobuf_PROTOC_EXECUTABLE}") else () message (FATAL_ERROR "Protobuf import failed") endif () endif () endif () set(output_dir ${CMAKE_BINARY_DIR}/proto_gen) file(MAKE_DIRECTORY ${output_dir}) set(ccbd ${CMAKE_CURRENT_BINARY_DIR}) set(CMAKE_CURRENT_BINARY_DIR ${output_dir}) protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS src/ripple/proto/ripple.proto) set(CMAKE_CURRENT_BINARY_DIR ${ccbd}) target_include_directories(xrpl_core SYSTEM PUBLIC # The generated implementation imports the header relative to the output # directory. $ $ ) target_sources(xrpl_core PRIVATE ${output_dir}/src/ripple/proto/ripple.pb.cc) install( FILES ${output_dir}/src/ripple/proto/ripple.pb.h DESTINATION include/ripple/proto) target_link_libraries(xrpl_core PUBLIC protobuf::libprotobuf) target_compile_options(xrpl_core PUBLIC $<$: --system-header-prefix="google/protobuf" -Wno-deprecated-dynamic-exception-spec > )