xref: /aosp_15_r20/external/bazelbuild-rules_go/go/private/actions/compilepkg.bzl (revision 9bb1b549b6a84214c53be0924760be030e66b93a)
1*9bb1b549SSpandan Das# Copyright 2019 The Bazel Authors. All rights reserved.
2*9bb1b549SSpandan Das#
3*9bb1b549SSpandan Das# Licensed under the Apache License, Version 2.0 (the "License");
4*9bb1b549SSpandan Das# you may not use this file except in compliance with the License.
5*9bb1b549SSpandan Das# You may obtain a copy of the License at
6*9bb1b549SSpandan Das#
7*9bb1b549SSpandan Das#    http://www.apache.org/licenses/LICENSE-2.0
8*9bb1b549SSpandan Das#
9*9bb1b549SSpandan Das# Unless required by applicable law or agreed to in writing, software
10*9bb1b549SSpandan Das# distributed under the License is distributed on an "AS IS" BASIS,
11*9bb1b549SSpandan Das# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9bb1b549SSpandan Das# See the License for the specific language governing permissions and
13*9bb1b549SSpandan Das# limitations under the License.
14*9bb1b549SSpandan Das
15*9bb1b549SSpandan Dasload(
16*9bb1b549SSpandan Das    "//go/private:mode.bzl",
17*9bb1b549SSpandan Das    "link_mode_args",
18*9bb1b549SSpandan Das)
19*9bb1b549SSpandan Dasload("//go/private/actions:utils.bzl", "quote_opts")
20*9bb1b549SSpandan Das
21*9bb1b549SSpandan Dasdef _archive(v):
22*9bb1b549SSpandan Das    importpaths = [v.data.importpath]
23*9bb1b549SSpandan Das    importpaths.extend(v.data.importpath_aliases)
24*9bb1b549SSpandan Das    return "{}={}={}".format(
25*9bb1b549SSpandan Das        ":".join(importpaths),
26*9bb1b549SSpandan Das        v.data.importmap,
27*9bb1b549SSpandan Das        v.data.export_file.path if v.data.export_file else v.data.file.path,
28*9bb1b549SSpandan Das    )
29*9bb1b549SSpandan Das
30*9bb1b549SSpandan Dasdef _embedroot_arg(src):
31*9bb1b549SSpandan Das    return src.root.path
32*9bb1b549SSpandan Das
33*9bb1b549SSpandan Dasdef _embedlookupdir_arg(src):
34*9bb1b549SSpandan Das    root_relative = src.dirname[len(src.root.path):]
35*9bb1b549SSpandan Das    if root_relative.startswith("/"):
36*9bb1b549SSpandan Das        root_relative = root_relative[len("/"):]
37*9bb1b549SSpandan Das    return root_relative
38*9bb1b549SSpandan Das
39*9bb1b549SSpandan Dasdef emit_compilepkg(
40*9bb1b549SSpandan Das        go,
41*9bb1b549SSpandan Das        sources = None,
42*9bb1b549SSpandan Das        cover = None,
43*9bb1b549SSpandan Das        embedsrcs = [],
44*9bb1b549SSpandan Das        importpath = "",
45*9bb1b549SSpandan Das        importmap = "",
46*9bb1b549SSpandan Das        archives = [],
47*9bb1b549SSpandan Das        cgo = False,
48*9bb1b549SSpandan Das        cgo_inputs = depset(),
49*9bb1b549SSpandan Das        cppopts = [],
50*9bb1b549SSpandan Das        copts = [],
51*9bb1b549SSpandan Das        cxxopts = [],
52*9bb1b549SSpandan Das        objcopts = [],
53*9bb1b549SSpandan Das        objcxxopts = [],
54*9bb1b549SSpandan Das        clinkopts = [],
55*9bb1b549SSpandan Das        out_lib = None,
56*9bb1b549SSpandan Das        out_export = None,
57*9bb1b549SSpandan Das        out_cgo_export_h = None,
58*9bb1b549SSpandan Das        gc_goopts = [],
59*9bb1b549SSpandan Das        testfilter = None,  # TODO: remove when test action compiles packages
60*9bb1b549SSpandan Das        recompile_internal_deps = []):
61*9bb1b549SSpandan Das    """Compiles a complete Go package."""
62*9bb1b549SSpandan Das    if sources == None:
63*9bb1b549SSpandan Das        fail("sources is a required parameter")
64*9bb1b549SSpandan Das    if out_lib == None:
65*9bb1b549SSpandan Das        fail("out_lib is a required parameter")
66*9bb1b549SSpandan Das
67*9bb1b549SSpandan Das    inputs = (sources + embedsrcs + [go.package_list] +
68*9bb1b549SSpandan Das              [archive.data.export_file for archive in archives] +
69*9bb1b549SSpandan Das              go.sdk.tools + go.sdk.headers + go.stdlib.libs)
70*9bb1b549SSpandan Das    outputs = [out_lib, out_export]
71*9bb1b549SSpandan Das    env = go.env
72*9bb1b549SSpandan Das
73*9bb1b549SSpandan Das    args = go.builder_args(go, "compilepkg")
74*9bb1b549SSpandan Das    args.add_all(sources, before_each = "-src")
75*9bb1b549SSpandan Das    args.add_all(embedsrcs, before_each = "-embedsrc", expand_directories = False)
76*9bb1b549SSpandan Das    args.add_all(
77*9bb1b549SSpandan Das        sources + [out_lib] + embedsrcs,
78*9bb1b549SSpandan Das        map_each = _embedroot_arg,
79*9bb1b549SSpandan Das        before_each = "-embedroot",
80*9bb1b549SSpandan Das        uniquify = True,
81*9bb1b549SSpandan Das        expand_directories = False,
82*9bb1b549SSpandan Das    )
83*9bb1b549SSpandan Das    args.add_all(
84*9bb1b549SSpandan Das        sources + [out_lib],
85*9bb1b549SSpandan Das        map_each = _embedlookupdir_arg,
86*9bb1b549SSpandan Das        before_each = "-embedlookupdir",
87*9bb1b549SSpandan Das        uniquify = True,
88*9bb1b549SSpandan Das        expand_directories = False,
89*9bb1b549SSpandan Das    )
90*9bb1b549SSpandan Das    if cover and go.coverdata:
91*9bb1b549SSpandan Das        inputs.append(go.coverdata.data.export_file)
92*9bb1b549SSpandan Das        args.add("-arc", _archive(go.coverdata))
93*9bb1b549SSpandan Das        if go.mode.race:
94*9bb1b549SSpandan Das            args.add("-cover_mode", "atomic")
95*9bb1b549SSpandan Das        else:
96*9bb1b549SSpandan Das            args.add("-cover_mode", "set")
97*9bb1b549SSpandan Das        args.add("-cover_format", go.cover_format)
98*9bb1b549SSpandan Das        args.add_all(cover, before_each = "-cover")
99*9bb1b549SSpandan Das    args.add_all(archives, before_each = "-arc", map_each = _archive)
100*9bb1b549SSpandan Das    if recompile_internal_deps:
101*9bb1b549SSpandan Das        args.add_all(recompile_internal_deps, before_each = "-recompile_internal_deps")
102*9bb1b549SSpandan Das    if importpath:
103*9bb1b549SSpandan Das        args.add("-importpath", importpath)
104*9bb1b549SSpandan Das    else:
105*9bb1b549SSpandan Das        args.add("-importpath", go.label.name)
106*9bb1b549SSpandan Das    if importmap:
107*9bb1b549SSpandan Das        args.add("-p", importmap)
108*9bb1b549SSpandan Das    args.add("-package_list", go.package_list)
109*9bb1b549SSpandan Das
110*9bb1b549SSpandan Das    args.add("-o", out_lib)
111*9bb1b549SSpandan Das    args.add("-x", out_export)
112*9bb1b549SSpandan Das    if go.nogo:
113*9bb1b549SSpandan Das        args.add("-nogo", go.nogo)
114*9bb1b549SSpandan Das        inputs.append(go.nogo)
115*9bb1b549SSpandan Das    if out_cgo_export_h:
116*9bb1b549SSpandan Das        args.add("-cgoexport", out_cgo_export_h)
117*9bb1b549SSpandan Das        outputs.append(out_cgo_export_h)
118*9bb1b549SSpandan Das    if testfilter:
119*9bb1b549SSpandan Das        args.add("-testfilter", testfilter)
120*9bb1b549SSpandan Das
121*9bb1b549SSpandan Das    gc_flags = list(gc_goopts)
122*9bb1b549SSpandan Das    gc_flags.extend(go.mode.gc_goopts)
123*9bb1b549SSpandan Das    asm_flags = []
124*9bb1b549SSpandan Das    if go.mode.race:
125*9bb1b549SSpandan Das        gc_flags.append("-race")
126*9bb1b549SSpandan Das    if go.mode.msan:
127*9bb1b549SSpandan Das        gc_flags.append("-msan")
128*9bb1b549SSpandan Das    if go.mode.debug:
129*9bb1b549SSpandan Das        gc_flags.extend(["-N", "-l"])
130*9bb1b549SSpandan Das    gc_flags.extend(go.toolchain.flags.compile)
131*9bb1b549SSpandan Das    gc_flags.extend(link_mode_args(go.mode))
132*9bb1b549SSpandan Das    asm_flags.extend(link_mode_args(go.mode))
133*9bb1b549SSpandan Das    args.add("-gcflags", quote_opts(gc_flags))
134*9bb1b549SSpandan Das    args.add("-asmflags", quote_opts(asm_flags))
135*9bb1b549SSpandan Das
136*9bb1b549SSpandan Das    env = go.env
137*9bb1b549SSpandan Das    if cgo:
138*9bb1b549SSpandan Das        inputs.extend(cgo_inputs.to_list())  # OPT: don't expand depset
139*9bb1b549SSpandan Das        inputs.extend(go.crosstool)
140*9bb1b549SSpandan Das        env["CC"] = go.cgo_tools.c_compiler_path
141*9bb1b549SSpandan Das        if cppopts:
142*9bb1b549SSpandan Das            args.add("-cppflags", quote_opts(cppopts))
143*9bb1b549SSpandan Das        if copts:
144*9bb1b549SSpandan Das            args.add("-cflags", quote_opts(copts))
145*9bb1b549SSpandan Das        if cxxopts:
146*9bb1b549SSpandan Das            args.add("-cxxflags", quote_opts(cxxopts))
147*9bb1b549SSpandan Das        if objcopts:
148*9bb1b549SSpandan Das            args.add("-objcflags", quote_opts(objcopts))
149*9bb1b549SSpandan Das        if objcxxopts:
150*9bb1b549SSpandan Das            args.add("-objcxxflags", quote_opts(objcxxopts))
151*9bb1b549SSpandan Das        if clinkopts:
152*9bb1b549SSpandan Das            args.add("-ldflags", quote_opts(clinkopts))
153*9bb1b549SSpandan Das
154*9bb1b549SSpandan Das    go.actions.run(
155*9bb1b549SSpandan Das        inputs = inputs,
156*9bb1b549SSpandan Das        outputs = outputs,
157*9bb1b549SSpandan Das        mnemonic = "GoCompilePkg",
158*9bb1b549SSpandan Das        executable = go.toolchain._builder,
159*9bb1b549SSpandan Das        arguments = [args],
160*9bb1b549SSpandan Das        env = go.env,
161*9bb1b549SSpandan Das    )
162