Merge topic 'link-flags-runcmake'

3ea9d225f7 Tests: Port LinkFlags test to RunCMake
e41256b568 Tests: Move LinkFlags static tests to RunCMake.LinkStatic
d38c268f4d Tests/LinkStatic: Standardize RunCMake use where possible
48e08cb757 Tests/RunCMake: Fix typos in README.rst
12089b576c Tests/RunCMake: Prefer `RunCMake_TEST_EXPECT_*` if set

Acked-by: Kitware Robot <kwrobot@kitware.com>
Tested-by: buildbot <buildbot@kitware.com>
Merge-request: !11615
This commit is contained in:
Brad King
2026-01-23 13:51:56 +00:00
committed by Kitware Robot
60 changed files with 197 additions and 141 deletions

View File

@@ -766,44 +766,6 @@ if(BUILD_TESTING)
)
endif()
add_test(LinkFlags-prepare
${CMAKE_CTEST_COMMAND} -C \${CTEST_CONFIGURATION_TYPE}
--build-and-test
"${CMake_SOURCE_DIR}/Tests/LinkFlags"
"${CMake_BINARY_DIR}/Tests/LinkFlags"
${build_generator_args}
--build-project LinkFlags
--build-target LinkFlags
--build-options
-DTEST_CONFIG=\${CTEST_CONFIGURATION_TYPE}
)
list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/LinkFlags")
macro(ADD_LINK_FLAGS_TEST name depends)
add_test(LinkFlags-${name}
${CMAKE_CMAKE_COMMAND} --build "${CMake_BINARY_DIR}/Tests/LinkFlags"
--target LinkFlags_${name} --config \${CTEST_CONFIGURATION_TYPE}
)
set_tests_properties(LinkFlags-${name} PROPERTIES
PASS_REGULAR_EXPRESSION "BADFLAG" DEPENDS LinkFlags-${depends})
endmacro()
ADD_LINK_FLAGS_TEST(lib prepare)
ADD_LINK_FLAGS_TEST(dll lib)
ADD_LINK_FLAGS_TEST(mod dll)
ADD_LINK_FLAGS_TEST(exe mod)
ADD_LINK_FLAGS_TEST(lib_config exe)
ADD_LINK_FLAGS_TEST(dll_config lib_config)
ADD_LINK_FLAGS_TEST(mod_config dll_config)
ADD_LINK_FLAGS_TEST(exe_config mod_config)
ADD_LINK_FLAGS_TEST(lib_flags exe_config)
ADD_LINK_FLAGS_TEST(dll_flags lib_flags)
ADD_LINK_FLAGS_TEST(mod_flags dll_flags)
ADD_LINK_FLAGS_TEST(exe_flags mod_flags)
ADD_LINK_FLAGS_TEST(lib_flags_config exe_flags)
ADD_LINK_FLAGS_TEST(dll_flags_config lib_flags_config)
ADD_LINK_FLAGS_TEST(mod_flags_config dll_flags_config)
ADD_LINK_FLAGS_TEST(exe_flags_config mod_flags_config)
# test for correct sub-project generation
# not implemented in Xcode or Ninja
if(NOT CMAKE_GENERATOR MATCHES "Xcode|Ninja|FASTBuild")

View File

@@ -1,42 +0,0 @@
cmake_minimum_required(VERSION 3.10)
project(LinkFlags C)
string(TOUPPER "${TEST_CONFIG}" TEST_CONFIG_UPPER)
set(obj "${CMAKE_C_OUTPUT_EXTENSION}")
if(BORLAND)
set(pre -)
endif()
add_library(LinkFlags_lib STATIC LinkFlagsLib.c)
set_property(TARGET LinkFlags_lib PROPERTY STATIC_LIBRARY_FLAGS ${pre}BADFLAG${obj})
add_library(LinkFlags_dll SHARED LinkFlagsLib.c)
set_property(TARGET LinkFlags_dll PROPERTY LINK_FLAGS ${pre}BADFLAG${obj})
add_library(LinkFlags_mod MODULE LinkFlagsLib.c)
set_property(TARGET LinkFlags_mod PROPERTY LINK_FLAGS ${pre}BADFLAG${obj})
add_executable(LinkFlags_exe LinkFlagsExe.c)
set_property(TARGET LinkFlags_exe PROPERTY LINK_FLAGS ${pre}BADFLAG${obj})
add_library(LinkFlags_lib_config STATIC LinkFlagsLib.c)
set_property(TARGET LinkFlags_lib_config PROPERTY STATIC_LIBRARY_FLAGS_${TEST_CONFIG_UPPER} ${pre}BADFLAG_${TEST_CONFIG}${obj})
add_library(LinkFlags_dll_config SHARED LinkFlagsLib.c)
set_property(TARGET LinkFlags_dll_config PROPERTY LINK_FLAGS_${TEST_CONFIG_UPPER} ${pre}BADFLAG_${TEST_CONFIG}${obj})
add_library(LinkFlags_mod_config MODULE LinkFlagsLib.c)
set_property(TARGET LinkFlags_mod_config PROPERTY LINK_FLAGS_${TEST_CONFIG_UPPER} ${pre}BADFLAG_${TEST_CONFIG}${obj})
add_executable(LinkFlags_exe_config LinkFlagsExe.c)
set_property(TARGET LinkFlags_exe_config PROPERTY LINK_FLAGS_${TEST_CONFIG_UPPER} ${pre}BADFLAG_${TEST_CONFIG}${obj})
add_executable(LinkFlags LinkFlags.c)
if("x${CMAKE_C_COMPILER_ID}" STREQUAL "xMSVC")
set_property(TARGET LinkFlags PROPERTY
LINK_FLAGS "/NODEFAULTLIB:\"libcdg.lib\" /NODEFAULTLIB:\"libcmtg.lib\" /NODEFAULTLIB:\"foomsvcrt.lib\" /NODEFAULTLIB:\"libbar.lib\" /NODEFAULTLIB:\"libfooba.lib\""
)
endif()
add_subdirectory(LinkerFlags)
add_subdirectory(LinkerFlagsConfig)

View File

@@ -1,9 +0,0 @@
int main(void)
{
return 0;
}
/* Intel compiler does not reject bad flags or objects! */
#if defined(__INTEL_COMPILER)
# error BADFLAG
#endif

View File

@@ -1,9 +0,0 @@
int flags_lib(void)
{
return 0;
}
/* Intel compiler does not reject bad flags or objects! */
#if defined(__INTEL_COMPILER)
# error BADFLAG
#endif

View File

@@ -1,11 +0,0 @@
set(CMAKE_STATIC_LINKER_FLAGS ${pre}BADFLAG${obj})
add_library(LinkFlags_lib_flags STATIC ../LinkFlagsLib.c)
set(CMAKE_SHARED_LINKER_FLAGS ${pre}BADFLAG${obj})
add_library(LinkFlags_dll_flags SHARED ../LinkFlagsLib.c)
set(CMAKE_MODULE_LINKER_FLAGS ${pre}BADFLAG${obj})
add_library(LinkFlags_mod_flags MODULE ../LinkFlagsLib.c)
set(CMAKE_EXE_LINKER_FLAGS ${pre}BADFLAG${obj})
add_executable(LinkFlags_exe_flags ../LinkFlagsExe.c)

View File

@@ -1,11 +0,0 @@
set(CMAKE_STATIC_LINKER_FLAGS_${TEST_CONFIG_UPPER} ${pre}BADFLAG${obj})
add_library(LinkFlags_lib_flags_config STATIC ../LinkFlagsLib.c)
set(CMAKE_SHARED_LINKER_FLAGS_${TEST_CONFIG_UPPER} ${pre}BADFLAG${obj})
add_library(LinkFlags_dll_flags_config SHARED ../LinkFlagsLib.c)
set(CMAKE_MODULE_LINKER_FLAGS_${TEST_CONFIG_UPPER} ${pre}BADFLAG${obj})
add_library(LinkFlags_mod_flags_config MODULE ../LinkFlagsLib.c)
set(CMAKE_EXE_LINKER_FLAGS_${TEST_CONFIG_UPPER} ${pre}BADFLAG${obj})
add_executable(LinkFlags_exe_flags_config ../LinkFlagsExe.c)

View File

@@ -989,6 +989,7 @@ endif()
add_RunCMake_test(LinkLibrariesProcessing)
add_RunCMake_test(LinkLibrariesStrategy)
add_RunCMake_test(LinkFlags)
add_RunCMake_test(File_Archive -DPython_EXECUTABLE=${Python_EXECUTABLE})
add_RunCMake_test(File_Configure)
add_RunCMake_test(File_Generate)

View File

@@ -0,0 +1 @@
[^0]

View File

@@ -0,0 +1 @@
.*BADFLAG_EXECUTABLE.*

View File

@@ -0,0 +1 @@
[^0]

View File

@@ -0,0 +1 @@
.*BADFLAG_MODULE.*

View File

@@ -0,0 +1 @@
[^0]

View File

@@ -0,0 +1 @@
.*BADFLAG_SHARED.*

View File

@@ -0,0 +1,8 @@
set(CMAKE_SHARED_LINKER_FLAGS ${pre}BADFLAG_SHARED${obj})
add_library(LinkFlags_shared SHARED LinkFlagsLib.c)
set(CMAKE_MODULE_LINKER_FLAGS ${pre}BADFLAG_MODULE${obj})
add_library(LinkFlags_mod MODULE LinkFlagsLib.c)
set(CMAKE_EXE_LINKER_FLAGS ${pre}BADFLAG_EXECUTABLE${obj})
add_executable(LinkFlags_exe LinkFlagsExe.c)

View File

@@ -0,0 +1 @@
[^0]

View File

@@ -0,0 +1 @@
.*BADFLAG_EXECUTABLE_RELEASE.*

View File

@@ -0,0 +1 @@
[^0]

View File

@@ -0,0 +1 @@
.*BADFLAG_MODULE_RELEASE.*

View File

@@ -0,0 +1 @@
[^0]

View File

@@ -0,0 +1 @@
.*BADFLAG_SHARED_RELEASE.*

View File

@@ -0,0 +1,8 @@
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE ${pre}BADFLAG_SHARED_RELEASE${obj})
add_library(LinkFlags_shared SHARED LinkFlagsLib.c)
set(CMAKE_MODULE_LINKER_FLAGS_RELEASE ${pre}BADFLAG_MODULE_RELEASE${obj})
add_library(LinkFlags_mod MODULE LinkFlagsLib.c)
set(CMAKE_EXE_LINKER_FLAGS_RELEASE ${pre}BADFLAG_EXECUTABLE_RELEASE${obj})
add_executable(LinkFlags_exe LinkFlagsExe.c)

View File

@@ -0,0 +1,9 @@
cmake_minimum_required(VERSION 3.10)
project(${RunCMake_TEST} C)
set(obj "${CMAKE_C_OUTPUT_EXTENSION}")
if(BORLAND)
set(pre -)
endif()
include(${RunCMake_TEST}.cmake)

View File

@@ -0,0 +1 @@
[^0]

View File

@@ -0,0 +1 @@
.*BADFLAG_EXECUTABLE.*

View File

@@ -0,0 +1 @@
[^0]

View File

@@ -0,0 +1 @@
.*BADFLAG_MODULE.*

View File

@@ -0,0 +1 @@
[^0]

View File

@@ -0,0 +1 @@
.*BADFLAG_SHARED.*

View File

@@ -0,0 +1,8 @@
add_library(LinkFlags_shared SHARED LinkFlagsLib.c)
set_property(TARGET LinkFlags_shared PROPERTY LINK_FLAGS ${pre}BADFLAG_SHARED${obj})
add_library(LinkFlags_mod MODULE LinkFlagsLib.c)
set_property(TARGET LinkFlags_mod PROPERTY LINK_FLAGS ${pre}BADFLAG_MODULE${obj})
add_executable(LinkFlags_exe LinkFlagsExe.c)
set_property(TARGET LinkFlags_exe PROPERTY LINK_FLAGS ${pre}BADFLAG_EXECUTABLE${obj})

View File

@@ -0,0 +1 @@
[^0]

View File

@@ -0,0 +1 @@
.*BADFLAG_EXECUTABLE_RELEASE.*

View File

@@ -0,0 +1 @@
[^0]

View File

@@ -0,0 +1 @@
.*BADFLAG_MODULE_RELEASE.*

View File

@@ -0,0 +1 @@
[^0]

View File

@@ -0,0 +1 @@
.*BADFLAG_SHARED_RELEASE.*

View File

@@ -0,0 +1,8 @@
add_library(LinkFlags_shared SHARED LinkFlagsLib.c)
set_property(TARGET LinkFlags_shared PROPERTY LINK_FLAGS_RELEASE ${pre}BADFLAG_SHARED_RELEASE${obj})
add_library(LinkFlags_mod MODULE LinkFlagsLib.c)
set_property(TARGET LinkFlags_mod PROPERTY LINK_FLAGS_RELEASE ${pre}BADFLAG_MODULE_RELEASE${obj})
add_executable(LinkFlags_exe LinkFlagsExe.c)
set_property(TARGET LinkFlags_exe PROPERTY LINK_FLAGS_RELEASE ${pre}BADFLAG_EXECUTABLE_RELEASE${obj})

View File

@@ -0,0 +1,4 @@
int flags_lib(void)
{
return 0;
}

View File

@@ -0,0 +1,45 @@
include(RunCMake)
macro(run_cmake_target test subtest)
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${test}-build)
set(RunCMake_TEST_NO_CLEAN 1)
run_cmake_command(${test}-${subtest}
${CMAKE_COMMAND} --build .
--target LinkFlags_${subtest}
${ARGN}
)
unset(RunCMake_TEST_BINARY_DIR)
unset(RunCMake_TEST_NO_CLEAN)
endmacro()
if (NOT CMAKE_C_COMPILER_ID STREQUAL "Intel")
# Intel compiler does not reject bad flags or objects!
set(RunCMake_TEST_OUTPUT_MERGE TRUE)
if (NOT RunCMake_GENERATOR_IS_MULTI_CONFIG)
set(RunCMake_TEST_OPTIONS -DCMAKE_BUILD_TYPE=Release)
endif()
run_cmake(LINK_FLAGS)
run_cmake_target(LINK_FLAGS shared)
run_cmake_target(LINK_FLAGS mod)
run_cmake_target(LINK_FLAGS exe)
run_cmake(LINK_FLAGS_CONFIG)
run_cmake_target(LINK_FLAGS_CONFIG shared --config Release)
run_cmake_target(LINK_FLAGS_CONFIG mod --config Release)
run_cmake_target(LINK_FLAGS_CONFIG exe --config Release)
run_cmake(CMAKE_LINKER_FLAGS)
run_cmake_target(CMAKE_LINKER_FLAGS shared)
run_cmake_target(CMAKE_LINKER_FLAGS mod)
run_cmake_target(CMAKE_LINKER_FLAGS exe)
run_cmake(CMAKE_LINKER_FLAGS_CONFIG)
run_cmake_target(CMAKE_LINKER_FLAGS_CONFIG shared --config Release)
run_cmake_target(CMAKE_LINKER_FLAGS_CONFIG mod --config Release)
run_cmake_target(CMAKE_LINKER_FLAGS_CONFIG exe --config Release)
unset(RunCMake_TEST_OPTIONS)
unset(RunCMake_TEST_OUTPUT_MERGE)
endif()

View File

@@ -0,0 +1 @@
[^0]

View File

@@ -0,0 +1 @@
.*BADFLAG.*

View File

@@ -0,0 +1,13 @@
enable_language(C)
set(obj "${CMAKE_C_OUTPUT_EXTENSION}")
if(BORLAND)
set(pre -)
endif()
set(CMAKE_STATIC_LINKER_FLAGS ${pre}BADFLAG${obj})
add_library(CMakeStaticLinkerFlags STATIC LinkOptionsLib.c)
# shared library do not use CMAKE_STATIC_LINKER_FLAGS
add_library(SharedCMakeStaticLinkerFlags SHARED LinkOptionsLib.c)

View File

@@ -0,0 +1 @@
.*BADFLAG_RELEASE.*

View File

@@ -0,0 +1,14 @@
enable_language(C)
set(obj "${CMAKE_C_OUTPUT_EXTENSION}")
if(BORLAND)
set(pre -)
endif()
# CMAKE_STATIC_LINKER_FLAGS_<CONFIG> variant
set(CMAKE_STATIC_LINKER_FLAGS_RELEASE ${pre}BADFLAG_RELEASE${obj})
add_library(CMakeStaticLinkerFlags_config STATIC LinkOptionsLib.c)
# shared library do not use CMAKE_STATIC_LINKER_FLAGS_<CONFIG>
add_library(SharedCMakeStaticLinkerFlags_config SHARED LinkOptionsLib.c)

View File

@@ -6,6 +6,9 @@ run_cmake(LINK_SEARCH_STATIC)
macro(run_cmake_target test subtest target)
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${test}-build)
set(RunCMake_TEST_NO_CLEAN 1)
if(RunCMake_GENERATOR STREQUAL "Borland Makefiles")
set(RunCMake_TEST_EXPECT_RESULT .)
endif()
run_cmake_command(${test}-${subtest} ${CMAKE_COMMAND} --build . --target ${target} ${ARGN})
unset(RunCMake_TEST_BINARY_DIR)
@@ -25,6 +28,19 @@ if (NOT CMAKE_C_COMPILER_ID STREQUAL "Intel")
run_cmake_target(STATIC_LIBRARY_OPTIONS genex StaticLinkOptions_genex --config Release)
run_cmake_target(STATIC_LIBRARY_OPTIONS shared SharedLinkOptions)
run_cmake(STATIC_LIBRARY_FLAGS)
run_cmake_target(STATIC_LIBRARY_FLAGS basic StaticLinkFlags)
run_cmake_target(STATIC_LIBRARY_FLAGS config StaticLinkFlags_config --config Release)
run_cmake_target(STATIC_LIBRARY_FLAGS shared SharedLinkFlags)
run_cmake(CMAKE_STATIC_LINKER_FLAGS)
run_cmake_target(CMAKE_STATIC_LINKER_FLAGS basic CMakeStaticLinkerFlags)
run_cmake_target(CMAKE_STATIC_LINKER_FLAGS shared SharedCMakeStaticLinkerFlags)
run_cmake(CMAKE_STATIC_LINKER_FLAGS_CONFIG)
run_cmake_target(CMAKE_STATIC_LINKER_FLAGS_CONFIG basic CMakeStaticLinkerFlags_config --config Release)
run_cmake_target(CMAKE_STATIC_LINKER_FLAGS_CONFIG shared SharedCMakeStaticLinkerFlags_config --config Release)
unset(RunCMake_TEST_OPTIONS)
unset(RunCMake_TEST_OUTPUT_MERGE)
endif()

View File

@@ -0,0 +1 @@
[^0]

View File

@@ -0,0 +1 @@
.*BADFLAG.*

View File

@@ -0,0 +1 @@
[^0]

View File

@@ -0,0 +1 @@
.*BADFLAG_RELEASE.*

View File

@@ -0,0 +1,18 @@
enable_language(C)
set(obj "${CMAKE_C_OUTPUT_EXTENSION}")
if(BORLAND)
set(pre -)
endif()
add_library(StaticLinkFlags STATIC LinkOptionsLib.c)
set_property(TARGET StaticLinkFlags PROPERTY STATIC_LIBRARY_FLAGS ${pre}BADFLAG${obj})
# STATIC_LIBRARY_FLAGS_<CONFIG> variant
add_library(StaticLinkFlags_config STATIC LinkOptionsLib.c)
set_property(TARGET StaticLinkFlags_config PROPERTY STATIC_LIBRARY_FLAGS_RELEASE ${pre}BADFLAG_RELEASE${obj})
# shared library do not use property STATIC_LIBRARY_FLAGS
add_library(SharedLinkFlags SHARED LinkOptionsLib.c)
set_property(TARGET SharedLinkFlags PROPERTY STATIC_LIBRARY_FLAGS ${pre}BADFLAG${obj})

View File

@@ -1,4 +0,0 @@
if (NOT actual_stdout MATCHES "BADFLAG")
set (RunCMake_TEST_FAILED "Not found expected 'BADFLAG'.")
endif()

View File

@@ -0,0 +1 @@
.*BADFLAG.*

View File

@@ -1,4 +0,0 @@
if (actual_stdout MATCHES "BADFLAG")
string (APPEND RunCMake_TEST_FAILED "\nFound unexpected flag 'BADFLAG'.")
endif()

View File

@@ -152,7 +152,7 @@ customized by setting the following variables before a call.
``RunCMake_GENERATOR``
CMake generator to use when configuring projects.
This provided to ``RunCMakeTest.cmake`` scripts automatically
This is provided to ``RunCMakeTest.cmake`` scripts automatically
when they are executed, based on the CMake generator used to
configure the test suite.
@@ -170,18 +170,18 @@ customized by setting the following variables before a call.
``RunCMake_GENERATOR_IS_MULTI_CONFIG``
Boolean value indicating whether ``${RunCMake_GENERATOR}`` is a
multi-config generator.
This provided to ``RunCMakeTest.cmake`` scripts automatically
This is provided to ``RunCMakeTest.cmake`` scripts automatically
when they are executed, based on the CMake generator used to
configure the test suite.
``RunCMake_SOURCE_DIR``
Absolute path to the ``Tests/RunCMake/<Test>`` directory in
the CMake source tree. This provided to ``RunCMakeTest.cmake``
the CMake source tree. This is provided to ``RunCMakeTest.cmake``
scripts automatically when they are executed.
``RunCMake_BINARY_DIR``
Absolute path to the ``Tests/RunCMake/<Test>`` directory in
the CMake binary tree. This provided to ``RunCMakeTest.cmake``
the CMake binary tree. This is provided to ``RunCMakeTest.cmake``
scripts automatically when they are executed.
``RunCMake_TEST_SOURCE_DIR``

View File

@@ -24,11 +24,11 @@ function(run_cmake test)
set(top_src "${RunCMake_SOURCE_DIR}")
set(top_bin "${RunCMake_BINARY_DIR}")
if(EXISTS ${top_src}/${test}-result.txt)
if(DEFINED RunCMake_TEST_EXPECT_RESULT)
set(expect_result "${RunCMake_TEST_EXPECT_RESULT}")
elseif(EXISTS ${top_src}/${test}-result.txt)
file(READ ${top_src}/${test}-result.txt expect_result)
string(REGEX REPLACE "\n+$" "" expect_result "${expect_result}")
elseif(DEFINED RunCMake_TEST_EXPECT_RESULT)
set(expect_result "${RunCMake_TEST_EXPECT_RESULT}")
else()
set(expect_result 0)
endif()
@@ -43,7 +43,9 @@ function(run_cmake test)
endif()
foreach(o IN ITEMS stdout stderr config)
if(RunCMake-${o}-file AND EXISTS ${top_src}/${RunCMake-${o}-file})
if(DEFINED RunCMake_TEST_EXPECT_${o})
string(REGEX REPLACE "\n+$" "" expect_${o} "${RunCMake_TEST_EXPECT_${o}}")
elseif(RunCMake-${o}-file AND EXISTS ${top_src}/${RunCMake-${o}-file})
file(READ ${top_src}/${RunCMake-${o}-file} expect_${o})
string(REGEX REPLACE "\n+$" "" expect_${o} "${expect_${o}}")
elseif(EXISTS ${top_src}/${test}-${o}-${platform_name}.txt)
@@ -52,8 +54,6 @@ function(run_cmake test)
elseif(EXISTS ${top_src}/${test}-${o}.txt)
file(READ ${top_src}/${test}-${o}.txt expect_${o})
string(REGEX REPLACE "\n+$" "" expect_${o} "${expect_${o}}")
elseif(DEFINED RunCMake_TEST_EXPECT_${o})
string(REGEX REPLACE "\n+$" "" expect_${o} "${RunCMake_TEST_EXPECT_${o}}")
else()
unset(expect_${o})
endif()