Makefile语法

1、语法编译规则

targets : prerequisites 

        command
targets:规则的目标。可以是一个标签,也可以是要生成的可执行文件,还可以是 Object File(一般称它为中间文件);
prerequisites:依赖文件。要生成 targets 需要的文件或者是目标,可以没有,也可以是多个;
command:make 需要执行的命令(任意的 shell 命令)。可以有多条命令,每一条命令占一行。

【注】规则目标和依赖文件之间要使用冒号分隔开
【注】命令的开始一定要使用Tab键

2、变量定义

Makefile 文件中定义变量的基本语法如下, 变量的名称可以由大小写字母、阿拉伯数字和下划线构成。等号左右的空白符没有明确的要求,因为在执行 make 的时候多余的空白符会被自动的删除。至于值列表,既可以是零项,又可以是一项或者是多项。

变量的名称=值列表 #示例:VALUE_LIST = one two three

这些变量分为三大类:自定义变量、内置变量、自动变量,其中自定义变量和内置变量较为常用。

2.1 自定义变量

赋值方式              含义
简单赋值 ( := )     只对当前语句的变量有效
递归赋值 ( = )      赋值语句可能影响多个变量,所有目标变量相关的其他变量都受影响
条件赋值 ( ?= )    如果变量未定义,则使用符号中的值定义变量。如果该变量已经赋值,则该赋值语句无效
追加赋值 ( += )   原变量用空格隔开的方式追加一个新值

##########执行命令:make test###################
###############简单赋值#########################
x:=foo
y:=$(x)b
x:=new
test:
      @echo "y=>$(y)"         #执行结果:y=>foob
      @echo "x=>$(x)"         #执行结果:x=>new

###############递归赋值##########################
x=foo
y=$(x)b
x=new       #该变量会覆盖之前的赋值(递归赋值尽量不要对相同变量使用)
test:
      @echo "y=>$(y)"         #执行结果:y=>newb
      @echo "x=>$(x)"         #执行结果:x=>new
###############条件赋值##########################
x:=foo
y:=$(x)b
x?=new      #该变量上文已定义,故此处赋值无效
test:
      @echo "y=>$(y)"         #执行结果:y=>foob
      @echo "x=>$(x)"         #执行结果:x=>foo
###############追加赋值##########################      
x:=foo
y:=$(x)b
x+=$(y)     #在上文赋值基础上进行追加赋值,以单空格隔开
test:
      @echo "y=>$(y)"         #执行结果:y=>foob
      @echo "x=>$(x)"         #执行结果:x=>foo foob

2.2自动变量

自动化变量可以理解为由 Makefile 自动产生的变量。在模式规则(通过匹配模式找字符串)中,规则的目标和依赖的文件名代表了一类的文件。规则的命令是对所有这一类文件的描述。我们在 Makefile 中描述规则时,依赖文件和目标文件是变动的,显然在命令中不能出现具体的文件名称,否则模式规则将失去意义。

##########执行命令:make test###################
test:test.o test1.o test2.o
         gcc -o $@ $^                # "$@" 代表的是目标文件test
test.o:test.c test.h
         gcc -o $@ $<                # “$^”代表的是所有依赖文件
test1.o:test1.c test1.h
         gcc -o $@ $<                # “$<”代表的是依赖文件中的第一个
test2.o:test2.c test2.h
         gcc -o $@ $<

3、条件判断

############# ifeq #############
libs_for_gcc= -lgnu
normal_libs=
ifeq($(CC),gcc)      # CC是系统环境变量
    libs=$(libs_for_gcc)
else
    libs=$(normal_libs)
endif

foo:$(objects)
    $(CC) -o foo $(objects) $(libs)    

############# ifdef #############
foo=
all:
ifdef foo
    @echo yes
else
    @echo  no    #打印的结果:no
endif

4、Makefile 特殊符号 - 、@、 +、 $ 、$$

4.1 - 符号 (连字符)

任何命令行的任何非零退出状态都被忽略,忽略当前命令行执行时所遇到的错误。
make 在执行命令的时候,如果遇到 error,会退出执行。加上减号的目的是即便此命令行执行出错,那么也不要管,继续执行 make。
通常删除或者创建文件时,遇到文件不存在或者已经创建。如果希望忽略掉错误,继续执行,就可以在命令行前面添加 -。

.PHONY : clean
clean :
    -rm $(objects)

4.2 @ 符号 (at 符号)

通常 makefile 会将其执行的命令行在执行前输出到屏幕上。如果将 @ 添加到命令行前,这个命令将不被 make 回显出来,即不显示命令本身而只显示结果。

ifdef DEFINE_VAR
    VAR = "!!!Hello World!!!"
endif

ifeq ($(OPT), define)
    VAR ?= "!FIRST!"
endif

ifeq ($(OPT), add)
    VAR += "!SECOND!"
endif

ifeq ($(OPT), recover)
    VAR := "!THIRD!"
endif

    x = cheng
    y = $(x) yong
    x = qiang

    m := face
    n := $(m) person
    m := pedestrian

all :
    @echo Compiling Kernel Module
    echo Compiling Kernel Module
    @echo $(VAR)
    @echo $(x)
    @echo $(y)
    @echo $(m)
    @echo $(n)

strong@foreverstrong:~/Desktop/makefile_work$ make DEFINE_VAR=true
Compiling Kernel Module
echo Compiling Kernel Module
Compiling Kernel Module
!!!Hello World!!!
qiang
qiang yong
pedestrian
face person
strong@foreverstrong:~/Desktop/makefile_work$

4.3 + 符号 (加号)

使用加号修饰符让命令始终执行。命令行执行时不受到 make 的 -n -t -q 三个参数的影响,忽略这三个参数。
如果 make 执行时,使用 -n 或 --just-print。该参数显示命令,不会执行命令。这个功能有利于调试 Makefile,方便查看执行的命令形式和顺序。

4.4 $ 符号 (美元符号)

美元符号 $,扩展打开 makefile 中定义的变量。

4.5 $$ 符号

$$ 符号,扩展打开 makefile 中定义的 shell 变量。

### 回答1: Makefile 是用于自动化编译程序的工具,它使用一种名为“规则”的方式来描述源文件和目标文件之间的依赖关系,然后根据这些规则自动编译程序。 Makefile 通常包括以下几个部分: 1. 变量定义:定义需要的变量,如编译器、编译选项等。 2. 目标文件:定义需要编译的目标文件、依赖文件和编译规则。 3. 伪目标:定义一些伪目标,如 clean、install 等。 下面是 Makefile语法: 1. 变量定义: 变量定义的语法格式为: ``` 变量名 = 变量值 ``` 例如: ``` CC = gcc CFLAGS = -Wall -O2 ``` 2. 目标文件: 目标文件的格式为: ``` 目标文件: 依赖文件 编译规则 ``` 例如: ``` main.o: main.c $(CC) $(CFLAGS) -c main.c -o main.o ``` 其中: - 目标文件是 main.o。 - 依赖文件是 main.c。 - 编译规则是 $(CC) $(CFLAGS) -c main.c -o main.o,表示使用 gcc 编译器和编译选项将 main.c 编译成 main.o。 3. 伪目标: 伪目标的格式为: ``` 伪目标: 命令 ``` 例如: ``` clean: rm -rf *.o ``` 其中: - 伪目标是 clean。 - 命令是 rm -rf *.o,表示删除所有的 .o 文件。 这些是 Makefile 的基本语法,你可以根据需要添加更多的规则来实现自动化编译。 ### 回答2: Makefile是用于自动化构建和管理软件项目的一种脚本语言,它描述了软件项目中的文件依赖关系和构建规则。Makefile文件通常包含一系列规则和命令。 Makefile的基本语法包括: 1.目标(Target):由一组规则组成,表示一个或多个文件的生成或操作。目标的命名可以是任意合法的文件名。 2.依赖(Prerequisites):目标所依赖的文件或目标。依赖可以是文件、目录或其他目标。当依赖发生变化时,相应的目标将重新生成。 3.命令(Command):规则中执行的命令。命令必须以Tab键开头,并且可以有多条。 4.规则(Rule):目标、依赖和命令的组合。规则表示了如何生成目标文件或执行一系列操作。 5.变量(Variables):用于存储常用的值或字符串,以便在Makefile中重复使用。变量以$符号开头,并用括号括起来。 6.条件判断(Conditionals):用于根据特定条件选择不同的规则或命令执行路径。条件判断以ifeq、ifneq等关键字开头。 7.循环(Loops):可以在Makefile中使用循环语句,例如foreach、while等,用于重复执行特定的操作。 Makefile的执行过程是根据文件的依赖关系来决定哪些目标需要重新生成。当执行make命令时,Makefile会被解析,并根据依赖关系构建目标文件,如果目标文件已经存在且依赖没有发生变化,则不会重新生成。 Makefile的优点是可以自动化构建过程、减少重复操作、提高项目的可维护性和可靠性。它可以根据项目的需要灵活定义构建规则,并自动处理文件间的依赖关系,大大简化了项目的管理工作和构建过程。 ### 回答3: makefile是一种用于构建和管理软件项目的工具,它使用明确的规则来指导编译和链接操作。它通常用于编译C/C++等编程语言的项目。 makefile的基本语法包含了规则、变量和命令。 规则是makefile的核心,它由目标、依赖和命令组成。目标是需要生成的文件,依赖是生成目标所依赖的文件或其他目标,命令是生成目标的具体操作。规则的格式如下: ``` 目标: 依赖 [tab] 命令 ``` 变量在makefile中用于保存常用的路径、编译选项等信息。可以通过变量的引用来简化makefile的书写和维护。变量的定义使用等号(=)来完成,如: ``` 变量名 = 值 ``` 命令是makefile中的具体操作步骤,用于生成目标。每条命令都必须以一个制表符(tab)开头,否则会被当作普通文本处理。 makefile还有一些常用的指令,如clean、all等。clean指令用于清理编译生成的目标文件和可执行文件,all指令用于编译所有文件。 makefile的优势在于可以自动判断哪些文件需要重新编译,从而提高了构建效率。它可以根据文件的修改时间和依赖关系来确定需要重新编译的文件,并只编译这些文件,避免了不必要的重复操作。 总之,makefile是一种强大的构建工具,它以简洁的语法和智能的依赖关系判断,能够实现高效的软件构建和管理。但需要注意的是,makefile语法在不同的平台和编译器上可能会有一些差异,需要根据具体情况进行调整和学习。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值