如何使用 vcpkg 工具链在 CMake 中删除 --plugin=protoc-gen-grpc 的硬编码路径
How to remove hardcoded path for --plugin=protoc-gen-grpc in CMake using vcpkg toolchain
我有一个使用 CMake 在 C++ 中构建 grpc 库的工作示例。
但是我需要硬编码标志的绝对路径
--plugin=protoc-gen-grpc="/home/myusername/dev/lab/MiniGL/vcpkg/installed/x64-linux/tools/grpc/grpc_cpp_plugin"
我真正想做的是为所需的 grpc_cpp_plugin 找到类似环境变量 ${PROTOBUF_PROTOC_EXECUTABLE}
的东西,但我找不到它。即 ${GPRC_CPP_PLUGIN_EXECUTABLE}
有谁知道我是否漏掉了一些简单的东西?
这是我对 CMakeLists.txt
的完整列表
project(hello_contract_library)
set(CMAKE_VERBOSE_MAKEFILE ON)
find_package(protobuf CONFIG REQUIRED)
#target_link_libraries(main PRIVATE protobuf::libprotoc protobuf::libprotobuf protobuf::libprotobuf-lite)
set(GENERATED_DIR "${PROJECT_SOURCE_DIR}/generated")
file(MAKE_DIRECTORY "${GENERATED_DIR}")
set(hello_src "${GENERATED_DIR}/hello.pb.cc")
set(hello_hdr "${GENERATED_DIR}/hello.pb.h")
set(hello_grpc_src "${GENERATED_DIR}/hello.grpc.pb.cc")
set(hello_grpc_hdr "${GENERATED_DIR}/hello.grpc.pb.h")
# Added to include generated header files
include_directories("${GENERATED_DIR}")
add_custom_command(
OUTPUT "${hello_src}" "${hello_hdr}" "${hello_grpc_src}" "${hello_grpc_hdr}"
COMMAND ${PROTOBUF_PROTOC_EXECUTABLE}
ARGS --grpc_out "${PROJECT_SOURCE_DIR}/generated"
--cpp_out "${PROJECT_SOURCE_DIR}/generated"
-I "/home/myusername/dev/lab/MiniGL/src/backend/public/contracts"
--plugin=protoc-gen-grpc="/home/myusername/dev/lab/MiniGL/vcpkg/installed/x64-linux/tools/grpc/grpc_cpp_plugin"
"hello.proto"
DEPENDS "hello.proto")
add_library(${PROJECT_NAME}
${hello_src}
${hello_hdr}
${hello_grpc_src}
${hello_grpc_hdr})
目前获得此信息的唯一方法是创建您自己的 .cmake
文件来查找这些可执行文件并定义此变量。幸运的是 Google 有一个例子 here。您可以将 common.cmake
复制到您将包含到项目中的 cmake
目录。
这会给你 ${_GRPC_CPP_PLUGIN_EXECUTABLE}
用于你的 --plugin
和 ${_GRPC_GRPCPP}
放入你的 target_link_libraries
.
例子
根目录下
# common project setup
include(cmake/common.cmake) # comes from Google examples
add_subdirectory(proto)
在原型目录中
# Proto files
set(my_protos
test.proto
)
# Generated sources
set(my_protos_srcs
${CMAKE_BINARY_DIR}/proto/test.pb.cc
)
set(my_protos_hdrs
${CMAKE_BINARY_DIR}/proto/test.pb.h
)
add_custom_command(
OUTPUT ${my_protos_srcs} ${my_protos_hdrs}
COMMAND ${_PROTOBUF_PROTOC}
ARGS --cpp_out ${CMAKE_BINARY_DIR}/proto
--grpc_out ${CMAKE_BINARY_DIR}/proto
-I ${CMAKE_SOURCE_DIR}/proto
--plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}"
${my_protos}
DEPENDS ${my_protos}
)
add_library(protos
${my_protos_srcs}
${my_protos_hdrs}
)
target_link_libraries(protos
${_PROTOBUF_LIBPROTOBUF}
${_GRPC_GRPCPP}
)
我有一个使用 CMake 在 C++ 中构建 grpc 库的工作示例。
但是我需要硬编码标志的绝对路径
--plugin=protoc-gen-grpc="/home/myusername/dev/lab/MiniGL/vcpkg/installed/x64-linux/tools/grpc/grpc_cpp_plugin"
我真正想做的是为所需的 grpc_cpp_plugin 找到类似环境变量 ${PROTOBUF_PROTOC_EXECUTABLE}
的东西,但我找不到它。即 ${GPRC_CPP_PLUGIN_EXECUTABLE}
有谁知道我是否漏掉了一些简单的东西?
这是我对 CMakeLists.txt
的完整列表project(hello_contract_library)
set(CMAKE_VERBOSE_MAKEFILE ON)
find_package(protobuf CONFIG REQUIRED)
#target_link_libraries(main PRIVATE protobuf::libprotoc protobuf::libprotobuf protobuf::libprotobuf-lite)
set(GENERATED_DIR "${PROJECT_SOURCE_DIR}/generated")
file(MAKE_DIRECTORY "${GENERATED_DIR}")
set(hello_src "${GENERATED_DIR}/hello.pb.cc")
set(hello_hdr "${GENERATED_DIR}/hello.pb.h")
set(hello_grpc_src "${GENERATED_DIR}/hello.grpc.pb.cc")
set(hello_grpc_hdr "${GENERATED_DIR}/hello.grpc.pb.h")
# Added to include generated header files
include_directories("${GENERATED_DIR}")
add_custom_command(
OUTPUT "${hello_src}" "${hello_hdr}" "${hello_grpc_src}" "${hello_grpc_hdr}"
COMMAND ${PROTOBUF_PROTOC_EXECUTABLE}
ARGS --grpc_out "${PROJECT_SOURCE_DIR}/generated"
--cpp_out "${PROJECT_SOURCE_DIR}/generated"
-I "/home/myusername/dev/lab/MiniGL/src/backend/public/contracts"
--plugin=protoc-gen-grpc="/home/myusername/dev/lab/MiniGL/vcpkg/installed/x64-linux/tools/grpc/grpc_cpp_plugin"
"hello.proto"
DEPENDS "hello.proto")
add_library(${PROJECT_NAME}
${hello_src}
${hello_hdr}
${hello_grpc_src}
${hello_grpc_hdr})
目前获得此信息的唯一方法是创建您自己的 .cmake
文件来查找这些可执行文件并定义此变量。幸运的是 Google 有一个例子 here。您可以将 common.cmake
复制到您将包含到项目中的 cmake
目录。
这会给你 ${_GRPC_CPP_PLUGIN_EXECUTABLE}
用于你的 --plugin
和 ${_GRPC_GRPCPP}
放入你的 target_link_libraries
.
例子
根目录下
# common project setup
include(cmake/common.cmake) # comes from Google examples
add_subdirectory(proto)
在原型目录中
# Proto files
set(my_protos
test.proto
)
# Generated sources
set(my_protos_srcs
${CMAKE_BINARY_DIR}/proto/test.pb.cc
)
set(my_protos_hdrs
${CMAKE_BINARY_DIR}/proto/test.pb.h
)
add_custom_command(
OUTPUT ${my_protos_srcs} ${my_protos_hdrs}
COMMAND ${_PROTOBUF_PROTOC}
ARGS --cpp_out ${CMAKE_BINARY_DIR}/proto
--grpc_out ${CMAKE_BINARY_DIR}/proto
-I ${CMAKE_SOURCE_DIR}/proto
--plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}"
${my_protos}
DEPENDS ${my_protos}
)
add_library(protos
${my_protos_srcs}
${my_protos_hdrs}
)
target_link_libraries(protos
${_PROTOBUF_LIBPROTOBUF}
${_GRPC_GRPCPP}
)