Linux makefile的一些语法

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

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

bash 复制代码
VARIABLE_NAME=value

或者

bash 复制代码
VARIABLE_NAME:=value
  • = 表示延迟赋值,变量的值在引用时才会被展开。
  • := 表示立即赋值,变量的值在定义时就会被展开。
2. 示例
bash 复制代码
# 定义变量
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. 示例
bash 复制代码
# 这是一个注释,解释下面的规则
main: $(OBJS)
    $(CC) $(CFLAGS) -o main $(OBJS)  # 编译并链接生成可执行文件

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

在这个示例中:

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

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

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

在这个示例中:

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

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

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

在这个示例中:

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

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

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

在这个示例中:

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

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

bash 复制代码
$(function_name, arguments)
2. 示例
bash 复制代码
# 替换 .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 = valueVARIABLE_NAME := value 定义变量,通过 $(VARIABLE_NAME) 引用变量。
  • ​注释​ :以 # 开头的行是注释,用于解释代码的作用。
  • ​特殊变量​make 提供了一些自动变量(如 $@$<$^)和预定义变量(如 SHELLMAKEFLAGS)。
  • ​条件语句​ :使用 ifeqelse 进行条件判断。
  • ​函数​makefile 支持一些内置函数,用于字符串操作、文件操作等。
相关推荐
破刺不会编程1 小时前
socket编程UDP
linux·运维·服务器·网络·c++·网络协议·udp
NEXU57 小时前
Linux:套接字
linux·服务器·网络
morliz子轩8 小时前
基于WSL搭建Ubuntu 22.04.x LTS开发环境
linux·运维·ubuntu
Janspran9 小时前
嵌入式linux学习 -- 进程和线程
linux·运维·学习
Cosmoshhhyyy10 小时前
linux远程部署dify和mac本地部署dify
linux·运维·macos
路多辛11 小时前
Debian新一代的APT软件源配置文件格式DEB822详解
linux·运维·ubuntu·debian
-VE-11 小时前
Linux线程控制
linux
驱动探索者12 小时前
USB ADB 简介
linux·adb·驱动·usb
dessler13 小时前
Hadoop HDFS-部署和基本操作
linux·运维·hdfs
风静雪冷13 小时前
find命令解读
linux