【问题标题】:How to generate a header in source with cmake?如何使用 cmake 在源代码中生成标头?
【发布时间】:2010-11-19 12:35:01
【问题描述】:

在我的项目中,我编写了一个“模式”文件和实用程序来生成头文件。 我正在使用 cmake 和源代码构建来构建应用程序。

目前我必须手动重新生成头文件然后构建应用程序。

然后我想出了这个 CMakeLists.txt 语句,但是它们在构建目录而不是在源目录中生成标头。

configure_file( generator.pl generator COPYONLY )
configure_file( schema.txt.in schema.txt COPYONLY )
add_custom_command(
    OUTPUT generated.h
    COMMAND ./generator schema.txt generated.h
    DEPENDS mib_schema.txt.in generator.pl
    COMMENT "Regenerating header file..."
)

是否可以在源目录中生成header?

编辑(以反映答案):

文件可以通过完全限定其路径来直接访问

${CMAKE_CURRENT_SOURCE_DIR}

或:

${CMAKE_CURRENT_BINARY_DIR}

因此,要在我的源目录中生成标头,之前 CMakeLists.txt 的摘录变为:

add_custom_command(
    OUTPUT generated.h
    COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/generator.pl ${CMAKE_CURRENT_SOURCE_DIR}/schema.txt.in ${CMAKE_CURRENT_SOURCE_DIR}/generated.h
    DEPENDS mib_schema.txt.in generator.pl
    COMMENT "Regenerating header file..."
)

这实际上更简单。 谢谢

--到

【问题讨论】:

  • 这其实是个好主意。如果我可以将生成的文件保存在源目录中,它将包含在源包中,这正是我想要的(因为这样我的库的用户就不需要生成文件,只要他们不修改生成器和/或源数据文件。)这意味着更多的人可以编译我的库!

标签: build-automation cmake


【解决方案1】:

我认为生成的标头很好地放置在二进制目录中,因为您可能希望创建具有相同源和不同配置的构建目录,从而导致生成不同的标头。

您可能希望将构建目录包含到您的项目中:

include_directories(${CMAKE_CURRENT_BINARY_DIR})

【讨论】:

  • 如果 CMake 无法找到您的文件,则使用 ${CMAKE_CURRENT_BINARY_DIR} 完全限定它们。如果您确定要在源目录中创建文件,您甚至可以在您的configureadd_custom_command 命令中使用${CMAKE_CURRENT_SOURCE_DIR}
  • 我同意,生成文件的最佳位置是在构建目录中。此标头在源目录中很方便,因为它在编码时提供了有用的代码完成。它是所有构建配置的相同标头,因此将它放在源目录中一点也不有害。注意:我在编辑 cmets 时遇到问题,可能是因为我在一个拥有唯一 IP 的大型网络上。很抱歉造成混乱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
  • 2012-02-18
  • 1970-01-01
  • 2018-05-19
  • 1970-01-01
  • 2019-08-28
  • 1970-01-01
相关资源
最近更新 更多