当前位置: 首页 > 学习英语 > 语法形态

makefile语法,linux中make的用法

  • 语法形态
  • 2024-01-26

makefile语法?比较参数“arg1”和“arg2”的值是否相同。当然,参数中我们还可以使用make的函数。如:ifeq ($(strip $(foo)),);endif 这个示例中使用了“strip”函数,如果这个函数的返回值是空(Empty),那么,makefile语法?一起来了解一下吧。

makefile编译

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

从中我们可以看到:默认情况下构建第一个标签。

cmake语法

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如何运行

@在Makefile一般用来解析shell命令,

@if [ ! -d $(CPU) ]; then mkdir $(CPU); fi

后面跟的是shell的判断语句。

你可以用@把shell命令放在Makefile中执行。

makefile调用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文件的命令

makefile 语法里没有直接类似if...elseif...else.....的这种结构,但是有类似 if ...else ...语句的结构: ifeq...else...endif。所以可用嵌套的方式 实现if...elseif...else.....的这种结构

ifeq (, )表示 if(等于 )

例如:

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”。这就是目标指定变量的灵活之 处。内容来源于互联网,信息真伪需自行辨别。如有侵权请联系删除。

猜你喜欢