Add an automatically-generated "tensorflow.python.platform.build_info" script.
The motivation for this script is to provide better tools for diagnosing load-time errors (such as the ones that plague the Windows build due to DLL issues). Note that the script is intended to be self-contained, so that it is possible to import it without loading the entire TensorFlow runtime. This generated script currently contains a single symbol, `is_cuda_build`, which records whether the build has GPU support or not. PiperOrigin-RevId: 168471034
This commit is contained in:
parent
c3b86347f2
commit
59bdf598d2
@ -413,6 +413,7 @@ filegroup(
|
||||
"//tensorflow/tools/api/golden:all_files",
|
||||
"//tensorflow/tools/api/lib:all_files",
|
||||
"//tensorflow/tools/api/tests:all_files",
|
||||
"//tensorflow/tools/build_info:all_files",
|
||||
"//tensorflow/tools/common:all_files",
|
||||
"//tensorflow/tools/compatibility:all_files",
|
||||
"//tensorflow/tools/dist_test/server:all_files",
|
||||
|
@ -624,6 +624,16 @@ add_python_module("tensorflow/contrib/reduce_slice_ops/python")
|
||||
add_python_module("tensorflow/contrib/reduce_slice_ops/python/kernel_tests")
|
||||
add_python_module("tensorflow/contrib/reduce_slice_ops/python/ops")
|
||||
|
||||
# Generate the tensorflow.python.platform.build_info module.
|
||||
set(BUILD_INFO_PY "${CMAKE_CURRENT_BINARY_DIR}/tf_python/tensorflow/python/platform/build_info.py")
|
||||
if(tensorflow_ENABLE_GPU)
|
||||
set(BUILD_CONFIG_STRING "cuda")
|
||||
else(tensorflow_ENABLE_GPU)
|
||||
set(BUILD_CONFIG_STRING "cpu")
|
||||
endif(tensorflow_ENABLE_GPU)
|
||||
add_custom_command(TARGET tf_python_copy_scripts_to_destination PRE_BUILD
|
||||
COMMAND ${PYTHON_EXECUTABLE} ${tensorflow_source_dir}/tensorflow/tools/build_info/gen_build_info.py --build_config ${BUILD_CONFIG_STRING} --raw_generate ${BUILD_INFO_PY})
|
||||
|
||||
|
||||
########################################################
|
||||
# tf_python_op_gen_main library
|
||||
@ -1173,3 +1183,4 @@ else()
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/tf_python)
|
||||
endif(${tensorflow_ENABLE_GPU})
|
||||
endif(${tensorflow_TF_NIGHTLY})
|
||||
|
||||
|
@ -145,6 +145,7 @@ if (tensorflow_BUILD_PYTHON_TESTS)
|
||||
"${tensorflow_source_dir}/tensorflow/contrib/estimator/python/estimator/*_test.py"
|
||||
"${tensorflow_source_dir}/tensorflow/python/kernel_tests/*.py"
|
||||
"${tensorflow_source_dir}/tensorflow/python/meta_graph_transform/*_test.py"
|
||||
"${tensorflow_source_dir}/tensorflow/python/platform/build_info_test.py"
|
||||
"${tensorflow_source_dir}/tensorflow/python/profiler/*_test.py"
|
||||
"${tensorflow_source_dir}/tensorflow/python/profiler/internal/*_test.py"
|
||||
"${tensorflow_source_dir}/tensorflow/python/saved_model/*_test.py"
|
||||
|
@ -19,6 +19,7 @@ load("//tensorflow:tensorflow.bzl", "tf_gen_op_wrapper_py")
|
||||
load("//tensorflow:tensorflow.bzl", "py_test")
|
||||
load("//tensorflow:tensorflow.bzl", "tf_py_test")
|
||||
load("//tensorflow:tensorflow.bzl", "py_tests")
|
||||
load("//tensorflow:tensorflow.bzl", "tf_py_build_info_genrule")
|
||||
load("//tensorflow:tensorflow.bzl", "tf_py_wrap_cc")
|
||||
load("//tensorflow:tensorflow.bzl", "cuda_py_test")
|
||||
load("//tensorflow:tensorflow.bzl", "cuda_py_tests")
|
||||
@ -100,15 +101,19 @@ py_library(
|
||||
]),
|
||||
)
|
||||
|
||||
tf_py_build_info_genrule()
|
||||
|
||||
py_library(
|
||||
name = "platform",
|
||||
srcs = glob(
|
||||
["platform/*.py"],
|
||||
[
|
||||
"platform/*.py",
|
||||
],
|
||||
exclude = [
|
||||
"**/*test.py",
|
||||
"**/benchmark.py", # In platform_benchmark.
|
||||
],
|
||||
),
|
||||
) + ["platform/build_info.py"],
|
||||
srcs_version = "PY2AND3",
|
||||
deps = [
|
||||
":lib",
|
||||
@ -806,6 +811,22 @@ py_test(
|
||||
],
|
||||
)
|
||||
|
||||
py_test(
|
||||
name = "build_info_test",
|
||||
size = "small",
|
||||
srcs = [
|
||||
"platform/build_info.py",
|
||||
"platform/build_info_test.py",
|
||||
],
|
||||
main = "platform/build_info_test.py",
|
||||
srcs_version = "PY2AND3",
|
||||
tags = ["notap"],
|
||||
deps = [
|
||||
":client_testlib",
|
||||
":platform",
|
||||
],
|
||||
)
|
||||
|
||||
py_test(
|
||||
name = "proto_test",
|
||||
size = "small",
|
||||
|
32
tensorflow/python/platform/build_info_test.py
Normal file
32
tensorflow/python/platform/build_info_test.py
Normal file
@ -0,0 +1,32 @@
|
||||
# Copyright 2015 The TensorFlow Authors. All Rights Reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
# ==============================================================================
|
||||
"""Test for the generated build_info script."""
|
||||
|
||||
from __future__ import absolute_import
|
||||
from __future__ import division
|
||||
from __future__ import print_function
|
||||
|
||||
from tensorflow.python.platform import build_info
|
||||
from tensorflow.python.platform import test
|
||||
|
||||
|
||||
class BuildInfoTest(test.TestCase):
|
||||
|
||||
def testBuildInfo(self):
|
||||
self.assertEqual(build_info.is_cuda_build, test.is_built_with_cuda())
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
test.main()
|
@ -1294,6 +1294,16 @@ def tf_version_info_genrule():
|
||||
tools=[clean_dep("//tensorflow/tools/git:gen_git_source.py")],)
|
||||
|
||||
|
||||
def tf_py_build_info_genrule():
|
||||
native.genrule(
|
||||
name="py_build_info_gen",
|
||||
outs=["platform/build_info.py"],
|
||||
cmd=
|
||||
"$(location //tensorflow/tools/build_info:gen_build_info.py) --raw_generate \"$@\" --build_config " + if_cuda("cuda", "cpu"),
|
||||
local=1,
|
||||
tools=[clean_dep("//tensorflow/tools/build_info:gen_build_info.py")],)
|
||||
|
||||
|
||||
def cc_library_with_android_deps(deps,
|
||||
android_deps=[],
|
||||
common_deps=[],
|
||||
|
26
tensorflow/tools/build_info/BUILD
Normal file
26
tensorflow/tools/build_info/BUILD
Normal file
@ -0,0 +1,26 @@
|
||||
# Description:
|
||||
# Contains script to generate tensorflow/python/platform/build_info.py
|
||||
package(default_visibility = ["//tensorflow:internal"])
|
||||
|
||||
licenses(["notice"]) # Apache 2.0
|
||||
|
||||
exports_files(
|
||||
glob(["gen/*"]) + [
|
||||
"gen_build_info.py",
|
||||
],
|
||||
)
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Google-internal targets. These must be at the end for syncrepo.
|
||||
|
||||
filegroup(
|
||||
name = "all_files",
|
||||
srcs = glob(
|
||||
["**/*"],
|
||||
exclude = [
|
||||
"**/METADATA",
|
||||
"**/OWNERS",
|
||||
],
|
||||
),
|
||||
visibility = ["//tensorflow:__subpackages__"],
|
||||
)
|
77
tensorflow/tools/build_info/gen_build_info.py
Executable file
77
tensorflow/tools/build_info/gen_build_info.py
Executable file
@ -0,0 +1,77 @@
|
||||
#!/usr/bin/env python
|
||||
# Copyright 2017 The TensorFlow Authors. All Rights Reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
# ==============================================================================
|
||||
"""Generates a Python module containing information about the build."""
|
||||
from __future__ import absolute_import
|
||||
from __future__ import division
|
||||
from __future__ import print_function
|
||||
import argparse
|
||||
|
||||
|
||||
def write_build_info(filename, build_config):
|
||||
"""Writes a Python that describes the build.
|
||||
|
||||
Args:
|
||||
filename: filename to write to.
|
||||
build_config: A string containinggit_version: the result of a git describe.
|
||||
"""
|
||||
module_docstring = "\"\"\"Generates a Python module containing information "
|
||||
module_docstring += "about the build.\"\"\""
|
||||
if build_config == "cuda":
|
||||
build_config_bool = "True"
|
||||
else:
|
||||
build_config_bool = "False"
|
||||
|
||||
contents = """
|
||||
# Copyright 2017 The TensorFlow Authors. All Rights Reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
# ==============================================================================
|
||||
%s
|
||||
from __future__ import absolute_import
|
||||
from __future__ import division
|
||||
from __future__ import print_function
|
||||
|
||||
is_cuda_build = %s
|
||||
""" % (module_docstring, build_config_bool)
|
||||
open(filename, "w").write(contents)
|
||||
|
||||
|
||||
parser = argparse.ArgumentParser(
|
||||
description="""Build info injection into the PIP package.""")
|
||||
|
||||
parser.add_argument(
|
||||
"--build_config",
|
||||
type=str,
|
||||
help="Either 'cuda' for GPU builds or 'cpu' for CPU builds.")
|
||||
|
||||
parser.add_argument("--raw_generate", type=str, help="Generate build_info.py")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.raw_generate is not None and args.build_config is not None:
|
||||
write_build_info(args.raw_generate, args.build_config)
|
||||
else:
|
||||
raise RuntimeError("--raw_generate and --build_config must be used")
|
Loading…
Reference in New Issue
Block a user