Garmaine Staff asked 2 years ago

I have a CMake project that uses an external tool to build special libraries for a certain platform. Running this tool uses a "config file" to generate several files that are injected into the compiler and linker options when the final program is built:

  • An object library
  • A linker command file that links in several pre-compiled libs and the above object library
  • A makefile options file that sets various platform compiler options

whenever any of these files change, the main program must be entirely rebuilt, as they are intrinsic parts of the program and involve things like compiler flags and system includes.

So far, I have something like this, which appears to be a recommended way:

# run the external build tool to generate platform libs
# and compiler/linker option files
add_custom_command(
    OUTPUT ${LINKER_CMD_FILE} ${COMPILER_OPTS_FILE} ${PLATFORM_OBJECT_LIB}
    COMMAND "${EXTERNAL_BUILD_TOOL}"
    ARGS --config ${CFG_FILE}
    DEPENDS ${CFG_FILE}
    COMMENT "Invoking external build tool for ${CFG_FILE}"
)

add_custom_target(platform_libs
    DEPENDS ${LINKER_CMD_FILE} ${COMPILER_OPTS_FILE} ${PLATFORM_OBJECT_LIB}
)

....

add_executable(main_prog
    main.c
)

# whenever any of these change, rebuild
add_dependencies(main_prog platform_libs)

# add the platform compiler opts from the generated file
target_compile_options(main_prog PRIVATE
    @${COMPILER_OPTS_FILE}
)

This is also pretty much what is done in this question.

When I change the config file, the platform_libs target runs and generates the library and other files as needed. However, although running make main_prog does trigger the build of the platform_libs correctly, it does not appear to "notice" any changes and therefore concludes it doesn't need to actually re-build the main program.

I can always run make clean, but it's not great to have CMake totally blind to fundamental system libraries changing.

How can I force main_prog to rebuild if platform_libs has run?