826b09f0c5
This patch reverts388c4ef9f7
. The reason is that it generates a symbol (resource_init_function) based on the name of the pro-file. But if different plugins are built from a pro-file with the same name, you end up linking in many symbols with the same name as well. Which one that ends up being used at runtime will typically depend on the linking order of the plugins. This problem will happen if you build an app for iOS that uses both controls 1 and controls 2. In that case, both QML plugins are built from a "controls.pro" file. At runtime, only one of the plugins will be imported correctly. This patch therefore reverts388c4ef9f7
, but at the same time, to not re-introduce the problem it fixed, we instead genereate both a debug and release version of the plugin_resources.cpp file. That way we can still depend on the TARGET variable for generating both the resource_init_function symbol and the cpp file. Fixes: QTBUG-62647 Fixes: QTBUG-71386 Fixes: QTBUG-72108 Change-Id: I3d8c53132458b30ed9f47a259f1f8e4fa4d44130 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
141 lines
4.7 KiB
Plaintext
141 lines
4.7 KiB
Plaintext
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,<,<,
|
|
1 ~= s,>,>,
|
|
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
|
|
}
|
|
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>"
|
|
}
|
|
}
|
|
|
|
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 {
|
|
resource_init_function = $$lower($$basename(TARGET))_plugin_resource_init
|
|
DEFINES += "QT_PLUGIN_RESOURCE_INIT_FUNCTION=$$resource_init_function"
|
|
RESOURCE_INIT_CPP = $$OUT_PWD/$$lower($$basename(TARGET))_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|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
|