首页 > 其他分享 >Makefile 语法速查

Makefile 语法速查

时间:2024-12-31 11:09:18浏览次数:1  
标签:文件 变量 text Makefile 语法 构建 速查

本文是我在看南京大学NEMU项目 makefile 总结的看到的语法,非面相零基础人员学习。

make​ 是一个用于构建大型项目的命令工具,其通过预先定义的 Makefile 来构建可执行文件。Makefile 中定义了各文件之间的依赖关系,以及需要执行哪些相应的命令来完成项目构建。

make的基础参数:

  • -s​:构建过程中不输出命令
  • -C DIRECTORY​:在构建之前,切换工作目录

基础语法

注释:以#​开头的内容都讲别注释,make命令在识别时自动忽略。

目标构建语法:由目标文件依赖文件执行命令构成,具体结构如下。

.PHONY: clean all
.DEFAULT_GOAL: app	# 指定默认构建目标

targets = hello	# 变量

all: target
	@echo "all done"	# @ 可以标记不在终端输出命令的内容

target: prerequisites …
	recipe	# 注意,使用制表符缩进!!
	…

# %表示模式匹配
%.o: $*.c
	gcc $^ -o $@

# 双::可以独立定义构建语法,不受限于別引用方法
clean::
	rm -rf *.o

.PHONY​ 可以用于标记哪些目标方法属于伪目标,这样 Make 就不会去检查文件是否真实存在了,并且永远会执行这个命令。

注:make 命令依赖文件的时间戳来判定是否需要重新构建项目,若依赖文件的时间戳晚于目标文件,则 make 命令认为源码有更新,需要重新编译。

特殊符号

  • $@​:代表目标文件
  • $^​:代表所有的依赖文件
  • $<​:代表第一个依赖文件
  • $*​:代表在 % ​通配符中匹配到的部分
  • $?​:代表比目标文件的时间戳还要新的文件,这里可以理解为在构建完成之后被修改的部分文件

变量

makefile 中的变量类似于 C 语言中的宏,存储的还是文本内容。常用于存储目标文件、编译参数等内容。通过 $(VAR)​ 语法就可以引用变量了。使用override​修饰符可以强制对变量进行赋值操作。

对于变量有以下几种常见赋值操作。

  • =​ ​简单赋值:无论变量是否已存在都重新定义

  • ?=​ ​条件赋值:若变量已被定义过则不在定义

  • +=​ ​追加赋值:在原有值的基础上追加新的值

  • :=​展开赋值:变量不会受到后续行的影响而改变。这个方法较为特殊,以下将展开讲解。

    首先,我们需要知道,make在读取文件时做的第一件事情并不是直接构建,而是展开Makefile。特别是在变量赋值的过程中引用了其他变量,这就导致了=​和:=​在实际运行过程中展现出了不同的效果。

    x = foo
    y = $(x) bar
    x = xyz
    # y = xyz bar
    
    x := foo
    y := $(x) bar
    x := xyz
    # y = foo bar
    

默认变量

  • $(MAKE)​:make命令的路径
  • $(MAKECMDGOALS)​:本次构建的目标文件

特殊语法$(变量名:原后缀=新后缀)​,对变量进行文本替换操作。

高级语法

include语法:引用指定文件内容,也是 makefile 格式的文件,通常以 .mk ​结尾。若引用文件不存在,-include ​则会忽略错误并继续构建。

条件分支语法

ifeq (arg1, arg2)	# 若arg1与arg2相等则执行, 可以是变量、函数或留空
	recipe
endif

ifneq (arg1, arg2)	# 不相等则执行

函数

函数的基本格式是 $(函数名称 参数1, 参数2 ...)​,Makefile 内置了大量函数一般足够开发使用。

  • $(shell COMMAND)​:在 Makefile 中执行 Shell 命令
  • $(wildcard pattern)​:查找符合 pattern 的文件或目录
  • $(info text)​:输出普通信息
  • $(warning text)​:输出警告信息
  • $(error msg)​:输出错误信息并终止构建流程
  • $(patsubst pattern,replacement,text)​:将 text​ ​中符合 pattern​ ​模式的内容替换为 replacement​ ​所指定的内容
  • $(filter-out pattern,text)​:从 text​ ​文本中去除符合 pattern​ ​模式的内容,返回剩下的内容
  • $(addprefix text)​:为字符串添加前缀
  • $(call function_name,param1,param2,...)​:调用自定义函数,并传入相应参数

自定义函数

单行函数:replace_string = $(subst $(1),$(2),$(3))​,其中 $(1)​ 表示接受的第一个参数。

多命令函数

define call_fixdep
    @$(FIXDEP) $(1) $(2) unused > $(1).tmp
    @mv $(1).tmp $(1)
endef

标签:文件,变量,text,Makefile,语法,构建,速查
From: https://www.cnblogs.com/somata/p/18643547

相关文章

  • Ubuntu 22.04 编译安装 PHP 7.4.33 报错:make: *** [Makefile:749: ext/openssl/openss
     下载openssl1.1.1  https://openssl-library.org/source/old/1.1.1/index.html安装低版本OpenSSLwgethttps://github.com/openssl/openssl/releases/download/OpenSSL_1_1_1w/openssl-1.1.1w.tar.gztarzxvfopenssl-1.1.1w.tar.gzcdopenssl-1.1.1w./config--prefi......
  • Android 兼容 Java 8 语法特性的原理分析4
       本文主要阐述了Lambda表达式及其底层实现(invokedynamic指令)的原理、Android第三方插件RetroLambda对其的支持过程、Android官方最新的dex编译器D8对其的编译支持。通过对这三个方面的跟踪分析,以Java8的代表性特性——Lambda表达式为着眼点,将Android如何兼容Java8的过程......
  • 使用数组语法访问对象
    //定义一个名为FakeArray的类,它实现了ArrayAccess接口classFakeArrayimplementsArrayAccess{//定义一个私有属性elements,用于存储数组元素private$elements;//构造函数,初始化elements属性为一个空数组publicfunction__construct(){$this->elements=array();......
  • Java学习教程,从入门到精通,Java I/O流语法知识点及案例代码(70)
    JavaI/O流语法知识点及案例代码一、JavaI/O流语法知识点I/O流简介I/O(Input/Output)流是Java中用于处理输入和输出数据的机制。允许程序与外部设备(如文件、网络连接、内存等)进行数据交换。I/O流的分类字节流(ByteStreams):以字节为单位进行操作,适用于处理二进制数据或......
  • 黑客搜索引擎即相应语法
    黑客搜索引擎即相应语法1.Google部分语法:intext搜索包含指定字符的正文inurl搜索包含指定字符的urlintitle搜索包含指定字符的标题site搜包含关键字的站点filetype搜索指定文件类型2.渗透入系统1.爆破2.后台0day(只有自己知道的漏洞)1day(少数人知道的漏洞)nday(大多数人知......
  • 2. Crash course on parsers 语法分析器速成课程
    Ifyou'veneverworkedwithaparsergeneratorbefore,oraren'treallyfamiliarwithcontext-freegrammars,thissectionisjustaverybriefintroductionintothebasicidea.Basicallyagrammarisanicewayofwritingoutwhatkindsofinput......
  • 【OpenGL ES】GLSL基础语法
    1前言​本文将介绍GLSL中数据类型、数组、结构体、宏、运算符、向量运算、矩阵运算、函数、流程控制、精度限定符、变量限定符(in、out、inout)、函数参数限定符等内容,另外提供了一个include工具,方便多文件管理glsl代码,实现代码的精简、复用。​Unity中Shader介......
  • 了解Makefile配置
    Make简介:工程管理器,也就是个自动编译管理器,能够根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时通过读入Makefile文件的内容来执行大量的编译工作。Make将只编译改动的代码文件,而不用完全编译。Makefile是Make读入的唯一配置文件。编译将源码翻译成机器代码:gcc-......
  • C语言学习笔记(基础语法篇)
    C语言学习笔记(基础语法篇)序言首先事先说明一下,这是我从各处整理的,当初刚接触CS,甚至连标注意识都没有,再次感谢写这些文章的人.当然这里不是说全部都是别人写的了,也有一点我自己的思考.首先是几个注意点:结构化,模块化,分而治之多写注释,多调试指针也有不同类型......
  • PYTHON语言学习笔记(基础语法篇)
    Python学习笔记序言主要是以小甲鱼的视频为主,https://space.bilibili.com/314076440一些特性多次调用方法是从左到右.而参数是函数则先执行参数.一行如果要多个赋值,用;隔开input().split()IO看我放在另一个地方的文档.<D:\Document\md\PYTHON\IO.md>数据类型变量没什......