Robin Passama
Robin Passama

Reputation: 111

How to build tensorflow 1.13.1 with custom protobuf?

System Information

Context: by default, tensorflow builds its own protobuf code. Nevertheless protobuf being also used in other libraries, its exported symbols are conflicting with those provided by tensorflow. Only good solution to that problem is to use a unique and independent (i.e. out of tensorflow) version of protobuf for all libraries (including tensorflow). So I basically need to build tensorflow with a target installed version of protobuf, that is located somewhere in the filesystem.

Problem: using a custom version of protobuf, installed somewhere in filesystem (not in default system path), when building tensorflow 1.13.1. More specifically, my question is : what modifications are needed in bazel files of tensorflow to make this possible. I a am new to bazel and I am really confused about what to do...

Here is what I did:

1) to deactivate internal build of protobuf, in .tf_configure.bazelrc I added the line:

build --action_env TF_SYSTEM_LIBS="protobuf_archive"

This works as expected except that my protobuf installed in default system path is too old to be capable of parsing proto3 files. Not a real problem anyway since I want to use my custom protobuf which is version 3.7.0.

2) to specify where to find protobuf I changed workspace.bzl file by using new_local_repository instead of tf_http_archive.

Here @PATH_TO_PROTOBUF@ if the path to the protobuf library installed in my filesystem.

    new_local_repository(
        name =  "protobuf_archive",
        path = "@PATH_TO_PROTOBUF@",
        build_file = clean_dep("//third_party/systemlibs:protobuf.BUILD"),
    )

    new_local_repository(
        name = "com_google_protobuf",
        path = "@PATH_TO_PROTOBUF@",
        system_build_file = clean_dep("//third_party/systemlibs:protobuf.BUILD"),
        system_link_files = {
            "//third_party/systemlibs:protobuf.bzl": "protobuf.bzl",
        },
    )
    new_local_repository(
        name = "com_google_protobuf_cc",
        path = "@PATH_TO_PROTOBUF@",
        system_build_file = clean_dep("//third_party/systemlibs:protobuf.BUILD"),
        system_link_files = {
            "//third_party/systemlibs:protobuf.bzl": "protobuf.bzl",
        },
    )

3) I changed the protobuf.BUILD file located in tensorflow-1.13.1/third_party/systemlibs by changing binaries used by rules:

cc_library(
    name = "protobuf",
    hdrs = HEADERS,
    linkopts = ["@PATH_TO_PROTOBUF@/lib/libprotobuf.so"],
    visibility = ["//visibility:public"],
)

cc_library(
    name = "protobuf_headers",
    hdrs = HEADERS,
    linkopts = ["@PATH_TO_PROTOBUF@/lib/libprotobuf.so"],
    visibility = ["//visibility:public"],
)

cc_library(
    name = "protoc_lib",
    linkopts = ["@PATH_TO_PROTOBUF@/lib/libprotoc.so"],
    visibility = ["//visibility:public"],
)

genrule(
    name = "protoc",
    outs = ["protoc.bin"],
    cmd = "ln -s @PATH_TO_PROTOBUF@/bin/protoc $@",
    executable = 1,
    visibility = ["//visibility:public"],
)

This way I was thinking that everything would work but when I ran the build:

ERROR: .../tensorflow-1.13.1/tensorflow/core/BUILD:2460:1: ProtoCompile tensorflow/core/lib/core/error_codes.pb.cc failed (Exit 127): protoc.bin failed: error executing command 
  (cd /home/robin/.cache/bazel/_bazel_robin/c04a70144cd329180403af87e4cbdc44/execroot/org_tensorflow && \
  exec env - \
    PATH=/bin:/usr/bin \
  bazel-out/host/genfiles/external/protobuf_archive/protoc.bin '--cpp_out=bazel-out/host/genfiles/' -I. -Iexternal/protobuf_archive -Ibazel-out/host/genfiles/external/protobuf_archive tensorflow/core/lib/core/error_codes.proto)
Execution platform: @bazel_tools//platforms:host_platform
[32 / 203] 6 actions, 5 running
    Executing genrule @protobuf_archive//:link_headers [for host]; 0s local
    ProtoCompile .../core/lib/core/error_codes.pb.cc [for host]; 0s local
    Compiling tensorflow/core/platform/default/logging.cc [for host]; 0s local
    ProtoCompile tensorflow/core/example/example.pb.cc [for host]; 0s local
    Executing genrule @local_config_cuda//cuda:cuda-include; 0s local
    [-----] Writing file external/llvm/llvm-tblgen-2.params [for host]
bazel-out/host/genfiles/external/protobuf_archive/protoc.bin: error while loading shared libraries: libprotoc.so.18: cannot open shared object file: No such file or directory

Apparently protoc fails simply because the loader does not find libprotoc.

4) So the solution was trivial to me, simply setting the LD_LIBRARY_PATH adequately to automatically find libprotoc.so. Unfortunately none of the following solution works:

A) directly setting the LD_LIBRARY_PATH

export LD_LIBRARY_PATH=@PATH_TO_PROTOBUF@/lib
bazel build //tensorflow:tensorflow_cc.So

B) setting the LD_LIBRARY_PATH via .tf_configure.bazelrc:

build --action_env LD_LIBRARY_PATH="@PATH_TO_PROTOBUF@/lib"

The output is exactly the same as previously so my first remark is that LD_LIBRARY_PATH is not exported (as far as I understand). This can be explained because:

exec env - \
    PATH=/bin:/usr/bin \
bazel-out/host/genfiles/external/protobuf_archive/protoc.bin '--cpp_out=bazel-out/host/genfiles/' 

does not contains an expression like

LD_LIBRARY_PATH=@PATH_TO_PROTOBUF@/lib/ 

I googled for a long time without finding any solution to that problem (I tested many but nothing worked) ... maybe it is a limitation of the version of Bazel I used ? Unfortunately I cannot use a more recent version of Bazel simply because tensorflow 1.13.1 forbids it.

So now I do not know really well what to do ... I suppose the solution is to do some more modification into bazel project files of tensorflow...

Upvotes: 8

Views: 5141

Answers (2)

Robin Passama
Robin Passama

Reputation: 111

Hope the following answer can help someone:

Finally it appears that this is a problem that can be solved by modifying tensorflow bazel files. In the file tensorflow.bzl modify the function tf_generate_proto_text_sources this way:

def tf_generate_proto_text_sources(name, srcs_relative_dir, srcs, protodeps = [], deps = [], visibility = None):
    out_hdrs = (
        [
            p.replace(".proto", ".pb_text.h")
            for p in srcs
        ] + [p.replace(".proto", ".pb_text-impl.h") for p in srcs]
    )
    out_srcs = [p.replace(".proto", ".pb_text.cc") for p in srcs]
    native.genrule(
        name = name + "_srcs",
        srcs = srcs + protodeps + [clean_dep("//tensorflow/tools/proto_text:placeholder.txt")],
        outs = out_hdrs + out_srcs,
        visibility = visibility,
        cmd =
            "LD_LIBRARY_PATH=@CONFIG_LIBRARY_PATH@ " +
            "$(location //tensorflow/tools/proto_text:gen_proto_text_functions) " +
            "$(@D) " + srcs_relative_dir + " $(SRCS)",
        tools = [
            clean_dep("//tensorflow/tools/proto_text:gen_proto_text_functions"),
        ],
    )

    native.filegroup(
        name = name + "_hdrs",
        srcs = out_hdrs,
        visibility = visibility,
    )

    native.cc_library(
        name = name,
        srcs = out_srcs,
        hdrs = out_hdrs,
        visibility = visibility,
        deps = deps,
    )

Where @CONFIG_LIBRARY_PATH@ is a LD_LIBRARY_PATH value containing the path to the protobuf lib dir.

Upvotes: 2

Robin Passama
Robin Passama

Reputation: 111

For those who are interested I found a solution that is not so elegant but that seems to work:

1) writing a script call_proto.sh

export LD_LIBRARY_PATH=@TARGET_PROTOBUF_LIB_DIR@:$LD_LIBRARY_PATH
@TARGET_PROTOC_EXECUTABLE@ $@

replace @TARGET_PROTOBUF_LIB_DIR@ and @TARGET_PROTOC_EXECUTABLE@ with adequate values (library dir containing protoc library and the complete path to protoc executable).

2) from my previous example, in tensorflow-1.13.1/third_party/systemlibs/protobuf.BUILD replace:

genrule(
    name = "protoc",
    outs = ["protoc.bin"],
    cmd = "ln -s @PATH_TO_PROTOBUF@/bin/protoc $@",
    executable = 1,
    visibility = ["//visibility:public"],
)

by

genrule(
    name = "protoc",
    outs = ["protoc.bin"],
    cmd = "ln -s @PROTO_CALL_SCRIPT@ $@",
    executable = 1,
    visibility = ["//visibility:public"],
)

with @PROTO_CALL_SCRIPT@ the path to the previous script file...

This does solve the problem of passing the LD_LIBRARY_PATH to teh call to protoc...

Unfortunately, there is another problem that appears now:

ERROR: /home/robin/.cache/bazel/_bazel_robin/c04a70144cd329180403af87e4cbdc44/external/protobuf_archive/BUILD.bazel:44:1: declared output 'external/protobuf_archive/google/protobuf/any.pb.h' is a dangling symbolic link
[21 / 86] 7 actions, 6 running
    Executing genrule @protobuf_archive//:link_headers [for host]; 0s local
    Executing genrule @local_config_cuda//cuda:cuda-include; 0s local
    @com_google_absl//absl/base:dynamic_annotations; 0s local
    Executing genrule @local_config_cuda//cuda:cuda-lib [for host]; 0s local
    ProtoCompile tensorflow/core/example/example.pb.cc [for host]; 0s local
    ProtoCompile tensorflow/core/example/example.pb.cc; 0s local
    [-----] //tensorflow/cc:ops/candidate_sampling_ops_gen_cc
ERROR: /home/robin/.cache/bazel/_bazel_robin/c04a70144cd329180403af87e4cbdc44/external/protobuf_archive/BUILD.bazel:44:1: declared output 'external/protobuf_archive/google/protobuf/any.proto' is a dangling symbolic link
[21 / 89] 7 actions, 6 running
    Executing genrule @protobuf_archive//:link_headers [for host]; 0s local
    Executing genrule @local_config_cuda//cuda:cuda-include; 0s local
    @com_google_absl//absl/base:dynamic_annotations; 0s local
    Executing genrule @local_config_cuda//cuda:cuda-lib [for host]; 0s local
    ProtoCompile tensorflow/core/example/example.pb.cc [for host]; 0s local
    ProtoCompile tensorflow/core/example/example.pb.cc; 0s local
    [-----] //tensorflow/cc:ops/candidate_sampling_ops_gen_cc
ERROR: /home/robin/.cache/bazel/_bazel_robin/c04a70144cd329180403af87e4cbdc44/external/protobuf_archive/BUILD.bazel:44:1: declared output 'external/protobuf_archive/google/protobuf/arena.h' is a dangling symbolic link
[21 / 89] 7 actions, 6 running
...

Same error message is a dangling symbolic link appears for all header of protobuf.

Indeed in correcponding protobu_archive folder I have dangling symlinks like:

any.pb.h -> /usr/include/google/protobuf/any.pb.h

As far as I understand the problem comes from the genrule link_headers:

genrule(
    name = "link_headers",
    outs = HEADERS,
    cmd = """
      echo "OUTS=$(OUTS) include=$(INCLUDEDIR)"
      for i in $(OUTS); do
        f=$${i#$(@D)/}
        mkdir -p $(@D)/$${f%/*}
        ln -sf $(INCLUDEDIR)/$$f $(@D)/$$f
      done
    """,
)

due to INCLUDEDIR value (/usr/include) all generated symlinks are invalid.

The solution is to modify thios rule to make it point to a valid include folder:

genrule(
    name = "link_headers",
    outs = HEADERS,
    cmd = """
      for i in $(OUTS); do
        f=$${i#$(@D)/}
        mkdir -p $(@D)/$${f%/*}
        ln -sf @TARGET_PROTOBUF_INCLUDE@/$$f $(@D)/$$f
      done
    """,
)

with @TARGET_PROTOBUF_INCLUDE@ the path to protobuf include dir in filesystem... Now symlinks are correctly generated and the error of dangling symlinks vanishes.

I had error reporting that some header files of protobuf are unknown ... to solve this the solution was simply to generate the adequate value for HEADERS in protobuf.BUILD. I set the value of HEADERS to:

HEADERS = [
    "google/protobuf/any.h",
    "google/protobuf/any.pb.h",
    "google/protobuf/any.proto",
    "google/protobuf/api.pb.h",
    "google/protobuf/api.proto",
    "google/protobuf/arena.h",
    "google/protobuf/arena_impl.h",
    "google/protobuf/arenastring.h",
    "google/protobuf/compiler/code_generator.h",
    "google/protobuf/compiler/command_line_interface.h",
    "google/protobuf/compiler/cpp/cpp_generator.h",
    "google/protobuf/compiler/csharp/csharp_generator.h",
    "google/protobuf/compiler/csharp/csharp_names.h",
    "google/protobuf/compiler/importer.h",
    "google/protobuf/compiler/java/java_generator.h",
    "google/protobuf/compiler/java/java_names.h",
    "google/protobuf/compiler/js/js_generator.h",
    "google/protobuf/compiler/js/well_known_types_embed.h",
    "google/protobuf/compiler/objectivec/objectivec_generator.h",
    "google/protobuf/compiler/objectivec/objectivec_helpers.h",
    "google/protobuf/compiler/parser.h",
    "google/protobuf/compiler/php/php_generator.h",
    "google/protobuf/compiler/plugin.h",
    "google/protobuf/compiler/plugin.pb.h",
    "google/protobuf/compiler/plugin.proto",
    "google/protobuf/compiler/python/python_generator.h",
    "google/protobuf/compiler/ruby/ruby_generator.h",
    "google/protobuf/descriptor.h",
    "google/protobuf/descriptor.pb.h",
    "google/protobuf/descriptor.proto",
    "google/protobuf/descriptor_database.h",
    "google/protobuf/duration.pb.h",
    "google/protobuf/duration.proto",
    "google/protobuf/dynamic_message.h",
    "google/protobuf/empty.pb.h",
    "google/protobuf/empty.proto",
    "google/protobuf/extension_set.h",
    "google/protobuf/extension_set_inl.h",
    "google/protobuf/field_mask.pb.h",
    "google/protobuf/field_mask.proto",
    "google/protobuf/generated_enum_reflection.h",
    "google/protobuf/generated_enum_util.h",
    "google/protobuf/generated_message_reflection.h",
    "google/protobuf/generated_message_table_driven.h",
    "google/protobuf/generated_message_util.h",
    "google/protobuf/has_bits.h",
    "google/protobuf/implicit_weak_message.h",
    "google/protobuf/inlined_string_field.h",
    "google/protobuf/io/coded_stream.h",
    "google/protobuf/io/gzip_stream.h",
    "google/protobuf/io/printer.h",
    "google/protobuf/io/strtod.h",
    "google/protobuf/io/tokenizer.h",
    "google/protobuf/io/zero_copy_stream.h",
    "google/protobuf/io/zero_copy_stream_impl.h",
    "google/protobuf/io/zero_copy_stream_impl_lite.h",
    "google/protobuf/map.h",
    "google/protobuf/map_entry.h",
    "google/protobuf/map_entry_lite.h",
    "google/protobuf/map_field.h",
    "google/protobuf/map_field_inl.h",
    "google/protobuf/map_field_lite.h",
    "google/protobuf/map_type_handler.h",
    "google/protobuf/message.h",
    "google/protobuf/message_lite.h",
    "google/protobuf/metadata.h",
    "google/protobuf/metadata_lite.h",
    "google/protobuf/parse_context.h",
    "google/protobuf/port.h",
    "google/protobuf/port_def.inc",
    "google/protobuf/port_undef.inc",
    "google/protobuf/reflection.h",
    "google/protobuf/reflection_ops.h",
    "google/protobuf/repeated_field.h",
    "google/protobuf/service.h",
    "google/protobuf/source_context.pb.h",
    "google/protobuf/source_context.proto",
    "google/protobuf/struct.pb.h",
    "google/protobuf/struct.proto",
    "google/protobuf/stubs/bytestream.h",
    "google/protobuf/stubs/callback.h",
    "google/protobuf/stubs/casts.h",
    "google/protobuf/stubs/common.h",
    "google/protobuf/stubs/fastmem.h",
    "google/protobuf/stubs/hash.h",
    "google/protobuf/stubs/logging.h",
    "google/protobuf/stubs/macros.h",
    "google/protobuf/stubs/mutex.h",
    "google/protobuf/stubs/once.h",
    "google/protobuf/stubs/platform_macros.h",
    "google/protobuf/stubs/port.h",
    "google/protobuf/stubs/status.h",
    "google/protobuf/stubs/stl_util.h",
    "google/protobuf/stubs/stringpiece.h",
    "google/protobuf/stubs/strutil.h",
    "google/protobuf/stubs/template_util.h",
    "google/protobuf/text_format.h",
    "google/protobuf/timestamp.pb.h",
    "google/protobuf/timestamp.proto",
    "google/protobuf/type.pb.h",
    "google/protobuf/type.proto",
    "google/protobuf/unknown_field_set.h",
    "google/protobuf/util/delimited_message_util.h",
    "google/protobuf/util/field_comparator.h",
    "google/protobuf/util/field_mask_util.h",
    "google/protobuf/util/json_util.h",
    "google/protobuf/util/message_differencer.h",
    "google/protobuf/util/time_util.h",
    "google/protobuf/util/type_resolver.h",
    "google/protobuf/util/type_resolver_util.h",
    "google/protobuf/wire_format.h",
    "google/protobuf/wire_format_lite.h",
    "google/protobuf/wire_format_lite_inl.h",
    "google/protobuf/wrappers.pb.h",
    "google/protobuf/wrappers.proto",
]

This is simply the list of files contained in protobuf include dir. After a check I can now say that all symlinks for my specific protobuf install have been put into bazel-genfiles/external/protobuf_archive.

I was very confident at that point but probably too much since I have a new error:

ERROR: .../tensorflow-1.13.1/tensorflow/stream_executor/BUILD:18:1: C++ compilation of rule '//tensorflow/stream_executor:dnn_proto_cc_impl' failed (Exit 1): crosstool_wrapper_driver_is_not_gcc failed: error executing command 
  (cd /home/robin/.cache/bazel/_bazel_robin/c04a70144cd329180403af87e4cbdc44/execroot/org_tensorflow && \
  exec env - \
    PATH=/bin:/usr/bin \
    PWD=/proc/self/cwd \
  external/local_config_cuda/crosstool/clang/bin/crosstool_wrapper_driver_is_not_gcc -MD -MF bazel-out/host/bin/tensorflow/stream_executor/_objs/dnn_proto_cc_impl/dnn.pb.pic.d '-frandom-seed=bazel-out/host/bin/tensorflow/stream_executor/_objs/dnn_proto_cc_impl/dnn.pb.pic.o' -iquote . -iquote bazel-out/host/genfiles -iquote bazel-out/host/bin -iquote external/protobuf_archive -iquote bazel-out/host/genfiles/external/protobuf_archive -iquote bazel-out/host/bin/external/protobuf_archive '-std=c++11' -Wno-builtin-macro-redefined '-D__DATE__="redacted"' '-D__TIMESTAMP__="redacted"' '-D__TIME__="redacted"' -fPIC -U_FORTIFY_SOURCE '-D_FORTIFY_SOURCE=1' -fstack-protector -Wall -fno-omit-frame-pointer -no-canonical-prefixes -fno-canonical-system-headers -DNDEBUG -g0 -O2 -ffunction-sections -fdata-sections -g0 '-march=native' -g0 -Wno-unknown-warning-option -Wno-unused-but-set-variable -Wno-sign-compare -c bazel-out/host/genfiles/tensorflow/stream_executor/dnn.pb.cc -o bazel-out/host/bin/tensorflow/stream_executor/_objs/dnn_proto_cc_impl/dnn.pb.pic.o)
Execution platform: @bazel_tools//platforms:host_platform
[255 / 752] 9 actions running
    @local_config_cuda//cuda:cuda-include; 5s local
    @com_google_absl//absl/base:base; 0s local
    Compiling tensorflow/stream_executor/dnn.pb.cc [for host]; 0s local
    Executing genrule @jpeg//:simd_x86_64_assemblage23 [for host]; 0s local
    Compiling .../costs/op_performance_data.pb.cc [for host]; 0s local
    Compiling .../core/protobuf/transport_options.pb.cc [for host]; 0s local
    Compiling .../core/protobuf/rewriter_config.pb.cc [for host]; 0s local
    Compiling tensorflow/core/framework/types.pb.cc [for host]; 0s local ...
In file included from bazel-out/host/genfiles/tensorflow/stream_executor/dnn.pb.cc:4:0:
bazel-out/host/genfiles/tensorflow/stream_executor/dnn.pb.h:10:10: fatal error: google/protobuf/port_def.inc: No such file or directory
 #include <google/protobuf/port_def.inc>
          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.

Again a problem of inclusion but not in same target. This time I really do not understand what's going on. Indeed there is the option -iquote bazel-out/host/genfiles/external/protobuf_archive passed to the call and corresponding folder trully contains the previously generated symlink at google/protobuf/port_def.inc.

I presume that the problem comes from the -iquote flag passed to the compiler. It should be -I instead, shouldn't it ? How can I solve this issue ?

---- EDIT ----

Solution was to add the include directive for include folder like this:

cc_library(
    name = "protobuf",
    hdrs = HEADERS,
    includes = ["."],
    linkopts = ["@TARGET_PROTOBUF_LIB@"],
    visibility = ["//visibility:public"],
)

cc_library(
    name = "protobuf_headers",
    hdrs = HEADERS,
    includes = ["."],
    linkopts = ["@TARGET_PROTOBUF_LIB@"],
    visibility = ["//visibility:public"],
)

Remark: apparently using includes = ["."], is an anti pattern according to bazel doc but in that's the only thing I found to make it work...

Finally I fall back to the first error:

ERROR: /home/robin/soft/PID/pid-workspace/wrappers/tensorflow/build/1.13.1/tensorflow-1.13.1/tensorflow/core/BUILD:2489:1: Executing genrule //tensorflow/core:protos_all_proto_text_srcs failed (Exit 127): bash failed: error executing command 
  (cd /home/robin/.cache/bazel/_bazel_robin/c04a70144cd329180403af87e4cbdc44/execroot/org_tensorflow && \
  exec env - \
    PATH=/bin:/usr/bin \
  /bin/bash -c 'source external/bazel_tools/tools/genrule/genrule-setup.sh; bazel-out/host/bin/tensorflow/tools/proto_text/gen_proto_text_functions bazel-out/host/genfiles/tensorflow/core tensorflow/core/ tensorflow/core/example/example.proto tensorflow/core/example/feature.proto tensorflow/core/framework/allocation_description.proto tensorflow/core/framework/api_def.proto tensorflow/core/framework/attr_value.proto tensorflow/core/framework/cost_graph.proto tensorflow/core/framework/device_attributes.proto tensorflow/core/framework/function.proto tensorflow/core/framework/graph.proto tensorflow/core/framework/graph_transfer_info.proto tensorflow/core/framework/iterator.proto tensorflow/core/framework/kernel_def.proto tensorflow/core/framework/log_memory.proto tensorflow/core/framework/node_def.proto tensorflow/core/framework/op_def.proto tensorflow/core/framework/reader_base.proto tensorflow/core/framework/remote_fused_graph_execute_info.proto tensorflow/core/framework/resource_handle.proto tensorflow/core/framework/step_stats.proto tensorflow/core/framework/summary.proto tensorflow/core/framework/tensor.proto tensorflow/core/framework/tensor_description.proto tensorflow/core/framework/tensor_shape.proto tensorflow/core/framework/tensor_slice.proto tensorflow/core/framework/types.proto tensorflow/core/framework/variable.proto tensorflow/core/framework/versions.proto tensorflow/core/protobuf/config.proto tensorflow/core/protobuf/cluster.proto tensorflow/core/protobuf/debug.proto tensorflow/core/protobuf/device_properties.proto tensorflow/core/protobuf/queue_runner.proto tensorflow/core/protobuf/rewriter_config.proto tensorflow/core/protobuf/tensor_bundle.proto tensorflow/core/protobuf/saver.proto tensorflow/core/util/event.proto tensorflow/core/util/memmapped_file_system.proto tensorflow/core/util/saved_tensor_slice.proto tensorflow/core/lib/core/error_codes.proto tensorflow/tools/proto_text/placeholder.txt')
Execution platform: @bazel_tools//platforms:host_platform
[834 / 1,712] 9 actions running
    @com_google_absl//absl/strings:strings; 1s local
    @com_google_absl//absl/strings:strings; 0s local
    @com_google_absl//absl/strings:strings; 0s local
    @com_google_absl//absl/types:optional; 0s local
    @com_google_absl//absl/types:optional; 0s local
    @com_google_absl//absl/strings:strings; 0s local
    Executing genrule //tensorflow/core:protos_all_proto_text_srcs; 0s local
    //tensorflow/core:protos_all_proto_text_srcs; 0s local ...
bazel-out/host/bin/tensorflow/tools/proto_text/gen_proto_text_functions: error while loading shared libraries: libprotobuf.so.18: cannot open shared object file: No such file or directory

Reason is the same as in first time: no LD_LIBRARY_PATH given to the command. But that time I do not know which file I should modify to do this... More generally I am afraid that this situation will appear any time an executable using libprotobuf/libprotoc is called by the build process. So my question: Is there a way to solve this problem (passing LD_LIBRARY_PATH to environment) once and for all for any target by modifiying one or more file in tensorflow project ? Or is it a problem internal to bazel ?

Upvotes: 1

Related Questions