可以使用从源文件读取的值分配makefile变量吗?

问题描述:

假设有一个C程序,它将其版本存储在main.c中的全局char*中。构建系统(gnu make)能否以某种方式在构建时提取此变量的值,以便构建的可执行文件可以具有程序中出现的确切版本名称?可以使用从源文件读取的值分配makefile变量吗?

我想什么来实现的是,鉴于来源:

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

构建系统会生成一个名为Superprogram 1.32 build 1142.exe

可执行的shell function允许你调用外部应用程序,如sed,可以是用于解析所需细节的来源。

+0

虽然他的版本字符串看上去非常的手工制作的,我本来还劝告检查'what'工具。那加上'shell'可能是他正在寻找的东西。 – Dummy00001 2010-07-20 09:19:47

+0

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

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

定义从宏观您的版本变量:

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

通常版本被定义为几个#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