Create Build Scripts
1. Create an empty folder as your working directory on Linux Host PC and enter this new folder. In this guide the working directory is named “ecs-1.0-ubuntu”.
$ mkdir ecs-1.0-ubuntu$ cd ecs-1.0-ubuntu2. Create three build scripts.
Create build-all.sh:
$ vi build-all.sh build-all.sh content is:
#!/bin/bashset -eDIR=$(dirname "$(realpath -s "$0")")function help_msg(){printf "Usage:\n" printf " build-all.sh <ecs-release-path> <target>\n" printf " <ecs-release-path>: the decompressed ecs release package path.\n" printf " <target>: xenomai (default) and preempt\n" printf " For example:\n" printf " build-all.sh /home/release-ecs_1.0/ecs-release xenomai\n" }ECS_REL="${1:-none}"TARGET="${2:-xenomai}"if [ ! -d ${ECS_REL} ]; then printf "No valid ECS release package path provided! \n"help_msg exit -1fiif [ -f "${DIR}/build-${TARGET}.sh" ]thenprintf "Start building target ${TARGET} ... \n\n\n" source ${DIR}/build-${TARGET}.sh elseprintf "No valid target provided! \n" help_msg exit -1 fiCreate build-preempt.sh for Preempt-RT build. (You can skip this script if you are using Xenomai Linux)
$ vi build-preempt.shbuild-preempt.sh content is:
#!/bin/bashset -eECS_XENOMAI_META="${ECS_REL}/resources/bare-metal-xenomai"# Xenomai build parametersXENO_META="${ECS_XENOMAI_META}/meta-xenomai-bkc/recipes-xenomai/xenomai/files"XENO_VER=3.1XENO_URL="https://gitlab.denx.de/Xenomai/xenomai/-/archive/v${XENO_VER}/xenomai-v${XENO_VER}.tar.gz"XENO_SRC=${DIR}/xenomaiXENO_DEST=${DIR}/xenomai_destXENO_RESOURCE=${DIR}/resources/xenomai/xenomai_${XENO_VER}# Kernel build parametersKERNEL_VER=4.19.59KERNEL_TAG=lts-v${KERNEL_VER}-base-190722T171340ZKERNEL_URL="https://github.com/intel/linux-intel-lts/archive/${KERNEL_TAG}.tar.gz"KERNEL_SRC=${DIR}/linux-kernelKERNEL_RESOURCE=${DIR}/resources/xenomai/linux-kernel_${KERNEL_VER}KERNEL_CUSTOM=-ecs1.0# Ethercat build parametersETHERCAT_META="${ECS_XENOMAI_META}/meta-intel-fieldbus/recipes-ethercat/ighethercat/files"ETHERCAT_VER="1.5.2"ETHERCAT_URL="http://www.etherlab.org/download/ethercat/ethercat-${ETHERCAT_VER}.tar.bz2"ETHERCAT_SRC=${DIR}/ethercatETHERCAT_RESOURCE=${DIR}/resources/xenomai/ethercat_${ETHERCAT_VER}ETHERCAT_DEST=${DIR}/ethercat_destfunction download_linux_kernel(){ printf "Downloading kernel source from ${KERNEL_URL}\n" printf "Kernel tag : ${KERNEL_TAG}\n" curl -o linux-kernel.tar.gz -L ${KERNEL_URL} rm -rf ${KERNEL_SRC} && mkdir ${KERNEL_SRC} tar zxf linux-kernel.tar.gz -C $KERNEL_SRC --strip-components 1}function download_xenomai(){ printf "Downloading xenomai source from ${XENO_URL}\n" printf "Xenomai tag : ${XENO_VER}\n" curl -o xenomai.tar.gz -L ${XENO_URL} rm -rf ${XENO_SRC} && mkdir ${XENO_SRC} tar zxf xenomai.tar.gz -C ${XENO_SRC} --strip-components 1}function download_ethercat(){ printf "Downloading ethercat source from ${ETHERCAT_URL}\n" printf "Ethercat tag : ${ETHERCAT_VER}\n" curl -o ethercat.tar.bz2 -L ${ETHERCAT_URL} rm -rf ${ETHERCAT_SRC} && mkdir ${ETHERCAT_SRC} tar jxf ethercat.tar.bz2 -C ${ETHERCAT_SRC} --strip-components 1}function do_patching(){ if (($# != 3)); then printf "Please provide patch config file, target source path \n" printf "and ECS release resource meta path. \n" printf "do_patching ./linux-kernel ./patch ${XENO_META}\n" exit -1 fi local src_path=$1 local patch_cfg=$2 local meta_path=$3 pushd ${src_path} cat ${patch_cfg} | while read line do pf=($line) if [[ ${pf[0]} == "patch" ]] then printf "Patching ${pf[1]}\n" patch -p1 < ${meta_path}/${pf[1]} fi done popd}function build_kernel(){ printf "Patching kernel\n" do_patching ${KERNEL_SRC} ${KERNEL_RESOURCE}/patch ${XENO_META} if [ -f ${KERNEL_RESOURCE}/patches/patch ]; then printf "Extra patching\n" do_patching ${KERNEL_SRC} ${KERNEL_RESOURCE}/patches/patch ${KERNEL_RESOURCE}/patches fi printf "Preparing kernel\n" cp ${KERNEL_RESOURCE}/config ${KERNEL_SRC}/.config ${XENO_SRC}/scripts/prepare-kernel.sh --arch=x86_64 --linux=${KERNEL_SRC} printf "Building kernel\n" pushd ${KERNEL_SRC} make -j `getconf _NPROCESSORS_ONLN` bindeb-pkg LOCALVERSION=${KERNEL_CUSTOM} popd}function build_xenomai(){ printf "Patching xenomai\n" do_patching ${XENO_SRC} ${XENO_RESOURCE}/patch ${XENO_META} printf "Building xenomai\n" rm -rf ${XENO_DEST} && mkdir ${XENO_DEST} pushd ${XENO_SRC} ./scripts/bootstrap ./configure --prefix=/usr/xenomai --with-core=cobalt --enable-smp --enable-pshared make -j `getconf _NPROCESSORS_ONLN` make DESTDIR=${XENO_DEST} install popd}function build_ethercat(){ printf "Patching ethercat\n" do_patching ${ETHERCAT_SRC} ${ETHERCAT_RESOURCE}/patch ${ETHERCAT_META} printf "Building ethercat\n" rm -rf ${ETHERCAT_DEST} && mkdir ${ETHERCAT_DEST} pushd ${ETHERCAT_SRC} local xenomai_dir=${XENO_DEST}/usr/xenomai# workaround to make ethercat build on the previous built xenomai# cp ${xenomai_dir}/bin/xeno-config ${DIR}/xeno-config# sed -i "s#prefix=\"/usr/xenomai\"#prefix=\"${xenomai_dir}\"#g" ${DIR}/xeno-config sudo cp -r ${xenomai_dir} /usr/ chmod +x bootstrap && ./bootstrap ./configure --enable-sii-assign \ --disable-8139too \ --enable-igb \ --libdir=/usr/xenomai/lib \ --with-xenomai-dir=/usr/xenomai \ --with-xenomai-config=/usr/xenomai/bin/xeno-config \ --with-linux-dir=${KERNEL_SRC} \ --with-devices=8 \ --enable-rtdm \ --disable-eoe \ --enable-hrtimer \ --enable-cycles make all modules make DESTDIR=${ETHERCAT_DEST} install make INSTALL_MOD_PATH=${ETHERCAT_DEST} modules_install popd sudo rm -rf /usr/xenomai}function pack_xenomai_to_deb(){ printf "Packaging xenomai to deb\n" mkdir ${XENO_DEST}/DEBIAN cp ${XENO_RESOURCE}/control ${XENO_DEST}/DEBIAN/ dpkg -b ${XENO_DEST} xenomai_${XENO_VER}_amd64.deb}function pack_ethercat_to_deb(){ printf "Packaging ethercat to deb\n" # workaround to delete modules info files to avoid install conflict rm -f ${ETHERCAT_DEST}/lib/modules/${KERNEL_VER}*/modules.* mkdir ${ETHERCAT_DEST}/DEBIAN cp ${ETHERCAT_RESOURCE}/control ${ETHERCAT_DEST}/DEBIAN/ dpkg -b ${ETHERCAT_DEST} ethercat_${ETHERCAT_VER}_amd64.deb}if [ ! -d ${XENO_META} ]; then printf "Path ${XENO_META} is not existed!\n" printf "No valid ECS release package path provided! \n" exit -1fidownload_linux_kerneldownload_xenomaidownload_ethercatbuild_kernelbuild_xenomaibuild_ethercatpack_xenomai_to_debpack_ethercat_to_debCreate build-xenomai.sh for the Xenomai build. (You can skip this script if you are going to using Preempt RT Linux.)
$ vi build-xenomai.shbuild-xenomai.sh content is:
#!/bin/bashset -eECS_XENOMAI_META="${ECS_REL}/resources/bare-metal-xenomai"# Xenomai build parametersXENO_META="${ECS_XENOMAI_META}/meta-xenomai-bkc/recipes-xenomai/xenomai/files"XENO_VER=3.1XENO_URL="https://gitlab.denx.de/Xenomai/xenomai/-/archive/v${XENO_VER}/xenomai-v${XENO_VER}.tar.gz"XENO_SRC=${DIR}/xenomaiXENO_DEST=${DIR}/xenomai_destXENO_RESOURCE=${DIR}/resources/xenomai/xenomai_${XENO_VER}# Kernel build parametersKERNEL_VER=4.19.59KERNEL_TAG=lts-v${KERNEL_VER}-base-190722T171340ZKERNEL_URL="https://github.com/intel/linux-intel-lts/archive/${KERNEL_TAG}.tar.gz"KERNEL_SRC=${DIR}/linux-kernelKERNEL_RESOURCE=${DIR}/resources/xenomai/linux-kernel_${KERNEL_VER}KERNEL_CUSTOM=-ecs1.0# Ethercat build parametersETHERCAT_META="${ECS_XENOMAI_META}/meta-intel-fieldbus/recipes-ethercat/ighethercat/files"ETHERCAT_VER="1.5.2"ETHERCAT_URL="http://www.etherlab.org/download/ethercat/ethercat-${ETHERCAT_VER}.tar.bz2"ETHERCAT_SRC=${DIR}/ethercatETHERCAT_RESOURCE=${DIR}/resources/xenomai/ethercat_${ETHERCAT_VER}ETHERCAT_DEST=${DIR}/ethercat_destfunction download_linux_kernel(){ printf "Downloading kernel source from ${KERNEL_URL}\n" printf "Kernel tag : ${KERNEL_TAG}\n" curl -o linux-kernel.tar.gz -L ${KERNEL_URL} rm -rf ${KERNEL_SRC} && mkdir ${KERNEL_SRC} tar zxf linux-kernel.tar.gz -C $KERNEL_SRC --strip-components 1}function download_xenomai(){ printf "Downloading xenomai source from ${XENO_URL}\n" printf "Xenomai tag : ${XENO_VER}\n" curl -o xenomai.tar.gz -L ${XENO_URL} rm -rf ${XENO_SRC} && mkdir ${XENO_SRC} tar zxf xenomai.tar.gz -C ${XENO_SRC} --strip-components 1}function download_ethercat(){ printf "Downloading ethercat source from ${ETHERCAT_URL}\n" printf "Ethercat tag : ${ETHERCAT_VER}\n" curl -o ethercat.tar.bz2 -L ${ETHERCAT_URL} rm -rf ${ETHERCAT_SRC} && mkdir ${ETHERCAT_SRC} tar jxf ethercat.tar.bz2 -C ${ETHERCAT_SRC} --strip-components 1}function do_patching(){ if (($# != 3)); then printf "Please provide patch config file, target source path \n" printf "and ECS release resource meta path. \n" printf "do_patching ./linux-kernel ./patch ${XENO_META}\n" exit -1 fi local src_path=$1 local patch_cfg=$2 local meta_path=$3 pushd ${src_path} cat ${patch_cfg} | while read line do pf=($line) if [[ ${pf[0]} == "patch" ]] then printf "Patching ${pf[1]}\n" patch -p1 < ${meta_path}/${pf[1]} fi done popd}function build_kernel(){ printf "Patching kernel\n" do_patching ${KERNEL_SRC} ${KERNEL_RESOURCE}/patch ${XENO_META} if [ -f ${KERNEL_RESOURCE}/patches/patch ]; then printf "Extra patching\n" do_patching ${KERNEL_SRC} ${KERNEL_RESOURCE}/patches/patch ${KERNEL_RESOURCE}/patches fi printf "Preparing kernel\n" cp ${KERNEL_RESOURCE}/config ${KERNEL_SRC}/.config ${XENO_SRC}/scripts/prepare-kernel.sh --arch=x86_64 --linux=${KERNEL_SRC} printf "Building kernel\n" pushd ${KERNEL_SRC} make -j `getconf _NPROCESSORS_ONLN` bindeb-pkg LOCALVERSION=${KERNEL_CUSTOM} popd}function build_xenomai(){ printf "Patching xenomai\n" do_patching ${XENO_SRC} ${XENO_RESOURCE}/patch ${XENO_META} printf "Building xenomai\n" rm -rf ${XENO_DEST} && mkdir ${XENO_DEST} pushd ${XENO_SRC} ./scripts/bootstrap ./configure --prefix=/usr/xenomai --with-core=cobalt --enable-smp --enable-pshared make -j `getconf _NPROCESSORS_ONLN` make DESTDIR=${XENO_DEST} install popd}function build_ethercat(){ printf "Patching ethercat\n" do_patching ${ETHERCAT_SRC} ${ETHERCAT_RESOURCE}/patch ${ETHERCAT_META} printf "Building ethercat\n" rm -rf ${ETHERCAT_DEST} && mkdir ${ETHERCAT_DEST} pushd ${ETHERCAT_SRC} local xenomai_dir=${XENO_DEST}/usr/xenomai# workaround to make ethercat build on the previous built xenomai# cp ${xenomai_dir}/bin/xeno-config ${DIR}/xeno-config# sed -i "s#prefix=\"/usr/xenomai\"#prefix=\"${xenomai_dir}\"#g" ${DIR}/xeno-config sudo cp -r ${xenomai_dir} /usr/ chmod +x bootstrap && ./bootstrap ./configure --enable-sii-assign \ --disable-8139too \ --enable-igb \ --libdir=/usr/xenomai/lib \ --with-xenomai-dir=/usr/xenomai \ --with-xenomai-config=/usr/xenomai/bin/xeno-config \ --with-linux-dir=${KERNEL_SRC} \ --with-devices=8 \ --enable-rtdm \ --disable-eoe \ --enable-hrtimer \ --enable-cycles make all modules make DESTDIR=${ETHERCAT_DEST} install make INSTALL_MOD_PATH=${ETHERCAT_DEST} modules_install popd sudo rm -rf /usr/xenomai}function pack_xenomai_to_deb(){ printf "Packaging xenomai to deb\n" mkdir ${XENO_DEST}/DEBIAN cp ${XENO_RESOURCE}/control ${XENO_DEST}/DEBIAN/ dpkg -b ${XENO_DEST} xenomai_${XENO_VER}_amd64.deb}function pack_ethercat_to_deb(){ printf "Packaging ethercat to deb\n" # workaround to delete modules info files to avoid install conflict rm -f ${ETHERCAT_DEST}/lib/modules/${KERNEL_VER}*/modules.* mkdir ${ETHERCAT_DEST}/DEBIAN cp ${ETHERCAT_RESOURCE}/control ${ETHERCAT_DEST}/DEBIAN/ dpkg -b ${ETHERCAT_DEST} ethercat_${ETHERCAT_VER}_amd64.deb}if [ ! -d ${XENO_META} ]; then printf "Path ${XENO_META} is not existed!\n" printf "No valid ECS release package path provided! \n" exit -1fidownload_linux_kerneldownload_xenomaidownload_ethercatbuild_kernelbuild_xenomaibuild_ethercatpack_xenomai_to_debpack_ethercat_to_deb3. Add execute permissions to the build scripts created:
$ cd <your path to>/ecs-1.0-ubuntu$ chmod +x *.sh