- 
    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 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 QBS-741
        Add "useAsInput" property to Depends item-           
- Closed
 
-         
- 
                    QBS-995 add a generic way to constrain dependencies -           
- Reported
 
-