aboutsummaryrefslogtreecommitdiff
path: root/go/private/actions/compilepkg.bzl
diff options
context:
space:
mode:
Diffstat (limited to 'go/private/actions/compilepkg.bzl')
-rw-r--r--go/private/actions/compilepkg.bzl161
1 files changed, 161 insertions, 0 deletions
diff --git a/go/private/actions/compilepkg.bzl b/go/private/actions/compilepkg.bzl
new file mode 100644
index 00000000..fff807fa
--- /dev/null
+++ b/go/private/actions/compilepkg.bzl
@@ -0,0 +1,161 @@
+# Copyright 2019 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.
+
+load(
+ "//go/private:mode.bzl",
+ "link_mode_args",
+)
+load("//go/private/actions:utils.bzl", "quote_opts")
+
+def _archive(v):
+ importpaths = [v.data.importpath]
+ importpaths.extend(v.data.importpath_aliases)
+ return "{}={}={}".format(
+ ":".join(importpaths),
+ v.data.importmap,
+ v.data.export_file.path if v.data.export_file else v.data.file.path,
+ )
+
+def _embedroot_arg(src):
+ return src.root.path
+
+def _embedlookupdir_arg(src):
+ root_relative = src.dirname[len(src.root.path):]
+ if root_relative.startswith("/"):
+ root_relative = root_relative[len("/"):]
+ return root_relative
+
+def emit_compilepkg(
+ go,
+ sources = None,
+ cover = None,
+ embedsrcs = [],
+ importpath = "",
+ importmap = "",
+ archives = [],
+ cgo = False,
+ cgo_inputs = depset(),
+ cppopts = [],
+ copts = [],
+ cxxopts = [],
+ objcopts = [],
+ objcxxopts = [],
+ clinkopts = [],
+ out_lib = None,
+ out_export = None,
+ out_cgo_export_h = None,
+ gc_goopts = [],
+ testfilter = None, # TODO: remove when test action compiles packages
+ recompile_internal_deps = []):
+ """Compiles a complete Go package."""
+ if sources == None:
+ fail("sources is a required parameter")
+ if out_lib == None:
+ fail("out_lib is a required parameter")
+
+ inputs = (sources + embedsrcs + [go.package_list] +
+ [archive.data.export_file for archive in archives] +
+ go.sdk.tools + go.sdk.headers + go.stdlib.libs)
+ outputs = [out_lib, out_export]
+ env = go.env
+
+ args = go.builder_args(go, "compilepkg")
+ args.add_all(sources, before_each = "-src")
+ args.add_all(embedsrcs, before_each = "-embedsrc", expand_directories = False)
+ args.add_all(
+ sources + [out_lib] + embedsrcs,
+ map_each = _embedroot_arg,
+ before_each = "-embedroot",
+ uniquify = True,
+ expand_directories = False,
+ )
+ args.add_all(
+ sources + [out_lib],
+ map_each = _embedlookupdir_arg,
+ before_each = "-embedlookupdir",
+ uniquify = True,
+ expand_directories = False,
+ )
+ if cover and go.coverdata:
+ inputs.append(go.coverdata.data.export_file)
+ args.add("-arc", _archive(go.coverdata))
+ if go.mode.race:
+ args.add("-cover_mode", "atomic")
+ else:
+ args.add("-cover_mode", "set")
+ args.add("-cover_format", go.cover_format)
+ args.add_all(cover, before_each = "-cover")
+ args.add_all(archives, before_each = "-arc", map_each = _archive)
+ if recompile_internal_deps:
+ args.add_all(recompile_internal_deps, before_each = "-recompile_internal_deps")
+ if importpath:
+ args.add("-importpath", importpath)
+ else:
+ args.add("-importpath", go.label.name)
+ if importmap:
+ args.add("-p", importmap)
+ args.add("-package_list", go.package_list)
+
+ args.add("-o", out_lib)
+ args.add("-x", out_export)
+ if go.nogo:
+ args.add("-nogo", go.nogo)
+ inputs.append(go.nogo)
+ if out_cgo_export_h:
+ args.add("-cgoexport", out_cgo_export_h)
+ outputs.append(out_cgo_export_h)
+ if testfilter:
+ args.add("-testfilter", testfilter)
+
+ gc_flags = list(gc_goopts)
+ gc_flags.extend(go.mode.gc_goopts)
+ asm_flags = []
+ if go.mode.race:
+ gc_flags.append("-race")
+ if go.mode.msan:
+ gc_flags.append("-msan")
+ if go.mode.debug:
+ gc_flags.extend(["-N", "-l"])
+ gc_flags.extend(go.toolchain.flags.compile)
+ gc_flags.extend(link_mode_args(go.mode))
+ asm_flags.extend(link_mode_args(go.mode))
+ args.add("-gcflags", quote_opts(gc_flags))
+ args.add("-asmflags", quote_opts(asm_flags))
+
+ env = go.env
+ if cgo:
+ inputs.extend(cgo_inputs.to_list()) # OPT: don't expand depset
+ inputs.extend(go.crosstool)
+ env["CC"] = go.cgo_tools.c_compiler_path
+ if cppopts:
+ args.add("-cppflags", quote_opts(cppopts))
+ if copts:
+ args.add("-cflags", quote_opts(copts))
+ if cxxopts:
+ args.add("-cxxflags", quote_opts(cxxopts))
+ if objcopts:
+ args.add("-objcflags", quote_opts(objcopts))
+ if objcxxopts:
+ args.add("-objcxxflags", quote_opts(objcxxopts))
+ if clinkopts:
+ args.add("-ldflags", quote_opts(clinkopts))
+
+ go.actions.run(
+ inputs = inputs,
+ outputs = outputs,
+ mnemonic = "GoCompilePkg",
+ executable = go.toolchain._builder,
+ arguments = [args],
+ env = go.env,
+ )