[英]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
:它執行步驟,創建文本文件並更新應用程序。make
:這里說不需要更新文本文件並修剪規則。我希望它看到 Makefile 已更改,因此去更新文本文件。 但事實並非如此。
我嘗試添加一個虛擬文件,但它說似乎被修剪了。
我想要做的是,如果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)
是一個空變量。 嘗試僅用文字文件名Makefile
替換它。
順便說一下,我通過將echo $(MAKEFILE)
添加到我的規則之一來解決這個問題。
有兩點需要澄清:
MAKEFILE
不是隱式內置變量。 因此,如果您不設置其值,則它不包含任何內容。 (您可以在沒有Makefile 的目錄中運行make -p
以查看那里有哪些變量。請參閱https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html )$(MAKEFILE)
是空的,當它擴展時, .sw_ver.txt
就變成了沒有先決條件的規則。 因此,如果.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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.