makefile语法?比较参数“arg1”和“arg2”的值是否相同。当然,参数中我们还可以使用make的函数。如:ifeq ($(strip $(foo)),)
Makefile语法基础
在Linux下,自动化编译是通过make命令来完成的(一些厂商也提供了它们自己的make命令,如gmake等),make命令的基本格式如下:
make
[-f
makefile]
[label]
它可以通过-f参数指定输入文件,当省略-f参数时,默认输入文件名为Makefile,由于我们通常不用这个-f参数,往往就用默认的Makefile文件名。
Makefile是一个文本文件,它是基于一定的语法规则的,它的基本执行规则定义如下:
target
:
[prerequisites]
command
target
标签,用于标志当前构建的规则,它也可以是文件。
prerequisites
依赖项,在构建该标签的时候先执行的规则
command
make需要执行的命令。(任意的Shell命令)
注意:Makefile的target是顶格写的,而Command需要加一个Tab键。我这里为了排版看起来舒服点,每一行都多加了一个Tab键,如果要使用本文的Makefile示例,请去掉各行的第一个Tab键,否则make的时候报错。
例如,我们编写一个简单的Makefile:
clean:
@echo
"clean"
all:
@echo
"all"
当我们直接执行make命令的时候,输出如下:
tianfang
>
make
clean
tianfang
>
make
all
all
tianfang
>
make
clean
clean
从中我们可以看到:默认情况下构建第一个标签。
makefile中ifeq,ifneq,ifdef和ifndef的区别与用法
使用条件判断,可以让make根据运行时的不同情况选择不同的执行分支。条件表达式可以是比较变量的值,或是比较变量和常量的值。
一、示例
下面的例子,判断$(CC)变量是否“gcc”,如果是的话,则使用GNU函数编译目标。
libs_for_gcc = -lgnu
normal_libs =
foo: $(objects)
ifeq ($(CC),gcc)
$(CC) -o foo $(objects) $(libs_for_gcc)
else
$(CC) -o foo $(objects) $(normal_libs)
endif
可见,在上面示例的这个规则中,目标“foo”可以根据变量“$(CC)”值来选取不同的函数库来编译程序。
我们可以从上面的示例中看到三个关键字:ifeq、else和endif。ifeq的意思表示条件语句的开始,并指定一个条件表达式,表达式包含两个参数,以逗号分隔,表达式以圆括号括起。else表示条件表达式为假的情况。endif表示一个条件语句的结束,任何一个条件表达式都应该以endif结束。
@在Makefile一般用来解析shell命令,
如
@if [ ! -d $(CPU) ]; then mkdir $(CPU); fi
后面跟的是shell的判断语句。
你可以用@把shell命令放在Makefile中执行。
$@是Makfile里的一种自动化变量,代表目前规则中所有的目标的集合,在模式规则中,如果有多个目标,那么,"$@"就是匹配于目标中模式定义的集合。
Makefile规则语法
targets : prerequisites
command
...
$@就是对应targets目标集合。
举个例子具体说明:
objects = t1.o t2.o
$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
这里objects包含两个目标,t1.o和t2.o,$@就代表objects,也即{t1.o t2.o}这个目标集合。
makefile 语法里没有直接类似if...elseif...else.....的这种结构,但是有类似 if ...else ...语句的结构: ifeq...else...endif。所以可用嵌套的方式 实现if...elseif...else.....的这种结构
ifeq (
例如:
ifeq ($(CC),gcc)
libs=$(libs_for_gcc)
else
ifeq ($(CC),gplus)
libs=$(libs_for_gplus)
else
libs=$(normal_libs)
endif
endif
以上就是makefile语法的全部内容,(RM) *.o *.d $(EXES)这个 Makefile 文件实现了在编译程序“ foo”使用优化选项“ -O2”但不使用调试选项 “ -g”,而在编译“ bar”时采用了“ -g”但没有“ -O2”。这就是目标指定变量的灵活之 处。