diff --git a/common/build-style/sip-build.sh b/common/build-style/sip-build.sh new file mode 100644 index 0000000000..d8b3bcea98 --- /dev/null +++ b/common/build-style/sip-build.sh @@ -0,0 +1,147 @@ +# +# This helper is for templates using sip-build. +# + +do_configure() { + local _qt= + local _spec= + local _mkspec= + + : "${sip_builddir:=build}" + mkdir -p "$sip_builddir" + + if [ ! -d /$py3_sitelib/pyqtbuild ]; then + : "who uses sip-build without qmake anyway?" + elif [ -x /usr/lib/qt6/bin/qmake ]; then + _qt=qt6 + elif [ -x /usr/lib/qt5/bin/qmake ]; then + _qt=qt5 + else + msg_error 'qmake not found\n' + fi + + if [ ! "$_qt" ]; then + : "who use sip-build without qmake anyway?" + elif [ "$CROSS_BUILD" ]; then + _mkspec="usr/lib/$_qt/mkspecs" + _spec="$XBPS_WRAPPERDIR/sip-build/target-spec/linux-g++" + mkdir -p "$_spec" + cat >"$_spec/qmake.conf" <<-_EOF + MAKEFILE_GENERATOR = UNIX + CONFIG += incremental no_qt_rpath + QMAKE_INCREMENTAL_STYLE = sublib + + include(/$_mkspec/common/linux.conf) + include(/$_mkspec/common/gcc-base-unix.conf) + include(/$_mkspec/common/g++-unix.conf) + + QMAKE_TARGET_CONFIG = $XBPS_CROSS_BASE/$_mkspec/qconfig.pri + QMAKE_TARGET_MODULE = $XBPS_CROSS_BASE/$_mkspec/qmodule.pri + QMAKEMODULES = $XBPS_CROSS_BASE/$_mkspec/modules + QMAKE_CC = $CC + QMAKE_CXX = $CXX + QMAKE_LINK = $CXX + QMAKE_LINK_C = $CC + QMAKE_LINK_SHLIB = $CXX + + QMAKE_AR = $XBPS_CROSS_TRIPLET-gcc-ar cqs + QMAKE_OBJCOPY = $OBJCOPY + QMAKE_NM = $NM -P + QMAKE_STRIP = $STRIP + + QMAKE_CFLAGS = $CFLAGS -I$XBPS_CROSS_BASE/usr/include/python$py3_ver + QMAKE_CXXFLAGS = $CXXFLAGS -I$XBPS_CROSS_BASE/usr/include/python$py3_ver + QMAKE_LFLAGS = -L$XBPS_CROSS_BASE/usr/lib $LDFLAGS + load(qt_config) + _EOF + + printf '#include "%s/%s/linux-g++/qplatformdefs.h"\n' \ + "$XBPS_CROSS_BASE" "$_mkspec" >"$_spec/qplatformdefs.h" + cat >"$XBPS_WRAPPERDIR/sip-build/qt.conf" <<-_EOF + [Paths] + Sysroot=$XBPS_CROSS_BASE + Prefix=$XBPS_CROSS_BASE/usr + ArchData=$XBPS_CROSS_BASE/usr/lib/$_qt + Data=$XBPS_CROSS_BASE/usr/share/$_qt + Documentation=$XBPS_CROSS_BASE/usr/share/doc/$_qt + Headers=$XBPS_CROSS_BASE/usr/include/$_qt + Libraries=$XBPS_CROSS_BASE/usr/lib + LibraryExecutables=/usr/lib/$_qt/libexec + Binaries=/usr/lib/$_qt/bin + Tests=$XBPS_CROSS_BASE/usr/tests + Plugins=/usr/lib/$_qt/plugins + Imports=$XBPS_CROSS_BASE/usr/lib/$_qt/imports + Qml2Imports=$XBPS_CROSS_BASE/usr/lib/$_qt/qml + Translations=$XBPS_CROSS_BASE/usr/share/$_qt/translations + Settings=$XBPS_CROSS_BASE/etc/xdg + Examples=$XBPS_CROSS_BASE/usr/share/$_qt/examples + HostPrefix=/usr + HostData=/usr/lib/$_qt + HostBinaries=/usr/lib/$_qt/bin + HostLibraries=/usr/lib + HostLibraryExecutables=/usr/lib/$_qt/libexec + Spec=linux-g++ + TargetSpec=$_spec + _EOF + # Call it sip-qmake to not override qmake build-helper + # + # XXX: Intentionally quote {C,CXX,LD}FLAGS here but not native. + # - Cross Build: + # + base flags will be picked up from QMAKE_{C,CXX,LD}FLAGS + # + hardening flags will be picked up from environment variables + # - Native Build: + # + hardening flags will be picked up first (Makefile, qt.conf?) + # + base flags will be picked up from QMAKE_{C,CXX,LD}FLAGS + # Maybe there're better workaround, I don't know. + cat >"$XBPS_WRAPPERDIR/sip-qmake" <<-_EOF + #!/bin/sh + exec /usr/lib/$_qt/bin/qmake "\$@" \\ + -qtconf "$XBPS_WRAPPERDIR/sip-build/qt.conf" \\ + PKG_CONFIG_EXECUTABLE=${XBPS_WRAPPERDIR}/${PKG_CONFIG} \\ + QMAKE_CFLAGS+="\$CFLAGS" \\ + QMAKE_CXXFLAGS+="\$CXXFLAGS" \\ + QMAKE_LFLAGS+="\$LDFLAGS" + _EOF + chmod 755 ${XBPS_WRAPPERDIR}/sip-qmake + else + cat >"${XBPS_WRAPPERDIR}/sip-qmake" <<-_EOF + #!/bin/sh + exec /usr/lib/$_qt/bin/qmake \\ + "\$@" \\ + PREFIX=/usr \\ + QT_INSTALL_PREFIX=/usr \\ + LIB=/usr/lib \\ + QMAKE_CC="$CC" QMAKE_CXX="$CXX" \\ + QMAKE_LINK="$CXX" QMAKE_LINK_C="$CC" \\ + QMAKE_CFLAGS+="$CFLAGS" \\ + QMAKE_CXXFLAGS+="$CXXFLAGS" \\ + QMAKE_LFLAGS+="$LDFLAGS" \\ + CONFIG+=no_qt_rpath + _EOF + chmod 755 ${XBPS_WRAPPERDIR}/sip-qmake + fi + + sip-build --no-make \ + ${_qt:+--qmake "$XBPS_WRAPPERDIR/sip-qmake"} \ + --api-dir /usr/share/$_qt/qsci/api/python \ + $configure_args \ + --build-dir "$sip_builddir" + + if [ "$CROSS_BUILD" ]; then + # -I/usr/include/python$py3_ver is set by sip-build :( + find "$sip_builddir" -name Makefile | + xargs sed -i "s,-I\\(/usr/include\\),-I$XBPS_CROSS_BASE\\1,g" + fi +} + +do_build() { + : "${sip_builddir:=build}" + make -C "${sip_builddir}" ${makejobs} +} + +do_install() { + : "${sip_builddir:=build}" + make -C "${sip_builddir}" \ + DESTDIR=${DESTDIR} INSTALL_ROOT=${DESTDIR} \ + install +}