xref: /aosp_15_r20/external/crosvm/tools/impl/bindgen-common.sh (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1*bb4ee6a4SAndroid Build Coastguard Worker# Copyright 2022 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker# found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker
5*bb4ee6a4SAndroid Build Coastguard Worker# Helper functions for bindgen scripts sourced by tools/bindgen-all-the-things.
6*bb4ee6a4SAndroid Build Coastguard Worker
7*bb4ee6a4SAndroid Build Coastguard Workerexport BINDGEN_LINUX="${PWD}/../../third_party/kernel/v6.6"
8*bb4ee6a4SAndroid Build Coastguard Worker
9*bb4ee6a4SAndroid Build Coastguard Workerexport BINDGEN_PLATFORM2="${PWD}/../../platform2"
10*bb4ee6a4SAndroid Build Coastguard Worker
11*bb4ee6a4SAndroid Build Coastguard Workerexport BINDGEN_OPTS=(
12*bb4ee6a4SAndroid Build Coastguard Worker    '--disable-header-comment'
13*bb4ee6a4SAndroid Build Coastguard Worker    '--no-layout-tests'
14*bb4ee6a4SAndroid Build Coastguard Worker    '--no-doc-comments'
15*bb4ee6a4SAndroid Build Coastguard Worker    '--with-derive-default'
16*bb4ee6a4SAndroid Build Coastguard Worker)
17*bb4ee6a4SAndroid Build Coastguard Worker
18*bb4ee6a4SAndroid Build Coastguard Workerexport BINDGEN_HEADER="/* automatically generated by tools/bindgen-all-the-things */
19*bb4ee6a4SAndroid Build Coastguard Worker
20*bb4ee6a4SAndroid Build Coastguard Worker#![allow(clippy::missing_safety_doc)]
21*bb4ee6a4SAndroid Build Coastguard Worker#![allow(clippy::undocumented_unsafe_blocks)]
22*bb4ee6a4SAndroid Build Coastguard Worker#![allow(clippy::upper_case_acronyms)]
23*bb4ee6a4SAndroid Build Coastguard Worker#![allow(non_upper_case_globals)]
24*bb4ee6a4SAndroid Build Coastguard Worker#![allow(non_camel_case_types)]
25*bb4ee6a4SAndroid Build Coastguard Worker#![allow(non_snake_case)]
26*bb4ee6a4SAndroid Build Coastguard Worker#![allow(dead_code)]
27*bb4ee6a4SAndroid Build Coastguard Worker"
28*bb4ee6a4SAndroid Build Coastguard Worker
29*bb4ee6a4SAndroid Build Coastguard Worker# Delete definitions of types like __u32 and replace their uses with the equivalent native Rust
30*bb4ee6a4SAndroid Build Coastguard Worker# type, like u32. This ensures that the types are correctly sized on all platforms, unlike the
31*bb4ee6a4SAndroid Build Coastguard Worker# definitions from the system headers, which resolve to C types like short/int/long that may vary
32*bb4ee6a4SAndroid Build Coastguard Worker# across architectures.
33*bb4ee6a4SAndroid Build Coastguard Workerreplace_linux_int_types() {
34*bb4ee6a4SAndroid Build Coastguard Worker    sed -E -e '/^pub type __(u|s)(8|16|32|64) =/d' -e 's/__u(8|16|32|64)/u\1/g' -e 's/__s(8|16|32|64)/i\1/g'
35*bb4ee6a4SAndroid Build Coastguard Worker    cat
36*bb4ee6a4SAndroid Build Coastguard Worker}
37*bb4ee6a4SAndroid Build Coastguard Worker
38*bb4ee6a4SAndroid Build Coastguard Worker# Delete definitions of types like __le32 and __be32 and replace their uses with the equivalent
39*bb4ee6a4SAndroid Build Coastguard Worker# data_model types.
40*bb4ee6a4SAndroid Build Coastguard Workerreplace_linux_endian_types() {
41*bb4ee6a4SAndroid Build Coastguard Worker    sed -E -e '/^pub type __(l|b)e(16|32|64) =/d' -e 's/__le(16|32|64)/Le\1/g' -e 's/__be(16|32|64)/Be\1/g'
42*bb4ee6a4SAndroid Build Coastguard Worker}
43*bb4ee6a4SAndroid Build Coastguard Worker
44*bb4ee6a4SAndroid Build Coastguard Worker# Wrapper for bindgen used by the various bindgen.sh scripts.
45*bb4ee6a4SAndroid Build Coastguard Worker# Pass extra bindgen options and the .h filename as parameters.
46*bb4ee6a4SAndroid Build Coastguard Worker# Output is produced on stdout and should be redirected to a file.
47*bb4ee6a4SAndroid Build Coastguard Workerbindgen_generate() {
48*bb4ee6a4SAndroid Build Coastguard Worker    echo "${BINDGEN_HEADER}"
49*bb4ee6a4SAndroid Build Coastguard Worker    bindgen "${BINDGEN_OPTS[@]}" "$@"
50*bb4ee6a4SAndroid Build Coastguard Worker}
51*bb4ee6a4SAndroid Build Coastguard Worker
52*bb4ee6a4SAndroid Build Coastguard Workerbindgen_cleanup() {
53*bb4ee6a4SAndroid Build Coastguard Worker    rm -rf "${BINDGEN_LINUX_X86_HEADERS}" "${BINDGEN_LINUX_ARM64_HEADERS}" "${BINDGEN_LINUX_RISCV_HEADERS}"
54*bb4ee6a4SAndroid Build Coastguard Worker}
55*bb4ee6a4SAndroid Build Coastguard Worker
56*bb4ee6a4SAndroid Build Coastguard Worker# Install Linux kernel headers for each architecture into temporary locations. These are used for KVM bindings.
57*bb4ee6a4SAndroid Build Coastguard Worker
58*bb4ee6a4SAndroid Build Coastguard Workerif [[ -z "${BINDGEN_LINUX_X86_HEADERS+x}" || ! -d "${BINDGEN_LINUX_X86_HEADERS}" ||
59*bb4ee6a4SAndroid Build Coastguard Worker    -z "${BINDGEN_LINUX_ARM64_HEADERS+x}" || ! -d "${BINDGEN_LINUX_ARM64_HEADERS}" ||
60*bb4ee6a4SAndroid Build Coastguard Worker    -z "${BINDGEN_LINUX_RISCV_HEADERS+x}" || ! -d "${BINDGEN_LINUX_RISCV_HEADERS}" ]]; then
61*bb4ee6a4SAndroid Build Coastguard Worker    export BINDGEN_LINUX_X86_HEADERS='/tmp/bindgen_linux_x86_headers'
62*bb4ee6a4SAndroid Build Coastguard Worker    export BINDGEN_LINUX_ARM64_HEADERS='/tmp/bindgen_linux_arm64_headers'
63*bb4ee6a4SAndroid Build Coastguard Worker    export BINDGEN_LINUX_RISCV_HEADERS='/tmp/bindgen_linux_riscv_headers'
64*bb4ee6a4SAndroid Build Coastguard Worker
65*bb4ee6a4SAndroid Build Coastguard Worker    trap bindgen_cleanup EXIT
66*bb4ee6a4SAndroid Build Coastguard Worker
67*bb4ee6a4SAndroid Build Coastguard Worker    echo -n "Installing Linux headers for x86, arm64, and riscv..."
68*bb4ee6a4SAndroid Build Coastguard Worker    (
69*bb4ee6a4SAndroid Build Coastguard Worker        cd "${BINDGEN_LINUX}"
70*bb4ee6a4SAndroid Build Coastguard Worker        nproc=$(nproc)
71*bb4ee6a4SAndroid Build Coastguard Worker        make -s headers_install ARCH=x86 INSTALL_HDR_PATH="${BINDGEN_LINUX_X86_HEADERS}" -j "${nproc}"
72*bb4ee6a4SAndroid Build Coastguard Worker        make -s headers_install ARCH=arm64 INSTALL_HDR_PATH="${BINDGEN_LINUX_ARM64_HEADERS}" -j "${nproc}"
73*bb4ee6a4SAndroid Build Coastguard Worker        make -s headers_install ARCH=riscv INSTALL_HDR_PATH="${BINDGEN_LINUX_RISCV_HEADERS}" -j "${nproc}"
74*bb4ee6a4SAndroid Build Coastguard Worker        make -s mrproper
75*bb4ee6a4SAndroid Build Coastguard Worker    )
76*bb4ee6a4SAndroid Build Coastguard Worker    echo " done."
77*bb4ee6a4SAndroid Build Coastguard Workerfi
78