diff --git a/cmake/Modules/CMakePolicy.cmake b/cmake/Modules/CMakePolicy.cmake index bafd6bb5b0256..421f5a4dda6c6 100644 --- a/cmake/Modules/CMakePolicy.cmake +++ b/cmake/Modules/CMakePolicy.cmake @@ -1,11 +1,5 @@ # CMake policy settings shared between LLVM projects -# CMP0116: Ninja generators transform `DEPFILE`s from `add_custom_command()` -# New in CMake 3.20. https://cmake.org/cmake/help/latest/policy/CMP0116.html -if(POLICY CMP0116) - cmake_policy(SET CMP0116 OLD) -endif() - # MSVC debug information format flags are selected via # CMAKE_MSVC_DEBUG_INFORMATION_FORMAT, instead of # embedding flags in e.g. CMAKE_CXX_FLAGS_RELEASE. diff --git a/llvm/cmake/modules/TableGen.cmake b/llvm/cmake/modules/TableGen.cmake index bf914c379e809..dfe002fde43fd 100644 --- a/llvm/cmake/modules/TableGen.cmake +++ b/llvm/cmake/modules/TableGen.cmake @@ -21,20 +21,21 @@ function(tablegen project ofn) message(FATAL_ERROR "${project}_TABLEGEN_EXE not set") endif() - # Use depfile instead of globbing arbitrary *.td(s) for Ninja. - if(CMAKE_GENERATOR MATCHES "Ninja") - # Make output path relative to build.ninja, assuming located on - # ${CMAKE_BINARY_DIR}. + # Use depfile instead of globbing arbitrary *.td(s) for Ninja. We force + # CMake versions older than v3.30 on Windows to use the fallback behavior + # due to a depfile parsing bug on Windows paths in versions prior to 3.30. + # https://gitlab.kitware.com/cmake/cmake/-/issues/25943 + cmake_policy(GET CMP0116 cmp0116_state) + if(CMAKE_GENERATOR MATCHES "Ninja" AND cmp0116_state STREQUAL NEW + AND NOT (CMAKE_HOST_WIN32 AND CMAKE_VERSION VERSION_LESS 3.30)) # CMake emits build targets as relative paths but Ninja doesn't identify - # absolute path (in *.d) as relative path (in build.ninja) - # Note that tblgen is executed on ${CMAKE_BINARY_DIR} as working directory. - file(RELATIVE_PATH ofn_rel - ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/${ofn}) + # absolute path (in *.d) as relative path (in build.ninja). Post CMP0116, + # CMake handles this discrepancy for us, otherwise we use the fallback + # logic. set(additional_cmdline - -o ${ofn_rel} - -d ${ofn_rel}.d - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - DEPFILE ${CMAKE_CURRENT_BINARY_DIR}/${ofn}.d + -o ${ofn} + -d ${ofn}.d + DEPFILE ${ofn}.d ) set(local_tds) set(global_tds) diff --git a/mlir/cmake/modules/AddMLIR.cmake b/mlir/cmake/modules/AddMLIR.cmake index 2fc84a5b28791..e923950f9c81a 100644 --- a/mlir/cmake/modules/AddMLIR.cmake +++ b/mlir/cmake/modules/AddMLIR.cmake @@ -42,20 +42,21 @@ function(_pdll_tablegen project ofn) message(FATAL_ERROR "${project}_TABLEGEN_EXE not set") endif() - # Use depfile instead of globbing arbitrary *.td(s) for Ninja. - if(CMAKE_GENERATOR MATCHES "Ninja") - # Make output path relative to build.ninja, assuming located on - # ${CMAKE_BINARY_DIR}. + # Use depfile instead of globbing arbitrary *.td(s) for Ninja. We force + # CMake versions older than v3.30 on Windows to use the fallback behavior + # due to a depfile parsing bug on Windows paths in versions prior to 3.30. + # https://gitlab.kitware.com/cmake/cmake/-/issues/25943 + cmake_policy(GET CMP0116 cmp0116_state) + if(CMAKE_GENERATOR MATCHES "Ninja" AND cmp0116_state STREQUAL NEW + AND NOT (CMAKE_HOST_WIN32 AND CMAKE_VERSION VERSION_LESS 3.30)) # CMake emits build targets as relative paths but Ninja doesn't identify - # absolute path (in *.d) as relative path (in build.ninja) - # Note that tblgen is executed on ${CMAKE_BINARY_DIR} as working directory. - file(RELATIVE_PATH ofn_rel - ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/${ofn}) + # absolute path (in *.d) as relative path (in build.ninja). Post CMP0116, + # CMake handles this discrepancy for us. Otherwise, we use the fallback + # logic. set(additional_cmdline - -o ${ofn_rel} - -d ${ofn_rel}.d - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - DEPFILE ${CMAKE_CURRENT_BINARY_DIR}/${ofn}.d + -o ${ofn} + -d ${ofn}.d + DEPFILE ${ofn}.d ) set(local_tds) set(global_tds)