2009-03-12 16 views
3

私は、自動的にヘッダファイルを生成するための方法を探しています。このファイルはライブラリのパブリックインターフェイスであり、コンパイル前にいくつかの構造体を埋めたいと思っています。CMakeを使ってCヘッダファイルを自動的に生成するには?

たとえば、プライベートヘッダに、私は便利なフィールドを持つ構造:

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

を私はフィールドなしで公共のヘッダにこのような構造を持ちたいが、同じ大きさで(現在は手動で行うことになります)この方法:私はプライベートヘッダ内の構造体を変更したときに、パブリックインターフェイスに悪いサイズの構造体を避けるために、ビルドシステムを作成するときに、これは自動的にCMakeによって生成したいと思い

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

答えて

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

Iは、ヘッダを作成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

関連する問題