summaryrefslogtreecommitdiffstats
path: root/mkspecs/features/qt_module_pris.prf
blob: 7b5ccc09837bbf2e4544b39af240ff664e436ab6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#
#  W A R N I N G
#  -------------
#
# This file is not part of the Qt API.  It exists purely as an
# implementation detail.  It may change from version to version
# without notice, or even be removed.
#
# We mean it.
#

load(qt_build_paths)
MODULE_FWD_PRI = $$MODULE_QMAKE_OUTDIR/mkspecs/modules/qt_lib_$${MODULE}.pri
prefix_build: \
    MODULE_PRI = $$MODULE_QMAKE_OUTDIR/mkspecs/modules-inst/qt_lib_$${MODULE}.pri
else: \
    MODULE_PRI = $$MODULE_FWD_PRI

!build_pass {

    # Create a module .pri file
    unix:!static: \
        module_rpath = "QT.$${MODULE}.rpath = $$[QT_INSTALL_LIBS/raw]"
    else: \
        module_rpath =
    !isEmpty(QT_FOR_PRIVATE) {
        contains(QT_FOR_PRIVATE, .*-private$):error("QT_FOR_PRIVATE may not contain *-private.")
        module_privdep = "QT.$${MODULE}.private_depends = $$QT_FOR_PRIVATE"
    } else {
        module_privdep =
    }
    static: \
        module_build_type = "QT.$${MODULE}.module_config = staticlib"
    else:mac:contains(QT_CONFIG, qt_framework): \
        module_build_type = "QT.$${MODULE}.module_config = lib_bundle"
    else: \
        module_build_type =
    !isEmpty(MODULE_CONFIG): \
        module_config = "QT.$${MODULE}.CONFIG = $$MODULE_CONFIG"
    else: \
        module_config =
    !no_module_headers {
        MODULE_INCLUDES = "\$\$QT_MODULE_INCLUDE_BASE \$\$QT_MODULE_INCLUDE_BASE/$$MODULE_INCNAME"
        MODULE_PRIVATE_INCLUDES = "\$\$QT_MODULE_INCLUDE_BASE/$$MODULE_INCNAME/$$VERSION \
                                   \$\$QT_MODULE_INCLUDE_BASE/$$MODULE_INCNAME/$$VERSION/$$MODULE_INCNAME"
    }
    MODULE_PRI_CONT = \
        "QT.$${MODULE}.VERSION = $${VERSION}" \
        "QT.$${MODULE}.MAJOR_VERSION = $$section(VERSION, ., 0, 0)" \
        "QT.$${MODULE}.MINOR_VERSION = $$section(VERSION, ., 1, 1)" \
        "QT.$${MODULE}.PATCH_VERSION = $$section(VERSION, ., 2, 2)" \
        "" \
        "QT.$${MODULE}.name = $$TARGET" \
        "QT.$${MODULE}.bins = \$\$QT_MODULE_BIN_BASE" \
        "QT.$${MODULE}.includes = $$MODULE_INCLUDES" \
        "QT.$${MODULE}.private_includes = $$MODULE_PRIVATE_INCLUDES" \
        "QT.$${MODULE}.libs = \$\$QT_MODULE_LIB_BASE" \
        "QT.$${MODULE}.libexecs = \$\$QT_MODULE_LIBEXEC_BASE" \
        $$module_rpath \
        "QT.$${MODULE}.plugins = \$\$QT_MODULE_PLUGIN_BASE" \
        "QT.$${MODULE}.imports = \$\$QT_MODULE_IMPORT_BASE" \
        "QT.$${MODULE}.qml = \$\$QT_MODULE_QML_BASE" \
        "QT.$${MODULE}.depends =$$join(MODULE_DEPENDS, " ", " ")" \
        $$module_privdep \
        $$module_build_type \
        $$module_config \
        "QT.$${MODULE}.DEFINES = $$MODULE_DEFINES" \ # assume sufficient quoting
        "" \
        "QT_CONFIG += $$MODULE" # this is obsolete, but some code still depends on it
    write_file($$MODULE_PRI, MODULE_PRI_CONT)|error("Aborting.")
    MODULE_PRI_FILES = $$MODULE_PRI

    prefix_build {

        # -rpath-link is used by the linker to find depedencies of dynamic
        # libraries which were NOT specified on the command line.
        # This means that .libs of each module's regular .depends (QT) don't
        # need to be put there, as they appear on the linker line anyway.
        # A module's QT_PRIVATE's .libs OTOH need to be put there.
        # .depends_private (QT_FOR_PRIVATE) is somewhat special: if the privates
        # are used, the libraries are explicitly linked. If not, their locations
        # need to be put into -rpath-link. As QT_FOR_PRIVATE cannot in turn
        # contain privates, they always end up in -rpath-link of dependant
        # modules.
        # For simplicity of use, each module's rpath list has all dependencies
        # transitively resolved already.
        pubqt = $$MODULE_DEPENDS $$QT_FOR_PRIVATE
        pubdep = $$resolve_depends(pubqt, "QT.")
        privqt = $$replace(QT_PRIVATE, -private$, )
        privdep = $$resolve_depends(privqt, "QT.")
        rpaths =
        alldep = $$pubdep $$privdep
        for(dep, alldep) {   # Inherit link-rpaths from all our dependencies
            rpaths += $$eval(QT.$${dep}.rpath_link) $$eval(QT.$${dep}.rpath_link_private)
        }
        privdep -= $$pubdep
        for(dep, privdep): \   # Add our private dependencies' lib paths as new link-rpaths
            rpaths += $$eval(QT.$${dep}.libs)
        !isEmpty(rpaths) {
            rpaths = $$unique(rpaths)
            module_rpathlink = "QT.$${MODULE}.rpath_link = $$val_escape(rpaths)"
        } else {
            module_rpathlink =
        }
        rpaths_priv =
        xtradep = $$resolve_depends(QT_FOR_PRIVATE, "QT.")
        for(dep, xtradep): \   # Add our private API's dependencies' lib paths as new link-rpaths
            rpaths_priv += $$eval(QT.$${dep}.libs)
        rpaths_priv = $$unique(rpaths_priv)
        rpaths_priv -= $$rpaths
        !isEmpty(rpaths_priv) {
            module_rpathlink_priv = "QT.$${MODULE}.rpath_link_private = $$val_escape(rpaths_priv)"
        } else {
            module_rpathlink_priv =
        }

        # Create a forwarding module .pri file
        MODULE_FWD_PRI_CONT = \
            "QT_MODULE_BIN_BASE = $$MODULE_BASE_OUTDIR/bin" \
            "QT_MODULE_INCLUDE_BASE = $$MODULE_BASE_OUTDIR/include" \
            "QT_MODULE_IMPORT_BASE = $$MODULE_BASE_OUTDIR/imports" \
            "QT_MODULE_QML_BASE = $$MODULE_BASE_OUTDIR/qml" \
            "QT_MODULE_LIB_BASE = $$MODULE_BASE_OUTDIR/lib" \
            "QT_MODULE_LIBEXEC_BASE = $$MODULE_BASE_OUTDIR/libexec" \
            "QT_MODULE_PLUGIN_BASE = $$MODULE_BASE_OUTDIR/plugins" \
            $$module_rpathlink \
            $$module_rpathlink_priv \
            "include($$MODULE_PRI)"
        write_file($$MODULE_FWD_PRI, MODULE_FWD_PRI_CONT)|error("Aborting.")
        touch($$MODULE_FWD_PRI, $$MODULE_PRI)
        MODULE_PRI_FILES += $$MODULE_FWD_PRI

    } else { # prefix_build

        # This is needed for the direct include() below.
        QT_MODULE_BIN_BASE = $$[QT_INSTALL_BINS]
        QT_MODULE_INCLUDE_BASE = $$[QT_INSTALL_HEADERS]
        QT_MODULE_IMPORT_BASE = $$[QT_INSTALL_IMPORTS]
        QT_MODULE_QML_BASE = $$[QT_INSTALL_QML]
        QT_MODULE_LIB_BASE = $$[QT_INSTALL_LIBS]
        QT_MODULE_LIBEXEC_BASE = $$[QT_INSTALL_LIBEXECS]
        QT_MODULE_PLUGIN_BASE = $$[QT_INSTALL_PLUGINS]

    }

    # Then, inject the new module into the current cache state
    !contains(QMAKE_INTERNAL_INCLUDED_FILES, $$MODULE_PRI): \ # before the actual include()!
        cache(QMAKE_INTERNAL_INCLUDED_FILES, add transient, MODULE_PRI_FILES)
    include($$MODULE_FWD_PRI)
    for(var, $$list(VERSION MAJOR_VERSION MINOR_VERSION PATCH_VERSION \
                    name depends private_depends module_config CONFIG DEFINES sources \
                    includes private_includes bins libs libexecs plugins imports qml \
                    rpath_link rpath_link_private \
            )):defined(QT.$${MODULE}.$$var, var):cache(QT.$${MODULE}.$$var, transient)
    cache(QT_CONFIG, transient)

} # !build_pass

# Schedule the regular .pri file for installation
CONFIG += qt_install_module