Top > STM32F >Makefile

Makefile

 使っているMakefileを以下に示します。 このMakefileでは、CodeSourcery G++ Liteを使うことを想定しています。 以下、パラメータ一覧です。ちなみに、このMakefileでは同一ディレクトリのCファイル、 ヘッダファイルをすべてコンパイルしてしまいます。 ソースファイルの依存関係を考慮したコンパイルには、 make depend的なものが必要になります。

parameterinformation
TARGETターゲットファイル名を指定します。
OBJDIRビルドディレクトリを指定します。
DEVICE デバイス種別(STM32F10X_xx)を指定します。 指定したキーワードはコンパイル時に#defineされます。
TOOL_PATHコンパイラがあるディレクトリを指定します。
LDSCRIPTリンカスクリプトを指定します。

以下、Makefile本体です。

Makefile
#---------------------------------------
# STM32F10x Makefile
#---------------------------------------
# デバイスリスト(STMのヘッダ設定用)
#
#  STM32F10X_LD STM32F10X_LD_VL
#  STM32F10X_MD STM32F10X_MD_VL
#  STM32F10X_HD STM32F10X_XL STM32F10X_CL

TARGET = main
OBJDIR = build
DEVICE = STM32F10X_MD
TOOL_PATH = /usr/local/arm-2010q1/bin/
LDSCRIPT = stm32f10x_flash.ld

#---------------------------------------
# ソースファイルのリストアップ

A_SRC = $(shell ls *.S 2> /dev/null)
A_OBJ = $(A_SRC:%.S=$(OBJDIR)/%.o)

HEADERS = $(shell ls *.h 2> /dev/null)
C_SRC = $(shell ls *.c 2> /dev/null)
C_OBJ = $(C_SRC:%.c=$(OBJDIR)/%.o)
C_ASM = $(C_SRC:%.c=%.asm)
_TARGET = $(OBJDIR)/$(TARGET)

#---------------------------------------
# ツールの定義

CC      = $(TOOL_PATH)arm-none-eabi-gcc
AR      = $(TOOL_PATH)arm-none-eabi-ar
LD      = $(TOOL_PATH)arm-none-eabi-ld
OBJCPY  = $(TOOL_PATH)arm-none-eabi-objcopy
OBJDMP  = $(TOOL_PATH)arm-none-eabi-objdump
SIZE    = $(TOOL_PATH)arm-none-eabi-size
GCC_VER = $(shell $(CC) -dumpversion)

#---------------------------------------
# コンパイルオプションとリンカオプションの定義

CFLAGS = -D$(DEVICE)
CFLAGS += -mcpu=cortex-m3 -mtune=cortex-m3 -mthumb -Wall -Os

LDFLAGS = -nostartfiles -nodefaultlibs -static
LDFLAGS += $(CFLAGS) --gc-sections -lm -lc -lgcc -Xlinker

#---------------------------------------
# ターゲットの指定

all : build_dir mot hex lst $(C_ASM)

build_dir :
	mkdir -p $(OBJDIR)

mot : $(_TARGET).mot
hex : $(_TARGET).hex
lst : $(_TARGET).lst

#---------------------------------------
# モトローラS形式とインテルhex形式に変換

%.mot : %.elf
	$(OBJCPY) -O srec $< $@

%.hex : %.elf
	$(OBJCPY) -O ihex $< $@

#---------------------------------------
# オブジェクトファイルの依存関係

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

$(_TARGET).elf : $(A_OBJ) $(C_OBJ)
	$(CC) $(LDFLAGS) $(A_OBJ) $(C_OBJ) \
	-Xlinker --print-map >$(_TARGET).map -Xlinker --script $(LDSCRIPT) --output $@
	$(SIZE) -Ax $@

$(OBJDIR)/%.asm : %.c $(HEADERS)
	$(CC) $(CFLAGS) -S $< -o $@

%.lst : %.elf
	$(OBJDMP) -h -D -S -C -t $< > $@

#---------------------------------------
# プロジェクトファイルの掃除

clean:
	rm -f $(A_OBJ) $(C_OBJ) $(C_ASM) \
	$(_TARGET).map $(_TARGET).lst $(_TARGET).elf $(_TARGET).mot $(_TARGET).hex
	rmdir $(OBJDIR)