Как автоматически сгенерировать заголовочный файл C с помощью CMake?

Я ищу способ автоматически генерировать файл заголовка. Этот файл является общедоступным интерфейсом библиотеки, и я хочу «заполнить» некоторые структуры и прочее перед компиляцией.

Например, в приватном заголовке у меня есть структура с полезными полями:

typedef struct mystuff_attr_t {
  int                      _detachstate;
  mystuff_scope_t          _scope;
  cpu_set_t                _cpuset;
  size_t                   _stacksize;
  void*                    _stackaddr;
} mystuff_attr_t;

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

typedef struct mystuff_attr_t {
  char _opaque[ 20 ]; 
} mystuff_attr_t;

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


person claf    schedule 12.03.2009    source источник


Ответы (3)


На самом деле, CMake позволяет вам создавать файлы (используя configure_file (file.h.in file.h) ), а также проверять размер типа (используя check_type_size ("type" header.h)), поэтому их легко объединить, чтобы получить правильный общедоступный заголовок. Вот фрагмент кода, который я использую в CMakeList.txt:

# Where to search for types :
set (CMAKE_EXTRA_INCLUDE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/private_type.h)

# Type1 :
check_type_size ("type1_t" MY_SIZEOF_TYPE1_T)

# Generate public header :
configure_file (${CMAKE_CURRENT_SOURCE_DIR}/pub_type.h.in ${CMAKE_CURRENT_BINARY_DIR}/pub_type.h)

# Need to set this back to nothing :
set (CMAKE_EXTRA_INCLUDE_FILES)

И в публичном заголовке pub_type.h.in:

#define MY_SIZEOF_TYPE1_T ${MY_SIZEOF_TYPE1_T}

Это работает довольно хорошо :)

person claf    schedule 07.04.2009
comment
Вы должны указать, что вам нужно добавить строку: include(CheckTypeSize). - person Jérôme; 15.11.2011

Инструмент Makeheaders (руководство).

person Ollie Saunders    schedule 24.01.2010
comment
отличный инструмент, спасибо - person hmmftg; 13.07.2021

Я бы написал exe, который создает заголовок.

Например:

#include <stdio.h>

#define PUBLIC(TYPE) \
printf( "typedef struct %s { char _opaque[ %d ]; } %s;\n", #TYPE, sizeof(TYPE), #TYPE )

int main()
  {
  // start header stuff

  PUBLIC(mystuff_attr_t);

  // end header stuff
  }
person David Allan Finch    schedule 12.03.2009
comment
Я уже думал об этом, но мне было интересно, есть ли у такого инструмента, как cmake, какой-нибудь полезный модуль, который поможет мне в этом. Кстати, я бы предпочел написать сценарий оболочки вместо исполняемого файла, если он предназначен для платформ Unix. - person claf; 12.03.2009
comment
Спасибо. Преимущество использования бина состоит в том, что вы можете заставить компилятор вычислить размеры за вас. Используя сценарий, вам нужно будет сделать это самостоятельно, и вы можете ошибиться. - person David Allan Finch; 12.03.2009