Fwd: KF5 CMake usage question

Shaheed Haque srhaque at theiet.org
Thu May 18 18:04:11 BST 2017


On 18 May 2017 at 12:51, Andreas Hartmetz <ahartmetz at gmail.com> wrote:
> On Samstag, 13. Mai 2017 23:48:33 CEST Shaheed Haque wrote:
>> Hi,
>> On 13 May 2017 at 22:04, Sven Brauch <mail at svenbrauch.de> wrote:
>> > Hi,
>> >
>> > On 05/13/2017 06:06 PM, Shaheed Haque wrote:
>> >> The printed output shows that the variable KF5KIO_INCLUDE_DIRS is
>> >> not
>> >> set. In poking around, I see references to a (new-to-me)
>> >> target-based
>> >
>> >> system, and using that like this:
>> > The question is, why do you need to do that?
> The idea with the target based system aka "Modern CMake" is that you say
> you want to compile against a library, and that is all you have to do. A
> library requires you to add an include path for its own headers, include
> paths for headers of one of its dependencies, and link against a bunch
> of libraries? All covered by target properties.
> If for some reason (e.g. handover to an external tool) you need those
> properties, you can still query them. Under enforced names nonetheless,

Ack. The problem from the point of view of an automated tool which starts
with a component called Foo arises ONLY because the target(s) of Foo are
called FooFoo and FooBar. CMake does not - AFAICS - allow one to query Foo
and somehow find FooFoo and FooBar inorder to look up FooFoo_INCLUDE_DIRS

>> I'm continuing to experiment with trying to build Python bindings for
>> KF5. As part of that, the SIP tooling creates C++ wrapper code which
>> must be compiled for each framework, and for that I need to know the
>> header file directories. So far, I have simply been hardcoding the
>> needed paths on my own system, but I now want to move to using
>> standard CMake-based logic instead.
>> (In some sense, this might be seen as similar to the stuff that was
>> added to ECM, but I'm trying for a significantly more automated
>> approach).
>> Also, I am trying to feel my way towards a Pythonic build system for
>> the KF5 bindings (as, roughly speaking, PyQt seems to be doing): in
>> other words I'm interested in using CMake as a stepping stone, not the
>> actual build system.
> I would recommend against that unless you really need to have heavy
> logic in the build system. A build system's main job is to "solve" a
> dependency tree - that is the difference between a build system and a
> script that runs the compiler. The dependency tree enables cheap
> incremental builds and correct parallel builds. Maybe not that important
> for bindings, admittedly.
> Your advantage from using Python must be larger than the overhead from
> doing your own dependency resolution plus the overhead from the CMake-
> Python interfacing plus the build-related facilities that CMake has and
> Python doesn't. Or were you considering scons?
> PyQt may have chosen Python because qmake sucks, and it needs Python
> anyway, so it avoids any extra dependencies. I know from experience that
> you really want to avoid extra dependencies in commercial products.

/me nods vigourosly.

I'm not (yet) familair with all the intricacies of the Python build system
(or CMake for that matter!), but I do see that PyQt has to work quite hard
to keep its build system working as a Python user might expect. Further,
the system I am seeking to build has to support more than KF5 (or even
KDE). So, roughly speaking, the split I am going for is:

- Keep all platform and system independent code in Python
- Isolate all platform and system independent logic in CMake

As I say, I am feeling my way a bit here, but this seems like a
philosophically justifiable separation. Oh, and to solve the problem of
finding the targets, I resorted to parsing the CMake files (!!). I can live
with that hack precisely because by having the split, users of this code
who are not using it against KF5 will need to replace this CMake part with
their own anyway.

(At this point, abstracting CMake away entirely is a minor detail).

Thanks for the helpful remarks.


>> Thus, I'm after the moral equivalents of:
>> Thanks, Shaheed
>> > The usual way is to simply call
>> >
>> > target_link_libraries(mybinary KF5::KIOCore)
>> >
>> > and include paths etc. will be set up for your target automatically.
>> >
>> > Best,
>> > Sven
> Cheers,
> Andreas M9
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kde.org/pipermail/kde-core-devel/attachments/20170518/e11b861d/attachment.htm>

More information about the kde-core-devel mailing list