Comment générer automatiquement un fichier d'en-tête C en utilisant CMake?

StackOverflow https://stackoverflow.com/questions/637963

  •  10-07-2019
  •  | 
  •  

Question

Je cherche 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 souhaite "remplir". des structures et des trucs avant la compilation.

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 j'aimerais avoir cette structure dans l'en-tête public sans les champs mais avec la même taille (actuellement effectuée manuellement) de cette façon:

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

J'aimerais que ceci soit généré automatiquement par CMake lors de la création du système de construction afin d'éviter une structure de taille incorrecte dans l'interface publique lorsque je modifie la structure dans l'en-tête privé.

Était-ce utile?

La solution

En fait, CMake vous permet de générer des fichiers (avec configure_file (fichier.h.in fichier.h) ) et de vérifier une taille de type (avec check_type_size (" type " ; header.h) ) donc il est facile de combiner ces deux pour avoir un en-tête public approprié. 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 public pub_type.h.in:

#define MY_SIZEOF_TYPE1_T ${MY_SIZEOF_TYPE1_T}

Cela fonctionne très bien:)

Autres conseils

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
  }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top