前言
在C语言等语言中存在变量这个概念那么在Makefile中也是存在变量这个概念的,现在就让我们来学习一下什么是Makefile中的变量。
一、Makefile变量概念介绍
变量是在Makefile中被定义并被赋予特定的值或字符串,这些变量可以在整个Makefile中引用和使用。
在Makefile中定义变量,可以使Makefile更加灵活,便于维护和重复使用代码。变量通常用于存储文件名、目录路径、编译器选项等常用的定义,并且可以动态地用于自动构建步骤的指令中。
以下是一些Makefile变量的示例:
CC变量:用于指定编译器的类型
CC = gcc
CFLAGS变量:指定编译器选项(例如调试信息、优化等)
CFLAGS = -g -O2
SRC_FILES变量:用于指定源文件列表
SRC_FILES = main.c foo.c bar.c
OBJ_FILES变量:用于指定目标文件列表
二、Makefile中变量的赋值方式
1.简单赋值
简单赋值其实就是和我们在C语言当中使用 = 来赋值是一样的。
当我们要调用这个变量的使用可以使用$符号进行调用。
x := "hello"
all :
@echo "x => $x"
执行结果:
2.递归赋值
当使用递归赋值时其中一个变量的值被修改那么这个被赋值的值也会随之被修改。
x := hello
y = $(x)world
x := hi
all :
@echo "x => $(x)"
@echo "y => $(y)"
执行结果:
3.条件赋值
条件赋值就是当一个变量没有进行定义时才能起作用。
x := hello
y = $(x)world
x := hi
z = test1
z ?= test
all :
@echo "x => $(x)"
@echo "y => $(y)"
@echo "z => $(z)"
执行结果:
4.追加赋值
追加赋值其实是非常好理解的,就是在原来变量的后面再加上赋的值,但是需要注意的就是追加的值和原来的值之间是会有一个空格隔开的。
x := hello
y = $(x)world
x := hi
z = test1
z ?= test
k := test11
k += Test
all :
@echo "x => $(x)"
@echo "y => $(y)"
@echo "z => $(z)"
@echo "k => $(k)"
三、Makefile赋值在工程中的应用
这里我们使用赋值来改造一下我们之前写过的一个makefile,在这里使用了CC替代gcc,使用TARGET替代 hello。
当我们的编译器不是使用的gcc时我们只需要修改CC 这个变量的值即可,当要生成目标的文件名不是hello时修改TARGET变量的值即可。
CC := gcc
TARGET := hello
TARGET : hello.o func.o
$(CC) -o TARGET hello.o func.o
hello.o : hello.c
$(CC) -c -o hello.o hello.c
func.o : func.c
$(CC) -c -o func.o func.c
.PHONY: clean rebuild all
rebuild : clean all
all : TARGET
clean :
rm *.o TARGET
总结
Makefile中的变量在工程开发中是非常常用的,大家需要好好掌握和理解。