初级makefile

初级makefile
led.bin : led.s
	arm-linux-gnueabihf-gcc  -g  -c  led.s -o led.o
	arm-linux-gnueabihf-ld   -Ttest	0x87800000 led.o -o led.elf
	arm-linux-gnueabihf-objcopy -o binary -S -g led.elf led.bin
	arm-linux-gnueabihf-objdump	-D led.elf > led.dis
clean:
	rm -rf *.o led.bin led.elf led.dis
中级makefile
objs:=start.o main.o #定义变量objs,objs包含着要生成led.bin所需要的材料:start.o和main.o,注意先后顺序,start.o是最先执行的文件,要放在前面。 
ledc.bin:$(objs) # 默认目标文件,目的是生成最终的可执行文件led.bin,led.bin依赖start.o和main.o。如果当前工程没有start.o和main.o的时候就会找到相应的规则去生成start.o和main.o.
	arm-linux-gnueabihf-ld  -Ttest	0x87800000 -o led.elf $^ # $^:所有依赖文件的集合,此处就是objs这个变量的值:start.o和main.o。
	arm-linux-gnueabihf-objcopy -O binary -S led.elf $@ # $@:目标集合,此处就是ledc.bin; 
	arm-linux-gnueabihf-objdump	-D -m led.elf > led.dis

# 以下是针对不同的文件类型将其编译成对应的.o文件,其实就是汇编.s(.S)和.c文件。
%.o:%.s
	arm-linux-gnueabihf-gcc  -Wall -nostdlib -c -o $@ $< # $@:目标集合,此处就是.o; $<:依赖目标集合的第一个文件,此处就是.s

%.o:%.S
	arm-linux-gnueabihf-gcc  -Wall -nostdlib -c -o  $@ $<
%.o:%.c
	arm-linux-gnueabihf-gcc  -Wall -nostdlib -c -o  $@ $<
clean:
	rm -rf *.o led.bin led.elf led.dis
进阶Makefile

使用变量。

CROSS_COMPILE ?= arm-linux-gnueabihf-
NAME		  ?= ledc

CC			  := $(CROSS_COMPILE)gcc
LD			  := $(CROSS_COMPILE)ld
OBJCOPY		  := $(CROSS_COMPILE)objcopy
OBJDUMP		  := $(CROSS_COMPILE)objdump

OBJS		  := start.o main.o

$(NAME).bin:$(OBJS)
	$(LD) -Timx6ul.lds -o $(NAME).elf $^
	$(OBJCOPY) -O binary -S $(NAME).elf $@
	$(OBJDUMP) -D -m arm $(NAME).elf > $(NAME).dis

%.o:%.s
	$(CC)  -Wall -nostdlib -c -O2 -o $@ $< # $@:目标集合,此处就是.o; $<:依赖目标集合的第一个文件,此处就是.s

%.o:%.S
	$(CC)  -Wall -nostdlib -c -O2 -o  $@ $<
%.o:%.c
	$(CC)  -Wall -nostdlib -c -O2 -o  $@ $<
clean:
	rm -rf *.o $(NAME).bin $(NAME).elf $(NAME).dis
高级Makefile(通用)
CROSS_COMPILE ?= arm-linux-gnueabihf-
TARGET		  ?= bsp  # 目标名字,不同的例程肯定名字不一样

CC			  := $(CROSS_COMPILE)gcc
LD			  := $(CROSS_COMPILE)ld
OBJCOPY		  := $(CROSS_COMPILE)objcopy
OBJDUMP		  := $(CROSS_COMPILE)objdump

INCDIRS       := imx6ul \
				 bsp/clk \
				 bsp/led \
				 bsp/delay \  # 变量INCDIRS包含整个工程的所有.h头文件目录。符号“\”表示本行和下一行属于同一行,一般一行写不下的时候就用符号“\”来换行。

SRCDIRS       := project \
				 bsp/clk \
				 bsp/led \
				 bsp/delay \# SRCDIRS包含整个工程的所有.c和.S头件目录。

INCLUDE		  := $(patsubst %, -I %, $(INCDIRS)) #通过函数patsubst给变量INCDIRS添加一个“-I”,加“-I”的目的是因为Makefile语法要求指明头文件目录的时候需要加上“-I”。
SFILES 		  := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))# 借助函数foreach和函数wildcard,从变量SRCDIRS中挑出所有.S汇编文件。
CFILES		  := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))# 借助函数foreach和函数wildcard,从变量SRCDIRS中挑出所有.S汇编文件。

SFILENDIR     :=$(notdir $(SFILES)) # 包含所有的.S汇编文件,文件名,不包含文件的绝对路径,使用函数notdir将路径去掉
CFILENDIR	  :=$(notdir $(CFILES))# 包含所有的.c汇编文件,文件名,不包含文件的绝对路径,使用函数notdir将路径去掉

SOBJS         :=$(patsubst %, obj/%, $(SFILENDIR:.S=.o)) # .S文件编译以后对应的.o文件目录,默认所有的文件编译出来的.o文件和源文件在同一个目录中,此处将其放在obj文件夹中
COBJS		  :=$(patsubst %, obj/%, $(CFILENDIR:.c=.o)) # .c文件编译以后对应的.o文件目录,默认所有的文件编译出来的.o文件和源文件在同一个目录中,此处将其放在obj文件夹中
OBJS		  :=$(SOBJS) $(COBJS) # 变量OBJS是变量SOBJS和COBJS的集合。编译完成以后所有的.o文件就全部存放到了obj目录下

VPATH		  :=$(SRCDIRS) # 指定搜索目录的,这里指定的搜索目录就是变量SRCDIRS所保存的目录,这样当编译的时候所需要的.S和.c文件就会在SRCDIRS中指定的目录中查找。

.PHONY: clean #指定一个伪目标clean

$(TARGET).bin : $(OBJS)
	$(LD) -Timx6ul.lds -o $(TARGET).elf $^
	$(OBJCOPY) -O binary -S $(NAME).elf $@
	$(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis

$(SOBJS) : obj/%.o : %.S
	$(CC)  -Wall -nostdlib -c -O2 -o  $@ $<

$(COBJS) : obj/%.o : %.c
	$(CC)  -Wall -nostdlib -c -O2 -o  $@ $<

clean:
	rm -rf $(TARGET).elf $(TARGRT).dis $(TARGRT).bin $(COBJS) $(SOBJS)

Makefile文件内容重点工作是找到要编译哪些文件?编译的.o文件放到哪里?

使用到的编译命令和前面实验使用的一样,其实Makefile的重点工作就是解决“从哪里来到哪里去的”问题,也就是找到要编译的源文件、编译结果存放到哪里?真正的编译命令很简洁。

链接脚本
SECTIONS{
	. = 0x87800000;
	.text:
    {
    	obj/start.o
        *(.text)
    }
    .rodata ALIGN(4) : {*(.rodata*)}
    .data ALIGN(4)	 : {*(.data)}
    __bass_start = .;
    .bass ALIGN(4)   : {*(.bss) *(COMMON)}
    __bass_end = .;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值