blob: f9daeac52fe0ca4c81aea3e4d4575035d3ad92e5 [file] [log] [blame]
Guillaume Chatelet439d3712018-02-01 10:03:09 +01001cmake_minimum_required(VERSION 3.0)
2
Nikita Karpeyeb168a22020-03-12 01:54:42 +05003# option() honors normal variables.
4# see: https://cmake.org/cmake/help/git-stage/policy/CMP0077.html
5if(POLICY CMP0077)
6 cmake_policy(SET CMP0077 NEW)
7endif()
8
Guillaume Chateleta8397ba2020-10-15 11:09:51 +02009project(CpuFeatures VERSION 0.6.0 LANGUAGES C)
Guillaume Chatelet439d3712018-02-01 10:03:09 +010010
Artem Alekseev653d5812019-07-02 17:52:25 +030011set(CMAKE_C_STANDARD 99)
12
Guillaume Chatelet3a156da2018-02-08 16:59:18 +010013# Default Build Type to be Release
14if(NOT CMAKE_BUILD_TYPE)
15 set(CMAKE_BUILD_TYPE "Release" CACHE STRING
16 "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
17 FORCE)
18endif(NOT CMAKE_BUILD_TYPE)
19
20# BUILD_TESTING is a standard CMake variable, but we declare it here to make it
21# prominent in the GUI.
22option(BUILD_TESTING "Enable test (depends on googletest)." OFF)
Guillaume Chatelet1976dcd2018-02-12 16:17:21 +010023# BUILD_SHARED_LIBS is a standard CMake variable, but we declare it here to make
24# it prominent in the GUI.
Mizuxa7e09632020-09-23 09:27:23 +020025# cpu_features uses bit-fields which are - to some extends - implementation-defined (see https://en.cppreference.com/w/c/language/bit_field).
26# As a consequence it is discouraged to use cpu_features as a shared library because different compilers may interpret the code in different ways.
William Tambellini78065022019-02-13 02:55:17 -080027# Prefer static linking from source whenever possible.
Guillaume Chatelet1976dcd2018-02-12 16:17:21 +010028option(BUILD_SHARED_LIBS "Build library as shared." OFF)
William Tambellini78065022019-02-13 02:55:17 -080029# PIC
30option(BUILD_PIC "Build with Position Independant Code." OFF) # Default is off at least for GCC
Guillaume Chatelet3a156da2018-02-08 16:59:18 +010031
Nikita Karpeyeb168a22020-03-12 01:54:42 +050032# Force PIC on unix when building shared libs
33# see: https://en.wikipedia.org/wiki/Position-independent_code
34if(BUILD_SHARED_LIBS AND UNIX)
35 set(BUILD_PIC ON)
36endif()
37
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +010038include(CheckIncludeFile)
39include(CheckSymbolExists)
40include(GNUInstallDirs)
Guillaume Chatelet439d3712018-02-01 10:03:09 +010041
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +010042macro(setup_include_and_definitions TARGET_NAME)
43 target_include_directories(${TARGET_NAME}
44 PUBLIC $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
45 PRIVATE $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include/internal>
46 )
47 target_compile_definitions(${TARGET_NAME}
48 PUBLIC STACK_LINE_READER_BUFFER_SIZE=1024
Guillaume Chateletb3bb9042019-01-15 15:42:04 +010049 )
50endmacro()
51
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +010052set(PROCESSOR_IS_MIPS FALSE)
53set(PROCESSOR_IS_ARM FALSE)
54set(PROCESSOR_IS_AARCH64 FALSE)
55set(PROCESSOR_IS_X86 FALSE)
56set(PROCESSOR_IS_POWER FALSE)
57
Guillaume Chatelete8e56102019-01-15 10:52:56 +010058if(CMAKE_SYSTEM_PROCESSOR MATCHES "^mips")
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +010059 set(PROCESSOR_IS_MIPS TRUE)
Guillaume Chatelete8e56102019-01-15 10:52:56 +010060elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm")
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +010061 set(PROCESSOR_IS_ARM TRUE)
Guillaume Chatelete8e56102019-01-15 10:52:56 +010062elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^aarch64")
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +010063 set(PROCESSOR_IS_AARCH64 TRUE)
Steven Kreuzerf832ad22019-07-13 22:31:52 -040064elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "(x86_64)|(AMD64|amd64)|(^i.86$)")
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +010065 set(PROCESSOR_IS_X86 TRUE)
Guillaume Chatelete8e56102019-01-15 10:52:56 +010066elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)")
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +010067 set(PROCESSOR_IS_POWER TRUE)
Guillaume Chatelete8e56102019-01-15 10:52:56 +010068endif()
69
Guillaume Chatelet20fa92a2019-01-23 12:59:46 +010070macro(add_cpu_features_headers_and_sources HDRS_LIST_NAME SRCS_LIST_NAME)
71 list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpu_features_macros.h)
Artem Alekseevbd358ab2019-07-16 13:45:33 +030072 list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpu_features_cache_info.h)
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +010073 if(PROCESSOR_IS_MIPS)
Guillaume Chatelet20fa92a2019-01-23 12:59:46 +010074 list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_mips.h)
75 list(APPEND ${SRCS_LIST_NAME} ${PROJECT_SOURCE_DIR}/src/cpuinfo_mips.c)
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +010076 elseif(PROCESSOR_IS_ARM)
Guillaume Chatelet20fa92a2019-01-23 12:59:46 +010077 list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_arm.h)
78 list(APPEND ${SRCS_LIST_NAME} ${PROJECT_SOURCE_DIR}/src/cpuinfo_arm.c)
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +010079 elseif(PROCESSOR_IS_AARCH64)
Guillaume Chatelet20fa92a2019-01-23 12:59:46 +010080 list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_aarch64.h)
81 list(APPEND ${SRCS_LIST_NAME} ${PROJECT_SOURCE_DIR}/src/cpuinfo_aarch64.c)
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +010082 elseif(PROCESSOR_IS_X86)
Guillaume Chatelet20fa92a2019-01-23 12:59:46 +010083 list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_x86.h)
84 list(APPEND ${SRCS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/internal/cpuid_x86.h)
85 list(APPEND ${SRCS_LIST_NAME} ${PROJECT_SOURCE_DIR}/src/cpuinfo_x86.c)
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +010086 elseif(PROCESSOR_IS_POWER)
Guillaume Chatelet20fa92a2019-01-23 12:59:46 +010087 list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_ppc.h)
88 list(APPEND ${SRCS_LIST_NAME} ${PROJECT_SOURCE_DIR}/src/cpuinfo_ppc.c)
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +010089 else()
90 message(FATAL_ERROR "Unsupported architectures ${CMAKE_SYSTEM_PROCESSOR}")
91 endif()
92endmacro()
Guillaume Chatelete8e56102019-01-15 10:52:56 +010093
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +010094#
95# library : utils
96#
97
98add_library(utils OBJECT
Guillaume Chatelet20fa92a2019-01-23 12:59:46 +010099 ${PROJECT_SOURCE_DIR}/include/internal/bit_utils.h
100 ${PROJECT_SOURCE_DIR}/include/internal/filesystem.h
101 ${PROJECT_SOURCE_DIR}/include/internal/stack_line_reader.h
102 ${PROJECT_SOURCE_DIR}/include/internal/string_view.h
103 ${PROJECT_SOURCE_DIR}/src/filesystem.c
104 ${PROJECT_SOURCE_DIR}/src/stack_line_reader.c
105 ${PROJECT_SOURCE_DIR}/src/string_view.c
Guillaume Chatelet1976dcd2018-02-12 16:17:21 +0100106)
Nikita Karpeyeb168a22020-03-12 01:54:42 +0500107set_property(TARGET utils PROPERTY POSITION_INDEPENDENT_CODE ${BUILD_PIC})
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +0100108setup_include_and_definitions(utils)
109
110#
111# library : unix_based_hardware_detection
112#
113
114if(UNIX)
115 add_library(unix_based_hardware_detection OBJECT
Guillaume Chatelet20fa92a2019-01-23 12:59:46 +0100116 ${PROJECT_SOURCE_DIR}/include/internal/hwcaps.h
Guillaume Chatelet20fa92a2019-01-23 12:59:46 +0100117 ${PROJECT_SOURCE_DIR}/src/hwcaps.c
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +0100118 )
119 setup_include_and_definitions(unix_based_hardware_detection)
120 check_include_file(dlfcn.h HAVE_DLFCN_H)
121 if(HAVE_DLFCN_H)
122 target_compile_definitions(unix_based_hardware_detection PRIVATE HAVE_DLFCN_H)
123 endif()
124 check_symbol_exists(getauxval "sys/auxv.h" HAVE_STRONG_GETAUXVAL)
125 if(HAVE_STRONG_GETAUXVAL)
126 target_compile_definitions(unix_based_hardware_detection PRIVATE HAVE_STRONG_GETAUXVAL)
127 endif()
William Tambellini78065022019-02-13 02:55:17 -0800128 set_property(TARGET unix_based_hardware_detection PROPERTY POSITION_INDEPENDENT_CODE ${BUILD_PIC})
Guillaume Chateletb3bb9042019-01-15 15:42:04 +0100129endif()
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +0100130
131#
132# library : cpu_features
133#
134set (CPU_FEATURES_HDRS)
135set (CPU_FEATURES_SRCS)
Guillaume Chatelet20fa92a2019-01-23 12:59:46 +0100136add_cpu_features_headers_and_sources(CPU_FEATURES_HDRS CPU_FEATURES_SRCS)
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +0100137list(APPEND CPU_FEATURES_SRCS $<TARGET_OBJECTS:utils>)
138if(NOT PROCESSOR_IS_X86 AND UNIX)
139 list(APPEND CPU_FEATURES_SRCS $<TARGET_OBJECTS:unix_based_hardware_detection>)
Guillaume Chateletb3bb9042019-01-15 15:42:04 +0100140endif()
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +0100141add_library(cpu_features ${CPU_FEATURES_HDRS} ${CPU_FEATURES_SRCS})
Guillaume Chatelet20fa92a2019-01-23 12:59:46 +0100142set_target_properties(cpu_features PROPERTIES PUBLIC_HEADER "${CPU_FEATURES_HDRS}")
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +0100143setup_include_and_definitions(cpu_features)
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100144target_link_libraries(cpu_features PUBLIC ${CMAKE_DL_LIBS})
William Tambellini78065022019-02-13 02:55:17 -0800145set_property(TARGET cpu_features PROPERTY POSITION_INDEPENDENT_CODE ${BUILD_PIC})
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +0100146target_include_directories(cpu_features
147 PUBLIC $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/cpu_features>
148)
Guillaume Chatelet47953732020-10-09 17:20:25 +0200149if(PROCESSOR_IS_X86)
Guillaume Chatelet47953732020-10-09 17:20:25 +0200150 if(APPLE)
151 target_compile_definitions(cpu_features PRIVATE HAVE_SYSCTLBYNAME)
152 endif()
153endif()
Mizuxb5c271c2020-02-06 09:42:20 +0100154add_library(CpuFeature::cpu_features ALIAS cpu_features)
Guillaume Chatelet20fa92a2019-01-23 12:59:46 +0100155
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100156#
157# program : list_cpu_features
158#
159
Guillaume Chatelet20fa92a2019-01-23 12:59:46 +0100160add_executable(list_cpu_features ${PROJECT_SOURCE_DIR}/src/utils/list_cpu_features.c)
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100161target_link_libraries(list_cpu_features PRIVATE cpu_features)
Guillaume Chatelet1976dcd2018-02-12 16:17:21 +0100162add_executable(CpuFeature::list_cpu_features ALIAS list_cpu_features)
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100163
164#
Guillaume Chatelet20fa92a2019-01-23 12:59:46 +0100165# ndk_compat
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +0100166#
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +0100167
Guillaume Chatelet20fa92a2019-01-23 12:59:46 +0100168if(ANDROID)
169add_subdirectory(ndk_compat)
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +0100170endif()
171
172#
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100173# tests
174#
175
176include(CTest)
177if(BUILD_TESTING)
Guillaume Chatelet9df2d782018-02-13 10:07:02 +0100178 # Automatically incorporate googletest into the CMake Project if target not
179 # found.
Nikita Karpeyba81cb32020-03-11 18:40:23 +0500180 enable_language(CXX)
Mizuxa7e09632020-09-23 09:27:23 +0200181
Nikita Karpeyba81cb32020-03-11 18:40:23 +0500182 set(CMAKE_CXX_STANDARD 11)
183 set(CMAKE_CXX_STANDARD_REQUIRED ON)
184 set(CMAKE_CXX_EXTENSIONS OFF) # prefer use of -std11 instead of -gnustd11
Mizuxa7e09632020-09-23 09:27:23 +0200185
Guillaume Chatelet9df2d782018-02-13 10:07:02 +0100186 if(NOT TARGET gtest OR NOT TARGET gmock_main)
187 # Download and unpack googletest at configure time.
188 configure_file(
189 cmake/googletest.CMakeLists.txt.in
190 googletest-download/CMakeLists.txt
191 )
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100192
Guillaume Chatelet9df2d782018-02-13 10:07:02 +0100193 execute_process(
194 COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
195 RESULT_VARIABLE result
196 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/googletest-download)
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100197
Guillaume Chatelet9df2d782018-02-13 10:07:02 +0100198 if(result)
199 message(FATAL_ERROR "CMake step for googletest failed: ${result}")
200 endif()
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100201
Guillaume Chatelet9df2d782018-02-13 10:07:02 +0100202 execute_process(
203 COMMAND ${CMAKE_COMMAND} --build .
204 RESULT_VARIABLE result
205 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/googletest-download)
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100206
Guillaume Chatelet9df2d782018-02-13 10:07:02 +0100207 if(result)
208 message(FATAL_ERROR "Build step for googletest failed: ${result}")
209 endif()
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100210
Guillaume Chatelet9df2d782018-02-13 10:07:02 +0100211 # Prevent overriding the parent project's compiler/linker settings on
212 # Windows.
213 set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100214
Guillaume Chatelet9df2d782018-02-13 10:07:02 +0100215 # Add googletest directly to our build. This defines the gtest and
216 # gtest_main targets.
217 add_subdirectory(${CMAKE_BINARY_DIR}/googletest-src
218 ${CMAKE_BINARY_DIR}/googletest-build
219 EXCLUDE_FROM_ALL)
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100220 endif()
Guillaume Chatelet3a156da2018-02-08 16:59:18 +0100221
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100222 add_subdirectory(test)
223endif()
Guillaume Chatelet1976dcd2018-02-12 16:17:21 +0100224
225#
Guillaume Chatelet20fa92a2019-01-23 12:59:46 +0100226# Install cpu_features and list_cpu_features
Guillaume Chatelet1976dcd2018-02-12 16:17:21 +0100227#
228
229include(GNUInstallDirs)
230install(TARGETS cpu_features list_cpu_features
231 EXPORT CpuFeaturesTargets
232 PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/cpu_features
233 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
234 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
235 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
236)
237install(EXPORT CpuFeaturesTargets
238 NAMESPACE CpuFeatures::
239 DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/CpuFeatures
240 COMPONENT Devel
241)
242include(CMakePackageConfigHelpers)
243configure_package_config_file(cmake/CpuFeaturesConfig.cmake.in
Guillaume Chatelet57917d22018-02-12 16:48:57 +0100244 "${PROJECT_BINARY_DIR}/CpuFeaturesConfig.cmake"
Guillaume Chatelet1976dcd2018-02-12 16:17:21 +0100245 INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/CpuFeatures"
246 NO_SET_AND_CHECK_MACRO
247 NO_CHECK_REQUIRED_COMPONENTS_MACRO
248)
249write_basic_package_version_file(
250 "${PROJECT_BINARY_DIR}/CpuFeaturesConfigVersion.cmake"
251 COMPATIBILITY SameMajorVersion
252)
253install(
254 FILES
Guillaume Chatelet20fa92a2019-01-23 12:59:46 +0100255 "${PROJECT_BINARY_DIR}/CpuFeaturesConfig.cmake"
256 "${PROJECT_BINARY_DIR}/CpuFeaturesConfigVersion.cmake"
Guillaume Chatelet1976dcd2018-02-12 16:17:21 +0100257 DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/CpuFeatures"
258 COMPONENT Devel
259)