Triggering rebuild after changing a *.json file
Andreas Pakulat
apaku at gmx.de
Sun Nov 23 09:39:02 GMT 2014
Hi,
On Sun, Nov 23, 2014 at 4:36 AM, Milian Wolff <mail at milianw.de> wrote:
> Hey all,
>
> in my quest for better *.json support in KF5 based applications, I noticed
> that we currently do not rebuild properly on changes to the *.desktop or
> *.json files.
>
> For KDevelop, I'm thus playing around with something like this currently:
>
> ~~~~~~~~~~~~~~~+
> function(kdevplatform_add_plugin plugin)
> set(options )
> set(oneValueArgs JSON)
> set(multiValueArgs SOURCES)
> cmake_parse_arguments(KDEV_ADD_PLUGIN "${options}" "${oneValueArgs}"
> "${multiValueArgs}" ${ARGN})
>
> string(REGEX REPLACE "\\.cmake$" "" json_out ${KDEV_ADD_PLUGIN_JSON})
> configure_file(${KDEV_ADD_PLUGIN_JSON}
> ${CMAKE_CURRENT_BINARY_DIR}/${json_out})
>
> # ensure we recompile the corresponding object files when the json file
> changes
> set(dependent_sources )
> foreach(header ${KDEV_ADD_PLUGIN_SOURCES})
> file(STRINGS "${header}" match REGEX "K_PLUGIN_FACTORY_WITH_JSON")
> if(match)
> list(APPEND dependent_sources "${header}")
> endif()
> endforeach()
> if(NOT dependent_sources)
> # fallback to all sources - better safe than sorry...
> set(dependent_sources ${KDEV_ADD_PLUGIN_SOURCES})
> endif()
> set_property(SOURCE ${dependent_sources} APPEND PROPERTY OBJECT_DEPENDS
> ${CMAKE_CURRENT_BINARY_DIR}/${json_out})
>
> add_library(${plugin} MODULE ${KDEV_ADD_PLUGIN_SOURCES})
> set_property(TARGET ${plugin} APPEND PROPERTY AUTOGEN_TARGET_DEPENDS
> ${CMAKE_CURRENT_BINARY_DIR}/${json_out})
> endfunction()
> ~~~~~~~~~~~~~~~+
>
>
> To be used like this:
>
> kdevplatform_add_plugin(kdevgit JSON kdevgit.json.cmake SOURCES
> ${kdevgit_PART_SRCS})
>
> This does trigger a rebuild, but the strings are still not updated
> properly.
> I'm quite confused actually, does anyone know where the code comes from
> that
> is embedded into the *.o that uses Q_PLUGIN_METADATA? I suspect CMake
> AUTOGEN?
> But where does that put its generated binary JSON representation? How can I
> make sure that it gets updated properly when the source file changes?
>
> To reproduce this, you can just change any *.desktop file that is piped
> through desktop_to_json. The change will be picked up by CMake and a
> reconfigure is triggered, which is pretty slow as well. But nothing is
> rebuilt. With the macro above, I trigger the build but still, the *.o file
> that uses K_PLUGIN_FACTORY_WITH_JSON is still containing the "old"
> strings...
> I'm at loss - can someone help me please? <http://milianw.de>
Is there a particular reason why you run the to-json part during cmake
time? If you setup a simple cmake script you could easily switch the
generation to be a custom target and then have the plugin depend on that
custom target (or rather its json output file).
I also think you're misunderstanding the AUTOGEN_TARGET_DEPENDS property,
according to the documentation it is to be set on an auto-generator target
and not on a 'standard' one like the library. As far as I can see you know
the input and output files of the desktop-to-json conversion so a custom
target should be easily doable (unlike automoc).
Andreas
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kde.org/pipermail/kde-core-devel/attachments/20141123/b1fb5a85/attachment.htm>
More information about the kde-core-devel
mailing list