首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Makefile:包括一个按需生成的文件

Makefile:包括一个按需生成的文件
EN

Code Review用户
提问于 2022-12-27 09:38:02
回答 1查看 44关注 0票数 1

为了记录在案,我是按照单Unix规范的下一个版本5编写的,如果计算命名XPG的天数,这就是问题8。在这个新标准中,添加了一些新的已经常见的地方特性,例如延迟和立即展开宏,以及重新生成包含文件。建议的部分更改是可用的这里

我的最终目标包括一些由更复杂的脚本生成的内容,而这只是我在练习。例如,我想要创建一个C/C++包含文件的"make“先决条件列表;或者我想要提取我的项目的贡献者列表,并将这个列表放到文档的"make”目标中。

我想要实现的是,在主Makefile中包含一个文件,每当请求生成目标时,这个文件总是按需生成的(因此不包括清理、安装等辅助目标)。

这是我的Makefile

代码语言:javascript
复制
.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":

代码语言:javascript
复制
#include 
int main(void){ return LIB_RET; }

我对它目前的形式很满意,但我相信改进的建议会很多。我最关心的是FOSS make上这个Makefile的可移植性,比如GNU make和pmake。

我不满意的一部分是,timestampingtime.stamp的命令在Xcode工具链提供的make上执行了两次( Xcode工具链使用GNUmake3.81,Xcode版本14.2 (14C18) 2022-12-27)。

EN

回答 1

Code Review用户

回答已采纳

发布于 2022-12-27 11:33:08

在这里编写非文本文件(即缺少最后的换行符)似乎很奇怪:

printf 'lib\_ret='`date +%S` > include.mk

我会用换行符写它,用

代码语言:javascript
复制
     date +lib_ret=%S >$@

同样奇怪的是,它依赖于time.stamp,但不使用该依赖项。就像你想

代码语言:javascript
复制
    date -d $(cat $<) +lib_ret=%S >$@

或者根本没有timestampingtime.stamp目标(取而代之的是.PHONY: include.mk )。

all: main.c不同,我们可以让默认规则从main.c构建main

代码语言:javascript
复制
CFLAGS += -DLIB_RET=1${lib_ret}
all: main

如果我们可以假设GNU是可用的(现在这是一个很好的假设),那么我们可以简化整个Makefile

代码语言:javascript
复制
.PHONY: main clean

main: CFLAGS += -DLIB_RET=$(shell date +1%S)

clean::
    $(RM) main

即使没有GNU,我们也可以在$(date +1%S)中使用CFLAGS

我建议在编译C源代码时至少包括-Wall -Wextra

请注意,在您的构建中包含时间戳的整个概念是最近几年自由软件社区在追求可复制构建时所做的巨大努力,因此我强烈敦促您重新考虑这是否是您真正应该做的事情。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/282190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档