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