mirror of
				https://github.com/google/cpu_features.git
				synced 2025-11-03 22:40:17 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			300 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			CMake
		
	
	
	
	
	
			
		
		
	
	
			300 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			CMake
		
	
	
	
	
	
cmake_minimum_required(VERSION 3.13)
 | 
						|
 | 
						|
project(CpuFeatures VERSION 0.10.1 LANGUAGES C)
 | 
						|
 | 
						|
set(CMAKE_C_STANDARD 99)
 | 
						|
 | 
						|
# when cpu_features is included as subproject (i.e. using add_subdirectory(cpu_features))
 | 
						|
# in the source tree of a project that uses it, test rules are disabled.
 | 
						|
if(NOT CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
 | 
						|
  option(BUILD_TESTING "Enable test rule" OFF)
 | 
						|
else()
 | 
						|
  option(BUILD_TESTING "Enable test rule" ON)
 | 
						|
endif()
 | 
						|
 | 
						|
# Default Build Type to be Release
 | 
						|
if(NOT CMAKE_BUILD_TYPE)
 | 
						|
  set(CMAKE_BUILD_TYPE "Release" CACHE STRING
 | 
						|
      "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
 | 
						|
      FORCE)
 | 
						|
endif(NOT CMAKE_BUILD_TYPE)
 | 
						|
 | 
						|
# An option to enable/disable the executable target list_cpu_features.
 | 
						|
# Disable it by default if the project is included as a subproject.
 | 
						|
if(NOT CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
 | 
						|
  option(BUILD_EXECUTABLE "Build list_cpu_features executable." OFF)
 | 
						|
else()
 | 
						|
  option(BUILD_EXECUTABLE "Build list_cpu_features executable." ON)
 | 
						|
endif()
 | 
						|
 | 
						|
# An option which allows to switch off install steps. Useful for embedding.
 | 
						|
# Disable it by default if the project is included as a subproject.
 | 
						|
if(NOT CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
 | 
						|
  option(ENABLE_INSTALL "Enable install targets" OFF)
 | 
						|
else()
 | 
						|
  option(ENABLE_INSTALL "Enable install targets" ON)
 | 
						|
endif()
 | 
						|
 | 
						|
# BUILD_SHARED_LIBS is a standard CMake variable, but we declare it here to make
 | 
						|
# it prominent in the GUI.
 | 
						|
# cpu_features uses bit-fields which are - to some extends - implementation-defined (see https://en.cppreference.com/w/c/language/bit_field).
 | 
						|
# As a consequence it is discouraged to use cpu_features as a shared library because different compilers may interpret the code in different ways.
 | 
						|
# Prefer static linking from source whenever possible.
 | 
						|
option(BUILD_SHARED_LIBS "Build library as shared." OFF)
 | 
						|
 | 
						|
# Force PIC on unix when building shared libs
 | 
						|
# see: https://en.wikipedia.org/wiki/Position-independent_code
 | 
						|
if(BUILD_SHARED_LIBS AND UNIX)
 | 
						|
  option(CMAKE_POSITION_INDEPENDENT_CODE "Build with Position Independent Code." ON)
 | 
						|
endif()
 | 
						|
 | 
						|
include(CheckIncludeFile)
 | 
						|
include(CheckSymbolExists)
 | 
						|
include(GNUInstallDirs)
 | 
						|
 | 
						|
macro(setup_include_and_definitions TARGET_NAME)
 | 
						|
  target_include_directories(${TARGET_NAME}
 | 
						|
    PUBLIC  $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
 | 
						|
    PRIVATE $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include/internal>
 | 
						|
  )
 | 
						|
  target_compile_definitions(${TARGET_NAME}
 | 
						|
    PUBLIC STACK_LINE_READER_BUFFER_SIZE=1024
 | 
						|
  )
 | 
						|
endmacro()
 | 
						|
 | 
						|
set(PROCESSOR_IS_MIPS FALSE)
 | 
						|
set(PROCESSOR_IS_ARM FALSE)
 | 
						|
set(PROCESSOR_IS_AARCH64 FALSE)
 | 
						|
set(PROCESSOR_IS_X86 FALSE)
 | 
						|
set(PROCESSOR_IS_POWER FALSE)
 | 
						|
set(PROCESSOR_IS_S390X FALSE)
 | 
						|
set(PROCESSOR_IS_RISCV FALSE)
 | 
						|
set(PROCESSOR_IS_LOONGARCH FALSE)
 | 
						|
 | 
						|
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^mips")
 | 
						|
  set(PROCESSOR_IS_MIPS TRUE)
 | 
						|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "(^aarch64)|(^arm64)|(^ARM64)")
 | 
						|
  set(PROCESSOR_IS_AARCH64 TRUE)
 | 
						|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm")
 | 
						|
  set(PROCESSOR_IS_ARM TRUE)
 | 
						|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "(x86)|(x86_64)|(AMD64|amd64)|(^i.86$)")
 | 
						|
  set(PROCESSOR_IS_X86 TRUE)
 | 
						|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)")
 | 
						|
  set(PROCESSOR_IS_POWER TRUE)
 | 
						|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(s390x)")
 | 
						|
  set(PROCESSOR_IS_S390X TRUE)
 | 
						|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^riscv")
 | 
						|
  set(PROCESSOR_IS_RISCV TRUE)
 | 
						|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^loongarch")
 | 
						|
  set(PROCESSOR_IS_LOONGARCH TRUE)
 | 
						|
endif()
 | 
						|
 | 
						|
macro(add_cpu_features_headers_and_sources HDRS_LIST_NAME SRCS_LIST_NAME)
 | 
						|
  list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpu_features_macros.h)
 | 
						|
  list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpu_features_cache_info.h)
 | 
						|
  file(GLOB IMPL_SOURCES CONFIGURE_DEPENDS "${PROJECT_SOURCE_DIR}/src/impl_*.c")
 | 
						|
  list(APPEND ${SRCS_LIST_NAME} ${IMPL_SOURCES})
 | 
						|
  if(PROCESSOR_IS_MIPS)
 | 
						|
      list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_mips.h)
 | 
						|
  elseif(PROCESSOR_IS_ARM)
 | 
						|
      list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_arm.h)
 | 
						|
  elseif(PROCESSOR_IS_AARCH64)
 | 
						|
      list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_aarch64.h)
 | 
						|
      list(APPEND ${SRCS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/internal/cpuid_aarch64.h)
 | 
						|
      list(APPEND ${SRCS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/internal/windows_utils.h)
 | 
						|
  elseif(PROCESSOR_IS_X86)
 | 
						|
      list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_x86.h)
 | 
						|
      list(APPEND ${SRCS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/internal/cpuid_x86.h)
 | 
						|
      list(APPEND ${SRCS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/internal/windows_utils.h)
 | 
						|
  elseif(PROCESSOR_IS_POWER)
 | 
						|
      list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_ppc.h)
 | 
						|
  elseif(PROCESSOR_IS_S390X)
 | 
						|
      list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_s390x.h)
 | 
						|
  elseif(PROCESSOR_IS_RISCV)
 | 
						|
      list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_riscv.h)
 | 
						|
  elseif(PROCESSOR_IS_LOONGARCH)
 | 
						|
      list(APPEND ${HDRS_LIST_NAME} ${PROJECT_SOURCE_DIR}/include/cpuinfo_loongarch.h)
 | 
						|
  else()
 | 
						|
    message(FATAL_ERROR "Unsupported architectures ${CMAKE_SYSTEM_PROCESSOR}")
 | 
						|
  endif()
 | 
						|
endmacro()
 | 
						|
 | 
						|
#
 | 
						|
# library : utils
 | 
						|
#
 | 
						|
 | 
						|
add_library(utils OBJECT
 | 
						|
  ${PROJECT_SOURCE_DIR}/include/internal/bit_utils.h
 | 
						|
  ${PROJECT_SOURCE_DIR}/include/internal/filesystem.h
 | 
						|
  ${PROJECT_SOURCE_DIR}/include/internal/stack_line_reader.h
 | 
						|
  ${PROJECT_SOURCE_DIR}/include/internal/string_view.h
 | 
						|
  ${PROJECT_SOURCE_DIR}/src/filesystem.c
 | 
						|
  ${PROJECT_SOURCE_DIR}/src/stack_line_reader.c
 | 
						|
  ${PROJECT_SOURCE_DIR}/src/string_view.c
 | 
						|
)
 | 
						|
setup_include_and_definitions(utils)
 | 
						|
 | 
						|
#
 | 
						|
# library : unix_based_hardware_detection
 | 
						|
#
 | 
						|
 | 
						|
if(UNIX)
 | 
						|
  add_library(unix_based_hardware_detection OBJECT
 | 
						|
    ${PROJECT_SOURCE_DIR}/include/internal/hwcaps.h
 | 
						|
    ${PROJECT_SOURCE_DIR}/src/hwcaps_linux_or_android.c
 | 
						|
    ${PROJECT_SOURCE_DIR}/src/hwcaps_freebsd_or_openbsd.c
 | 
						|
    ${PROJECT_SOURCE_DIR}/src/hwcaps.c
 | 
						|
  )
 | 
						|
  setup_include_and_definitions(unix_based_hardware_detection)
 | 
						|
  check_include_file(dlfcn.h HAVE_DLFCN_H)
 | 
						|
  if(HAVE_DLFCN_H)
 | 
						|
    target_compile_definitions(unix_based_hardware_detection PRIVATE HAVE_DLFCN_H)
 | 
						|
  endif()
 | 
						|
  check_symbol_exists(getauxval "sys/auxv.h" HAVE_STRONG_GETAUXVAL)
 | 
						|
  check_symbol_exists(elf_aux_info "sys/auxv.h" HAVE_STRONG_ELF_AUX_INFO)
 | 
						|
  if(HAVE_STRONG_GETAUXVAL)
 | 
						|
    target_compile_definitions(unix_based_hardware_detection PRIVATE HAVE_STRONG_GETAUXVAL)
 | 
						|
  endif()
 | 
						|
  if(HAVE_STRONG_ELF_AUX_INFO)
 | 
						|
    target_compile_definitions(unix_based_hardware_detection PUBLIC HAVE_STRONG_ELF_AUX_INFO)
 | 
						|
  endif()
 | 
						|
endif()
 | 
						|
 | 
						|
#
 | 
						|
# library : cpu_features
 | 
						|
#
 | 
						|
set (CPU_FEATURES_HDRS)
 | 
						|
set (CPU_FEATURES_SRCS)
 | 
						|
add_cpu_features_headers_and_sources(CPU_FEATURES_HDRS CPU_FEATURES_SRCS)
 | 
						|
list(APPEND CPU_FEATURES_SRCS $<TARGET_OBJECTS:utils>)
 | 
						|
if(NOT PROCESSOR_IS_X86 AND UNIX)
 | 
						|
  list(APPEND CPU_FEATURES_SRCS $<TARGET_OBJECTS:unix_based_hardware_detection>)
 | 
						|
endif()
 | 
						|
add_library(cpu_features ${CPU_FEATURES_HDRS} ${CPU_FEATURES_SRCS})
 | 
						|
set_target_properties(cpu_features PROPERTIES PUBLIC_HEADER "${CPU_FEATURES_HDRS}")
 | 
						|
setup_include_and_definitions(cpu_features)
 | 
						|
target_link_libraries(cpu_features PUBLIC ${CMAKE_DL_LIBS})
 | 
						|
target_include_directories(cpu_features
 | 
						|
  PUBLIC $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/cpu_features>
 | 
						|
)
 | 
						|
 | 
						|
if(APPLE)
 | 
						|
  target_compile_definitions(cpu_features PRIVATE HAVE_SYSCTLBYNAME)
 | 
						|
endif()
 | 
						|
add_library(CpuFeatures::cpu_features ALIAS cpu_features)
 | 
						|
 | 
						|
#
 | 
						|
# program : list_cpu_features
 | 
						|
#
 | 
						|
 | 
						|
if(BUILD_EXECUTABLE)
 | 
						|
  add_executable(list_cpu_features ${PROJECT_SOURCE_DIR}/src/utils/list_cpu_features.c)
 | 
						|
  target_link_libraries(list_cpu_features PRIVATE cpu_features)
 | 
						|
  add_executable(CpuFeatures::list_cpu_features ALIAS list_cpu_features)
 | 
						|
endif()
 | 
						|
 | 
						|
#
 | 
						|
# ndk_compat
 | 
						|
#
 | 
						|
 | 
						|
if(ANDROID)
 | 
						|
add_subdirectory(ndk_compat)
 | 
						|
endif()
 | 
						|
 | 
						|
#
 | 
						|
# tests
 | 
						|
#
 | 
						|
 | 
						|
include(CTest)
 | 
						|
if(BUILD_TESTING)
 | 
						|
  # Automatically incorporate googletest into the CMake Project if target not
 | 
						|
  # found.
 | 
						|
  enable_language(CXX)
 | 
						|
 | 
						|
  if(NOT TARGET gtest OR NOT TARGET gmock_main)
 | 
						|
    # Download and unpack googletest at configure time.
 | 
						|
    configure_file(
 | 
						|
      cmake/googletest.CMakeLists.txt.in
 | 
						|
      googletest-download/CMakeLists.txt
 | 
						|
    )
 | 
						|
 | 
						|
    execute_process(
 | 
						|
      COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
 | 
						|
      RESULT_VARIABLE result
 | 
						|
      WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/googletest-download)
 | 
						|
 | 
						|
    if(result)
 | 
						|
      message(FATAL_ERROR "CMake step for googletest failed: ${result}")
 | 
						|
    endif()
 | 
						|
 | 
						|
    execute_process(
 | 
						|
      COMMAND ${CMAKE_COMMAND} --build .
 | 
						|
      RESULT_VARIABLE result
 | 
						|
      WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/googletest-download)
 | 
						|
 | 
						|
    if(result)
 | 
						|
      message(FATAL_ERROR "Build step for googletest failed: ${result}")
 | 
						|
    endif()
 | 
						|
 | 
						|
    # Prevent overriding the parent project's compiler/linker settings on
 | 
						|
    # Windows.
 | 
						|
    set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
 | 
						|
 | 
						|
    # Add googletest directly to our build. This defines the gtest and
 | 
						|
    # gtest_main targets.
 | 
						|
    add_subdirectory(${CMAKE_BINARY_DIR}/googletest-src
 | 
						|
                     ${CMAKE_BINARY_DIR}/googletest-build
 | 
						|
                     EXCLUDE_FROM_ALL)
 | 
						|
  endif()
 | 
						|
 | 
						|
  add_subdirectory(test)
 | 
						|
endif()
 | 
						|
 | 
						|
#
 | 
						|
# Install cpu_features and list_cpu_features
 | 
						|
#
 | 
						|
if(ENABLE_INSTALL)
 | 
						|
  include(GNUInstallDirs)
 | 
						|
  install(TARGETS cpu_features
 | 
						|
    EXPORT CpuFeaturesTargets
 | 
						|
    PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/cpu_features
 | 
						|
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
 | 
						|
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
 | 
						|
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
 | 
						|
    BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR}
 | 
						|
  )
 | 
						|
  if(BUILD_EXECUTABLE)
 | 
						|
    install(TARGETS list_cpu_features
 | 
						|
      EXPORT CpuFeaturesTargets
 | 
						|
      PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/cpu_features
 | 
						|
      ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
 | 
						|
      LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
 | 
						|
      RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
 | 
						|
      BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR}
 | 
						|
    )
 | 
						|
  endif()
 | 
						|
  install(EXPORT CpuFeaturesTargets
 | 
						|
    NAMESPACE CpuFeatures::
 | 
						|
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/CpuFeatures
 | 
						|
    COMPONENT Devel
 | 
						|
  )
 | 
						|
  include(CMakePackageConfigHelpers)
 | 
						|
  configure_package_config_file(cmake/CpuFeaturesConfig.cmake.in
 | 
						|
    "${PROJECT_BINARY_DIR}/CpuFeaturesConfig.cmake"
 | 
						|
    INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/CpuFeatures"
 | 
						|
    NO_SET_AND_CHECK_MACRO
 | 
						|
    NO_CHECK_REQUIRED_COMPONENTS_MACRO
 | 
						|
  )
 | 
						|
  write_basic_package_version_file(
 | 
						|
    "${PROJECT_BINARY_DIR}/CpuFeaturesConfigVersion.cmake"
 | 
						|
    COMPATIBILITY SameMajorVersion
 | 
						|
  )
 | 
						|
  install(
 | 
						|
    FILES
 | 
						|
      "${PROJECT_BINARY_DIR}/CpuFeaturesConfig.cmake"
 | 
						|
      "${PROJECT_BINARY_DIR}/CpuFeaturesConfigVersion.cmake"
 | 
						|
    DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/CpuFeatures"
 | 
						|
    COMPONENT Devel
 | 
						|
  )
 | 
						|
endif()
 |