summaryrefslogtreecommitdiffstats
path: root/mkspecs/features/winrt/package_manifest.prf
blob: 143b884dbf9d6de6bd1f49eafe2e4e227911b902 (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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
# 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 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)
    }

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

    !contains(WINRT_MANIFEST.CONFIG, "verbatim") {
        # Provide the C-runtime dependency
        equals(TEMPLATE, "app") {
            VCLIBS = Microsoft.VCLibs.$$replace(MSVC_VER, \\., ).00
            CONFIG(debug, debug|release): \
                VCLIBS = $${VCLIBS}.Debug
            else: \
                VCLIBS = $${VCLIBS}
            # VS 2017 still uses vclibs 140
            contains(MSVC_VER, "15.0"): VCLIBS = $$replace(VCLIBS, 150, 140)
            VCLIBS = "$${VCLIBS}\" MinVersion=\"14.0.0.0\" Publisher=\"CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US"
            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 = $$system(uuidgen)
                isEmpty(WINRT_UUID): error("Unable to generate a UUID. Make sure uuidgen is in your PATH.")
                WINRT_UUID = "WINRT_MANIFEST.identity = $$WINRT_UUID"
                write_file($$UUID_CACHE, WINRT_UUID)|error("Unable to write the UUID cache; aborting.")
                eval($$WINRT_UUID)
            }
        }
        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): 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.background): WINRT_MANIFEST.background = green
        isEmpty(WINRT_MANIFEST.foreground): WINRT_MANIFEST.foreground = light
        isEmpty(WINRT_MANIFEST.default_language): WINRT_MANIFEST.default_language = en
        *-msvc2015|*-msvc2017 {
            isEmpty(WINRT_MANIFEST.minVersion): WINRT_MANIFEST.minVersion = $$(UCRTVersion)
            isEmpty(WINRT_MANIFEST.minVersion): error("No UCRTVersion found in environment."))
            isEmpty(WINRT_MANIFEST.maxVersionTested): WINRT_MANIFEST.maxVersionTested = $$WINRT_MANIFEST.minVersion
        }

        INDENT = "$$escape_expand(\\r\\n)        "

        VS_XML_NAMESPACE = "m2"
        WINRT_MANIFEST.rotation_preference = $$unique(WINRT_MANIFEST.rotation_preference)
        !isEmpty(WINRT_MANIFEST.rotation_preference) {
            MANIFEST_ROTATION += "<$${VS_XML_NAMESPACE}:InitialRotationPreference>"
            for(ROTATION, WINRT_MANIFEST.rotation_preference): \
                MANIFEST_ROTATION += "  <$${VS_XML_NAMESPACE}:Rotation Preference=\"$$ROTATION\" />"
            MANIFEST_ROTATION += "</$${VS_XML_NAMESPACE}:InitialRotationPreference>"

            WINRT_MANIFEST.rotation_preference = $$join(MANIFEST_ROTATION, $$INDENT, $$INDENT)
        }

        INDENT = "$$escape_expand(\\r\\n)  "

        # All Windows 10 applications need to have internetClient.
        WINRT_MANIFEST.capabilities += internetClient

        contains(WINRT_MANIFEST.capabilities, defaults) {
            WINRT_MANIFEST.capabilities -= defaults
            WINRT_MANIFEST.capabilities += $$WINRT_MANIFEST.capabilities_default
        }

        contains(WINRT_MANIFEST.capabilities_device, defaults) {
            WINRT_MANIFEST.capabilities_device -= defaults
            WINRT_MANIFEST.capabilities_device += $$WINRT_MANIFEST.capabilities_device_default
        }

        UAP_CAPABILITIES += \
            appointments \
            blockedChatMessages \
            chat \
            contacts \
            enterpriseAuthentication \
            # internetClient is special, as it needs to be written without namespace
            #internetClient \
            musicLibrary \
            objects3D \
            phoneCall \
            picturesLibrary \
            removableStorage \
            sharedUserCertificates \
            userAccountInformation \
            videosLibrary \
            voipCall

        UAP3_CAPABILITIES += backgroundMediaPlayback remoteSystem userNotificationListener

        # 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) {
            MANIFEST_CAPABILITIES += "<Capabilities>"
            for (CAPABILITY, WINRT_MANIFEST.capabilities) {
                contains(UAP_CAPABILITIES, $$CAPABILITY): \
                    MANIFEST_CAPABILITIES += "  <uap:Capability Name=\"$$CAPABILITY\" />"
                else:contains(UAP3_CAPABILITIES, $$CAPABILITY): \
                    MANIFEST_CAPABILITIES += "  <uap3:Capability Name=\"$$CAPABILITY\" />"
                else: \
                    MANIFEST_CAPABILITIES += "  <Capability Name=\"$$CAPABILITY\" />"
            }
            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.
        # For MSVC2015/2017 the dependencies are added in conjunction with TargetDeviceFamily
        # Due to the hard coded dependency on "Windows.Universal" the <Dependencies> tag
        # is already inside the MSVC2015 manifest.
        WINRT_MANIFEST.dependencies = $$unique(WINRT_MANIFEST.dependencies)
        !isEmpty(WINRT_MANIFEST.dependencies) {
            for(DEPENDENCY, WINRT_MANIFEST.dependencies): \
                MANIFEST_DEPENDENCIES += "  <PackageDependency Name=\"$$DEPENDENCY\" />"

            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) {
                equals(ICON_NAME, "logo_310x150"): ICON_FILE = $$eval(WINRT_MANIFEST.logo_wide)
                else: equals(ICON_NAME, "logo_150x150"): ICON_FILE = $$eval(WINRT_MANIFEST.logo_large)
                # Windows Phone specifics
                else: equals(ICON_NAME, "logo_480x800"): ICON_FILE = $$eval(WINRT_MANIFEST.logo_splash)
                else: equals(ICON_NAME, "logo_71x71"): ICON_FILE = $$eval(WINRT_MANIFEST.logo_medium)
                else: equals(ICON_NAME, "logo_44x44"): ICON_FILE = $$eval(WINRT_MANIFEST.logo_small)
                # Windows RT specifics
                else: equals(ICON_NAME, "logo_620x300"): ICON_FILE = $$eval(WINRT_MANIFEST.logo_splash)
                else: equals(ICON_NAME, "logo_70x70"): ICON_FILE = $$eval(WINRT_MANIFEST.logo_medium)
                else: equals(ICON_NAME, "logo_30x30"): ICON_FILE = $$eval(WINRT_MANIFEST.logo_small)
            }
            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)
        }

        !contains(TEMPLATE, "vc.*") {
            winrt_manifest_install.files = $$manifest_file.output
            winrt_manifest_install.path = $$target.path
            winrt_assets_install.files = $$BUILD_DIR/assets/*
            winrt_assets_install.path = $$target.path/assets
            INSTALLS += winrt_manifest_install winrt_assets_install
        }
    } else {
        manifest_file.CONFIG += verbatim
    }

    QMAKE_SUBSTITUTES += manifest_file
}