如何使用CMake自动生成C头文件?

5
我正在寻找一种自动生成头文件的方法。这个文件是库的公共接口,我想在编译之前“填充”一些结构和内容。
例如,在私有头文件中,我有一个带有有用字段的结构体:
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自动生成此内容,以避免在公共接口中出现错误大小的结构体。
3个回答

10

事实上,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}

这个效果非常不错 :)


3
你应该明确指出需要添加以下代码行:include(CheckTypeSize)。 - Jérôme

4

2
我会编写一个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
  }

我已经想到了,但我想知道像cmake这样的工具是否有一些有用的模块可以帮助我做到这一点。顺便说一下,只要是针对Unix平台,我宁愿编写一个shell脚本而不是exe程序。 - claf
谢谢。使用二进制文件的优点是可以让编译器为您计算大小。如果使用脚本,您需要自己完成这项工作,而且可能会出错。 - David Allan Finch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接