Makefile文件解析
在我写教程之前,我先感谢一下libnds的开发人员以及维护人员。他们给我们提供了十分方便的开发库libnds,让我们能够更加快捷简单的开发NDS程序。下面我们进入正题。
注:以下绿为文件的原注释,紫是我后来添加的注释方便大家理解。
#---------------------------------------------------------------------------------
.SUFFIXES:
#---------------------------------------------------------------------------------
ifeq ($(strip $(DEVKITARM)),)
$(error "Please set DEVKITARM in your environment. export DEVKITARM=<path to>devkitARM")
endif
include $(DEVKITARM)/ds_rules
#---------------------------------------------------------------------------------
# TARGET 输出名称
# BUILD 生成文件夹名称,对象文件以及中间文件将会被放在这个文件夹中。
# SOURCES 包含源文件的目录列表
# INCLUDES 包含外部头文件的目录列表
# DATA 包含二进制数据的目录列表
# GRAPHICS 用grit处理文件的目录列表
# AUDIO 包含用mmutil来处理的文件的文件目录
# SOUNDBANK_NAME maxmod生成的soundbank的名称
#MUSIC 外部音频文件目录
#
# 所有的文件必须在与项目相关的能够到makefile文件的文件目录下。
#---------------------------------------------------------------------------------
TARGET := $(notdir $(CURDIR))
BUILD := build
SOURCES := source
INCLUDES := include
MUSIC := maxmod_data
#---------------------------------------------------------------------------------
# 以上部分相当于编程语言中的宏定义部分,通过:=给宏定义的变量名成进行赋值
# 在以下的代码中有使用到这些宏定义。
# 但是这些宏定义的名称以及赋值都是固定的,如果随意设置编译将不会成功。
#---------------------------------------------------------------------------------
#---------------------------------------------------------------------------------
#对于以上的目录相关,如果不适用则不再其中添加。
#例如本例中未使用DATA则不添加DATA相关项在其中。
#以上代码都可以手动修改单一定要符合以上原则
#---------------------------------------------------------------------------------
#---------------------------------------------------------------------------------
#以下是代码生成选项
#---------------------------------------------------------------------------------
ARCH := -mthumb -mthumb-interwork
CFLAGS := -g -Wall -O2\
-march=armv5te -mtune=arm946e-s -fomit-frame-pointer\
-
ffast-math \
$(ARCH)
CFLAGS += $(INCLUDE) -DARM9
CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions
ASFLAGS := -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.bin
export 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的规则。
#---------------------------------------------------------------------------------
#---------------------------------------------------------------------------------
# 这条规则是用.bin为拓展名的文件连接2进制数据。
#---------------------------------------------------------------------------------
%.bin.o : %.bin
#---------------------------------------------------------------------------------
@echo $(notdir $<)
@$(bin2o)
-include $(DEPSDIR)/*.d
#---------------------------------------------------------------------------------------
#---------------------------------------------------------------------------------------
#以上的文件转换规则都是程序编译时候必须的规则。
#以下的规则将是你所有到的资源的转换规则。
#需要使用什么资源就添加对应的规则,需要注意的是,某些文件的转换需要借助外部代码#来实现,这里我们就不在过多的阐述,以后再使用过程中我们再逐渐讲解。
#---------------------------------------------------------------------------------------
#---------------------------------------------------------------------------------
# 用音乐文件构建soundbank
#---------------------------------------------------------------------------------
soundbank.bin : $(AUDIOFILES)
#---------------------------------------------------------------------------------
@mmutil $^ -d -osoundbank.bin -hsoundbank.h
#---------------------------------------------------------------------------------
endif
#---------------------------------------------------------------------------------------
#---------------------------------------------------------------------------------
#以下,我们再来看看图片处理所使用的规则。
#可以看出使用的是grit程序进行转换。
#其中为了添加一些grit参数,需要在每个图片文件对应一个同名grit格式的文件。
#声明了这个图片转换所使用的参数。
#---------------------------------------------------------------------------------
#---------------------------------------------------------------------------------
# 这个规则是通过图像生成的装配资源,其使用了grit程序。
#---------------------------------------------------------------------------------
%.s %.h : %.png %.grit
#---------------------------------------------------------------------------------
安卓开发教程 pdfgrit $< -fts -o$*
今天的教程到此结束,祝大家编程愉快!
编者:唯夜

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。