build.config.msm.common 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. # The following additional environment variables are considered when build.config.msm.common is
  2. # included:
  3. #
  4. # DT_OVERLAY_SUPPORT
  5. # If set, then create a dtbo.img
  6. # BUILD_VENDOR_DLKM
  7. # If set, then enables creation of vendor_dlkm.img using all modules
  8. # not part of the first-stage ramdisk
  9. # EXTRA_CONFIGS
  10. # All files in this list are sourced
  11. CONFIG_DIR=arch/${ARCH}/configs
  12. CONFIG_TARGET=msm.${MSM_ARCH}
  13. ################################################################################
  14. ##
  15. function compile_external_dtc() {
  16. (
  17. # Bazel builds dtc with its own rule, so skip if building with Bazel
  18. if [ -n "$BUILDING_WITH_BAZEL" ]; then
  19. return
  20. fi
  21. OUT_DIR=${COMMON_OUT_DIR}/external/dtc
  22. [ "${SKIP_MRPROPER}" != "1" ] && rm -rf ${OUT_DIR}
  23. cd ${ROOT_DIR}/external/dtc
  24. DTC_MAKE_ARGS=("CC=${HOSTCC}" "AR=${AR}")
  25. DTC_MAKE_ARGS+=("LDFLAGS=${HOSTLDFLAGS} -fuse-ld=${LD##*.} --rtlib=compiler-rt")
  26. DTC_MAKE_ARGS+=("EXTRA_CFLAGS=${HOSTCFLAGS}")
  27. # PKG_CONFIG would pull from host environment to determine if libyaml and libpython are
  28. # available. We want a hermetic build that doesn't rely on host tools, so make dtc build think
  29. # none of these libraries are installed.
  30. DTC_MAKE_ARGS+=("PKG_CONFIG=false")
  31. make all install "${DTC_MAKE_ARGS[@]}" NO_PYTHON=1 PREFIX=${COMMON_OUT_DIR}/host
  32. )
  33. }
  34. append_cmd PRE_DEFCONFIG_CMDS 'compile_external_dtc'
  35. ################################################################################
  36. ## DTB general support
  37. DTB_DIR=vendor/qcom
  38. DTC_OVERLAY_TEST_EXT=ufdt_apply_overlay
  39. # Force /__symbols__ generation for all DTB[O]s
  40. DTC_FLAGS="-@"
  41. MAKE_GOALS+=" dtbs"
  42. function install_dtbs() {
  43. local INSTALL_DTBS_PATH="${COMMON_OUT_DIR}/dtb_staging"
  44. local dtb_types="${MSM_ARCH}-"
  45. if [ "${DT_OVERLAY_SUPPORT}" -eq "1" ]; then
  46. dtb_types="${dtb_types}overlays-"
  47. fi
  48. # Staging directory required because arch/$ARCH/arm64/boot/dts/**/*.dtb structure copied and
  49. # we want a flat directory with all the DTBs.
  50. rm -rf "${INSTALL_DTBS_PATH}"
  51. (cd ${KERNEL_DIR} && make "${TOOL_ARGS[@]}" O=${OUT_DIR} "${MAKE_ARGS[@]}" INSTALL_DTBS_PATH="${INSTALL_DTBS_PATH}" DTB_TYPES="${dtb_types}" dtbs_install)
  52. cp $(find ${INSTALL_DTBS_PATH} -type f \( -name "*.dtb" -o -name "*.dtbo" \)) ${DIST_DIR}
  53. }
  54. append_cmd DIST_CMDS 'install_dtbs'
  55. ADDITIONAL_HOST_TOOLS+=" install" # for scripts/Makefile.dtbinst
  56. FILES+="
  57. .config
  58. Module.symvers
  59. "
  60. ################################################################################
  61. ## Variant Selection
  62. if [ -z "${VARIANT}" ] || [ "${VARIANT}" == "default" ]; then
  63. VARIANT="${VARIANTS[0]}"
  64. fi
  65. if ( for v in "${VARIANTS[@]}"; do if [ "${v}" = "${VARIANT}" ]; then exit 1; fi; done; exit 0 ) ; then
  66. echo "Unsupported variant '${VARIANT}'"
  67. exit 1
  68. fi
  69. ################################################################################
  70. ## defconfigs
  71. # Helper function to let build.config files merge config fragments
  72. # Usage: append_cmd PRE_DEFCONFIG_CMDS 'merge_defconfig_fragment ${DEFCONFIG} ${fragment_config}'
  73. DEFCONFIG_FRAGMENTS=""
  74. function merge_defconfig_fragments() {
  75. if ( [ -z "${DEFCONFIG_FRAGMENTS}" ] ||
  76. [ "${DEFCONFIG_FRAGMENTS}" = "${DEFCONFIG}" ] ); then
  77. echo "No defconfig fragments for ${DEFCONFIG}"
  78. return
  79. fi
  80. local output=$(mktemp)
  81. mkdir -p $(dirname ${OUT_DIR}/arch/${ARCH}/configs/${DEFCONFIG})
  82. KCONFIG_CONFIG=${OUT_DIR}/arch/${ARCH}/configs/${DEFCONFIG} \
  83. ${KERNEL_DIR}/scripts/kconfig/merge_config.sh \
  84. -m -r -y ${DEFCONFIG_FRAGMENTS} | tee $output
  85. set +x
  86. if grep -q -E -e "Previous value: [^=]+=[ym]" $output; then
  87. echo "========================================================"
  88. echo "ERROR! Detected overridden config!"
  89. grep -C 1 -E -e "Previous value: [^=]+=[ym]" $output >&2
  90. rm $output
  91. exit 1
  92. fi
  93. local temp_config=$(mktemp)
  94. (cd ${KERNEL_DIR} && KCONFIG_CONFIG=${temp_config} make "${TOOL_ARGS[@]}" O=${OUT_DIR} "${MAKE_ARGS[@]}" ${DEFCONFIG}) 2>&1 | tee $output
  95. if grep -q -e "warning:" $output; then
  96. echo "========================================================"
  97. echo "ERROR! Treating config warnings as errors"
  98. grep -e "warning" $output >&2
  99. rm $output $temp_config
  100. exit 1
  101. fi
  102. rm $output $temp_config
  103. set -x
  104. }
  105. append_cmd PRE_DEFCONFIG_CMDS "merge_defconfig_fragments"
  106. function check_merged_defconfig() {
  107. if ( [ -z "${DEFCONFIG_FRAGMENTS}" ] ||
  108. [ "${DEFCONFIG_FRAGMENTS}" = "${DEFCONFIG}" ] ); then
  109. return
  110. fi
  111. local output=$(mktemp)
  112. ${KERNEL_DIR}/scripts/diffconfig "${OUT_DIR}/arch/${ARCH}/configs/${DEFCONFIG}" ${OUT_DIR}/.config > $output
  113. set +x
  114. # Allow CONFIG_CMDLINE changes
  115. if grep -q -v -E -e "^\+" -e "^CMDLINE " $output; then
  116. echo "========================================================"
  117. echo "ERROR! Defconfig fragment did not apply as expected"
  118. grep -v -E -e "^\+" -e "^CMDLINE " $output
  119. rm $output
  120. exit 1
  121. fi
  122. rm $output
  123. set -x
  124. }
  125. append_cmd POST_DEFCONFIG_CMDS "check_merged_defconfig"
  126. # Wrapper function around merge_defconfig_fragment to reduce repeated logic
  127. # Usage: apply_defconfig_fragment ${KERNEL_DIR}/cuttlefish.fragment cuttlefish-gki_defconfig
  128. function apply_defconfig_fragment() {
  129. FRAGMENT_CONFIG=$1
  130. if [ -z "${DEFCONFIG_FRAGMENTS}" ]; then
  131. DEFCONFIG_FRAGMENTS="${KERNEL_DIR}/arch/${ARCH}/configs/${DEFCONFIG}"
  132. fi
  133. DEFCONFIG_FRAGMENTS="${DEFCONFIG_FRAGMENTS} $1"
  134. DEFCONFIG="${2:-${DEFCONFIG}}"
  135. }
  136. ################################################################################
  137. ## DLKMs
  138. if [ -e "${KERNEL_DIR}/modules.list.${CONFIG_TARGET}" ]; then
  139. MODULES_LIST=${KERNEL_DIR}/modules.list.${CONFIG_TARGET}
  140. fi
  141. if [ -e "${KERNEL_DIR}/modules.blocklist.${CONFIG_TARGET}" ]; then
  142. MODULES_BLOCKLIST="${KERNEL_DIR}/modules.blocklist.${CONFIG_TARGET}"
  143. VENDOR_DLKM_MODULES_BLOCKLIST="${KERNEL_DIR}/modules.blocklist.${CONFIG_TARGET}"
  144. fi
  145. if [ "${BUILD_VENDOR_DLKM}" == "1" ]; then
  146. COMBINED_MODULE_LIST=$(mktemp)
  147. fi
  148. if [[ "${PREPARE_SYSTEM_DLKM}" == "1" && ! -z "${SYSTEM_DLKM_MODULES_LIST}" ]]; then
  149. {
  150. awk -F'/' '{print $NF}' ${SYSTEM_DLKM_MODULES_LIST}
  151. [ -f "${MODULES_LIST}" ] && cat "${MODULES_LIST}"
  152. } | sed -e '/^$/d' > ${COMBINED_MODULE_LIST}
  153. fi
  154. function prepare_vendor_dlkm() {
  155. if [ -z "${VENDOR_DLKM_MODULES_LIST}" ]; then
  156. local module_list_flag=
  157. if [ -s "${COMBINED_MODULE_LIST}" ]; then
  158. module_list_flag="-f ${COMBINED_MODULE_LIST}"
  159. elif [ -e "${MODULES_LIST}" ]; then
  160. module_list_flag="-f ${MODULES_LIST}"
  161. else
  162. module_list_flag="-e ''"
  163. fi
  164. (cd "${MODULES_STAGING_DIR}/lib/modules/" && find -type f -name "*.ko" -printf "%f\n") | \
  165. grep -w -v ${module_list_flag} - > ${MODULES_STAGING_DIR}/vendor_dlkm.modules.load
  166. VENDOR_DLKM_MODULES_LIST="${MODULES_STAGING_DIR}/vendor_dlkm.modules.load"
  167. if [[ ! -s ${VENDOR_DLKM_MODULES_LIST} ]]; then
  168. echo "========================================================"
  169. echo "WARNING: ${VENDOR_DLKM_MODULES_LIST} is empty file!"
  170. fi
  171. fi
  172. SUPER_IMAGE_CONTENTS+=("${DIST_DIR}/vendor_dlkm.img")
  173. rm ${COMBINED_MODULE_LIST}
  174. }
  175. if [ "${BUILD_VENDOR_DLKM}" == "1" ]; then
  176. append_cmd DIST_CMDS 'prepare_vendor_dlkm'
  177. if [ -e "${KERNEL_DIR}/modules.vendor_blocklist.${CONFIG_TARGET}" ]; then
  178. VENDOR_DLKM_MODULES_BLOCKLIST="${KERNEL_DIR}/modules.vendor_blocklist.${CONFIG_TARGET}"
  179. fi
  180. fi
  181. function prepare_system_dlkm() {
  182. if [ "${PREPARE_SYSTEM_DLKM}" == "1" ]; then
  183. if [ -e "${KERNEL_DIR}/modules.systemdlkm_blocklist.${CONFIG_TARGET}" ]; then
  184. SYSTEM_DLKM_MODULES_BLOCKLIST="${KERNEL_DIR}/modules.systemdlkm_blocklist.${CONFIG_TARGET}"
  185. cp $SYSTEM_DLKM_MODULES_BLOCKLIST ${DIST_DIR}/system_dlkm.modules.blocklist
  186. if [ "${APPEND_SYSTEM_DLKM_BLOCKLIST_TO_VENDOR_RAMDISK}" == "1" ]; then
  187. (cd ${DIST_DIR} && find -name system_dlkm.modules.blocklist | cpio -H newc -o) > ${DIST_DIR}/system_dlkm_blocklist.cpio
  188. if [ -n "${TARGET_HAS_SEPARATE_RD}" ]; then
  189. ${RAMDISK_COMPRESS} "${DIST_DIR}/system_dlkm_blocklist.cpio" >"${DIST_DIR}/system_dlkm_blocklist.${RAMDISK_EXT}"
  190. cat "${DIST_DIR}/system_dlkm_blocklist.${RAMDISK_EXT}" >>"${VENDOR_RAMDISK_BINARY}"
  191. else
  192. VENDOR_RAMDISK_BINARY+=" ${DIST_DIR}/system_dlkm_blocklist.cpio"
  193. fi
  194. fi
  195. fi
  196. SUPER_IMAGE_CONTENTS+=("${DIST_DIR}/system_dlkm.img")
  197. fi
  198. }
  199. append_cmd DIST_CMDS 'prepare_system_dlkm'
  200. KERNEL_BINARY=Image
  201. ################################################################################
  202. ## DT Overlay
  203. LIBUFDT_PREBUILTS_BIN=tools/libufdt/utils/src
  204. function make_dtbo_img() {
  205. mkdir -p ${DIST_DIR}/
  206. mkdtboimg create ${DIST_DIR}/dtbo.img --page_size=${PAGE_SIZE} ${DIST_DIR}/*.dtbo
  207. }
  208. if [ ! -z $DT_OVERLAY_SUPPORT ] && [ ! $DT_OVERLAY_SUPPORT -eq "0" ]; then
  209. append_cmd DIST_CMDS 'make_dtbo_img'
  210. fi
  211. ################################################################################
  212. ## Cating all the DTBs and create a dtb.img
  213. function make_dtb_img() {
  214. mkdir -p ${DIST_DIR}/
  215. mkdtboimg create ${DIST_DIR}/${MSM_ARCH}-dtb.img --page_size=${PAGE_SIZE} ${DIST_DIR}/*.dtb
  216. }
  217. if [ ! -z $DTB_IMG_CREATE ] && [ ! $DTB_IMG_CREATE -eq "0" ]; then
  218. append_cmd DIST_CMDS 'make_dtb_img'
  219. fi
  220. ################################################################################
  221. ## Cating all the DTBs and create a dtb.img for a virtual machine
  222. function make_vm_dtb_img() {
  223. mkdir -p ${DIST_DIR}/
  224. for i in "${!MKDTIMGDTBS[@]}"; do
  225. mkdtboimg create ${DIST_DIR}/${i}-dtb.img --page_size=${PAGE_SIZE} ${DIST_DIR}/${MKDTIMGDTBS[$i]}*.dtb
  226. done
  227. }
  228. if [ -n "$VM_DTB_IMG_CREATE" ] && [ ! "$VM_DTB_IMG_CREATE" -eq "0" ]; then
  229. append_cmd DIST_CMDS 'make_vm_dtb_img'
  230. fi
  231. ################################################################################
  232. ## Miscellaneous
  233. if [ -n "${EXTRA_CONFIGS}" ]; then
  234. for extra_config in "${EXTRA_CONFIGS[@]}"
  235. do
  236. . ${extra_config}
  237. done
  238. fi
  239. ################################################################################
  240. ## Copy prebuilt files to ${COMMON_OUT_DIR}/host/bin to be used by CI tools
  241. DIST_BINS="""
  242. build/android/merge_dtbs.py
  243. build/build-tools/path/linux-x86/ufdt_apply_overlay
  244. """
  245. function copy_dist_bins() (
  246. set +x
  247. set -e
  248. mkdir -p ${COMMON_OUT_DIR}/host/bin
  249. echo "Copying binaries to host/bin"
  250. for FILE in ${DIST_BINS}; do
  251. if [ -f ${ROOT_DIR}/${FILE} ]; then
  252. echo " $FILE"
  253. cp -p ${ROOT_DIR}/${FILE} ${COMMON_OUT_DIR}/host/bin/
  254. else
  255. echo " $FILE is not a file, skipping"
  256. fi
  257. done
  258. )
  259. append_cmd DIST_CMDS 'copy_dist_bins'