summaryrefslogtreecommitdiffstats
path: root/mkspecs/features/resources_functions.prf
blob: f0ca2ed793e74ee9af4b696e06fd68f8ddfeff16 (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
# http://www.w3.org/TR/xml/#syntax
defineReplace(xml_escape) {
    1 ~= s,&,&,
    1 ~= s,\',',
    1 ~= s,\",",
    1 ~= s,<,&lt;,
    1 ~= s,>,&gt;,
    return($$1)
}

defineTest(qtFlattenResources) {
    isEmpty(RCC_DIR):RCC_DIR = .
    immediate = qmake_immediate$$QMAKE_RESOURCES_IMMEDIATE_NR
    defined(QMAKE_RESOURCES_IMMEDIATE_NR, var): \
        QMAKE_RESOURCES_IMMEDIATE_NR = $$num_add($$QMAKE_RESOURCES_IMMEDIATE_NR, 1)
    else: \
        QMAKE_RESOURCES_IMMEDIATE_NR = 1

    RESOURCES += $$immediate
    for(resource, RESOURCES) {
        # Regular case of user qrc file
        contains(resource, ".*\\.qrc$"): \
            next()

        # Fallback for stand-alone files/directories
        !defined($${resource}.files, var) {
            !equals(resource, $$immediate) {
                !exists($$absolute_path($$resource, $$_PRO_FILE_PWD_)): \
                    warning("Failure to find: $$resource")
                $${immediate}.files += $$resource
                OTHER_FILES *= $$resource
            }
            RESOURCES -= $$resource
            next()
        }

        resource_file = $$absolute_path($$RCC_DIR/qmake_$${resource}.qrc, $$OUT_PWD)

        isEmpty(BUILDS)|build_pass {
            # Collection of files, generate qrc file
            prefix = $$eval($${resource}.prefix)
            isEmpty(prefix): \
                prefix = "/"

            resource_file_content = \
                "<!DOCTYPE RCC><RCC version=\"1.0\">" \
                "<qresource prefix=\"$$xml_escape($$prefix)\">"

            abs_base = $$absolute_path($$eval($${resource}.base), $$_PRO_FILE_PWD_)

            for(file, $${resource}.files) {
                abs_path = $$absolute_path($$file, $$_PRO_FILE_PWD_)
                files = $$files($$abs_path/*, true)
                isEmpty(files): \
                    files = $$abs_path
                for (file, files) {
                    exists($$file/*): next()  # exclude directories
                    alias = $$relative_path($$file, $$abs_base)
                    resource_file_content += \
                        "<file alias=\"$$xml_escape($$alias)\">$$xml_escape($$file)</file>"
                    OTHER_FILES *= $$file
                }
            }

            resource_file_content += \
                "</qresource>" \
                "</RCC>"

            !write_file($$resource_file, resource_file_content): \
                error()
        }

        RESOURCES -= $$resource
        RESOURCES += $$resource_file
    }
    export(RCC_DIR)
    export(QMAKE_RESOURCES_IMMEDIATE_NR)
    export(RESOURCES)
    export(OTHER_FILES)
    export($${immediate}.files)
    return(true)
}

defineTest(qtEnsurePluginResourcesCpp) {
    contains(DEFINES, QT_PLUGIN_RESOURCE_INIT_FUNCTION=.*): \
        return(true)

    !isEmpty(RESOURCES):contains(TEMPLATE, .*lib):plugin:static {
        pluginBaseName = $$basename(TARGET)
        pluginName = $$lower($$replace(pluginBaseName, [-], _))
        resource_init_function = $${pluginName}_plugin_resource_init
        DEFINES += "QT_PLUGIN_RESOURCE_INIT_FUNCTION=$$resource_init_function"
        RESOURCE_INIT_CPP = $$OUT_PWD/$${pluginName}_plugin_resources.cpp

        GENERATED_SOURCES += $$RESOURCE_INIT_CPP
        QMAKE_DISTCLEAN += $$RESOURCE_INIT_CPP

        isEmpty(BUILDS)|build_pass {
            RESOURCE_INIT_CONT = \
                "// This file is autogenerated by qmake. It contains a function that" \
                "// references all resources the plugin includes and the function is" \
                "// referenced by Qt_(MOC_)EXPORT_PLUGIN to ensure the inclusion in" \
                "// the statically linked plugin." \
                "$${LITERAL_HASH}include <QtCore/qglobal.h>" \
                "void $${resource_init_function}() " \
                "{" \

            for (resource, RESOURCES) {
                resource_name = $$replace($$list($$basename(resource)),\.qrc$, )
                resource_name = $$replace(resource_name, [^a-zA-Z0-9_], _)
                RESOURCE_INIT_CONT += "    Q_INIT_RESOURCE($$resource_name);"
            }

            RESOURCE_INIT_CONT += \
                "}"

            write_file($$RESOURCE_INIT_CPP, RESOURCE_INIT_CONT)|error()
        }

        export(DEFINES)
        export(GENERATED_SOURCES)
        export(QMAKE_DISTCLEAN)
    }
    return(true)
}