【问题标题】:CMake: Store build/system information in binaryCMake:以二进制形式存储构建/系统信息
【发布时间】:2017-10-03 04:37:15
【问题描述】:

如何将系统名称 (Linux)、使用的编译器 gcc) 或架构 (x86_64) 等基本信息存储在包含在二进制文件中的文件中?

编写这样一个.in 文件的所有代码都已经存在,除了相关的 CMake 变量都是空的,例如CMAKE_SYSTEMCMAKE_SYSTEM_PROCESSOR:

set(NEWLINE "\\\\n")
file(WRITE ${CMAKE_BINARY_DIR}/update_buildflags.cmake "
file(WRITE \${DST} \"#define BUILDFLAGS \\\" 
     ARCH=\${CMAKE_SYSTEM}${NEWLINE} 
     COMP=\${CMAKE_SYSTEM_PROCESSOR}${NEWLINE} 
     BUILD=\${CMAKE_BUILD_TYPE}${NEWLINE}\\\"\n\")")    
add_custom_target(update_buildflags COMMAND ${CMAKE_COMMAND}
     -DDST=${PROJECT_SOURCE_DIR}/src/buildflags.c
     -P ${CMAKE_BINARY_DIR}/update_buildflags.cmake)

然后将此自定义目标添加为主要二进制文件的依赖项,生成的文件 src/buildflags.c 如下所示:

#define BUILDFLAGS " ARCH=\n COMP=\n BUILD=\n"

为什么使用的 CMake 变量是空的,尽管使用 message() 打印它们会显示正确的信息?

CMAKE_SYSTEM: Linux-4.4.0-92-generic

【问题讨论】:

  • 有什么问题?
  • 我编辑了问题。

标签: cmake


【解决方案1】:

您可以使用模板文件使其更具可读性。

  • 专业版:不需要在 cmake 中写入整个文件
  • 专业版:易于编辑
  • 对比:附加文件

示例 src/autocode/buildflags.h.in:

#ifndef BUILD_FLAGS_H
#def BUILD_FLAGS_H  
#define ARCH ${CMAKE_SYSTEM}
#define COMP ${CMAKE_SYSTEM_PROCESSOR}
#define BUILD ${CMAKE_BUILD_TYPE} 
// Add more of your stuff here
#define APP_BUILD_WITH_CMAKE_VERSION "${CMAKE_VERSION}"
#define APP_BUILD_ON_PLATFORM "${CMAKE_SYSTEM}"
#endif // BUILD_FLAGS_H

在您的 CMakeLists.txt 中

configure_file(${CMAKE_CURRENT_SOURCE_DIR}/autocode/buildflags.h.in 
               ${CMAKE_BINARY_DIR}/buildflags.h)
include_directories(${CMAKE_BINARY_DIR})

在您的代码中

#include "buildflags.h"

【讨论】:

    【解决方案2】:

    访问 CMAKE_... 变量时,您需要删除 $ 之前的“\”。之后就像一个魅力。

    【讨论】:

    • 我认为使用模板更干净。毕竟,这就是它们的目的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    • 2016-03-15
    • 2012-01-07
    • 2023-03-17
    • 2021-11-05
    • 1970-01-01
    • 2018-07-31
    相关资源
    最近更新 更多