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;
そして、この構造をフィールドなしでパブリックヘッダーに入れたいのですが、同じ方法で(現在は手動で)この方法で:
typedef struct mystuff_attr_t {
char _opaque[ 20 ];
} mystuff_attr_t;
プライベートヘッダーの構造体を変更するときにパブリックインターフェイスのサイズの悪い構造体を避けるために、ビルドシステムの作成時にCMakeによって自動的に生成されるようにします。
解決
実際、CMakeを使用すると、ファイルを生成し( configure_file(file.h.in file.h)
を使用)、型のサイズを確認することもできます( check_type_size(" type&quot ; header.h)
)したがって、これら2つを組み合わせて適切なパブリックヘッダーを簡単に作成できます。 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}
これはかなりうまく機能します:)
他のヒント
Makeheaders ツール(マニュアル)。
ヘッダーを作成する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
}
所属していません StackOverflow