Tamás Szelei
Tamás Szelei

Reputation: 23951

How to trigger CMake reconfiguration from a target?

I have the following setup:

- build/
    - conanbuildinfo.cmake   (generated)
- conanfile.py
- CMakeLists.txt

A conan command is ran before CMake, generating conanbuildinfo.cmake. This contains include paths etc. to be used during the compilation later. If I change the conanfile, I want to trigger conan again and a re-run of CMake from the generated ninja build. I have a script that can call conan and it updates everything properly. However, this happens after CMake was ran and even though conanbuildinfo was changed, CMake won't run once more. This causes ninja to "not see" the changes in the dependency graph, so it doesn't rebuild everything it has to rebuild. That means I have to run ninja twice to get everything to update. The way I trigger the reconfigure currently is like this:

set(DS_CONFIG_INDICATOR ${CMAKE_BINARY_DIR}/ds_configured)

add_custom_command(
  DEPENDS ${PROJECT_SOURCE_DIR}/conanfile.py
  OUTPUT ${DS_CONFIG_INDICATOR}
  COMMAND ${CMAKE_COMMAND} -E env --unset=PYTHONPATH ${PYTHON_BINARY} ${PROJECT_SOURCE_DIR}/scripts/common/reconfigure.py ${DS_CONFIG_INDICATOR} ${PROJECT_SOURCE_DIR}
  WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
  COMMENT "Checking if reconfigure is needed"
  USES_TERMINAL
)

add_custom_target(ConanReconfigure
  DEPENDS ${DS_CONFIG_INDICATOR}
)

Is there a way to trigger a reconfigure after this script was ran?

I tried using the following without any success:

Upvotes: 1

Views: 1891

Answers (1)

Matthew
Matthew

Reputation: 2792

Why didn't execute_process work?

It seems to me like this should work if you use execute_process (not add_custom_command) to run conan/reconfigure.py before any of the CMake logic that depends on its output, combined with adding the input files of that command to CMAKE_CONFIGURE_DEPENDS.

Trying to run something before CMake won't work... but you don't need to do that, anyway. I think your problem is that you are trying to solve the wrong question. Instead, look at it as a) you want to run something during CMake's execution, and b) you want to re-run CMake if your "conanfile" changes. Re-running CMake will re-run conan.

Upvotes: 1

Related Questions