diff options
-rw-r--r-- | site_scons/site_tools/protobuf_compiler.py | 42 | ||||
-rw-r--r-- | src/third_party/grpc/SConscript | 18 |
2 files changed, 44 insertions, 16 deletions
diff --git a/site_scons/site_tools/protobuf_compiler.py b/site_scons/site_tools/protobuf_compiler.py index 3a524ba671b..07db17d92ff 100644 --- a/site_scons/site_tools/protobuf_compiler.py +++ b/site_scons/site_tools/protobuf_compiler.py @@ -55,10 +55,10 @@ def temporary_filename(suffix=None): def get_gen_type_and_dir(env, gen_type): # Utility function for parsing out the gen type and desired gen dir if SCons.Util.is_String(gen_type): - gen_out_dir = "." + gen_out_dir = None elif SCons.Util.is_List(gen_type) and len(gen_type) == 1: gen_type = gen_type[0] - gen_out_dir = "." + gen_out_dir = None elif SCons.Util.is_List(gen_type) and len(gen_type) == 2: gen_out_dir = gen_type[1] gen_type = gen_type[0] @@ -68,30 +68,46 @@ def get_gen_type_and_dir(env, gen_type): def protoc_emitter(target, source, env): - base_file_name = os.path.split(SCons.Util.splitext(str(target[0]))[0])[1] - new_targets = [] - for gen_type in env.subst_list('$PROTOC_GEN_TYPES', target=target, source=source): + new_targets = [] + gen_types = env.subst_list('$PROTOC_GEN_TYPES', target=target, source=source) + base_file_name = os.path.splitext(target[0].get_path())[0] + for gen_type in gen_types: # Check for valid requested gen type. gen_type, gen_out_dir = get_gen_type_and_dir(env, gen_type) + if gen_type not in env['_PROTOC_SUPPORTED_GEN_TYPES']: raise ValueError(f"Requested protoc gen output of {gen_type}, but only {env['_PROTOC_SUPPORTED_GEN_TYPES']} are currenlty supported.") + if gen_out_dir: + base_file_name = os.path.join(env.Dir(gen_out_dir).get_path(), os.path.split(SCons.Util.splitext(target[0].get_path())[0])[1]) + # Create the targets by extensions list for this type in the desired gen dir. exts = env['_PROTOC_SUPPORTED_GEN_TYPES'][gen_type] - new_targets += [env.Dir(gen_out_dir).File(f"{base_file_name}{ext}") for ext in exts] + new_targets += [env.File(f"{base_file_name}{ext}") for ext in exts] + + if gen_types: + # Setup the dependency file. + # This is little weird currently, because of the limitation of ninja and multiple + # outputs. The base file name can change for each gen type, so in this case we are + # taking the last one. This works if all gen outs are in the same dir and makes ninja + # happy, but if there are multiple gen_out dirs, then in a scons only build the deps + # is gened to the last in the list, which is awkward, but because this is only refernced + # as a target throughout the rest of tool, it works fine in scons build. + dep_file = env.File(f"{base_file_name}.protodeps") + new_targets += [dep_file] # Create targets for any listed plugins. plugins = env.get('PROTOC_PLUGINS', []) for name in plugins: - out_dir = plugins[name].get('gen_out', '.') + out_dir = plugins[name].get('gen_out') exts = plugins[name].get('exts', []) - new_targets += [env.Dir(out_dir).File(f"{base_file_name}{ext}") for ext in exts] - # Setup the dependency file. - dep_file = env.File(os.path.split(source[0].get_path())[1]+".protodeps") - new_targets += [dep_file] + if out_dir: + base_file_name = os.path.join(env.Dir(out_dir).get_path(), os.path.split(SCons.Util.splitext(target[0].get_path())[0])[1]) + + new_targets += [env.File(f"{base_file_name}{ext}") for ext in exts] env.Alias("generated-sources", new_targets) @@ -299,9 +315,7 @@ def generate(env): def protobuf_provider(env, node, action, targets, sources, executor=None): provided_rule, variables, tool_command = env.NinjaGetGenericShellCommand(node, action, targets, sources, executor) - t_dirs = [os.path.dirname(t.get_path()) for t in targets] - print(t_dirs) if len(set(t_dirs)) > 1: raise SCons.Errors.BuildError(node=node, errstr="Due to limitations with ninja tool and using phonies for multiple targets, protoc must generate all generated output for a single command to the same directory.") for t in targets: @@ -349,7 +363,7 @@ def generate(env): # 'grpc': { # 'plugin': '$PROTOC_GRPC_PLUGIN', # 'options': ['generate_mock_code=true'], - # 'gen_dir': "$BUILD_DIR/grpc_gen" + # 'gen_out': "$BUILD_DIR/grpc_gen" # 'exts': ['.grpc.pb.cc', '.grpc.pb.h'], # }, # 'my_plugin': { diff --git a/src/third_party/grpc/SConscript b/src/third_party/grpc/SConscript index 29a839558e4..a01d58bf4f4 100644 --- a/src/third_party/grpc/SConscript +++ b/src/third_party/grpc/SConscript @@ -890,8 +890,23 @@ lib_node = grpcxx_env.Library( ], ) -grpc_unittest_env = grpcxx_env.Clone() +grpc_unittest_env = grpc_env.Clone() grpc_unittest_env.InjectThirdParty(libraries=['fmt', 'variant', 'boost', 'safeint']) + +# purposely changing the gen dir as an example and to excerise setting gen dirs +grpc_unittest_env.AppendUnique( + PROTOC_GEN_TYPES=[['cpp', grpc_unittest_env.Dir('.')]], + PROTOC_PLUGINS={ + 'grpc': { + 'plugin': '$PROTOC_GRPC_PLUGIN', + 'options': ['generate_mock_code=true'], + 'gen_out': grpc_unittest_env.Dir('.'), + 'exts': ['.grpc.pb.cc', '.grpc.pb.h'], + }, + }, + CPPPATH=[grpc_unittest_env.Dir('.')] +) + grpc_unittest_env.Append( CPPPATH=[ '#src', @@ -904,7 +919,6 @@ grpc_unittest_env.CppUnitTest( source=[ 'grpc_source_test.cpp', 'dist/examples/protos/helloworld.proto', - 'dist/examples/protos/keyvaluestore.proto', ], LIBDEPS=[ '$BUILD_DIR/mongo/base', |