可以使用从源文件读取的值分配makefile变量吗?
假设有一个C程序,它将其版本存储在main.c中的全局char*
中。构建系统(gnu make)能否以某种方式在构建时提取此变量的值,以便构建的可执行文件可以具有程序中出现的确切版本名称?可以使用从源文件读取的值分配makefile变量吗?
我想什么来实现的是,鉴于来源:
char g_version[] = "Superprogram 1.32 build 1142";
构建系统会生成一个名为Superprogram 1.32 build 1142.exe
您可以在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