2009-03-12 5 views
3

Je suis à la recherche d'un moyen de générer automatiquement un fichier d'en-tête. Ce fichier est l'interface publique d'une bibliothèque et je veux "remplir" certaines structures et d'autres choses avant la compilation.Comment générer automatiquement un fichier d'en-tête C à l'aide de CMake?

Par exemple, dans l'en-tête privé J'ai une structure avec des champs utiles:

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

Et je voudrais avoir cette structure dans l'en-tête public sans les champs, mais avec la même taille (actuellement réalisée manuellement) ainsi:

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

Je voudrais avoir cette généré automatiquement par CMake lors de la création du système de construction afin d'éviter struct mauvaise taille dans l'interface publique lorsque je change la struct en-tête privé.

Répondre

9

En fait, CMake vous permettent de générer des fichiers (en utilisant configure_file (file.h.in file.h)) et également de vérifier une taille de type (en utilisant check_type_size ("type" header.h)) il est donc facile de combiner les deux pour avoir une population appropriée entête. Voici le morceau de code que j'utilise dans 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) 

Et dans l'en-tête du public pub_type.h.in:

#define MY_SIZEOF_TYPE1_T ${MY_SIZEOF_TYPE1_T} 

Cela fonctionne assez bien :)

+1

Exactement ce dont j'avais besoin, merci! –

+2

Vous devez spécifier que vous devez ajouter la ligne: include (CheckTypeSize). –

2

Je voudrais écrire un exe qui crée l'en-tête.

par exemple:

#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

Je pensais déjà à cela mais je me demandais si un outil comme cmake avait un module utile pour m'aider à le faire. En passant, je préfèrerais écrire un script shell au lieu d'un exe tant que c'est pour les plateformes unix. – claf

+0

Merci. L'avantage d'utiliser une corbeille est que vous pouvez obtenir le compilateur pour calculer les tailles pour vous. En utilisant un script, vous devrez le faire vous-même et vous pourriez vous tromper. –

+0

C'est vrai, va y penser! – claf

Questions connexes