From f125822ee622dd9bf3cff867a6e023702aa4448d Mon Sep 17 00:00:00 2001 From: Andrew Knight Date: Fri, 24 Jan 2014 07:47:51 +0100 Subject: WinRT: Provide qmake feature for generating a package manifest This feature (package_manifest) generates a basic application manifest from a template provided by the mkspec or the developer. It is meant to deliver an out-of-the-box build experience without attempting to exhaustively cover all manifest options. It is meant to be a starting point which allows the developer to customize the manifest further. It also becomes the default package manifest generator for Windows Phone, replacing autogen_wmappmanifest. Common variables, such as the target executable, are populated by qmake in the newly created manifest. Default icons are also created if needed, as the build will fail without them. The input manifest can be set by assigning a file name to WINRT_MANIFEST. Additional options are documented in the .prf file. If an existing (non-generated) manifest is already in the directory, it will not be overwritten. Task-number: QTBUG-35328 Change-Id: I57576a17ff9d2b564c0828f815949cb26d276bfd Reviewed-by: Oliver Wolff --- .../common/winrt_winphone/assets/logo_large.png | Bin 0 -> 2638 bytes .../common/winrt_winphone/assets/logo_medium.png | Bin 0 -> 1907 bytes .../common/winrt_winphone/assets/logo_small.png | Bin 0 -> 737 bytes .../common/winrt_winphone/assets/logo_splash.png | Bin 0 -> 5752 bytes .../common/winrt_winphone/assets/logo_store.png | Bin 0 -> 1159 bytes .../winrt_winphone/assets/tile_iconic_medium.png | Bin 0 -> 3166 bytes .../winrt_winphone/assets/tile_iconic_small.png | Bin 0 -> 1958 bytes .../manifests/8.0/AppxManifest.xml.in | 39 +++++++ .../manifests/8.0/WMAppManifest.xml.in | 39 +++++++ .../manifests/8.1/AppxManifest.xml.in | 44 ++++++++ mkspecs/common/winrt_winphone/qmake.conf | 3 +- mkspecs/features/winrt/package_manifest.prf | 121 +++++++++++++++++++++ mkspecs/winphone-arm-msvc2012/qmake.conf | 1 + mkspecs/winphone-x86-msvc2012/qmake.conf | 1 + mkspecs/winrt-arm-msvc2012/qmake.conf | 1 + mkspecs/winrt-arm-msvc2013/qmake.conf | 1 + mkspecs/winrt-x64-msvc2012/qmake.conf | 1 + mkspecs/winrt-x64-msvc2013/qmake.conf | 1 + mkspecs/winrt-x86-msvc2012/qmake.conf | 1 + mkspecs/winrt-x86-msvc2013/qmake.conf | 1 + 20 files changed, 253 insertions(+), 1 deletion(-) create mode 100644 mkspecs/common/winrt_winphone/assets/logo_large.png create mode 100644 mkspecs/common/winrt_winphone/assets/logo_medium.png create mode 100644 mkspecs/common/winrt_winphone/assets/logo_small.png create mode 100644 mkspecs/common/winrt_winphone/assets/logo_splash.png create mode 100644 mkspecs/common/winrt_winphone/assets/logo_store.png create mode 100644 mkspecs/common/winrt_winphone/assets/tile_iconic_medium.png create mode 100644 mkspecs/common/winrt_winphone/assets/tile_iconic_small.png create mode 100644 mkspecs/common/winrt_winphone/manifests/8.0/AppxManifest.xml.in create mode 100644 mkspecs/common/winrt_winphone/manifests/8.0/WMAppManifest.xml.in create mode 100644 mkspecs/common/winrt_winphone/manifests/8.1/AppxManifest.xml.in create mode 100644 mkspecs/features/winrt/package_manifest.prf (limited to 'mkspecs') diff --git a/mkspecs/common/winrt_winphone/assets/logo_large.png b/mkspecs/common/winrt_winphone/assets/logo_large.png new file mode 100644 index 0000000000..069171ca4d Binary files /dev/null and b/mkspecs/common/winrt_winphone/assets/logo_large.png differ diff --git a/mkspecs/common/winrt_winphone/assets/logo_medium.png b/mkspecs/common/winrt_winphone/assets/logo_medium.png new file mode 100644 index 0000000000..fa0d9fb64a Binary files /dev/null and b/mkspecs/common/winrt_winphone/assets/logo_medium.png differ diff --git a/mkspecs/common/winrt_winphone/assets/logo_small.png b/mkspecs/common/winrt_winphone/assets/logo_small.png new file mode 100644 index 0000000000..2acac59e73 Binary files /dev/null and b/mkspecs/common/winrt_winphone/assets/logo_small.png differ diff --git a/mkspecs/common/winrt_winphone/assets/logo_splash.png b/mkspecs/common/winrt_winphone/assets/logo_splash.png new file mode 100644 index 0000000000..a2be79f5d7 Binary files /dev/null and b/mkspecs/common/winrt_winphone/assets/logo_splash.png differ diff --git a/mkspecs/common/winrt_winphone/assets/logo_store.png b/mkspecs/common/winrt_winphone/assets/logo_store.png new file mode 100644 index 0000000000..417ccdcb5f Binary files /dev/null and b/mkspecs/common/winrt_winphone/assets/logo_store.png differ diff --git a/mkspecs/common/winrt_winphone/assets/tile_iconic_medium.png b/mkspecs/common/winrt_winphone/assets/tile_iconic_medium.png new file mode 100644 index 0000000000..e42f8255db Binary files /dev/null and b/mkspecs/common/winrt_winphone/assets/tile_iconic_medium.png differ diff --git a/mkspecs/common/winrt_winphone/assets/tile_iconic_small.png b/mkspecs/common/winrt_winphone/assets/tile_iconic_small.png new file mode 100644 index 0000000000..c7b7ee7893 Binary files /dev/null and b/mkspecs/common/winrt_winphone/assets/tile_iconic_small.png differ diff --git a/mkspecs/common/winrt_winphone/manifests/8.0/AppxManifest.xml.in b/mkspecs/common/winrt_winphone/manifests/8.0/AppxManifest.xml.in new file mode 100644 index 0000000000..6a0ca444c3 --- /dev/null +++ b/mkspecs/common/winrt_winphone/manifests/8.0/AppxManifest.xml.in @@ -0,0 +1,39 @@ + + + + + $${WINRT_MANIFEST.name} + $${WINRT_MANIFEST.publisher} + $${WINRT_MANIFEST.logo_store} + + + 6.2.0 + 6.3.0 + + + + + + + + + + + + $${WINRT_MANIFEST.capabilities} + $${WINRT_MANIFEST.dependencies} + + diff --git a/mkspecs/common/winrt_winphone/manifests/8.0/WMAppManifest.xml.in b/mkspecs/common/winrt_winphone/manifests/8.0/WMAppManifest.xml.in new file mode 100644 index 0000000000..e1d3d071e9 --- /dev/null +++ b/mkspecs/common/winrt_winphone/manifests/8.0/WMAppManifest.xml.in @@ -0,0 +1,39 @@ + + + + + $${WINRT_MANIFEST.logo_medium} + $${WINRT_MANIFEST.capabilities} + + + + + + + $${WINRT_MANIFEST.tile_iconic_small} + $${WINRT_MANIFEST.tile_iconic_medium} + $${WINRT_MANIFEST.name} + $${WINRT_MANIFEST.background} + + + + + + + + + + + diff --git a/mkspecs/common/winrt_winphone/manifests/8.1/AppxManifest.xml.in b/mkspecs/common/winrt_winphone/manifests/8.1/AppxManifest.xml.in new file mode 100644 index 0000000000..8c214871e3 --- /dev/null +++ b/mkspecs/common/winrt_winphone/manifests/8.1/AppxManifest.xml.in @@ -0,0 +1,44 @@ + + + + + $${WINRT_MANIFEST.name} + $${WINRT_MANIFEST.publisher} + $${WINRT_MANIFEST.logo_store} + + + 6.3.0 + 6.3.0 + + + + + + + + + + + + + + + + + $${WINRT_MANIFEST.capabilities} + $${WINRT_MANIFEST.dependencies} + + diff --git a/mkspecs/common/winrt_winphone/qmake.conf b/mkspecs/common/winrt_winphone/qmake.conf index c990122ac6..d7296afe95 100644 --- a/mkspecs/common/winrt_winphone/qmake.conf +++ b/mkspecs/common/winrt_winphone/qmake.conf @@ -7,7 +7,7 @@ MAKEFILE_GENERATOR = MSBUILD QMAKE_COMPILER = msvc QMAKE_PLATFORM = winrt win32 -CONFIG += incremental flat precompile_header autogen_precompile_source debug_and_release debug_and_release_target no_generated_target_info autogen_wmappmanifest rtti +CONFIG += incremental flat precompile_header autogen_precompile_source debug_and_release debug_and_release_target no_generated_target_info package_manifest rtti DEFINES += UNICODE WIN32 QT_LARGEFILE_SUPPORT Q_BYTE_ORDER=Q_LITTLE_ENDIAN \ QT_NO_PRINTER QT_NO_PRINTDIALOG # TODO: Remove when printing is re-enabled @@ -90,4 +90,5 @@ include(../shell-win32.conf) VCPROJ_EXTENSION = .vcxproj VCSOLUTION_EXTENSION = .sln VCPROJ_KEYWORD = Qt4VSv1.0 +WINRT_ASSETS_PATH = $$PWD/assets load(qt_config) diff --git a/mkspecs/features/winrt/package_manifest.prf b/mkspecs/features/winrt/package_manifest.prf new file mode 100644 index 0000000000..969a6780ce --- /dev/null +++ b/mkspecs/features/winrt/package_manifest.prf @@ -0,0 +1,121 @@ +# 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, the publisher's distinguished name (default: CN=MyCN). On Windows Phone, the publisher's UUID (default: invalid UUID string). +# WINRT_MANIFEST.description: Package description. Defaults to "Default package description". +# WINRT_MANIFEST.author: Package author (Windows Phone only). Defaults to "Default package author". +# WINRT_MANIFEST.genre: Package genre (Windows Phone 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.capabilities: Specifies capabilities to add to the capability list. +# 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 + + load(resolve_target) + BUILD_DIR = $$dirname(QMAKE_RESOLVED_TARGET) + winphone: \ + 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 + 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: 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: WINRT_MANIFEST.publisherid = {00000000-0000-0000-0000-000000000000} + else: WINRT_MANIFEST.publisherid = CN=$$(USERNAME) + } + 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 + + winphone: INDENT = "$$escape_expand(\\r\\n) " + else: INDENT = "$$escape_expand(\\r\\n) " + # Capabilities are given as a string list and may change with the configuration (network, sensors, etc.) + WINRT_MANIFEST.capabilities = $$unique(WINRT_MANIFEST.capabilities) + for(CAPABILITY, WINRT_MANIFEST.capabilities): \ + MANIFEST_CAPABILITIES += " " + WINRT_MANIFEST.capabilities = $$join(MANIFEST_CAPABILITIES, $$INDENT, $$INDENT, $$INDENT) + # Dependencies are given as a string list. The CRT dependency is added automatically above. + WINRT_MANIFEST.dependencies = $$unique(WINRT_MANIFEST.dependencies) + for(DEPENDENCY, WINRT_MANIFEST.dependencies): \ + MANIFEST_DEPENDENCIES += " " + WINRT_MANIFEST.dependencies = $$join(MANIFEST_DEPENDENCIES, $$INDENT, $$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_$${ICON_NAME}.input = $$WINRT_ASSETS_PATH/$${ICON_NAME}.png + icon_$${ICON_NAME}.output = $$BUILD_DIR/assets/$${ICON_NAME}.png + WINRT_MANIFEST.$${ICON_NAME} = assets/$${ICON_NAME}.png + } else { + icon_$${ICON_NAME}.input = $$ICON_FILE + icon_$${ICON_NAME}.output = $$BUILD_DIR/$$ICON_FILE + } + icon_$${ICON_NAME}.CONFIG = verbatim + QMAKE_SUBSTITUTES += icon_$${ICON_NAME} + } + + QMAKE_SUBSTITUTES += manifest_file +} diff --git a/mkspecs/winphone-arm-msvc2012/qmake.conf b/mkspecs/winphone-arm-msvc2012/qmake.conf index d5d26d2a96..c4e3d2bab7 100644 --- a/mkspecs/winphone-arm-msvc2012/qmake.conf +++ b/mkspecs/winphone-arm-msvc2012/qmake.conf @@ -17,3 +17,4 @@ VCPROJ_ARCH = ARM MSVC_VER = 11.0 WINSDK_VER = 8.0 WINTARGET_VER = WP80 +WINRT_MANIFEST = $$PWD/../common/winrt_winphone/manifests/8.0/WMAppManifest.xml.in diff --git a/mkspecs/winphone-x86-msvc2012/qmake.conf b/mkspecs/winphone-x86-msvc2012/qmake.conf index 59e6fb45db..1329370900 100644 --- a/mkspecs/winphone-x86-msvc2012/qmake.conf +++ b/mkspecs/winphone-x86-msvc2012/qmake.conf @@ -17,3 +17,4 @@ VCPROJ_ARCH = x86 MSVC_VER = 11.0 WINSDK_VER = 8.0 WINTARGET_VER = WP80 +WINRT_MANIFEST = $$PWD/../common/winrt_winphone/manifests/8.0/WMAppManifest.xml.in diff --git a/mkspecs/winrt-arm-msvc2012/qmake.conf b/mkspecs/winrt-arm-msvc2012/qmake.conf index 951dc2db35..41594a3547 100644 --- a/mkspecs/winrt-arm-msvc2012/qmake.conf +++ b/mkspecs/winrt-arm-msvc2012/qmake.conf @@ -16,3 +16,4 @@ VCPROJ_ARCH = ARM MSVC_VER = 11.0 WINSDK_VER = 8.0 WINTARGET_VER = win8 +WINRT_MANIFEST = $$PWD/../common/winrt_winphone/manifests/8.0/AppxManifest.xml.in diff --git a/mkspecs/winrt-arm-msvc2013/qmake.conf b/mkspecs/winrt-arm-msvc2013/qmake.conf index 5527a7a41c..83ab228d7f 100644 --- a/mkspecs/winrt-arm-msvc2013/qmake.conf +++ b/mkspecs/winrt-arm-msvc2013/qmake.conf @@ -18,3 +18,4 @@ VCPROJ_ARCH = ARM MSVC_VER = 12.0 WINSDK_VER = 8.1 WINTARGET_VER = winv6.3 +WINRT_MANIFEST = $$PWD/../common/winrt_winphone/manifests/8.1/AppxManifest.xml.in diff --git a/mkspecs/winrt-x64-msvc2012/qmake.conf b/mkspecs/winrt-x64-msvc2012/qmake.conf index 96806499bc..f6e360ae12 100644 --- a/mkspecs/winrt-x64-msvc2012/qmake.conf +++ b/mkspecs/winrt-x64-msvc2012/qmake.conf @@ -16,3 +16,4 @@ VCPROJ_ARCH = x64 MSVC_VER = 11.0 WINSDK_VER = 8.0 WINTARGET_VER = win8 +WINRT_MANIFEST = $$PWD/../common/winrt_winphone/manifests/8.0/AppxManifest.xml.in diff --git a/mkspecs/winrt-x64-msvc2013/qmake.conf b/mkspecs/winrt-x64-msvc2013/qmake.conf index e7d2432cc4..2c01450ed4 100644 --- a/mkspecs/winrt-x64-msvc2013/qmake.conf +++ b/mkspecs/winrt-x64-msvc2013/qmake.conf @@ -18,3 +18,4 @@ VCPROJ_ARCH = x64 MSVC_VER = 12.0 WINSDK_VER = 8.1 WINTARGET_VER = winv6.3 +WINRT_MANIFEST = $$PWD/../common/winrt_winphone/manifests/8.1/AppxManifest.xml.in diff --git a/mkspecs/winrt-x86-msvc2012/qmake.conf b/mkspecs/winrt-x86-msvc2012/qmake.conf index 9186ff2eb1..664212624c 100644 --- a/mkspecs/winrt-x86-msvc2012/qmake.conf +++ b/mkspecs/winrt-x86-msvc2012/qmake.conf @@ -16,3 +16,4 @@ VCPROJ_ARCH = x86 MSVC_VER = 11.0 WINSDK_VER = 8.0 WINTARGET_VER = win8 +WINRT_MANIFEST = $$PWD/../common/winrt_winphone/manifests/8.0/AppxManifest.xml.in diff --git a/mkspecs/winrt-x86-msvc2013/qmake.conf b/mkspecs/winrt-x86-msvc2013/qmake.conf index 77083e9cbc..384b51a1e6 100644 --- a/mkspecs/winrt-x86-msvc2013/qmake.conf +++ b/mkspecs/winrt-x86-msvc2013/qmake.conf @@ -18,3 +18,4 @@ VCPROJ_ARCH = x86 MSVC_VER = 12.0 WINSDK_VER = 8.1 WINTARGET_VER = winv6.3 +WINRT_MANIFEST = $$PWD/../common/winrt_winphone/manifests/8.1/AppxManifest.xml.in -- cgit v1.2.3