-
Suggestion
-
Resolution: Done
-
P2: Important
-
1.2.0
-
1dd00091f99e62d8c10677de98e753fe332565a9
not all dependencies need to be actually linked into the Product:
- a module may be needed at runtime only
- applications/tools
- generic libraries (in qt: opengl, openssl, ...)
- plugins (including qml modules)
- such dependencies would be forwarded to Exports (see QBS-584), to make sure exported Rules (see
QBS-583) are not executed too early - such dependencies would be also used for deployment
- as a special variation, a library may be loaded only at runtime, but its include path needs to be added to the compiler call
a dependency can be principally parametrized from four locations:
- the hard-coded default behavior of the Rules
- said behavior may depend on a Parameter. that parameter may be set in several places:
- in Products which Export Modules, and by extension in Modules themselves. i.e., the imported Module requests how it shall be used (by default).
- in Depends items which import Modules. i.e., the importing Product explicitly specifies how the imported Module shall be used (overrides default)
- in DefaultParameters items which override the imported Modules' defaults in the importing Products' scope, and can be still overridden by the Depends items.
- these items shall have an optional productTypes property which limits to which imported Modules these parameters should apply, e.g. only plugins.
first declare the parameter itself:
Module {
name: "cpp"
// parameters are just specially scoped property declarations.
// the syntax is consistent with Constraints (see QBS-995), and shares the namespace with them.
Parameter {
// no default value, because it is different for each product type.
// so let the Rules decide themselves.
property bool link
}
Parameter {
property bool wholeArchive: false
}
Parameter {
property bool useHeaders: true
}
}
then create a Module which sets a default for a parameter:
Product {
productTypes: [ "plugin", cpp.static ? "staticLibrary" : "dynamicLibrary" ]
Depends {
name: "cpp"
}
cpp.static: false
Export {
Parameters {
cpp.link: cpp.static
}
}
}
Plugin {
name: "myPlugin1"
// inherits the default parameter value from Plugin
}
this results in an exported Module:
Module {
name: "myPlugin1"
Parameters {
cpp.link: false
}
...
}
Plugin {
name: "myPlugin2"
Export {
Parameters {
cpp.link: true // i'm a funny plugin, i want to be linked always
}
}
}
then use the parameter in different ways:
Product {
Depends {
// not linked
name: "myPlugin1"
}
Depends {
// linked
name: "myPlugin2"
}
Depends {
name: "OpenSSL"
// we don't want to link it, and we have our own function prototypes
// (openssl is unable to keep binary compat anyway)
cpp.useHeaders: false
cpp.link: false
}
Depends {
name: "OpenGL"
// we don't want to link it, but we want to use its headers for compilation
cpp.link: false
}
}
Product {
DefaultParameters {
productTypes: ["plugin"]
cpp.link: true
}
Depends {
// linked
name: "myPlugin1"
}
}
also, static plugins need to be actually linked. this will typically also require auto-generating static initializers for the plugins' factory methods. this is framework-dependent, so it would end up in a QtPlugin item.
- is required for
-
QBS-295 Provide a way to declare dependencies as system-provided
-
- Open
-
-
QBS-200 Provide the ability to weak-link frameworks on macOS
-
- Closed
-
-
QBS-874 qbs needs a means to weakly-link dynamic libraries on Apple platforms
-
- Closed
-
-
QBS-290
running a product in Qt Creator should build only that product and its dependents
-
- Closed
-
-
QBS-701 Add option to link to a whole archive
-
- Closed
-
- relates to
-
QBS-584 properly support private dependencies
-
- Open
-
-
QBS-247 Transformer item needs a way to add fine-grained file dependencies
-
- Closed
-
-
QBS-451 Add support for copying resources to Darwin application and framework bundles
-
- Open
-
-
QBS-643 Add a better way of dealing with Darwin bundles
-
- Closed
-
-
QBS-599 Products should be able to explicitly export their artifacts to dependent products
-
- Closed
-
-
QBS-741
Add "useAsInput" property to Depends item
-
- Closed
-
-
QBS-995 add a generic way to constrain dependencies
-
- Reported
-