Skip to content

在以外部库形式源码引入tRPC,使用Ninja作为生成器时存在两次生成trpc_options.pb.cc/trpc_cpp_options.pb.cc的行为 #194

@deadlinefen

Description

@deadlinefen

我在按照文档https://github.com/trpc-group/trpc-cpp/blob/main/docs/zh/bazel_or_cmake.md
使用CMake与Ninja,将tRPC以外部库形式源码引入项目时报错:

CMake Error:
  Running

   '/usr/local/bin/ninja' '-C' '/data/workspace/bld' '-t' 'recompact'

  failed with:

   ninja: error: build.ninja:11818: multiple rules generate ../cmake-third-party/trpc-cpp/trpc/proto/trpc_options.pb.cc

之后我检查了build.ninja,发现其中有两处生成trpc_options.pb.cc与trpc_cpp_options.pb.cc的命令(以trpc_cpp_options.pb.cc为例):

# 4902行处
# Custom command for ../cmake-third-party/trpc-cpp/trpc/tools/comm/trpc_cpp_options.pb.cc

build ../cmake-third-party/trpc-cpp/trpc/tools/comm/trpc_cpp_options.pb.cc ../cmake-third-party/trpc-cpp/trpc/tools/comm/trpc_cpp_options.pb.h | ${cmake_ninja_workdir}../cmake-third-party/trpc-cpp/trpc/tools/comm/trpc_cpp_options.pb.cc ${cmake_ninja_workdir}../cmake-third-party/trpc-cpp/trpc/tools/comm/trpc_cpp_options.pb.h: CUSTOM_COMMAND ../cmake-third-party/trpc-cpp/trpc/tools/comm/trpc_cpp_options.proto || _deps/trpc-cpp-build/cmake_third_party/gflags/libgflags_nothreads.a _deps/trpc-cpp-build/trpc/tools/trpc_cpp_plugin/bin/trpc_cpp_plugin bin/protoc lib/libflatbuffers.a lib/libgmock.a lib/libgtest.a lib/libjsoncpp.a lib/liblz4.a lib/libnghttp2_static.a lib/libprotobuf.a lib/libprotoc.a lib/libsnappy.a lib/libyaml-cpp.a
  COMMAND = cd /data/workspace/cmake-third-party/trpc-cpp && /data/workspace/bld/bin/protoc -I /data/workspace/cmake-third-party/trpc-cpp -I /data/workspace/cmake-third-party/trpc-cpp/cmake_third_party/protobuf/src --cpp_out=. trpc/tools/comm/trpc_cpp_options.proto
  DESC = Generating ../../../cmake-third-party/trpc-cpp/trpc/tools/comm/trpc_cpp_options.pb.cc, ../../../cmake-third-party/trpc-cpp/trpc/tools/comm/trpc_cpp_options.pb.h
  restat = 1

# 11821行处
# Custom command for ../cmake-third-party/trpc-cpp/trpc/tools/comm/trpc_cpp_options.pb.cc

build ../cmake-third-party/trpc-cpp/trpc/tools/comm/trpc_cpp_options.pb.cc ../cmake-third-party/trpc-cpp/trpc/tools/comm/trpc_cpp_options.pb.h | ${cmake_ninja_workdir}../cmake-third-party/trpc-cpp/trpc/tools/comm/trpc_cpp_options.pb.cc ${cmake_ninja_workdir}../cmake-third-party/trpc-cpp/trpc/tools/comm/trpc_cpp_options.pb.h: CUSTOM_COMMAND ../cmake-third-party/trpc-cpp/trpc/tools/comm/trpc_cpp_options.proto || bin/protoc lib/libprotobuf.a lib/libprotoc.a
  COMMAND = cd /data/workspace/cmake-third-party/trpc-cpp && /data/workspace/bld/bin/protoc -I /data/workspace/cmake-third-party/trpc-cpp -I /data/workspace/cmake-third-party/trpc-cpp/cmake_third_party/protobuf/src --cpp_out=. trpc/tools/comm/trpc_cpp_options.proto
  DESC = Generating ../../../../../../cmake-third-party/trpc-cpp/trpc/tools/comm/trpc_cpp_options.pb.cc, ../../../../../../cmake-third-party/trpc-cpp/trpc/tools/comm/trpc_cpp_options.pb.h
  restat = 1

经检查貌似是这两个文件同时被cmake_object_order_depends_target_trpccmake_object_order_depends_target_trpc_cpp_plugin依赖导致的。ninja.build中的依赖关系如下:

# Order-only phony target for trpc

build cmake_object_order_depends_target_trpc: phony || ../cmake-third-party/trpc-cpp/trpc/codec/trpc/trpc.pb.cc ../cmake-third-party/trpc-cpp/trpc/codec/trpc/trpc.pb.h ../cmake-third-party/trpc-cpp/trpc/proto/trpc.pb.cc ../cmake-third-party/trpc-cpp/trpc/proto/trpc.pb.h ../cmake-third-party/trpc-cpp/trpc/proto/trpc_options.pb.cc ../cmake-third-party/trpc-cpp/trpc/proto/trpc_options.pb.h ../cmake-third-party/trpc-cpp/trpc/tools/comm/trpc_cpp_options.pb.cc ../cmake-third-party/trpc-cpp/trpc/tools/comm/trpc_cpp_options.pb.h ../cmake-third-party/trpc-cpp/trpc/trpc.pb.cc ../cmake-third-party/trpc-cpp/trpc/trpc.pb.h _deps/trpc-cpp-build/trpc/tools/trpc_cpp_plugin/bin/trpc_cpp_plugin bin/protoc cmake_object_order_depends_target_flatbuffers cmake_object_order_depends_target_gflags_nothreads_static cmake_object_order_depends_target_gmock cmake_object_order_depends_target_gtest cmake_object_order_depends_target_jsoncpp_lib cmake_object_order_depends_target_libprotobuf cmake_object_order_depends_target_libprotoc cmake_object_order_depends_target_lz4_static cmake_object_order_depends_target_nghttp2_static cmake_object_order_depends_target_snappy cmake_object_order_depends_target_yaml-cpp

# Order-only phony target for trpc_cpp_plugin

build cmake_object_order_depends_target_trpc_cpp_plugin: phony || ../cmake-third-party/trpc-cpp/trpc/proto/trpc_options.pb.cc ../cmake-third-party/trpc-cpp/trpc/proto/trpc_options.pb.h ../cmake-third-party/trpc-cpp/trpc/tools/comm/trpc_cpp_options.pb.cc ../cmake-third-party/trpc-cpp/trpc/tools/comm/trpc_cpp_options.pb.h bin/protoc cmake_object_order_depends_target_libprotobuf cmake_object_order_depends_target_libprotoc

使用CMake+Make就不会有上述问题。

CMake版本3.22.1
Ninja版本1.12.1
Make版本4.3

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions