Ninja: generated header dependencies break with wrong-formatted include paths
Minimal example:
CMakeLists.txt:
cmake_minimum_required(VERSION 3.21)
project("test_generated_header" CXX)
add_executable(${PROJECT_NAME})
# target_include_directories(${PROJECT_NAME} PRIVATE "${CMAKE_BINARY_DIR}/generated/") # works, no problem
target_include_directories(${PROJECT_NAME} PRIVATE "./build/generated/") # does not work, need to compile twice
target_sources(${PROJECT_NAME} PRIVATE "main.cpp" "${CMAKE_BINARY_DIR}/generated/generated_header.h")
add_custom_command(
OUTPUT "${CMAKE_BINARY_DIR}/generated/generated_header.h"
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/input.txt"
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/input.txt" "${CMAKE_BINARY_DIR}/generated/generated_header.h"
COMMAND PowerShell "Write-Output running custom command"
)
main.cpp:
#include "generated_header.h"
#include <iostream>
using namespace std;
int main()
{
cout << "Generated header variable is " << var << endl;
return 0;
}
input.txt
int const var = 42;
run with:
cmake -G "Ninja Multi-Config" -B build -S .
cmake --build build --config Debug
# ... modify "input.txt"
cmake --build build --config Debug
Expected Result:
After modifying "input.txt", the custom command is rerun and "main.cpp" is rebuild
Observed Result:
After modifying "input.txt", only the custom command is rerun
Edited by Brad King