summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Wild <themiwi@users.sourceforge.net>2010-10-08 07:16:04 (GMT)
committerBrad King <brad.king@kitware.com>2011-03-15 19:07:30 (GMT)
commitabbaa123aa0bc7c1d712a7cde018dfbdcccf0c43 (patch)
tree51001eb965723df570cf2efa65c03d723ba3afe8
parent0554e5e50f6eb3117b4e207f4b01876dbe5a75a4 (diff)
downloadCMake-abbaa123aa0bc7c1d712a7cde018dfbdcccf0c43.zip
CMake-abbaa123aa0bc7c1d712a7cde018dfbdcccf0c43.tar.gz
CMake-abbaa123aa0bc7c1d712a7cde018dfbdcccf0c43.tar.bz2
Add module ProcessorCount.cmake (#11302)
Credit goes to David Cole ( http://www.kitware.com/blog/home/post/63 ). Also add a script-based test of the new module. Signed-off-by: Michael Wild <themiwi@users.sourceforge.net>
-rw-r--r--Modules/ProcessorCount.cmake60
-rw-r--r--Tests/CMakeTests/CMakeLists.txt1
-rw-r--r--Tests/CMakeTests/ProcessorCountTest.cmake.in9
3 files changed, 70 insertions, 0 deletions
diff --git a/Modules/ProcessorCount.cmake b/Modules/ProcessorCount.cmake
new file mode 100644
index 0000000..e4aea19
--- /dev/null
+++ b/Modules/ProcessorCount.cmake
@@ -0,0 +1,60 @@
+# - ProcessorCount(var)
+# Determine the number of processors/cores and save value in ${var}
+#
+# Sets the variable named ${var} to the number of physical cores available on
+# the machine if the information can be determined. Otherwise it is set to 0.
+# Currently this functionality is only implemented for Windows, Mac OS X and
+# Unix systems providing getconf or the /proc/cpuinfo interface (e.g. Linux).
+
+# A more reliable way might be to compile a small C program that uses the CPUID
+# instruction, but that again requires compiler support or compiling assembler
+# code.
+
+#=============================================================================
+# Copyright 2002-2009 Kitware, Inc.
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distributed this file outside of CMake, substitute the full
+# License text for the above reference.)
+
+function(ProcessorCount var)
+ # Unknown:
+ set(count 0)
+
+ if(WIN32)
+ # Windows:
+ set(count "$ENV{NUMBER_OF_PROCESSORS}")
+ elseif(APPLE)
+ # Mac:
+ find_program(ProcessorCount_cmd_sysctl sysctl
+ PATHS /usr/sbin)
+ if(ProcessorCount_cmd_sysctl)
+ execute_process(COMMAND ${ProcessorCount_cmd_sysctl} -n hw.ncpu
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ OUTPUT_VARIABLE count)
+ endif()
+ else()
+ find_program(ProcessorCount_cmd_getconf getconf)
+ if(ProcessorCount_cmd_getconf)
+ # Linux and other systems with getconf:
+ execute_process(COMMAND ${ProcessorCount_cmd_getconf} _NPROCESSORS_ONLN
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ OUTPUT_VARIABLE count)
+ else()
+ # Linux and other systems with /proc/cpuinfo:
+ set(cpuinfo_file /proc/cpuinfo)
+ if(EXISTS "${cpuinfo_file}")
+ file(STRINGS "${cpuinfo_file}" procs REGEX "^processor.: [0-9]+$")
+ list(LENGTH procs count)
+ endif()
+ endif()
+ endif()
+
+ set(${var} ${count} PARENT_SCOPE)
+endfunction()
diff --git a/Tests/CMakeTests/CMakeLists.txt b/Tests/CMakeTests/CMakeLists.txt
index cceef3b..5cb50c9 100644
--- a/Tests/CMakeTests/CMakeLists.txt
+++ b/Tests/CMakeTests/CMakeLists.txt
@@ -27,6 +27,7 @@ AddCMakeTest(String "")
AddCMakeTest(Math "")
AddCMakeTest(CMakeMinimumRequired "")
AddCMakeTest(CompilerIdVendor "")
+AddCMakeTest(ProcessorCount "")
AddCMakeTest(FileDownload "")
set_property(TEST CMake.FileDownload PROPERTY
diff --git a/Tests/CMakeTests/ProcessorCountTest.cmake.in b/Tests/CMakeTests/ProcessorCountTest.cmake.in
new file mode 100644
index 0000000..0815fd8
--- /dev/null
+++ b/Tests/CMakeTests/ProcessorCountTest.cmake.in
@@ -0,0 +1,9 @@
+include(ProcessorCount)
+
+ProcessorCount(processor_count)
+message("processor_count='${processor_count}'")
+
+if(processor_count EQUAL 0)
+ message(FATAL_ERROR "could not determine number of processors
+- Additional code needed in ProcessorCount.cmake?")
+endif()