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

步骤:

  1. make -B:它执行创建文本文件和更新应用程序的步骤。
  2. 做一些更新 Makefile
  3. make:这里说不需要更新文本文件,p运行es规则。

我希望它看到 Makefile 已更改,因此去更新文本文件。但事实并非如此。

我尝试添加一个虚拟文件,但它说似乎得到了 p运行ed。

我想做的是if only if Makefile 已更改(认为可能 APPVERREL 已更改),然后重建 .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 本身,则此设置无效。

那么,好心的陌生人……有什么想法吗?谢谢

有两点需要澄清:

  1. MAKEFILE 不是隐式内置变量。所以如果你不设置它的值,它什么都不包含。 (您可以 运行 make -p 在目录 没有 Makefile 来查看那里有什么变量。参见 https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html
  2. 基于上面的原因,由于你的$(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
    

所以你需要做的是:

  1. 为您的 MAKEFILE 变量赋值。
    MAKEFILE := Makefile
    
  2. 修正语法:
    .sw_ver.txt: $(MAKEFILE)
        echo $(APPVER) > $@
        echo " " >> $@
        echo $(REL) >> $@
    

执行此操作后,您应该能够在更新 Makefile 时重新生成 .sw_ver.txt