Triggering rebuild after changing a *.json file

Milian Wolff mail at milianw.de
Sun Nov 23 03:36:30 GMT 2014


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?

Thanks
-- 
Milian Wolff
mail at milianw.de
http://milianw.de




More information about the kde-core-devel mailing list