Fwd: KF5 CMake usage question

Aleix Pol aleixpol at kde.org
Tue May 23 01:04:54 BST 2017


On Mon, May 22, 2017 at 7:54 PM, Shaheed Haque <srhaque at theiet.org> wrote:
> On 21 May 2017 at 22:27, Aleix Pol <aleixpol at kde.org> wrote:
>> On Sat, May 20, 2017 at 7:41 PM, Shaheed Haque <srhaque at theiet.org> wrote:
>>> Actually, there is one thing about "target CMake"-based KF5 that I
>>> don't quite understand: is there a way to get to the C++ compile flags
>>> needed from CMake? That is, the modern equivalent of Foo_COMPILE_FLAGS
>>> but for target Foo? Even if the general answer is "no", I'm interested
>>> in at least the CMake variables/properties/commands needed to get to
>>> "-fPIC" and "-std=gnu++14".
>>>
>>> I'm aware of the target properties
>>> COMPILE_FLAGS/OPTIONS/DEFINITIONS/OPTIONS as well as
>>> POSITION_INDEPENDENT_CODE and CXX_STANDARD but none of these seem to
>>> be set on targets I have tried.
>>>
>>> Perhaps these are only set if somehow the compiler name etc. is specified?
>>>
>>> Thanks, Shaheed
>>>
>>> On 18 May 2017 at 18:04, Shaheed Haque <srhaque at theiet.org> wrote:
>>>> Hi,
>>>>
>>>> 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,
>>>>> unlike FOO_INCLUDE_DIR or was it FOO_INCLUDE_DIRS?
>>>>
>>>> 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
>>>> etc.
>>>>
>>>>
>>>>>> 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.
>>>>
>>>> Shaheed
>>>>
>>>>
>>>>
>>>>>> Thus, I'm after the moral equivalents of:
>>>>>>
>>>>>> Foo_INCLUDE_DIRS
>>>>>> Foo_COMPILE_FLAGS
>>>>>>
>>>>>> 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
>>
>> You can easily see how it works in extra-cmake-modules code.
>
> I don't think it is quite so simple. First, for "-std=gnu++14",the ECM
> code just hardcodes it (with a comment that hints at difficulties
> extracting this value). Second, it grabs INTERFACE_COMPILE_DEFINITIONS
> and INTERFACE_COMPILE_OPTIONS of which the latter seems to be needed
> in order to get stuff from come KF5 cmake file which set -fexception
> (in some case, for example).
>
> But what sets "-fPIC"? It seems to be inherited in some way from
> Qt5::Core INTERFACE_COMPILE_OPTIONS, but how can I get to that
> programmatically?
>
> Thanks, Shaheed
>
>> Aleix

I don't understand what you're trying to do.
You are not supposed to change the definitions Qt5::Core suggests to
the compiler.

Aleix




More information about the kde-core-devel mailing list