# Template file for 'qt5'
pkgname=qt5
version=5.10.1
revision=12
wrksrc="qt-everywhere-src-${version}"
build_style=gnu-configure
hostmakedepends="flex ruby gperf git python perl pkg-config protobuf re2c ninja"
makedepends="libressl-devel libpng-devel libXrender-devel unixodbc-devel
 fontconfig-devel libXi-devel libXv-devel libXinerama-devel libXrandr-devel
 libXcursor-devel libXScrnSaver-devel dbus-devel glib-devel icu-devel
 cups-devel libjpeg-turbo-devel sqlite-devel alsa-lib-devel tiff-devel SDL2-devel
 pcre2-devel libmng-devel libevent-devel ffmpeg-devel jsoncpp-devel
 libsrtp-devel libvpx-devel protobuf-devel snappy-devel minizip-devel
 libxshmfence-devel libSM-devel xcb-util-keysyms-devel libvpx-devel
 xcb-util-image-devel xcb-util-renderutil-devel xcb-util-wm-devel
 libXcomposite-devel libwebp-devel libxkbcommon-devel harfbuzz-devel gtk+3-devel
 mtdev-devel freetds-devel libmysqlclient-devel postgresql-libs-devel
 pulseaudio-devel libbluetooth-devel gst-plugins-base1-devel libxslt-devel
 opus-devel pciutils-devel nss-devel libcap-devel libinput-devel libproxy-devel
 libxcb-devel libxkbcommon-devel tslib-devel wayland-devel libwayland-egl
 libGLES MesaLib-devel"
depends="qtchooser"
replaces="qt5-doc<5.6.0 qt5-quick1<5.6.0 qt5-quick1-devel<5.6.0 qt5-webkit<5.6.0 qt5-webkit-devel<5.6.0
 qt5-enginio<5.7.1 qt5-enginio-devel<5.7.1 qt5-plugin-gtk<5.7.1"
homepage="http://qt.io/"
short_desc="Cross-platform application and UI framework (QT5)"
maintainer="Juan RP <xtraeme@voidlinux.eu>"
license="GPL-3, LGPL-2.1"
distfiles="http://download.qt.io/official_releases/qt/${version%.*}/${version}/single/qt-everywhere-src-${version}.tar.xz"
checksum=05ffba7b811b854ed558abf2be2ddbd3bb6ddd0b60ea4b5da75d277ac15e740a

case "$XBPS_TARGET_MACHINE" in
	armv5*|mips*) broken="qtwebengine cannot be built for $XBPS_TARGET_MACHINE" ;;
esac

if [ "${XBPS_MACHINE%%-musl}" = i686 ]; then
	nodebug=yes  # prevent OOM
fi
# Work around SSLv3_{client,server}_method missing in libressl-2.3.3
CFLAGS="-DOPENSSL_NO_PSK -DOPENSSL_NO_NEXTPROTONEG"
CXXFLAGS="${CFLAGS} -Wno-deprecated-declarations -fno-delete-null-pointer-checks"
# Required for musl libc
LDFLAGS="-pthread -ldl -fPIE"

if [ -n "$CROSS_BUILD" ]; then
	# Need some devel packages in the host to build qmake, moc, uic, rcc
	# wayland-devel contains /usr/bin/wayland-scanner
	hostmakedepends+=" zlib-devel wayland-devel icu-devel"
	# Cross building qtwebengine requires some more host packages
	hostmakedepends+=" nss-devel"
fi

_cleanup_wrksrc_leak() {
	if [ -d "${PKGDESTDIR}/usr/lib/cmake" ]; then
		# Replace references to ${wrksrc} in cmake files
		sed -i ${PKGDESTDIR}/usr/lib/cmake/*/*.cmake \
			-e "s;${wrksrc}/host;/usr/lib/qt5;g" \
			-e "s;devices/void-${XBPS_CROSS_TRIPLET}-g++;linux-g++;g"
	fi
	if [ -d "${PKGDESTDIR}/usr/lib/pkgconfig" ]; then
		# Replace references to ${wrksrc} in pkgconfig files
		sed -i ${PKGDESTDIR}/usr/lib/pkgconfig/*.pc \
			-e "s;${wrksrc}/host;/usr/lib/qt5;g" \
			-e "s;devices/void-${XBPS_CROSS_TRIPLET}-g++;linux-g++;g"
	fi
	# Remove QMAKE_PRL_BUILD_DIR from hint files for static libraries
	# and replace references to ${wrksrc}
	find ${PKGDESTDIR} -iname "*.prl" -exec sed -i "{}" \
		-e "/^QMAKE_PRL_BUILD_DIR/d" \
		-e "s;-L${wrksrc}/qtbase/lib;-L/usr/lib;g" \;
	# Replace ${wrksrc} in project include files
	find ${PKGDESTDIR} -iname "*.pri" -exec sed -i "{}" \
		-e "s;${wrksrc}/qtbase;/usr/lib/qt5;g" \;
}

_install_subpkg() {
	local module=$1 f base
	cd ${wrksrc}/${module}
	make INSTALL_ROOT=${PKGDESTDIR} install
	rm -rf ${PKGDESTDIR}/builddir
	rm -rf ${PKGDESTDIR}/usr/include
	rm -rf ${PKGDESTDIR}/usr/lib/cmake
	rm -rf ${PKGDESTDIR}/usr/lib/qt5/mkspecs
	rm -rf ${PKGDESTDIR}/usr/lib/pkgconfig
	rm -f ${PKGDESTDIR}/usr/lib/*.a
	rm -f ${PKGDESTDIR}/usr/lib/*.so
	rm -f ${PKGDESTDIR}/usr/lib/*.prl
	if [ -d ${PKGDESTDIR}/usr/lib/qt5/bin ]; then
		if [ -n "$CROSS_BUILD" ]; then
			for f in $(find ${PKGDESTDIR}/usr/lib/qt5/bin -name "*-target" -type f); do
				base=${f##*/}
				mv -v ${f} ${f%-target}
			done
		fi
		vmkdir usr/bin
		for f in $(find ${PKGDESTDIR}/usr/lib/qt5/bin -type f); do
			base=${f##*/}
			ln -sf /usr/lib/qt5/bin/${base} ${PKGDESTDIR}/usr/bin/${base}-qt5
		done
	fi
}

_install_devel() {
	local module=$1
	cd ${wrksrc}/${module}
	make INSTALL_ROOT=${PKGDESTDIR} install
	rm -rf ${PKGDESTDIR}/builddir
	rm -rf ${PKGDESTDIR}/usr/share
	rm -rf ${PKGDESTDIR}/usr/lib/qt5/bin
	rm -rf ${PKGDESTDIR}/usr/lib/qt5/qml
	rm -rf ${PKGDESTDIR}/usr/lib/qt5/libexec
	rm -rf ${PKGDESTDIR}/usr/lib/qt5/plugins
	rm -f ${PKGDESTDIR}/usr/lib/*.so.*
	_cleanup_wrksrc_leak
}

_move_target_binaries() {
	local f
	[ -z "$CROSS_BUILD" ] && return 0
	vmkdir usr/lib/qt5/bin
	for f in $@; do
		if [ -f ${DESTDIR}/usr/lib/qt5/bin/${f}-target ]; then
			mv -v ${DESTDIR}/usr/lib/qt5/bin/${f}-target \
				${PKGDESTDIR}/usr/lib/qt5/bin/${f}
		fi
	done
}

_create_config() {
	local specs=${wrksrc}/qtbase/mkspecs/devices device="$1"
	local qmake_conf="${specs}/${device}/qmake.conf"

	mkdir -p ${specs}/${device}

	echo "#" > ${qmake_conf}
	echo "# qmake configuration for building with $XBPS_TARGET_MACHINE" >> ${qmake_conf}
	echo "#" >> ${qmake_conf}
	echo >> ${qmake_conf}
	echo "include(../common/linux_device_pre.conf)" >> ${qmake_conf}
	echo >> ${qmake_conf}
	# Fake distro name to tell we want control
	echo "DISTRO = arch" >> ${qmake_conf}
	# Hard float on armv6, armv7, not on armv5tel
	case "$XBPS_TARGET_MACHINE" in
		armv6*|armv7*)
			echo "DISTRO_OPTS += hard-float" >> ${qmake_conf}
			;;
	esac
	echo "QMAKE_CC = ${CC}" >> ${qmake_conf}
	echo "QMAKE_CXX = ${CXX}" >> ${qmake_conf}
	echo "QMAKE_LINK = ${CXX}" >> ${qmake_conf}
	echo "QMAKE_LINK_SHLIB = ${CXX}" >> ${qmake_conf}
	echo "QMAKE_LFLAGS = ${LDFLAGS}" >> ${qmake_conf}
	echo "QMAKE_CFLAGS = ${CFLAGS}" >> ${qmake_conf}
	echo "QMAKE_CXXFLAGS = ${CXXFLAGS}" >> ${qmake_conf}
	echo >> ${qmake_conf}
	case "$XBPS_TARGET_MACHINE" in
		arm*)
			echo "include(../common/linux_arm_device_post.conf)" >> ${qmake_conf} ;;
		*)
			echo "include(../common/linux_device_post.conf)" >> ${qmake_conf} ;;
	esac
	echo "load(qt_config)" >> ${qmake_conf}

	echo '#include "../../linux-g++/qplatformdefs.h"' > ${specs}/${device}/qplatformdefs.h
}

_msg_cross() {
	msg_normal "***************************************************\n"
	msg_normal "$1 for target ${CROSS_BUILD} ...\n"
	msg_normal "***************************************************\n"
}

do_configure() {
	local opts spec

	# Compatibility functions res_ninit() and res_nclose() for musl libc
	cp ${FILESDIR}/resolv_compat.h ${wrksrc}/qtwebengine/src/3rdparty/chromium/net/dns

	# Fix missing private includes https://bugreports.qt.io/browse/QTBUG-37417
	sed -i qtbase/mkspecs/features/create_cmake.prf -e "/CMAKE_NO_PRIVATE_INCLUDES = true/d"

	case "$XBPS_TARGET_MACHINE" in
	armv5*|armv6*)	# Disable "yield" assembler instruction
		sed -i qtwebengine/src/3rdparty/chromium/base/allocator/partition_allocator/spin_lock.cc \
			qtwebengine/src/3rdparty/chromium/third_party/pdfium/third_party/base/allocator/partition_allocator/spin_lock.cc \
			-e 's;"yield";"nop";'
		;;
	esac

	case "$XBPS_TARGET_MACHINE" in
	*-musl)
		# Patch .../linux/*/config.{h,asm} to define HAVE_SYSCTL 0
		local config chromium=${wrksrc}/qtwebengine/src/3rdparty/chromium
		for config in $(find ${chromium}/third_party/ffmpeg/chromium/config -name "config\.*" | grep linux); do
			sed -i ${config} -e "s;HAVE_SYSCTL 1;HAVE_SYSCTL 0;"
		done
		# Do not use experimental allocator shim (incompatible with musl libc)
		sed -i qtwebengine/src/3rdparty/chromium/build/common.gypi \
			-e"s;\('use_experimental_allocator_shim%':\) 1,;\1 0,;"
		patch -Np0 -d "${wrksrc}/qtwebengine/src/3rdparty/chromium" -i "${FILESDIR}/musl-sandbox.patch"
		;;
	esac

	# Cross build patches
	if [ -n "$CROSS_BUILD" ]; then
		# This also sets default {C,CXX,LD}FLAGS for projects built using qmake
		sed -i -e "s|^\(QMAKE_CFLAGS_RELEASE.*\)|\1 ${XBPS_CFLAGS}|" \
			${wrksrc}/qtbase/mkspecs/common/gcc-base.conf
		sed -i -e "s|^\(QMAKE_LFLAGS_RELEASE.*\)|\1 ${XBPS_LDFLAGS}|" \
			${wrksrc}/qtbase/mkspecs/common/g++-unix.conf

		# Create symbolic links for private include directories
		for d in $(ls ${wrksrc}/qtbase/include); do
			ln -sfv ${version}/${d}/private qtbase/include/${d}/private
		done

		# Bootstrap gn (generate ninja)

		_msg_cross "Bootstrapping 'gn'"
		cd ${wrksrc}/qtwebengine/src/3rdparty/chromium/tools/gn
		conf='is_clang=false'
		conf+=' treat_warnings_as_errors=false'
		conf+=' enable_remoting=false'
		conf+=' enable_nacl=false'
		conf+=' use_cups=false'
		conf+=' use_gconf=false'
		conf+=' use_gio=false'
		conf+=' use_gnome_keyring=false'
		conf+=' use_gtk=false'
		conf+=' use_kerberos=false'
		conf+=' linux_use_bundled_binutils=false'
		conf+=' binutils_path="/usr/bin"'
		conf+=' use_gold=false'
		conf+=' use_sysroot=false'
		conf+=' use_allocator="none"'
		conf+=' is_android=false'
		case "$XBPS_TARGET_MACHINE" in
			armv[56]*) conf+=' arm_use_neon=false arm_optionally_use_neon=false';;
			aarch64*|armv7*) conf+=' arm_use_neon=true arm_optionally_use_neon=false';;
		esac

		AR="$AR_host" CC="$CC_host" CXX="$CXX_host" LD="$CXX_host" \
		CFLAGS="$CFLAGS_host" CXXFLAGS="$CXXFLAGS_host" LDFLAGS="$LDFLAGS_host" \
		PKGCONFIG=/usr/bin/pkgconfig PKG_CONFIG_PATH="/usr/lib/pkgconfig:/usr/share/pkgconfig" \
			python2 bootstrap/bootstrap.py -n --gn-gen-args "${conf}"
		cd ${wrksrc}

		mkdir -p ${wrksrc}/qtwebengine/src/3rdparty/chromium/tools/gn/out/Release
		cp -p ${wrksrc}/qtwebengine/src/3rdparty/chromium/out/Release/gn \
			${wrksrc}/qtwebengine/src/3rdparty/chromium/tools/gn/out/Release/

		# Remove gn from SUBDIRS for qtwebengine/src/buildtools
		sed -i ${wrksrc}/qtwebengine/src/buildtools/buildtools.pro \
			-e"/gn.file = gn.pro/,+3d"

		case "$XBPS_TARGET_MACHINE" in
		mips*)	# sgidefs.h is in /usr/include/asm
			find ${wrksrc} -name Platform.h  -exec sed -i "{}" \
				-e "s;<sgidefs.h>;<asm/sgidefs.h>;" \;
			;;
		esac
	else
		# qmake {CXX,L}FLAGS patches
		sed -i -e "s|^\(CXXFLAGS =.*\)|\1 ${CXXFLAGS}|" \
			-e "s|^\(LFLAGS =.*\)|\1 ${LDFLAGS}|" \
			${wrksrc}/qtbase/qmake/Makefile.unix

		# Build qmake using Void {C,LD}FLAGS
		# This also sets default {C,CXX,LD}FLAGS for projects built using qmake
		sed -i -e "s|^\(QMAKE_CFLAGS_RELEASE.*\)|\1 ${CFLAGS}|" \
			${wrksrc}/qtbase/mkspecs/common/gcc-base.conf
		sed -i -e "s|^\(QMAKE_LFLAGS_RELEASE.*\)|\1 ${LDFLAGS}|" \
			${wrksrc}/qtbase/mkspecs/common/g++-unix.conf
	fi

	opts+=" -confirm-license"
	opts+=" -opensource"
	opts+=" -prefix /usr"
	opts+=" -bindir /usr/lib/qt5/bin"
	opts+=" -datadir /usr/share/qt5"
	opts+=" -headerdir /usr/include/qt5"
	opts+=" -sysconfdir /etc/xdg"
	opts+=" -plugindir /usr/lib/qt5/plugins"
	opts+=" -docdir /usr/share/doc/qt5"
	opts+=" -importdir /usr/lib/qt5/imports"
	opts+=" -translationdir /usr/share/qt5/translations"
	opts+=" -examplesdir /usr/share/qt5/examples"
	opts+=" -archdatadir /usr/lib/qt5"
	opts+=" -accessibility"
	opts+=" -fontconfig"
	opts+=" -icu"
	opts+=" -openssl-linked"
	opts+=" -dbus-linked"
	opts+=" -no-pch"
	opts+=" -no-strip"
	opts+=" -nomake examples"
	opts+=" -optimized-qmake"
	opts+=" -no-use-gold-linker"
	opts+=" -system-libjpeg"
	opts+=" -system-libpng"
	opts+=" -system-zlib"
	opts+=" -system-sqlite"
	opts+=" -system-harfbuzz"
	opts+=" -webengine-alsa"
	opts+=" -webengine-pulseaudio"
	opts+=" -no-webengine-embedded-build"
	opts+=" -webengine-ffmpeg"
	opts+=" -webengine-opus"
	opts+=" -webengine-webp"
	opts+=" -webengine-pepper-plugins"
	opts+=" -webengine-printing-and-pdf"
	opts+=" -webengine-proprietary-codecs"
	opts+=" -webengine-spellchecker"
	opts+=" -silent"
	# opts+=" -v"

	LDFLAGS+=" -Wl,--no-keep-memory"  # needs more than 8GB RAM else
	if [ -n "$CROSS_BUILD" ]; then
		spec=void-${XBPS_CROSS_TRIPLET}-g++
		_create_config ${spec}
		opts+=" -device ${spec}"
		opts+=" -device-option CROSS_COMPILE=${XBPS_CROSS_TRIPLET}-"
		opts+=" -opengl es2"
		opts+=" -sysroot ${XBPS_CROSS_BASE}"
		opts+=" -hostprefix host"
		opts+=" -extprefix /usr"
		case "$XBPS_TARGET_MACHINE" in
		armv7*)	# V8 snapshot can't be built with a 64 bit host compiler
			opts+=" -no-webengine-v8-snapshot"
			opts+=" -no-webengine-webrtc"
			;;
		arm*)	# V8 snapshot can't be built with a 64 bit host compiler
			opts+=" -no-webengine-v8-snapshot"
			opts+=" -no-webengine-webrtc"
			# The machine code used here does not work for armv5* or armv6*
			sed -i qtwebengine/src/3rdparty/chromium/third_party/skia/include/private/SkFixed.h \
				-e"s;defined(SK_CPU_ARM32);0;"
			;;
		mips*)	# V8 snapshot can't be built with a 64 bit host compiler
			opts+=" -no-webengine-v8-snapshot"
			# webrtc has no provision for mips* architecture in typedefs.h
			opts+=" -no-webengine-webrtc"
			;;
		*)	# webrtc is ok
			opts+=" -webengine-webrtc"
			;;
		esac

		# Make sure libQt5Designer is built
		cp -v ${FILESDIR}/qttools_src.pro qttools/src/src.pro
		cp -v ${FILESDIR}/designer_src.pro qttools/src/designer/src/src.pro
		cp -v ${FILESDIR}/assistant.pro qttools/src/assistant/assistant.pro
		cp -v ${FILESDIR}/linguist.pro qttools/src/linguist/linguist.pro
	else
		opts+=" -webengine-webrtc"
	fi

	CC="cc" CXX="c++" CPP="cpp" LD="c++" AR="ar" AS="as" NM="nm" \
	OBJDUMP="objdump" STRIP="strip" RANLIB="ranlib" \
	CFLAGS="$XBPS_CFLAGS" CXXFLAGS="$XBPS_CXXFLAGS" \
	CPPFLAGS="$XBPS_CPPFLAGS" LDFLAGS="$XBPS_LDFLAGS" \
	LFLAGS="$XBPS_LDFLAGS" \
		${wrksrc}/configure ${opts}
	export LD_LIBRARY_PATH="${wrksrc}/qtbase/lib:${wrksrc}/qttools/lib:${LD_LIBRARY_PATH}"
}

do_build() {
	# Run make twice because sometimes a file "chrome/grit/generated_resources.h"
	# is not yet ready when it is to be included. Repeating make works around that
	# problem without having to resort to disable_parallel_build=yes
	make ${makejobs} || make ${makejobs}
}

do_install() {
	local f base bin dir dirs

	if [ -z "$CROSS_BUILD" ]; then
		unset CC CXX LD CPP AR AS RANLIB
	fi
	cd ${wrksrc}/qtbase
	make INSTALL_ROOT=${DESTDIR} install

	vlicense ${wrksrc}/LGPL_EXCEPTION.txt
	_cleanup_wrksrc_leak

	# Symbolic links for remaining binaries
	vmkdir usr/bin
	for f in $(find ${DESTDIR}/usr/lib/qt5/bin -type f); do
		base=${f##*/}
		ln -sf /usr/lib/qt5/bin/${base} ${PKGDESTDIR}/usr/bin/${base}-qt5
	done

	if [ -n "$CROSS_BUILD" ]; then
		vmkdir usr/bin
		vmkdir usr/lib/qt5/bin

		_msg_cross "Building qmake"
		cd ${wrksrc}/qtbase/qmake
		sed Makefile \
			-e"s;^\(CC\\s*=\).*;\1 $CC;" \
			-e"s;^\(CXX\\s*=\).*;\1 $CXX;" \
			-e"s;^\(LINK\\s*=\).*;\1 $CXX;" \
			-e"s;^\(QMAKE_CFLAGS\\s*=\).*;\1 $CFLAGS;" \
			-e"s;^\(QMAKE_CXXFLAGS\\s*=\).*;\1 $CXXFLAGS;" \
			-e"s;^\(QMAKE_LFLAGS\\s*=\).*;\1 $LDFLAGS;" \
			-e"s;\$(BUILD_PATH)/bin;${PKGDESTDIR}/usr/lib/qt5/bin;" \
			> Makefile.target
		make clean
		make -f Makefile.target ${makejobs}
		ln -sf ../lib/qt5/bin/qmake ${PKGDESTDIR}/usr/bin/qmake-qt5
		cp -ar ${wrksrc}/qtbase/mkspecs ${PKGDESTDIR}/usr/lib/qt5

		dirs+=" qtdeclarative/src/qmldevtools"
		dirs+=" qtdeclarative/tools/qmlmin"
		dirs+=" qtdeclarative/tools/qmllint"
		dirs+=" qtdeclarative/tools/qmlimportscanner"
		dirs+=" qtbase/src/tools/moc"
		dirs+=" qtbase/src/tools/rcc"
		dirs+=" qtbase/src/tools/uic"
		dirs+=" qtbase/src/tools/qdbuscpp2xml"
		dirs+=" qtbase/src/tools/qdbusxml2cpp"
		dirs+=" qtbase/src/tools/qlalr"
		dirs+=" qt3d/tools/qgltf"
		dirs+=" qtremoteobjects/tools/repc"
		dirs+=" qtscxml/tools/qscxmlc"
		dirs+=" qttools/src/qtattributionsscanner"
		dirs+=" qttools/src/linguist/lconvert"
		dirs+=" qttools/src/linguist/lrelease"
		dirs+=" qttools/src/linguist/lupdate"
		dirs+=" qttools/src/qdoc"

		for f in ${dirs}; do
			base=${f##*/}
			dir=${f%%/*}

			_msg_cross " Building ${base}"

			cd ${wrksrc}/${f}
			if [ -x "${wrksrc}/${dir}/bin/${base}" ]; then
				mv -v ${wrksrc}/${dir}/bin/${base}{,-host}
			fi
			make clean
			[ -f "${base}.pro" ] && cp -a ${base}.pro{,.orig}
			if [ -f "${FILESDIR}/${base}.pro" ]; then
				# A specific *.pro file is available, use it.
				cp ${FILESDIR}/${base}.pro ${base}.pro
			else
				# Otherwise strip the option(host_build)
				sed -i ${base}.pro -e "/option(host_build)/d"
			fi
			# Create the Makefile
			mv -v Makefile{,.orig}
			${wrksrc}/qtbase/bin/qmake -o Makefile ${base}.pro

			# Now patch the Makefile(s) to not use the bootstrap libs and
			# use the compiler, linker, flags, etc. for the target arch
			find . -name "Makefile*" -exec sed -i "{}" \
				-e "s; force_bootstrap;;" \
				-e "s;^\(CC\\s*=\).*;\1 $CC;" \
				-e "s;^\(CXX\\s*=\).*;\1 $CXX;" \
				-e "s;^\(LINK\\s*=\).*;\1 $CXX;" \
				-e "s;^\(CFLAGS\\s*=.*\);\1 $CFLAGS;" \
				-e "s;^\(CXXFLAGS\\s*=.*\);\1 $CXXFLAGS;" \
				-e "s;^\(LFLAGS\\s*=.*\);\1 $LDFLAGS;" \
				-e "s;^\(AR\\s*=\).*;\1 $AR cqs;" \
				-e "s;^\(RANLIB\\s*=\).*;\1 $RANLIB;" \
				\;
			if [ "${base}" != "qmldevtools" ]; then
				# Set a different destination directory and target name
				sed -i Makefile \
					-e "s;^\(DESTDIR\\s*=\).*;\1 ${DESTDIR}/usr/lib/qt5/bin/;" \
					-e "s;^\(TARGET\\s*=\).*;\1 ${DESTDIR}/usr/lib/qt5/bin/${base}-target;"
			fi
			make ${makejobs}
			# Restore profile, if any
			[ -f "${base}.pro.orig" ] && mv -v ${base}.pro{.orig,}
			mv -v Makefile{.orig,}
			# Avoid rebuilding the Makefile by changing the rule
			sed -i Makefile -e "s;^Makefile:;Makefile.host:;"
			if [ -x "${wrksrc}/${dir}/bin/${base}-host" ]; then
				mv -v ${wrksrc}/${dir}/bin/${base}{-host,}
				touch ${wrksrc}/${dir}/bin/${base}
			fi
		done
	fi
	# Remove builddir from installation
	rm -rf ${DESTDIR}/builddir
}

qt5-3d-devel_package() {
	short_desc+=" - C++ and QML APIs for 3D graphics (development)"
	depends="qt5-3d-${version}_${revision} qt5-devel-${version}_${revision}"
	pkg_install() {
		_install_devel qt3d
		_move_target_binaries qgltf
	}
}

qt5-3d_package() {
	short_desc+=" - C++ and QML APIs for 3D graphics"
	pkg_install() {
		_install_subpkg qt3d
	}
}

qt5-canvas3d_package() {
	short_desc+=" - Canvas 3D component"
	pkg_install() {
		_install_subpkg qtcanvas3d
	}
}

qt5-charts-devel_package() {
	short_desc+=" - Charts component (development)"
	depends="qt5-charts-${version}_${revision} qt5-declarative-devel-${version}_${revision}"
	pkg_install() {
		_install_devel qtcharts
	}
}

qt5-charts_package() {
	short_desc+=" - Charts component"
	pkg_install() {
		_install_subpkg qtcharts
	}
}

qt5-connectivity-devel_package() {
	short_desc+=" - Connectivity component (development)"
	depends="qt5-connectivity-${version}_${revision} qt5-declarative-devel-${version}_${revision}"
	pkg_install() {
		_install_devel qtconnectivity
	}
}

qt5-connectivity_package() {
	short_desc+=" - Connectivity component"
	pkg_install() {
		_install_subpkg qtconnectivity
	}
}

qt5-datavis3d-devel_package() {
	short_desc+=" - 3D data visualization (development)"
	depends="qt5-datavis3d-${version}_${revision} qt5-declarative-devel-${version}_${revision}"
	pkg_install() {
		_install_devel qtdatavis3d
	}
}

qt5-datavis3d_package() {
	short_desc+=" - 3D data visualization"
	pkg_install() {
		_install_subpkg qtdatavis3d
	}
}

qt5-declarative-devel_package() {
	short_desc+=" - Declarative component (development)"
	depends="qt5-declarative-${version}_${revision} qt5-devel-${version}_${revision}"
	pkg_install() {
		_install_devel qtdeclarative
	}
}

qt5-declarative_package() {
	short_desc+=" - Declarative component"
	pkg_install() {
		_install_subpkg qtdeclarative
		_move_target_binaries qmlmin qmllint qmlimportscanner
	}
}

qt5-examples_package() {
	short_desc+=" - Examples"
	depends="qt5-devel-${version}_${revision} qt5-qmake-${version}_${revision}
		qt5-host-tools-${version}_${revision}"
	pkg_install() {
		local dir mod base=usr/share/qt5/examples
		vmkdir ${base}
		vcopy qtbase/examples/examples.pro ${base}/
		# Copy examples source
		for dir in $(find ${wrksrc} -maxdepth 2 -type d -name examples); do
			mod=${dir%/examples}
			mod=${mod##*/}
			vcopy ${dir}/* ${base}/
			if [ -e "${PKGDESTDIR}/${base}/README" ]; then
				mv ${PKGDESTDIR}/${base}/README{,.${mod}}
			fi
		done
	}
}

qt5-gamepad-devel_package() {
	short_desc+=" - Gamepad component (development)"
	depends="qt5-gamepad-${version}_${revision} qt5-declarative-devel-${version}_${revision}"
	pkg_install() {
		_install_devel qtgamepad
	}
}

qt5-gamepad_package() {
	short_desc+=" - Gamepad component"
	pkg_install() {
		_install_subpkg qtgamepad
	}
}

qt5-graphicaleffects_package() {
	short_desc+=" - Graphicaleffects component"
	pkg_install() {
		_install_subpkg qtgraphicaleffects
	}
}

qt5-imageformats_package() {
	short_desc+=" - Plugins for additional image formats"
	pkg_install() {
		_install_subpkg qtimageformats
	}
}

qt5-location-devel_package() {
	short_desc+=" - Location and Positioning components (development)"
	depends="qt5-location-${version}_${revision} qt5-devel-${version}_${revision}"
	pkg_install() {
		_install_devel qtlocation
	}
}

qt5-location_package() {
	short_desc+=" - Location and Positioning components"
	pkg_install() {
		_install_subpkg qtlocation
	}
}

qt5-multimedia-devel_package() {
	short_desc+=" - Multimedia component (development)"
	depends="qt5-multimedia-${version}_${revision} qt5-devel-${version}_${revision}"
	pkg_install() {
		_install_devel qtmultimedia
	}
}

qt5-multimedia_package() {
	short_desc+=" - Multimedia component"
	pkg_install() {
		_install_subpkg qtmultimedia
	}
}

qt5-networkauth-devel_package() {
	short_desc+=" - NetworkAuth component (development)"
	depends="qt5-networkauth-${version}_${revision} qt5-devel-${version}_${revision}"
	pkg_install() {
		_install_devel qtnetworkauth
	}
}

qt5-networkauth_package() {
	short_desc+=" - NetworkAuth component"
	pkg_install() {
		_install_subpkg qtnetworkauth
	}
}

qt5-purchasing-devel_package() {
	short_desc+=" - Purchasing component (development)"
	depends="qt5-purchasing-${version}_${revision} qt5-devel-${version}_${revision}"
	pkg_install() {
		_install_devel qtpurchasing
	}
}

qt5-purchasing_package() {
	short_desc+=" - Purchasing component"
	pkg_install() {
		_install_subpkg qtpurchasing
	}
}

qt5-quickcontrols_package() {
	short_desc+=" - Quick UI controls"
	pkg_install() {
		_install_subpkg qtquickcontrols
	}
}

qt5-quickcontrols2-devel_package() {
	short_desc+=" - Quick2 UI controls (development)"
	depends="qt5-quickcontrols2-${version}_${revision} qt5-devel-${version}_${revision}"
	pkg_install() {
		_install_devel qtquickcontrols2
	}
}

qt5-quickcontrols2_package() {
	short_desc+=" - Quick2 UI controls"
	pkg_install() {
		_install_subpkg qtquickcontrols2
	}
}

qt5-remoteobjects-devel_package() {
	short_desc+=" - Remote Objects (development)"
	depends="qt5-quickcontrols2-${version}_${revision} qt5-devel-${version}_${revision}"
	pkg_install() {
		_install_devel qtremoteobjects
	}
}

qt5-remoteobjects_package() {
	short_desc+=" - Remote Objects"
	pkg_install() {
		_install_subpkg qtremoteobjects
		_move_target_binaries repc
	}
}

qt5-script-devel_package() {
	short_desc+=" - Scriptable classes (development)"
	depends="qt5-script-${version}_${revision} qt5-devel-${version}_${revision}"
	pkg_install() {
		_install_devel qtscript
	}
}

qt5-script_package() {
	short_desc+=" - Scriptable classes"
	pkg_install() {
		_install_subpkg qtscript
	}
}

qt5-scxml-devel_package() {
	short_desc+=" - SCXML model integration (development)"
	depends="qt5-scxml-${version}_${revision} qt5-devel-${version}_${revision}"
	pkg_install() {
		_install_devel qtscxml
	}
}

qt5-scxml_package() {
	short_desc+=" - SCXML model integration"
	pkg_install() {
		_install_subpkg qtscxml
		_move_target_binaries qscxmlc
	}
}

qt5-sensors-devel_package() {
	short_desc+=" - Sensors component (development)"
	depends="qt5-sensors-${version}_${revision} qt5-devel-${version}_${revision}"
	pkg_install() {
		_install_devel qtsensors
	}
}

qt5-sensors_package() {
	short_desc+=" - Sensors component"
	pkg_install() {
		_install_subpkg qtsensors
	}
}

qt5-serialbus-devel_package() {
	short_desc+=" - Serial bus component (development)"
	depends="qt5-serialbus-${version}_${revision} qt5-serialport-devel-${version}_${revision}
		qt5-devel-${version}_${revision}"
	pkg_install() {
		_install_devel qtserialbus
	}
}

qt5-serialbus_package() {
	short_desc+=" - Serial bus component"
	pkg_install() {
		_install_subpkg qtserialbus
	}
}

qt5-serialport-devel_package() {
	short_desc+=" - Serial port component (development)"
	depends="qt5-serialport-${version}_${revision} qt5-devel-${version}_${revision}"
	pkg_install() {
		_install_devel qtserialport
	}
}

qt5-serialport_package() {
	short_desc+=" - Serial port component"
	pkg_install() {
		_install_subpkg qtserialport
	}
}

qt5-speech-devel_package() {
	short_desc+=" - Speech component (development)"
	depends="qt5-speech-${version}_${revision} qt5-devel-${version}_${revision}"
	pkg_install() {
		_install_devel qtspeech
	}
}

qt5-speech_package() {
	short_desc+=" - Speech component"
	pkg_install() {
		_install_subpkg qtspeech
	}
}

qt5-svg-devel_package() {
	short_desc+=" - Svg component (development)"
	depends="qt5-svg-${version}_${revision} qt5-devel-${version}_${revision}"
	pkg_install() {
		_install_devel qtsvg
	}
}

qt5-svg_package() {
	short_desc+=" - Svg component"
	pkg_install() {
		_install_subpkg qtsvg
	}
}

qt5-virtualkeyboard-devel_package() {
	short_desc+=" - Virtual keyboard (development)"
	depends="qt5-virtualkeyboard-${version}_${revision} qt5-declarative-devel-${version}_${revision}"
	pkg_install() {
		_install_devel qtvirtualkeyboard
	}
}

qt5-virtualkeyboard_package() {
	short_desc+=" - Virtual keyboard"
	pkg_install() {
		_install_subpkg qtvirtualkeyboard
	}
}

qt5-wayland-devel_package() {
	short_desc+=" - Wayland component (development)"
	depends="qt5-wayland-${version}_${revision} qt5-devel-${version}_${revision}"
	pkg_install() {
		_install_devel qtwayland
	}
}

qt5-wayland_package() {
	short_desc+=" - Wayland component"
	pkg_install() {
		_install_subpkg qtwayland
	}
}

qt5-webchannel-devel_package() {
	short_desc+=" - WebChannel component (development)"
	depends="qt5-webchannel-${version}_${revision} qt5-devel-${version}_${revision}"
	pkg_install() {
		_install_devel qtwebchannel
	}
}

qt5-webchannel_package() {
	short_desc+=" - WebChannel component"
	pkg_install() {
		_install_subpkg qtwebchannel
	}
}

qt5-webengine-devel_package() {
	short_desc+=" - WebEngine component (development)"
	depends="qt5-webengine-${version}_${revision} qt5-devel-${version}_${revision}"
	pkg_install() {
		_install_devel qtwebengine
	}
}

qt5-webengine_package() {
	short_desc+=" - WebEngine component"
	pkg_install() {
		_install_subpkg qtwebengine
	}
}

qt5-webglplugin-devel_package() {
	short_desc+=" - WebGL plugin (development)"
	depends="qt5-webglplugin-${version}_${revision} qt5-devel-${version}_${revision}"
	pkg_install() {
		_install_devel qtwebglplugin
	}
}

qt5-webglplugin_package() {
	short_desc+=" - WebGL plugin"
	pkg_install() {
		_install_subpkg qtwebglplugin
	}
}

qt5-websockets-devel_package() {
	short_desc+=" - WebSockets component (development)"
	depends="qt5-websockets-${version}_${revision} qt5-devel-${version}_${revision}"
	pkg_install() {
		_install_devel qtwebsockets
	}
}

qt5-websockets_package() {
	short_desc+=" - WebSockets component"
	pkg_install() {
		_install_subpkg qtwebsockets
	}
}

qt5-webview-devel_package() {
	short_desc+=" - WebView component (development)"
	depends="qt5-webview-${version}_${revision} qt5-devel-${version}_${revision}"
	pkg_install() {
		_install_devel qtwebview
	}
}

qt5-webview_package() {
	short_desc+=" - WebView component"
	pkg_install() {
		_install_subpkg qtwebview
	}
}

qt5-x11extras-devel_package() {
	short_desc+=" - X11 extras (development)"
	depends="qt5-x11extras-${version}_${revision} qt5-devel-${version}_${revision}"
	pkg_install() {
		_install_devel qtx11extras
	}
}

qt5-x11extras_package() {
	short_desc+=" - X11 extras"
	pkg_install() {
		_install_subpkg qtx11extras
	}
}

qt5-xmlpatterns-devel_package() {
	short_desc+=" - XML components (development)"
	depends="qt5-xmlpatterns-${version}_${revision} qt5-devel-${version}_${revision}"
	pkg_install() {
		_install_devel qtxmlpatterns
	}
}

qt5-xmlpatterns_package() {
	short_desc+=" - XML components"
	pkg_install() {
		_install_subpkg qtxmlpatterns
	}
}

qt5-translations_package() {
	short_desc+=" - Translations"
	pkg_install() {
		_install_subpkg qttranslations
	}
}

qt5-host-tools_package() {
	short_desc+=" - Tools required when cross compiling"
	pkg_install() {
		local dest=${XBPS_DESTDIR}/${XBPS_CROSS_TRIPLET}/qt5-tools-${version}
		vmkdir usr/lib/qt5/bin
		vmkdir usr/bin
		for f in moc rcc uic qlalr qdbuscpp2xml qdbusxml2cpp \
			lconvert lupdate lrelease; do
			if [ -r ${dest}/usr/lib/qt5/bin/${f} ]; then
				mv -v ${dest}/usr/lib/qt5/bin/${f} ${PKGDESTDIR}/usr/lib/qt5/bin/
			fi
			if [ -f ${DESTDIR}/usr/lib/qt5/bin/${f}-target ]; then
				mv -v ${DESTDIR}/usr/lib/qt5/bin/${f}{-target,}
			fi
			if [ -f ${DESTDIR}/usr/lib/qt5/bin/${f} ]; then
				vmove usr/lib/qt5/bin/${f}
			fi
			if [ -f ${DESTDIR}/usr/bin/${f}-qt5 ]; then
				vmove usr/bin/${f}-qt5
			else
				ln -sf ../lib/qt5/bin/${f} ${PKGDESTDIR}/usr/bin/${f}-qt5
			fi
		done
	}
}

qt5-tools-devel_package() {
	short_desc+=" - Development tools (development)"
	depends="qt5-tools-${version}_${revision} qt5-devel-${version}_${revision}"
	pkg_install() {
		_install_devel qttools
	}
}

qt5-tools_package() {
	short_desc+=" - Development tools"
	depends="qt5-translations desktop-file-utils hicolor-icon-theme"
	pkg_install() {
		local f dest=${XBPS_DESTDIR}/${XBPS_CROSS_TRIPLET}/qt5-host-tools-${version}
		_install_subpkg qttools
		# install missing icons and desktop files
		for icon in ${wrksrc}/qttools/src/linguist/linguist/images/icons/linguist-*-32.png ; do
			size=$(echo $(basename ${icon}) | cut -d- -f2)
			install -p -D -m644 ${icon} \
				${PKGDESTDIR}/usr/share/icons/hicolor/${size}x${size}/apps/linguist-qt5.png
		done
		install -Dm644 ${wrksrc}/qttools/src/assistant/assistant/images/assistant.png \
			${PKGDESTDIR}/usr/share/icons/hicolor/32x32/apps/assistant-qt5.png
		install -Dm644 ${wrksrc}/qttools/src/assistant/assistant/images/assistant-128.png \
			${PKGDESTDIR}/usr/share/icons/hicolor/128x128/apps/assistant-qt5.png
		install -Dm644 ${wrksrc}/qttools/src/designer/src/designer/images/designer.png \
			${PKGDESTDIR}/usr/share/icons/hicolor/128x128/apps/designer-qt5.png
		install -Dm644 ${wrksrc}/qttools/src/qdbus/qdbusviewer/images/qdbusviewer.png \
			${PKGDESTDIR}/usr/share/icons/hicolor/32x32/apps/qdbusviewer-qt5.png
		install -Dm644 ${wrksrc}/qttools/src/qdbus/qdbusviewer/images/qdbusviewer-128.png \
			${PKGDESTDIR}/usr/share/icons/hicolor/128x128/apps/qdbusviewer-qt5.png
		# install desktop files
		vmkdir usr/share/applications
		install -m644 ${FILESDIR}/*.desktop ${PKGDESTDIR}/usr/share/applications
		_move_target_binaries qtattributionsscanner qdoc
		# Move some binaries to qt5-host-tools
		for f in lconvert lupdate lrelease; do
			if [ -f ${PKGDESTDIR}/usr/lib/qt5/bin/${f} ]; then
				mkdir -p ${dest}/usr/lib/qt5/bin
				mv -v ${PKGDESTDIR}/usr/lib/qt5/bin/${f} ${dest}/usr/lib/qt5/bin/
			fi
			if [ -f ${PKGDESTDIR}/usr/bin/${f}-qt5 ]; then
				mkdir -p ${dest}/usr/bin
				mv -v ${PKGDESTDIR}/usr/bin/${f}-qt5 ${dest}/usr/bin/
			fi
		done
	}
}

qt5-devel_package() {
	depends="zlib-devel libressl-devel>=2.1.4 libXext-devel libXrender-devel
		fontconfig-devel libglib-devel MesaLib-devel mtdev-devel
		dbus-devel icu-devel qt5-${version}_${revision}
		qt5-qmake-${version}_${revision}
		qt5-host-tools-${version}_${revision}"
	short_desc+=" - Development files"
	# qt5-enginio-devel is gone
	pkg_install() {
		vmove usr/include
		vmove usr/lib/*.a
		vmove usr/lib/*.prl
		vmove usr/lib/cmake
		vmove usr/lib/pkgconfig
		_cleanup_wrksrc_leak
	}
}

qt5-plugin-odbc_package() {
	short_desc+=" - ODBC plugin"
	pkg_install() {
		vmove usr/lib/qt5/plugins/sqldrivers/libqsqlodbc.so
	}
}

qt5-plugin-pgsql_package() {
	short_desc+=" - PostgreSQL plugin"
	pkg_install() {
		vmove usr/lib/qt5/plugins/sqldrivers/libqsqlpsql.so
	}
}

qt5-plugin-mysql_package() {
	short_desc+=" - MySQL plugin"
	pkg_install() {
		vmove usr/lib/qt5/plugins/sqldrivers/libqsqlmysql.so
	}
}

qt5-plugin-sqlite_package() {
	short_desc+=" - SQLite plugin"
	pkg_install() {
		vmove usr/lib/qt5/plugins/sqldrivers/libqsqlite.so
	}
}

qt5-plugin-tds_package() {
	short_desc+=" - TDS plugin"
	pkg_install() {
		vmove usr/lib/qt5/plugins/sqldrivers/libqsqltds.so
	}
}

qt5-qmake_package() {
	short_desc+=" - Qmake Makefile generator tool"
	pkg_install() {
		vmove usr/lib/qt5/bin/qmake
		vmove usr/lib/qt5/mkspecs
		vmove usr/bin/qmake-qt5

		# Change -isystem to -I to avoid "#include_next <stdlib.h>" errors
		sed -i ${PKGDESTDIR}/usr/lib/qt5/mkspecs/common/gcc-base.conf \
			-e '/^QMAKE_CFLAGS_ISYSTEM/s;-isystem;-I;'

		# Undo changes to mkspecs/common/gcc-base.conf and g++-unix.conf
		if [ -n "$CROSS_BUILD" ]; then
			sed -i -e "s|^\(QMAKE_CFLAGS_RELEASE.*\) ${XBPS_CFLAGS}|\1|" \
				${PKGDESTDIR}/usr/lib/qt5/mkspecs/common/gcc-base.conf
			sed -i -e "s|^\(QMAKE_LFLAGS_RELEASE.*\) ${XBPS_LDFLAGS}|\1|" \
				${PKGDESTDIR}/usr/lib/qt5/mkspecs/common/g++-unix.conf
		else
			sed -i -e "s|^\(QMAKE_CFLAGS_RELEASE.*\) ${CFLAGS}|\1|" \
				${PKGDESTDIR}/usr/lib/qt5/mkspecs/common/gcc-base.conf
			sed -i -e "s|^\(QMAKE_LFLAGS_RELEASE.*\) ${LDFLAGS}|\1|" \
				${PKGDESTDIR}/usr/lib/qt5/mkspecs/common/g++-unix.conf
		fi
	}
}
