为了记录在案,我是按照单Unix规范的下一个版本5编写的,如果计算命名XPG的天数,这就是问题8。在这个新标准中,添加了一些新的已经常见的地方特性,例如延迟和立即展开宏,以及重新生成包含文件。建议的部分更改是可用的这里。
我的最终目标包括一些由更复杂的脚本生成的内容,而这只是我在练习。例如,我想要创建一个C/C++包含文件的"make“先决条件列表;或者我想要提取我的项目的贡献者列表,并将这个列表放到文档的"make”目标中。
我想要实现的是,在主Makefile中包含一个文件,每当请求生成目标时,这个文件总是按需生成的(因此不包括清理、安装等辅助目标)。
这是我的Makefile
.PHONY: all clean timestamping
all: main.c
${CC} -o main -D LIB_RET=1${lib_ret} main.c
clean:
rm -f main include.mk time.stamp
all: timestamping
timestamping:
date -u '+%Y-%m-%d T %H:%M:%S %Z' > time.stamp
time.stamp:; :
include.mk: time.stamp
printf 'lib_ret='`date +%S` > include.mk
include include.mk这里是"main.c":
#include
int main(void){ return LIB_RET; }我对它目前的形式很满意,但我相信改进的建议会很多。我最关心的是FOSS make上这个Makefile的可移植性,比如GNU make和pmake。
我不满意的一部分是,timestamping和time.stamp的命令在Xcode工具链提供的make上执行了两次( Xcode工具链使用GNUmake3.81,Xcode版本14.2 (14C18) 2022-12-27)。
发布于 2022-12-27 11:33:08
在这里编写非文本文件(即缺少最后的换行符)似乎很奇怪:
printf 'lib\_ret='`date +%S` > include.mk
我会用换行符写它,用
date +lib_ret=%S >$@同样奇怪的是,它依赖于time.stamp,但不使用该依赖项。就像你想
date -d $(cat $<) +lib_ret=%S >$@或者根本没有timestamping和time.stamp目标(取而代之的是.PHONY: include.mk )。
与all: main.c不同,我们可以让默认规则从main.c构建main:
CFLAGS += -DLIB_RET=1${lib_ret}
all: main如果我们可以假设GNU是可用的(现在这是一个很好的假设),那么我们可以简化整个Makefile
.PHONY: main clean
main: CFLAGS += -DLIB_RET=$(shell date +1%S)
clean::
$(RM) main即使没有GNU,我们也可以在$(date +1%S)中使用CFLAGS。
我建议在编译C源代码时至少包括-Wall -Wextra。
请注意,在您的构建中包含时间戳的整个概念是最近几年自由软件社区在追求可复制构建时所做的巨大努力,因此我强烈敦促您重新考虑这是否是您真正应该做的事情。
https://codereview.stackexchange.com/questions/282190
复制相似问题