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} } } } } } } } }