Adds a Bazel BUILD for LLVM.
Change: 139938302
This commit is contained in:
parent
e30933420a
commit
b523c97794
@ -193,6 +193,16 @@ def tf_workspace(path_prefix = "", tf_repo_name = ""):
|
|||||||
build_file = str(Label("//:linenoise.BUILD")),
|
build_file = str(Label("//:linenoise.BUILD")),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# TODO(phawkins): currently, this rule uses an unofficial LLVM mirror.
|
||||||
|
# Switch to an official source of snapshots if/when possible.
|
||||||
|
native.new_http_archive(
|
||||||
|
name = "llvm",
|
||||||
|
url = "http://github.com/llvm-mirror/llvm/archive/ad27fdae895df1b9ad11a93102de6622f63e1220.tar.gz",
|
||||||
|
sha256 = "ce7abf076586f2ef13dcd1c4e7ba13604a0826a0f44fe0a6faceeb9bdffc8544",
|
||||||
|
strip_prefix = "llvm-ad27fdae895df1b9ad11a93102de6622f63e1220",
|
||||||
|
build_file = str(Label("//third_party/llvm:llvm.BUILD")),
|
||||||
|
)
|
||||||
|
|
||||||
native.new_http_archive(
|
native.new_http_archive(
|
||||||
name = "jsoncpp_git",
|
name = "jsoncpp_git",
|
||||||
url = "http://github.com/open-source-parsers/jsoncpp/archive/11086dd6a7eba04289944367ca82cea71299ed70.tar.gz",
|
url = "http://github.com/open-source-parsers/jsoncpp/archive/11086dd6a7eba04289944367ca82cea71299ed70.tar.gz",
|
||||||
|
7
third_party/llvm/BUILD
vendored
Normal file
7
third_party/llvm/BUILD
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
licenses(["notice"])
|
||||||
|
|
||||||
|
py_binary(
|
||||||
|
name = "expand_cmake_vars",
|
||||||
|
srcs = ["expand_cmake_vars.py"],
|
||||||
|
visibility = ["@llvm//:__subpackages__"],
|
||||||
|
)
|
88
third_party/llvm/expand_cmake_vars.py"
vendored
Normal file
88
third_party/llvm/expand_cmake_vars.py"
vendored
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
# Copyright 2016 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.
|
||||||
|
# ==============================================================================
|
||||||
|
|
||||||
|
"""Expands CMake variables in a text file."""
|
||||||
|
|
||||||
|
from __future__ import absolute_import
|
||||||
|
from __future__ import division
|
||||||
|
from __future__ import print_function
|
||||||
|
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
|
||||||
|
_CMAKE_DEFINE_REGEX = re.compile(r"\s*#cmakedefine\s+([A-Za-z_0-9]*)(\s.*)?$")
|
||||||
|
_CMAKE_DEFINE01_REGEX = re.compile(r"\s*#cmakedefine01\s+([A-Za-z_0-9]*)")
|
||||||
|
_CMAKE_VAR_REGEX = re.compile(r"\${([A-Za-z_0-9]*)}")
|
||||||
|
|
||||||
|
|
||||||
|
def _parse_args(argv):
|
||||||
|
"""Parses arguments with the form KEY=VALUE into a dictionary."""
|
||||||
|
result = {}
|
||||||
|
for arg in argv:
|
||||||
|
k, v = arg.split("=")
|
||||||
|
result[k] = v
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def _expand_variables(input_str, cmake_vars):
|
||||||
|
"""Expands ${VARIABLE}s in 'input_str', using dictionary 'cmake_vars'.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
input_str: the string containing ${VARIABLE} expressions to expand.
|
||||||
|
cmake_vars: a dictionary mapping variable names to their values.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The expanded string.
|
||||||
|
"""
|
||||||
|
def replace(match):
|
||||||
|
if cmake_vars.has_key(match.group(1)):
|
||||||
|
return cmake_vars[match.group(1)]
|
||||||
|
return ""
|
||||||
|
return _CMAKE_VAR_REGEX.sub(replace, input_str)
|
||||||
|
|
||||||
|
|
||||||
|
def _expand_cmakedefines(line, cmake_vars):
|
||||||
|
"""Expands #cmakedefine declarations, using a dictionary 'cmake_vars'."""
|
||||||
|
|
||||||
|
# Handles #cmakedefine lines
|
||||||
|
match = _CMAKE_DEFINE_REGEX.match(line)
|
||||||
|
if match:
|
||||||
|
name = match.group(1)
|
||||||
|
suffix = match.group(2) or ""
|
||||||
|
if name in cmake_vars:
|
||||||
|
return "#define {}{}\n".format(name,
|
||||||
|
_expand_variables(suffix, cmake_vars))
|
||||||
|
else:
|
||||||
|
return "/* #undef {} */\n".format(name)
|
||||||
|
|
||||||
|
# Handles #cmakedefine01 lines
|
||||||
|
match = _CMAKE_DEFINE01_REGEX.match(line)
|
||||||
|
if match:
|
||||||
|
name = match.group(1)
|
||||||
|
value = cmake_vars.get(name, "0")
|
||||||
|
return "#define {} {}\n".format(name, value)
|
||||||
|
|
||||||
|
# Otherwise return the line unchanged.
|
||||||
|
return _expand_variables(line, cmake_vars)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
cmake_vars = _parse_args(sys.argv[1:])
|
||||||
|
for line in sys.stdin:
|
||||||
|
sys.stdout.write(_expand_cmakedefines(line, cmake_vars))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
1908
third_party/llvm/llvm.BUILD
vendored
Normal file
1908
third_party/llvm/llvm.BUILD
vendored
Normal file
File diff suppressed because it is too large
Load Diff
149
third_party/llvm/llvm.bzl
vendored
Normal file
149
third_party/llvm/llvm.bzl
vendored
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
"""This file contains BUILD extensions for generating source code from LLVM's table definition files using the TableGen tool.
|
||||||
|
|
||||||
|
See http://llvm.org/cmds/tblgen.html for more information on the TableGen
|
||||||
|
tool.
|
||||||
|
TODO(chandlerc): Currently this expresses include-based dependencies as
|
||||||
|
"sources", and has no transitive understanding due to these files not being
|
||||||
|
correctly understood by the build system.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def gentbl(name, tblgen, td_file, td_srcs, tbl_outs, library = True, **kwargs):
|
||||||
|
"""gentbl() generates tabular code from a table definition file.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
name: The name of the build rule for use in dependencies.
|
||||||
|
tblgen: The binary used to produce the output.
|
||||||
|
td_file: The primary table definitions file.
|
||||||
|
td_srcs: A list of table definition files included transitively.
|
||||||
|
tbl_outs: A list of tuples (opts, out), where each opts is a string of
|
||||||
|
options passed to tblgen, and the out is the corresponding output file
|
||||||
|
produced.
|
||||||
|
library: Whether to bundle the generated files into a library.
|
||||||
|
**kwargs: Keyword arguments to pass to subsidiary cc_library() rule.
|
||||||
|
"""
|
||||||
|
if td_file not in td_srcs:
|
||||||
|
td_srcs += [td_file]
|
||||||
|
includes = []
|
||||||
|
for (opts, out) in tbl_outs:
|
||||||
|
outdir = out[:out.rindex("/")]
|
||||||
|
if outdir not in includes:
|
||||||
|
includes.append(outdir)
|
||||||
|
rule_suffix = "_".join(opts.replace("-", "_").replace("=", "_").split(" "))
|
||||||
|
native.genrule(
|
||||||
|
name="%s_%s_genrule" % (name, rule_suffix),
|
||||||
|
srcs=td_srcs,
|
||||||
|
outs=[out],
|
||||||
|
tools=[tblgen],
|
||||||
|
message="Generating code from table: %s" % td_file,
|
||||||
|
cmd=(("$(location %s) " + "-I external/llvm/include " +
|
||||||
|
"-I external/llvm/tools/clang/include " +
|
||||||
|
"-I $$(dirname $(location %s)) " + "%s $(location %s) -o $@") % (
|
||||||
|
tblgen, td_file, opts, td_file)))
|
||||||
|
# For now, all generated files can be assumed to comprise public interfaces.
|
||||||
|
# If this is not true, you should specify library = False
|
||||||
|
# and list the generated '.inc' files in "srcs".
|
||||||
|
if library:
|
||||||
|
native.cc_library(name=name, textual_hdrs=[f for (_, f) in tbl_outs],
|
||||||
|
includes=includes, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
# Rule for simple expansion of template files. This performs a simple
|
||||||
|
# search over the template file for the keys in substitutions,
|
||||||
|
# and replaces them with the corresponding values.
|
||||||
|
#
|
||||||
|
# Typical usage:
|
||||||
|
# load("/tools/build_rules/expand_header_template", "expand_header_template")
|
||||||
|
# expand_header_template(
|
||||||
|
# name = "ExpandMyTemplate",
|
||||||
|
# template = "my.template",
|
||||||
|
# out = "my.txt",
|
||||||
|
# substitutions = {
|
||||||
|
# "$VAR1": "foo",
|
||||||
|
# "$VAR2": "bar",
|
||||||
|
# }
|
||||||
|
# )
|
||||||
|
#
|
||||||
|
# Args:
|
||||||
|
# name: The name of the rule.
|
||||||
|
# template: The template file to expand
|
||||||
|
# out: The destination of the expanded file
|
||||||
|
# substitutions: A dictionary mapping strings to their substitutions
|
||||||
|
|
||||||
|
def expand_header_template_impl(ctx):
|
||||||
|
ctx.template_action(
|
||||||
|
template = ctx.file.template,
|
||||||
|
output = ctx.outputs.out,
|
||||||
|
substitutions = ctx.attr.substitutions,
|
||||||
|
)
|
||||||
|
|
||||||
|
expand_header_template = rule(
|
||||||
|
implementation = expand_header_template_impl,
|
||||||
|
attrs = {
|
||||||
|
"template": attr.label(mandatory=True, allow_files=True, single_file=True),
|
||||||
|
"substitutions": attr.string_dict(mandatory=True),
|
||||||
|
"out": attr.output(mandatory=True),
|
||||||
|
},
|
||||||
|
# output_to_genfiles is required for header files.
|
||||||
|
output_to_genfiles = True,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def llvm_target_cmake_vars(native_arch, target_triple):
|
||||||
|
return {
|
||||||
|
"LLVM_HOST_TRIPLE": target_triple,
|
||||||
|
"LLVM_DEFAULT_TARGET_TRIPLE": target_triple,
|
||||||
|
"LLVM_NATIVE_ARCH": native_arch,
|
||||||
|
}
|
||||||
|
|
||||||
|
def _quote(s):
|
||||||
|
"""Quotes the given string for use in a shell command.
|
||||||
|
|
||||||
|
This function double-quotes the given string (in case it contains spaces or
|
||||||
|
other special characters) and escapes any special characters (dollar signs,
|
||||||
|
double-quotes, and backslashes) that may be present.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
s: The string to quote.
|
||||||
|
Returns:
|
||||||
|
An escaped and quoted version of the string that can be passed to a shell
|
||||||
|
command.
|
||||||
|
"""
|
||||||
|
return ('"' +
|
||||||
|
s.replace("\\", "\\\\").replace("$", "\\$").replace('"', '\\"') +
|
||||||
|
'"')
|
||||||
|
|
||||||
|
def cmake_var_string(cmake_vars):
|
||||||
|
"""Converts a dictionary to an input suitable for expand_cmake_vars.
|
||||||
|
|
||||||
|
Ideally we would jist stringify in the expand_cmake_vars() rule, but select()
|
||||||
|
interacts badly with genrules.
|
||||||
|
|
||||||
|
TODO(phawkins): replace the genrule() with native rule and delete this rule.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
cmake_vars: a dictionary with string keys and values that are convertable to
|
||||||
|
strings.
|
||||||
|
"""
|
||||||
|
return " ".join([_quote("{}={}".format(k, str(v)))
|
||||||
|
for (k, v) in cmake_vars.items()])
|
||||||
|
|
||||||
|
def expand_cmake_vars(name, src, dst, cmake_vars):
|
||||||
|
"""Expands #cmakedefine, #cmakedefine01, and CMake variables in a text file.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
name: the name of the rule
|
||||||
|
src: the input of the rule
|
||||||
|
dst: the output of the rule
|
||||||
|
cmake_vars: a string containing the CMake variables, as generated by
|
||||||
|
cmake_var_string.
|
||||||
|
"""
|
||||||
|
expand_cmake_vars_tool = "@//third_party/llvm:expand_cmake_vars"
|
||||||
|
native.genrule(
|
||||||
|
name = name,
|
||||||
|
srcs = [src],
|
||||||
|
tools = [expand_cmake_vars_tool],
|
||||||
|
outs = [dst],
|
||||||
|
cmd = ("$(location {}) ".format(expand_cmake_vars_tool) + cmake_vars +
|
||||||
|
"< $< > $@")
|
||||||
|
)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user