I would like to discuss the way how external dependencies should be searched by
qbs.
While implementing support for the protobuf I found that there several place
where a generic c++ can come from.
1. It can be detected via pkg-config
2. It can be detected using probes
3. Other pkg-config-like tools? Maybe Vcpkg?
4. It can be the part of the project.
I am not sure if we need to support 4, but if the mechanism of library
searching will be based on the Depends item, I don’t see why user can’t add a
«zlib» product that will be fetched prior to system modules. But anyway, that’s
not the point.
The point is that for now, I have to write stuff like
Depends {
name: "internal.libprotobuf.pkgconfig"
condition: _autoDetect
required: false
}
Depends {
name: "internal.libprotobuf.probes"
condition: _autoDetect && !internal.libprotobuf.pkgconfig.found
required: false
}
Note, that libprotobuf.pkgconfig and libprotobuf.probes are different modules
in different folders under qbs/modules.
In case I want to add third way to fetch a library, I will require third module
and third Depends item. Too much boilerplate for a modern build system.
This comes from the limitation that modules are loaded only based on their
condition and priority and it is not possible to use Probes in conditions. I
guess, this limitation comes from the fact that probes are heavy to evaluate,
but I’m not sure.
Either that limitation should be removed, or we can extend the way Qbs loads
modules by adding property bool recover to the Module which tells Qbs to try
loading next module in a chain (with lower priority) if loading «best suitable»
module failed. If the property is false by default, current behavior will be
preserved and we can use it to implement «chain» loading by simply writing
Depends { name: "internal.libprotobuf" }.
Next thing I want to discuss is the way how Qbs should search for libraries
using Probes. For now, we have IncludeProbe, LibraryProbe and FrameworkProbe
(for macOS frameworks). It is not very convenient to use them directly, but we
can wrap them into a ExternalPackage module that provides some input properties
to tell Probes what to search for:
ExternalPackage {
name: "zlib"
headers: ["zlib.h"]
libraryNames: ["z"]
}
We can also provide some properties to tell Qbs where to search for libraries
or to override some default behavior:
qbs build modules.ExternalPackage.platformSearchPaths:"/opt/usr/lib"
modules.ExternalPackage.staticLibs:true
That way, we will have mechanism similar to CMake find package module and we
can provide support for lot of libraries in a declarative way.
Any thoughts?_______________________________________________
Qbs mailing list
[email protected]
https://lists.qt-project.org/listinfo/qbs