|
【开发基础】 FirePrime 内核编译脚本,将生成的文件放到指定目录,不在内核源码树里
发表于 2016-5-24 14:57:48
浏览:7350
|
回复:1
打印
只看该作者
[复制链接]
楼主
本帖最后由 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没写好
- ###### compile kernel ###############
- #rm -rvf op/obj/KERNEL/drivers/gpu/arm/mali400/ump/linux
- #rm -rvf op/obj/KERNEL/drivers/gpu/arm/mali400/mali/linux
- mkdir -p op/obj/KERNEL/drivers/gpu/arm/mali400/ump/linux
- mkdir -p op/obj/KERNEL/drivers/gpu/arm/mali400/mali/linux
- mkdir -p op/obj/KERNEL/drivers/net/wireless/rockchip_wlan/wifi_sys
- cp -rf kernel/logo.bmp op/obj/KERNEL/
- cp -rfd kernel/drivers/gpu/arm/mali400/ump/arch-default op/obj/KERNEL/drivers/gpu/arm/mali400/ump/
- cp -rfd kernel/drivers/gpu/arm/mali400/ump/linux/license op/obj/KERNEL/drivers/gpu/arm/mali400/ump/linux/license
- cp -rfd kernel/drivers/gpu/arm/mali400/mali/linux/license op/obj/KERNEL/drivers/gpu/arm/mali400/mali/linux/license
- #make config
- #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
- #make
- 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
- ###### compile kernel ###############
- ############ start make images #################
- #set -e
- . build/envsetup.sh >/dev/null && setpaths
- export PATH=$ANDROID_BUILD_PATHS:$PATH
- TARGET_PRODUCT=`get_build_var TARGET_PRODUCT`
- TARGET_HARDWARE=`get_build_var TARGET_BOARD_HARDWARE`
- echo TARGET_PRODUCT=$TARGET_PRODUCT
- echo TARGET_HARDWARE=$TARGET_HARDWARE
- TARGET="withoutkernel"
- IMG_TARGET='all'
- echo IMG_TARGET=$IMG_TARGET , ota = $TARGET
- IMAGE_PATH=rockdev/Image-$TARGET_PRODUCT
- FSTYPE=ext4
- echo system filesysystem is $FSTYPE
- BOARD_CONFIG=device/rockchip/common/device.mk
- KERNEL_SRC_PATH="$PWD/out/target/product/rk312x/obj/KERNEL"
- echo $KERNEL_SRC_PATH
- [ $(id -u) -eq 0 ] || FAKEROOT=fakeroot
- BOOT_OTA="ota"
- cp -rfv $KERNEL_SRC_PATH/arch/arm/boot/zImage /home/zerowaylin/fireprimes/out/target/product/rk312x/kernel
- echo -n "create boot.img without kernel... "
- [ -d $OUT/root ] && \
- mkbootfs $OUT/root | minigzip > $OUT/ramdisk.img && \
- truncate -s "%4" $OUT/ramdisk.img && \
- rkst/mkkrnlimg $OUT/ramdisk.img $IMAGE_PATH/boot.img >/dev/null
- echo "done."
- echo -n "create system.img... "
- system_size=`ls -l $OUT/system.img | awk '{print $5;}'`
- [ $system_size -gt "0" ] || { echo "Please make first!!!" && exit 1; }
- MAKE_EXT4FS_ARGS=" -L system -S $OUT/root/file_contexts -a system $IMAGE_PATH/system.img $OUT/system"
- ok=0
- while [ "$ok" = "0" ]; do
- make_ext4fs -l $system_size $MAKE_EXT4FS_ARGS >/dev/null 2>&1 &&
- tune2fs -c -1 -i 0 $IMAGE_PATH/system.img >/dev/null 2>&1 &&
- ok=1 || system_size=$(($system_size + 5242880))
- done
- e2fsck -fyD $IMAGE_PATH/system.img >/dev/null 2>&1 || true
- echo "done."
- echo "Copy kenrel.img..."
- echo "Copy resource.img..."
- cp $KERNEL_SRC_PATH/kernel.img $IMAGE_PATH/
- cp $KERNEL_SRC_PATH/resource.img $IMAGE_PATH/
- chmod a+r -R $IMAGE_PATH/
- ############ end make images #################
复制代码 写在后面的话:
第一次使用的时候打开脚本里配置config的那行,只要不需要修改配置文件就可以注释掉那行。
把这个脚本放到你的环境变量里,就可以在android顶层目录里直接执行genk来编译
|
|