aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools/build_defs/d/d.bzl
diff options
context:
space:
mode:
Diffstat (limited to 'tools/build_defs/d/d.bzl')
-rw-r--r--tools/build_defs/d/d.bzl534
1 files changed, 0 insertions, 534 deletions
diff --git a/tools/build_defs/d/d.bzl b/tools/build_defs/d/d.bzl
deleted file mode 100644
index 9e8164a0fe..0000000000
--- a/tools/build_defs/d/d.bzl
+++ /dev/null
@@ -1,534 +0,0 @@
-# Copyright 2015 The Bazel 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.
-
-"""D rules for Bazel."""
-
-load("//tools/build_rules:deprecation.bzl", "deprecated")
-
-def warning(rule):
- print(deprecated(
- "d",
- rule,
- "@bazel_tools//tools/build_defs/d:d.bzl",
- "@io_bazel_rules_d//d:d.bzl"))
-
-A_FILETYPE = FileType([".a"])
-
-D_FILETYPE = FileType([
- ".d",
- ".di",
-])
-
-ZIP_PATH = "/usr/bin/zip"
-
-def _relative(src_path, dest_path):
- """Returns the relative path from src_path to dest_path."""
- src_parts = src_path.split("/")
- dest_parts = dest_path.split("/")
- n = 0
- for src_part, dest_part in zip(src_parts, dest_parts):
- if src_part != dest_part:
- break
- n += 1
-
- relative_path = ""
- for _ in range(n, len(src_parts)):
- relative_path += "../"
- relative_path += "/".join(dest_parts[n:])
-
- return relative_path
-
-def _create_setup_cmd(lib, deps_dir):
- """Constructs a command for symlinking a library into the deps directory."""
- return (
- "ln -sf " + _relative(deps_dir, lib.path) + " " +
- deps_dir + "/" + lib.basename + "\n"
- )
-
-def _d_toolchain(ctx):
- """Returns a struct containing info about the D toolchain.
-
- Args:
- ctx: The ctx object.
-
- Return:
- Struct containing the following fields:
- d_compiler_path: The path to the D compiler.
- link_flags: Linker (-L) flags for adding the standard library to the
- library search paths.
- import_flags: import (-L) flags for adding the standard library sources
- to the import paths.
- """
-
- d_compiler_path = ctx.file._d_compiler.path
- return struct(
- d_compiler_path = d_compiler_path,
- link_flags = ["-L-L" + ctx.files._d_stdlib[0].dirname],
- import_flags = [
- "-I" + ctx.files._d_stdlib_src[0].dirname,
- "-I" + ctx.files._d_runtime_import_src[0].dirname])
-
-def _format_version(name):
- """Formats the string name to be used in a --version flag."""
- return name.replace("-", "_")
-
-def _build_compile_command(ctx, srcs, out, depinfo, extra_flags=[]):
- """Returns a string containing the D compile command."""
- toolchain = _d_toolchain(ctx)
- cmd = (
- ["set -e;"] +
- depinfo.setup_cmd +
- [toolchain.d_compiler_path] +
- extra_flags + [
- "-of" + out.path,
- "-I.",
- "-debug",
- "-w",
- "-g",
- ] +
- ["-I%s/%s" % (ctx.label.package, im) for im in ctx.attr.imports] +
- ["-I%s" % im for im in depinfo.imports] +
- toolchain.import_flags +
- ["-version=Have_%s" % _format_version(ctx.label.name)] +
- ["-version=%s" % v for v in ctx.attr.versions] +
- ["-version=%s" % v for v in depinfo.versions] +
- srcs)
- return " ".join(cmd)
-
-def _build_link_command(ctx, objs, out, depinfo):
- """Returns a string containing the D link command."""
- toolchain = _d_toolchain(ctx)
- cmd = (
- ["set -e;"] +
- depinfo.setup_cmd +
- [toolchain.d_compiler_path] +
- ["-of" + out.path] +
- toolchain.link_flags +
- depinfo.lib_flags +
- depinfo.link_flags +
- objs)
- return " ".join(cmd)
-
-def _setup_deps(deps, name, working_dir):
- """Sets up dependencies.
-
- Walks through dependencies and constructs the commands and flags needed
- for linking the necessary dependencies.
-
- Args:
- deps: List of deps labels from ctx.attr.deps.
- name: Name of the current target.
- working_dir: The output directory of the current target's output.
-
- Returns:
- Returns a struct containing the following fields:
- libs: List of Files containing the target's direct library dependencies.
- transitive_libs: List of Files containing all of the target's
- transitive libraries.
- d_srcs: List of Files representing D source files of dependencies that
- will be used as inputs for this target.
- versions: List of D versions to be used for compiling the target.
- setup_cmd: String containing the symlink commands to be used to set
- up the dependencies.
- imports: List of Strings containing input paths that will be passed
- to the D compiler via -I flags.
- link_flags: List of linker flags.
- lib_flags: List of library search flags.
- """
- deps_dir = working_dir + "/" + name + ".deps"
- setup_cmd = ["rm -rf " + deps_dir + ";" + "mkdir -p " + deps_dir + ";"]
-
- libs = set()
- transitive_libs = set()
- d_srcs = set()
- transitive_d_srcs = set()
- versions = set()
- imports = set()
- link_flags = set()
- symlinked_libs = set()
- for dep in deps:
- if hasattr(dep, "d_lib"):
- # The dependency is a d_library.
- libs += [dep.d_lib]
- transitive_libs += dep.transitive_libs
- symlinked_libs += [dep.d_lib] + dep.transitive_libs
- d_srcs += dep.d_srcs
- transitive_d_srcs += dep.transitive_d_srcs
- versions += dep.versions + ["Have_%s" % _format_version(dep.label.name)]
- link_flags += ["-L-l%s" % dep.label.name] + dep.link_flags
- imports += ["%s/%s" % (dep.label.package, im) for im in dep.imports]
-
- elif hasattr(dep, "d_srcs"):
- # The dependency is a d_source_library.
- d_srcs += dep.d_srcs
- transitive_d_srcs += dep.transitive_d_srcs
- transitive_libs += dep.transitive_libs
- symlinked_libs += dep.transitive_libs
- link_flags += ["-L%s" % linkopt for linkopt in dep.linkopts]
- imports += ["%s/%s" % (dep.label.package, im) for im in dep.imports]
- versions += dep.versions
-
- elif hasattr(dep, "cc"):
- # The dependency is a cc_library
- native_libs = A_FILETYPE.filter(dep.cc.libs)
- libs += native_libs
- transitive_libs += native_libs
- symlinked_libs += native_libs
- link_flags += ["-L-l%s" % dep.label.name]
-
- else:
- fail("D targets can only depend on d_library, d_source_library, or " +
- "cc_library targets.", "deps")
-
- for symlinked_libs in symlinked_libs:
- setup_cmd += [_create_setup_cmd(symlinked_libs, deps_dir)]
-
- return struct(
- libs = list(libs),
- transitive_libs = list(transitive_libs),
- d_srcs = list(d_srcs),
- transitive_d_srcs = list(transitive_d_srcs),
- versions = versions,
- setup_cmd = setup_cmd,
- imports = list(imports),
- link_flags = list(link_flags),
- lib_flags = ["-L-L%s" % deps_dir])
-
-def _d_library_impl(ctx):
- """Implementation of the d_library rule."""
- warning("d_library")
- d_lib = ctx.outputs.d_lib
-
- # Dependencies
- depinfo = _setup_deps(ctx.attr.deps, ctx.label.name, d_lib.dirname)
-
- # Build compile command.
- cmd = _build_compile_command(
- ctx = ctx,
- srcs = [src.path for src in ctx.files.srcs],
- out = d_lib,
- depinfo = depinfo,
- extra_flags = ["-lib"])
-
- compile_inputs = (
- ctx.files.srcs +
- depinfo.d_srcs +
- depinfo.transitive_d_srcs +
- depinfo.libs +
- depinfo.transitive_libs +
- [ctx.file._d_compiler] +
- ctx.files._d_stdlib +
- ctx.files._d_stdlib_src +
- ctx.files._d_runtime_import_src)
-
- ctx.action(inputs = compile_inputs,
- outputs = [d_lib],
- mnemonic = "Dcompile",
- command = cmd,
- use_default_shell_env = True,
- progress_message = "Compiling D library " + ctx.label.name)
-
- return struct(files = set([d_lib]),
- d_srcs = ctx.files.srcs,
- transitive_d_srcs = depinfo.d_srcs,
- transitive_libs = depinfo.transitive_libs,
- link_flags = depinfo.link_flags,
- versions = ctx.attr.versions,
- imports = ctx.attr.imports,
- d_lib = d_lib)
-
-def _d_binary_impl_common(ctx, extra_flags=[]):
- """Common implementation for rules that build a D binary."""
- d_bin = ctx.outputs.executable
- d_obj = ctx.new_file(ctx.configuration.bin_dir,
- d_bin.basename + ".o")
- depinfo = _setup_deps(ctx.attr.deps, ctx.label.name, d_bin.dirname)
-
- # Build compile command
- compile_cmd = _build_compile_command(
- ctx = ctx,
- srcs = [src.path for src in ctx.files.srcs],
- depinfo = depinfo,
- out = d_obj,
- extra_flags = ["-c"] + extra_flags)
-
- toolchain_files = (
- [ctx.file._d_compiler] +
- ctx.files._d_stdlib +
- ctx.files._d_stdlib_src +
- ctx.files._d_runtime_import_src)
-
- compile_inputs = (ctx.files.srcs +
- depinfo.d_srcs +
- depinfo.transitive_d_srcs +
- toolchain_files)
- ctx.action(inputs = compile_inputs,
- outputs = [d_obj],
- mnemonic = "Dcompile",
- command = compile_cmd,
- use_default_shell_env = True,
- progress_message = "Compiling D binary " + ctx.label.name)
-
- # Build link command
- link_cmd = _build_link_command(
- ctx = ctx,
- objs = [d_obj.path],
- depinfo = depinfo,
- out = d_bin)
-
- link_inputs = (
- [d_obj] +
- depinfo.libs +
- depinfo.transitive_libs +
- toolchain_files)
-
- ctx.action(inputs = link_inputs,
- outputs = [d_bin],
- mnemonic = "Dlink",
- command = link_cmd,
- use_default_shell_env = True,
- progress_message = "Linking D binary " + ctx.label.name)
-
- return struct(d_srcs = ctx.files.srcs,
- transitive_d_srcs = depinfo.d_srcs,
- imports = ctx.attr.imports)
-
-def _d_binary_impl(ctx):
- """Implementation of the d_binary rule."""
- warning("d_binary")
- return _d_binary_impl_common(ctx)
-
-def _d_test_impl(ctx):
- """Implementation of the d_test rule."""
- warning("d_test")
- return _d_binary_impl_common(ctx, extra_flags=["-unittest"])
-
-def _d_source_library_impl(ctx):
- """Implementation of the d_source_library rule."""
- warning("d_library")
- transitive_d_srcs = set(order="compile")
- transitive_libs = set()
- transitive_imports = set()
- transitive_linkopts = set()
- transitive_versions = set()
- for dep in ctx.attr.deps:
- if hasattr(dep, "d_srcs"):
- # Dependency is another d_source_library target.
- transitive_d_srcs += dep.d_srcs
- transitive_imports += dep.imports
- transitive_linkopts += dep.linkopts
- transitive_versions += dep.versions
-
- elif hasattr(dep, "cc"):
- # Dependency is a cc_library target.
- native_libs = A_FILETYPE.filter(dep.cc.libs)
- transitive_libs += native_libs
- transitive_linkopts += ["-l%s" % dep.label.name]
-
- else:
- fail("d_source_library can only depend on other " +
- "d_source_library or cc_library targets.", "deps")
-
- return struct(
- d_srcs = ctx.files.srcs,
- transitive_d_srcs = list(transitive_d_srcs),
- transitive_libs = transitive_libs,
- imports = ctx.attr.imports + list(transitive_imports),
- linkopts = ctx.attr.linkopts + list(transitive_linkopts),
- versions = ctx.attr.versions + list(transitive_versions))
-
-# TODO(dzc): Use ddox for generating HTML documentation.
-def _d_docs_impl(ctx):
- """Implementation for the d_docs rule
-
- This rule runs the following steps to generate an archive containing
- HTML documentation generated from doc comments in D source code:
- 1. Run the D compiler with the -D flags to generate HTML code
- documentation.
- 2. Create a ZIP archive containing the HTML documentation.
- """
- warning("d_docs")
- d_docs_zip = ctx.outputs.d_docs
- docs_dir = d_docs_zip.dirname + "/_d_docs"
- objs_dir = d_docs_zip.dirname + "/_d_objs"
-
- target = struct(name = ctx.attr.dep.label.name,
- srcs = ctx.attr.dep.d_srcs,
- transitive_srcs = ctx.attr.dep.transitive_d_srcs,
- imports = ctx.attr.dep.imports)
-
- # Build D docs command
- toolchain = _d_toolchain(ctx)
- doc_cmd = (
- [
- "set -e;",
- "rm -rf %s; mkdir %s;" % (docs_dir, docs_dir),
- "rm -rf %s; mkdir %s;" % (objs_dir, objs_dir),
- toolchain.d_compiler_path,
- "-c",
- "-D",
- "-Dd%s" % docs_dir,
- "-od%s" % objs_dir,
- "-I.",
- ] +
- ["-I%s/%s" % (ctx.label.package, im) for im in target.imports] +
- toolchain.import_flags +
- [src.path for src in target.srcs] +
- [
- "&&",
- "(cd %s &&" % docs_dir,
- ZIP_PATH,
- "-qR",
- d_docs_zip.basename,
- "$(find . -type f) ) &&",
- "mv %s/%s %s" % (docs_dir, d_docs_zip.basename, d_docs_zip.path)
- ])
-
- toolchain_files = (
- [ctx.file._d_compiler] +
- ctx.files._d_stdlib +
- ctx.files._d_stdlib_src +
- ctx.files._d_runtime_import_src)
- ddoc_inputs = target.srcs + target.transitive_srcs + toolchain_files
- ctx.action(inputs = ddoc_inputs,
- outputs = [d_docs_zip],
- mnemonic = "Ddoc",
- command = " ".join(doc_cmd),
- use_default_shell_env = True,
- progress_message = "Generating D docs for " + ctx.label.name)
-
-_d_common_attrs = {
- "srcs": attr.label_list(allow_files = D_FILETYPE),
- "deps": attr.label_list(),
- "imports": attr.string_list(),
- "linkopts": attr.string_list(),
- "versions": attr.string_list(),
-}
-
-_d_compile_attrs = {
- "_d_compiler": attr.label(
- default = Label("@bazel_tools//tools/build_defs/d:dmd"),
- executable = True,
- single_file = True,
- ),
- "_d_stdlib": attr.label(
- default = Label("@bazel_tools//tools/build_defs/d:libphobos2"),
- ),
- "_d_stdlib_src": attr.label(
- default = Label("@bazel_tools//tools/build_defs/d:phobos-src"),
- ),
- "_d_runtime_import_src": attr.label(
- default = Label("@bazel_tools//tools/build_defs/d:druntime-import-src"),
- ),
-}
-
-d_library = rule(
- _d_library_impl,
- attrs = _d_common_attrs + _d_compile_attrs,
- outputs = {
- "d_lib": "lib%{name}.a",
- },
-)
-
-d_source_library = rule(
- _d_source_library_impl,
- attrs = _d_common_attrs,
-)
-
-d_binary = rule(
- _d_binary_impl,
- attrs = _d_common_attrs + _d_compile_attrs,
- executable = True,
-)
-
-d_test = rule(
- _d_test_impl,
- attrs = _d_common_attrs + _d_compile_attrs,
- executable = True,
- test = True,
-)
-
-_d_docs_attrs = {
- "dep": attr.label(mandatory = True),
-}
-
-d_docs = rule(
- _d_docs_impl,
- attrs = _d_docs_attrs + _d_compile_attrs,
- outputs = {
- "d_docs": "%{name}-docs.zip",
- },
-)
-
-DMD_BUILD_FILE = """
-package(default_visibility = ["//visibility:public"])
-
-config_setting(
- name = "darwin",
- values = {"host_cpu": "darwin"},
-)
-
-config_setting(
- name = "k8",
- values = {"host_cpu": "k8"},
-)
-
-filegroup(
- name = "dmd",
- srcs = select({
- ":darwin": ["dmd2/osx/bin/dmd"],
- ":k8": ["dmd2/linux/bin64/dmd"],
- }),
-)
-
-filegroup(
- name = "libphobos2",
- srcs = select({
- ":darwin": ["dmd2/osx/lib/libphobos2.a"],
- ":k8": [
- "dmd2/linux/lib64/libphobos2.a",
- "dmd2/linux/lib64/libphobos2.so",
- ],
- }),
-)
-
-filegroup(
- name = "phobos-src",
- srcs = glob(["dmd2/src/phobos/**/*.*"]),
-)
-
-filegroup(
- name = "druntime-import-src",
- srcs = glob([
- "dmd2/src/druntime/import/*.*",
- "dmd2/src/druntime/import/**/*.*",
- ]),
-)
-"""
-
-def d_repositories():
- warning("d_repositories")
- native.new_http_archive(
- name = "dmd_linux_x86_64",
- url = "http://downloads.dlang.org/releases/2.x/2.070.0/dmd.2.070.0.linux.tar.xz",
- sha256 = "42f48db8716f523076e881151f631e741342012881ec9b57353544ed46c4f774",
- build_file_content = DMD_BUILD_FILE,
- )
-
- native.new_http_archive(
- name = "dmd_darwin_x86_64",
- url = "http://downloads.dlang.org/releases/2.x/2.070.0/dmd.2.070.0.osx.tar.xz",
- sha256 = "c1dd14ded8e099dcb2f136379013959b07790249f440010d556e67ff59fe44a0",
- build_file_content = DMD_BUILD_FILE,
- )