2009-03-12 20 views
3

Otomatik olarak bir başlık dosyası oluşturmanın bir yolunu arıyorum. Bu dosya bir kütüphanenin genel arayüzüdür ve derlemeden önce bazı yapıları ve nesneleri "doldurmak" istiyorum.CMake kullanarak otomatik olarak C başlık dosyası nasıl oluşturulur?

Örneğin, özel başlığında ben kullanışlı alanları ile bir yapıya sahiptir:

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

Ve alanlar olmadan ama şu anda elle yapılan aynı boyutta (kamu başlığında bu yapıyı istiyorum) bu şekilde: Ben özel başlığındaki yapı değiştirdiğinizde kamu arayüzde kötü boyut yapı önlemek için inşa sistemini oluştururken bu otomatik CMake tarafından oluşturulan istiyorum

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

.

cevap

9

Aslında, CKağıt dosyaları (configure_file (file.h.in file.h) kullanarak) oluşturmasını sağlar ve aynı zamanda bir tür boyutunu kontrol (check_type_size ("type" header.h) kullanarak) bu yüzden uygun bir halkı var bu iki birleştirmek kolay için: Örneğin

başlığı. İşte CMakeList.txt kullandığımız kod parçasıdır:

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

Ve public üst pub_type.h.in içinde

:

#define MY_SIZEOF_TYPE1_T ${MY_SIZEOF_TYPE1_T} 

Bu oldukça iyi çalışıyor :)

+1

Tam olarak ihtiyacım olan şey, teşekkürler! –

+2

Satırı eklemeniz gerektiğini belirtmelisiniz: include (CheckTypeSize). –

2

Başlığı oluşturan bir exe yazar.

#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

Zaten bunu düşündüm ama cmake gibi bir aracın bunu yapmamda bana yardımcı olacak bazı kullanışlı modülleri olup olmadığını merak ediyordum. Bu arada, unix platformları için olduğu sürece bir exe yerine bir kabuk betiği yazmayı tercih ederim. – claf

+0

Teşekkürler. Bir bölme kullanmanın avantajı, derleyicinin sizin için boyutları belirlemesidir. Bir betik kullanarak bunu kendiniz yapmanız gerekecektir ve yanlış anlayabilirsiniz. –

+0

Doğru, düşüneceğim! – claf

İlgili konular