#!/bin/bash set -e __usage=" Usage: build-image-docker [OPTIONS] Build raspberrypi image. Options: -d, --docker DOCKER_FILE The URL/path of the Docker image, which defaults to https://repo.openeuler.org/openEuler-20.03-LTS-SP1/docker_img/aarch64/openEuler-docker.aarch64.tar.xz -n, --name IMAGE_NAME The raspberrypi image name to be built. -k, --kernel KERNEL_URL The URL of kernel source's repository, which defaults to https://gitee.com/openeuler/raspberrypi-kernel.git. -b, --branch KERNEL_BRANCH The branch name of kernel source's repository, which defaults to openEuler-20.03-LTS. -c, --config KERNEL_DEFCONFIG The name/path of defconfig file when compiling kernel, which defaults to openeuler-raspi_defconfig. -r, --repo REPO_INFO Required! The URL/path of target repo file or list of repo's baseurls which should be a space separated list. -s, --spec SPEC The image's specification: headless, xfce, ukui, dde or the file path of rpmlist. The default is headless. --cores N The number of cpu cores to be used during making. -h, --help Show command help. " help() { echo "$__usage" exit $1 } parseargs() { if [ "x$#" == "x0" ]; then return 1 fi while [ "x$#" != "x0" ]; do if [ "x$1" == "x-h" -o "x$1" == "x--help" ]; then return 1 elif [ "x$1" == "x" ]; then shift elif [ "x$1" == "x-d" -o "x$1" == "x--docker" ]; then docker_file=`echo $2` shift shift elif [ "x$1" == "x-n" -o "x$1" == "x--name" ]; then img_name=`echo $2` params="${params} -n ${img_name}" shift shift elif [ "x$1" == "x-k" -o "x$1" == "x--kernel" ]; then kernel_url=`echo $2` params="${params} -k ${kernel_url}" shift shift elif [ "x$1" == "x-b" -o "x$1" == "x--branch" ]; then kernel_branch=`echo $2` params="${params} -b ${kernel_branch}" shift shift elif [ "x$1" == "x-c" -o "x$1" == "x--config" ]; then default_defconfig=`echo $2` if [ "x$default_defconfig" != "x" ]; then if [ ! -f $default_defconfig ]; then echo `date` - ERROR, config file $default_defconfig can not be found. exit 2 else cp $default_defconfig ${params_dir}/ defconfig_name=${default_defconfig##*/} default_defconfig=${params_dir_indocker}/${defconfig_name} fi fi params="${params} -c ${default_defconfig}" shift shift elif [ "x$1" == "x-r" -o "x$1" == "x--repo" ]; then repo_file=`echo $2` if [ "x$repo_file" != "x" -a "x${repo_file:0:4}" != "xhttp" ]; then if [ ! -f $repo_file ]; then echo `date` - ERROR, repo file $repo_file can not be found. exit 2 else cp $repo_file ${params_dir}/ repo_file_name=${repo_file##*/} repo_file=${params_dir_indocker}/${repo_file_name} fi fi params="${params} -r ${repo_file}" shift shift elif [ "x$1" == "x-s" -o "x$1" == "x--spec" ]; then spec_param=`echo $2` if [ "x$spec_param" == "xheadless" ] || [ "x$spec_param" == "x" ] \ || [ "x$spec_param" == "xxfce" ] || [ "x$spec_param" == "xukui" ] \ || [ "x$spec_param" == "xdde" ]; then : elif [ -f $spec_param ]; then cp $spec_param ${params_dir}/ spec_file_name=${spec_param##*/} $spec_param=${params_dir_indocker}/${spec_file_name} else echo `date` - ERROR, please check your params in option -s or --spec. exit 2 fi params="${params} -s ${spec_param}" shift shift elif [ "x$1" == "x--cores" ]; then make_cores=`echo $2` params="${params} --cores ${make_cores}" shift shift else echo `date` - ERROR, UNKNOWN params "$@" return 2 fi done } ERROR(){ echo `date` - ERROR, $* | tee -a ${log_dir}/${builddate}.log } LOG(){ echo `date` - INFO, $* | tee -a ${log_dir}/${builddate}.log } cur_dir=$(cd $(dirname $0);pwd) docker_file="https://repo.openeuler.org/openEuler-20.03-LTS-SP1/docker_img/aarch64/openEuler-docker.aarch64.tar.xz" workdir=${cur_dir}/raspi_output_common buildid=$(date +%Y%m%d%H%M%S) builddate=${buildid:0:8} log_dir=${workdir}/log params_dir=${workdir}/params euler_dir=${cur_dir}/config-common params_dir_indocker=/work/raspi_output_common/params if [ -d ${params_dir} ]; then rm -rf ${params_dir} fi mkdir -p ${params_dir} parseargs "$@" || help $? if [ "x${docker_file:0:4}" == "xhttp" ]; then wget ${docker_file} -P ${params_dir}/ elif [ -f $docker_file ]; then cp ${docker_file} ${params_dir}/ else echo `date` - ERROR, docker file $docker_file can not be found. exit 2 fi if [ "x$repo_file" == "x" ] ; then echo `date` - ERROR, \"-r REPO_INFO or --repo REPO_INFO\" missing. help 2 fi if [ ! -d ${log_dir} ]; then mkdir ${log_dir} fi docker_file_name=${docker_file##*/} docker_img_name=`docker load --input ${params_dir}/${docker_file_name}` docker_img_name=${docker_img_name##*: } LOG build raspi image with docker: ${docker_file}. (echo "FROM $docker_img_name" && grep -v FROM ${euler_dir}/Dockerfile_makeraspi) | docker build -t ${docker_img_name}-${buildid} --no-cache -f- ${euler_dir} echo docker run --rm --privileged=true \ -v ${cur_dir}/build-image-common.sh:/work/build-image-common.sh \ -v ${euler_dir}:/work/config-common \ -v ${cur_dir}/config:/work/config \ -v ${workdir}:/work/raspi_output_common \ ${docker_img_name}-${buildid} ${params} docker run --rm --privileged=true \ -v ${cur_dir}/build-image-common.sh:/work/build-image-common.sh \ -v ${euler_dir}:/work/config-common \ -v ${cur_dir}/config:/work/config \ -v ${workdir}:/work/raspi_output_common \ ${docker_img_name}-${buildid} ${params} chmod -R a+r ${workdir}/img docker image rm ${docker_img_name}-${buildid} LOG LOG Done.