RFC: Frameworks headers install location

Ahmad Samir a.samirh78 at gmail.com
Tue Apr 5 15:18:52 BST 2022


Hello.

- In KF5, ECM, magically, added /usr/include/KF5/ to the CMake targets interface include directories 
(IIUC for reasons of backwards compatibility, which was necessary in the 4-5 transition era, I could 
be wrong because I wasn't around at that time :))

- While building KF against Qt6, this suddenly broke building in some modules due to #include 
directives not finding the headers, as /usr/include/KF6/ didn't have the same magic-injection 
treatment as KF5

- To fix the issue, proper paths had to be added to targets interface include directories so that 
module A linking against module B will have the proper include paths to search for headers

- The typical include dir layout for a KF module is:
/usr/include/KF*/ModuleName/{ForwardingHeaderA,headera.h}

e.g. KCMutils, #include <KCModuleData>, and /usr/include/KF5/KCMUtils added to KCMutils target 
include dirs.

- If there is a namespace, the original plan was to guard the include paths, by making them match 
the C++ namespaces, e.g.:
/usr/include/KF*/ModuleName/NameSpace/ForwardingHeaderA
/usr/include/KF*/ModuleName/namespace/headera.h

e.g. KSynatxHighlighting:
/usr/include/KF*/KSyntaxHighlighting/
/usr/include/KF*/KSyntaxHighlighting/KSyntaxHighlighting/Repository
/usr/include/KF*/KSyntaxHighlighting/ksyntaxhighlighting/repository.h


There are some issues with the namespace use-case:
- On case-insensitive and/or case-preserving filesystems (which still exist in 2022...) extra care 
has to be taken so that installation actually works, as you can't have two dirs in the same path 
with the same name but different cases
- Compiler warnings when using e.g. #include <KSyntaxHighlighting/Repository> if the dir that was 
installed first was ksyntaxhighlighting, and all files ended up there (and vice-versa, e.g. if the 
CamelCase dir got installed first #include <ksyntaxhighlighting/repository.h> would give a warning)
- A more complicated layout

The proposal is to change the layout when there is a namespace:
- Only have one dir, /usr/include/KF*/ModuleName/NameSpace/, where all headers (ForwadingHeaders and 
lowercase.h ones) are installed


Pros:
- less complicated layout/setup (simpler CMake code)
- all KDE namespaces are CamelCase, we don't have any that are lower case
- we promote/encourage using FowardingHeaders everywhere; that's what we use in our own code and 
what the API docs advise to use

Cons:
- The case not matching when using <KSyntaxHighlighting/repository.h>, but as I said above the 
argument for this is mitigated by the fact that all our namespaces are CamelCase

If we agree with that change this will be for KF6 so as not to break source compatibility for KF5.

Best regards,
Ahmad Samir


More information about the Kde-frameworks-devel mailing list