Makefile 基础

官方文档

https://www.gnu.org/software/make/manual/make.html

目标 - 依赖文件 - 命令

目标(文件):依赖文件
  命令(命令前是一个TAB键) 

1、make执行的格式为:make 目标,如果不指定目标,会执行Makefile中第一个出现的没有匹配符%的目标

2、当依赖修改时,即有一个以上的依赖文件比 target 文件要新的话,需要重新生成目标,所以需要执行目标所对应的命令。当目标没有指定依赖,则make指定的目标所对应的命令一定会执行

3、当目标没有指定依赖,比如all,被称为伪目标,因为不需要产生一个实际的名为 all 的目标文件,只要执行指令。伪目标有些时候需要配合.phony一起使用

make 命令带参数

一个工程,编写了 Makefile 后,通常只需要在当前目录下输入 make 命令即可完成编译。然而实际上, make 命令本身是可以接受参数的,完整的用法如下:

make [选项] [宏定义,比如 DEBUG=XX] [目标]

 选项可以指定 make 的工作行为,宏定义可以指定执行 Makefile 的宏值,目标则是Makefile 中的目标,包含伪目标。这些参数都是可选的,各参数之间用空格分隔。

指定makefile文件

make程序如果没有使用 -f 选项指定一个Makefile,make则在当前目录下按顺序寻找下列文件:GNUMakefile、Makefile、makefile。推荐使用Makefile。

换行连接符

相关行如果过长,可以使用反斜线“\”作为后接行符来续行

注释

在描述语句行前面加“#”表示注释

命令前加破折号(-):make忽略命令行返回的状态

在命令前加“-”,表示如果这条指令执行失败,make将忽略这个错误,继续往下执行;如果不加“-”,则make会停止。等效于“make -i”命令

clean:
        -rm *.o *~ core paper

命令前加@:不打印命令本身,只打印输出结果

install:
        @echo You must be root to install

命令echo XXX中,XXX是结果,echo XXX是命令本身

条件指令

ifeq ($(CC),gcc)
        $(CC) -o foo $(objects) $(libs_for_gcc)
else
        $(CC) -o foo $(objects) $(normal_libs)
endif

include指令

include指令告诉make暂停读取当前makefile文件,转而读取一个或多个其它的makefile,然后再继续当前makefile
include ${TOP_DIR}/config/common/makefile.mk

指定头文件路径

先定义一个变量存头文件路径,比如变量 INCLUDES

INCLUDES += \
  -I${TOP_DIR}/ \
  -I${TOP_DIR}/common/include/quectel/open \
  -I${TOP_DIR}/interface/network/sockets/inc \
  -I${TOP_DIR}/interface/dev/inc \

makefile 里调用 shell 输出

PWD:=$(shell pwd)

前置依赖 |

“| create_build”在此处的意义为前置依赖, create_build 为伪目标,合起来的意义是 create_build 这个伪目标要先被执行

 

 

 

posted @ 2021-06-03 17:54  流水灯  阅读(86)  评论(0编辑  收藏  举报