mirror of
https://github.com/Kitware/CMake.git
synced 2026-02-04 22:29:40 -06:00
In certain cases, rebuilds with CMake using the CONFIGURE_DEPENDS flag with GLOB_RECURSE could result in a reconfigure loop due to CMP0009 not being propogated to the generated VerifyGlobs.cmake script. During the inital configuration phase, RecurseThroughSymlinksOn() is called for recursive glob operations either by having the CMP0009 status not set to NEW or by explicitly providing the FOLLOW_SYMLINKS flag. At the end when the VerifyGlobs script is created, the FOLLOW_SYMLINKS flag is written according to the final resolved form through a call to GetRecurseThroughSymlinks(). Thus, setting CMP0009 to NEW in the generated file is safe and allows correct behavior whether or not the end user sets the policy status to NEW or OLD.
151 lines
5.7 KiB
CMake
151 lines
5.7 KiB
CMake
include(RunCMake)
|
|
|
|
run_cmake(CREATE_LINK)
|
|
run_cmake(CREATE_LINK-COPY_ON_ERROR)
|
|
run_cmake(CREATE_LINK-noarg)
|
|
run_cmake(CREATE_LINK-noexist)
|
|
run_cmake(DOWNLOAD-hash-mismatch)
|
|
run_cmake(DOWNLOAD-unused-argument)
|
|
run_cmake(DOWNLOAD-httpheader-not-set)
|
|
run_cmake(DOWNLOAD-netrc-bad)
|
|
run_cmake(DOWNLOAD-pass-not-set)
|
|
run_cmake(TOUCH)
|
|
run_cmake(TOUCH-error-in-source-directory)
|
|
run_cmake(TOUCH-error-missing-directory)
|
|
run_cmake(UPLOAD-unused-argument)
|
|
run_cmake(UPLOAD-httpheader-not-set)
|
|
run_cmake(UPLOAD-netrc-bad)
|
|
run_cmake(UPLOAD-pass-not-set)
|
|
run_cmake(INSTALL-DIRECTORY)
|
|
run_cmake(INSTALL-FILES_FROM_DIR)
|
|
run_cmake(INSTALL-FILES_FROM_DIR-bad)
|
|
run_cmake(INSTALL-MESSAGE-bad)
|
|
run_cmake(FileOpenFailRead)
|
|
run_cmake(LOCK)
|
|
run_cmake(LOCK-error-file-create-fail)
|
|
run_cmake(LOCK-error-guard-incorrect)
|
|
run_cmake(LOCK-error-incorrect-timeout)
|
|
run_cmake(LOCK-error-incorrect-timeout-trail)
|
|
run_cmake(LOCK-error-lock-fail)
|
|
run_cmake(LOCK-error-negative-timeout)
|
|
run_cmake(LOCK-error-no-function)
|
|
run_cmake(LOCK-error-no-guard)
|
|
run_cmake(LOCK-error-no-path)
|
|
run_cmake(LOCK-error-no-result-variable)
|
|
run_cmake(LOCK-error-no-timeout)
|
|
run_cmake(LOCK-error-timeout)
|
|
run_cmake(LOCK-error-unknown-option)
|
|
run_cmake(LOCK-lowercase)
|
|
run_cmake(READ_ELF)
|
|
run_cmake(GLOB)
|
|
run_cmake(GLOB_RECURSE)
|
|
run_cmake(GLOB_RECURSE-noexp-FOLLOW_SYMLINKS)
|
|
run_cmake(SIZE)
|
|
run_cmake(SIZE-error-does-not-exist)
|
|
|
|
run_cmake(REMOVE-empty)
|
|
|
|
# tests are valid both for GLOB and GLOB_RECURSE
|
|
run_cmake(GLOB-sort-dedup)
|
|
run_cmake(GLOB-error-LIST_DIRECTORIES-not-boolean)
|
|
run_cmake(GLOB-error-LIST_DIRECTORIES-no-arg)
|
|
run_cmake(GLOB-error-RELATIVE-no-arg)
|
|
run_cmake(GLOB-error-CONFIGURE_DEPENDS-modified)
|
|
run_cmake(GLOB-noexp-CONFIGURE_DEPENDS)
|
|
run_cmake(GLOB-noexp-FOLLOW_SYMLINKS)
|
|
run_cmake(GLOB-noexp-LIST_DIRECTORIES)
|
|
run_cmake(GLOB-noexp-RELATIVE)
|
|
run_cmake_command(GLOB-error-CONFIGURE_DEPENDS-SCRIPT_MODE ${CMAKE_COMMAND} -P
|
|
${RunCMake_SOURCE_DIR}/GLOB-error-CONFIGURE_DEPENDS-SCRIPT_MODE.cmake)
|
|
|
|
if(NOT WIN32 OR CYGWIN)
|
|
run_cmake(CREATE_LINK-SYMBOLIC)
|
|
run_cmake(CREATE_LINK-SYMBOLIC-noexist)
|
|
run_cmake(GLOB_RECURSE-cyclic-recursion)
|
|
run_cmake(INSTALL-SYMLINK)
|
|
run_cmake(READ_SYMLINK)
|
|
run_cmake(READ_SYMLINK-noexist)
|
|
run_cmake(READ_SYMLINK-notsymlink)
|
|
run_cmake(INSTALL-FOLLOW_SYMLINK_CHAIN)
|
|
endif()
|
|
|
|
if(RunCMake_GENERATOR MATCHES "Ninja")
|
|
# Detect ninja version so we know what tests can be supported.
|
|
execute_process(
|
|
COMMAND "${RunCMake_MAKE_PROGRAM}" --version
|
|
OUTPUT_VARIABLE ninja_out
|
|
ERROR_VARIABLE ninja_out
|
|
RESULT_VARIABLE ninja_res
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
)
|
|
if(ninja_res EQUAL 0 AND "x${ninja_out}" MATCHES "^x[0-9]+\\.[0-9]+")
|
|
set(ninja_version "${ninja_out}")
|
|
message(STATUS "ninja version: ${ninja_version}")
|
|
else()
|
|
message(FATAL_ERROR "'ninja --version' reported:\n${ninja_out}")
|
|
endif()
|
|
|
|
if("${ninja_version}" VERSION_LESS 1.8)
|
|
message(STATUS "Ninja is too old for GLOB CONFIGURE_DEPENDS; expect a warning.")
|
|
endif()
|
|
endif()
|
|
|
|
if(RunCMake_GENERATOR MATCHES "Ninja" AND "${ninja_version}" VERSION_LESS 1.8)
|
|
run_cmake(GLOB_RECURSE-warn-CONFIGURE_DEPENDS-ninja-version)
|
|
else()
|
|
run_cmake(GLOB-warn-CONFIGURE_DEPENDS-late)
|
|
|
|
# Use a single build tree for a few tests without cleaning.
|
|
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/GLOB-CONFIGURE_DEPENDS-RerunCMake-build)
|
|
set(RunCMake_TEST_NO_CLEAN 1)
|
|
set(RunCMake_DEFAULT_stderr ".*")
|
|
if(RunCMake_GENERATOR STREQUAL "Borland Makefiles" OR
|
|
RunCMake_GENERATOR STREQUAL "Watcom WMake")
|
|
set(fs_delay 3)
|
|
else()
|
|
set(fs_delay 1.125)
|
|
endif()
|
|
|
|
file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
|
|
file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}/test")
|
|
set(tf_1 "${RunCMake_TEST_BINARY_DIR}/test/1.txt")
|
|
file(WRITE "${tf_1}" "1")
|
|
|
|
message(STATUS "GLOB-CONFIGURE_DEPENDS-RerunCMake: first configuration...")
|
|
run_cmake(GLOB-CONFIGURE_DEPENDS-RerunCMake)
|
|
run_cmake_command(GLOB-CONFIGURE_DEPENDS-RerunCMake-build ${CMAKE_COMMAND} --build .)
|
|
|
|
execute_process(COMMAND ${CMAKE_COMMAND} -E sleep ${fs_delay})
|
|
message(STATUS "GLOB-CONFIGURE_DEPENDS-RerunCMake: add another file...")
|
|
file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}/test/sub")
|
|
set(tf_2 "${RunCMake_TEST_BINARY_DIR}/test/sub/2.txt")
|
|
file(WRITE "${tf_2}" "2")
|
|
run_cmake_command(GLOB-CONFIGURE_DEPENDS-RerunCMake-rebuild_first ${CMAKE_COMMAND} --build .)
|
|
run_cmake_command(GLOB-CONFIGURE_DEPENDS-RerunCMake-nowork ${CMAKE_COMMAND} --build .)
|
|
|
|
execute_process(COMMAND ${CMAKE_COMMAND} -E sleep ${fs_delay})
|
|
message(STATUS "GLOB-CONFIGURE_DEPENDS-RerunCMake: remove first test file...")
|
|
file(REMOVE "${tf_1}")
|
|
run_cmake_command(GLOB-CONFIGURE_DEPENDS-RerunCMake-rebuild_second ${CMAKE_COMMAND} --build .)
|
|
run_cmake_command(GLOB-CONFIGURE_DEPENDS-RerunCMake-nowork ${CMAKE_COMMAND} --build .)
|
|
|
|
if(NOT WIN32 OR CYGWIN)
|
|
message(STATUS "GLOB-CONFIGURE_DEPENDS-CMP0009-RerunCMake: link the first test directory into a new directory...")
|
|
file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}/test2")
|
|
execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink "${RunCMake_TEST_BINARY_DIR}/test" "${RunCMake_TEST_BINARY_DIR}/test2/test_folder_symlink")
|
|
|
|
message(STATUS "GLOB-CONFIGURE_DEPENDS-CMP0009-RerunCMake: first configuration...")
|
|
run_cmake(GLOB-CONFIGURE_DEPENDS-CMP0009-RerunCMake)
|
|
run_cmake_command(GLOB-CONFIGURE_DEPENDS-CMP0009-RerunCMake-build ${CMAKE_COMMAND} --build .)
|
|
|
|
message(STATUS "GLOB-CONFIGURE_DEPENDS-CMP0009-RerunCMake: add another file in the linked directory...")
|
|
set(tf_3 "${RunCMake_TEST_BINARY_DIR}/test/3.txt")
|
|
file(WRITE "${tf_3}" "3")
|
|
run_cmake_command(GLOB-CONFIGURE_DEPENDS-CMP0009-RerunCMake-rebuild ${CMAKE_COMMAND} --build .)
|
|
endif()
|
|
|
|
unset(RunCMake_TEST_BINARY_DIR)
|
|
unset(RunCMake_TEST_NO_CLEAN)
|
|
unset(RunCMake_DEFAULT_stderr)
|
|
endif()
|