如何强制 make 始终重建文件来自这个答案更具体地说,我能够实现作为初学者的目标,所以我最好对所有内容进行评论。
我将这4个文件放在一个目录中;
ls -F
:
iterator Makefile test* test.cpp
所有文件都应该是不言自明的,但我有一些感觉,
iterator
可能听起来有点奇怪,所以为了清楚起见,我想存储/显示我重新编译了多少次的信息test.cpp
源代码。
在这里我想礼貌地问一下强制重建/重新编译实际上是如何工作的?我不是
Makefile
方面的专家,所以总结一下。
这是我实际的
Makefile
,没有任何改变:
CXX := g++-10
CXXFLAGS := -O2 -std=c++20 -Wall -Wextra -Werror -Wpedantic -pedantic-errors
APP_NAME := test
SRC_FILE := $(APP_NAME).cpp
# The following works!
# However, I have no idea how? :(
$(APP_NAME): .force_rebuild
.PHONY: .force_rebuild
$(APP_NAME): $(SRC_FILE)
# quickly delete terminal buffer
@clear
# increase test number
@expr $$(cat iterator) + 1 > iterator
# print test number description
@printf '%s' "Test Nr.: "
# set bright cyan color for the number
@tput bold; tput setaf 6
# print test number
@cat iterator
# reset to normal terminal color
@tput sgr0
# compile (always force rebuild)
@$(CXX) $(CXXFLAGS) $(SRC_FILE) -o $(APP_NAME)
# run my test app
@./$(APP_NAME)
为了完整起见,我在 Linux Mint 20.2 Cinnamon 上工作,使用 Bash 作为 shell,使用 GNU Make 4.2.1 将 VS Code 作为文本编辑器。
旁注:如果没有语法突出显示,它看起来很奇怪并且可读性较差,这是唯一的原因我还附上了屏幕截图:
来自手册:
一个文件可以是多个规则的目标。所有规则中提到的所有先决条件都将合并到目标的一份先决条件列表中。如果目标早于任何规则的任何先决条件,则执行配方。
在您的情况下,您的应用程序目标有两条规则。第一条规则中的先决条件
.force_rebuild
被标记为 .PHONY,这使得您的应用程序目标始终早于 .force_rebuild
。这会触发应用程序目标的配方的执行。该食谱在第二条规则中。
以防万一,还请指出上述引用后面的段落:
一个文件只能执行一个配方。如果多个规则为同一文件提供了配方,则 make 使用最后一个给出的规则并打印一条错误消息。