【问题标题】:Linux make: Need to rebuild a text file when makefile changesLinux make:makefile更改时需要重建一个文本文件
【发布时间】: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

步骤:

  1. make -B:它执行步骤,创建文本文件并更新应用程序。
  2. 更新 Makefile 文件
  3. make:这里说不需要更新文本文件,删掉规则。

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

我尝试添加一个虚拟文件,但它说似乎被修剪了。

我正在尝试做的是如果 Makefile 已更改(认为可能APPVERREL 已更改),然后重建.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)) 并查看它打印的内容来检查。)

标签: c++ linux makefile


【解决方案1】:

有两点需要澄清:

  1. MAKEFILE 不是隐式内置变量。所以如果你不设置它的值,它什么都不包含。 (您可以在没有 Makefile 的目录中运行make -p 以查看其中有哪些变量。请参阅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

【讨论】:

  • 谢谢...您的信息让我找到了问题所在。我的示例只是真实 Makefile 的一小部分。我能够找到您提供的内容的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-26
相关资源
最近更新 更多