2009-03-12 13 views
3

Ich bin auf der Suche nach einer Möglichkeit, eine Header-Datei automatisch zu generieren. Diese Datei ist die öffentliche Schnittstelle einer Bibliothek und ich möchte einige Strukturen und Sachen vor der Kompilierung "füllen".Wie automatisch C-Header-Datei mit CMake generieren?

Zum Beispiel im privaten Header habe ich eine Struktur mit nützlichen Feldern:

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

Und ich würde diese Struktur wie ohne die Felder im öffentlichen Header habe, aber mit der gleichen Größe (derzeit manuell durchgeführt auf diese Weise):

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

ich mag würde dies automatisch durch CMake erzeugt haben, wenn das Build-Systems, um die Schaffung schlecht Größe Struktur in öffentlicher Schnittstelle zu vermeiden, wenn ich die Struktur in privaten Header ändern.

Antwort

9

In der Tat, CMake können Sie Dateien (mit configure_file (file.h.in file.h)) erzeugen und auch eine Art Größe überprüfen (mit check_type_size ("type" header.h)), so ist es einfach, die beiden haben eine angemessene Öffentlichkeit zu kombinieren Header. Hier ist das Stück Code, den ich in CMakeList.txt verwenden:

# 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) 

Und im öffentlichen Header pub_type.h.in:

#define MY_SIZEOF_TYPE1_T ${MY_SIZEOF_TYPE1_T} 

Das funktioniert ziemlich gut :)

+1

Genau das, was ich brauchte, danke! –

+2

Sie sollten angeben, dass Sie die Zeile hinzufügen müssen: include (CheckTypeSize). –

2

Ich würde eine Exe schreiben, die den Header erstellt.

zum Beispiel:

#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

Ich dachte schon darüber nach, aber ich fragte mich, ob ein Werkzeug wie CMake ein nützliches Modul hatte, das mir dabei half. Übrigens würde ich lieber ein Shell-Skript als eine Exe schreiben, solange es für Unix-Plattformen ist. – claf

+0

Danke. Der Vorteil der Verwendung einer Bin besteht darin, dass Sie den Compiler dazu bringen können, die Größen für Sie zu berechnen. Mit einem Skript müssen Sie es selbst tun und Sie könnten es falsch verstehen. –

+0

Das ist richtig, werde darüber nachdenken! – claf

Verwandte Themen