备忘一个不错的开源编辑器CudaText
下载网址:
CudaText - Browse /release at SourceForge.net
CudaText 主页:
1,含义及验证
在 Makefile 中,$(@F) 表示当前规则的目标文件名(不包括路径部分)。
这个变量通常用于在规则中引用目标文件名。
举个例子,假设有以下 Makefile 规则:
EXE := hello_exe
all: $(EXE)
%: %.c
gcc $< -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 proj05
gen:
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
验证效果: