How to add_custom_command() for the CMake build process itself?

后端 未结 1 772
野的像风
野的像风 2021-01-16 10:06

Is there any way to do the equivalent of add_custom_command (run an external script when a certain file changes), but for something that should be run during CMake script ex

相关标签:
1条回答
  • 2021-01-16 10:45

    Turning my comment into an answer

    configure_file() is the right choice to retrigger the configuration process. And execute_process() is used to run commands during the configuration step.

    Here is an abstract CMake snippet of the steps in your description:

    function(my_add_library_from_cfg _target _cfg_file)
        # Retrigger configuration process each time config file changes
        get_filename_component(_cfg_name "${_cfg_file}" NAME)
        configure_file("${_cfg_file}" "${_cfg_name}.tmp")
    
        # Generating sources and file list
        execute_process(
            COMMAND ${CMAKE_COMMAND} -E echo "#define FOO" 
            OUTPUT_FILE foo.c
        )
        execute_process(
            COMMAND ${CMAKE_COMMAND} -E echo "foo.c"
            OUTPUT_FILE files.lst
        )
    
        # Reading file list and add library
        file(STRINGS "${CMAKE_CURRENT_BINARY_DIR}/files.lst" _sources_lst)
        add_library(${_target} ${_sources_lst} "${_cfg_file}")
    endfunction(my_add_library_from_cfg)
    
    • configure_file() will retrigger CMake each time the given .cfg file changes
      • if you actually use the .cfg file as a command line parameter in execute_process() you should use the generated .tmp version in the current binary directory
    • execute_process() can do a lot of things
      • I used it to echo to stdout and write the output to files
      • the default WORKING_DIRECTORY here is the current binary directory
    • file() reads in the list of source files
      • full paths each, newline separated
    • I have written the generated files by purpose to the binary output directory
      • it makes a clean build easier, just delete the whole binary output directory
      • and CMake has build-in support for this; it will search for source files without absolute path first in the current source and then in current binary directory
    • And I didn't use the GENERATED source file property
      • because that would only be needed if the sources were generated by a previous build step
      • and CMake itself won't recognize anymore when actually a file from source file list would be missing
    0 讨论(0)
提交回复
热议问题