CMakeを使用してCヘッダーファイルを自動的に生成する方法

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

  •  10-07-2019
  •  | 
  •  

質問

ヘッダーファイルを自動的に生成する方法を探しています。このファイルはライブラリのパブリックインターフェイスであり、「入力」したいコンパイル前のいくつかの構造ともの。

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

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
  }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top