blob: 6a0a57bd7933be905fc17e039c985cdf3d93548a [file] [log] [blame]
Guillaume Chatelet439d3712018-02-01 10:03:09 +01001cmake_minimum_required(VERSION 3.0)
2
Guillaume Chatelet1976dcd2018-02-12 16:17:21 +01003project(CpuFeatures VERSION 0.1.0)
Guillaume Chatelet439d3712018-02-01 10:03:09 +01004
Artem Alekseev653d5812019-07-02 17:52:25 +03005set(CMAKE_C_STANDARD 99)
6
Guillaume Chatelet3a156da2018-02-08 16:59:18 +01007# Default Build Type to be Release
8if(NOT CMAKE_BUILD_TYPE)
9 set(CMAKE_BUILD_TYPE "Release" CACHE STRING
10 "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
11 FORCE)
12endif(NOT CMAKE_BUILD_TYPE)
13
14# BUILD_TESTING is a standard CMake variable, but we declare it here to make it
15# prominent in the GUI.
16option(BUILD_TESTING "Enable test (depends on googletest)." OFF)
Guillaume Chatelet1976dcd2018-02-12 16:17:21 +010017# BUILD_SHARED_LIBS is a standard CMake variable, but we declare it here to make
18# it prominent in the GUI.
William Tambellini78065022019-02-13 02:55:17 -080019# cpu_features uses bit-fields which are - to some extends - implementation-defined (see https://en.cppreference.com/w/c/language/bit_field).
20# As a consequence it is discouraged to use cpu_features as a shared library because different compilers may interpret the code in different ways.
21# Prefer static linking from source whenever possible.
Guillaume Chatelet1976dcd2018-02-12 16:17:21 +010022option(BUILD_SHARED_LIBS "Build library as shared." OFF)
William Tambellini78065022019-02-13 02:55:17 -080023# PIC
24option(BUILD_PIC "Build with Position Independant Code." OFF) # Default is off at least for GCC
Guillaume Chatelet3a156da2018-02-08 16:59:18 +010025
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +010026include(CheckIncludeFile)
27include(CheckSymbolExists)
28include(GNUInstallDirs)
Guillaume Chatelet439d3712018-02-01 10:03:09 +010029
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +010030macro(setup_include_and_definitions TARGET_NAME)
31 target_include_directories(${TARGET_NAME}
32 PUBLIC $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
33 PRIVATE $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include/internal>
34 )
35 target_compile_definitions(${TARGET_NAME}
36 PUBLIC STACK_LINE_READER_BUFFER_SIZE=1024
Guillaume Chateletb3bb9042019-01-15 15:42:04 +010037 )
38endmacro()
39
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +010040set(PROCESSOR_IS_MIPS FALSE)
41set(PROCESSOR_IS_ARM FALSE)
42set(PROCESSOR_IS_AARCH64 FALSE)
43set(PROCESSOR_IS_X86 FALSE)
44set(PROCESSOR_IS_POWER FALSE)
45
Guillaume Chatelete8e56102019-01-15 10:52:56 +010046if(CMAKE_SYSTEM_PROCESSOR MATCHES "^mips")
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +010047 set(PROCESSOR_IS_MIPS TRUE)
Guillaume Chatelete8e56102019-01-15 10:52:56 +010048elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm")
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +010049 set(PROCESSOR_IS_ARM TRUE)
Guillaume Chatelete8e56102019-01-15 10:52:56 +010050elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^aarch64")
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +010051 set(PROCESSOR_IS_AARCH64 TRUE)
Steven Kreuzerf832ad22019-07-13 22:31:52 -040052elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "(x86_64)|(AMD64|amd64)|(^i.86$)")
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +010053 set(PROCESSOR_IS_X86 TRUE)
Guillaume Chatelete8e56102019-01-15 10:52:56 +010054elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)")
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +010055 set(PROCESSOR_IS_POWER TRUE)
Guillaume Chatelete8e56102019-01-15 10:52:56 +010056endif()
57
Guillaume Chatelet20fa92a2019-01-23 12:59:46 +010058macro(add_cpu_features_headers_and_sources HDRS_LIST_NAME SRCS_LIST_NAME)
59 list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpu_features_macros.h)
Artem Alekseevbd358ab2019-07-16 13:45:33 +030060 list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpu_features_cache_info.h)
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +010061 if(PROCESSOR_IS_MIPS)
Guillaume Chatelet20fa92a2019-01-23 12:59:46 +010062 list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_mips.h)
63 list(APPEND ${SRCS_LIST_NAME} ${PROJECT_SOURCE_DIR}/src/cpuinfo_mips.c)
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +010064 elseif(PROCESSOR_IS_ARM)
Guillaume Chatelet20fa92a2019-01-23 12:59:46 +010065 list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_arm.h)
66 list(APPEND ${SRCS_LIST_NAME} ${PROJECT_SOURCE_DIR}/src/cpuinfo_arm.c)
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +010067 elseif(PROCESSOR_IS_AARCH64)
Guillaume Chatelet20fa92a2019-01-23 12:59:46 +010068 list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_aarch64.h)
69 list(APPEND ${SRCS_LIST_NAME} ${PROJECT_SOURCE_DIR}/src/cpuinfo_aarch64.c)
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +010070 elseif(PROCESSOR_IS_X86)
Guillaume Chatelet20fa92a2019-01-23 12:59:46 +010071 list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_x86.h)
72 list(APPEND ${SRCS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/internal/cpuid_x86.h)
73 list(APPEND ${SRCS_LIST_NAME} ${PROJECT_SOURCE_DIR}/src/cpuinfo_x86.c)
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +010074 elseif(PROCESSOR_IS_POWER)
Guillaume Chatelet20fa92a2019-01-23 12:59:46 +010075 list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_ppc.h)
76 list(APPEND ${SRCS_LIST_NAME} ${PROJECT_SOURCE_DIR}/src/cpuinfo_ppc.c)
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +010077 else()
78 message(FATAL_ERROR "Unsupported architectures ${CMAKE_SYSTEM_PROCESSOR}")
79 endif()
80endmacro()
Guillaume Chatelete8e56102019-01-15 10:52:56 +010081
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +010082#
83# library : utils
84#
85
86add_library(utils OBJECT
Guillaume Chatelet20fa92a2019-01-23 12:59:46 +010087 ${PROJECT_SOURCE_DIR}/include/internal/bit_utils.h
88 ${PROJECT_SOURCE_DIR}/include/internal/filesystem.h
89 ${PROJECT_SOURCE_DIR}/include/internal/stack_line_reader.h
90 ${PROJECT_SOURCE_DIR}/include/internal/string_view.h
91 ${PROJECT_SOURCE_DIR}/src/filesystem.c
92 ${PROJECT_SOURCE_DIR}/src/stack_line_reader.c
93 ${PROJECT_SOURCE_DIR}/src/string_view.c
Guillaume Chatelet1976dcd2018-02-12 16:17:21 +010094)
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +010095setup_include_and_definitions(utils)
96
97#
98# library : unix_based_hardware_detection
99#
100
101if(UNIX)
102 add_library(unix_based_hardware_detection OBJECT
Guillaume Chatelet20fa92a2019-01-23 12:59:46 +0100103 ${PROJECT_SOURCE_DIR}/include/internal/hwcaps.h
104 ${PROJECT_SOURCE_DIR}/include/internal/unix_features_aggregator.h
105 ${PROJECT_SOURCE_DIR}/src/hwcaps.c
106 ${PROJECT_SOURCE_DIR}/src/unix_features_aggregator.c
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +0100107 )
108 setup_include_and_definitions(unix_based_hardware_detection)
109 check_include_file(dlfcn.h HAVE_DLFCN_H)
110 if(HAVE_DLFCN_H)
111 target_compile_definitions(unix_based_hardware_detection PRIVATE HAVE_DLFCN_H)
112 endif()
113 check_symbol_exists(getauxval "sys/auxv.h" HAVE_STRONG_GETAUXVAL)
114 if(HAVE_STRONG_GETAUXVAL)
115 target_compile_definitions(unix_based_hardware_detection PRIVATE HAVE_STRONG_GETAUXVAL)
116 endif()
William Tambellini78065022019-02-13 02:55:17 -0800117 set_property(TARGET unix_based_hardware_detection PROPERTY POSITION_INDEPENDENT_CODE ${BUILD_PIC})
Guillaume Chateletb3bb9042019-01-15 15:42:04 +0100118endif()
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +0100119
120#
121# library : cpu_features
122#
123set (CPU_FEATURES_HDRS)
124set (CPU_FEATURES_SRCS)
Guillaume Chatelet20fa92a2019-01-23 12:59:46 +0100125add_cpu_features_headers_and_sources(CPU_FEATURES_HDRS CPU_FEATURES_SRCS)
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +0100126list(APPEND CPU_FEATURES_SRCS $<TARGET_OBJECTS:utils>)
127if(NOT PROCESSOR_IS_X86 AND UNIX)
128 list(APPEND CPU_FEATURES_SRCS $<TARGET_OBJECTS:unix_based_hardware_detection>)
Guillaume Chateletb3bb9042019-01-15 15:42:04 +0100129endif()
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +0100130add_library(cpu_features ${CPU_FEATURES_HDRS} ${CPU_FEATURES_SRCS})
Guillaume Chatelet20fa92a2019-01-23 12:59:46 +0100131set_target_properties(cpu_features PROPERTIES PUBLIC_HEADER "${CPU_FEATURES_HDRS}")
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +0100132setup_include_and_definitions(cpu_features)
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100133target_link_libraries(cpu_features PUBLIC ${CMAKE_DL_LIBS})
William Tambellini78065022019-02-13 02:55:17 -0800134set_property(TARGET cpu_features PROPERTY POSITION_INDEPENDENT_CODE ${BUILD_PIC})
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +0100135target_include_directories(cpu_features
136 PUBLIC $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/cpu_features>
137)
Guillaume Chatelet20fa92a2019-01-23 12:59:46 +0100138
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100139#
140# program : list_cpu_features
141#
142
Guillaume Chatelet20fa92a2019-01-23 12:59:46 +0100143add_executable(list_cpu_features ${PROJECT_SOURCE_DIR}/src/utils/list_cpu_features.c)
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100144target_link_libraries(list_cpu_features PRIVATE cpu_features)
Guillaume Chatelet1976dcd2018-02-12 16:17:21 +0100145add_executable(CpuFeature::list_cpu_features ALIAS list_cpu_features)
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100146
147#
Guillaume Chatelet20fa92a2019-01-23 12:59:46 +0100148# ndk_compat
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +0100149#
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +0100150
Guillaume Chatelet20fa92a2019-01-23 12:59:46 +0100151if(ANDROID)
152add_subdirectory(ndk_compat)
Guillaume Chateletdfdac6a2019-01-17 18:00:21 +0100153endif()
154
155#
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100156# tests
157#
158
159include(CTest)
160if(BUILD_TESTING)
Guillaume Chatelet9df2d782018-02-13 10:07:02 +0100161 # Automatically incorporate googletest into the CMake Project if target not
162 # found.
163 if(NOT TARGET gtest OR NOT TARGET gmock_main)
164 # Download and unpack googletest at configure time.
165 configure_file(
166 cmake/googletest.CMakeLists.txt.in
167 googletest-download/CMakeLists.txt
168 )
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100169
Guillaume Chatelet9df2d782018-02-13 10:07:02 +0100170 execute_process(
171 COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
172 RESULT_VARIABLE result
173 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/googletest-download)
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100174
Guillaume Chatelet9df2d782018-02-13 10:07:02 +0100175 if(result)
176 message(FATAL_ERROR "CMake step for googletest failed: ${result}")
177 endif()
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100178
Guillaume Chatelet9df2d782018-02-13 10:07:02 +0100179 execute_process(
180 COMMAND ${CMAKE_COMMAND} --build .
181 RESULT_VARIABLE result
182 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/googletest-download)
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100183
Guillaume Chatelet9df2d782018-02-13 10:07:02 +0100184 if(result)
185 message(FATAL_ERROR "Build step for googletest failed: ${result}")
186 endif()
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100187
Guillaume Chatelet9df2d782018-02-13 10:07:02 +0100188 # Prevent overriding the parent project's compiler/linker settings on
189 # Windows.
190 set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100191
Guillaume Chatelet9df2d782018-02-13 10:07:02 +0100192 # Add googletest directly to our build. This defines the gtest and
193 # gtest_main targets.
194 add_subdirectory(${CMAKE_BINARY_DIR}/googletest-src
195 ${CMAKE_BINARY_DIR}/googletest-build
196 EXCLUDE_FROM_ALL)
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100197 endif()
Guillaume Chatelet3a156da2018-02-08 16:59:18 +0100198
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100199 add_subdirectory(test)
200endif()
Guillaume Chatelet1976dcd2018-02-12 16:17:21 +0100201
202#
Guillaume Chatelet20fa92a2019-01-23 12:59:46 +0100203# Install cpu_features and list_cpu_features
Guillaume Chatelet1976dcd2018-02-12 16:17:21 +0100204#
205
206include(GNUInstallDirs)
207install(TARGETS cpu_features list_cpu_features
208 EXPORT CpuFeaturesTargets
209 PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/cpu_features
210 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
211 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
212 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
213)
214install(EXPORT CpuFeaturesTargets
215 NAMESPACE CpuFeatures::
216 DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/CpuFeatures
217 COMPONENT Devel
218)
219include(CMakePackageConfigHelpers)
220configure_package_config_file(cmake/CpuFeaturesConfig.cmake.in
Guillaume Chatelet57917d22018-02-12 16:48:57 +0100221 "${PROJECT_BINARY_DIR}/CpuFeaturesConfig.cmake"
Guillaume Chatelet1976dcd2018-02-12 16:17:21 +0100222 INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/CpuFeatures"
223 NO_SET_AND_CHECK_MACRO
224 NO_CHECK_REQUIRED_COMPONENTS_MACRO
225)
226write_basic_package_version_file(
227 "${PROJECT_BINARY_DIR}/CpuFeaturesConfigVersion.cmake"
228 COMPATIBILITY SameMajorVersion
229)
230install(
231 FILES
Guillaume Chatelet20fa92a2019-01-23 12:59:46 +0100232 "${PROJECT_BINARY_DIR}/CpuFeaturesConfig.cmake"
233 "${PROJECT_BINARY_DIR}/CpuFeaturesConfigVersion.cmake"
Guillaume Chatelet1976dcd2018-02-12 16:17:21 +0100234 DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/CpuFeatures"
235 COMPONENT Devel
236)