| 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 |
| |