summaryrefslogtreecommitdiffstats
path: root/mkspecs/features/winrt/package_manifest.prf
blob: 46fe1e57e4d32f01e91afdcbc805c76f85469337 (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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
# This performs basic variable replacement on the contents of the WinRT manifest template, as
# specified by WINRT_MANIFEST. The resulting manifest file is written to the output directory.
# While the most common options are covered by the default template, the developer is expected
# to make an application-level copy of the template in order to customize the manifest further.
# Afterwards, they can override the default template by assigning their template to WINRT_MANIFEST.
#
# All subkeys in WINRT_MANIFEST will be replaced if defined/found, so new variables can be easily
# added. The following keys have default values and are present in the default templates:
# WINRT_MANIFEST: The name of the input manifest file. Defaults to a file defined by the mkspec.
# WINRT_MANIFEST.target: The name of the target (.exe). Defaults to TARGET.
# WINRT_MANIFEST.identity: The unique ID of the app. Defaults to reusing the existing generated manifest's UUID, or generates a new UUID if none is present.
# WINRT_MANIFEST.name: The name of the package as displayed to the user. Defaults to TARGET.
# WINRT_MANIFEST.architecture: The target architecture. Defaults to VCPROJ_ARCH.
# WINRT_MANIFEST.version: The version number of the package. Defaults to "1.0.0.0".
# WINRT_MANIFEST.arguments: Allows arguments to be passed to the executable.
# WINRT_MANIFEST.publisher: Display name of the publisher. Defaults to "Default publisher display name".
# WINRT_MANIFEST.publisher_id: On Windows 8/RT/Phone 8.1, the publisher's distinguished name (default: CN=MyCN). On Windows Phone 8.0, the publisher's UUID (default: invalid UUID string).
# WINRT_MANIFEST.phone_product_id): On Windows Phone 8.1, the GUID of the product. Defaults to the value of WINRT_MANIFEST.identity.
# WINRT_MANIFEST.phone_publisher_id: On Windows Phone 8.1, the GUID of the publiser. Defaults to an invalid GUID.
# WINRT_MANIFEST.description: Package description. Defaults to "Default package description".
# WINRT_MANIFEST.author: Package author (Windows Phone 8.0 only). Defaults to "Default package author".
# WINRT_MANIFEST.genre: Package genre (Windows Phone 8.0 only). Defaults to "apps.normal".
# WINRT_MANIFEST.background: Tile background color. Defaults to "green".
# WINRT_MANIFEST.foreground: Tile foreground (text) color (Windows 8/RT only). Defaults to "light".
# WINRT_MANIFEST.logo_store: Logo image file for Windows Store. Default provided by the mkspec.
# WINRT_MANIFEST.logo_small: Small logo image file. Default provided by the mkspec.
# WINRT_MANIFEST.logo_medium: Medium logo image file. Default provided by the mkspec.
# WINRT_MANIFEST.logo_large: Large logo image file. Default provided by the mkspec.
# WINRT_MANIFEST.splash_screen: Splash screen image file. Default provided by the mkspec.
# WINRT_MANIFEST.iconic_tile_icon: Image file for the "iconic" tile template icon. Default provided by the mkspec.
# WINRT_MANIFEST.iconic_tile_small: Image file for the small "iconic" tile template logo. Default provided by the mkspec.
# WINRT_MANIFEST.default_language: Specifies the default language of the application
# WINRT_MANIFEST.languages: Specifies the languages the application supports
# WINRT_MANIFEST.capabilities: Specifies capabilities to add to the capability list.
# WINRT_MANIFEST.capabilities_device: Specifies device capabilities to add to the capability list. (location, webcam...)
# WINRT_MANIFEST.dependencies: Specifies dependencies required by the package.

# The manifest is generated for each build pass for normal apps, and only once for vcapps.
# - Normal apps have their package root directory in the same place as the target (one for each build pass).
# - Visual Studio requires a design-mode manifest in the same location as the vcproj.
!isEmpty(WINRT_MANIFEST): \
    if(build_pass:equals(TEMPLATE, "app"))| \
    if(!build_pass:equals(TEMPLATE, "vcapp")) {

    manifest_file.input = $$WINRT_MANIFEST

    contains(TEMPLATE, "vc.*") {
        BUILD_DIR = $$OUT_PWD
    } else {
        load(resolve_target)
        BUILD_DIR = $$dirname(QMAKE_RESOLVED_TARGET)
    }

    winphone:equals(WINSDK_VER, 8.0): \
        manifest_file.output = $$BUILD_DIR/WMAppManifest.xml
    else: contains(TEMPLATE, "vc.*"): \
        manifest_file.output = $$BUILD_DIR/Package.appxmanifest
    else: \
        manifest_file.output = $$BUILD_DIR/AppxManifest.xml

    # Provide the C-runtime dependency
    equals(TEMPLATE, "app") {
        VCLIBS = Microsoft.VCLibs.$$replace(MSVC_VER, \\., ).00
        winphone: VCLIBS = $${VCLIBS}.Phone
        CONFIG(debug, debug|release): \
            WINRT_MANIFEST.dependencies += $${VCLIBS}.Debug
        else: \
            WINRT_MANIFEST.dependencies += $$VCLIBS
    }

    # Provide default values for required variables
    isEmpty(WINRT_MANIFEST.target): WINRT_MANIFEST.target = $$TARGET
    isEmpty(WINRT_MANIFEST.identity) {
        # Reuse the existing UUID if possible
        UUID_CACHE = $$OUT_PWD/.qmake.winrt_uuid_$$TARGET
        exists($$UUID_CACHE) {
            include($$UUID_CACHE)
        } else {
            WINRT_UUID = "WINRT_MANIFEST.identity = $$system(uuidgen)"
            write_file($$UUID_CACHE, WINRT_UUID)|error("Unable to write the UUID cache; aborting.")
            eval($$WINRT_UUID)
        }
        winphone:equals(WINSDK_VER, 8.0): WINRT_MANIFEST.identity = {$$WINRT_MANIFEST.identity}
    }
    isEmpty(WINRT_MANIFEST.name): WINRT_MANIFEST.name = $$TARGET
    isEmpty(WINRT_MANIFEST.architecture): WINRT_MANIFEST.architecture = $$VCPROJ_ARCH
    isEmpty(WINRT_MANIFEST.version): WINRT_MANIFEST.version = 1.0.0.0
    isEmpty(WINRT_MANIFEST.publisher): WINRT_MANIFEST.publisher = Default publisher display name
    isEmpty(WINRT_MANIFEST.publisherid) {
        winphone:equals(WINSDK_VER, 8.0): WINRT_MANIFEST.publisherid = {00000000-0000-0000-0000-000000000000}
        else: WINRT_MANIFEST.publisherid = CN=$$(USERNAME)
    }
    isEmpty(WINRT_MANIFEST.phone_product_id): WINRT_MANIFEST.phone_product_id = $$WINRT_MANIFEST.identity
    isEmpty(WINRT_MANIFEST.phone_publisher_id): WINRT_MANIFEST.phone_publisher_id = 00000000-0000-0000-0000-000000000000
    isEmpty(WINRT_MANIFEST.description): WINRT_MANIFEST.description = Default package description
    isEmpty(WINRT_MANIFEST.author): WINRT_MANIFEST.author = Default package author
    isEmpty(WINRT_MANIFEST.genre): WINRT_MANIFEST.genre = apps.normal
    isEmpty(WINRT_MANIFEST.background): WINRT_MANIFEST.background = green
    isEmpty(WINRT_MANIFEST.foreground): WINRT_MANIFEST.foreground = light
    isEmpty(WINRT_MANIFEST.default_language): WINRT_MANIFEST.default_language = en

    winphone:equals(WINSDK_VER, 8.0): INDENT = "$$escape_expand(\\r\\n)    "
    else: INDENT = "$$escape_expand(\\r\\n)  "

    # Languages are given as a string list
    WINRT_MANIFEST.languages = $$unique(WINRT_MANIFEST.languages)
    winphone:equals(WINSDK_VER, 8.0):!isEmpty(WINRT_MANIFEST.languages) {
        for(LANGUAGE, WINRT_MANIFEST.languages): \
            MANIFEST_LANGUAGES += "<Language code=\"$$LANGUAGE\" />"

        WINRT_MANIFEST.languages = \
            $$join(MANIFEST_LANGUAGES, $$INDENT, \
                   "$$escape_expand(\\r\\n)  <Languages xmlns=\"\">$$INDENT", \
                   "$$escape_expand(\\r\\n)  </Languages>")
    }

    # Capabilities are given as a string list and may change with the configuration (network, sensors, etc.)
    WINRT_MANIFEST.capabilities = $$unique(WINRT_MANIFEST.capabilities)
    WINRT_MANIFEST.capabilities_device = $$unique(WINRT_MANIFEST.capabilities_device)

    !isEmpty(WINRT_MANIFEST.capabilities)|!isEmpty(WINRT_MANIFEST.capabilities_device)|winphone {
        MANIFEST_CAPABILITIES += "<Capabilities>"
        for(CAPABILITY, WINRT_MANIFEST.capabilities): \
            MANIFEST_CAPABILITIES += "  <Capability Name=\"$$CAPABILITY\" />"
        !winphone:for(CAPABILITY, WINRT_MANIFEST.capabilities_device): \
            MANIFEST_CAPABILITIES += "  <DeviceCapability Name=\"$$CAPABILITY\" />"
        MANIFEST_CAPABILITIES += "</Capabilities>"

        WINRT_MANIFEST.capabilities = $$join(MANIFEST_CAPABILITIES, $$INDENT, $$INDENT)
    }

    # Dependencies are given as a string list. The CRT dependency is added automatically above.
    WINRT_MANIFEST.dependencies = $$unique(WINRT_MANIFEST.dependencies)
    !isEmpty(WINRT_MANIFEST.dependencies) {
        MANIFEST_DEPENDENCIES += "<Dependencies>"
        for(DEPENDENCY, WINRT_MANIFEST.dependencies): \
            MANIFEST_DEPENDENCIES += "  <PackageDependency Name=\"$$DEPENDENCY\" />"
        MANIFEST_DEPENDENCIES += "</Dependencies>"

        WINRT_MANIFEST.dependencies = $$join(MANIFEST_DEPENDENCIES, $$INDENT, $$INDENT)
    }

    # Provide default icons where needed
    isEmpty(WINRT_ASSETS_PATH): WINRT_ASSETS_PATH = $$[QT_HOST_DATA/get]/mkspecs/common/winrt_winphone/assets
    TEMPLATE_CONTENTS = $$cat($$WINRT_MANIFEST, lines)
    ICONS_FOUND = $$find(TEMPLATE_CONTENTS, \\\$\\\$\\{WINRT_MANIFEST\\.(logo|tile)_)
    ICONS_FOUND ~= s/.*\\\$\\\$\\{WINRT_MANIFEST\\.((logo|tile)_[^\}]+)\\}.*/\\1/g
    for (ICON_NAME, ICONS_FOUND) {
        ICON_FILE = $$eval(WINRT_MANIFEST.$$ICON_NAME)
        isEmpty(ICON_FILE): ICON_FILE = $$WINRT_ASSETS_PATH/$${ICON_NAME}.png
        icon_$${ICON_NAME}.input = $$ICON_FILE
        icon_$${ICON_NAME}.output = $$BUILD_DIR/assets/$$basename(ICON_FILE)
        icon_$${ICON_NAME}.CONFIG = verbatim
        QMAKE_SUBSTITUTES += icon_$${ICON_NAME}
        WINRT_MANIFEST.$${ICON_NAME} = assets/$$basename(ICON_FILE)
    }

    QMAKE_SUBSTITUTES += manifest_file
}