xref: /aosp_15_r20/build/bazel/rules/cc/yasm.bzl (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
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