> 文章列表 > 【Linux 裸机篇(五)】I.MX6ULL BSP工程管理下的 Makefile编写、链接脚本

【Linux 裸机篇(五)】I.MX6ULL BSP工程管理下的 Makefile编写、链接脚本

【Linux 裸机篇(五)】I.MX6ULL BSP工程管理下的 Makefile编写、链接脚本

目录

  • 一、BSP 工程
  • 二、Makefile
  • 三、链接脚本

一、BSP 工程

【Linux 裸机篇(五)】I.MX6ULL BSP工程管理下的 Makefile编写、链接脚本

文件 描述
bsp 存放驱动文件
imx6ul 存放跟芯片有关的文件,比如 NXP 官方的 SDK库文件
obj 存放编译生成的.o 文件
project 存放 start.S 和 main.c 文件,也就是应用文件

二、Makefile

1 	CROSS_COMPILE ?= arm-linux-gnueabihf-
2 	TARGET ?= bsp
3
4 	CC := $(CROSS_COMPILE)gcc
5 	LD := $(CROSS_COMPILE)ld
6 	OBJCOPY := $(CROSS_COMPILE)objcopy
7 	OBJDUMP := $(CROSS_COMPILE)objdump
8 
9 	INCDIRS := imx6ul \\
10 				bsp/clk \\
11 				bsp/led \\
12 				bsp/delay
13
14 	SRCDIRS := project \\
15 				bsp/clk \\
16 				bsp/led \\
17 				bsp/delay
18
19 	INCLUDE := $(patsubst %, -I %, $(INCDIRS))
20
21 	SFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))
22 	CFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))
23
24 	SFILENDIR := $(notdir $(SFILES))
25 	CFILENDIR := $(notdir $(CFILES))
26
27 	SOBJS := $(patsubst %, obj/%, $(SFILENDIR:.S=.o))
28 	COBJS := $(patsubst %, obj/%, $(CFILENDIR:.c=.o))
29 	OBJS := $(SOBJS) $(COBJS)
30
31 	VPATH := $(SRCDIRS)
32
33 	.PHONY: clean
34
35 	$(TARGET).bin : $(OBJS)
36 	$(LD) -Timx6ul.lds -o $(TARGET).elf $^
37 	$(OBJCOPY) -O binary -S $(TARGET).elf $@
38 	$(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis
39
40 	$(SOBJS) : obj/%.o : %.S
41 	$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<
42
43 	$(COBJS) : obj/%.o : %.c
44 	$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<
45
46 	clean:
47 	rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)
描述
1~7 定义了一些变量,除了第 2 行以外其它的都是跟编译器有关的,如果使用其它编译器的话只需要修改第 1 行即可。第 2 行的变量 TARGET 目标名字,不同的例程肯定名不一样。
9 变量 INCDIRS 包含整个工程的.h 头文件目录,文件中的所有头文件目录都要添加到变量INCDIRS中。比如本例程中包含.h头文件的目录有imx6ul、bsp/clk、bsp/delaybsp/led,所以就需要在变量 INCDIRS 中添加这些目录,即:
INCDIRS := imx6ul bsp/clk bsp/led bsp/delay
14 变量 SRCDIRS,和变量 INCDIRS 一样,只是 SRCDIRS 包含的是整个工程的所有.c 和.S 文件目录比如本例程包含有.c 和.S 的目录有 bsp/clk、 bsp/delay、 bsp/led 和 project,即:
SRCDIRS := project bsp/clk bsp/led bsp/delay
19 变量 INCLUDE 使用到了函数 patsubst,通过函数 patsubst 给变量 INCDIRS 添加一个“-I”,加“-I”的目的是因为 Makefile 语法要求指明头文件目录的时候需要加上“-I”,即:
INCLUDE := -I imx6ul -I bsp/clk -I bsp/led -I bsp/delay
21 变量 SFILES 保存工程中所有的.s 汇编文件(包含绝对路径),变量 SRCDIRS 已经存放了工程中所有的.c 和.S 文件,所以我们只需要从里面挑出所有的.S 汇编文件即可,这里借助了函数 foreach 和函数 wildcard,最终 SFILES 如下:
SFILES := project/start.S
22 变量 CFILES 和变量 SFILES 一样,只是 CFILES 保存工程中所有的.c 文件(包含绝对路径),最终 CFILES 如下:
CFILES = project/main.c bsp/clk/bsp_clk.c bsp/led/bsp_led.c bsp/delay/bsp_delay.c
24~25 变量 SFILENDIR 和 CFILENDIR 包含所有的.S 汇编文件和.c 文件,相比变量 SFILES 和 CFILES, SFILENDIR 和 CFILNDIR 只是文件名,不包含文件的绝对路径。使用函数 notdir 将 SFILES 和 CFILES 中的路径去掉即可, SFILENDIR 和 CFILENDIR 如下:
SFILENDIR = start.S
CFILENDIR = main.c bsp_clk.c bsp_led.c bsp_delay.c
27~28 变量 SOBJS 和 COBJS 是.S 和.c 文件编译以后对应的.o 文件目录,默认所有的文件编译出来的.o 文件和源文件在同一个目录中,这里我们将所有的.o 文件都放到 obj 文件夹下, SOBJS 和 COBJS 内容如下:
SOBJS = obj/start.o
COBJS = obj/main.o obj/bsp_clk.o obj/bsp_led.o obj/bsp_delay.o
29 变量 OBJS 是变量 SOBJS 和 COBJS 的集合,如下:
OBJS = obj/start.o obj/main.o obj/bsp_clk.o obj/bsp_led.o obj/bsp_delay.o
编译完成以后所有的.o 文件就全部存放到了 obj 目录下。
31 VPATH 是指定搜索目录的,这里指定的搜素目录就是变量 SRCDIRS 所保存的目录,这样当编译的时候所需的.S 和.c 文件就会在 SRCDIRS 中指定的目录中查找。
33 指定了一个伪目标 clean

三、链接脚本

1 	SECTIONS{
2 	. = 0X87800000;
3 	.text :
4 	{
5 	obj/start.o
6 	*(.text)
7 	}
8 	.rodata ALIGN(4) : {*(.rodata*)}
9 	.data ALIGN(4) : { *(.data) }
10 	__bss_start = .;
11 	.bss ALIGN(4) : { *(.bss) *(COMMON) }
12 	__bss_end = .;
13 	}

注意第 5 行设置的 start.o 文件路径