
#  W A R N I N G
#  -------------
#
# This file is not part of the Qt API.  It exists purely as an
# implementation detail.  It may change from version to version
# without notice, or even be removed.
#
# We mean it.
#

# Generates an xml file to match the library in lib/ listing the dependencies
# of the module on JNI-based libraries etc. Used for deployment of an Android
# app.

ANDROID_DEPENDS_DIR = $$MODULE_BASE_OUTDIR/lib/
DEPENDENCY_FILE = $$ANDROID_DEPENDS_DIR$$TARGET-android-dependencies.xml

build_pass:!isEmpty(QT_ARCH): {
    !isEmpty(MODULE_PLUGIN_TYPES) {
        for(PLUGIN_TYPE, MODULE_PLUGIN_TYPES) {
            ANDROID_BUNDLED_FILES += "plugins/$$PLUGIN_TYPE"
        }
    }

    !isEmpty(ANDROID_JAR_DEPENDENCIES) {
        for(JAR_FILE, ANDROID_JAR_DEPENDENCIES) {
            INIT_CLASS = $$section(JAR_FILE, ":", 1, 1)
            !isEmpty(INIT_CLASS): INIT_CLASS = "initClass=\"$$INIT_CLASS\""
            JAR_FILE = $$section(JAR_FILE, ":", 0, 0)
            FILE_CONTENT += "<jar file=\"$$JAR_FILE\" $$INIT_CLASS />"
        }
    }

    !isEmpty(ANDROID_BUNDLED_JAR_DEPENDENCIES) {
        for(JAR_FILE, ANDROID_BUNDLED_JAR_DEPENDENCIES) {
            INIT_CLASS = $$section(JAR_FILE, ":", 1, 1)
            !isEmpty(INIT_CLASS): INIT_CLASS = "initClass=\"$$INIT_CLASS\""
            JAR_FILE = $$section(JAR_FILE, ":", 0, 0)
            FILE_CONTENT += "<jar bundling=\"1\" file=\"$$JAR_FILE\" $$INIT_CLASS />"
        }
    }

    !isEmpty(ANDROID_LIB_DEPENDENCIES) {
        for(LIB_FILE, ANDROID_LIB_DEPENDENCIES) {
            EXTENDS = $$section(LIB_FILE, ":", 1, 1)
            !isEmpty(EXTENDS): EXTENDS = "extends=\"$$EXTENDS\""
            LIB_FILE = $$section(LIB_FILE, ":", 0, 0)
            LIB_FILE = $$replace(LIB_FILE,".so", "_$${QT_ARCH}.so")
            !isEmpty(EXTENDS): EXTENDS = $$replace(EXTENDS,".so", "_$${QT_ARCH}.so")
            FILE_CONTENT += "<lib file=\"$$LIB_FILE\" $$EXTENDS />"
        }
    }

    !isEmpty(ANDROID_LIB_DEPENDENCY_REPLACEMENTS) {
        for(REPLACEMENT, ANDROID_LIB_DEPENDENCY_REPLACEMENTS) {
            REPLACEMENT_FILE = $$section(REPLACEMENT, ":", 0, 0)
            LIB_FILE = $$section(REPLACEMENT, ":", 1, 1)
            REPLACEMENT_FILE = $$replace(REPLACEMENT_FILE,".so", "_$${QT_ARCH}.so")
            FILE_CONTENT += "<lib file=\"$$LIB_FILE\" replaces=\"$$REPLACEMENT_FILE\" />"
        }
    }

    !isEmpty(ANDROID_BUNDLED_FILES) {
        for (BUNDLED_FILE, ANDROID_BUNDLED_FILES) {
            BUNDLED_FILE = $$replace(BUNDLED_FILE,".so", "_$${QT_ARCH}.so")
            FILE_CONTENT += "<bundled file=\"$$BUNDLED_FILE\" />"
        }
    }

    !isEmpty(ANDROID_PERMISSIONS) {
        for (ANDROID_PERMISSION, ANDROID_PERMISSIONS) {
            FILE_CONTENT += "<permission name=\"$$ANDROID_PERMISSION\" />"
        }
    }

    !isEmpty(ANDROID_FEATURES) {
        for (ANDROID_FEATURE, ANDROID_FEATURES) {
            FILE_CONTENT += "<feature name=\"$$ANDROID_FEATURE\" />"
        }
    }


    !isEmpty(FILE_CONTENT) {
        FILE_CONTENT = "<rules><dependencies><lib name=\"$$TARGET\"><depends>" $$FILE_CONTENT "</depends></lib></dependencies></rules>"
        write_file($$DEPENDENCY_FILE, FILE_CONTENT)|error()
    }
}

!isEmpty(ANDROID_JAR_DEPENDENCIES)|!isEmpty(ANDROID_LIB_DEPENDENCIES)|!isEmpty(ANDROID_LIB_DEPENDENCY_REPLACEMENTS)|!isEmpty(ANDROID_BUNDLED_JAR_DEPENDENCIES)|!isEmpty(ANDROID_BUNDLED_FILES) {
    install_dependencies_file.files = $$DEPENDENCY_FILE
    install_dependencies_file.path = $$[QT_INSTALL_LIBS]
    INSTALLS += install_dependencies_file
}
