blob: a6709fedd915c2048e3962c4128118f6e011af8e [file] [log] [blame]
From 52e66a3dac02e7096c07c532881f16f807068ef4 Mon Sep 17 00:00:00 2001
From: "qinglin.li" <qinglin.li@amlogic.com>
Date: Thu, 20 Apr 2023 17:56:06 +0800
Subject: [PATCH] Revert "Remove build.sh."
This reverts commit 670b2ff547c0739352a200422e4e8a7149145947.
Change-Id: Ifcb58e40904c910794a21f1a894a71a71be6293b
Signed-off-by: qinglin.li <qinglin.li@amlogic.com>
---
build.sh | 1084 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 1084 insertions(+)
create mode 100755 build.sh
diff --git a/build.sh b/build.sh
new file mode 100755
index 0000000..018f3a4
--- /dev/null
+++ b/build.sh
@@ -0,0 +1,1084 @@
+#!/bin/bash
+
+# Copyright (C) 2019 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Usage:
+# build/build.sh <make options>*
+# or:
+# To define custom out and dist directories:
+# OUT_DIR=<out dir> DIST_DIR=<dist dir> build/build.sh <make options>*
+# To use a custom build config:
+# BUILD_CONFIG=<path to the build.config> <make options>*
+#
+# Examples:
+# To define custom out and dist directories:
+# OUT_DIR=output DIST_DIR=dist build/build.sh -j24 V=1
+# To use a custom build config:
+# BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh -j24 V=1
+#
+# The following environment variables are considered during execution:
+#
+# BUILD_CONFIG
+# Build config file to initialize the build environment from. The location
+# is to be defined relative to the repo root directory.
+# Defaults to 'build.config'.
+#
+# BUILD_CONFIG_FRAGMENTS
+# A whitespace-separated list of additional build config fragments to be
+# sourced after the main build config file. Typically used for sanitizers or
+# other special builds.
+#
+# FAST_BUILD
+# If defined, trade run-time optimizations for build speed. In other words,
+# if given a choice between a faster build and a run-time optimization,
+# choose the shorter build time. For example, use ThinLTO for faster
+# linking and reduce the lz4 compression level to speed up ramdisk
+# compression. This trade-off is desirable for incremental kernel
+# development where fast turnaround times are critical for productivity.
+#
+# OUT_DIR
+# Base output directory for the kernel build.
+# Defaults to <REPO_ROOT>/out/<BRANCH>.
+#
+# DIST_DIR
+# Base output directory for the kernel distribution.
+# Defaults to <OUT_DIR>/dist
+#
+# MAKE_GOALS
+# List of targets passed to Make when compiling the kernel.
+# Typically: Image, modules, and a DTB (if applicable).
+#
+# EXT_MODULES
+# Space separated list of external kernel modules to be build.
+#
+# EXT_MODULES_MAKEFILE
+# Location of a makefile to build external modules. If set, it will get
+# called with all the necessary parameters to build and install external
+# modules. This allows for building them in parallel using makefile
+# parallelization.
+#
+# KCONFIG_EXT_PREFIX
+# Path prefix relative to either ROOT_DIR or KERNEL_DIR that points to
+# a directory containing an external Kconfig file named Kconfig.ext. When
+# set, kbuild will source ${KCONFIG_EXT_PREFIX}Kconfig.ext which can be
+# used to set configs for external modules in the defconfig.
+#
+# UNSTRIPPED_MODULES
+# Space separated list of modules to be copied to <DIST_DIR>/unstripped
+# for debugging purposes.
+#
+# COMPRESS_UNSTRIPPED_MODULES
+# If set to "1", then compress the unstripped modules into a tarball.
+#
+# COMPRESS_MODULES
+# If set to "1", then compress all modules into a tarball. The default
+# is without defining COMPRESS_MODULES.
+#
+# LD
+# Override linker (flags) to be used.
+#
+# HERMETIC_TOOLCHAIN
+# When set, the PATH during kernel build will be restricted to a set of
+# known prebuilt directories and selected host tools that are usually not
+# provided by prebuilt toolchains.
+#
+# ADDITIONAL_HOST_TOOLS
+# A whitespace separated set of tools that will be allowed to be used from
+# the host when running the build with HERMETIC_TOOLCHAIN=1.
+#
+# ABI_DEFINITION
+# Location of the abi definition file relative to <REPO_ROOT>/KERNEL_DIR
+# If defined (usually in build.config), also copy that abi definition to
+# <OUT_DIR>/dist/abi.xml when creating the distribution.
+#
+# KMI_SYMBOL_LIST
+# Location of the main KMI symbol list file relative to
+# <REPO_ROOT>/KERNEL_DIR If defined (usually in build.config), also copy
+# that symbol list definition to <OUT_DIR>/dist/abi_symbollist when
+# creating the distribution.
+#
+# ADDITIONAL_KMI_SYMBOL_LISTS
+# Location of secondary KMI symbol list files relative to
+# <REPO_ROOT>/KERNEL_DIR. If defined, these additional symbol lists will be
+# appended to the main one before proceeding to the distribution creation.
+#
+# KMI_ENFORCED
+# This is an indicative option to signal that KMI is enforced in this build
+# config. If set to "1", downstream KMI checking tools might respect it and
+# react to it by failing if KMI differences are detected.
+#
+# GENERATE_VMLINUX_BTF
+# If set to "1", generate a vmlinux.btf that is stripped of any debug
+# symbols, but contains type and symbol information within a .BTF section.
+# This is suitable for ABI analysis through BTF.
+#
+# Environment variables to influence the stages of the kernel build.
+#
+# SKIP_MRPROPER
+# if set to "1", skip `make mrproper`
+#
+# SKIP_DEFCONFIG
+# if set to "1", skip `make defconfig`
+#
+# SKIP_IF_VERSION_MATCHES
+# if defined, skip compiling anything if the kernel version in vmlinux
+# matches the expected kernel version. This is useful for mixed build, where
+# GKI kernel does not change frequently and we can simply skip everything
+# in build.sh. Note: if the expected version string contains "dirty", then
+# this flag would have not cause build.sh to exit early.
+#
+# PRE_DEFCONFIG_CMDS
+# Command evaluated before `make defconfig`
+#
+# POST_DEFCONFIG_CMDS
+# Command evaluated after `make defconfig` and before `make`.
+#
+# POST_KERNEL_BUILD_CMDS
+# Command evaluated after `make`.
+#
+# LTO=[full|thin|none]
+# If set to "full", force any kernel with LTO_CLANG support to be built
+# with full LTO, which is the most optimized method. This is the default,
+# but can result in very slow build times, especially when building
+# incrementally. (This mode does not require CFI to be disabled.)
+# If set to "thin", force any kernel with LTO_CLANG support to be built
+# with ThinLTO, which trades off some optimizations for incremental build
+# speed. This is nearly always what you want for local development. (This
+# mode does not require CFI to be disabled.)
+# If set to "none", force any kernel with LTO_CLANG support to be built
+# without any LTO (upstream default), which results in no optimizations
+# and also disables LTO-dependent features like CFI. This mode is not
+# recommended because CFI will not be able to catch bugs if it is
+# disabled.
+#
+# TAGS_CONFIG
+# if defined, calls ./scripts/tags.sh utility with TAGS_CONFIG as argument
+# and exit once tags have been generated
+#
+# IN_KERNEL_MODULES
+# if defined, install kernel modules
+#
+# SKIP_EXT_MODULES
+# if defined, skip building and installing of external modules
+#
+# DO_NOT_STRIP_MODULES
+# if set to "1", keep debug information for distributed modules.
+# Note, modules will still be stripped when copied into the ramdisk.
+#
+# EXTRA_CMDS
+# Command evaluated after building and installing kernel and modules.
+#
+# DIST_CMDS
+# Command evaluated after copying files to DIST_DIR
+#
+# SKIP_CP_KERNEL_HDR
+# if defined, skip installing kernel headers.
+#
+# BUILD_BOOT_IMG
+# if defined, build a boot.img binary that can be flashed into the 'boot'
+# partition of an Android device. The boot image contains a header as per the
+# format defined by https://source.android.com/devices/bootloader/boot-image-header
+# followed by several components like kernel, ramdisk, DTB etc. The ramdisk
+# component comprises of a GKI ramdisk cpio archive concatenated with a
+# vendor ramdisk cpio archive which is then gzipped. It is expected that
+# all components are present in ${DIST_DIR}.
+#
+# When the BUILD_BOOT_IMG flag is defined, the following flags that point to the
+# various components needed to build a boot.img also need to be defined.
+# - MKBOOTIMG_PATH=<path to the mkbootimg.py script which builds boot.img>
+# (defaults to tools/mkbootimg/mkbootimg.py)
+# - GKI_RAMDISK_PREBUILT_BINARY=<Name of the GKI ramdisk prebuilt which includes
+# the generic ramdisk components like init and the non-device-specific rc files>
+# - VENDOR_RAMDISK_BINARY=<Space separated list of vendor ramdisk binaries
+# which includes the device-specific components of ramdisk like the fstab
+# file and the device-specific rc files. If specifying multiple vendor ramdisks
+# and identical file paths exist in the ramdisks, the file from last ramdisk is used.>
+# - KERNEL_BINARY=<name of kernel binary, eg. Image.lz4, Image.gz etc>
+# - BOOT_IMAGE_HEADER_VERSION=<version of the boot image header>
+# (defaults to 3)
+# - BOOT_IMAGE_FILENAME=<name of the output file>
+# (defaults to "boot.img")
+# - KERNEL_CMDLINE=<string of kernel parameters for boot>
+# - KERNEL_VENDOR_CMDLINE=<string of kernel parameters for vendor boot image,
+# vendor_boot when BOOT_IMAGE_HEADER_VERSION >= 3; boot otherwise>
+# - VENDOR_FSTAB=<Path to the vendor fstab to be included in the vendor
+# ramdisk>
+# - TAGS_OFFSET=<physical address for kernel tags>
+# - RAMDISK_OFFSET=<ramdisk physical load address>
+# If the BOOT_IMAGE_HEADER_VERSION is less than 3, two additional variables must
+# be defined:
+# - BASE_ADDRESS=<base address to load the kernel at>
+# - PAGE_SIZE=<flash page size>
+# If BOOT_IMAGE_HEADER_VERSION >= 3, a vendor_boot image will be built
+# unless SKIP_VENDOR_BOOT is defined. A vendor_boot will also be generated if
+# BUILD_VENDOR_BOOT_IMG is set.
+#
+# BUILD_VENDOR_BOOT_IMG is incompatible with SKIP_VENDOR_BOOT, and is effectively a
+# nop if BUILD_BOOT_IMG is set.
+# - MODULES_LIST=<file to list of modules> list of modules to use for
+# vendor_boot.modules.load. If this property is not set, then the default
+# modules.load is used.
+# - TRIM_UNUSED_MODULES. If set, then modules not mentioned in
+# modules.load are removed from initramfs. If MODULES_LIST is unset, then
+# having this variable set effectively becomes a no-op.
+# - MODULES_BLOCKLIST=<modules.blocklist file> A list of modules which are
+# blocked from being loaded. This file is copied directly to staging directory,
+# and should be in the format:
+# blocklist module_name
+# - MKBOOTIMG_EXTRA_ARGS=<space-delimited mkbootimg arguments>
+# Refer to: ./mkbootimg.py --help
+# If BOOT_IMAGE_HEADER_VERSION >= 4, the following variable can be defined:
+# - VENDOR_BOOTCONFIG=<string of bootconfig parameters>
+# - INITRAMFS_VENDOR_RAMDISK_FRAGMENT_NAME=<name of the ramdisk fragment>
+# If BUILD_INITRAMFS is specified, then build the .ko and depmod files as
+# a standalone vendor ramdisk fragment named as the given string.
+# - INITRAMFS_VENDOR_RAMDISK_FRAGMENT_MKBOOTIMG_ARGS=<mkbootimg arguments>
+# Refer to: https://source.android.com/devices/bootloader/partitions/vendor-boot-partitions#mkbootimg-arguments
+#
+# VENDOR_RAMDISK_CMDS
+# When building vendor boot image, VENDOR_RAMDISK_CMDS enables the build
+# config file to specify command(s) for further altering the prebuilt vendor
+# ramdisk binary. For example, the build config file could add firmware files
+# on the vendor ramdisk (lib/firmware) for testing purposes.
+#
+# SKIP_UNPACKING_RAMDISK
+# If set, skip unpacking the vendor ramdisk and copy it as is, without
+# modifications, into the boot image. Also skip the mkbootfs step.
+#
+# AVB_SIGN_BOOT_IMG
+# if defined, sign the boot image using the AVB_BOOT_KEY. Refer to
+# https://android.googlesource.com/platform/external/avb/+/master/README.md
+# for details on what Android Verified Boot is and how it works. The kernel
+# prebuilt tool `avbtool` is used for signing.
+#
+# When AVB_SIGN_BOOT_IMG is defined, the following flags need to be
+# defined:
+# - AVB_BOOT_PARTITION_SIZE=<size of the boot partition in bytes>
+# - AVB_BOOT_KEY=<absolute path to the key used for signing> The Android test
+# key has been uploaded to the kernel/prebuilts/build-tools project here:
+# https://android.googlesource.com/kernel/prebuilts/build-tools/+/refs/heads/master/linux-x86/share/avb
+# - AVB_BOOT_ALGORITHM=<AVB_BOOT_KEY algorithm used> e.g. SHA256_RSA2048. For the
+# full list of supported algorithms, refer to the enum AvbAlgorithmType in
+# https://android.googlesource.com/platform/external/avb/+/refs/heads/master/libavb/avb_crypto.h
+# - AVB_BOOT_PARTITION_NAME=<name of the boot partition>
+# (defaults to BOOT_IMAGE_FILENAME without extension; by default, "boot")
+#
+# BUILD_INITRAMFS
+# if set to "1", build a ramdisk containing all .ko files and resulting
+# depmod artifacts
+#
+# BUILD_SYSTEM_DLKM
+# if set to "1", build a system_dlkm.img containing all signed GKI modules
+# and resulting depmod artifacts. GKI build exclusive; DO NOT USE with device
+# build configs files.
+#
+# SYSTEM_DLKM_MODULES_LIST
+# location (relative to the repo root directory) of an optional file
+# containing the list of kernel modules which shall be copied into a
+# system_dlkm partition image.
+#
+# MODULES_OPTIONS
+# A /lib/modules/modules.options file is created on the ramdisk containing
+# the contents of this variable, lines should be of the form: options
+# <modulename> <param1>=<val> <param2>=<val> ...
+#
+# MODULES_ORDER
+# location of an optional file containing the list of modules that are
+# expected to be built for the current configuration, in the modules.order
+# format, relative to the kernel source tree.
+#
+# GKI_MODULES_LIST
+# location of an optional file containing the list of GKI modules, relative
+# to the kernel source tree. This should be set in downstream builds to
+# ensure the ABI tooling correctly differentiates vendor/OEM modules and GKI
+# modules. This should not be set in the upstream GKI build.config.
+#
+# VENDOR_DLKM_MODULES_LIST
+# location (relative to the repo root directory) of an optional file
+# containing the list of kernel modules which shall be copied into a
+# vendor_dlkm partition image. Any modules passed into MODULES_LIST which
+# become part of the vendor_boot.modules.load will be trimmed from the
+# vendor_dlkm.modules.load.
+#
+# VENDOR_DLKM_MODULES_BLOCKLIST
+# location (relative to the repo root directory) of an optional file
+# containing a list of modules which are blocked from being loaded. This
+# file is copied directly to the staging directory and should be in the
+# format: blocklist module_name
+#
+# VENDOR_DLKM_PROPS
+# location (relative to the repo root directory) of a text file containing
+# the properties to be used for creation of a vendor_dlkm image
+# (filesystem, partition size, etc). If this is not set (and
+# VENDOR_DLKM_MODULES_LIST is), a default set of properties will be used
+# which assumes an ext4 filesystem and a dynamic partition.
+#
+# LZ4_RAMDISK
+# if set to "1", any ramdisks generated will be lz4 compressed instead of
+# gzip compressed.
+#
+# LZ4_RAMDISK_COMPRESS_ARGS
+# Command line arguments passed to lz4 command to control compression
+# level (defaults to "-12 --favor-decSpeed"). For iterative kernel
+# development where faster compression is more desirable than a high
+# compression ratio, it can be useful to control the compression ratio.
+#
+# TRIM_NONLISTED_KMI
+# if set to "1", enable the CONFIG_UNUSED_KSYMS_WHITELIST kernel config
+# option to un-export from the build any un-used and non-symbol-listed
+# (as per KMI_SYMBOL_LIST) symbol.
+#
+# KMI_SYMBOL_LIST_STRICT_MODE
+# if set to "1", add a build-time check between the KMI_SYMBOL_LIST and the
+# KMI resulting from the build, to ensure they match 1-1.
+#
+# KMI_STRICT_MODE_OBJECTS
+# optional list of objects to consider for the KMI_SYMBOL_LIST_STRICT_MODE
+# check. Defaults to 'vmlinux'.
+#
+# GKI_DIST_DIR
+# optional directory from which to copy GKI artifacts into DIST_DIR
+#
+# GKI_BUILD_CONFIG
+# If set, builds a second set of kernel images using GKI_BUILD_CONFIG to
+# perform a "mixed build." Mixed builds creates "GKI kernel" and "vendor
+# modules" from two different trees. The GKI kernel tree can be the Android
+# Common Kernel and the vendor modules tree can be a complete vendor kernel
+# tree. GKI_DIST_DIR (above) is set and the GKI kernel's DIST output is
+# copied to this DIST output. This allows a vendor tree kernel image to be
+# effectively discarded and a GKI kernel Image used from an Android Common
+# Kernel. Any variables prefixed with GKI_ are passed into into the GKI
+# kernel's build.sh invocation.
+#
+# This is incompatible with GKI_PREBUILTS_DIR.
+#
+# GKI_PREBUILTS_DIR
+# If set, copies an existing set of GKI kernel binaries to the DIST_DIR to
+# perform a "mixed build," as with GKI_BUILD_CONFIG. This allows you to
+# skip the additional compilation, if interested.
+#
+# This is incompatible with GKI_BUILD_CONFIG.
+#
+# The following must be present:
+# vmlinux
+# System.map
+# vmlinux.symvers
+# modules.builtin
+# modules.builtin.modinfo
+# Image.lz4
+#
+# BUILD_DTBO_IMG
+# if defined, package a dtbo.img using the provided *.dtbo files. The image
+# will be created under the DIST_DIR.
+#
+# The following flags control how the dtbo image is packaged.
+# MKDTIMG_DTBOS=<list of *.dtbo files> used to package the dtbo.img. The
+# *.dtbo files should be compiled by kbuild via the "make dtbs" command or
+# by adding each *.dtbo to the MAKE_GOALS.
+# MKDTIMG_FLAGS=<list of flags> to be passed to mkdtimg.
+#
+# DTS_EXT_DIR
+# Set this variable to compile an out-of-tree device tree. The value of
+# this variable is set to the kbuild variable "dtstree" which is used to
+# compile the device tree, it will be used to lookup files in FILES as well.
+# If this is set, then it's likely the dt-bindings are out-of-tree as well.
+# So be sure to set DTC_INCLUDE in the BUILD_CONFIG file to the include path
+# containing the dt-bindings.
+#
+# Update the MAKE_GOALS variable and the FILES variable to specify
+# the target dtb files with the path under ${DTS_EXT_DIR}, so that they
+# could be compiled and copied to the dist directory. Like the following:
+# DTS_EXT_DIR=common-modules/virtual-device
+# MAKE_GOALS="${MAKE_GOALS} k3399-rock-pi-4b.dtb"
+# FILES="${FILES} rk3399-rock-pi-4b.dtb"
+# where the dts file path is
+# common-modules/virtual-device/rk3399-rock-pi-4b.dts
+#
+# BUILD_VENDOR_KERNEL_BOOT
+# if set to "1", build a vendor_kernel_boot for kernel artifacts, such as kernel modules.
+# Since we design this partition to isolate kernel artifacts from vendor_boot image,
+# vendor_boot would not be repack and built if we set this property to "1".
+#
+# BUILD_GKI_CERTIFICATION_TOOLS
+# if set to "1", build a gki_certification_tools.tar.gz, which contains
+# the utilities used to certify GKI boot-*.img files.
+#
+# BUILD_GKI_ARTIFACTS
+# if defined when $ARCH is arm64, build a boot-img.tar.gz archive that
+# contains several GKI boot-*.img files with different kernel compression
+# format. Each boot image contains a boot header v4 as per the format
+# defined by https://source.android.com/devices/bootloader/boot-image-header
+# , followed by a kernel (no ramdisk). The kernel binaries are from
+# ${DIST_DIR}, e.g., Image, Image.gz, Image.lz4, etc. Individual
+# boot-*.img files are also generated, e.g., boot.img, boot-gz.img and
+# boot-lz4.img. It is expected that all components are present in
+# ${DIST_DIR}.
+#
+# if defined when $ARCH is x86_64, build a boot.img with the kernel image,
+# bzImage under ${DIST_DIR}. Additionally, create an archive boot-img.tar.gz
+# containing boot.img.
+#
+# if defined when $ARCH is neither arm64 nor x86_64, print an error message
+# then exist the build process.
+#
+# When the BUILD_GKI_ARTIFACTS flag is defined, the following flags also
+# need to be defined.
+# - MKBOOTIMG_PATH=<path to the mkbootimg.py script which builds boot.img>
+# (defaults to tools/mkbootimg/mkbootimg.py)
+# - BUILD_GKI_BOOT_IMG_SIZE=<The size of the boot.img to build>
+# This is required, and the file ${DIST_DIR}/Image must exist.
+# - BUILD_GKI_BOOT_IMG_GZ_SIZE=<The size of the boot-gz.img to build>
+# This is required only when ${DIST_DIR}/Image.gz is present.
+# - BUILD_GKI_BOOT_IMG_LZ4_SIZE=<The size of the boot-lz4.img to build>
+# This is required only when ${DIST_DIR}/Image.lz4 is present.
+# - BUILD_GKI_BOOT_IMG_<COMPRESSION>_SIZE=<The size of the
+# boot-${compression}.img to build> This is required
+# only when ${DIST_DIR}/Image.${compression} is present.
+
+# Note: For historic reasons, internally, OUT_DIR will be copied into
+# COMMON_OUT_DIR, and OUT_DIR will be then set to
+# ${COMMON_OUT_DIR}/${KERNEL_DIR}. This has been done to accommodate existing
+# build.config files that expect ${OUT_DIR} to point to the output directory of
+# the kernel build.
+#
+# The kernel is built in ${COMMON_OUT_DIR}/${KERNEL_DIR}.
+# Out-of-tree modules are built in ${COMMON_OUT_DIR}/${EXT_MOD} where
+# ${EXT_MOD} is the path to the module source code.
+
+set -e
+
+# Save environment for mixed build support.
+OLD_ENVIRONMENT=$(mktemp)
+export -p > ${OLD_ENVIRONMENT}
+
+export ROOT_DIR=$($(dirname $(readlink -f $0))/gettop.sh)
+source "${ROOT_DIR}/build/build_utils.sh"
+source "${ROOT_DIR}/build/_setup_env.sh"
+
+(
+ [[ "$KLEAF_SUPPRESS_BUILD_SH_DEPRECATION_WARNING" == "1" ]] && exit 0 || true
+ echo "Inferring equivalent Bazel command..."
+ bazel_command_code=0
+ eq_bazel_command=$(
+ ${ROOT_DIR}/build/kernel/kleaf/convert_to_bazel.sh # error messages goes to stderr
+ ) || bazel_command_code=$?
+ echo "*****************************************************************************" >&2
+ echo "* WARNING: build.sh is deprecated for this branch. Please migrate to Bazel. " >&2
+ echo "* See build/kernel/kleaf/README.md " >&2
+ if [[ $bazel_command_code -eq 0 ]]; then
+ echo "* Possibly equivalent Bazel command: " >&2
+ echo "*" >&2
+ echo "* \$ $eq_bazel_command" >&2
+ echo "*" >&2
+ else
+ echo "WARNING: Unable to infer an equivalent Bazel command. " >&2
+ fi
+ echo "* To suppress this warning, set KLEAF_SUPPRESS_BUILD_SH_DEPRECATION_WARNING=1" >&2
+ echo "*****************************************************************************" >&2
+ echo >&2
+)
+# Suppress deprecation warning for recursive build.sh invocation with GKI_BUILD_CONFIG
+export KLEAF_SUPPRESS_BUILD_SH_DEPRECATION_WARNING=1
+
+MAKE_ARGS=( "$@" )
+export MAKEFLAGS="-j$(nproc) ${MAKEFLAGS}"
+export MODULES_STAGING_DIR=$(readlink -m ${COMMON_OUT_DIR}/staging)
+export MODULES_PRIVATE_DIR=$(readlink -m ${COMMON_OUT_DIR}/private)
+export KERNEL_UAPI_HEADERS_DIR=$(readlink -m ${COMMON_OUT_DIR}/kernel_uapi_headers)
+export INITRAMFS_STAGING_DIR=${MODULES_STAGING_DIR}/initramfs_staging
+export SYSTEM_DLKM_STAGING_DIR=${MODULES_STAGING_DIR}/system_dlkm_staging
+export VENDOR_DLKM_STAGING_DIR=${MODULES_STAGING_DIR}/vendor_dlkm_staging
+export MKBOOTIMG_STAGING_DIR="${MODULES_STAGING_DIR}/mkbootimg_staging"
+
+if [ -n "${SKIP_VENDOR_BOOT}" -a -n "${BUILD_VENDOR_BOOT_IMG}" ]; then
+ echo "ERROR: SKIP_VENDOR_BOOT is incompatible with BUILD_VENDOR_BOOT_IMG." >&2
+ exit 1
+fi
+
+if [ -n "${GKI_BUILD_CONFIG}" ]; then
+ if [ -n "${GKI_PREBUILTS_DIR}" ]; then
+ echo "ERROR: GKI_BUILD_CONFIG is incompatible with GKI_PREBUILTS_DIR." >&2
+ exit 1
+ fi
+
+ GKI_OUT_DIR=${GKI_OUT_DIR:-${COMMON_OUT_DIR}/gki_kernel}
+ GKI_DIST_DIR=${GKI_DIST_DIR:-${GKI_OUT_DIR}/dist}
+
+ if [[ "${MAKE_GOALS}" =~ image|Image|vmlinux ]]; then
+ echo " Compiling Image and vmlinux in device kernel is not supported in mixed build mode"
+ exit 1
+ fi
+
+ # Inherit SKIP_MRPROPER, LTO, SKIP_DEFCONFIG unless overridden by corresponding GKI_* variables
+ GKI_ENVIRON=("SKIP_MRPROPER=${SKIP_MRPROPER}" "LTO=${LTO}" "SKIP_DEFCONFIG=${SKIP_DEFCONFIG}" "SKIP_IF_VERSION_MATCHES=${SKIP_IF_VERSION_MATCHES}")
+ # Explicitly unset EXT_MODULES since they should be compiled against the device kernel
+ GKI_ENVIRON+=("EXT_MODULES=")
+ # Explicitly unset GKI_BUILD_CONFIG in case it was set by in the old environment
+ # e.g. GKI_BUILD_CONFIG=common/build.config.gki.x86 ./build/build.sh would cause
+ # gki build recursively
+ GKI_ENVIRON+=("GKI_BUILD_CONFIG=")
+ # Explicitly unset KCONFIG_EXT_PREFIX in case it was set by the older environment.
+ GKI_ENVIRON+=("KCONFIG_EXT_PREFIX=")
+ # Any variables prefixed with GKI_ get set without that prefix in the GKI build environment
+ # e.g. GKI_BUILD_CONFIG=common/build.config.gki.aarch64 -> BUILD_CONFIG=common/build.config.gki.aarch64
+ GKI_ENVIRON+=($(export -p | sed -n -E -e 's/.* GKI_([^=]+=.*)$/\1/p' | tr '\n' ' '))
+ GKI_ENVIRON+=("OUT_DIR=${GKI_OUT_DIR}")
+ GKI_ENVIRON+=("DIST_DIR=${GKI_DIST_DIR}")
+ ( env -i bash -c "source ${OLD_ENVIRONMENT}; rm -f ${OLD_ENVIRONMENT}; export ${GKI_ENVIRON[*]} ; ./build/build.sh $*" ) || exit 1
+
+ # Dist dir must have vmlinux.symvers, modules.builtin.modinfo, modules.builtin
+ MAKE_ARGS+=("KBUILD_MIXED_TREE=$(readlink -m ${GKI_DIST_DIR})")
+else
+ rm -f ${OLD_ENVIRONMENT}
+fi
+
+if [ -n "${KCONFIG_EXT_PREFIX}" ]; then
+ # Since this is a prefix, make sure it ends with "/"
+ if [[ ! "${KCONFIG_EXT_PREFIX}" =~ \/$ ]]; then
+ KCONFIG_EXT_PREFIX=${KCONFIG_EXT_PREFIX}/
+ fi
+
+ # KCONFIG_EXT_PREFIX needs to be relative to KERNEL_DIR but we allow one to set
+ # it relative to ROOT_DIR for ease of use. So figure out what was used.
+ if [ -f "${ROOT_DIR}/${KCONFIG_EXT_PREFIX}Kconfig.ext" ]; then
+ # KCONFIG_EXT_PREFIX is currently relative to ROOT_DIR. So recalculate it to be
+ # relative to KERNEL_DIR
+ KCONFIG_EXT_PREFIX=$(realpath ${ROOT_DIR}/${KCONFIG_EXT_PREFIX} --relative-to ${KERNEL_DIR})
+ elif [ ! -f "${KERNEL_DIR}/${KCONFIG_EXT_PREFIX}Kconfig.ext" ]; then
+ echo "Couldn't find the Kconfig.ext in ${KCONFIG_EXT_PREFIX}" >&2
+ exit 1
+ fi
+
+ # Since this is a prefix, make sure it ends with "/"
+ if [[ ! "${KCONFIG_EXT_PREFIX}" =~ \/$ ]]; then
+ KCONFIG_EXT_PREFIX=${KCONFIG_EXT_PREFIX}/
+ fi
+ MAKE_ARGS+=("KCONFIG_EXT_PREFIX=${KCONFIG_EXT_PREFIX}")
+fi
+
+if [ -n "${DTS_EXT_DIR}" ]; then
+ if [[ "${MAKE_GOALS}" =~ dtbs|\.dtb|\.dtbo ]]; then
+ # DTS_EXT_DIR needs to be relative to KERNEL_DIR but we allow one to set
+ # it relative to ROOT_DIR for ease of use. So figure out what was used.
+ if [ -d "${ROOT_DIR}/${DTS_EXT_DIR}" ]; then
+ # DTS_EXT_DIR is currently relative to ROOT_DIR. So recalcuate it to be
+ # relative to KERNEL_DIR
+ DTS_EXT_DIR=$(realpath ${ROOT_DIR}/${DTS_EXT_DIR} --relative-to ${KERNEL_DIR})
+ elif [ ! -d "${KERNEL_DIR}/${DTS_EXT_DIR}" ]; then
+ echo "Couldn't find the dtstree -- ${DTS_EXT_DIR}" >&2
+ exit 1
+ fi
+ MAKE_ARGS+=("dtstree=${DTS_EXT_DIR}")
+ fi
+fi
+
+cd ${ROOT_DIR}
+
+if [ -n "${SKIP_IF_VERSION_MATCHES}" ]; then
+ if [ -f "${DIST_DIR}/vmlinux" ]; then
+ kernelversion="$(cd ${KERNEL_DIR} && make -s ${TOOL_ARGS} O=${OUT_DIR} kernelrelease)"
+ # Split grep into 2 steps. "Linux version" will always be towards top and fast to find. Don't
+ # need to search the entire vmlinux for it
+ if [[ ! "$kernelversion" =~ .*dirty.* ]] && \
+ grep -o -a -m1 "Linux version [^ ]* " ${DIST_DIR}/vmlinux | grep -q " ${kernelversion} " ; then
+ echo "========================================================"
+ echo " Skipping build because kernel version matches ${kernelversion}"
+ exit 0
+ fi
+ fi
+fi
+
+mkdir -p ${OUT_DIR} ${DIST_DIR}
+
+if [ -n "${GKI_PREBUILTS_DIR}" ]; then
+ echo "========================================================"
+ echo " Copying GKI prebuilts"
+ GKI_PREBUILTS_DIR=$(readlink -m ${GKI_PREBUILTS_DIR})
+ if [ ! -d "${GKI_PREBUILTS_DIR}" ]; then
+ echo "ERROR: ${GKI_PREBULTS_DIR} does not exist." >&2
+ exit 1
+ fi
+ for file in ${GKI_PREBUILTS_DIR}/*; do
+ filename=$(basename ${file})
+ if ! $(cmp -s ${file} ${DIST_DIR}/${filename}); then
+ cp -v ${file} ${DIST_DIR}/${filename}
+ fi
+ done
+ MAKE_ARGS+=("KBUILD_MIXED_TREE=${GKI_PREBUILTS_DIR}")
+fi
+
+echo "========================================================"
+echo " Setting up for build"
+if [ "${SKIP_MRPROPER}" != "1" ] ; then
+ set -x
+ (cd ${KERNEL_DIR} && make ${TOOL_ARGS} O=${OUT_DIR} "${MAKE_ARGS[@]}" mrproper)
+ set +x
+fi
+
+if [ -n "${PRE_DEFCONFIG_CMDS}" ]; then
+ echo "========================================================"
+ echo " Running pre-defconfig command(s):"
+ set -x
+ eval ${PRE_DEFCONFIG_CMDS}
+ set +x
+fi
+
+if [ "${SKIP_DEFCONFIG}" != "1" ] ; then
+ set -x
+ (cd ${KERNEL_DIR} && make ${TOOL_ARGS} O=${OUT_DIR} "${MAKE_ARGS[@]}" ${DEFCONFIG})
+ set +x
+
+ if [ -n "${POST_DEFCONFIG_CMDS}" ]; then
+ echo "========================================================"
+ echo " Running pre-make command(s):"
+ set -x
+ eval ${POST_DEFCONFIG_CMDS}
+ set +x
+ fi
+fi
+
+if [ "${LTO}" = "none" -o "${LTO}" = "thin" -o "${LTO}" = "full" ]; then
+ echo "========================================================"
+ echo " Modifying LTO mode to '${LTO}'"
+
+ set -x
+ if [ "${LTO}" = "none" ]; then
+ ${KERNEL_DIR}/scripts/config --file ${OUT_DIR}/.config \
+ -d LTO_CLANG \
+ -e LTO_NONE \
+ -d LTO_CLANG_THIN \
+ -d LTO_CLANG_FULL \
+ -d THINLTO \
+ --set-val FRAME_WARN 0
+ elif [ "${LTO}" = "thin" ]; then
+ # This is best-effort; some kernels don't support LTO_THIN mode
+ # THINLTO was the old name for LTO_THIN, and it was 'default y'
+ ${KERNEL_DIR}/scripts/config --file ${OUT_DIR}/.config \
+ -e LTO_CLANG \
+ -d LTO_NONE \
+ -e LTO_CLANG_THIN \
+ -d LTO_CLANG_FULL \
+ -e THINLTO
+ elif [ "${LTO}" = "full" ]; then
+ # THINLTO was the old name for LTO_THIN, and it was 'default y'
+ ${KERNEL_DIR}/scripts/config --file ${OUT_DIR}/.config \
+ -e LTO_CLANG \
+ -d LTO_NONE \
+ -d LTO_CLANG_THIN \
+ -e LTO_CLANG_FULL \
+ -d THINLTO
+ fi
+ (cd ${OUT_DIR} && make ${TOOL_ARGS} O=${OUT_DIR} "${MAKE_ARGS[@]}" olddefconfig)
+ set +x
+elif [ -n "${LTO}" ]; then
+ echo "LTO= must be one of 'none', 'thin' or 'full'."
+ exit 1
+fi
+
+if [ -n "${TAGS_CONFIG}" ]; then
+ echo "========================================================"
+ echo " Running tags command:"
+ set -x
+ (cd ${KERNEL_DIR} && SRCARCH=${ARCH} ./scripts/tags.sh ${TAGS_CONFIG})
+ set +x
+ exit 0
+fi
+
+# Truncate abi.prop file
+ABI_PROP=${DIST_DIR}/abi.prop
+: > ${ABI_PROP}
+
+if [ -n "${ABI_DEFINITION}" ]; then
+
+ ABI_XML=${DIST_DIR}/abi.xml
+
+ echo "KMI_DEFINITION=abi.xml" >> ${ABI_PROP}
+ echo "KMI_MONITORED=1" >> ${ABI_PROP}
+
+ if [ "${KMI_ENFORCED}" = "1" ]; then
+ echo "KMI_ENFORCED=1" >> ${ABI_PROP}
+ fi
+fi
+
+if [ -n "${KMI_SYMBOL_LIST}" ]; then
+ ABI_SL=${DIST_DIR}/abi_symbollist
+ echo "KMI_SYMBOL_LIST=abi_symbollist" >> ${ABI_PROP}
+fi
+
+# define the kernel binary and modules archive in the $ABI_PROP
+echo "KERNEL_BINARY=vmlinux" >> ${ABI_PROP}
+if [ "${COMPRESS_UNSTRIPPED_MODULES}" = "1" ]; then
+ echo "MODULES_ARCHIVE=${UNSTRIPPED_MODULES_ARCHIVE}" >> ${ABI_PROP}
+fi
+
+# Copy the abi_${arch}.xml file from the sources into the dist dir
+if [ -n "${ABI_DEFINITION}" ]; then
+ echo "========================================================"
+ echo " Copying abi definition to ${ABI_XML}"
+ pushd $ROOT_DIR/$KERNEL_DIR
+ cp "${ABI_DEFINITION}" ${ABI_XML}
+ popd
+fi
+
+# Copy the abi symbol list file from the sources into the dist dir
+if [ -n "${KMI_SYMBOL_LIST}" ]; then
+ ${ROOT_DIR}/build/abi/process_symbols --out-dir="$DIST_DIR" --out-file=abi_symbollist \
+ --report-file=abi_symbollist.report --in-dir="$ROOT_DIR/$KERNEL_DIR" \
+ "${KMI_SYMBOL_LIST}" ${ADDITIONAL_KMI_SYMBOL_LISTS} --verbose
+ pushd $ROOT_DIR/$KERNEL_DIR
+ if [ "${TRIM_NONLISTED_KMI}" = "1" ]; then
+ # Create the raw symbol list
+ cat ${ABI_SL} | \
+ ${ROOT_DIR}/build/abi/flatten_symbol_list > \
+ ${OUT_DIR}/abi_symbollist.raw
+
+ # Update the kernel configuration
+ ./scripts/config --file ${OUT_DIR}/.config \
+ -d UNUSED_SYMBOLS -e TRIM_UNUSED_KSYMS \
+ --set-str UNUSED_KSYMS_WHITELIST ${OUT_DIR}/abi_symbollist.raw
+ (cd ${OUT_DIR} && \
+ make O=${OUT_DIR} ${TOOL_ARGS} "${MAKE_ARGS[@]}" olddefconfig)
+ # Make sure the config is applied
+ grep CONFIG_UNUSED_KSYMS_WHITELIST ${OUT_DIR}/.config > /dev/null || {
+ echo "ERROR: Failed to apply TRIM_NONLISTED_KMI kernel configuration" >&2
+ echo "Does your kernel support CONFIG_UNUSED_KSYMS_WHITELIST?" >&2
+ exit 1
+ }
+
+ elif [ "${KMI_SYMBOL_LIST_STRICT_MODE}" = "1" ]; then
+ echo "ERROR: KMI_SYMBOL_LIST_STRICT_MODE requires TRIM_NONLISTED_KMI=1" >&2
+ exit 1
+ fi
+ popd # $ROOT_DIR/$KERNEL_DIR
+elif [ "${TRIM_NONLISTED_KMI}" = "1" ]; then
+ echo "ERROR: TRIM_NONLISTED_KMI requires a KMI_SYMBOL_LIST" >&2
+ exit 1
+elif [ "${KMI_SYMBOL_LIST_STRICT_MODE}" = "1" ]; then
+ echo "ERROR: KMI_SYMBOL_LIST_STRICT_MODE requires a KMI_SYMBOL_LIST" >&2
+ exit 1
+fi
+
+echo "========================================================"
+echo " Building kernel"
+
+set -x
+(cd ${OUT_DIR} && make O=${OUT_DIR} ${TOOL_ARGS} "${MAKE_ARGS[@]}" ${MAKE_GOALS})
+set +x
+
+if [ -n "${POST_KERNEL_BUILD_CMDS}" ]; then
+ echo "========================================================"
+ echo " Running post-kernel-build command(s):"
+ set -x
+ eval ${POST_KERNEL_BUILD_CMDS}
+ set +x
+fi
+
+if [ -n "${MODULES_ORDER}" ]; then
+ echo "========================================================"
+ echo " Checking the list of modules:"
+ if ! diff -u "${KERNEL_DIR}/${MODULES_ORDER}" "${OUT_DIR}/modules.order"; then
+ echo "ERROR: modules list out of date" >&2
+ echo "Update it with:" >&2
+ echo "cp ${OUT_DIR}/modules.order ${KERNEL_DIR}/${MODULES_ORDER}" >&2
+ exit 1
+ fi
+fi
+
+if [ "${KMI_SYMBOL_LIST_STRICT_MODE}" = "1" ]; then
+ echo "========================================================"
+ echo " Comparing the KMI and the symbol lists:"
+ set -x
+
+ gki_modules_list="${ROOT_DIR}/${KERNEL_DIR}/android/gki_system_dlkm_modules"
+ KMI_STRICT_MODE_OBJECTS="vmlinux $(sed 's/\.ko$//' ${gki_modules_list} | tr '\n' ' ')" \
+ ${ROOT_DIR}/build/abi/compare_to_symbol_list "${OUT_DIR}/Module.symvers" \
+ "${OUT_DIR}/abi_symbollist.raw"
+ set +x
+fi
+
+rm -rf ${MODULES_STAGING_DIR}
+mkdir -p ${MODULES_STAGING_DIR}
+
+if [ "${DO_NOT_STRIP_MODULES}" != "1" ]; then
+ MODULE_STRIP_FLAG="INSTALL_MOD_STRIP=1"
+fi
+
+if [ "${BUILD_INITRAMFS}" = "1" -o -n "${IN_KERNEL_MODULES}" ]; then
+ echo "========================================================"
+ echo " Installing kernel modules into staging directory"
+
+ (cd ${OUT_DIR} && \
+ make O=${OUT_DIR} ${TOOL_ARGS} ${MODULE_STRIP_FLAG} \
+ INSTALL_MOD_PATH=${MODULES_STAGING_DIR} "${MAKE_ARGS[@]}" modules_install)
+fi
+
+if [[ -z "${SKIP_EXT_MODULES}" ]] && [[ -n "${EXT_MODULES_MAKEFILE}" ]]; then
+ echo "========================================================"
+ echo " Building and installing external modules using ${EXT_MODULES_MAKEFILE}"
+
+ make -f "${EXT_MODULES_MAKEFILE}" KERNEL_SRC=${ROOT_DIR}/${KERNEL_DIR} \
+ O=${OUT_DIR} ${TOOL_ARGS} ${MODULE_STRIP_FLAG} \
+ INSTALL_HDR_PATH="${KERNEL_UAPI_HEADERS_DIR}/usr" \
+ INSTALL_MOD_PATH=${MODULES_STAGING_DIR} "${MAKE_ARGS[@]}"
+fi
+
+if [[ -z "${SKIP_EXT_MODULES}" ]] && [[ -n "${EXT_MODULES}" ]]; then
+ echo "========================================================"
+ echo " Building external modules and installing them into staging directory"
+
+ for EXT_MOD in ${EXT_MODULES}; do
+ # The path that we pass in via the variable M needs to be a relative path
+ # relative to the kernel source directory. The source files will then be
+ # looked for in ${KERNEL_DIR}/${EXT_MOD_REL} and the object files (i.e. .o
+ # and .ko) files will be stored in ${OUT_DIR}/${EXT_MOD_REL}. If we
+ # instead set M to an absolute path, then object (i.e. .o and .ko) files
+ # are stored in the module source directory which is not what we want.
+ EXT_MOD_REL=$(realpath ${ROOT_DIR}/${EXT_MOD} --relative-to ${KERNEL_DIR})
+ # The output directory must exist before we invoke make. Otherwise, the
+ # build system behaves horribly wrong.
+ mkdir -p ${OUT_DIR}/${EXT_MOD_REL}
+ set -x
+ make -C ${EXT_MOD} M=${EXT_MOD_REL} KERNEL_SRC=${ROOT_DIR}/${KERNEL_DIR} \
+ O=${OUT_DIR} ${TOOL_ARGS} "${MAKE_ARGS[@]}"
+ make -C ${EXT_MOD} M=${EXT_MOD_REL} KERNEL_SRC=${ROOT_DIR}/${KERNEL_DIR} \
+ O=${OUT_DIR} ${TOOL_ARGS} ${MODULE_STRIP_FLAG} \
+ INSTALL_MOD_PATH=${MODULES_STAGING_DIR} \
+ INSTALL_MOD_DIR="extra/${EXT_MOD}" \
+ INSTALL_HDR_PATH="${KERNEL_UAPI_HEADERS_DIR}/usr" \
+ "${MAKE_ARGS[@]}" modules_install
+ set +x
+ done
+
+fi
+
+if [ "${BUILD_GKI_CERTIFICATION_TOOLS}" = "1" ]; then
+ GKI_CERTIFICATION_TOOLS_TAR="gki_certification_tools.tar.gz"
+ echo "========================================================"
+ echo " Generating ${GKI_CERTIFICATION_TOOLS_TAR}"
+ GKI_CERTIFICATION_BINARIES=(avbtool certify_bootimg)
+ GKI_CERTIFICATION_TOOLS_ROOT="${ROOT_DIR}/prebuilts/kernel-build-tools/linux-x86"
+ GKI_CERTIFICATION_FILES="${GKI_CERTIFICATION_BINARIES[@]/#/bin/}"
+ tar -czf ${DIST_DIR}/${GKI_CERTIFICATION_TOOLS_TAR} \
+ -C ${GKI_CERTIFICATION_TOOLS_ROOT} ${GKI_CERTIFICATION_FILES}
+fi
+
+echo "========================================================"
+echo " Generating test_mappings.zip"
+TEST_MAPPING_FILES=${OUT_DIR}/test_mapping_files.txt
+find ${ROOT_DIR} -name TEST_MAPPING \
+ -not -path "${ROOT_DIR}/\.git*" \
+ -not -path "${ROOT_DIR}/\.repo*" \
+ -not -path "${ROOT_DIR}/out*" \
+ > ${TEST_MAPPING_FILES}
+soong_zip -o ${DIST_DIR}/test_mappings.zip -C ${ROOT_DIR} -l ${TEST_MAPPING_FILES}
+
+if [ -n "${EXTRA_CMDS}" ]; then
+ echo "========================================================"
+ echo " Running extra build command(s):"
+ set -x
+ eval ${EXTRA_CMDS}
+ set +x
+fi
+
+OVERLAYS_OUT=""
+for ODM_DIR in ${ODM_DIRS}; do
+ OVERLAY_DIR=${ROOT_DIR}/device/${ODM_DIR}/overlays
+
+ if [ -d ${OVERLAY_DIR} ]; then
+ OVERLAY_OUT_DIR=${OUT_DIR}/overlays/${ODM_DIR}
+ mkdir -p ${OVERLAY_OUT_DIR}
+ make -C ${OVERLAY_DIR} DTC=${OUT_DIR}/scripts/dtc/dtc \
+ OUT_DIR=${OVERLAY_OUT_DIR} "${MAKE_ARGS[@]}"
+ OVERLAYS=$(find ${OVERLAY_OUT_DIR} -name "*.dtbo")
+ OVERLAYS_OUT="$OVERLAYS_OUT $OVERLAYS"
+ fi
+done
+
+echo "========================================================"
+echo " Copying files"
+for FILE in ${FILES}; do
+ if [ -f ${OUT_DIR}/${FILE} ]; then
+ echo " $FILE"
+ cp -p ${OUT_DIR}/${FILE} ${DIST_DIR}/
+ elif [[ "${FILE}" =~ \.dtb|\.dtbo ]] && \
+ [ -n "${DTS_EXT_DIR}" ] && [ -f "${OUT_DIR}/${DTS_EXT_DIR}/${FILE}" ] ; then
+ # DTS_EXT_DIR is recalculated before to be relative to KERNEL_DIR
+ echo " $FILE"
+ cp -p "${OUT_DIR}/${DTS_EXT_DIR}/${FILE}" "${DIST_DIR}/"
+ else
+ echo " $FILE is not a file, skipping"
+ fi
+done
+
+if [ -f ${OUT_DIR}/vmlinux-gdb.py ]; then
+ echo "========================================================"
+ KERNEL_GDB_SCRIPTS_TAR=${DIST_DIR}/kernel-gdb-scripts.tar.gz
+ echo " Copying kernel gdb scripts to $KERNEL_GDB_SCRIPTS_TAR"
+ (cd $OUT_DIR && tar -czf $KERNEL_GDB_SCRIPTS_TAR --dereference vmlinux-gdb.py scripts/gdb/linux/*.py)
+fi
+
+for FILE in ${OVERLAYS_OUT}; do
+ OVERLAY_DIST_DIR=${DIST_DIR}/$(dirname ${FILE#${OUT_DIR}/overlays/})
+ echo " ${FILE#${OUT_DIR}/}"
+ mkdir -p ${OVERLAY_DIST_DIR}
+ cp ${FILE} ${OVERLAY_DIST_DIR}/
+done
+
+if [ -z "${SKIP_CP_KERNEL_HDR}" ]; then
+ echo "========================================================"
+ echo " Installing UAPI kernel headers:"
+ mkdir -p "${KERNEL_UAPI_HEADERS_DIR}/usr"
+ make -C ${OUT_DIR} O=${OUT_DIR} ${TOOL_ARGS} \
+ INSTALL_HDR_PATH="${KERNEL_UAPI_HEADERS_DIR}/usr" "${MAKE_ARGS[@]}" \
+ headers_install
+ # The kernel makefiles create files named ..install.cmd and .install which
+ # are only side products. We don't want those. Let's delete them.
+ find ${KERNEL_UAPI_HEADERS_DIR} \( -name ..install.cmd -o -name .install \) -exec rm '{}' +
+ KERNEL_UAPI_HEADERS_TAR=${DIST_DIR}/kernel-uapi-headers.tar.gz
+ echo " Copying kernel UAPI headers to ${KERNEL_UAPI_HEADERS_TAR}"
+ tar -czf ${KERNEL_UAPI_HEADERS_TAR} --directory=${KERNEL_UAPI_HEADERS_DIR} usr/
+fi
+
+if [ -z "${SKIP_CP_KERNEL_HDR}" ] ; then
+ echo "========================================================"
+ KERNEL_HEADERS_TAR=${DIST_DIR}/kernel-headers.tar.gz
+ echo " Copying kernel headers to ${KERNEL_HEADERS_TAR}"
+ pushd $ROOT_DIR/$KERNEL_DIR
+ find arch include $OUT_DIR -name *.h -print0 \
+ | tar -czf $KERNEL_HEADERS_TAR \
+ --absolute-names \
+ --dereference \
+ --transform "s,.*$OUT_DIR,," \
+ --transform "s,^,kernel-headers/," \
+ --null -T -
+ popd
+fi
+
+if [ "${GENERATE_VMLINUX_BTF}" = "1" ]; then
+ echo "========================================================"
+ echo " Generating ${DIST_DIR}/vmlinux.btf"
+
+ (
+ cd ${DIST_DIR}
+ cp -a vmlinux vmlinux.btf
+ pahole -J vmlinux.btf
+ llvm-strip --strip-debug vmlinux.btf
+ )
+
+fi
+
+if [ -n "${GKI_DIST_DIR}" ]; then
+ echo "========================================================"
+ echo " Copying files from GKI kernel"
+ cp -rv ${GKI_DIST_DIR}/* ${DIST_DIR}/
+fi
+
+if [ -n "${DIST_CMDS}" ]; then
+ echo "========================================================"
+ echo " Running extra dist command(s):"
+ # if DIST_CMDS requires UAPI headers, make sure a warning appears!
+ if [ ! -d "${KERNEL_UAPI_HEADERS_DIR}/usr" ]; then
+ echo "WARN: running without UAPI headers"
+ fi
+ set -x
+ eval ${DIST_CMDS}
+ set +x
+fi
+
+MODULES=$(find ${MODULES_STAGING_DIR} -type f -name "*.ko")
+if [ -n "${MODULES}" ]; then
+ if [ -n "${IN_KERNEL_MODULES}" -o -n "${EXT_MODULES}" -o -n "${EXT_MODULES_MAKEFILE}" ]; then
+ echo "========================================================"
+ echo " Copying modules files"
+ cp -p ${MODULES} ${DIST_DIR}
+ if [ "${COMPRESS_MODULES}" = "1" ]; then
+ echo " Archiving modules to ${MODULES_ARCHIVE}"
+ tar --transform="s,.*/,," -czf ${DIST_DIR}/${MODULES_ARCHIVE} ${MODULES[@]}
+ fi
+ fi
+ if [ "${BUILD_INITRAMFS}" = "1" ]; then
+ echo "========================================================"
+ echo " Creating initramfs"
+ rm -rf ${INITRAMFS_STAGING_DIR}
+ create_modules_staging "${MODULES_LIST}" ${MODULES_STAGING_DIR} \
+ ${INITRAMFS_STAGING_DIR} "${MODULES_BLOCKLIST}" "-e"
+
+ MODULES_ROOT_DIR=$(echo ${INITRAMFS_STAGING_DIR}/lib/modules/*)
+ cp ${MODULES_ROOT_DIR}/modules.load ${DIST_DIR}/modules.load
+ if [ -n "${BUILD_VENDOR_BOOT_IMG}" ]; then
+ cp ${MODULES_ROOT_DIR}/modules.load ${DIST_DIR}/vendor_boot.modules.load
+ elif [ -n "${BUILD_VENDOR_KERNEL_BOOT}" ]; then
+ cp ${MODULES_ROOT_DIR}/modules.load ${DIST_DIR}/vendor_kernel_boot.modules.load
+ fi
+ echo "${MODULES_OPTIONS}" > ${MODULES_ROOT_DIR}/modules.options
+
+ mkbootfs "${INITRAMFS_STAGING_DIR}" >"${MODULES_STAGING_DIR}/initramfs.cpio"
+ ${RAMDISK_COMPRESS} "${MODULES_STAGING_DIR}/initramfs.cpio" >"${DIST_DIR}/initramfs.img"
+ fi
+fi
+
+if [ "${BUILD_SYSTEM_DLKM}" = "1" ]; then
+ build_system_dlkm
+fi
+
+if [ -n "${VENDOR_DLKM_MODULES_LIST}" ]; then
+ build_vendor_dlkm
+fi
+
+if [ -n "${UNSTRIPPED_MODULES}" ]; then
+ echo "========================================================"
+ echo " Copying unstripped module files for debugging purposes (not loaded on device)"
+ mkdir -p ${UNSTRIPPED_DIR}
+ for MODULE in ${UNSTRIPPED_MODULES}; do
+ find ${MODULES_PRIVATE_DIR} -name ${MODULE} -exec cp {} ${UNSTRIPPED_DIR} \;
+ done
+ if [ "${COMPRESS_UNSTRIPPED_MODULES}" = "1" ]; then
+ tar -czf ${DIST_DIR}/${UNSTRIPPED_MODULES_ARCHIVE} -C $(dirname ${UNSTRIPPED_DIR}) $(basename ${UNSTRIPPED_DIR})
+ rm -rf ${UNSTRIPPED_DIR}
+ fi
+fi
+
+[ -n "${GKI_MODULES_LIST}" ] && cp ${ROOT_DIR}/${KERNEL_DIR}/${GKI_MODULES_LIST} ${DIST_DIR}/
+
+echo "========================================================"
+echo " Files copied to ${DIST_DIR}"
+
+if [ -n "${BUILD_BOOT_IMG}" -o -n "${BUILD_VENDOR_BOOT_IMG}" \
+ -o -n "${BUILD_VENDOR_KERNEL_BOOT}" ] ; then
+ build_boot_images
+fi
+
+if [ -n "${BUILD_GKI_ARTIFACTS}" ] ; then
+ build_gki_artifacts
+fi
+
+if [ -n "${BUILD_DTBO_IMG}" ]; then
+ make_dtbo
+fi
+
+# No trace_printk use on build server build
+if readelf -a ${DIST_DIR}/vmlinux 2>&1 | grep -q trace_printk_fmt; then
+ echo "========================================================"
+ echo "WARN: Found trace_printk usage in vmlinux."
+ echo ""
+ echo "trace_printk will cause trace_printk_init_buffers executed in kernel"
+ echo "start, which will increase memory and lead warning shown during boot."
+ echo "We should not carry trace_printk in production kernel."
+ echo ""
+ if [ ! -z "${STOP_SHIP_TRACEPRINTK}" ]; then
+ echo "ERROR: stop ship on trace_printk usage." 1>&2
+ exit 1
+ fi
+fi
--
2.25.1