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

Reply via email to