summaryrefslogtreecommitdiffstats
path: root/Tests/RunCMake
diff options
context:
space:
mode:
authorMartin Duffy <martin.duffy@kitware.com>2024-05-22 20:08:54 (GMT)
committerMartin Duffy <martin.duffy@kitware.com>2024-05-23 13:54:19 (GMT)
commit0e5250e63c5c82ff0c8b52ade9c2f84fbe251152 (patch)
tree0422addf568db0beac59800fe1cc5578fb74e09f /Tests/RunCMake
parentdaeb8fffa2d30cf6737c60f22c151d10581783ac (diff)
downloadCMake-0e5250e63c5c82ff0c8b52ade9c2f84fbe251152.zip
CMake-0e5250e63c5c82ff0c8b52ade9c2f84fbe251152.tar.gz
CMake-0e5250e63c5c82ff0c8b52ade9c2f84fbe251152.tar.bz2
Ninja: Add option for parallel install
Adds the global property ``INSTALL_PARALLEL`` to enable a parallel install target for Ninja. Fixes: #25459
Diffstat (limited to 'Tests/RunCMake')
-rw-r--r--Tests/RunCMake/CMakeLists.txt1
-rw-r--r--Tests/RunCMake/InstallParallel/CMakeLists.txt3
-rw-r--r--Tests/RunCMake/InstallParallel/RunCMakeTest.cmake17
-rw-r--r--Tests/RunCMake/InstallParallel/check-parallel.cmake15
-rw-r--r--Tests/RunCMake/InstallParallel/check-single.cmake5
-rw-r--r--Tests/RunCMake/InstallParallel/install.cmake6
-rw-r--r--Tests/RunCMake/InstallParallel/no-parallel-install-stderr.txt5
-rw-r--r--Tests/RunCMake/InstallParallel/parallel-install-stdout.txt15
-rw-r--r--Tests/RunCMake/InstallParallel/read-ninja-install.cmake4
-rw-r--r--Tests/RunCMake/InstallParallel/subdir-1/CMakeLists.txt3
-rw-r--r--Tests/RunCMake/InstallParallel/subdir-1/subdir-3/CMakeLists.txt1
-rw-r--r--Tests/RunCMake/InstallParallel/subdir-1/subdir-4/CMakeLists.txt1
-rw-r--r--Tests/RunCMake/InstallParallel/subdir-2/CMakeLists.txt1
13 files changed, 77 insertions, 0 deletions
diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt
index ec05b90..aa2117e 100644
--- a/Tests/RunCMake/CMakeLists.txt
+++ b/Tests/RunCMake/CMakeLists.txt
@@ -250,6 +250,7 @@ if(CMAKE_GENERATOR MATCHES "Ninja")
add_RunCMake_test(NinjaPrivateDeps
-DCMAKE_C_OUTPUT_EXTENSION=${CMAKE_C_OUTPUT_EXTENSION}
-DRunCMake_GENERATOR_IS_MULTI_CONFIG=${_isMultiConfig})
+ add_RunCMake_test(InstallParallel)
endif()
add_RunCMake_test(CTest)
diff --git a/Tests/RunCMake/InstallParallel/CMakeLists.txt b/Tests/RunCMake/InstallParallel/CMakeLists.txt
new file mode 100644
index 0000000..94e43ba
--- /dev/null
+++ b/Tests/RunCMake/InstallParallel/CMakeLists.txt
@@ -0,0 +1,3 @@
+cmake_minimum_required(VERSION 3.29)
+project(${RunCMake_TEST} NONE)
+include(${RunCMake_TEST}.cmake)
diff --git a/Tests/RunCMake/InstallParallel/RunCMakeTest.cmake b/Tests/RunCMake/InstallParallel/RunCMakeTest.cmake
new file mode 100644
index 0000000..ae3f112
--- /dev/null
+++ b/Tests/RunCMake/InstallParallel/RunCMakeTest.cmake
@@ -0,0 +1,17 @@
+include(RunCMake)
+
+function(install_test test parallel install_target check_script)
+ set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${test}-install)
+ set(RunCMake_TEST_OPTIONS -DINSTALL_PARALLEL=${parallel})
+ if (NOT RunCMake_GENERATOR_IS_MULTI_CONFIG)
+ list(APPEND RunCMake_TEST_OPTIONS -DCMAKE_BUILD_TYPE=Debug)
+ endif()
+ run_cmake(install)
+ set(RunCMake_TEST_NO_CLEAN 1)
+ run_cmake_command(${test}-install ${CMAKE_COMMAND} --build . --config Debug -t ${install_target})
+ set(RunCMake_TEST_COMMAND_WORKING_DIRECTORY ${RunCMake_SOURCE_DIR})
+ run_cmake_command(verify-parallel ${CMAKE_COMMAND} -P ${check_script} ${RunCMake_TEST_BINARY_DIR}/.ninja_log)
+endfunction()
+
+install_test(parallel 1 install/parallel check-parallel.cmake)
+install_test(no-parallel 0 install check-single.cmake)
diff --git a/Tests/RunCMake/InstallParallel/check-parallel.cmake b/Tests/RunCMake/InstallParallel/check-parallel.cmake
new file mode 100644
index 0000000..4e4cf52
--- /dev/null
+++ b/Tests/RunCMake/InstallParallel/check-parallel.cmake
@@ -0,0 +1,15 @@
+include(read-ninja-install.cmake)
+
+foreach(line ${lines})
+ string(REPLACE "\t" ";" line ${line})
+ list(GET line 0 start)
+ list(GET line 1 end)
+ list(APPEND start_times ${start})
+ list(APPEND end_times ${end})
+endforeach()
+list(GET start_times 1 start_2)
+list(GET end_times 0 end_1)
+
+if (NOT start_2 LESS end_1)
+ message(FATAL_ERROR "Install is not parallel")
+endif()
diff --git a/Tests/RunCMake/InstallParallel/check-single.cmake b/Tests/RunCMake/InstallParallel/check-single.cmake
new file mode 100644
index 0000000..79c4d5c
--- /dev/null
+++ b/Tests/RunCMake/InstallParallel/check-single.cmake
@@ -0,0 +1,5 @@
+include(read-ninja-install.cmake)
+list(LENGTH lines len)
+if (NOT ${len} STREQUAL "1")
+ message(FATAL_ERROR "Expected single installation call")
+endif()
diff --git a/Tests/RunCMake/InstallParallel/install.cmake b/Tests/RunCMake/InstallParallel/install.cmake
new file mode 100644
index 0000000..54b5078
--- /dev/null
+++ b/Tests/RunCMake/InstallParallel/install.cmake
@@ -0,0 +1,6 @@
+install(CODE "message(installing:${CMAKE_CURRENT_SOURCE_DIR})")
+if (INSTALL_PARALLEL)
+ set_property(GLOBAL PROPERTY INSTALL_PARALLEL ON)
+endif()
+add_subdirectory(subdir-1)
+add_subdirectory(subdir-2)
diff --git a/Tests/RunCMake/InstallParallel/no-parallel-install-stderr.txt b/Tests/RunCMake/InstallParallel/no-parallel-install-stderr.txt
new file mode 100644
index 0000000..8f69a04
--- /dev/null
+++ b/Tests/RunCMake/InstallParallel/no-parallel-install-stderr.txt
@@ -0,0 +1,5 @@
+installing:.*
+installing:.*
+installing:.*
+installing:.*
+installing:.*
diff --git a/Tests/RunCMake/InstallParallel/parallel-install-stdout.txt b/Tests/RunCMake/InstallParallel/parallel-install-stdout.txt
new file mode 100644
index 0000000..e0d2a56
--- /dev/null
+++ b/Tests/RunCMake/InstallParallel/parallel-install-stdout.txt
@@ -0,0 +1,15 @@
+\[1\/5\] Installing only the local directory...
+\-\- Install configuration: \"Debug\"
+installing:.*
+\[2\/5\] Installing only the local directory...
+\-\- Install configuration: \"Debug\"
+installing:.*
+\[3\/5\] Installing only the local directory...
+\-\- Install configuration: \"Debug\"
+installing:.*
+\[4\/5\] Installing only the local directory...
+\-\- Install configuration: \"Debug\"
+installing:.*
+\[5\/5\] Installing only the local directory...
+\-\- Install configuration: \"Debug\"
+installing:.*
diff --git a/Tests/RunCMake/InstallParallel/read-ninja-install.cmake b/Tests/RunCMake/InstallParallel/read-ninja-install.cmake
new file mode 100644
index 0000000..731c5eb
--- /dev/null
+++ b/Tests/RunCMake/InstallParallel/read-ninja-install.cmake
@@ -0,0 +1,4 @@
+set(ninja_log ${CMAKE_ARGV3})
+file(STRINGS ${ninja_log} lines)
+list(POP_FRONT lines)
+list(FILTER lines INCLUDE REGEX ".*install.*util")
diff --git a/Tests/RunCMake/InstallParallel/subdir-1/CMakeLists.txt b/Tests/RunCMake/InstallParallel/subdir-1/CMakeLists.txt
new file mode 100644
index 0000000..6b235c4
--- /dev/null
+++ b/Tests/RunCMake/InstallParallel/subdir-1/CMakeLists.txt
@@ -0,0 +1,3 @@
+install(CODE "message(installing:${CMAKE_CURRENT_SOURCE_DIR})")
+add_subdirectory(subdir-3)
+add_subdirectory(subdir-4)
diff --git a/Tests/RunCMake/InstallParallel/subdir-1/subdir-3/CMakeLists.txt b/Tests/RunCMake/InstallParallel/subdir-1/subdir-3/CMakeLists.txt
new file mode 100644
index 0000000..dd7eac3
--- /dev/null
+++ b/Tests/RunCMake/InstallParallel/subdir-1/subdir-3/CMakeLists.txt
@@ -0,0 +1 @@
+install(CODE "message(installing:${CMAKE_CURRENT_SOURCE_DIR})")
diff --git a/Tests/RunCMake/InstallParallel/subdir-1/subdir-4/CMakeLists.txt b/Tests/RunCMake/InstallParallel/subdir-1/subdir-4/CMakeLists.txt
new file mode 100644
index 0000000..dd7eac3
--- /dev/null
+++ b/Tests/RunCMake/InstallParallel/subdir-1/subdir-4/CMakeLists.txt
@@ -0,0 +1 @@
+install(CODE "message(installing:${CMAKE_CURRENT_SOURCE_DIR})")
diff --git a/Tests/RunCMake/InstallParallel/subdir-2/CMakeLists.txt b/Tests/RunCMake/InstallParallel/subdir-2/CMakeLists.txt
new file mode 100644
index 0000000..dd7eac3
--- /dev/null
+++ b/Tests/RunCMake/InstallParallel/subdir-2/CMakeLists.txt
@@ -0,0 +1 @@
+install(CODE "message(installing:${CMAKE_CURRENT_SOURCE_DIR})")