【发布时间】:2021-12-25 17:57:23
【问题描述】:
我继承了一个 Linux C++ 应用程序和 makefile。在现有的makefile中,它有如下代码:
APPVER=5.01
REL=B
$(APP): $(OBJS) $(MAKEFILE)
echo $APPVER > .sw_ver.txt
echo " " >> .sw_ver.txt
echo $REL >> .sw_ver.txt
$(LD) $(OBJS) $(LDFLAGS) -o $(APP)
在运行时,应用会打开此文本文件并显示其版本。
本着 Make 的精神,每次感觉文件出错时都重建 .sw_ver.txt。所以我把它分解如下:
APPVER=5.01
REL=B
$(APP): $(OBJS) $(MAKEFILE) .sw_ver.txt
$(LD) $(OBJS) $(LDFLAGS) -o $(APP)
.sw_ver.txt: $(MAKEFILE)
echo $APPVER > .sw_ver.txt
echo " " >> .sw_ver.txt
echo $REL >> .sw_ver.txt
步骤:
-
make -B:它执行步骤,创建文本文件并更新应用程序。 - 更新 Makefile 文件
-
make:这里说不需要更新文本文件,删掉规则。
我预计它会看到 Makefile 已更改,因此去更新文本文件。但事实并非如此。
我尝试添加一个虚拟文件,但它说似乎被修剪了。
我正在尝试做的是如果 Makefile 已更改(认为可能APPVER 或REL 已更改),然后重建.sw_ver.txt 文件。 p>
你有什么建议吗?
谢谢
===== 编辑 #1
嗨,所以我尝试了另一种方法,将版本信息移到文件中,而不是尝试在 make 运行期间创建文件。由于我继承了这些东西,我试图尽可能少地改变。
只是为了琐事,知道是否有原始问题的答案会很有趣。
再次感谢
文件 .sw_ver.txt
5.01 B
生成文件:
$(APP): $(OBJS) $(MAKEFILE) .sw_ver.txt
$(LD) $(OBJS) $(LDFLAGS) -o $(APP)
.sw_ver.txt: $(MAKEFILE)
===== 编辑#2
我说得太早了。如果 OBJS 中的任何一个发生更改,此设置将起作用,但如果 Makefile 本身发生更改,则此设置不起作用。
那么,善良的陌生人……有什么想法吗?谢谢
【问题讨论】:
-
你还没有给我们minimal complete example;你确定
MAKEFILE包含makefile 的名称吗? (您可以通过输入$(info it contains $(MAKEFILE))并查看它打印的内容来检查。)