From 6c2d786e198b4cf30391f141c804e55523c6ed16 Mon Sep 17 00:00:00 2001 From: Jake Petroules Date: Wed, 4 May 2016 02:08:44 -0700 Subject: Add the ability for qmake to build Xcode asset catalogs This essentially emulates Xcode behavior for QMAKE_BUNDLE_DATA. This is mostly for our own internal use. No documentation is provided. Variables introduced: - QMAKE_ASSET_CATALOGS - QMAKE_ASSET_CATALOGS_APP_ICON - QMAKE_ASSET_CATALOGS_BUILD_PATH - QMAKE_ASSET_CATALOGS_INSTALL_PATH Change-Id: I9577415d637f022d05f301c5a0d799483cd2a963 Reviewed-by: Oswald Buddenhagen --- mkspecs/features/mac/asset_catalogs.prf | 109 ++++++++++++++++++++++++++++++++ mkspecs/features/mac/default_pre.prf | 4 +- mkspecs/features/mac/sdk.prf | 2 +- 3 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 mkspecs/features/mac/asset_catalogs.prf (limited to 'mkspecs/features') diff --git a/mkspecs/features/mac/asset_catalogs.prf b/mkspecs/features/mac/asset_catalogs.prf new file mode 100644 index 0000000000..57d93d56d5 --- /dev/null +++ b/mkspecs/features/mac/asset_catalogs.prf @@ -0,0 +1,109 @@ +# QMAKE_ASSET_CATALOGS +# Paths to xcassets directories to be compiled +# +# QMAKE_ASSET_CATALOGS_BUILD_PATH +# Location which asset catalogs will be compiled to. +# If the current target is an app bundle, defaults to its Resources directory. +# Otherwise, this value must be set manually. +# +# QMAKE_ASSET_CATALOGS_APP_ICON +# Name of the icon resource in the asset catalogs that will be used as the app icon. +# Defaults to AppIcon. +# +# QMAKE_ASSET_CATALOGS_INSTALL_PATH +# Base path to install files to. Falls back to a path relative to the target install path, +# based on QMAKE_ASSET_CATALOGS_BUILD_PATH. + +!have_target|if(!build_pass:!isEmpty(BUILDS)): \ + return() + +!isEmpty(QMAKE_ASSET_CATALOGS) { + load(resolve_target) + + isEmpty(QMAKE_ASSET_CATALOGS_BUILD_PATH) { + !isEmpty(QMAKE_RESOLVED_BUNDLE):equals(TEMPLATE, app):app_bundle { + macos: \ + QMAKE_ASSET_CATALOGS_BUILD_PATH = $$QMAKE_RESOLVED_BUNDLE/Contents/Resources + else: \ + QMAKE_ASSET_CATALOGS_BUILD_PATH = $$QMAKE_RESOLVED_BUNDLE + } else { + error("QMAKE_ASSET_CATALOGS_BUILD_PATH must be set when using QMAKE_ASSET_CATALOGS.") + } + } + + QMAKE_ASSET_CATALOGS_BUILD_PATH = $$clean_path($$QMAKE_ASSET_CATALOGS_BUILD_PATH) + + macx-xcode { + !isEmpty(QMAKE_ASSET_CATALOGS_APP_ICON) { + asset_catalog_appicon.name = "ASSETCATALOG_COMPILER_APPICON_NAME" + asset_catalog_appicon.value = $$QMAKE_ASSET_CATALOGS_APP_ICON + QMAKE_MAC_XCODE_SETTINGS += asset_catalog_appicon + } + + asset_catalog_compiler.files = $$QMAKE_ASSET_CATALOGS + macos: asset_catalog_compiler.path = Contents/Resources + QMAKE_BUNDLE_DATA += asset_catalog_compiler + } else { + !isEmpty(QMAKE_ASSET_CATALOGS_APP_ICON) { + asset_catalog_app_icon_arg = \ + --app-icon $$shell_quote($$QMAKE_ASSET_CATALOGS_APP_ICON) + } + + asset_catalog_compiler.target = $$OUT_PWD/asset_catalog_compiler.Info.plist + asset_catalog_compiler.commands = $$shell_quote($$QMAKE_ACTOOL) \ + $$asset_catalog_app_icon_arg \ + --output-partial-info-plist $$shell_quote($$asset_catalog_compiler.target) \ + --platform $${version_identifier} \ + --minimum-deployment-target $${deployment_target} \ + --compile $$shell_quote($$QMAKE_ASSET_CATALOGS_BUILD_PATH) + + for (catalog, QMAKE_ASSET_CATALOGS) { + asset_catalog_compiler.commands += $${catalog} + asset_catalog_compiler.depends += $$files($$catalog/*, true) + } + + actool_output_files = $$system(\ + mkdir -p $$system_quote($$QMAKE_ASSET_CATALOGS_BUILD_PATH) && \ + /usr/libexec/PlistBuddy -c \'Print :com.apple.actool.compilation-results:output-files\' \ + /dev/stdin <<< $($${asset_catalog_compiler.commands} 2>/dev/null) | grep \'^ .*$\', lines) + + for (output_file, actool_output_files) { + !equals(output_file, $$asset_catalog_compiler.target): \ + actool_output_files_rel += $$relative_path($$output_file, $$QMAKE_ASSET_CATALOGS_BUILD_PATH) + } + + QMAKE_EXTRA_TARGETS += asset_catalog_compiler + PRE_TARGETDEPS += $$asset_catalog_compiler.target + + isEmpty(QMAKE_ASSET_CATALOGS_INSTALL_PATH) { + !isEmpty(target.path): \ + QMAKE_ASSET_CATALOGS_INSTALL_PATH = $${target.path}/ + QMAKE_ASSET_CATALOGS_INSTALL_PATH = $${QMAKE_ASSET_CATALOGS_INSTALL_PATH}$$relative_path(\ + $$QMAKE_ASSET_CATALOGS_BUILD_PATH, $$absolute_path($$DESTDIR, $$OUT_PWD)) + } + + for (ac_install_file, actool_output_files_rel) { + asset_catalogs_files.files += \ + $$QMAKE_ASSET_CATALOGS_BUILD_PATH/$$ac_install_file + } + contains(INSTALLS, target): asset_catalogs_files.depends += install_target + asset_catalogs_files.path = $$QMAKE_ASSET_CATALOGS_INSTALL_PATH + asset_catalogs_files.CONFIG += no_check_exist + INSTALLS += asset_catalogs_files + } +} else: macx-xcode { + # Backwards compatibility + for (bundle_data, QMAKE_BUNDLE_DATA) { + for (bundle_file, $${bundle_data}.files) { + !contains(bundle_file, .*\.xcassets$): next() + warning("*.xcassets in QMAKE_BUNDLE_DATA is deprecated. Use QMAKE_ASSET_CATALOGS instead.") + !exists($$absolute_path($$bundle_file/AppIcon.appiconset, $$_PRO_FILE_PWD_)): next() + + asset_catalog_appicon.name = "ASSETCATALOG_COMPILER_APPICON_NAME" + asset_catalog_appicon.value = "AppIcon" + QMAKE_MAC_XCODE_SETTINGS += asset_catalog_appicon + break() + } + !isEmpty(asset_catalog_appicon.name): break() + } +} diff --git a/mkspecs/features/mac/default_pre.prf b/mkspecs/features/mac/default_pre.prf index 5df99d1acd..37e7950a82 100644 --- a/mkspecs/features/mac/default_pre.prf +++ b/mkspecs/features/mac/default_pre.prf @@ -1,4 +1,4 @@ -CONFIG = sdk rez $$CONFIG +CONFIG = asset_catalogs sdk rez $$CONFIG load(default_pre) isEmpty(QMAKE_XCODE_DEVELOPER_PATH) { @@ -33,6 +33,8 @@ isEmpty(QMAKE_TARGET_BUNDLE_PREFIX) { cache(QMAKE_TARGET_BUNDLE_PREFIX) } +QMAKE_ASSET_CATALOGS_APP_ICON = AppIcon + # Make the default debug info format for static debug builds # DWARF instead of DWARF with dSYM. This cuts down build times # for application debug builds significantly, as Xcode doesn't diff --git a/mkspecs/features/mac/sdk.prf b/mkspecs/features/mac/sdk.prf index 210843bd94..ef1f0c00c9 100644 --- a/mkspecs/features/mac/sdk.prf +++ b/mkspecs/features/mac/sdk.prf @@ -42,7 +42,7 @@ QMAKE_INCDIR_OPENGL = $$sysrootified QMAKESPEC_NAME = $$basename(QMAKESPEC) # Resolve SDK version of various tools -for(tool, $$list(QMAKE_CC QMAKE_CXX QMAKE_FIX_RPATH QMAKE_AR QMAKE_RANLIB QMAKE_LINK QMAKE_LINK_SHLIB)) { +for(tool, $$list(QMAKE_CC QMAKE_CXX QMAKE_FIX_RPATH QMAKE_AR QMAKE_RANLIB QMAKE_LINK QMAKE_LINK_SHLIB QMAKE_ACTOOL)) { tool_variable = QMAKE_MAC_SDK.$${QMAKESPEC_NAME}.$${QMAKE_MAC_SDK}.$${tool} !isEmpty($$tool_variable) { $$tool = $$eval($$tool_variable) -- cgit v1.2.3