Forked from satmandu/build_arm64_rpi_userland.sh
Last active
September 16, 2020 02:51
-
-
Save slmingol/c7c0bf661a71dd2169054e6f26bbdf0c to your computer and use it in GitHub Desktop.
Generate an arm64 rpi userland for use on ubuntu/arm64.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/bash -x | |
| workdir="${HOME}/workdir" | |
| [[ ! -d "$workdir" ]] && ( mkdir -p "$workdir" || exit 1) | |
| [[ ! -d "$workdir"/tmp ]] && ( mkdir -p "$workdir"/tmp || exit 1) | |
| [[ ! -d "$workdir"/output ]] && ( mkdir -p "$workdir"/output || exit 1) | |
| echo "workdir is ${workdir}" | |
| tmpdir=$(mktemp -d deb_XXXX -p "$workdir"/tmp) | |
| deb_temp=${tmpdir}/deb | |
| extract_tmp=${tmpdir}/extract | |
| echo "tmpdir is ${tmpdir}" | |
| rm -rf "${workdir}"/rpiuserland.compile.log | |
| sudo apt install -y git patchelf c++ pkgconf cmake | |
| is_git_repo="$( | |
| cd "${workdir}"/rpi-userland || exit | |
| git rev-parse --is-inside-work-tree 2>/dev/null | |
| )" | |
| if [ "$is_git_repo" ]; then | |
| cd "$workdir"/rpi-userland && git clean -d -x -f | |
| else | |
| rm -rf "${workdir}"/rpi-userland | |
| cd "$workdir" && git clone --depth 1 https://github.com/raspberrypi/userland rpi-userland | |
| fi | |
| USERLANDREV="11"$(git -C "${workdir}"/rpi-userland rev-parse --short HEAD >/dev/null) | |
| mkdir -p "${workdir}"/scripts | |
| ( | |
| cd "${workdir}"/scripts && curl -OL https://github.com/satmandu/docker-rpi4-imagebuilder/raw/master/scripts/patch_rpi-userland.sh | |
| chmod +x patch_rpi-userland.sh | |
| ) | |
| echo "* Compiling Raspberry Pi userland source." | |
| cd "${workdir}"/rpi-userland/ || exit | |
| [[ -e "${workdir}"/scripts/patch_rpi-userland.sh ]] && { | |
| cd "${workdir}"/rpi-userland/ && "${workdir}"/scripts/patch_rpi-userland.sh | |
| true | |
| } | |
| sed -i 's/__bitwise/FDT_BITWISE/' "${workdir}"/rpi-userland/opensrc/helpers/libfdt/libfdt_env.h | |
| sed -i 's/__force/FDT_FORCE/' "${workdir}"/rpi-userland/opensrc/helpers/libfdt/libfdt_env.h | |
| echo "compiling rpi userland" | |
| PKGVERSION="$(date +%d%m%Y):${USERLANDREV}" | |
| cat <<-EOF | tee -a "${workdir}"/rpi-userland/CMakeLists.txt | |
| SET(CPACK_GENERATOR "DEB") | |
| SET(CPACK_PACKAGE_NAME "rpiuserland") | |
| SET(CPACK_SET_DESTDIR TRUE) | |
| SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "noone") | |
| SET(CPACK_PACKAGE_VERSION_MAJOR "$PKGVERSION") | |
| SET(CPACK_PACKAGE_VERSION_MINOR "0") | |
| SET(CPACK_PACKAGE_VERSION_PATCH "1~alpha1") | |
| SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libgcc1-armhf-cross,libstdc++6-armhf-cross,libc6-armhf-cross") | |
| include(CPack) | |
| EOF | |
| CROSS_COMPILE=aarch64-linux-gnu- ./buildme --aarch64 &>>"${workdir}"/rpi_userland_build.compile.log | |
| echo "configuring package" | |
| cd "${workdir}"/rpi-userland/build/raspberry/release/ || exit | |
| make package | |
| sudo rm -rf "${deb_temp}" | |
| mkdir -p "${deb_temp}" | |
| sudo rm -rf "${extract_tmp}" | |
| mkdir -p "${extract_tmp}" | |
| dpkg-deb -R "$workdir"/rpi-userland/build/raspberry/release/vmcs_host_apps-1.0-Source.deb "${extract_tmp}"/ | |
| cd "${workdir}"/rpi-userland/build/raspberry/release/ && sudo make DESTDIR="${deb_temp}"/ install | |
| sed -i "s/1.0/$PKGVERSION/" "${extract_tmp}"/DEBIAN/control | |
| mv "${extract_tmp}"/DEBIAN "${deb_temp}"/ | |
| rm -rf "${extract_tmp}" | |
| mkdir -p "${deb_temp}"/etc/ld.so.conf.d/ | |
| echo '/opt/vc/lib' >"${deb_temp}"/etc/ld.so.conf.d/vc.conf | |
| mkdir -p "${deb_temp}"/etc/environment.d | |
| cat <<-EOF >"${deb_temp}"/etc/environment.d/10-vcgencmd.conf | |
| # /etc/environment.d/10-vcgencmd.conf | |
| # Do not edit this file | |
| PATH="/opt/vc/bin:/opt/vc/sbin" | |
| ROOTPATH="/opt/vc/bin:/opt/vc/sbin" | |
| LDPATH="/opt/vc/lib" | |
| EOF | |
| chmod +x "${deb_temp}"/etc/environment.d/10-vcgencmd.conf | |
| mkdir -p "${deb_temp}"/etc/profile.d/ | |
| cat <<-'EOF' >"${deb_temp}"/etc/profile.d/98-rpi.sh | |
| # /etc/profile.d/98-rpi.sh | |
| # Adds Raspberry Pi Foundation userland binaries to path | |
| export PATH="$PATH:/opt/vc/bin:/opt/vc/sbin" | |
| EOF | |
| chmod +x "${deb_temp}"/etc/profile.d/98-rpi.sh | |
| cat <<-EOF >"${deb_temp}"/etc/ld.so.conf.d/00-vmcs.conf | |
| /opt/vc/lib | |
| EOF | |
| SUDOPATH=$(sudo sed -n 's/\(^.*secure_path="\)//p' /etc/sudoers | sed s'/.$//') | |
| SUDOPATH="${SUDOPATH:-/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin}" | |
| SUDOPATH+=":/opt/vc/bin:/opt/vc/sbin" | |
| # Add path to sudo | |
| mkdir -p "${deb_temp}"/etc/sudoers.d | |
| echo "* Adding rpi util path to sudo." | |
| cat <<-EOF >>"${deb_temp}"/etc/sudoers.d/rpi | |
| Defaults secure_path=$SUDOPATH | |
| EOF | |
| chmod 0440 "${deb_temp}"/etc/sudoers.d/rpi | |
| sudo chown root:root "${deb_temp}"/etc/sudoers.d/rpi | |
| # Get non-arm64 vcdbg and patch for use on armhf | |
| mkdir -p "${deb_temp}"/usr/arm-linux-gnueabihf/lib | |
| cd "${deb_temp}"/usr/arm-linux-gnueabihf/lib || exit | |
| curl -OL https://github.com/Hexxeh/rpi-firmware/raw/master/vc/hardfp/opt/vc/lib/libdebug_sym.so | |
| curl -OL https://github.com/Hexxeh/rpi-firmware/raw/master/vc/hardfp/opt/vc/lib/libelftoolchain.so | |
| curl -OL https://github.com/Hexxeh/rpi-firmware/raw/master/vc/hardfp/opt/vc/lib/libvcos.so | |
| cd "${deb_temp}"/opt/vc/bin/ || exit | |
| sudo curl -OL https://github.com/Hexxeh/rpi-firmware/raw/master/vc/hardfp/opt/vc/bin/vcdbg | |
| sudo chmod +x "${deb_temp}"/opt/vc/bin/vcdbg | |
| sudo cp "${deb_temp}"/opt/vc/bin/vcdbg "${deb_temp}"/opt/vc/bin/vcdbg.orig | |
| sudo patchelf --force-rpath --set-rpath "/usr/arm-linux-gnueabihf/lib" "${deb_temp}"/opt/vc/bin/vcdbg | |
| sudo patchelf --set-interpreter /usr/arm-linux-gnueabihf/lib/ld-linux-armhf.so.3 "${deb_temp}"/opt/vc/bin/vcdbg | |
| cd "${workdir}"/rpi-userland/build/raspberry/release/ || exit | |
| sudo dpkg-deb --root-owner-group -b "${deb_temp}" "${workdir}"/output/ &>>"${workdir}"/rpi_userland_build.compile.log | |
| sudo rm -rf "${workdir}"/rpi-userland/build/ | |
| sudo rm -rf "${tmpdir}" | |
| echo "Package is at ${workdir}/output/rpiuserland_${USERLANDREV}_arm64.deb ." |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment