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