xref: /OK3568_Linux_fs/yocto/meta-qt5/classes/qmake5_base.bbclass (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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