栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Makefile学习

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Makefile学习

目的

快速了解一下Makefile,为了RVOS课程

Makefile规则
target:prerequisites 	#目标:依赖的文件或者其他目标
	cmd_1
	cmd_2
	cmd_3

.PHONY:clean			#伪目标
clean:
	cmd
Makefile变量、模式匹配 变量

系统变量

.PHONY: all
all:
	echo "$(CC)" 
	echo "$(AS)" 
	echo "$(MAKE)" 
#输出结果	
#echo "cc" 
#cc
#echo "as" 
#as
#echo "make" 
#make

自定义变量

=,延迟赋值(引用此变量的时候才赋值)

A=123
B=$(A)
A=456
.PHONY: all
all:
	echo "$(B)" 
#输出结果	
#456

:=,立即赋值

A=123
B:=$(A)
A=456
.PHONY: all
all:
	echo "$(B)" 
#输出结果	
#123

?=,空赋值(变量为空的时候才有效)

A?=123
#B:=$(A)
A?=456
.PHONY: all
all:
	echo "$(A)" 
#输出结果	
#123

+=,追加赋值(不会改变变量的值)

A?=123
#B:=$(A)
A+=456
.PHONY: all
all:
	echo "$(A)" 
#输出结果	
#123 456

自动化变量

$<,第一个依赖文件

$^,全部的依赖文件

$@,目标

all:targeta targetb
	echo "$<"
	echo "$^"
	echo "$@"

targeta:

targetb:

#输出结果
#echo "targeta"
#targeta
#echo "targeta targetb"
#targeta targetb
#echo "all"
#all
模式匹配

%,匹配任意多个非空字符

类似于shell的*通配符

%:
	echo "$@"
默认规则

.o文件默认使用.c文件编译

Makefile条件分支
ifeq(var1,var2)
	....
else
	....
endif
ifneq(var1,var2)
	....
else
	....
endif
Makefile常用函数 patsubst

模式替换函数

.PHONY:all
all:
	echo "$(patsubst %.c,%.o,x.c.c bar.c)"

把字串“x.c.c bar.c”中以.c 结尾的单词替换成以.o 结尾的字符。函数的返回结果 是“x.c.o bar.o”

notdir

取文件名函数

.PHONY:all
all:
	echo "$(notdir src/foo.c hacks)"

返回值为:“foo.c hacks”

wildcard

获取匹配模式文件名函数

.PHONY:all
all:
	echo "$(wildcard *.c)"

返回值为当前目录下所有.c 源文件列表

foreach

函数“foreach”不同于其它函数。它是一个循环函数。类似于 Linux 的 shell 中的 for 语句

dirs := a b c d 
files := $(foreach dir,$(dirs),$(wildcard $(dir)/*))

.PHONY:all
all:
	echo "$(files)"

把文件夹里边的文件全部找出来

Makefile解决头文件依赖
    写一个头文件,并把头文件添加到编译器的头文件的路径实时检查头文件的更新情况,一旦头文件发生变化,应该重新编译所有相关文件
较为完善的Makefile
ARCH?=x86
ifeq ($(ARCH),x86)
	CC=gcc
else 
	CC=arm-linux-gnueabihf-gcc
endif

TARGET=mp3
BUILD_DIR=build
SRC_DIR=module1 module2
INC_DIR=include
CFLAGS=$(patsubst %,-I%,$(INC_DIR))

INCLUDE= $(foreach dir,$(INC_DIR),$(wildcard $(dir)/*.h))
SOURCES=  $(foreach dir,$(SRC_DIR),$(wildcard $(dir)/*.c))
OBJS=$(patsubst %.c,$(BUILD_DIR)/%.o,$(notdir $(SOURCES)))
VPATH=$(SRC_DIR)


$(BUILD_DIR)/$(TARGET):$(OBJS)
	$(CC) $^ -o $@ $(CFLAGS)

$(BUILD_DIR)/%.o:%.c $(INCLUDE) | create_build
	$(CC) -c $< -o $@

.PHONY:create_build
create_build:
	mkdir -p $(BUILD_DIR)

.PHONY:clean
clean:
	rm -rf $(BUILD_DIR)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/729620.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号