Spec-Zone.ru › CMake

CheckTypeSize

Этот модуль предоставляет команду для проверки размера типа или выражения C/C++.

Загрузите этот модуль в проект CMake с помощью:

include(CheckTypeSize)

Команды

Этот модуль предоставляет следующую команду:

check_type_size

Однократно проверяет, существует ли тип или выражение C/C++, и определяет его размер:

check_type_size(
  <type>
  <size-var>
  [RESULT_VARIABLE <result-var>]
  [BUILTIN_TYPES_ONLY]
  [LANGUAGE <language>]
)

Аргументы:

<type>

Проверяемый тип или выражение.

<size-var>

Имя внутренней переменной кэша для хранения размера типа или выражения <type>. Это имя также используется в качестве префикса, как описано ниже.

RESULT_VARIABLE <result-var>

Добавлено в версии 4.2.

Имя внутренней переменной кэша, содержащей логическое значение, указывающее, существует ли тип или выражение <type>. Если аргумент не задан, команда по умолчанию определит внутреннюю переменную кэша с именем HAVE_<size-var>.

BUILTIN_TYPES_ONLY

Если задан, при проверке поддерживаются только встроенные типы компилятора. Если аргумент не задан, команда проверяет наличие стандартных заголовочных файлов <sys/types.h>, <stdint.h> и <stddef.h> и сохраняет результаты во внутренних переменных кэша HAVE_SYS_TYPES_H, HAVE_STDINT_H и HAVE_STDDEF_H. Для типов C++ std:: также проверяются <cstdint> и <cstddef>, при этом соответственно определяются HAVE_CSTDINT и HAVE_CSTDDEF. Команда автоматически включает доступные заголовочные файлы в проверку размера типа, что позволяет проверять типы, определённые в этих заголовочных файлах.

LANGUAGE <language>

Для выполнения проверки использует компилятор <language>. Допустимые значения: C и CXX. Если значение не указано, по умолчанию используется C.

Переменные результатов

Результаты сохраняются в следующих переменных:

<size-var>

Внутренняя переменная кэша, содержащая одно из следующих значений:

<size>

Если тип или выражение <type> существует, переменная будет содержать ненулевой размер <size> в байтах.

0

Если размер типа зависит от архитектуры. Это может произойти, когда в CMAKE_OSX_ARCHITECTURES указано несколько архитектур. В этом случае также определяется переменная <size-var>_KEYS, а переменная <size-var>_CODE содержит сопоставление проверок препроцессора, как описано ниже.

"" (пустая строка)

Если тип или выражение <type> не существует.

HAVE_<size-var>

Внутренняя переменная кэша, содержащая логическое значение, указывающее, существует ли тип или выражение <type>. Эта переменная определяется, если аргумент RESULT_VARIABLE не используется.

<result-var>

Добавлено в версии 4.2.

Внутренняя переменная кэша, определяемая при использовании аргумента RESULT_VARIABLE. Она содержит логическое значение, указывающее, существует ли тип или выражение <type> (то же значение, что и HAVE_<size-var>). В этом случае переменная HAVE_<size-var> не определяется.

<size-var>_CODE

Переменная CMake, содержащая код препроцессора для определения макроса <size-var> равным размеру типа или для того, чтобы макрос остался неопределённым, если тип не существует.

Если размер типа зависит от архитектуры (значение <size-var> равно 0), эта переменная содержит сопоставление проверок препроцессора: от макроса каждой архитектуры к соответствующему размеру типа.

<size-var>_KEYS

Переменная CMake, которая определяется только в том случае, если размер типа зависит от архитектуры (значение <size-var> равно 0), и содержит список макросов архитектур. Значение для каждого ключа хранится в переменных <size-var>-<key>.

Переменные, влияющие на проверку

Перед вызовом этой команды можно задать следующие переменные, чтобы изменить способ выполнения проверки:

CMAKE_REQUIRED_FLAGS

Строка с дополнительными флагами, разделёнными пробелами, которые передаются компилятору. Список, разделённый точками с запятой, использовать нельзя. Содержимое CMAKE_<LANG>_FLAGS и связанных с ним переменных CMAKE_<LANG>_FLAGS_<CONFIG>, специфичных для конфигурации, автоматически добавляется в начало команды компилятора перед содержимым этой переменной.

CMAKE_REQUIRED_DEFINITIONS

Список, разделённый точками с запятой, определений компилятора, каждое в форме -DFOO или -DFOO=bar. Определение имени, указанного в аргументе переменной результата команды проверки, также добавляется автоматически.

CMAKE_REQUIRED_INCLUDES

Список, разделённый точками с запятой, путей поиска заголовочных файлов, передаваемых компилятору. Используются только эти пути поиска заголовочных файлов; содержимое свойства каталога INCLUDE_DIRECTORIES игнорируется.

CMAKE_REQUIRED_LINK_OPTIONS

Добавлено в версии 3.14.

Список, разделённый точками с запятой, параметров для добавления в команду компоновки (подробности см. в try_compile()).

CMAKE_REQUIRED_LIBRARIES

Список, разделённый точками с запятой, библиотек для добавления в команду компоновки. Это могут быть имена системных библиотек или импортированные цели (подробности см. в try_compile()).

CMAKE_REQUIRED_LINK_DIRECTORIES

Добавлено в версии 3.31.

Список, разделённый точками с запятой, путей поиска библиотек, передаваемых компоновщику (подробности см. в try_compile()).

CMAKE_REQUIRED_QUIET

Добавлено в версии 3.1.

Если эта переменная имеет логическое значение «истина», все сообщения о состоянии, связанные с проверкой, подавляются.

CMAKE_EXTRA_INCLUDE_FILES

Список, разделённый точками с запятой, дополнительных заголовочных файлов, включаемых при выполнении проверки.

Примеры

Рассмотрим следующий код:

include(CheckTypeSize)

# Check for size of long.
check_type_size(long SIZEOF_LONG)

message("HAVE_SIZEOF_LONG: ${HAVE_SIZEOF_LONG}")
message("SIZEOF_LONG: ${SIZEOF_LONG}")
message("SIZEOF_LONG_CODE: ${SIZEOF_LONG_CODE}")

В 64-разрядной архитектуре вывод может выглядеть примерно так:

HAVE_SIZEOF_LONG: TRUE
SIZEOF_LONG: 8
SIZEOF_LONG_CODE: #define SIZEOF_LONG 8

На платформах Apple, если в CMAKE_OSX_ARCHITECTURES указано несколько архитектур, размеры типов могут зависеть от архитектуры. Например, для следующего кода:

include(CheckTypeSize)

check_type_size(long SIZEOF_LONG)

message("HAVE_SIZEOF_LONG: ${HAVE_SIZEOF_LONG}")
message("SIZEOF_LONG: ${SIZEOF_LONG}")
foreach(key IN LISTS SIZEOF_LONG_KEYS)
  message("key: ${key}")
  message("value: ${SIZEOF_LONG-${key}}")
endforeach()
message("SIZEOF_LONG_CODE:\n${SIZEOF_LONG_CODE}")

результат может быть таким:

HAVE_SIZEOF_LONG: TRUE
SIZEOF_LONG: 0
key: __i386
value: 4
key: __x86_64
value: 8
SIZEOF_LONG_CODE:
#if defined(__i386)
# define SIZEOF_LONG 4
#elif defined(__x86_64)
# define SIZEOF_LONG 8
#else
# error SIZEOF_LONG unknown
#endif

Пример: файл конфигурации

В следующем примере показано, как использовать переменные результатов в файле конфигурации:

include(CheckTypeSize)
check_type_size(long SIZEOF_LONG)

configure_file(config.h.in config.h @ONLY)
config.h.in
/* Define whether the type 'long' exists. */
#cmakedefine HAVE_SIZEOF_LONG

/* The size of 'long', as computed by sizeof. */
@SIZEOF_LONG_CODE@

Пример: проверка сложных выражений

Несмотря на название этого модуля, его также можно использовать для определения размера более сложных выражений. Например, для проверки размера члена структуры:

include(CheckTypeSize)
check_type_size("((struct something*)0)->member" SIZEOF_MEMBER)

Пример: изолированная проверка

В следующем примере проверка выполняется с временно изменённым набором дополнительных заголовочных файлов с использованием переменной CMAKE_EXTRA_INCLUDE_FILES и модуля CMakePushCheckState. Результат проверки сохраняется во внутренней переменной кэша HAVE_SIZEOF_UNION_SEMUN, а размер — во внутренней переменной кэша SIZEOF_UNION_SEMUN.

include(CheckTypeSize)
include(CMakePushCheckState)

cmake_push_check_state(RESET)
  set(CMAKE_EXTRA_INCLUDE_FILES sys/types.h sys/ipc.h sys/sem.h)
  check_type_size("union semun" SIZEOF_UNION_SEMUN)
cmake_pop_check_state()

Пример: настройка переменной результата

Начиная с CMake 4.2, имя переменной HAVE_<size-var> можно настроить с помощью аргумента RESULT_VARIABLE. В следующем примере этот модуль используется для проверки существования struct flock, а результат сохраняется во внутренней переменной кэша MyProj_HAVE_STRUCT_FLOCK:

cmake_minimum_required(VERSION 4.2)

# ...

include(CheckTypeSize)
include(CMakePushCheckState)

cmake_push_check_state(RESET)
  set(CMAKE_EXTRA_INCLUDE_FILES "fcntl.h")

  check_type_size(
    "struct flock"
    MyProj_SIZEOF_STRUCT_FLOCK
    RESULT_VARIABLE MyProj_HAVE_STRUCT_FLOCK
  )
cmake_pop_check_state()

© 2000–2026 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/latest/module/CheckTypeSize.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API