Open p977ac opened 1 year ago
Мой колхоз для пункта 2 на cmake:
change_namespace.cmake
:
file(READ "${SOURCE}" TEXT)
string(REPLACE "tinkoff::public::invest::api::contract::v1" "tinkoff::public_::invest::api::contract::v1" TEXT "${TEXT}")
string(REPLACE "namespace public" "namespace public_" TEXT "${TEXT}")
file(WRITE "${TARGET}" "${TEXT}")
CMakeLists.txt
:
...
find_package(Protobuf CONFIG REQUIRED)
find_package(gRPC CONFIG REQUIRED)
include(FetchContent)
FetchContent_Declare(
tinkoff-api
GIT_REPOSITORY https://github.com/RussianInvestments/investAPI
GIT_TAG b16de288245370f882a1c24575f363609820198f
)
FetchContent_Populate(tinkoff-api)
cmake_path(APPEND TAPI_PROTO_BASE_DIR "${tinkoff-api_SOURCE_DIR}" "src/docs/contracts")
set(PROTOS common instruments marketdata operations orders sandbox stoporders users)
add_custom_target(raw-directory ALL COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/raw")
get_target_property(grpc_cpp_plugin_location gRPC::grpc_cpp_plugin LOCATION)
foreach (MLIB ${PROTOS})
set(TARGET_NAME "tapi-${MLIB}")
cmake_path(APPEND PROTO_PATH "${TAPI_PROTO_BASE_DIR}" "${MLIB}.proto")
protobuf_generate(OUT_VAR GENERATED_SOURCES PROTOC_OUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/raw" PROTOS "${TAPI_PROTO_BASE_DIR}/${MLIB}.proto" APPEND_PATH)
protobuf_generate(
OUT_VAR GRPC_GENERATED_SOURCES PROTOC_OUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/raw" LANGUAGE grpc GENERATE_EXTENSIONS .grpc.pb.h .grpc.pb.cc PLUGIN
"protoc-gen-grpc=${grpc_cpp_plugin_location}" PROTOS "${TAPI_PROTO_BASE_DIR}/${MLIB}.proto" APPEND_PATH
)
set(_sources)
foreach (SRC ${GENERATED_SOURCES} ${GRPC_GENERATED_SOURCES})
cmake_path(GET SRC FILENAME SRC_FILENAME)
add_custom_command(
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${SRC_FILENAME}"
COMMAND "${CMAKE_COMMAND}" "-DSOURCE=${SRC}" "-DTARGET=${CMAKE_CURRENT_BINARY_DIR}/${SRC_FILENAME}" -P "${CMAKE_CURRENT_SOURCE_DIR}/change_namespace.cmake"
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/change_namespace.cmake" "${SRC}" raw-directory
)
list(APPEND _sources "${CMAKE_CURRENT_BINARY_DIR}/${SRC_FILENAME}")
endforeach ()
add_library(${TARGET_NAME} ${_sources})
target_include_directories(${TARGET_NAME} SYSTEM INTERFACE ${CMAKE_CURRENT_BINARY_DIR})
target_link_libraries(${TARGET_NAME} PUBLIC protobuf::libprotobuf gRPC::grpc++)
endforeach (MLIB)
# Based on imports in related `.proto`.
target_link_libraries(tapi-instruments PUBLIC tapi-common)
target_link_libraries(tapi-marketdata PUBLIC tapi-common)
target_link_libraries(tapi-operations PUBLIC tapi-common)
target_link_libraries(tapi-orders PUBLIC tapi-common)
target_link_libraries(tapi-sandbox PUBLIC tapi-common)
target_link_libraries(tapi-sandbox PUBLIC tapi-operations)
target_link_libraries(tapi-sandbox PUBLIC tapi-orders)
target_link_libraries(tapi-sandbox PUBLIC tapi-users)
target_link_libraries(tapi-stoporders PUBLIC tapi-common)
target_link_libraries(tapi-users PUBLIC tapi-common)
...
По обращению @yelowt
Добрый день! При генерации с++ кода по investAPI proto файлам package tinkoff.public.invest.api.contract.v1; генерирует namespace public. Полученный код не собирается. Естественно, при коррекции package tinkoff.invest.api.contract.v1; Код собирается, но такая удаленная процедура UNIMPLEMENTED.
Комментарии:
Попробуем закинуть pull request в репозиторий grpc-cpp генератора, по пока в качестве временной меры попробуйте удалить из сгенерированного кода упоминания ::public и namespace public
В качестве временного решения можно использовать автозамену
namespace public
наnamespace public_
и::public
на::public_
в сгенерированных файлах. Например, с помощью команды в каталоге с этими файлами:Автозамена потребуется после каждой генерации файлов.
Аналогичная проблема, но с QtProtobuf. Автоматизировать, пока рано. Делаю замену в .proto файлах с package tinkoff.public.invest.api.contract.v1; на package tinkoff.api; В сгенерированных исходниках прописываю автозаменой по всем нужный путь к методам по апи. С чисто плюсовой версией приходится править все руками. Есть идея сгенерить на чистый С, и под него уже обертку на плюсах написать, но еще не пробовал. Ну и REST, как в v1, на крайний случай.
Вопрос в protocolbuffers закинули, будет здорово, если тоже отметитесь там https://github.com/protocolbuffers/protobuf/issues/9058