Details
-
Suggestion
-
Resolution: Unresolved
-
Not Evaluated
-
None
-
None
-
None
Description
currently, the multiplexing implementation uses a very coarse multi-pass structure operating at the product level, with a pass for every "cell" (variant) of the multiplexing matrix, and an optional aggregation pass. a completely separate evaluation context is set up for each pass, which requires it to happen very early, thus considerably constraining the possibilities, e.g., the multiplexable properties need to be defined in the qbs module, and skipping passes based on absence of dependencies is not possible.
to address these issues, multiplexing needs to operate at a much finer granularity, within a single evaluation context. specifically, at the expression level, whenever the evaluator accesses a property which is multiplexed, the result would be also automatically multiplexed (i.e., the expression is evaluated for each value of the property); this may happen over multiple axes in a single expression.
dependency variants which can be selected based upon multiplexed properties must also be multiplexed; this is closely related to QBS-995.
this feature is an enabler for other features. as nothing changes about the fundamental fact that expressions are evaluated in multiple passes, existing code should keep working unmodified.
Examples
MuxProps { arch: [ "x86", "arm" ] type: [ "debug", "release" ] } knolf: "foobar" // no muxing here // => "foobar baz" deriv_n: knolf + " baz" // one-axis muxing // => "foobar x86 baz" // => "foobar arm baz" deriv_1d: knolf + " " + arch + " baz" // two-axis muxing // => "foobar x86 debug baz" // => "foobar x86 release baz" // => "foobar arm debug baz" // => "foobar arm release baz" deriv_2d: knolf + " " + arch + " " + type + " baz" // transitive one-axis muxing // => "zort foobar x86 baz" // => "zort foobar arm baz" deriv2_1d: "zort " + deriv_1d // partially transitive two-axis muxing // - this shows that we mux each axis only once // => "zort x86 foobar x86 debug baz" // => "zort x86 foobar x86 release baz" // => "zort arm foobar arm debug baz" // => "zort arm foobar arm release baz" deriv2_2d: "zort " + arch + " " + deriv_2d