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

时间:2010-07-20 08:24:15

标签: c makefile

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

我想要实现的是给定来源:

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

构建系统将生成名为Superprogram 1.32 build 1142.exe

的可执行文件

4 个答案:

答案 0 :(得分:5)

shell function允许您调用外部应用程序,例如sed,可用于解析源代码以获取所需的详细信息。

答案 1 :(得分:5)

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

char g_version[] = VERSION;

然后让makefile在编译时在命令行上放置-D参数

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

当然,您应该在您的示例中使用sed / grep / awk等来生成您的版本字符串。

答案 2 :(得分:1)

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

答案 3 :(得分: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:提取所选行的第三个元素,即目标值!

请注意,define值可以是任何值(不仅仅是数字)。

谨防使用:=(不是=),请参阅:https://stackoverflow.com/a/10081105/4716013