Makefile 中的命令

mac2022-07-05  29

$(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,意思就是返回错误。
最新回复(0)