diff options
Diffstat (limited to 'mkspecs/features/resources_functions.prf')
-rw-r--r-- | mkspecs/features/resources_functions.prf | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/mkspecs/features/resources_functions.prf b/mkspecs/features/resources_functions.prf new file mode 100644 index 0000000000..b525f482ca --- /dev/null +++ b/mkspecs/features/resources_functions.prf @@ -0,0 +1,139 @@ +# http://www.w3.org/TR/xml/#syntax +defineReplace(xml_escape) { + 1 ~= s,&,&, + 1 ~= s,\',', + 1 ~= s,\",", + 1 ~= s,<,<, + 1 ~= s,>,>, + 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 + isEmpty(BUILDS)|build_pass { + resource_file = $$absolute_path($$RCC_DIR/qmake_$${resource}.qrc, $$OUT_PWD) + RESOURCES += $$resource_file + } else: android { + # 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) +} |