假設有一個C程序,它將其版本存儲在main.c中的全局char*
中。構建系統(gnu make)能否以某種方式在構建時提取此變量的值,以便構建的可執行文件可以具有程序中出現的確切版本名稱?可以使用從源文件讀取的值分配makefile變量嗎?
我想什麼來實現的是,鑑於來源:
char g_version[] = "Superprogram 1.32 build 1142";
構建系統會生成一個名爲Superprogram 1.32 build 1142.exe
假設有一個C程序,它將其版本存儲在main.c中的全局char*
中。構建系統(gnu make)能否以某種方式在構建時提取此變量的值,以便構建的可執行文件可以具有程序中出現的確切版本名稱?可以使用從源文件讀取的值分配makefile變量嗎?
我想什麼來實現的是,鑑於來源:
char g_version[] = "Superprogram 1.32 build 1142";
構建系統會生成一個名爲Superprogram 1.32 build 1142.exe
可執行的shell
function允許你調用外部應用程序,如sed
,可以是用於解析所需細節的來源。
您可以在Makefile中使用unix文本工具(grep,sed,awk,perl,tail,...)的任意組合,以便從源文件中提取該信息。
定義從宏觀您的版本變量:
char g_version[] = VERSION;
然後讓你的makefile放-D參數在命令行中在你的例子使用編譯
gcc hack.c -DVERSION=\"Superprogram\ 1.99\"
當然,你應該當sed/grep/awk等來生成你的版本字符串。
我知道-D選項,但在這種情況下不能應用。版本字符串必須保持在原來的位置。 – Manjabes 2010-07-20 09:29:21
通常版本被定義爲幾個#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
雖然他的版本字符串看上去非常的手工製作的,我本來還勸告檢查'what'工具。那加上'shell'可能是他正在尋找的東西。 – Dummy00001 2010-07-20 09:19:47
感謝您的回覆,這可能實際上是有效的,只要我在sed(以及mouviciel下面提到的其他utils)上加快速度...... – Manjabes 2010-07-20 09:31:57