Linux make: 当 makefile 改变时需要重建一个文本文件
Linux make: Need to rebuild a text file when makefile changes
我继承了 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
:这里说不需要更新文本文件,p运行es规则。
我希望它看到 Makefile 已更改,因此去更新文本文件。但事实并非如此。
我尝试添加一个虚拟文件,但它说似乎得到了 p运行ed。
我想做的是if only if Makefile 已更改(认为可能 APPVER
或 REL
已更改),然后重建 .sw_ver.txt
文件。
你有什么建议吗?
谢谢
===== 编辑#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
本身,则此设置无效。
那么,好心的陌生人……有什么想法吗?谢谢
有两点需要澄清:
MAKEFILE
不是隐式内置变量。所以如果你不设置它的值,它什么都不包含。 (您可以 运行 make -p
在目录 中 没有 Makefile 来查看那里有什么变量。参见 https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html)
- 基于上面的原因,由于你的
$(MAKEFILE)
是空的,当它扩展时,.sw_ver.txt
成为一个规则没有先决条件。因此,如果 .sw_ver.txt
已经存在,则不会重新生成它。你得到的实际上是这个(注意你的语法 $APPVER
和 $REL
实际上也是错误的):
.sw_ver.txt: # $(MAKEFILE) is empty
echo PPVER > .sw_ver.txt # $(A) is empty
echo " " >> .sw_ver.txt
echo EL >> .sw_ver.txt # $(R) is empty
所以你需要做的是:
- 为您的
MAKEFILE
变量赋值。
MAKEFILE := Makefile
- 修正语法:
.sw_ver.txt: $(MAKEFILE)
echo $(APPVER) > $@
echo " " >> $@
echo $(REL) >> $@
执行此操作后,您应该能够在更新 Makefile 时重新生成 .sw_ver.txt
。
我继承了 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
:这里说不需要更新文本文件,p运行es规则。
我希望它看到 Makefile 已更改,因此去更新文本文件。但事实并非如此。
我尝试添加一个虚拟文件,但它说似乎得到了 p运行ed。
我想做的是if only if Makefile 已更改(认为可能 APPVER
或 REL
已更改),然后重建 .sw_ver.txt
文件。
你有什么建议吗?
谢谢
===== 编辑#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
本身,则此设置无效。
那么,好心的陌生人……有什么想法吗?谢谢
有两点需要澄清:
MAKEFILE
不是隐式内置变量。所以如果你不设置它的值,它什么都不包含。 (您可以 运行make -p
在目录 中 没有 Makefile 来查看那里有什么变量。参见 https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html)- 基于上面的原因,由于你的
$(MAKEFILE)
是空的,当它扩展时,.sw_ver.txt
成为一个规则没有先决条件。因此,如果.sw_ver.txt
已经存在,则不会重新生成它。你得到的实际上是这个(注意你的语法$APPVER
和$REL
实际上也是错误的):.sw_ver.txt: # $(MAKEFILE) is empty echo PPVER > .sw_ver.txt # $(A) is empty echo " " >> .sw_ver.txt echo EL >> .sw_ver.txt # $(R) is empty
所以你需要做的是:
- 为您的
MAKEFILE
变量赋值。MAKEFILE := Makefile
- 修正语法:
.sw_ver.txt: $(MAKEFILE) echo $(APPVER) > $@ echo " " >> $@ echo $(REL) >> $@
执行此操作后,您应该能够在更新 Makefile 时重新生成 .sw_ver.txt
。