5bb178c479
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>
163 lines
5.7 KiB
Plaintext
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}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|