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

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

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

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 автоматически генерировал это при создании системы сборки, чтобы избежать неправильной структуры размера в открытом интерфейсе при изменении структуры в частном заголовке.

Ответы [ 3 ]

9 голосов
/ 07 апреля 2009

На самом деле, 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}

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

3 голосов
/ 24 января 2010

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

2 голосов
/ 12 марта 2009

Я бы написал 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
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...