Makefile文件解析在我写教程之前,我先感谢一下libnds的开发人员以及维护人员。
他们给我们提供了十分方便的开发库libnds,让我们能够更加快捷简单的开发NDS程序。
下面我们进入正题。
注:以下绿色为文件的原注释,紫色是我后来添加的注释方便大家理解。
#---------------------------------------------------------------------------------.SUFFIXES:#---------------------------------------------------------------------------------ifeq ($(strip $(DEVKITARM)),)$(error "Please set DEVKITARM in your environment. export DEVKITARM=<path to>devkitARM")endifinclude $(DEVKITARM)/ds_rules#---------------------------------------------------------------------------------# TARGET 输出名称# BUILD 生成文件夹名称,对象文件以及中间文件将会被放在这个文件夹中。
# SOURCES 包含源文件的目录列表# INCLUDES 包含外部头文件的目录列表# DATA 包含二进制数据的目录列表# GRAPHICS 用grit处理文件的目录列表# AUDIO 包含用mmutil来处理的文件的文件目录# SOUNDBANK_NAME maxmod生成的soundbank的名称#MUSIC 外部音频文件目录## 所有的文件必须在与项目相关的能够找到makefile文件的文件目录下。
#---------------------------------------------------------------------------------TARGET := $(notdir $(CURDIR))BUILD := buildSOURCES := sourceINCLUDES := includeMUSIC := maxmod_data#---------------------------------------------------------------------------------# 以上部分相当于编程语言中的宏定义部分,通过:=给宏定义的变量名成进行赋值# 在以下的代码中有使用到这些宏定义。
# 但是这些宏定义的名称以及赋值都是固定的,如果随意设置编译将不会成功。
#---------------------------------------------------------------------------------#---------------------------------------------------------------------------------#对于以上的目录相关,如果不适用则不再其中添加。
#例如本例中未使用DATA则不添加DATA相关项在其中。
#以上代码都可以手动修改单一定要符合以上原则#---------------------------------------------------------------------------------#---------------------------------------------------------------------------------#以下是代码生成选项#---------------------------------------------------------------------------------ARCH := -mthumb -mthumb-interworkCFLAGS := -g -Wall -O2\-march=armv5te -mtune=arm946e-s -fomit-frame-pointer\-ffast-math \$(ARCH)CFLAGS += $(INCLUDE) -DARM9CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptionsASFLAGS := -g $(ARCH)LDFLAGS = -specs=ds_arm9.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map)#---------------------------------------------------------------------------------#通常不做修改#---------------------------------------------------------------------------------#---------------------------------------------------------------------------------# 这里添加我们希望连接到工程的外部库。
当我们需要使用外部库的时候,# 我们需要在这里添加外部库的名称。
#---------------------------------------------------------------------------------LIBS := -lmm9 -lnds9#---------------------------------------------------------------------------------# 包含库文件的目录列表, 这个必须是库的顶级文件夹名称#---------------------------------------------------------------------------------LIBDIRS := $(LIBNDS)#---------------------------------------------------------------------------------# 从这个点往后没有你真正需要修改的,除非你需要为不同文件拓展名的文件添加规则#---------------------------------------------------------------------------------ifneq ($(BUILDDIR), $(CURDIR))#---------------------------------------------------------------------------------export OUTPUT := $(CURDIR)/$(TARGET)export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \$(foreach dir,$(DATA),$(CURDIR)/$(dir)) \$(foreach dir,$(GRAPHICS),$(CURDIR)/$(dir))export DEPSDIR := $(CURDIR)/$(BUILD)CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp)))SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) soundbank.binexport AUDIOFILES := $(foreach dir,$(notdir $(wildcard $(MUSIC)/*.*)),$(CURDIR)/$(MUSIC)/$(dir))#---------------------------------------------------------------------------------# 使用CXX连接C++工程,CC为标准C#---------------------------------------------------------------------------------ifeq ($(strip $(CPPFILES)),)#---------------------------------------------------------------------------------export LD := $(CC)#---------------------------------------------------------------------------------else#---------------------------------------------------------------------------------export LD := $(CXX)#---------------------------------------------------------------------------------endif#---------------------------------------------------------------------------------#---------------------------------------------------------------------------------export OFILES := $(addsuffix .o,$(BINFILES)) \$(BMPFILES:.bmp=.o) \$(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o)export INCLUDE := $(foreach dir,$(INCLUDES),-iquote $(CURDIR)/$(dir)) \$(foreach dir,$(LIBDIRS),-I$(dir)/include) \-I$(CURDIR)/$(BUILD)export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib).PHONY: $(BUILD) clean#---------------------------------------------------------------------------------$(BUILD):@[ -d $@ ] || mkdir -p $@@make BUILDDIR=`cd $(BUILD) && pwd` --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile#---------------------------------------------------------------------------------clean:@echo clean ...@rm -fr $(BUILD) $(TARGET).elf $(TARGET).nds#---------------------------------------------------------------------------------else#---------------------------------------------------------------------------------# 最终生成目标#---------------------------------------------------------------------------------$(OUTPUT).nds : $(OUTPUT).elf$(OUTPUT).elf : $(OFILES)#---------------------------------------------------------------------------------# 为了使用与不同拓展名的数据,应该为每一个数据目录复制与修改bin2o的规则。