[Qbs] Heads up: Deprecations in master branch
Christian Kandeler
christian.kandeler at qt.io
Fri Aug 2 11:04:56 CEST 2024
Hi,
I'd like to point out two upcoming behavior changes.
==================================================
1. Path properties in Export items
Initially, the "product" variable, when used in an Export item, referred
to the product the Export item was in, i.e. the exporting product. This
was dubious, because Export items are supposed to behave like modules,
where the product variable refers to the product that depends on the
module, i.e. the importing product. Therefore, we introduced the
"exportingProduct" variable and changed the behavior in qbs 1.22.
However, we forgot about path properties. Consider this example, which
you might encounter in a library product:
Export {
Depends { name: "cpp" }
cpp.includePaths: "."
}
Even after the aforementioned change, such a path was still resolved
relative to the exporting product, which was now inconsistent. We have
therefore deprecated this construct and will change the behavior such
that the base directory will be the importing product's.
Instead, you can simply refer to the exporting product's source
directory explicitly via "exportingProduct.sourceDirectory".
==================================================
2. The "implicit else" for list properties used in Properties items
A long-standing major annoyance with the Properties item was that its
conditions could not overlap to append different values to lists:
Properties {
condition: qbs.targetOS.contains("unix")
cpp.defines: "OS_UNIX"
}
Properties {
condition: qbs.targetOS.contains("linux")
cpp.defines: "OS_LINUX"
}
This now works as intended and produces ["OS_UNIX", "OS_LINUX"] if the
target OS is Linux.
However, there is a glitch: If the same property is also set outside a
Properties item, such a value is considered only if none of the
Properties items match. This is fine for scalar properties, for which
there can only be one value, but makes little sense for list properties,
where you often have common values that you'd like to append to
conditionally. This was traditionally done via the "outer.concat" idiom,
which is conceptually incompatible with overlapping conditions, as the
same values will potentially get added to the list several times.
Therefore, for list properties, bindings outside Properties items will
no longer act as fallbacks, but will be considered unconditionally. In
the rare cases where the current behavior is wanted, you can use a
Properties item with an explicitly "undefined" condition:
Properties {
condition: undefined
cpp.defines: "OS_NONE"
}
==================================================
The timeline for both of these behavior changes is as follows:
2.5: Deprecation message (opt-in)
2.6: Deprecation message (opt-out)
2.7: Behavior change
I will write another reminder when we actually implement the behavior
switch.
Christian
More information about the Qbs
mailing list