假设有一个C程序,它将其版本存储在main.c中的全局char*
中。构建系统(gnu make)可以在构建时以某种方式提取此变量的值,以便构建的可执行文件可以具有程序中显示的确切版本名称吗?
我想要实现的是给定来源:
char g_version[] = "Superprogram 1.32 build 1142";
构建系统将生成名为Superprogram 1.32 build 1142.exe
答案 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