1*4882a593Smuzhiyun# hardcode linux, because that's what 0001-Add-linux-oe-g-platform.patch adds 2*4882a593SmuzhiyunXPLATFORM:toolchain-clang = "linux-oe-clang" 3*4882a593SmuzhiyunXPLATFORM ?= "linux-oe-g++" 4*4882a593Smuzhiyun 5*4882a593SmuzhiyunOE_QMAKE_PLATFORM_NATIVE = "${XPLATFORM}" 6*4882a593SmuzhiyunOE_QMAKE_PLATFORM = "${XPLATFORM}" 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun# Add -d to show debug output from every qmake call, but it prints *a lot*, better to add it only to debugged recipe 9*4882a593SmuzhiyunOE_QMAKE_DEBUG_OUTPUT ?= "" 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun# Look through supplied directories recursively by default 12*4882a593SmuzhiyunOE_QMAKE_RECURSIVE ?= "-r" 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun# Paths in .prl files contain SYSROOT value 15*4882a593SmuzhiyunSSTATE_SCAN_FILES += "*.pri *.prl *.prf" 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun# drop default -e and add needed OE_QMAKE vars explicitly 18*4882a593Smuzhiyun# the problem is that when generated Makefile has: 19*4882a593Smuzhiyun# CFLAGS = -pipe $(OE_QMAKE_CFLAGS) -O2 -pthread -D_REENTRANT -Wall -W -fPIC $(DEFINES) 20*4882a593Smuzhiyun# then OE_QMAKE_CFLAGS are exported and used correctly, but then whole CFLAGS is overwritten from env (and -fPIC lost and build fails) 21*4882a593SmuzhiyunEXTRA_OEMAKE = " \ 22*4882a593Smuzhiyun MAKEFLAGS='${PARALLEL_MAKE}' \ 23*4882a593Smuzhiyun OE_QMAKE_CC='${OE_QMAKE_CC}' \ 24*4882a593Smuzhiyun OE_QMAKE_CXX='${OE_QMAKE_CXX}' \ 25*4882a593Smuzhiyun OE_QMAKE_CFLAGS='${OE_QMAKE_CFLAGS}' \ 26*4882a593Smuzhiyun OE_QMAKE_CXXFLAGS='${OE_QMAKE_CXXFLAGS}' \ 27*4882a593Smuzhiyun OE_QMAKE_LINK='${OE_QMAKE_LINK}' \ 28*4882a593Smuzhiyun OE_QMAKE_LDFLAGS='${OE_QMAKE_LDFLAGS}' \ 29*4882a593Smuzhiyun OE_QMAKE_AR='${OE_QMAKE_AR}' \ 30*4882a593Smuzhiyun OE_QMAKE_OBJCOPY='${OE_QMAKE_OBJCOPY}' \ 31*4882a593Smuzhiyun OE_QMAKE_STRIP='${OE_QMAKE_STRIP}' \ 32*4882a593Smuzhiyun OE_QMAKE_INCDIR_QT='${STAGING_DIR_TARGET}/${OE_QMAKE_PATH_HEADERS}' \ 33*4882a593Smuzhiyun" 34*4882a593Smuzhiyun 35*4882a593SmuzhiyunOE_QMAKE_QMAKE = "${OE_QMAKE_PATH_EXTERNAL_HOST_BINS}/qmake" 36*4882a593Smuzhiyunexport OE_QMAKE_CC = "${CC}" 37*4882a593Smuzhiyunexport OE_QMAKE_CFLAGS = "${CFLAGS}" 38*4882a593Smuzhiyunexport OE_QMAKE_CXX = "${CXX}" 39*4882a593Smuzhiyunexport OE_QMAKE_CXXFLAGS = "${CXXFLAGS}" 40*4882a593Smuzhiyunexport OE_QMAKE_LINK = "${CXX}" 41*4882a593Smuzhiyunexport OE_QMAKE_LDFLAGS = "${LDFLAGS}" 42*4882a593Smuzhiyunexport OE_QMAKE_AR = "${AR}" 43*4882a593Smuzhiyunexport OE_QMAKE_OBJCOPY = "${OBJCOPY}" 44*4882a593Smuzhiyunexport OE_QMAKE_STRIP = "echo" 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun# qmake reads if from shell environment 47*4882a593Smuzhiyunexport OE_QMAKE_QTCONF_PATH = "${WORKDIR}/qt.conf" 48*4882a593Smuzhiyun 49*4882a593Smuzhiyuninherit qmake5_paths 50*4882a593Smuzhiyun 51*4882a593Smuzhiyungenerate_target_qt_config_file() { 52*4882a593Smuzhiyun qtconf="$1" 53*4882a593Smuzhiyun cat > "${qtconf}" <<EOF 54*4882a593Smuzhiyun[Paths] 55*4882a593SmuzhiyunPrefix = ${OE_QMAKE_PATH_PREFIX} 56*4882a593SmuzhiyunHeaders = ${OE_QMAKE_PATH_HEADERS} 57*4882a593SmuzhiyunLibraries = ${OE_QMAKE_PATH_LIBS} 58*4882a593SmuzhiyunArchData = ${OE_QMAKE_PATH_ARCHDATA} 59*4882a593SmuzhiyunData = ${OE_QMAKE_PATH_DATA} 60*4882a593SmuzhiyunBinaries = ${OE_QMAKE_PATH_BINS} 61*4882a593SmuzhiyunLibraryExecutables = ${OE_QMAKE_PATH_LIBEXECS} 62*4882a593SmuzhiyunPlugins = ${OE_QMAKE_PATH_PLUGINS} 63*4882a593SmuzhiyunQml2Imports = ${OE_QMAKE_PATH_QML} 64*4882a593SmuzhiyunTranslations = ${OE_QMAKE_PATH_TRANSLATIONS} 65*4882a593SmuzhiyunDocumentation = ${OE_QMAKE_PATH_DOCS} 66*4882a593SmuzhiyunSettings = ${OE_QMAKE_PATH_SETTINGS} 67*4882a593SmuzhiyunExamples = ${OE_QMAKE_PATH_EXAMPLES} 68*4882a593SmuzhiyunTests = ${OE_QMAKE_PATH_TESTS} 69*4882a593SmuzhiyunHostBinaries = ${OE_QMAKE_PATH_BINS} 70*4882a593SmuzhiyunHostData = ${OE_QMAKE_PATH_ARCHDATA} 71*4882a593SmuzhiyunHostLibraries = ${OE_QMAKE_PATH_LIBS} 72*4882a593SmuzhiyunHostSpec = ${OE_QMAKE_PLATFORM} 73*4882a593SmuzhiyunTargetSpec = ${OE_QMAKE_PLATFORM} 74*4882a593SmuzhiyunExternalHostBinaries = ${OE_QMAKE_PATH_BINS} 75*4882a593SmuzhiyunSysroot = 76*4882a593SmuzhiyunEOF 77*4882a593Smuzhiyun} 78*4882a593Smuzhiyun 79*4882a593Smuzhiyundo_generate_qt_config_file() { 80*4882a593Smuzhiyun generate_qt_config_file_paths 81*4882a593Smuzhiyun generate_qt_config_file_effective_paths 82*4882a593Smuzhiyun} 83*4882a593Smuzhiyun 84*4882a593Smuzhiyungenerate_qt_config_file_paths() { 85*4882a593Smuzhiyun cat > ${OE_QMAKE_QTCONF_PATH} <<EOF 86*4882a593Smuzhiyun[Paths] 87*4882a593SmuzhiyunPrefix = ${OE_QMAKE_PATH_PREFIX} 88*4882a593SmuzhiyunHeaders = ${OE_QMAKE_PATH_HEADERS} 89*4882a593SmuzhiyunLibraries = ${OE_QMAKE_PATH_LIBS} 90*4882a593SmuzhiyunArchData = ${OE_QMAKE_PATH_ARCHDATA} 91*4882a593SmuzhiyunData = ${OE_QMAKE_PATH_DATA} 92*4882a593SmuzhiyunBinaries = ${OE_QMAKE_PATH_BINS} 93*4882a593SmuzhiyunLibraryExecutables = ${OE_QMAKE_PATH_LIBEXECS} 94*4882a593SmuzhiyunPlugins = ${OE_QMAKE_PATH_PLUGINS} 95*4882a593SmuzhiyunQml2Imports = ${OE_QMAKE_PATH_QML} 96*4882a593SmuzhiyunTranslations = ${OE_QMAKE_PATH_TRANSLATIONS} 97*4882a593SmuzhiyunDocumentation = ${OE_QMAKE_PATH_DOCS} 98*4882a593SmuzhiyunSettings = ${OE_QMAKE_PATH_SETTINGS} 99*4882a593SmuzhiyunExamples = ${OE_QMAKE_PATH_EXAMPLES} 100*4882a593SmuzhiyunTests = ${OE_QMAKE_PATH_TESTS} 101*4882a593SmuzhiyunHostBinaries = ${OE_QMAKE_PATH_HOST_BINS} 102*4882a593SmuzhiyunHostData = ${OE_QMAKE_PATH_HOST_DATA} 103*4882a593SmuzhiyunHostLibraries = ${OE_QMAKE_PATH_HOST_LIBS} 104*4882a593SmuzhiyunHostSpec = ${OE_QMAKE_PLATFORM_NATIVE} 105*4882a593SmuzhiyunTargetSpec = ${OE_QMAKE_PLATFORM} 106*4882a593SmuzhiyunExternalHostBinaries = ${OE_QMAKE_PATH_EXTERNAL_HOST_BINS} 107*4882a593SmuzhiyunSysroot = ${STAGING_DIR_TARGET} 108*4882a593SmuzhiyunEOF 109*4882a593Smuzhiyun} 110*4882a593Smuzhiyun 111*4882a593Smuzhiyungenerate_qt_config_file_effective_paths() { 112*4882a593Smuzhiyun cat >> ${OE_QMAKE_QTCONF_PATH} <<EOF 113*4882a593Smuzhiyun[EffectivePaths] 114*4882a593SmuzhiyunHostBinaries = ${OE_QMAKE_PATH_EXTERNAL_HOST_BINS} 115*4882a593SmuzhiyunHostLibraries = ${STAGING_LIBDIR_NATIVE} 116*4882a593SmuzhiyunHostData = ${OE_QMAKE_PATH_HOST_DATA} 117*4882a593SmuzhiyunHostPrefix = ${STAGING_DIR_NATIVE} 118*4882a593SmuzhiyunEOF 119*4882a593Smuzhiyun} 120*4882a593Smuzhiyun# 121*4882a593Smuzhiyun# Allows to override following values (as in version 5.0.1) 122*4882a593Smuzhiyun# Prefix The default prefix for all paths. 123*4882a593Smuzhiyun# Documentation The location for documentation upon install. 124*4882a593Smuzhiyun# Headers The location for all headers. 125*4882a593Smuzhiyun# Libraries The location of installed libraries. 126*4882a593Smuzhiyun# LibraryExecutables The location of installed executables required by libraries at runtime. 127*4882a593Smuzhiyun# Binaries The location of installed Qt binaries (tools and applications). 128*4882a593Smuzhiyun# Plugins The location of installed Qt plugins. 129*4882a593Smuzhiyun# Imports The location of installed QML extensions to import (QML 1.x). 130*4882a593Smuzhiyun# Qml2Imports The location of installed QML extensions to import (QML 2.x). 131*4882a593Smuzhiyun# ArchData The location of general architecture-dependent Qt data. 132*4882a593Smuzhiyun# Data The location of general architecture-independent Qt data. 133*4882a593Smuzhiyun# Translations The location of translation information for Qt strings. 134*4882a593Smuzhiyun# Examples The location for examples upon install. 135*4882a593Smuzhiyun# Tests The location of installed Qt testcases. 136*4882a593Smuzhiyun# Settings The location for Qt settings. Not applicable on Windows. 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun# For bootstrapped 139*4882a593Smuzhiyun# Sysroot The location of target sysroot 140*4882a593Smuzhiyun# HostPrefix The prefix for host tools when cross compiling (building tools for both systems) 141*4882a593Smuzhiyun# HostBinaries The location where to install host tools 142*4882a593Smuzhiyun# HostData The location where to install host data 143*4882a593Smuzhiyun# ExternalHostBinaries The location where we already have host tools (when cross compiling, but reusing existing tools) 144*4882a593Smuzhiyun# TargetSpec The location where to install target mkspec 145*4882a593Smuzhiyun# HostSpec The location where to install host mkspec 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun# qmake works fine with separate B, use it by default 148*4882a593SmuzhiyunSEPB = "${WORKDIR}/build" 149*4882a593SmuzhiyunB = "${SEPB}" 150*4882a593Smuzhiyun 151*4882a593SmuzhiyunCONFIGURESTAMPFILE = "${WORKDIR}/qmake5_base_configure.sstate" 152*4882a593Smuzhiyun 153*4882a593Smuzhiyunqmake5_base_preconfigure() { 154*4882a593Smuzhiyun if [ -n "${CONFIGURESTAMPFILE}" -a -e "${CONFIGURESTAMPFILE}" ]; then 155*4882a593Smuzhiyun if [ "`cat ${CONFIGURESTAMPFILE}`" != "${BB_TASKHASH}" -a "${S}" != "${B}" ]; then 156*4882a593Smuzhiyun echo "Previously configured separate build directory detected, cleaning ${B}" 157*4882a593Smuzhiyun rm -rf ${B} 158*4882a593Smuzhiyun mkdir ${B} 159*4882a593Smuzhiyun fi 160*4882a593Smuzhiyun fi 161*4882a593Smuzhiyun} 162*4882a593Smuzhiyun 163*4882a593Smuzhiyunqmake5_base_postconfigure(){ 164*4882a593Smuzhiyun if [ -n "${CONFIGURESTAMPFILE}" ]; then 165*4882a593Smuzhiyun echo ${BB_TASKHASH} > ${CONFIGURESTAMPFILE} 166*4882a593Smuzhiyun fi 167*4882a593Smuzhiyun} 168*4882a593Smuzhiyun 169*4882a593SmuzhiyunEXTRAQCONFFUNCS ??= "" 170*4882a593Smuzhiyun 171*4882a593Smuzhiyundo_configure[prefuncs] += "qmake5_base_preconfigure ${EXTRAQCONFFUNCS}" 172*4882a593Smuzhiyundo_configure[postfuncs] += "qmake5_base_postconfigure" 173*4882a593Smuzhiyun 174*4882a593Smuzhiyunaddtask generate_qt_config_file after do_patch before do_configure 175*4882a593Smuzhiyun 176*4882a593Smuzhiyunqmake5_base_do_configure () { 177*4882a593Smuzhiyun if [ -z "${QMAKE_PROFILES}" ]; then 178*4882a593Smuzhiyun PROFILES="`ls ${S}/*.pro`" 179*4882a593Smuzhiyun else 180*4882a593Smuzhiyun PROFILES="${QMAKE_PROFILES}" 181*4882a593Smuzhiyun bbnote "qmake using profiles: '${QMAKE_PROFILES}'" 182*4882a593Smuzhiyun fi 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun if [ ! -z "${EXTRA_QMAKEVARS_POST}" ]; then 185*4882a593Smuzhiyun AFTER="-after" 186*4882a593Smuzhiyun QMAKE_VARSUBST_POST="${EXTRA_QMAKEVARS_POST}" 187*4882a593Smuzhiyun bbnote "qmake postvar substitution: '${EXTRA_QMAKEVARS_POST}'" 188*4882a593Smuzhiyun fi 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun if [ ! -z "${EXTRA_QMAKEVARS_PRE}" ]; then 191*4882a593Smuzhiyun QMAKE_VARSUBST_PRE="${EXTRA_QMAKEVARS_PRE}" 192*4882a593Smuzhiyun bbnote "qmake prevar substitution: '${EXTRA_QMAKEVARS_PRE}'" 193*4882a593Smuzhiyun fi 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun if [ ! -z "${EXTRA_QMAKEVARS_CONFIGURE}" ]; then 196*4882a593Smuzhiyun QMAKE_VARSUBST_CONFIGURE="${EXTRA_QMAKEVARS_CONFIGURE}" 197*4882a593Smuzhiyun bbnote "qmake configure substitution: '${EXTRA_QMAKEVARS_CONFIGURE}'" 198*4882a593Smuzhiyun fi 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun # for config.tests to read this 201*4882a593Smuzhiyun export QMAKE_MAKE_ARGS="${EXTRA_OEMAKE}" 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun CMD="${OE_QMAKE_QMAKE} -makefile -o Makefile ${OE_QMAKE_DEBUG_OUTPUT} ${OE_QMAKE_RECURSIVE} $QMAKE_VARSUBST_PRE $AFTER $PROFILES $QMAKE_VARSUBST_POST -- $QMAKE_VARSUBST_CONFIGURE" 204*4882a593Smuzhiyun ${OE_QMAKE_QMAKE} -makefile -o Makefile ${OE_QMAKE_DEBUG_OUTPUT} ${OE_QMAKE_RECURSIVE} $QMAKE_VARSUBST_PRE $AFTER $PROFILES $QMAKE_VARSUBST_POST -- $QMAKE_VARSUBST_CONFIGURE || die "Error calling $CMD" 205*4882a593Smuzhiyun} 206*4882a593Smuzhiyun 207*4882a593Smuzhiyunqmake5_base_native_do_install() { 208*4882a593Smuzhiyun oe_runmake install INSTALL_ROOT=${D} 209*4882a593Smuzhiyun find "${D}" -ignore_readdir_race -name "*.la" -delete 210*4882a593Smuzhiyun if ls ${D}${libdir}/pkgconfig/Qt5*.pc >/dev/null 2>/dev/null; then 211*4882a593Smuzhiyun sed -i "s@-L${STAGING_LIBDIR}@-L\${libdir}@g" ${D}${libdir}/pkgconfig/Qt5*.pc 212*4882a593Smuzhiyun fi 213*4882a593Smuzhiyun} 214*4882a593Smuzhiyun 215*4882a593Smuzhiyunqmake5_base_fix_install() { 216*4882a593Smuzhiyun STAGING_PATH=$1 217*4882a593Smuzhiyun if [ -d ${D}${STAGING_PATH} ] ; then 218*4882a593Smuzhiyun echo "Some files are installed in wrong directory ${D}${STAGING_PATH}" 219*4882a593Smuzhiyun cp -ra ${D}${STAGING_PATH}/* ${D} 220*4882a593Smuzhiyun rm -rf ${D}${STAGING_PATH} 221*4882a593Smuzhiyun # remove empty dirs 222*4882a593Smuzhiyun TMP=`dirname ${D}${STAGING_PATH}` 223*4882a593Smuzhiyun while test ${TMP} != ${D}; do 224*4882a593Smuzhiyun rmdir ${TMP} 225*4882a593Smuzhiyun TMP=`dirname ${TMP}`; 226*4882a593Smuzhiyun done 227*4882a593Smuzhiyun fi 228*4882a593Smuzhiyun} 229*4882a593Smuzhiyun 230*4882a593Smuzhiyunqmake5_base_do_install() { 231*4882a593Smuzhiyun # Fix install paths for all 232*4882a593Smuzhiyun find . -name "Makefile*" | xargs -r sed -i "s,(INSTALL_ROOT)${STAGING_DIR_TARGET},(INSTALL_ROOT),g" 233*4882a593Smuzhiyun find . -name "Makefile*" | xargs -r sed -i "s,(INSTALL_ROOT)${STAGING_DIR_HOST},(INSTALL_ROOT),g" 234*4882a593Smuzhiyun find . -name "Makefile*" | xargs -r sed -i "s,(INSTALL_ROOT)${STAGING_DIR_NATIVE},(INSTALL_ROOT),g" 235*4882a593Smuzhiyun 236*4882a593Smuzhiyun oe_runmake install INSTALL_ROOT=${D} 237*4882a593Smuzhiyun 238*4882a593Smuzhiyun # everything except HostData and HostBinaries is prefixed with sysroot value, 239*4882a593Smuzhiyun # but we cannot remove sysroot override, because that's useful for pkg-config etc 240*4882a593Smuzhiyun # concurrent builds may cause qmake to regenerate Makefiles and override the above 241*4882a593Smuzhiyun # sed changes. If that happens, move files manually to correct location. 242*4882a593Smuzhiyun qmake5_base_fix_install ${STAGING_DIR_TARGET} 243*4882a593Smuzhiyun qmake5_base_fix_install ${STAGING_DIR_HOST} 244*4882a593Smuzhiyun qmake5_base_fix_install ${STAGING_DIR_NATIVE} 245*4882a593Smuzhiyun 246*4882a593Smuzhiyun # Replace host paths with qmake built-in properties 247*4882a593Smuzhiyun find ${D} \( -name "*.pri" -or -name "*.prl" \) -exec \ 248*4882a593Smuzhiyun sed -i -e 's|${STAGING_DIR_NATIVE}|$$[QT_HOST_PREFIX/get]|g' \ 249*4882a593Smuzhiyun -e 's|${STAGING_DIR_HOST}|$$[QT_SYSROOT]|g' {} \ 250*4882a593Smuzhiyun -e '/QMAKE_PRL_BUILD_DIR/d' {} \; 251*4882a593Smuzhiyun 252*4882a593Smuzhiyun # Replace host paths with pkg-config built-in variable 253*4882a593Smuzhiyun find ${D} -name "*.pc" -exec \ 254*4882a593Smuzhiyun sed -i -e 's|prefix=${STAGING_DIR_HOST}|prefix=|g' \ 255*4882a593Smuzhiyun -e 's|${STAGING_DIR_HOST}|${pc_sysrootdir}|g' {} \; 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun # Replace resolved lib path with the lib name 258*4882a593Smuzhiyun find ${D} -name "*.cmake" -exec \ 259*4882a593Smuzhiyun sed -i -e 's@/[^;]*/lib\([^;]*\)\.\(so\|a\)@\1@g' {} \; 260*4882a593Smuzhiyun 261*4882a593Smuzhiyun} 262