summaryrefslogtreecommitdiffstats
path: root/mkspecs/features/resources_functions.prf
blob: 7a260b471aaa45a59dc2b25d1ebb71b2ee87204a (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
# 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()
        }

        RESOURCES -= $$resource
        !android|isEmpty(BUILDS)|build_pass {
            resource_file = $$absolute_path($$RCC_DIR/qmake_$${resource}.qrc, $$OUT_PWD)
            RESOURCES += $$resource_file
        } else {
            # Android will need a resource file for each architecture make sure it is placed
            # correctly for other functions that need the right paths for these files
            for (arch, ANDROID_ABIS) {
                resource_file = $$absolute_path($$RCC_DIR/$$arch/qmake_$${resource}.qrc, $$OUT_PWD)
                RESOURCES += $$resource_file
            }
        }

        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)

                    # If a resource is added by the build system from outside of $$_PRO_FILE_PWD_
                    # everything except the filename needs to be discarded.
                    subdir = $$find(alias, ^../)
                    if (!isEmpty(subdir)): alias = $$basename(file)

                    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()
        }
    }
    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)
}