summaryrefslogtreecommitdiffstats
path: root/mkspecs/features/resources.prf
blob: fa8ff1fb581fe2f24f2385d90c91f215a4db66ed (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
qtPrepareTool(QMAKE_RCC, rcc, _DEP)

isEmpty(RCC_DIR):RCC_DIR = .
isEmpty(QMAKE_MOD_RCC):QMAKE_MOD_RCC = qrc

!contains(QMAKE_RESOURCE_FLAGS, -root):!isEmpty(QMAKE_RESOURCE_ROOT):QMAKE_RESOURCE_FLAGS += -root $$QMAKE_RESOURCE_ROOT
!contains(QMAKE_RESOURCE_FLAGS, -name): QMAKE_RESOURCE_FLAGS += -name ${QMAKE_FILE_BASE}

# http://www.w3.org/TR/xml/#syntax
defineReplace(xml_escape) {
    1 ~= s,&,&,
    1 ~= s,\',',
    1 ~= s,\",",
    1 ~= s,<,&lt;,
    1 ~= s,>,&gt;,
    return($$1)
}

RESOURCES += qmake_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, qmake_immediate) {
            !exists($$absolute_path($$resource, $$_PRO_FILE_PWD_)): \
                warning("Failure to find: $$resource")
            qmake_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
}

!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 = $$section($$list($$basename(resource)), ., 0, 0)
            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()
    }
}

rcc.input = RESOURCES
rcc.name = RCC ${QMAKE_FILE_IN}
rcc.depend_command = $$QMAKE_RCC_DEP -list $$QMAKE_RESOURCE_FLAGS ${QMAKE_FILE_IN}
rcc.CONFIG += add_inputs_as_makefile_deps dep_lines

!resources_big|ltcg|macx-xcode|wasm|contains(TEMPLATE, "vc.*") {

rcc.output = $$RCC_DIR/$${first(QMAKE_MOD_RCC)}_${QMAKE_FILE_BASE}$${first(QMAKE_EXT_CPP)}
rcc.commands = $$QMAKE_RCC $$QMAKE_RESOURCE_FLAGS ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
rcc.variable_out = SOURCES

} else {

isEmpty(RCC_CXX):RCC_CXX = $$QMAKE_CXX $(CXXFLAGS)
RCC_OUT_BASE = $$RCC_DIR/$${first(QMAKE_MOD_RCC)}_${QMAKE_FILE_BASE}
RCC_CPP = $$RCC_OUT_BASE$${first(QMAKE_EXT_CPP)}
RCC_TMP = $${RCC_OUT_BASE}.tmp$${first(QMAKE_EXT_OBJ)}
RCC_OBJ = $$RCC_OUT_BASE$${first(QMAKE_EXT_OBJ)}

msvc: RCC_CXX_O_FLAG = "-Fo"
else: RCC_CXX_O_FLAG = "-o "

rcc.output = $$RCC_OBJ
rcc.commands = \
    $$QMAKE_RCC $$QMAKE_RESOURCE_FLAGS ${QMAKE_FILE_IN} -pass 1 -o $$RCC_CPP && \
    $$RCC_CXX -c $$RCC_CPP $$RCC_CXX_O_FLAG$$RCC_TMP && \
    $$QMAKE_RCC $$QMAKE_RESOURCE_FLAGS ${QMAKE_FILE_IN} -pass 2 -temp $$RCC_TMP -o ${QMAKE_FILE_OUT}
rcc.clean += $$RCC_CPP $$RCC_TMP

}

rcc.depends += $$QMAKE_RCC_EXE
silent:rcc.commands = @echo rcc ${QMAKE_FILE_IN} && $$rcc.commands
else:rcc.commands ~= s/&&/$$escape_expand(\\n\\t)/g
QMAKE_EXTRA_COMPILERS += rcc