2012-10-23 19 views
0

目前我是怎麼做的。 在建設開始目前,我產生version.h中具有源代碼的當前版本APPLICATION_VERSION。哪個應用程序正在使用哪個。如果應用程序的任何依賴項被更改,爲應用程序生成獨特的版本?

問題這種方法是,如果任何文件中源改變了它迫使每個應用程序被重建。

我要生成version.h中任何只要任何其他依賴留下version.txt改變爲二進制相關應用程序。 目前我正在使用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的依賴性更改爲避免改變應用程序的版本。

回答

2

這聽起來像你要包括在最「version.h中」(如果不是所有的)CPP文件。這會導致每次更改時都會重新編譯整個世界。通常的方法來解決這個問題是

  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 [email protected][email protected]; 

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) 
+0

我認爲,這是更好地只使用'的extern的std :: string版本;'而不是功能。 – arrowd

+0

@arrowdodger:對於簡單的情況,我完全同意。例如。只有一個版本字符串在我的例子中。但是,當有更多的信息比單個數字或需要各種格式時,我認爲一套方法可以更加可擴展。 –

+0

@andre謝謝你會嘗試這個。 –

相關問題