trick of GNU make: 编译最后一次被修改的文件
下面为博客摘要,详细内容请看http://keke046.github.io/2021/11/11/makefile-trick/
run/$* @echo $* $(SAVE)clean: rm -rf 。last)` 其实等价与 `$$(cat 。out @echo $*。run`, 对于原来目录下 `AAA/BBB/CCC。last)gdb: all gdb $(shell cat 。```bash $ make # 用 $(shell cat 。last```其实原理很简单。cpp,。而解释器是不需要 `%。在编译文件的时候,将输出文件名保存到 `。scala) $(wildcard *。last```# 解释器的情况但有的时候,我们会用 python 啊 scala 等解释器来运行脚本。last)`(这里的`$$`是转义`$`),但前者会在`make`的输出信息中显示,看起来更友好。out 。out,$(wildcard *。scala` 文件,给它建立一个目标 `。而且,可以依赖 `make` 的版本检查功能,**一键运行刚改过的那个代码**。run/$*); true @echo $(shell date) 。run/ 作为前缀,作为是目标文件OBJS:=$(addprefix 。scala`。last` 文件里。out 。out: %。out` 编译然后 `。last-runrun: $(OBJS) scala $(shell cat $(SAVE))# 更新文件的方法就是echo一个日期进去# 为了防止mkdir的时候,文件夹已经存在报错,make提前截止# 在mkdir后面加一个 `;true` 来屏蔽 mkdir 的返回值。PHONY: all clean run# 寻找当前目录和子目录里所有的scala脚本SRCS:=$(wildcard **/*。cpp g++ $*。last) # uglyI am B, Hello World```/details# 用make一键开始gdb还可以加上**一键 `gdb`** 的功能,这时候建立一个 `all` 目标会比较方便:```makefilerun: all 。out 。也就是说,不管在做 A,B,C,D,E 中的哪一个题,都只需要输入一个 `make` 就能够编译运行。out # beautifulI am B, Hello World$ make # 用 $$(cat 。out` 这样的目标文件的。cpp -o $*。last)%。last)all: $(subst 。scala) # 给脚本前面加上 。/B。run```。/A。cpp))%。last)` 的解释/summary代码中 `$(shell cat 。怎么办呢?可以强行创造目标文件!具体地,我们建立一个文件夹,叫做 `。out: %。!-- more --detailssummary `$(shell cat 。更新这个目标的方法就是 `echo` 一个日期进去。run/%: % @mkdir -p $(shell dirname 。!-- more --```makefilerun: $(subst 。!-- indicate-the-source --# 用make一键编译运行在打比赛的时候,会有在几道题之间切来切去的情况。last` 文件中的程序,就可以执行最后修改的那个程序了。run/。然后在默认目标里执行 `。/$(cat 。last) 的情况。cpp,。out,$(wildcard *。cpp g++ $*。run/,$(SRCS))# 记录最后一个版本带有更新的文件SAVE:=。lastclean: rm -rf *。频繁地输入 `g++ A。out` 执行会非常的麻烦。cpp -o $*。/$(shell cat 。/$(shell cat 。`make` 比 `g++` 敲起来要顺手得多。cpp)) 。```makefile。last) 的情况。lastclean: rm -rf *。run/AAA/BBB/CCC。cpp -o A。`make` 检查代码是否更新,是根据代码和目标文件的修改日期来的。out @echo $*。out
用make一键编译运行
在打比赛的时候,会有在几道题之间切来切去的情况。频繁地输入 g++ A.cpp -o A.out 编译然后 ./A.out 执行会非常的麻烦。
make 比 g++ 敲起来要顺手得多。而且,可以依赖 make 的版本检查功能,一键运行刚改过的那个代码。也就是说,不管在做 A,B,C,D,E 中的哪一个题,都只需要输入一个 make 就能够编译运行。
run/$* @echo $* $(SAVE)clean: rm -rf 。last)` 其实等价与 `$$(cat 。out @echo $*。run`, 对于原来目录下 `AAA/BBB/CCC。last)gdb: all gdb $(shell cat 。```bash $ make # 用 $(shell cat 。last```其实原理很简单。cpp,。而解释器是不需要 `%。在编译文件的时候,将输出文件名保存到 `。scala) $(wildcard *。last```# 解释器的情况但有的时候,我们会用 python 啊 scala 等解释器来运行脚本。last)`(这里的`$$`是转义`$`),但前者会在`make`的输出信息中显示,看起来更友好。out 。out,$(wildcard *。scala` 文件,给它建立一个目标 `。而且,可以依赖 `make` 的版本检查功能,**一键运行刚改过的那个代码**。run/$*); true @echo $(shell date) 。run/ 作为前缀,作为是目标文件OBJS:=$(addprefix 。scala`。last` 文件里。out 。out: %。out` 编译然后 `。last-runrun: $(OBJS) scala $(shell cat $(SAVE))# 更新文件的方法就是echo一个日期进去# 为了防止mkdir的时候,文件夹已经存在报错,make提前截止# 在mkdir后面加一个 `;true` 来屏蔽 mkdir 的返回值。PHONY: all clean run# 寻找当前目录和子目录里所有的scala脚本SRCS:=$(wildcard **/*。cpp g++ $*。last) # uglyI am B, Hello World```/details# 用make一键开始gdb还可以加上**一键 `gdb`** 的功能,这时候建立一个 `all` 目标会比较方便:```makefilerun: all 。out 。也就是说,不管在做 A,B,C,D,E 中的哪一个题,都只需要输入一个 `make` 就能够编译运行。out # beautifulI am B, Hello World$ make # 用 $$(cat 。out` 这样的目标文件的。cpp -o $*。last)%。last)all: $(subst 。scala) # 给脚本前面加上 。/B。run```。/A。cpp))%。last)` 的解释/summary代码中 `$(shell cat 。怎么办呢?可以强行创造目标文件!具体地,我们建立一个文件夹,叫做 `。out: %。!-- more --detailssummary `$(shell cat 。更新这个目标的方法就是 `echo` 一个日期进去。run/%: % @mkdir -p $(shell dirname 。!-- more --```makefilerun: $(subst 。!-- indicate-the-source --# 用make一键编译运行在打比赛的时候,会有在几道题之间切来切去的情况。last` 文件中的程序,就可以执行最后修改的那个程序了。run/。然后在默认目标里执行 `。/$(cat 。last) 的情况。cpp,。out,$(wildcard *。cpp g++ $*。run/,$(SRCS))# 记录最后一个版本带有更新的文件SAVE:=。lastclean: rm -rf *。频繁地输入 `g++ A。out` 执行会非常的麻烦。cpp -o $*。/$(shell cat 。/$(shell cat 。`make` 比 `g++` 敲起来要顺手得多。cpp)) 。```makefile。last) 的情况。lastclean: rm -rf *。run/AAA/BBB/CCC。cpp -o A。`make` 检查代码是否更新,是根据代码和目标文件的修改日期来的。out @echo $*。out