【问题标题】:Generating unique version for application if any dependency of application is changed?如果应用程序的任何依赖项发生更改,是否为应用程序生成唯一版本?
【发布时间】:2012-10-23 17:15:55
【问题描述】:

目前我在做什么。 在构建开始时目前我正在生成具有当前版本的源代码作为 APPLICATION_VERSION 的 version.h。每个应用程序都在使用它。

这种方法的问题是,如果任何文件在源代码中发生更改,它会强制重新构建每个应用程序。

只有当任何其他依赖离开 version.txt 的二进制文件发生更改时,我才想生成与应用程序相关的 version.h any。 目前我正在使用 cmake 进行构建过程。什么是解决问题的好方法?

编辑更多细节:

我的目录结构是这样的:

app/
   common/
         version.h
   app1/
       main.c
       other source file
   app2
       main.c
       other source file
lib/
   third party libs. 

每个应用程序 main.c 都包含 version.h。所以只有 main.c 会在版本发生变化时被重新编译。所以编译对我来说不是问题。 问题是假设我修改了一个只影响 app1 的依赖项。现在,如果我正在构建应用程序。 version.h 将随着源代码版本的更改而更改。由于 version.h 中的更改,它将更改应用程序 app1 和 app2 的版本。 如果没有更改 app1 的依赖项,我想避免更改应用程序的版本。

【问题讨论】:

    标签: unix makefile cmake


    【解决方案1】:

    听起来您在大多数(如果不是每个)cpp 文件中都包含“version.h”。每次更改时,这都会导致对世界进行完全重新编译。解决它的通常方法是

    1. 在标题中声明
    2. 在您的源代码中定义/实现

    我建议您更改 version.h,使其“声明”一个应该返回实际版本的函数。例如,像下面这样简单的东西。

    #ifndef VERSION_H
    #define VERSION_H
    
    #include <string>
    
    static std::string getVersion( );
    
    #endif // VERSION_H
    

    使用 CMake,我建议您在每次构建时“重新生成”您的 version.cpp。如果您的问题中没有示例代码,我将提出一种可能的方法:

    准备一个version.cpp.in,应该由CMake's configure_file“转换”成合适的version.cpp。

    #include "version.h"
    
    // After calling configure_file, CMake will have replaced the entry between @@ 
    // with the corresponding CMake variables
    static std::string generated_version=@Cmake_Generated_Version@;
    
    std::string static getVersion( )
    {
        return generated_version;
    }
    

    在你的 cmakelists.txt 中执行如下操作:

    # Somehow fill a CMake variable Cmake_Generated_Version
    configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/version.cpp.in ${CMAKE_CURRENT_BINARY}/version.cpp )
    

    【讨论】:

    • 我认为,最好只使用extern std::string version; 而不是函数。
    • @arrowdodger:对于简单的情况,我完全同意。例如。如我的示例所示,只有一个版本字符串。但是当信息多于单个数字或需要各种格式时,我认为一组方法可以更具扩展性。
    • @Andre 这不会解决我的问题。我只想在可执行文件的任何其他依赖项发生更改时运行配置。当前解决方案将在每个构建上运行配置。
    • @Vivek,我感觉你的问题有两个部分。 1) 如何在更新 version.h 后防止完全重建 2) 如何很好地生成 version.h。我试图回答 1),但无法完全理解您对 2) 的问题。也许您可以用一些代码来说明您的问题来更新问题?
    猜你喜欢
    • 2021-06-07
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多