我正在管理一个在许多文件夹中包含数百个 c 文件的系统,有多个目标,因此并非每个构建中都需要所有 c 文件。
因为并非所有文件都是必需的,所以我不能使用纯递归构建。而且我不想这样做,因为无论如何我都不想有一个带有神秘依赖关系的缓慢串行构建。
我广泛提出的是一个顶级生成文件,我在其中拉入文件夹列表并包含每个文件夹中的生成文件。
SUB_MAKEFILES := $(foreach subdir,$(SUBDIRS), $(subdir)/subdir.mk)
-include $(SUB_MAKEFILES)
Run Code Online (Sandbox Code Playgroud)
有些文件夹有特定的文件要编译,所以包含的文件非常简单;
srcs += path/a.c path/b.c
deps += path/a.d path/b.d
objs += op/path/a.o op/path/b.o
op/path/%.o: path/%.c path/subdir.mk
compile ...
Run Code Online (Sandbox Code Playgroud)
我不想这样做几十次,所以我有一个通用模式,用于所有要编译的文件夹;
PATH155 := src/f1/f2/f3/f4
srcs += $(shell $(FFshell) $(PATH155) -maxdepth 1 -name '*.c')
deps += $(addprefix ${OUT_DIR}, $(patsubst %.c,%.d,$(shell $(FFshell) $(PATH155) -maxdepth 1 -name '*.c')))
objs += $(addprefix ${OUT_DIR}, $(patsubst %.c,%.o,$(shell $(FFshell) $(PATH155) -maxdepth 1 -name '*.c')))
$(OUT_O_DIR)$(PATH155)/%.o: $(PATH155)/%.c $(PATH155)/subdir.mk
gcc -c $(CFLGS) -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"$@" "$<"
Run Code Online (Sandbox Code Playgroud)
这是有效的,但是我想避免为 …
一个常见的 CI 构建类型问题,我有一个标头,其中包含我想要在构建之前增加的版本号。
所以测试.h
#define VERSION_PROJECT_MAJOR 01
#define VERSION_PROJECT_MINOR 69
#define VERSION_VENDOR 2
Run Code Online (Sandbox Code Playgroud)
次要版本需要获得 6A。
环境是带有 gnu utils 的 DOS/WIN,所以我认为 awk 是可行的方法,但我不能完全旋转它。构建系统的版本不能就地执行,但我可以忍受。
到目前为止,我已经写了一篇相当不错的俏皮话;
awk "/#define VERSION_PROJECT_MINOR/{$0=$1 \" \" $2 \" \" (strtonum(\"0x\" $3)+1)}1;" test.h
Run Code Online (Sandbox Code Playgroud)
这将版本号设置为106,如何使其输出十六进制???