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