2009-03-12 6 views
3

Я ищу способ автоматического создания файла заголовка. Этот файл является публичным интерфейсом библиотеки, и я хочу «заполнить» некоторые структуры и материалы перед компиляцией.Как автоматически генерировать заголовочный файл 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 при создании системы сборки для того, чтобы избежать плохого размера структуры в открытом интерфейсе при изменении структуры в частном заголовке.

ответ

9

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

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

+1

То, что мне нужно, спасибо! –

+2

Необходимо указать, что вам нужно добавить строку: include (CheckTypeSize). –

2

Я бы написал 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 
    } 
+0

Я уже думал об этом, но мне было интересно, если бы у инструмента, такого как cmake, был полезный модуль, чтобы помочь мне это сделать. Кстати, я бы предпочел написать сценарий оболочки вместо exe, если он предназначен для Unix-платформ. – claf

+0

Спасибо. Преимущество использования бункера заключается в том, что вы можете заставить компилятор выработать размеры для вас. Используя скрипт, вам нужно будет сделать это самостоятельно, и вы можете ошибаться. –

+0

Правильно, подумаем об этом! – claf