> On Feb. 14, 2014, 3:26 p.m., Alex Merry wrote:
> > OK, I'll be honest, something about this whole module interface rubs me up 
> > the wrong way.  There's either too much or not enough magic: code that 
> > calls ecm_generate_headers needs to know things about the implementation 
> > and use them in things like target_include_directories.  And this change 
> > only adds to that.  I'm regretting not paying more attention when this 
> > first went in.
> > 
> > Personally, my preference would be to add another argument to complement 
> > REQUIRED_HEADERS (like GENERATED_HEADERS, or perhaps an unnamed initial 
> > argument) that provides a list of the generated files (with paths!) that 
> > can be passed to install.  Then the mixed directory doesn't matter (and, in 
> > fact, matches how the installation would work).  This would (IMO) reduce, 
> > rather than increase, the knowledge needed by calling code.  It would make 
> > it work much more like the familiar macros that add things to FOO_sources 
> > variables (especially if the unnamed initial argument is used).
> > 
> > In this scenario, I would also omit MODULE_NAME, and just dump the headers 
> > in the build dir unless OUTPUT_DIR is set.
> > 
> > I would like usage to look like
> > ecm_generate_headers(
> >     KArchive_FORWARDING_HEADERS
> >     HEADERS
> >         KArchive
> >         KArchiveEntry
> >         # etc
> >     REQUIRED_HEADERS KArchive_HEADERS
> > )
> > target_include_directories(KF5Parts PUBLIC 
> > "$<BUILD_INTERFACE:${KArchive_BINARY_DIR}>") # optional
> > install(FILES ${KArchive_FORWARDING_HEADERS} ${KArchive_HEADERS}
> >         DESTINATION ${INCLUDE_INSTALL_DIR}/KArchive
> >         COMPONENT Devel)
> > 
> > 
> > ecm_generate_headers(
> >     KParts_FORWARDING_HEADERS
> >     HEADERS
> >         Part
> >         PartBase
> >         # etc
> >     PREFIX KParts # files go in OUTPUT_DIR/KParts and OUTPUT_DIR/kparts
> >     REQUIRED_HEADERS KArchive_HEADERS
> > )
> > target_include_directories(KF5Parts PUBLIC 
> > "$<BUILD_INTERFACE:${KParts_BINARY_DIR}>")
> > install(FILES ${KParts_FORWARDING_HEADERS}
> >         DESTINATION ${INCLUDE_INSTALL_DIR}/KParts
> >         COMPONENT Devel)
> > install(FILES ${KParts_HEADERS}
> >         DESTINATION ${INCLUDE_INSTALL_DIR}/kparts
> >         COMPONENT Devel)
> > 
> > 
> > And with output dir:
> > ecm_generate_headers(
> >     KParts_FORWARDING_HEADERS
> >     HEADERS
> >         Part
> >         PartBase
> >         # etc
> >     OUTPUT_DIR "${KParts_BINARY_DIR}/kparts_headers"
> >     PREFIX KParts # files go in OUTPUT_DIR/KParts and OUTPUT_DIR/kparts
> >     REQUIRED_HEADERS KArchive_HEADERS
> > )
> > target_include_directories(KF5Parts PUBLIC 
> > "$<BUILD_INTERFACE:${KParts_BINARY_DIR}/kparts_headers>")
> > install(FILES ${KParts_FORWARDING_HEADERS}
> >         DESTINATION ${INCLUDE_INSTALL_DIR}/KParts
> >         COMPONENT Devel)
> > install(FILES ${KParts_HEADERS}
> >         DESTINATION ${INCLUDE_INSTALL_DIR}/kparts
> >         COMPONENT Devel)
> 
> Alex Merry wrote:
>     Two of those target_include_directories are wrong, of course, and should 
> be
>     target_include_directories(KF5Parts PUBLIC 
> "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>")
>     
>     Also, "HEADERS" should probably be "HEADER_NAMES", for clarity.
> 
> David Faure wrote:
>     Thanks for looking into this.
>     I very much like the idea of getting a list of camelcase headers to 
> install rather than using install(DIRECTORIES) which just picks up what was 
> left over by a previous build in one's builddir.
>     
>     The thing about OUTPUT_DIR is that it's not used anywhere, so I would be 
> in favour of just removing it, for simplicity.
>     
>     About target_include_directories: what we want is
>      target_include_directories(KF5Parts PUBLIC 
> "$<BUILD_INTERFACE:${KParts_BINARY_DIR};${CMAKE_CURRENT_BINARY_DIR}>")
>     so that the version header is found (it's at the toplevel). Easy to 
> script with my perl line (just remove /local).
>     
>     
>     To make the porting easier, maybe we should write this in a macro with a 
> slightly different name, port incrementally, and then remove 
> ecm_generate_headers? Otherwise it's harder to work together on this. My 
> suggestion was: if you write the new macro and test it on two frameworks 
> (kcoreaddons and kparts, to have prefixed and non-prefixed), I can write 
> scripts to port all the modules to that without manual labour.
>     
>     Alternatively, I can do it all next friday (vacation!).
> 
> Alex Merry wrote:
>     I would argue that the purpose of OUTPUT_DIR is to deal with repos where 
> the usual behaviour could cause a file conflict in the build directory.  We 
> don't expect most projects to use it, but I think it's still worth having to 
> deal with that.
>     
>     target_include_directories: yes, I was ignoring the version headers in my 
> example and just concentrating on the code directly related to this function.
>     
>     Even better, if we use the HEADER_NAMES keyword, we can select between 
> implementations based on the presence of that.  Then we can remove the old 
> implementation once everything is ported.
>     
>     I should be able to do this today.

https://git.reviewboard.kde.org/r/115765/ for the new ECMGenerateHeaders

https://git.reviewboard.kde.org/r/115766/ for KCoreAddons
https://git.reviewboard.kde.org/r/115767/ for KParts


- Alex


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://git.reviewboard.kde.org/r/115684/#review49787
-----------------------------------------------------------


On Feb. 11, 2014, 10:15 p.m., David Faure wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://git.reviewboard.kde.org/r/115684/
> -----------------------------------------------------------
> 
> (Updated Feb. 11, 2014, 10:15 p.m.)
> 
> 
> Review request for Build System, Extra Cmake Modules, KDE Frameworks, and 
> Harald Fernengel.
> 
> 
> Repository: extra-cmake-modules
> 
> 
> Description
> -------
> 
> Generate local forwarding headers under a local subdir, to fix clash on Mac 
> OS X.
> 
> This is intended to replace RR 115541.
> 
> With case-insensitive filesystems, creating KParts and kparts subdirs
> in the same parent was obviously a bad idea, especially since we then
> make a copy of "KParts" and don't expect the contents of "kparts" to tag 
> along.
> Solved by making that KParts (installed) and local/kparts (not installed).
> 
> Downside: the modules that use this PREFIX feature need a change like this:
> -target_include_directories(KF5Parts PUBLIC 
> "$<BUILD_INTERFACE:${KParts_BINARY_DIR}>")
> +target_include_directories(KF5Parts PUBLIC 
> "$<BUILD_INTERFACE:${KParts_BINARY_DIR};${CMAKE_CURRENT_BINARY_DIR}/local>")
> 
> Easily scripted though:
> perl -pi -e 's/>/\;\${CMAKE_CURRENT_BINARY_DIR}\/local>/ if 
> (/target_include_directories/ && /PUBLIC/)' `grep -rwl PREFIX .`
> 
> 
> Diffs
> -----
> 
>   modules/ECMGenerateHeaders.cmake e98a22e91151d23d7c798ff22a33097ec2a59d10 
> 
> Diff: https://git.reviewboard.kde.org/r/115684/diff/
> 
> 
> Testing
> -------
> 
> Applied it, ran the perl script, and a full build-from-scratch worked.
> Not tested on a Mac, though :)
> 
> 
> Thanks,
> 
> David Faure
> 
>

_______________________________________________
Kde-frameworks-devel mailing list
Kde-frameworks-devel@kde.org
https://mail.kde.org/mailman/listinfo/kde-frameworks-devel

Reply via email to