msm_kernel_vm.bzl 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. load("//build/bazel_common_rules/dist:dist.bzl", "copy_to_dist_dir")
  2. load("//build/kernel/kleaf:constants.bzl", "aarch64_outs")
  3. load(
  4. "//build/kernel/kleaf:kernel.bzl",
  5. "kernel_build",
  6. "kernel_build_config",
  7. "kernel_compile_commands",
  8. "kernel_images",
  9. "kernel_modules_install",
  10. "kernel_uapi_headers_cc_library",
  11. "merged_kernel_uapi_headers",
  12. )
  13. load(
  14. "//build:msm_kernel_extensions.bzl",
  15. "define_extras",
  16. "get_build_config_fragments",
  17. "get_dtb_list",
  18. "get_dtbo_list",
  19. "get_dtstree",
  20. "get_vendor_ramdisk_binaries",
  21. )
  22. load("@bazel_skylib//rules:write_file.bzl", "write_file")
  23. load(":msm_common.bzl", "define_top_level_config", "gen_config_without_source_lines", "get_out_dir")
  24. load(":msm_dtc.bzl", "define_dtc_dist")
  25. load(":image_opts.bzl", "vm_image_opts")
  26. load(":target_variants.bzl", "vm_variants")
  27. def define_make_vm_dtb_img(target, dtb_list, page_size):
  28. compiled_dtbs = ["//msm-kernel:{}/{}".format(target, t) for t in dtb_list]
  29. dtb_cmd = "compiled_dtb_list=\"{}\"\n".format(" ".join(["$(location {})".format(d) for d in compiled_dtbs]))
  30. dtb_cmd += """
  31. $(location //prebuilts/kernel-build-tools:linux-x86/bin/mkdtboimg) \\
  32. create "$@" --page_size={page_size} $${{compiled_dtb_list}}
  33. """.format(page_size = page_size)
  34. native.genrule(
  35. name = "{}_vm_dtb_img".format(target),
  36. srcs = compiled_dtbs,
  37. outs = ["{}-dtb.img".format(target)],
  38. tools = ["//prebuilts/kernel-build-tools:linux-x86/bin/mkdtboimg"],
  39. cmd_bash = dtb_cmd,
  40. )
  41. def _define_build_config(
  42. msm_target,
  43. variant,
  44. target,
  45. defconfig = None,
  46. vm_image_opts = vm_image_opts(),
  47. build_config_fragments = []):
  48. """Creates a kernel_build_config for an MSM target
  49. Creates a `kernel_build_config` for input to a `kernel_build` rule.
  50. Args:
  51. msm_target: name of target platform (e.g. "kalama")
  52. variant: variant of kernel to build (e.g. "gki")
  53. target: combined name (e.g. "kalama_gki")
  54. vm_image_opts: vm_image_opts structure containing boot image options
  55. build_config_fragments: build.config fragments to embed
  56. """
  57. if defconfig:
  58. msm_arch = defconfig
  59. else:
  60. msm_arch = msm_target.replace("-", "_")
  61. write_file(
  62. name = "{}_build_config_bazel".format(target),
  63. out = "build.config.msm.{}.generated".format(target),
  64. content = [
  65. 'KERNEL_DIR="msm-kernel"',
  66. "VARIANTS=({})".format(" ".join([v.replace("-", "_") for v in vm_variants])),
  67. "MSM_ARCH={}".format(msm_arch),
  68. "VARIANT={}".format(variant.replace("-", "_")),
  69. "PREFERRED_USERSPACE={}".format(vm_image_opts.preferred_usespace),
  70. "VM_DTB_IMG_CREATE={}".format(int(vm_image_opts.vm_dtb_img_create)),
  71. "KERNEL_OFFSET=0x%X" % vm_image_opts.kernel_offset,
  72. "DTB_OFFSET=0x%X" % vm_image_opts.dtb_offset,
  73. "RAMDISK_OFFSET=0x%X" % vm_image_opts.ramdisk_offset,
  74. "CMDLINE_CPIO_OFFSET=0x%X" % vm_image_opts.cmdline_cpio_offset,
  75. "VM_SIZE_EXT4={}".format(vm_image_opts.vm_size_ext4),
  76. "DUMMY_IMG_SIZE={}".format(vm_image_opts.dummy_img_size),
  77. "", # Needed for newline at end of file
  78. ],
  79. )
  80. top_level_config = define_top_level_config(target)
  81. common_config = gen_config_without_source_lines("build.config.common", target)
  82. # Concatenate build config fragments to form the final config
  83. kernel_build_config(
  84. name = "{}_build_config".format(target),
  85. srcs = [
  86. # do not sort
  87. top_level_config,
  88. "build.config.constants",
  89. common_config,
  90. "build.config.aarch64",
  91. ":{}_build_config_bazel".format(target),
  92. ] + [fragment for fragment in build_config_fragments] + [
  93. "build.config.msm.common",
  94. "build.config.msm.vm",
  95. ],
  96. )
  97. def _define_kernel_build(
  98. target,
  99. dtb_list,
  100. dtbo_list,
  101. dtstree):
  102. """Creates a `kernel_build` and other associated definitions
  103. This is where the main kernel build target is created (e.g. `//msm-kernel:kalama_gki`).
  104. Many other rules will take this `kernel_build` as an input.
  105. Args:
  106. target: name of main Bazel target (e.g. `kalama_gki`)
  107. dtb_list: device tree blobs expected to be built
  108. dtbo_list: device tree overlay blobs expected to be built
  109. """
  110. out_list = [".config", "Module.symvers"]
  111. if dtb_list:
  112. out_list += dtb_list
  113. if dtbo_list:
  114. out_list += dtbo_list
  115. # Add basic kernel outputs
  116. out_list += aarch64_outs
  117. # VM builds don't build compressed, so remove from list
  118. out_list.remove("Image.lz4")
  119. out_list.remove("Image.gz")
  120. # Add initramfs outputs
  121. out_list.extend([
  122. "usr/gen_init_cpio",
  123. "usr/initramfs_data.cpio",
  124. "usr/initramfs_inc_data",
  125. "scripts/sign-file",
  126. "certs/signing_key.x509",
  127. ])
  128. kernel_build(
  129. name = target,
  130. outs = out_list,
  131. build_config = ":{}_build_config".format(target),
  132. dtstree = dtstree,
  133. kmi_symbol_list = None,
  134. additional_kmi_symbol_lists = None,
  135. module_signing_key = ":signing_key",
  136. system_trusted_key = ":verity_cert.pem",
  137. abi_definition = None,
  138. visibility = ["//visibility:public"],
  139. )
  140. kernel_images(
  141. name = "{}_images".format(target),
  142. kernel_build = ":{}".format(target),
  143. boot_image_outs = [],
  144. build_boot = False,
  145. kernel_modules_install = None,
  146. )
  147. merged_kernel_uapi_headers(
  148. name = "{}_merged_kernel_uapi_headers".format(target),
  149. kernel_build = ":{}".format(target),
  150. )
  151. kernel_compile_commands(
  152. name = "{}_compile_commands".format(target),
  153. kernel_build = ":{}".format(target),
  154. )
  155. def _define_kernel_dist(target, msm_target, variant):
  156. """Creates distribution targets for kernel builds
  157. When Bazel builds everything, the outputs end up buried in `bazel-bin`.
  158. These rules are used to copy the build artifacts to `out/msm-kernel-<target>/dist/`
  159. with proper permissions, etc.
  160. Args:
  161. target: name of main Bazel target (e.g. `kalama_gki`)
  162. """
  163. dist_dir = get_out_dir(msm_target, variant) + "/dist"
  164. msm_dist_targets = [
  165. # do not sort
  166. ":{}".format(target),
  167. ":{}_images".format(target),
  168. ":{}_merged_kernel_uapi_headers".format(target),
  169. ":{}_build_config".format(target),
  170. ":{}_vm_dtb_img".format(target),
  171. ":signing_key",
  172. ":verity_key",
  173. ]
  174. copy_to_dist_dir(
  175. name = "{}_dist".format(target),
  176. data = msm_dist_targets,
  177. dist_dir = dist_dir,
  178. flat = True,
  179. wipe_dist_dir = True,
  180. allow_duplicate_filenames = True,
  181. mode_overrides = {
  182. # do not sort
  183. "**/vmlinux": "755",
  184. "**/Image": "755",
  185. "**/*.dtb*": "755",
  186. "**/gen_init_cpio": "755",
  187. "**/sign-file": "755",
  188. "**/*": "644",
  189. },
  190. log = "info",
  191. )
  192. def _define_uapi_library(target):
  193. """Define a cc_library for userspace programs to use
  194. Args:
  195. target: kernel_build target name (e.g. "kalama_gki")
  196. """
  197. kernel_uapi_headers_cc_library(
  198. name = "{}_uapi_header_library".format(target),
  199. kernel_build = ":{}".format(target),
  200. )
  201. def define_msm_vm(
  202. msm_target,
  203. variant,
  204. defconfig = None,
  205. vm_image_opts = vm_image_opts()):
  206. """Top-level kernel build definition macro for a VM MSM platform
  207. Args:
  208. msm_target: name of target platform (e.g. "kalama")
  209. variant: variant of kernel to build (e.g. "gki")
  210. vm_image_opts: vm_image_opts structure containing boot image options
  211. """
  212. if not variant in vm_variants:
  213. fail("{} not defined in target_variants.bzl vm_variants!".format(variant))
  214. # Enforce format of "//msm-kernel:target-foo_variant-bar" (underscore is the delimeter
  215. # between target and variant)
  216. target = msm_target.replace("_", "-") + "_" + variant.replace("_", "-")
  217. dtb_list = get_dtb_list(msm_target)
  218. dtbo_list = get_dtbo_list(msm_target)
  219. dtstree = get_dtstree(msm_target)
  220. build_config_fragments = get_build_config_fragments(msm_target)
  221. _define_build_config(
  222. msm_target,
  223. variant,
  224. target,
  225. defconfig,
  226. vm_image_opts = vm_image_opts,
  227. build_config_fragments = build_config_fragments,
  228. )
  229. _define_kernel_build(
  230. target,
  231. dtb_list,
  232. dtbo_list,
  233. dtstree,
  234. )
  235. _define_kernel_dist(target, msm_target, variant)
  236. _define_uapi_library(target)
  237. define_dtc_dist(target, msm_target, variant)
  238. # use only dtbs related to the variant for dtb image creation
  239. if "tuivm" in msm_target:
  240. seg_dtb_list = [dtb for dtb in dtb_list if "-vm-" in dtb]
  241. elif "oemvm" in msm_target:
  242. seg_dtb_list = [dtb for dtb in dtb_list if "-oemvm-" in dtb]
  243. define_make_vm_dtb_img(target, seg_dtb_list, vm_image_opts.dummy_img_size)
  244. define_extras(target, flavor = "vm")