一个需要修改的Makefile

内核编译和嵌入式产品的设计与开发
回复
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

一个需要修改的Makefile

#1

帖子 eexpress » 2014-04-16 16:09

代码: 全选

# Project Name
PROJECT = blink
# Source files
SOURCES = common/system_mb9xfxxx.c startup.c main.c
#SOURCES = common/system_mb9xfxxx.c startup.c main.c driver/adc/adc12_fm3.c
# Linker script
LINKER_SCRIPT = mb9afa32n.dld

#########################################################################

OBJDIR = obj
OBJECTS = $(patsubst %.c,$(OBJDIR)/%.o,$(SOURCES))

#########################################################################

OPT = -Os -g
DEBUG =
INCLUDES = -Icore/ -Icommon/ -Idriver/ -Ilib/

#########################################################################

# Compiler Options
CFLAGS = -fno-common -mcpu=cortex-m3 -mthumb
CFLAGS += $(OPT) $(DEBUG) $(INCLUDES)
CFLAGS += -Wall -Wextra
CFLAGS += -Wcast-align -Wcast-qual -Wimplicit -Wpointer-arith -Wswitch -Wredundant-decls -Wreturn-type -Wshadow -Wunused
# Linker options
LDFLAGS = -mcpu=cortex-m3 -mthumb $(OPT) -nostartfiles -Wl,-Map=$(PROJECT).map -T$(LINKER_SCRIPT) -nostdlib
# Assembler options
ASFLAGS = -ahls -mcpu=cortex-m3 -mthumb

# Compiler/Assembler/Linker Paths
CROSS = arm-none-eabi-
CC = $(CROSS)gcc
AS = $(CROSS)as
LD = $(CROSS)ld
OBJDUMP = $(CROSS)objdump
OBJCOPY = $(CROSS)objcopy
SIZE = $(CROSS)size
REMOVE = rm -f

#########################################################################

all: $(PROJECT).hex $(PROJECT).bin

$(PROJECT).bin: $(PROJECT).elf
	$(OBJCOPY) -R .stack -R .bss -O binary -S $(PROJECT).elf $(PROJECT).bin

$(PROJECT).hex: $(PROJECT).elf
	$(OBJCOPY) -R .stack -R .bss -O ihex $(PROJECT).elf $(PROJECT).hex

$(PROJECT).elf: $(OBJECTS) $(LINKER_SCRIPT)
	$(CC) $(LDFLAGS) $(OBJECTS) -o $(PROJECT).elf

stats: $(PROJECT).elf
	$(OBJDUMP) -th $(PROJECT).elf
	$(SIZE) $(PROJECT).elf

clean:
	$(REMOVE) -r $(OBJDIR)
	$(REMOVE) $(PROJECT).elf
	$(REMOVE) $(PROJECT).hex
	$(REMOVE) $(PROJECT).bin
	$(REMOVE) $(PROJECT).map

#########################################################################

$(OBJECTS): | $(OBJDIR)

$(OBJDIR):
	mkdir $(OBJDIR)
#    mkdir $(OBJDIR)/common
#    mkdir $(OBJDIR)/core
#    mkdir $(OBJDIR)/driver
#    mkdir $(OBJDIR)/driver/adc

$(OBJDIR)/%.o : %.c
	$(CC) $(CFLAGS) -c $< -o $@
熟悉的,应该看出来了吧。不想mkdir一堆。想把所有的o都直接放到obj/下面。需要修改这句。就是o的把路径都去掉。

代码: 全选

OBJECTS = $(patsubst %.c,$(OBJDIR)/%.o,$(SOURCES))
因为对应的c的目录结构太复杂。

代码: 全选

SOURCES = common/system_mb9xfxxx.c startup.c main.c driver/adc/adc12_fm3.c
不会makefile的函数。
● 鸣学
头像
astolia
论坛版主
帖子: 6454
注册时间: 2008-09-18 13:11

Re: 一个需要修改的Makefile

#2

帖子 astolia » 2014-04-17 0:35

http://sunsite.ualberta.ca/Documentatio ... ake_8.html

单纯改OBJECTS是这样

代码: 全选

OBJECTS = $(addprefix $(OBJDIR)/,$(notdir $(patsubst %.c,%.o,$(SOURCES))))
但如果这么改后面的 $(OBJDIR)/%.o : %.c 路径会出问题,不如改下编译时的输出路径

代码: 全选

$(OBJDIR)/%.o : %.c
	$(CC) $(CFLAGS) -c $< -o $(OBJDIR)/$(notdir $@)

代码: 全选

$(PROJECT).elf: $(OBJECTS) $(LINKER_SCRIPT)
	$(CC) $(LDFLAGS) $(OBJDIR)/*.o -o $(PROJECT).elf
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 一个需要修改的Makefile

#3

帖子 eexpress » 2014-04-17 9:09

是的,如果改 OBJECTS 的集合,会导致其他编译对应不上文件。
直接改$(OBJDIR)/*.o 似乎有点ugly,但目的达到。

多谢。
● 鸣学
回复