Makefile文件中的wildcard、patsubst、notdir、obj=(dir:%.c=%.o)的用法学习

1、今天在看Makefile文件的时候看到了一个BUILD_SO = $(LSRCS:%.c=$(BUILD_DIR)/%.o) ,不太明白这个具体是什么含义。在网上找了一下根据前人的分享,自己也记录一下:

   BUILD_SO = $(LSRCS:%.c=$(BUILD_DIR)/%.o) ,这句代码的意思将变量LSRCS中所有的以.c结尾的文件都用目录BUILD_DIR下的.o替换。

另外:wildcard可以后面跟多个路径,使用方法如下:

  假如我在当前目录下创建一个test目录,在test 目录下创建两个文件1.c和2.c;再test目录再新建一个子目录sub,在子目录sub下新建sub1.c和sub2.c。我们在test目录下使用Makefile可以这样写:

 src=$(wildcard *.c ./sub/*.c)

all: 

     @echo $(src)

这样就会输出

1.c 2.c ./sub/sub1.c ./sub/sub2.c

使用@echo 这样终端输出的信息就是命令之后的结果,而不会在终端上把命令也打印出来。即如果去掉@ 终端打印的信息就是:

echo a.c b.c ./sub/sub1.c ./sub/sub2.c

1.c 2.c ./sub/sub1.c ./sub/sub2.c

这样一个结果。

如果在输出的结果中不想带./sub/这个路径的话,可以使用notdir,使用方法:

 dir=$(notdir $(src))

这样输出出来就是:1.c 2.c sub1.c sub2.c了。

obj=$(patsubst %.c,%.o,$(dir)),把上面$(dir)变量里面以.c结尾的文件全部替换为.o结尾。

跟这个等效的一句程序是上面那句: BUILD_SO = $(LSRCS:%.c=$(BUILD_DIR)/%.o) 类似,

obj=$(dir:%.c=%.o);

他的标准格式应该是:
$(var:a=b) 或 ${var:a=b}
它的含义是把变量var中的每一个值结尾用b替换掉a。

--------------------------------------------------------------------------------------------------------------------

补充:

1、Makefiel中foreach的使用:

通用表达式: $(foreach  ,,)

这个的意思就是:把list中遍历一遍,取出其中的每一个单词放到 var中,最后按照执行text的表达式。执行text表达式的时候,每次返回一个字符串,然后以空格隔开,最后text返回的每个字符串组成的整个字符都将是foreach函数的返回值。

 

 

 

 

 

你可能感兴趣的:(Makefile)