qt5base-lts/mkspecs/features/exclusive_builds_post.prf
BogDan Vatra 5bb178c479 Say hello to Android multi arch build in one go
Multi arch build in one go is need to support the new .aab packaging format.

By default the users apps are built for all Android ABIs: arm64-v8a armeabi-v7a x86_64 x86
The user can pass ANDROID_ABIS to qmake to filter the ABIs during development,
e.g. qmake ANDROID_ABIS="arm64-v8a armeabi-v7a" will build only for arm ABIs.

[ChangeLog][Android] Android multi arch build in one go,
needed to support the new .aab packaging format.

Change-Id: I3a64caf9621c2a195863976a62a57cdf47e6e3b5
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
2019-08-26 12:59:15 +03:00

163 lines
5.7 KiB
Plaintext

load(qt_functions)
contains(TEMPLATE, subdirs) {
for(build, QMAKE_EXCLUSIVE_BUILDS) {
prepareRecursiveTarget($$build)
QMAKE_EXTRA_TARGETS += $$build
}
} else {
# Recursively combines a list of exclusive builds into combinations
# of non-exclusive builds (separated by a ':' character), eg the
# list [debug, release, static, shared] will result in the four
# combinations [debug:static, debug:shared, release:static,
# release:shared].
defineReplace(combineExclusiveBuilds) {
permutationBuilds = $$1
existingBuilds = $$2
isEmpty(permutationBuilds): \
# Exit-condition, no more recursing
return($$existingBuilds)
# Choose the first build of the permutations and use the set of exclusive
# builds associated with that build as the list of existing builds. This
# partitions the permutations into one set of exclusive builds + the rest
# of the unknown permutations.
newExistingBuilds = $$eval($$first(permutationBuilds).exclusive)
permutationBuilds -= $$newExistingBuilds
# Recursively compute the combination of these two sets
recursiveCombination = $$combineExclusiveBuilds($$permutationBuilds, $$newExistingBuilds)
isEmpty(existingBuilds): \
# No need to combine further
return($$recursiveCombination)
result =
for(existingBuild, existingBuilds) {
for(combination, recursiveCombination): \
result += "$${existingBuild}:$${combination}"
}
return($$result)
}
buildCombinations = $$combineExclusiveBuilds($$QMAKE_EXCLUSIVE_BUILDS)
for(combination, buildCombinations) {
builds = $$split(combination, :)
key =
config =
target =
priority =
for(build, builds) {
key = $${key}$$eval($${build}.name)
config *= $$eval($${build}.CONFIG) $${build} $$eval($${build}.name)Build
target += $$eval($${build}.target)
# If a build has been prioritized through CONFIG we prefer that
CONFIG($$build, $$join($${build}.exclusive, |)): \
priority += 1
}
$${key}.name = $$key
$${key}.target = $$join(target, -)
$${key}.CONFIG = $$config
$${key}.builds = $$builds
BUILDS.$$size(priority) += $$key
# Add makefile targets for each exclusive build that will aggregate all targets
# that include the exclusive build. This matches the targets in the SUBDIR files
# so that you can recursivly build a single exclusive build.
!build_pass:count(builds, 1, >) {
for(build, builds) {
$${build}.depends += $$eval($${key}.target)
QMAKE_EXTRA_TARGETS *= $$build
}
}
}
BUILDS =
priority =
for(ever) {
# Keep the order in BUILDS matching the priority from CONFIG, so that the first
# entry in BUILDS will be the first/default target when not CONFIG(build_all).
BUILDS = $$eval(BUILDS.$$size(priority)) $$BUILDS
count(BUILDS, $$size(buildCombinations), >=): break()
priority += 1
}
build_pass|fix_output_dirs {
!build_pass {
# The builds are sorted by priority based on the current config
# so choosing the first one gives us the most appropriate build.
BUILD_PASS = $$first(BUILDS)
}
for(dir, QMAKE_DIR_REPLACE) {
# Limit builds to ones that should affect the current $$dir
builds =
for(build, $${BUILD_PASS}.builds) {
equals(dir, DESTDIR) {
!$$join($${build}.exclusive, _and_)_target: \
next()
}
builds += $$build
}
isEmpty(builds): \
next()
affixes =
for(build, builds): \
affixes += $$eval($${build}.dir_affix)
full_dir_affix = $$join(affixes, -)
isEmpty($$dir)|isEqual($$dir, .) {
# Use affix directly
$$dir = $$full_dir_affix
next()
}
contains(QMAKE_DIR_REPLACE_SANE, $$dir) {
# Suffix output dir
$$dir = $$clean_path($$eval($$dir)/$$full_dir_affix)
} else {
# "Compatibility mode" with QTBUG-491
for(build, builds) {
did_replace = false
build_affix = $$eval($${build}.dir_affix)
for(exclusive, $${build}.exclusive) {
equals(exclusive, $$build): \
next()
exclusive_affix = $$eval($${exclusive}.dir_affix)
contains($$dir, .*$${exclusive_affix}.*) {
$$dir ~= s/$${exclusive_affix}/$${build_affix}/gi
did_replace = true
}
}
$$did_replace: next()
# Append (as subdir or as suffix)
!build_pass {
dir_affix = $$eval($${build}.dir_affix)
!contains($$dir, .*$${dir_affix}.*) {
contains($$dir, .*/$) {
# Subdir
$$dir = $$eval($$dir)$$dir_affix
} else {
# Suffix
$$dir = $$eval($$dir)-$${dir_affix}
}
}
}
}
}
}
}
}