diff options
Diffstat (limited to 'PKGBUILD')
-rw-r--r-- | PKGBUILD | 546 |
1 files changed, 546 insertions, 0 deletions
diff --git a/PKGBUILD b/PKGBUILD new file mode 100644 index 000000000000..1279ca11f8e1 --- /dev/null +++ b/PKGBUILD @@ -0,0 +1,546 @@ +# Maintainer: Donald Carr <d at chaos-reins dot com> + +#set -x + +# Documentation + +# Set up the pi for Qt compilation. +# For a comprehensive set of deps I just install chromium which pulls in everything + +#* I had to removed xcomposite as code path breaks +#* Remove 2 (mesa) pkgconfig files we allow to screw our mkspec +# * rm /usr/lib/pkgconfig/glesv2.pc +# * rm /usr/lib/pkgconfig/egl.pc + +# I use NFS to develop against my sysroot personally: sudo mount qpi2.local:/ /mnt/pi + +# NB: Mandatory edit: set this variable to point to your raspberry pi's sysroot + +# Arch: build dependencies for the target device documented in PKGBUILD.libs +# Fedora: systemd-devel mesa-*-devel wayland*-devel fontconfig-devel libinput-devel freetype-devel qt5-qtdeclarative-devel + +pkgname="qt-sdk" + +# Sanity check +_building=true + +# Options +_target_host=true +_sysroot="" +_piver="" +_use_mesa=false +_float=false +_shadow_build=true +# automatically disabled if you are building webengine +_debug=true +_skip_qtscript=false +_skip_qtwebengine=false +_skip_qtwidgets=false +_static_build=false +_build_from_local_src_tree=false +_patching=true +_minimal=false +_uber_minimal=false + +if [[ -z ${startdir} ]]; then + _building=false; +fi + +if [[ -f build-from-local-src-tree ]]; then + _build_from_local_src_tree=true +fi + +if [[ -f no-debug ]]; then + _debug=false +fi + +if [[ -f static ]]; then + _static_build=true + _uber_minimal=true + _debug=false + #_float=true +fi + +if [[ -f full-build ]]; then + _minimal=false +fi + +if [[ -f uber-minimal ]]; then + _uber_minimal=true +fi + +# Only present for the sake of sanity testing the qpi.install script +#_piver=$LOCAL_PI_VER +#_sysroot=/mnt/pi${_piver} + +# Sanity check options +if $_building && [[ -n $LOCAL_PI_VER ]]; then + if [[ -z $_piver ]]; then _piver=$LOCAL_PI_VER; fi + _sysroot=/mnt/pi${_piver} + + if [[ ! -d "${_sysroot}/etc" ]]; then + echo "You have to set a valid sysroot to proceed with the build" + exit 1 + fi +fi + +# vars +_local_qt5_repo="${local_qt5_repo}" +#_pkgvermajmin="5.15" +_pkgvermajmin="6.0" +_pkgverpatch=".0" +# {alpha/beta/beta2/rc} +_dev_suffix="beta5" +pkgrel=0 +pkgver="${_pkgvermajmin}${_pkgverpatch}" +$_build_from_local_src_tree && pkgver=6.6.6 +_pkgver=${pkgver} +_release_type="development_releases" +_profiled_gpu_fn=qpi-proprietary.sh + +__pkgconfigpath=${_sysroot}/usr/lib/pkgconfig +__eglpkgconfigpath="${__pkgconfigpath}/egl.pc" +__glespkgconfigpath="${__pkgconfigpath}/glesv2.pc" + +#_opengl_variant="desktop" +if [ -n "${_piver}" ]; then + _opengl_variant="es2" +fi + +_overwrite_mkspec=true +_mkspec="linux-rpi${_piver}-g++" +case ${_piver} in +1) + _toolchain_name=armv6-rpi-linux-gnueabihf + _toolchain="/opt/${_toolchain_name}/bin/${_toolchain_name}-" + _float=true + # too problematic for me to care about + #_float=true +;; +2) + #_toolchain_name=armv7-rpi2-linux-gnueabihf + #_toolchain="/opt/${_toolchain_name}/bin/${_toolchain_name}-" + # eats shit when linking artriculate with ltcg + _toolchain_name=arm-cortexa9_neon-linux-gnueabihf + _toolchain="/opt/x-tools/${_toolchain_name}/bin/${_toolchain_name}-" + _float=true + #_mkspec="linux-rpi${_piver}-vc4-g++" + #_use_mesa=true +;; +3) + _toolchain_name=aarch64-rpi3-linux-gnu + _toolchain="/opt/x-tools/${_toolchain_name}/bin/${_toolchain_name}-" + _use_mesa=true + # just for projectmofo! + #_opengl_variant="desktop" +;; +4) + # yuck; here lies tinkerboard until I find a better way of generalizing this + #_toolchain="/opt/gcc-arm-8.2-2019.01-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-" + _toolchain="${HOME}/x-tools/aarch64-spudd-linux-gnu/bin/aarch64-spudd-linux-gnu-" + + # upstream mkspec is 32 bit + #_mkspec="linux-rasp-pi4-v3d-g++" + #_overwrite_mkspec=false + + _use_mesa=true +;; +5) + # https://developer.nvidia.com/embedded/dlc/kernel-gcc-6-4-tool-chain + # took forever to find one that worked + #_toolchain="/usr/bin/aarch64-linux-gnu-" + _toolchain="/opt/gcc-linaro-6.4.1-2017.08-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-" + _mkspec="linux-jetson-nano-g++" + _opengl_variant="desktop" +;; + +esac + +if $_target_host; then + _use_mesa=true +elif [[ "${_piver}" = "4" ]]; then + echo "" +elif [[ "${_piver}" = "5" ]]; then + echo "" +else + depends=("qpi${_piver}-toolchain") +fi + +if [[ -z "${_dev_suffix}" ]]; then _release_type="official_releases"; fi + +$_build_from_local_src_tree && _patching=false + +# PKGBUILD vars + +#install=qpi.install + +#rm $install +#touch $install + +if [[ -n ${_piver} ]] || ! $_building; then + pkgname="${pkgname}-raspberry-pi${_piver}" +fi +provides=($pkgname) + +if $_static_build; then + pkgname="${pkgname}-static" +fi + +if $_building && $_uber_minimal; then + _minimal=true + _skip_qtwidgets=true +fi + +if [[ -f debug ]]; then + _debug=true +fi + +if $_building && $_minimal; then + _skip_qtscript=true + _skip_qtwebengine=true +fi + +$_skip_qtwebengine && _additional_configure_flags="$_additional_configure_flags -skip qtwebengine -no-icu" +$_skip_qtscript && _additional_configure_flags="$_additional_configure_flags -skip qtscript" +$_skip_qtwidgets && _additional_configure_flags="$_additional_configure_flags -no-widgets" +$_static_build && _additional_configure_flags="$_additional_configure_flags -static -ltcg" +$_float && _additional_configure_flags="$_additional_configure_flags -qreal float" +$_debug && _additional_configure_flags="$_additional_configure_flags -force-debug-info -separate-debug-info" + +_libspkgname="${pkgname}-target-libs" +_libsdebugpkgname="${pkgname}-target-libs-debug" +_packaginguser=$(whoami) +_qt_package_name_prefix="qt-everywhere-src" +if [[ -n ${_dev_suffix} ]]; then + _pkgver=${pkgver}-${_dev_suffix} +fi +_source_package_name=${_qt_package_name_prefix}-${_pkgver} +_baseprefix="/opt/qt" +_installprefix=${_baseprefix}/${pkgname} + +pkgdesc="Qt SDK for the Raspberry Pi 1/2/3" +arch=("x86_64") +url="http://www.chaos-reins.com/qpi/" +license=("LGPL3" "GPL3") +optdepends=('qtcreator: Integrated Raspberry Pi IDE development') +makedepends=("git" "pkgconfig" "gcc" "gperf" "python") +#_provider=http://qt.mirror.constant.com/ +_provider=https://download.qt.io +_tmpfs_dir=/vortex/build + +_arch_specific_configure_options="\ + -prefix /usr \ + -docdir /usr/share/doc/qt \ + -headerdir /usr/include/qt \ + -archdatadir /usr/lib/qt \ + -datadir /usr/share/qt \ + -sysconfdir /etc/xdg \ + -examplesdir /usr/share/doc/qt/examples \ + -no-rpath \ +" + +retired_exhaustive_uber_minimal_specific_configure_options="\ + -no-linuxfb \ +" + +if $_minimal; then + _additional_configure_flags="$_additional_configure_flags \ + -no-xcb \ + -qpa eglfs \ + -egl \ + " +fi + +if $_uber_minimal; then + _additional_configure_flags="$_additional_configure_flags \ + -no-direct2d \ + -no-directfb \ + -no-cups \ + -no-iconv \ + -no-gif \ + -no-sql-mysql \ + -no-sql-psql \ + -no-tslib \ + -no-feature-bearermanagement \ + -no-qml-debug \ + -no-ico \ + -no-glib \ + " +fi + +if ! $_static_build && ! $_target_host; then + _additional_configure_flags="$_additional_configure_flags \ + -hostprefix ${_installprefix} \ + " +fi + +#-journald \ +_core_configure_options=" \ + -qt-pcre \ + -pkg-config \ + -prefix ${_installprefix} \ + -opengl ${_opengl_variant} \ + -qt-sqlite \ + -confirm-license \ + -opensource \ + -release \ + -pch \ + -make libs \ + -nomake tools \ + -nomake examples \ + \ + -reduce-exports \ + " + +#_tar_xz_sha256="94a02e3e1879f7492340de675b65b9b98a671698063d28c97e91b78098724548" +_tar_xz_sha256="0955320341731051d682e155d4f1252453f933725fb140a7606c3482cafea3b4" + +source=("git://github.com/sirspudd/mkspecs.git") +sha256sums=("SKIP") + +if ! $_build_from_local_src_tree; then + source+=("${_provider}/${_release_type}/qt/${_pkgvermajmin}/${_pkgver}/single/${_source_package_name}.tar.xz") + sha256sums+=("$_tar_xz_sha256") +fi + +options=('!strip') + +if ${_use_mesa}; then + _profiled_gpu_fn=qpi-mesa.sh + _additional_configure_flags="$_additional_configure_flags -gbm -kms" +else + _additional_configure_flags="$_additional_configure_flags -no-gbm" + if $_building && ([[ -f ${__eglpkgconfigpath} ]] || [[ -f ${__glespkgconfigpath} ]]); then + echo "Mesa is about to eat our communal poodle; delete egl.pc and glesv2.pc in your sysroot" + exit 1 + fi +fi + +# callbacks +finish() { + if [[ -n ${startdir} ]]; then + cd ${startdir} + #rm $install + #touch $install + fi +} + +adjust_bin_dir() { + adjust_src_dir + if [[ -n ${_srcdir} ]]; then + _bindir="${_srcdir}" + else + # Probably repackaging: gonna have to make some assumptions + _bindir="${startdir}/src/${_source_package_name}" + fi + if $_shadow_build; then + _bindir="${startdir}/build" + if $_minimal && [[ -d $_tmpfs_dir ]]; then + _bindir="${_tmpfs_dir}/${_bindir}" + fi + fi +} + +adjust_src_dir() { + if $_build_from_local_src_tree; then + if [[ -z $_local_qt5_repo ]]; then echo "Need to set a repo dir to build from head"; exit 1; fi + _srcdir=$_local_qt5_repo + fi +} + +build() { + # Qt tries to do the right thing and stores these, breaking cross compilation + # unset everything set in /etc/makepkg.conf + unset LDFLAGS + unset CFLAGS + unset CXXFLAGS + unset CHOST + unset CPPFLAGS + unset CARCH + unset HOSTTYPE + unset MACHTYPE + unset DEBUG_CFLAGS + unset DEBUG_CXXFLAGS + + export PATH=${startdir}:${PATH} + + _srcdir="${srcdir}/${_source_package_name}" + adjust_bin_dir + + local _basedir="${_srcdir}/qtbase" + local _mkspec_dir="${_basedir}/mkspecs/devices/${_mkspec}" + +if $_uber_minimal; then + local _qtpro=${_srcdir}/qt.pro + local _tmp_qtpro=$(mktemp) + cp $_qtpro $_tmp_qtpro + echo "QT_BUILD_MODULES = qtbase qtdeclarative" > $_qtpro + cat $_tmp_qtpro >> $_qtpro +fi + + # enable reduce relocations + sed -i '/error Symbolic function binding/d' ${_srcdir}/qtbase/configure.json + +if ! $_target_host && $_overwrite_mkspec; then + # Get our mkspec + mkdir $_mkspec_dir + rsync -r ${srcdir}/mkspecs/${_mkspec}/ $_mkspec_dir/ +fi + + rm -Rf ${_bindir} + mkdir -p ${_bindir} + cd ${_bindir} + + # Too bleeding big + # -developer-build \ + # -separate-debug-info \ + + # Chromium requires python2 to be the system python on your build host + # I literally symlink /usr/bin/python to /usr/bin/python2 on arch + + # Just because you can enable something doesnt mean you should + # Prepare for breakage in all your Qt derived projects + #-qtnamespace "Pi${_piver}" \ + +if $_target_host; then + local _configure_line="${_srcdir}/configure \ + -platform linux-clang-libc++ \ + ${_core_configure_options} \ + ${_additional_configure_flags}" +# ${_arch_specific_configure_options} \ +else + # Fuck debian multi-arch dead + export PKG_CONFIG_LIBDIR=${_sysroot}/usr/lib/$(${_toolchain}gcc -dumpmachine)/pkgconfig/:${_sysroot}/usr/lib/pkgconfig/ + export PKG_CONFIG_SYSROOT_DIR=${_sysroot} + + # I harbour a certain amount of X11 prejudice + local _configure_line="${_srcdir}/configure \ + ${_core_configure_options} \ + -qtlibinfix "Pi${_piver}" \ + -sysroot ${_sysroot} \ + -device ${_mkspec} \ + -optimize-size \ + -device-option CROSS_COMPILE=${_toolchain} \ + ${_additional_configure_flags}" +fi + local _configure_line_fn=configure_line + echo ${_configure_line} > ${_configure_line_fn} + set &> configure_env + ${_configure_line} || exit 1 + ninja all || exit 1 +} + +create_install_script() { + local _prefix=/tmp + + if [[ -n "${startdir}" ]]; then + _prefix=${startdir} + else + startdir=$PWD + fi + + local _install_script_location="${_prefix}/${install}" + + echo _piver="${_piver}" > ${_install_script_location} + echo _qmakepath="${_installprefix}/bin/qmake" >> ${_install_script_location} + echo _sysroot="${_sysroot}" >> ${_install_script_location} + echo _toolchain="${_toolchain}" >> ${_install_script_location} + + cat "${startdir}/_${install}" >> "${_prefix}/${install}" +} +#create_install_script + +package() { + adjust_bin_dir + + #create_install_script + + # Qt is now installed to $pkgdir/$sysroot/$prefix + # manually generate/decompose host/target + + local _basepkgdir=${pkgdir}/${_installprefix} + + local _libsdir="${startdir}/${_libspkgname}" + local _libsdebugdir="${startdir}/${_libsdebugpkgname}" + + local _libspkgdir="${_libsdir}/topkg" + local _libsdebugpkgdir="${_libsdebugdir}/topkg" + + local _libspkgbuild="${_libsdir}/PKGBUILD" + local _libsdebugpkgbuild="${_libsdebugdir}/PKGBUILD" + + local _pkgprofiled=${_libspkgdir}/etc/profile.d + local _pkgbindir=${_libspkgdir}/usr/bin + local _profiledfn=qpi.sh + local _qpienvexecfn=qpi-env-exec + + local _installed_dir="${pkgdir}/${_sysroot}/${_baseprefix}" + local _installed_dir_sans_sysroot_offset="${pkgdir}/${_baseprefix}" + + rm -Rf ${_libspkgdir} ${_libsdebugpkgdir} ${pkgdir} + mkdir -p ${_libspkgdir} ${_libsdebugpkgdir} ${pkgdir} + + cd "${_bindir}" + DESTDIR="$pkgdir" ninja install || exit 1 + + # attempt to fix Qt 5.12.1's insane complete qualification of linked libraries + # this still results in other sources of the complete path + find ${_installed_dir}/${pkgname} -type f -regex '.*\(prl\|pc\|pri\)' | xargs sed -i "s,/mnt/pi4/[^ ]*lib\(.[^ ]*\)\.so,-l\1,g" + # this breaks stuff as gcc does not look inside of sysroots for supposedly qualified paths + #find ${_installed_dir}/${pkgname}/mkspecs/modules -type f | xargs sed -i "s,${_sysroot}\([^ ]*\.so\),\1,g" + + cd $(dirname $(dirname ${_installed_dir})) + +if $_debug; then + find $(basename $(dirname ${_installed_dir})) -name '*.debug' -exec cp --parents '{}' ${_libsdebugpkgdir} \; -exec rm '{}' \; + + cp ${startdir}/PKGBUILD.libs.debug ${_libsdebugpkgbuild} + + sed -i "s/libspkgrel/${pkgrel}/" ${_libsdebugpkgbuild} + sed -i "s/libspkgver/${pkgver}/" ${_libsdebugpkgbuild} +if $_target_host || $_static_build; then + sed -i "s/libspkgname/${pkgname}/" ${_libsdebugpkgbuild} +else + sed -i "s/libspkgname/${_libspkgname}/" ${_libsdebugpkgbuild} +fi + sed -i "s/libsdebugpkgname/${_libsdebugpkgname}/" ${_libsdebugpkgbuild} + sed -i "s/libspiver/${_piver}/" ${_libsdebugpkgbuild} + + cd ${_libsdebugdir} + runuser -l ${_packaginguser} -c 'makepkg -d -f' || exit 1 + #mv ${_libsdebugdir}/${_libsdebugpkgname}-${pkgver}-${pkgrel}-any.pkg.tar.* ${startdir} +fi + + if $_static_build || $_target_host; then + if ! $_target_host; then + mkdir $(dirname ${_installed_dir_sans_sysroot_offset}) + mv ${_installed_dir} `dirname ${_installed_dir_sans_sysroot_offset}` + fi + else + mv `dirname ${_installed_dir}` ${_libspkgdir} + + cp ${_bindir}/configure_line ${_bindir}/config.opt ${_libspkgdir} + + cp ${startdir}/PKGBUILD.libs ${_libspkgbuild} + + # set correct libs version + sed -i "s/libspkgrel/${pkgrel}/" ${_libspkgbuild} + sed -i "s/libspkgver/${pkgver}/" ${_libspkgbuild} + sed -i "s/libspkgname/${_libspkgname}/" ${_libspkgbuild} + sed -i "s/libspiver/${_piver}/" ${_libspkgbuild} + + mkdir -p ${_pkgprofiled} + mkdir -p ${_pkgbindir} + + cp -L ${startdir}/${_profiledfn} ${_pkgprofiled} + cp -L ${startdir}/${_profiled_gpu_fn} ${_pkgprofiled} + cp -L ${startdir}/${_qpienvexecfn} ${_pkgbindir} + sed -i "s,localpiprefix,${_installprefix}," ${_pkgprofiled}/${_profiledfn} + + cd ${_libsdir} + runuser -l ${_packaginguser} -c 'makepkg -d -f' || exit 1 + #mv ${_libsdir}/${_libspkgname}-${pkgver}-${pkgrel}-any.pkg.tar.* ${startdir} + fi + + cp ${_bindir}/configure_line ${_bindir}/config.opt ${_basepkgdir} +} |