示例说明 Makefile 中的 $(@F),及其用法示例$$dir $@ $< $^ %.c

2024-01-10 13:02:51

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

执行效果:

2,用法及其示例

那么 $(@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

验证效果:

通过 make -C $$dir $(@F)
相当于
make -C $$dir? clean
成功clean掉了所有的子文件夹中需要 rm -rf 的内容.

文章来源:https://blog.csdn.net/eloudy/article/details/135499503
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。