File: GetCPUDetails.cmake

package info (click to toggle)
freespace2 25.0.0%2Brepack-1
  • links: PTS, VCS
  • area: non-free
  • in suites: forky, sid
  • size: 47,232 kB
  • sloc: cpp: 657,500; ansic: 22,305; sh: 293; python: 200; makefile: 198; xml: 181
file content (204 lines) | stat: -rw-r--r-- 4,493 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
# - Set a number of variables to indicate things about the current CPU and OS
#
#  CPU_COUNT
#  CPU_INTEL
#  CPU_EXE_64BIT
#  CPU_EXE_32BIT
#  CPU_HAS_SSE
#  CPU_HAS_SSE2
#  CPU_HAS_SSE3
#  CPU_HAS_SSSE3
#  CPU_HAS_SSE4_1
#  CPU_HAS_SSE4_2
#
# Requires these CMake modules:
#  no additional modules required
#
# Original Author:
# 2010 Rylie Pavlik <rylie@ryliepavlik.com>
# https://ryliepavlik.com/
# Iowa State University HCI Graduate Program/VRAC
#
# Copyright 2009-2010, Iowa State University
#
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
#
# SPDX-License-Identifier: BSL-1.0
#


if(__get_cpu_details)
	return()
endif()
set(__get_cpu_details YES)

function(get_cpu_details)
	option(CPUDETAILS_VERBOSE
		"Should we display results of the CPU info check?"
		NO)
	mark_as_advanced(CPUDETAILS_VERBOSE)

	### See http://www.kitware.com/blog/home/post/63
	if(NOT DEFINED CPU_COUNT)
		# Unknown:
		set(CPU_COUNT 1)
		# Linux:
		set(cpuinfo_file "/proc/cpuinfo")
		if(EXISTS "${cpuinfo_file}")
			file(STRINGS "${cpuinfo_file}" procs REGEX "^processor.: [0-9]+$")
			list(LENGTH procs CPU_COUNT)
		endif()
		# Mac:
		if(APPLE)
			find_program(cmd_sys_pro "system_profiler")
			if(cmd_sys_pro)
				execute_process(COMMAND ${cmd_sys_pro} OUTPUT_VARIABLE info)
				string(REGEX REPLACE "^.*Total Number Of Cores: ([0-9]+).*$" "\\1"
				CPU_COUNT "${info}")
			endif()
		endif()
		# Windows:
		if(WIN32)
			set(CPU_COUNT "$ENV{NUMBER_OF_PROCESSORS}")
		endif()
	endif()

	###
	# CPU_INTEL

	if("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "x86_64" OR "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "i[3456]86")
		set(CPU_INTEL YES)
	elseif(APPLE)
		# Mac Intel boxes return i386 in 10.5 - so assume this is a PPC
		set(CPU_INTEL NO)
	else()
		# TODO: Assuming yes in case of doubt - probably not a great idea
		set(CPU_INTEL YES)
	endif()

	set(CPU_INTEL
		${CPU_INTEL}
		CACHE
		INTERNAL
		"Intel x86 or x86_64 architecture machine?")

	###
	# CPU_EXE_64BIT/32BIT
	if(CMAKE_SIZEOF_VOID_P EQUAL 8)
		set(CPU_EXE_64BIT ON)
		set(CPU_EXE_32BIT OFF)
	else()
		set(CPU_EXE_64BIT OFF)
		set(CPU_EXE_32BIT ON)
	endif()

	###
	# CPU_HAS_SSE/SSE2/SSE3/SSSE3/SSE4.1/SSE4.2
	if(CPU_INTEL)
		if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
			# Use /proc/cpuinfo to find this out.
			file(STRINGS "/proc/cpuinfo" _cpuinfo)
			if(_cpuinfo MATCHES "(sse)|(xmm)")
				set(CPU_HAS_SSE YES)
			else()
				set(CPU_HAS_SSE NO)
			endif()

			if(_cpuinfo MATCHES "(sse2)|(xmm2)")
				set(CPU_HAS_SSE2 YES)
			else()
				set(CPU_HAS_SSE2 NO)
			endif()

			if(_cpuinfo MATCHES "(sse3)|(xmm3)")
				set(CPU_HAS_SSE3 YES)
			else()
				set(CPU_HAS_SSE3 NO)
			endif()

			if(_cpuinfo MATCHES "ssse3")
				set(CPU_HAS_SSSE3 YES)
			else()
				set(CPU_HAS_SSSE3 NO)
			endif()

			if(_cpuinfo MATCHES "(sse4_1)|(xmm4_1)")
				set(CPU_HAS_SSE4_1 YES)
			else()
				set(CPU_HAS_SSE4_1 NO)
			endif()

			if(_cpuinfo MATCHES "(sse4_2)|(xmm4_2)")
				set(CPU_HAS_SSE4_2 YES)
			else()
				set(CPU_HAS_SSE4_2 NO)
			endif()

		elseif(APPLE)
			# Mac OS X Intel requires SSE3
			set(CPU_HAS_SSE YES)
			set(CPU_HAS_SSE2 YES)
			set(CPU_HAS_SSE3 YES)
			set(CPU_HAS_SSSE3 NO)
			set(CPU_HAS_SSE4_1 NO)
			set(CPU_HAS_SSE4_2 NO)
		elseif(WIN32)
			if(CPU_EXE_64BIT)
				#TODO: Assume only common-denominator for 64-bit machines,
				# since I don't know how to check.
				set(CPU_HAS_SSE YES)
				set(CPU_HAS_SSE2 YES)
				set(CPU_HAS_SSE3 NO)
				set(CPU_HAS_SSSE3 NO)
				set(CPU_HAS_SSE4_1 NO)
				set(CPU_HAS_SSE4_2 NO)
			else()
				#TODO:  Assume no SSE, since I don't know how to check.
				set(CPU_HAS_SSE NO)
				set(CPU_HAS_SSE2 NO)
				set(CPU_HAS_SSE3 NO)
				set(CPU_HAS_SSSE3 NO)
				set(CPU_HAS_SSE4_1 NO)
				set(CPU_HAS_SSE4_2 NO)
			endif()
		endif()
	endif()

	set(CPU_INTEL
		${CPU_INTEL}
		CACHE
		INTERNAL
		"Intel x86 or x86_64 architecture machine?")

	foreach(_var
		CPU_COUNT
		CPU_EXE_64BIT
		CPU_EXE_32BIT
		CPU_HAS_SSE
		CPU_HAS_SSE2
		CPU_HAS_SSE3
		CPU_HAS_SSSE3
		CPU_HAS_SSE4_1
		CPU_HAS_SSE4_2)
		set(${_var} ${${_var}} CACHE INTERNAL "")
	endforeach()

	if(CPUDETAILS_VERBOSE)
		foreach(_var
			CPU_COUNT
			CPU_INTEL
			CPU_EXE_64BIT
			CPU_EXE_32BIT
			CPU_HAS_SSE
			CPU_HAS_SSE2
			CPU_HAS_SSE3
			CPU_HAS_SSSE3
			CPU_HAS_SSE4_1
			CPU_HAS_SSE4_2)
			get_property(_help CACHE ${_var} PROPERTY HELPSTRING)
			message(STATUS "[get_cpu_details] ${_var} (${_help}): ${${_var}}")
		endforeach()
	endif()
endfunction()