2024-10-25 17:48:08 +08:00
#!/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 } "
2025-05-07 15:38:58 +08:00
KERNEL_COMPILE = "-common"
2024-10-25 17:48:08 +08:00
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"
2025-05-07 15:38:58 +08:00
KERNEL_COMPILE = ""
2024-10-25 17:48:08 +08:00
2025-05-07 15:38:58 +08:00
workdir = ${ cur_dir } /raspi_output
2024-10-25 17:48:08 +08:00
buildid = $( date +%Y%m%d%H%M%S)
builddate = ${ buildid : 0 : 8 }
log_dir = ${ workdir } /log
params_dir = ${ workdir } /params
2025-05-07 15:38:58 +08:00
params_dir_indocker = /work/raspi_output/params
euler_dir = ${ cur_dir } /config$KERNEL_COMPILE
2024-10-25 17:48:08 +08:00
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 \
2025-05-07 15:38:58 +08:00
-v ${ cur_dir } /build-image$KERNEL_COMPILE .sh:/work/build-image.sh \
2024-10-25 17:48:08 +08:00
-v ${ euler_dir } :/work/config-common \
-v ${ cur_dir } /config:/work/config \
2025-05-07 15:38:58 +08:00
-v ${ workdir } :/work/raspi_output \
2024-10-25 17:48:08 +08:00
${ docker_img_name } -${ buildid } ${ params }
docker run --rm --privileged= true \
2025-05-07 15:38:58 +08:00
-v ${ cur_dir } /build-image$KERNEL_COMPILE .sh:/work/build-image.sh \
2024-10-25 17:48:08 +08:00
-v ${ euler_dir } :/work/config-common \
-v ${ cur_dir } /config:/work/config \
2025-05-07 15:38:58 +08:00
-v ${ workdir } :/work/raspi_output \
2024-10-25 17:48:08 +08:00
${ docker_img_name } -${ buildid } ${ params }
chmod -R a+r ${ workdir } /img
docker image rm ${ docker_img_name } -${ buildid }
LOG
LOG Done.