备忘一个不错的开源编辑器CudaText
下载网址:
CudaText - Browse /release at SourceForge.net
CudaText 主页:
CudaText - Home
1,含义及验证
在 Makefile 中,$(@F) 表示当前规则的目标文件名(不包括路径部分)。
这个变量通常用于在规则中引用目标文件名。
举个例子,假设有以下 Makefile 规则:
EXE := hello_exe
all: $(EXE)%: %.cgcc $< -o $@echo Target file is $@, and its name without path is $(@F).PHONY: clean
clean:-rm -rf *.o $(EXE)
可能需要注意命令行的开头应该是 tab键,而不是8个空格键;
源文件 hello_exe.c:
#include <stdio.h>int main()
{printf("hello world!\n");return 0;
}
在这个例子中,$@ 表示当前规则的目标文件名,即 hello_exe。而$(@F) 表示目标文件名的不包括路径部分的部分,即 hello_exe
执行效果:
那么 $(@F) 这个变量有什么用呢?可以怎么用呢?
比如一个项目有5个相对独立的子项目,
proj01\
proj02\
proj03\
proj04\
proj05\
如果他们各自顶层的Makefile都是用来生成libxxx.so 的,而且每个项目都是由 lib:这个目标作为最高目标来出发生成过程,make -j lib
这时在顶层Makefile中可能会写成
lib:
make -C proj01 lib
make -C proj02 lib
make -C proj03 lib
make -C proj04 lib
make -C proj05 lib
这里出现了六个lib,其含义具有紧密的关联性;
再比如clean这个目标:
.PHONY:clean
clean:
make -C proj01 clean
make -C proj02 clean
make -C proj03 clean
make -C proj04 clean
make -C proj05 clean
那么,clean 就可以写成如下示例的方式:
这个示例中先用gen自动生成5个子项目,再对其clean,这是可以使用$(@F)这个变量。
验证,首先在一个空目录中创建一个Makefile:
SUBPROJ_DIR := proj01 proj02 proj03 proj04 proj05gen:mkdir -p $(SUBPROJ_DIR)@for dir in $(SUBPROJ_DIR) ; \do if test -d $$dir; then \cd $$dir; \echo "I am project $$dir.\n You are welcome!\n" > README.md ; \echo ".PHONY: clean\nclean:\n\t-rm -rf README.md\n" > Makefile; \cd ..; \fi; \done.PHONY: clean
clean:@for dir in $(SUBPROJ_DIR) ; \do if test -d $$dir; then \$(MAKE) -C $$dir $(@F); \echo "you execute make -C $$dir $(@F) \n"; \fi; \done
这个Makefile中的$(@F) 表示clean 这个目标名称 clean
验证效果: