2010-07-20 62 views
5

假設有一個C程序,它將其版本存儲在main.c中的全局char*中。構建系統(gnu make)能否以某種方式在構建時提取此變量的值,以便構建的可執行文件可以具有程序中出現的確切版本名稱?可以使用從源文件讀取的值分配makefile變量嗎?

我想什麼來實現的是,鑑於來源:

char g_version[] = "Superprogram 1.32 build 1142"; 

構建系統會生成一個名爲Superprogram 1.32 build 1142.exe

回答

5

可執行的shell function允許你調用外部應用程序,如sed,可以是用於解析所需細節的來源。

+0

雖然他的版本字符串看上去非常的手工製作的,我本來還勸告檢查'what'工具。那加上'shell'可能是他正在尋找的東西。 – Dummy00001 2010-07-20 09:19:47

+0

感謝您的回覆,這可能實際上是有效的,只要我在sed(以及mouviciel下面提到的其他utils)上加快速度...... – Manjabes 2010-07-20 09:31:57

1

您可以在Makefile中使用unix文本工具(grep,sed,awk,perl,tail,...)的任意組合,以便從源文件中提取該信息。

5

定義從宏觀您的版本變量:

char g_version[] = VERSION; 

然後讓你的makefile放-D參數在命令行中在你的例子使用編譯

gcc hack.c -DVERSION=\"Superprogram\ 1.99\" 

當然,你應該當sed/grep/awk等來生成你的版本字符串。

+0

我知道-D選項,但在這種情況下不能應用。版本字符串必須保持在原來的位置。 – Manjabes 2010-07-20 09:29:21

0

通常版本被定義爲幾個#define值的組成(例如在arv library例如)。

因此,讓我們去一個簡單的工作例如:

// myversion.h 
#define __MY_MAJOR__ 1 
#define __MY_MINOR__ 8 

然後在你的Makefile:

# Makefile 
source_file := myversion.h 
MAJOR_Identifier := __MY_MAJOR__ 
MINOR_Identifier := __MY_MINOR__ 

MAJOR := `cat $(source_file) | tr -s ' ' | grep "\#define $(MAJOR_Identifier)" | cut -d" " -f 3` 
MINOR := `cat $(source_file) | tr -s ' ' | grep '\#define $(MINOR_Identifier)' | cut -d" " -f 3` 

all: 
    @echo "From the Makefile we extract: MAJOR=$(MAJOR) MINOR=$(MINOR)" 

說明

在這裏,我用了幾個工具,以便更魯棒性:

  • tr -s ' ':去除多餘的空間,元件之間的
  • grep:選擇獨特線路匹配我們的目的,
  • cut -d" " -f 3:以提取選定的行是目標值的第三個元素!

請注意,定義值可以是任何東西(不僅是數字)。

小心使用:=(不=)看到:https://stackoverflow.com/a/10081105/4716013

相關問題