blob: a9c341a2d7281321aa8960560caf14de654c6e05 [file] [log] [blame]
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}
}
}
}
}
}
}
}
}