当前位置: 首页 > news >正文

Linux makefile的一些语法

一、定义变量
1. 变量的基本语法

在 makefile 中,变量的定义和使用非常类似于编程语言中的变量。变量的定义格式(最好不要写空格)如下:

VARIABLE_NAME=value

或者

VARIABLE_NAME:=value
  • = 表示延迟赋值,变量的值在引用时才会被展开。
  • := 表示立即赋值,变量的值在定义时就会被展开。
2. 示例
# 定义变量
CC=gcc
CFLAGS=-Wall -g
SRCS=main.c add.c sub.c
OBJS=$(SRCS:.c=.o)

# 使用变量
main: $(OBJS)
    $(CC) $(CFLAGS) -o main $(OBJS)

%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@

在这个示例中:

  • CC 定义了编译器为 gcc
  • CFLAGS 定义了编译选项为 -Wall -g
  • SRCS 定义了源文件列表。
  • OBJS 使用模式替换将 .c 文件列表转换为 .o 文件列表。
3. 变量的引用

变量通过 $(VARIABLE_NAME) 或 ${VARIABLE_NAME} 的方式引用。例如,$(CC) 引用了 CC 变量的值。

二、注释
1. 注释的基本语法

在 makefile 中,注释以 # 开头,从 # 开始到行尾的内容都会被 make 忽略。

2. 示例
# 这是一个注释,解释下面的规则
main: $(OBJS)
    $(CC) $(CFLAGS) -o main $(OBJS)  # 编译并链接生成可执行文件

# 定义编译器
CC = gcc  # 使用 GCC 编译器

在这个示例中:

  • 第一行的 # 这是一个注释,解释下面的规则 是一个注释,解释了 main 目标的作用。
  • 第三行的 # 编译并链接生成可执行文件 是一个注释,解释了 $(CC) $(CFLAGS) -o main $(OBJS) 命令的作用。
  • 第五行的 # 使用 GCC 编译器 是一个注释,解释了 CC 变量的作用。
三、特殊变量
1. 自动变量

make 提供了一些自动变量,这些变量在规则的命令部分中非常有用:

  • $@:表示目标文件。
  • $<:表示第一个依赖文件。
  • $^:表示所有依赖文件。
  • $?:表示比目标文件新的依赖文件。
2. 示例
%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@

在这个示例中:

  • $< 表示第一个依赖文件(即 .c 文件)。
  • $@ 表示目标文件(即 .o 文件)。
3. 预定义变量

make 还提供了一些预定义变量,例如:

  • SHELL:指定使用的 shell。
  • MAKEFLAGS:传递给 make 的选项。
4. 示例
SHELL = /bin/bash
MAKEFLAGS += -s  # 静默模式

在这个示例中:

  • SHELL 变量指定了使用的 shell 为 /bin/bash
  • MAKEFLAGS 变量添加了 -s 选项,使 make 在静默模式下运行。
四、条件语句
1. 基本语法

makefile 支持条件语句,可以根据不同的条件执行不同的命令。条件语句的语法如下:

ifeq (arg1, arg2)
    # 如果 arg1 等于 arg2,执行这里的命令
else
    # 如果 arg1 不等于 arg2,执行这里的命令
endif
2. 示例
ifeq ($(DEBUG), 1)
    CFLAGS += -g
else
    CFLAGS += -O2
endif

在这个示例中:

  • 如果 DEBUG 变量的值为 1,则添加 -g 编译选项。
  • 否则,添加 -O2 编译选项。
五、函数
1. 基本语法

makefile 支持一些内置函数,可以用于字符串操作、文件操作等。函数的语法如下:

$(function_name, arguments)
2. 示例
# 替换 .c 为 .o
OBJS = $(SRCS:.c=.o)

# 获取文件列表的长度
NUM_OBJS = $(words $(OBJS))

# 查找文件
SRC_DIR = src
HDR_DIR = include
SRCS = $(wildcard $(SRC_DIR)/*.c)
HDRS = $(wildcard $(HDR_DIR)/*.h)

在这个示例中:

  • $(SRCS:.c=.o) 将 SRCS 变量中的 .c 替换为 .o
  • $(words $(OBJS)) 计算 OBJS 变量中的文件数量。
  • $(wildcard $(SRC_DIR)/*.c) 查找 SRC_DIR 目录下的所有 .c 文件。

六、总结

  • ​定义变量​​:使用 VARIABLE_NAME = value 或 VARIABLE_NAME := value 定义变量,通过 $(VARIABLE_NAME) 引用变量。
  • ​注释​​:以 # 开头的行是注释,用于解释代码的作用。
  • ​特殊变量​​:make 提供了一些自动变量(如 $@$<$^)和预定义变量(如 SHELLMAKEFLAGS)。
  • ​条件语句​​:使用 ifeq 和 else 进行条件判断。
  • ​函数​​:makefile 支持一些内置函数,用于字符串操作、文件操作等。

相关文章:

  • ORA-09925 No space left on device 问题处理全过程记录
  • windows下载安装远程桌面工具RealVNC-Server教程(RealVNC_E4_6_1版带注册码)
  • 企业供应链管理
  • Ubuntu 22.04/24.04 配置apt 源
  • 高并发系统架构设计核心要点的结构化提炼【大模型总结】
  • linux paste 命令
  • 链路聚合配置命令
  • C++11可变参数模板单例模式
  • hi3516cv610通过menuconfig关闭的宏记录
  • 【MySQL数据库】锁机制
  • Linux系统调试
  • ML:Non-deterministic Turing Machine,简称 NTM
  • Vite环境下解决跨域问题
  • 【C++经典例题】杨辉三角问题
  • java自主学习网站(springboot+ssm+mysql)含运行文档
  • 《在 Ubuntu 22.04 上安装 CUDA 11.8 和 Anaconda,并配置环境变量》
  • chromium魔改——绕过无限debugger反调试
  • FreeRTOS同步和互斥机制以及相关API
  • 【开源】Unity 商业级引擎源码加密混淆过马甲包 Il2cpp global-metadata加密方案 Android加固IOS加固
  • Windows修改hosts文件让向日癸软件联网
  • 聊城网站制作信息/网络营销公司网络推广
  • 南和企业做网站/网络推广项目
  • 澳门wap网站制作/重庆seo网站建设
  • 哪个网站可以做前端项目/seo推广沧州公司电话
  • 网站优化潍坊/手机黄页怎么找
  • 同企网站建设做网站/泉州百度关键词优化