Makefile 中的命令


$(filter PATTERN…,TEXT) 

函数名称:过滤函数—filter。 
函数功能:过滤掉字串“TEXT”中所有不符合模式“PATTERN”的单词,保留所
有符合此模式的单词。可以使用多个模式。模式中一般需要包含模式字
符“%”。存在多个模式时,模式表达式之间使用空格分割。 
返回值:空格分割的“TEXT”字串中所有符合模式“PATTERN”的字串。 
函数说明:“filter”函数可以用来去除一个变量中的某些字符串,我们下边的例子中
就是用到了此函数。 
示例: 
sources := foo.c bar.c baz.s ugh.h 
foo: $(sources) 
cc $(filter %.c %.s,$(sources)) -o foo 
 
使用“$(filter %.c %.s,$(sources))”的返回值给 cc 来编译生成目标“foo”,函数返回

值为“foo.c bar.c baz.s”


$(filter-out PATTERN...,TEXT) 

函数名称:反过滤函数—filter-out。 
函数功能:和“filter”函数实现的功能相反。过滤掉字串“TEXT”中所有符合模式
“PATTERN”的单词,保留所有不符合此模式的单词。可以有多个模式。
存在多个模式时,模式表达式之间使用空格分割。。 
返回值:空格分割的“TEXT”字串中所有不符合模式“PATTERN”的字串。 
函数说明: “filter-out”函数也可以用来去除一个变量中的某些字符串, (实现和
“filter”函数相反)。 
示例: 
objects=main1.o foo.o main2.o bar.o 
mains=main1.o main2.o 
 
$(filter-out $(mains),$(objects)) 
实现了去除变量“objects”中“mains”定义的字串(文件名)功能。它的返回值

为“foo.o bar.o”。



上例子:

all:gao
    @echo "final"
.DEFAULT:
  @echo "In default"

由于 gao 是一个前提条件,但是 makefile中没有一个名字为 gao的目的。

所以符合 .DEFAULT 目的的执行条件

故执行结果为:

In default

final

完毕



$(MAKE) , make命令


在一些大的工程中,我们会把我们不同模块或是不同功能的源文件放在不同的目录中,我们可以在每个目录中都书写一个该目录的Makefile,这有利于让我们的Makefile变得更加地简洁,而不至于把所有的东西全部写在一个Makefile中,这样会很难维护我们的Makefile,这个技术对于我们模块编译和分段编译有着非常大的好处。

例如,我们有一个子目录叫subdir,这个目录下有个Makefile文件,来指明了这个目录下文件的编译规则。那么我们总控的Makefile可以这样书写:

subsystem:

cd subdir && $(MAKE)

其等价于:

subsystem:

$(MAKE) -C subdir

定义$(MAKE)宏变量的意思是,也许我们的make需要一些参数,所以定义成一个变量比较利于维护。这两个例子的意思都是先进入“subdir”目录,然后执行make命令。

我们把这个Makefile叫做“总控Makefile”,总控Makefile的变量可以传递到下级的Makefile中(如果你显示的声明),但是不会覆盖下层的Makefile中所定义的变量,除非指定了“-e”参数。



$(MAKE) –C $$dir || exit 1

转到dir这个目录下面make,如果执行结果为0(失败)就执行exit 1,意思就是返回错误。

你可能感兴趣的:(c/c++,Linux)