示例说明 Makefile 中的 $(@F),及其用法示例$$dir $@ $< $^ %.c
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
验证效果:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!