1#---------------------------------------------------------------------------------
2.SUFFIXES:
3#---------------------------------------------------------------------------------
4ifeq ($(strip $(DEVKITARM)),)
5$(error "Please set DEVKITARM in your environment. export DEVKITARM=<path to>devkitARM")
6endif
7
8include $(DEVKITARM)/ds_rules
9
10#---------------------------------------------------------------------------------
11# BUILD is the directory where object files & intermediate files will be placed
12# SOURCES is a list of directories containing source code
13# INCLUDES is a list of directories containing extra header files
14# DATA is a list of directories containing binary files
15# all directories are relative to this makefile
16#---------------------------------------------------------------------------------
17BUILD		:=	build
18SOURCES		:=	source
19INCLUDES	:=	include
20DATA		:=
21
22
23#---------------------------------------------------------------------------------
24# options for code generation
25#---------------------------------------------------------------------------------
26ARCH	:=	-mthumb -mthumb-interwork
27
28CFLAGS	:=	-g -Wall -O2\
29 			-march=armv5te -mtune=arm946e-s -fomit-frame-pointer\
30			-ffast-math \
31			$(ARCH)
32
33CFLAGS	+=	$(INCLUDE) -DARM9
34CXXFLAGS	:=	$(CFLAGS) -fno-rtti -fno-exceptions
35
36ASFLAGS	:=	-g $(ARCH) -march=armv5te -mtune=arm946e-s
37
38LDFLAGS	=	-specs=ds_arm9.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map)
39
40#---------------------------------------------------------------------------------
41# any extra libraries we wish to link with the project
42#---------------------------------------------------------------------------------
43LIBS	:=	-lnds9
44
45#---------------------------------------------------------------------------------
46# list of directories containing libraries, this must be the top level containing
47# include and lib
48#---------------------------------------------------------------------------------
49LIBDIRS	:=	$(LIBNDS)
50
51#---------------------------------------------------------------------------------
52# no real need to edit anything past this point unless you need to add additional
53# rules for different file extensions
54#---------------------------------------------------------------------------------
55ifneq ($(BUILD),$(notdir $(CURDIR)))
56#---------------------------------------------------------------------------------
57
58export ARM9ELF	:=	$(CURDIR)/$(TARGET).elf
59export DEPSDIR := $(CURDIR)/$(BUILD)
60
61export VPATH	:=	$(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \
62					$(foreach dir,$(DATA),$(CURDIR)/$(dir))
63
64CFILES		:=	$(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
65CPPFILES	:=	$(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp)))
66SFILES		:=	$(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))
67BINFILES	:=	$(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*)))
68
69#---------------------------------------------------------------------------------
70# use CXX for linking C++ projects, CC for standard C
71#---------------------------------------------------------------------------------
72ifeq ($(strip $(CPPFILES)),)
73#---------------------------------------------------------------------------------
74	export LD	:=	$(CC)
75#---------------------------------------------------------------------------------
76else
77#---------------------------------------------------------------------------------
78	export LD	:=	$(CXX)
79#---------------------------------------------------------------------------------
80endif
81#---------------------------------------------------------------------------------
82
83export OFILES	:=	$(addsuffix .o,$(BINFILES)) \
84					$(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o)
85
86export INCLUDE	:=	$(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
87			$(foreach dir,$(LIBDIRS),-I$(dir)/include) \
88			-I$(CURDIR)/$(BUILD)
89
90export LIBPATHS	:=	$(foreach dir,$(LIBDIRS),-L$(dir)/lib)
91
92.PHONY: $(BUILD) clean
93
94#---------------------------------------------------------------------------------
95$(BUILD):
96	@[ -d $@ ] || mkdir -p $@
97	@$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile
98
99#---------------------------------------------------------------------------------
100clean:
101	@echo clean ...
102	@rm -fr $(BUILD) *.elf *.nds* *.bin
103
104
105#---------------------------------------------------------------------------------
106else
107
108#---------------------------------------------------------------------------------
109# main targets
110#---------------------------------------------------------------------------------
111$(ARM9ELF)	:	$(OFILES)
112	@echo linking $(notdir $@)
113	@$(LD)  $(LDFLAGS) $(OFILES) $(LIBPATHS) $(LIBS) -o $@
114
115#---------------------------------------------------------------------------------
116# you need a rule like this for each extension you use as binary data
117#---------------------------------------------------------------------------------
118%.bin.o	:	%.bin
119#---------------------------------------------------------------------------------
120	@echo $(notdir $<)
121	@$(bin2o)
122
123-include $(DEPSDIR)/*.d
124
125#---------------------------------------------------------------------------------------
126endif
127#---------------------------------------------------------------------------------------
128