summaryrefslogtreecommitdiffstats
path: root/mkspecs/features/qt_module_pris.prf
blob: 7a3e7397b9c4b7e1235d760cdf3d231c426786c1 (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
#
#  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_PRI = $$MODULE_QMAKE_OUTDIR/mkspecs/modules-inst/qt_lib_$${MODULE}.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_FWD_PRI = $$MODULE_QMAKE_OUTDIR/mkspecs/modules/qt_lib_$${MODULE}.pri

    # -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)

    # Then, inject the new module into the current cache state
    !contains(QMAKE_INTERNAL_INCLUDED_FILES, $$MODULE_PRI) { # before the actual include()!
        added = $$MODULE_PRI $$MODULE_FWD_PRI
        cache(QMAKE_INTERNAL_INCLUDED_FILES, add transient, added)
        unset(added)
    }
    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