1*7594170eSAndroid Build Coastguard Worker"""Copyright (C) 2022 The Android Open Source Project 2*7594170eSAndroid Build Coastguard Worker 3*7594170eSAndroid Build Coastguard WorkerLicensed under the Apache License, Version 2.0 (the "License"); 4*7594170eSAndroid Build Coastguard Workeryou may not use this file except in compliance with the License. 5*7594170eSAndroid Build Coastguard WorkerYou may obtain a copy of the License at 6*7594170eSAndroid Build Coastguard Worker 7*7594170eSAndroid Build Coastguard Worker http://www.apache.org/licenses/LICENSE-2.0 8*7594170eSAndroid Build Coastguard Worker 9*7594170eSAndroid Build Coastguard WorkerUnless required by applicable law or agreed to in writing, software 10*7594170eSAndroid Build Coastguard Workerdistributed under the License is distributed on an "AS IS" BASIS, 11*7594170eSAndroid Build Coastguard WorkerWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*7594170eSAndroid Build Coastguard WorkerSee the License for the specific language governing permissions and 13*7594170eSAndroid Build Coastguard Workerlimitations under the License. 14*7594170eSAndroid Build Coastguard Worker""" 15*7594170eSAndroid Build Coastguard Worker 16*7594170eSAndroid Build Coastguard Workerload("@bazel_skylib//lib:paths.bzl", "paths") 17*7594170eSAndroid Build Coastguard Workerload("//build/bazel/platforms:platform_utils.bzl", "platforms") 18*7594170eSAndroid Build Coastguard Worker 19*7594170eSAndroid Build Coastguard Worker"""Build rule for converting `.asm` files to `.o` files with yasm.""" 20*7594170eSAndroid Build Coastguard Worker 21*7594170eSAndroid Build Coastguard Workerdef globalFlags(ctx): 22*7594170eSAndroid Build Coastguard Worker arch = platforms.get_target_arch(ctx.attr._platform_utils) 23*7594170eSAndroid Build Coastguard Worker linux = platforms.is_target_linux_or_android(ctx.attr._platform_utils) 24*7594170eSAndroid Build Coastguard Worker darwin = platforms.is_target_darwin(ctx.attr._platform_utils) 25*7594170eSAndroid Build Coastguard Worker 26*7594170eSAndroid Build Coastguard Worker if linux and arch == "x86_64": 27*7594170eSAndroid Build Coastguard Worker return ["-f", "elf64", "-m", "amd64"] 28*7594170eSAndroid Build Coastguard Worker if linux and arch == "x86": 29*7594170eSAndroid Build Coastguard Worker return ["-f", "elf32", "-m", "x86"] 30*7594170eSAndroid Build Coastguard Worker if linux and arch == "arm64": 31*7594170eSAndroid Build Coastguard Worker return ["-f", "elf64", "-m", "aarch64"] 32*7594170eSAndroid Build Coastguard Worker if linux and arch == "arm": 33*7594170eSAndroid Build Coastguard Worker return ["-f", "elf32", "-m", "arm"] 34*7594170eSAndroid Build Coastguard Worker if darwin: 35*7594170eSAndroid Build Coastguard Worker return ["-f", "macho", "-m", "amd64"] 36*7594170eSAndroid Build Coastguard Worker 37*7594170eSAndroid Build Coastguard Worker fail("Unable to detect target platform for compiling .asm files") 38*7594170eSAndroid Build Coastguard Worker 39*7594170eSAndroid Build Coastguard Workerdef _yasm_impl(ctx): 40*7594170eSAndroid Build Coastguard Worker common_args = (globalFlags(ctx) + ctx.attr.flags + 41*7594170eSAndroid Build Coastguard Worker ["-I" + paths.join(ctx.label.package, d) for d in ctx.attr.include_dirs]) 42*7594170eSAndroid Build Coastguard Worker 43*7594170eSAndroid Build Coastguard Worker outputs = [ctx.actions.declare_file(paths.replace_extension(src.path, ".o")) for src in ctx.files.srcs] 44*7594170eSAndroid Build Coastguard Worker for src, out in zip(ctx.files.srcs, outputs): 45*7594170eSAndroid Build Coastguard Worker ctx.actions.run( 46*7594170eSAndroid Build Coastguard Worker inputs = ctx.files.include_srcs, # include_srcs will contain src 47*7594170eSAndroid Build Coastguard Worker outputs = [out], 48*7594170eSAndroid Build Coastguard Worker executable = ctx.executable._yasm, 49*7594170eSAndroid Build Coastguard Worker arguments = common_args + ["-o", out.path, src.path], 50*7594170eSAndroid Build Coastguard Worker mnemonic = "yasm", 51*7594170eSAndroid Build Coastguard Worker ) 52*7594170eSAndroid Build Coastguard Worker 53*7594170eSAndroid Build Coastguard Worker return [DefaultInfo(files = depset(outputs))] 54*7594170eSAndroid Build Coastguard Worker 55*7594170eSAndroid Build Coastguard Worker_yasm = rule( 56*7594170eSAndroid Build Coastguard Worker implementation = _yasm_impl, 57*7594170eSAndroid Build Coastguard Worker doc = "Generate object files from a .asm file using yasm.", 58*7594170eSAndroid Build Coastguard Worker attrs = { 59*7594170eSAndroid Build Coastguard Worker "srcs": attr.label_list( 60*7594170eSAndroid Build Coastguard Worker mandatory = True, 61*7594170eSAndroid Build Coastguard Worker allow_files = [".asm"], 62*7594170eSAndroid Build Coastguard Worker doc = "The asm source files for this rule", 63*7594170eSAndroid Build Coastguard Worker ), 64*7594170eSAndroid Build Coastguard Worker "include_srcs": attr.label_list( 65*7594170eSAndroid Build Coastguard Worker allow_files = [".inc", ".asm"], 66*7594170eSAndroid Build Coastguard Worker doc = "All files that could possibly be included from source files. " + 67*7594170eSAndroid Build Coastguard Worker "This is necessary because starlark doesn't allow adding dependencies " + 68*7594170eSAndroid Build Coastguard Worker "via .d files.", 69*7594170eSAndroid Build Coastguard Worker ), 70*7594170eSAndroid Build Coastguard Worker "include_dirs": attr.string_list( 71*7594170eSAndroid Build Coastguard Worker doc = "Include directories", 72*7594170eSAndroid Build Coastguard Worker ), 73*7594170eSAndroid Build Coastguard Worker "flags": attr.string_list( 74*7594170eSAndroid Build Coastguard Worker doc = "A list of options to be added to the yasm command line.", 75*7594170eSAndroid Build Coastguard Worker ), 76*7594170eSAndroid Build Coastguard Worker "_yasm": attr.label( 77*7594170eSAndroid Build Coastguard Worker default = "//prebuilts/misc:yasm", 78*7594170eSAndroid Build Coastguard Worker executable = True, 79*7594170eSAndroid Build Coastguard Worker cfg = "exec", 80*7594170eSAndroid Build Coastguard Worker ), 81*7594170eSAndroid Build Coastguard Worker "_platform_utils": attr.label( 82*7594170eSAndroid Build Coastguard Worker default = Label("//build/bazel/platforms:platform_utils"), 83*7594170eSAndroid Build Coastguard Worker ), 84*7594170eSAndroid Build Coastguard Worker }, 85*7594170eSAndroid Build Coastguard Worker) 86*7594170eSAndroid Build Coastguard Worker 87*7594170eSAndroid Build Coastguard Workerdef yasm( 88*7594170eSAndroid Build Coastguard Worker name, 89*7594170eSAndroid Build Coastguard Worker srcs, 90*7594170eSAndroid Build Coastguard Worker include_dirs = [], 91*7594170eSAndroid Build Coastguard Worker flags = [], 92*7594170eSAndroid Build Coastguard Worker target_compatible_with = [], 93*7594170eSAndroid Build Coastguard Worker tags = []): 94*7594170eSAndroid Build Coastguard Worker _yasm( 95*7594170eSAndroid Build Coastguard Worker name = name, 96*7594170eSAndroid Build Coastguard Worker srcs = srcs, 97*7594170eSAndroid Build Coastguard Worker flags = flags, 98*7594170eSAndroid Build Coastguard Worker include_dirs = include_dirs, 99*7594170eSAndroid Build Coastguard Worker include_srcs = native.glob(["**/*.inc", "**/*.asm"]), 100*7594170eSAndroid Build Coastguard Worker target_compatible_with = target_compatible_with, 101*7594170eSAndroid Build Coastguard Worker tags = tags, 102*7594170eSAndroid Build Coastguard Worker ) 103