blob: b3ff6b21f3949e4ab86cf4c72117bb10fcce89d6 [file] [log] [blame]
Marat Dukhan3645b922017-10-13 17:03:35 -04001CMAKE_MINIMUM_REQUIRED(VERSION 3.0 FATAL_ERROR)
2
3INCLUDE(GNUInstallDirs)
4
5# ---[ Project and semantic versioning.
Marat Dukhanbfff3482017-10-15 22:24:32 +00006PROJECT(cpuinfo VERSION 1.0 LANGUAGES C CXX)
Marat Dukhan3645b922017-10-13 17:03:35 -04007
8# ---[ Options.
9OPTION(BUILD_TOOLS "Build command-line tools" ON)
10OPTION(BUILD_UNIT_TESTS "Build C++ unit tests (need googletest)" ON)
11OPTION(BUILD_MOCK_TESTS "Build C++ mock tests (need googletest)" ON)
12
13# ---[ Build flags
Marat Dukhan3645b922017-10-13 17:03:35 -040014IF(NOT MSVC)
Marat Dukhan7b738882017-10-18 16:59:28 -070015 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")
16 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
Marat Dukhan3645b922017-10-13 17:03:35 -040017ENDIF()
18
19IF(NOT CMAKE_SYSTEM_PROCESSOR)
20 MESSAGE(FATAL_ERROR "CMAKE_SYSTEM_PROCESSOR not defined")
Marat Dukhan7b738882017-10-18 16:59:28 -070021ELSEIF(NOT CMAKE_SYSTEM_PROCESSOR MATCHES "^(i686|x86_64|armv5te|armv7|armv7f|armv7s|armv7k|armv7-a|armv7l|arm64|aarch64)$")
Marat Dukhan3645b922017-10-13 17:03:35 -040022 MESSAGE(FATAL_ERROR "Unrecognized CMAKE_SYSTEM_PROCESSOR = ${CMAKE_SYSTEM_PROCESSOR}")
23ENDIF()
24
25IF(NOT CMAKE_SYSTEM_NAME)
26 MESSAGE(FATAL_ERROR "CMAKE_SYSTEM_NAME not defined")
27ELSEIF(NOT CMAKE_SYSTEM_NAME MATCHES "^(Darwin|Linux|Android)$")
28 MESSAGE(FATAL_ERROR "Unrecognized CMAKE_SYSTEM_NAME = ${CMAKE_SYSTEM_NAME}")
29ENDIF()
30
31INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include)
32
33# ---[ cpuinfo library
34SET(CPUINFO_SRCS
35 src/init.c
36 src/api.c
37 src/log.c)
38
39IF(CMAKE_SYSTEM_PROCESSOR MATCHES "^(i686|x86_64)$")
40 LIST(APPEND CPUINFO_SRCS
41 src/x86/init.c
42 src/x86/info.c
43 src/x86/vendor.c
44 src/x86/uarch.c
45 src/x86/name.c
46 src/x86/topology.c
47 src/x86/isa.c
48 src/x86/cache/init.c
49 src/x86/cache/descriptor.c
50 src/x86/cache/deterministic.c)
51 IF(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "Android")
52 LIST(APPEND CPUINFO_SRCS
53 src/x86/linux/init.c
54 src/x86/linux/cpuinfo.c)
55 ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
56 LIST(APPEND CPUINFO_SRCS src/x86/mach/init.c)
57 ENDIF()
Marat Dukhan7b738882017-10-18 16:59:28 -070058ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "^(armv5te|armv7|armv7f|armv7s|armv7k|armv7-a|armv7l|arm64|aarch64)$")
Marat Dukhan3645b922017-10-13 17:03:35 -040059 LIST(APPEND CPUINFO_SRCS
60 src/arm/uarch.c
61 src/arm/cache.c)
62 IF(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "Android")
63 LIST(APPEND CPUINFO_SRCS
64 src/arm/linux/init.c
65 src/arm/linux/cpuinfo.c
66 src/arm/linux/clusters.c
Marat Dukhaned272132017-10-15 21:55:45 +000067 src/arm/linux/chipset.c
Marat Dukhan3645b922017-10-13 17:03:35 -040068 src/arm/linux/midr.c)
Marat Dukhan7b738882017-10-18 16:59:28 -070069 IF(CMAKE_SYSTEM_PROCESSOR MATCHES "^(armv5te|armv7l|armv7-a)$")
70 LIST(APPEND CPUINFO_SRCS src/arm/linux/arm32-isa.c)
71 IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND ANDROID_ABI STREQUAL "armeabi")
72 SET_SOURCE_FILES_PROPERTIES(src/arm/linux/arm32-isa.c PROPERTIES COMPILE_FLAGS -marm)
73 ENDIF()
74 ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64")
75 LIST(APPEND CPUINFO_SRCS src/arm/linux/arm64-isa.c)
76 ENDIF()
77 ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
Marat Dukhanad1ac952017-10-23 15:32:25 -070078 LIST(APPEND CPUINFO_SRCS
79 src/arm/mach/init.c
80 src/gpu/gles-ios.m)
Marat Dukhan02527012017-10-23 16:03:05 -070081 SET_SOURCE_FILES_PROPERTIES(src/gpu/gles-ios.m PROPERTIES COMPILE_FLAGS -fobjc-arc)
Marat Dukhan3645b922017-10-13 17:03:35 -040082 ENDIF()
83 IF(CMAKE_SYSTEM_NAME STREQUAL "Android")
84 LIST(APPEND CPUINFO_SRCS
Marat Dukhan3645b922017-10-13 17:03:35 -040085 src/arm/Android/properties.c)
86 ENDIF()
Marat Dukhan3645b922017-10-13 17:03:35 -040087ENDIF()
88
89IF(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "Android")
90 LIST(APPEND CPUINFO_SRCS
91 src/linux/smallfile.c
92 src/linux/multiline.c
93 src/linux/current.c
94 src/linux/cpulist.c
95 src/linux/processors.c)
96 IF(CMAKE_SYSTEM_NAME STREQUAL "Android")
97 LIST(APPEND CPUINFO_SRCS src/gpu/gles2.c)
98 ENDIF()
99ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
100 LIST(APPEND CPUINFO_SRCS src/mach/topology.c)
101ENDIF()
102
Marat Dukhanbfff3482017-10-15 22:24:32 +0000103IF(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "Android")
104 SET(CMAKE_THREAD_PREFER_PTHREAD TRUE)
105 SET(THREADS_PREFER_PTHREAD_FLAG TRUE)
106 FIND_PACKAGE(Threads REQUIRED)
107ENDIF()
108
Marat Dukhan3645b922017-10-13 17:03:35 -0400109ADD_LIBRARY(cpuinfo ${CPUINFO_SRCS})
110SET_TARGET_PROPERTIES(cpuinfo PROPERTIES VERSION ${PROJECT_VERSION})
111SET_TARGET_PROPERTIES(cpuinfo PROPERTIES PUBLIC_HEADER include/cpuinfo.h)
112TARGET_INCLUDE_DIRECTORIES(cpuinfo PRIVATE include)
113TARGET_INCLUDE_DIRECTORIES(cpuinfo PRIVATE src)
Marat Dukhanbfff3482017-10-15 22:24:32 +0000114IF(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "Android")
115 TARGET_LINK_LIBRARIES(cpuinfo PUBLIC ${CMAKE_THREAD_LIBS_INIT})
116ENDIF()
Marat Dukhanad1ac952017-10-23 15:32:25 -0700117IF(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(armv7|armv7f|armv7s|armv7k|arm64)$")
118 TARGET_LINK_LIBRARIES(cpuinfo INTERFACE "-framework OpenGLES")
119 TARGET_LINK_LIBRARIES(cpuinfo INTERFACE "-framework Foundation")
120ENDIF()
Marat Dukhan3645b922017-10-13 17:03:35 -0400121
122INSTALL(TARGETS cpuinfo
123 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
124 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
125 PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
126
Marat Dukhanb8a83372017-10-13 21:07:44 -0400127# ---[ cpuinfo mock library
128IF(BUILD_MOCK_TESTS)
129 SET(CPUINFO_MOCK_SRCS "${CPUINFO_SRCS}")
130 IF(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "Android")
131 LIST(APPEND CPUINFO_MOCK_SRCS src/linux/mockfile.c)
132 ENDIF()
133
134 ADD_LIBRARY(cpuinfo_mock ${CPUINFO_MOCK_SRCS})
135 SET_TARGET_PROPERTIES(cpuinfo_mock PROPERTIES VERSION ${PROJECT_VERSION})
136 SET_TARGET_PROPERTIES(cpuinfo_mock PROPERTIES PUBLIC_HEADER include/cpuinfo.h)
137 TARGET_INCLUDE_DIRECTORIES(cpuinfo_mock PRIVATE include)
138 TARGET_INCLUDE_DIRECTORIES(cpuinfo_mock PRIVATE src)
139 TARGET_COMPILE_DEFINITIONS(cpuinfo_mock PRIVATE "-DCPUINFO_MOCK=1")
Marat Dukhanbfff3482017-10-15 22:24:32 +0000140 IF(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "Android")
141 TARGET_LINK_LIBRARIES(cpuinfo_mock PUBLIC ${CMAKE_THREAD_LIBS_INIT})
142 ENDIF()
Marat Dukhanb8a83372017-10-13 21:07:44 -0400143ENDIF()
144
Marat Dukhan3645b922017-10-13 17:03:35 -0400145# ---[ Helper and debug tools
146IF(BUILD_TOOLS)
147 ADD_EXECUTABLE(isa-info tools/isa-info.c)
148 TARGET_LINK_LIBRARIES(isa-info PRIVATE cpuinfo)
149
150 ADD_EXECUTABLE(cpu-info tools/cpu-info.c)
151 TARGET_LINK_LIBRARIES(cpu-info PRIVATE cpuinfo)
152
153 ADD_EXECUTABLE(cache-info tools/cache-info.c)
154 TARGET_LINK_LIBRARIES(cache-info PRIVATE cpuinfo)
155
156 IF(CMAKE_SYSTEM_PROCESSOR MATCHES "^(i686|x86_64)$")
157 ADD_EXECUTABLE(cpuid-dump tools/cpuid-dump.c)
158 TARGET_INCLUDE_DIRECTORIES(cpuid-dump PRIVATE src)
159 TARGET_INCLUDE_DIRECTORIES(cpuid-dump PRIVATE include)
160 ENDIF()
161ENDIF()