Firefly开源社区

标题: 【开发基础】 FirePrime 内核编译脚本,将生成的文件放到指定目录,不在内核源码树里 [打印本页]

作者: 54zw    时间: 2016-5-24 14:57
标题: 【开发基础】 FirePrime 内核编译脚本,将生成的文件放到指定目录,不在内核源码树里
本帖最后由 54zw 于 2016-5-24 15:15 编辑

为什么这样做的起源:
由于看内核代码经常都需要在源码树中搜索各种各样的东西,所以不希望有太多的二进制文件在内核的源码树种,给搜索的时候造成视觉上的干扰,而且源码树里肯定会用代码管理工具比如git管理,不希望在git status的时候看到这些不必要的文件,当然可以在.gitinore里处理,但是不爽。

大产们都是怎么做的?(参考高通):
把代码编译的东西生成到制定目录去,比如android的out/target/product/vendor/xxxx这样的目录下,很多厂商都喜欢放在
out/target/product/vendor/obj/KERNEL 这个目录,有点不成文的规定了都,所以这里也制定生成的目录为
out/target/product/rk312x/obj/KERNEL/这个

原理:在编译内核的时候加上 O选项制定生成目录即可
比如fireprime的命令如下:
make -C kernel -j8 rk3128-fireprime.img  O=/home/zerowaylin/fireprimes/out/target/product/rk312x/obj/KERNEL CROSS_COMPILE=/home/zerowaylin/fireprimes/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi- ARCH=arm

O=后面指定的就是编译生成的目录

我的编辑内核,并且生成boot.img system.img的脚本如下:也可以去我的github上下载,地址:点这里下载我的fireprime编译脚本genk
可以看到脚本前面有一段比较扯的mkdir cp的操作,这些是只在FirePrime代码才需要的,有兴趣的看官可以看下我github上我在高通和Freescale上用的genk的脚本,不会有这样的问题。编译代码需要liense 没仔细看是怎么玩的:( 有点讨厌,这样理应在make的时候也处理了,应该是Makefile没写好
  1. ###### compile kernel ###############
  2. #rm -rvf  op/obj/KERNEL/drivers/gpu/arm/mali400/ump/linux
  3. #rm -rvf  op/obj/KERNEL/drivers/gpu/arm/mali400/mali/linux
  4. mkdir -p op/obj/KERNEL/drivers/gpu/arm/mali400/ump/linux
  5. mkdir -p op/obj/KERNEL/drivers/gpu/arm/mali400/mali/linux
  6. mkdir -p op/obj/KERNEL/drivers/net/wireless/rockchip_wlan/wifi_sys

  7. cp -rf kernel/logo.bmp op/obj/KERNEL/
  8. cp -rfd kernel/drivers/gpu/arm/mali400/ump/arch-default op/obj/KERNEL/drivers/gpu/arm/mali400/ump/
  9. cp -rfd kernel/drivers/gpu/arm/mali400/ump/linux/license op/obj/KERNEL/drivers/gpu/arm/mali400/ump/linux/license
  10. cp -rfd kernel/drivers/gpu/arm/mali400/mali/linux/license op/obj/KERNEL/drivers/gpu/arm/mali400/mali/linux/license

  11. #make config
  12. #make -C kernel fireprime_defconfig  O=/home/zerowaylin/fireprimes/out/target/product/rk312x/obj/KERNEL CROSS_COMPILE=/home/zerowaylin/fireprimes/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi- ARCH=arm

  13. #make
  14. make -C kernel -j8 rk3128-fireprime.img  O=/home/zerowaylin/fireprimes/out/target/product/rk312x/obj/KERNEL CROSS_COMPILE=/home/zerowaylin/fireprimes/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi- ARCH=arm
  15. ###### compile kernel ###############

  16. ############ start make images #################
  17. #set -e

  18. . build/envsetup.sh >/dev/null && setpaths

  19. export PATH=$ANDROID_BUILD_PATHS:$PATH
  20. TARGET_PRODUCT=`get_build_var TARGET_PRODUCT`
  21. TARGET_HARDWARE=`get_build_var TARGET_BOARD_HARDWARE`
  22. echo TARGET_PRODUCT=$TARGET_PRODUCT
  23. echo TARGET_HARDWARE=$TARGET_HARDWARE
  24. TARGET="withoutkernel"

  25. IMG_TARGET='all'

  26. echo IMG_TARGET=$IMG_TARGET , ota = $TARGET

  27. IMAGE_PATH=rockdev/Image-$TARGET_PRODUCT

  28. FSTYPE=ext4
  29. echo system filesysystem is $FSTYPE

  30. BOARD_CONFIG=device/rockchip/common/device.mk

  31. KERNEL_SRC_PATH="$PWD/out/target/product/rk312x/obj/KERNEL"
  32. echo $KERNEL_SRC_PATH

  33. [ $(id -u) -eq 0 ] || FAKEROOT=fakeroot

  34. BOOT_OTA="ota"

  35. cp -rfv $KERNEL_SRC_PATH/arch/arm/boot/zImage /home/zerowaylin/fireprimes/out/target/product/rk312x/kernel

  36. echo -n "create boot.img without kernel... "
  37. [ -d $OUT/root ] && \
  38. mkbootfs $OUT/root | minigzip > $OUT/ramdisk.img && \
  39. truncate -s "%4" $OUT/ramdisk.img && \
  40. rkst/mkkrnlimg $OUT/ramdisk.img $IMAGE_PATH/boot.img >/dev/null
  41. echo "done."

  42. echo -n "create system.img... "
  43. system_size=`ls -l $OUT/system.img | awk '{print $5;}'`
  44. [ $system_size -gt "0" ] || { echo "Please make first!!!" && exit 1; }
  45. MAKE_EXT4FS_ARGS=" -L system -S $OUT/root/file_contexts -a system $IMAGE_PATH/system.img $OUT/system"
  46. ok=0
  47. while [ "$ok" = "0" ]; do
  48.         make_ext4fs -l $system_size $MAKE_EXT4FS_ARGS >/dev/null 2>&1 &&
  49.         tune2fs -c -1 -i 0 $IMAGE_PATH/system.img >/dev/null 2>&1 &&
  50.         ok=1 || system_size=$(($system_size + 5242880))
  51. done
  52. e2fsck -fyD $IMAGE_PATH/system.img >/dev/null 2>&1 || true
  53. echo "done."

  54. echo "Copy kenrel.img..."
  55. echo "Copy resource.img..."
  56. cp $KERNEL_SRC_PATH/kernel.img $IMAGE_PATH/
  57. cp $KERNEL_SRC_PATH/resource.img $IMAGE_PATH/

  58. chmod a+r -R $IMAGE_PATH/
  59. ############ end make images #################
复制代码
写在后面的话:
第一次使用的时候打开脚本里配置config的那行,只要不需要修改配置文件就可以注释掉那行。
把这个脚本放到你的环境变量里,就可以在android顶层目录里直接执行genk来编译




作者: qinchwuhuai    时间: 2016-7-10 19:33
牛逼,我说每次编译完找不到文件了,谢谢




欢迎光临 Firefly开源社区 (https://dev.t-firefly.com/) Powered by Discuz! X3.1