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,&,&amp;,
    1 ~= s,\',&apos;,
    1 ~= s,\",&quot;,
    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
