我的app makefile有一些版本变量,我希望我的makefile用它来生成一个version.h文件。我目前的常用makefile设置如下:
version :
@echo "Generating version.h ..."
@echo line > version.h
@echo etc >> version.h
debug : blah blah version blah blah
release : blah blah version blah blah
.DEFAULT_GOAL := debug release
app-level makefile的位置为:
MAJOR_VERSION = 1
MINOR_VERSION = 42
include makefile.common
这样可行,但最终会生成两次版本文件。我怎样才能使它只生成一次 - 这样version
某种程度上取决于应用程序级别的makefile更改。它不像生成它两次是无法忍受的慢,我只是想这样做。
此外,我可能有一个不想要版本信息的应用,我该如何有条件地生成此文件?
答案 0 :(得分:3)
在我看来,通常很好地将所有目标都包含在所有包含的makefile中的有意义的配方,因为通常很难看到哪个makefile(甚至包括在配方之后)可能包含影响的变量食谱。
请注意,这里是您的两个问题的答案(我还添加了一些其他“最佳实践”,因为您想学习“正确的方法”):
生成文件:
MAJOR_VERSION := 1
MINOR_VERSION := 42
include makefile.common
makefile.common:
.PHONY: all debug release
all: debug release
VERSION_FILE := $(if $(filter %OR_VERSION, $(.VARIABLES)), version.h)
debug : blah blah $(VERSION_FILE) blah blah
release : blah blah $(VERSION_FILE) blah blah
.SECONDEXPANSION:
version.h : $$(MAKEFILE_LIST)
@echo "Generating $@ ..."
@echo line > $@
@echo etc >> $@
答案 1 :(得分:1)
您希望make target成为文件,例如:
version.h :
@echo "Generating version.h ..."
@echo line > version.h
@echo etc >> version.h
debug : blah blah version.h blah blah
release : blah blah version.h blah blah
答案 2 :(得分:0)
如果您有一个 version.h 文件,其中包含如下内容:
#define BUILD_NUMBER "8"
#define BUILD_DATE "2021-08-06"
您可以将其添加到 Makefile 中,在编译规则之前的某处 (SRC_DIRS 指向您的源文件所在的位置):
AUTOGEN_FILE := $(SRC_DIRS)/version.h
AUTOGEN_NEXT := $(shell expr $$(awk '/#define BUILD_NUMBER/' $(AUTOGEN_FILE) | tr -cd "[0-9]") + 1)
第二行,在 version.h 文件中找到“#define BUILD_NUMBER”,提取它,增加它,并保存以备后用。
然后将这两行添加到编译规则中(这样您只需更改内部版本号,当有变化时):
sed -i "s/#define BUILD_NUMBER .*/#define BUILD_NUMBER \"$(AUTOGEN_NEXT)\"/" $(AUTOGEN_FILE)
sed -i "s/#define BUILD_DATE.*/#define BUILD_DATE \"$$(date +'%Y-%m-%d')\"/" $(AUTOGEN_FILE)
第一行,在 version.h 中找到“#define BUILD_NUMBER...”并将其替换为新的内部版本号。
第二行,找到“#define BUILD_DATE...”并设置为新的日期。
规则可能如下所示:
# Build step for C source
$(BUILD_DIR)/%.c.o: %.c
sed -i "s/#define BUILD_NUMBER .*/#define BUILD_NUMBER \"$(AUTOGEN_NEXT)\"/" $(AUTOGEN_FILE)
sed -i "s/#define BUILD_DATE.*/#define BUILD_DATE \"$$(date +'%Y-%m-%d')\"/" $(AUTOGEN_FILE)
$(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@