############################################################################# ############################################################################# # # Makefile for gzmcpc4nds # # Copyright 2008-2009 Douglas McClendon -- dmc AT viros DOT org # ############################################################################# ############################################################################# # export all make variables by default # (until I discover a con at least) export # these are visible during download play (and possibly other bootloaders) # note: convert -colors 8 -size 104x16 mybanner.bmp gzmcpc_banner.bmp #BANNER_IMAGE = gzmcpc_banner_dmcsig.bmp BANNER_IMAGE = resources/bitmaps/gzmcpc_banner.bmp # note: convert -colors 8 -size 32x32 mylogo.jpg gzmcpc_logo.bmp LOGO_IMAGE = resources/bitmaps/gzmcpc_logo.bmp LOGO_STRING = "Guitar-ZyX MCP v.2k9.dev" # define nds client sources # (could be a glob, but nah) NDS_ARM9_SOURCES = \ cloader/arm9_loader.c \ configfiles.c \ debug.c \ libdmc.c \ graphics.c \ input.c \ libmcp.c \ metrognome.c \ modes.c \ mode__intro__main.c \ mode__intro__credits.c \ mode__get_update.c \ mode__main_menu.c \ mode__ssid__input.c \ mode__tpw__jam.c \ network.c \ rak.c \ sound.c \ time.c \ main.c NDS_ARM7_SOURCES = \ cloader/arm7_loader.c \ arm7_main.c # where sound effects are found, all files here get linked # into the program. # TODO: load these at runtime from flash, with simplest/smallest # of defaults, to support download play. SOUND_DIR := resources/sounds # where splash images are found, all *.splash.*jpg files get # linked into the program. # TODO: load these at runtime from flash, with simplest/smallest # of defaults, to support download play. BITMAPS_DIR := resources/bitmaps # # set a sane default for ZYXDEVSUITE, and handle errors well # ifeq ($(strip $(ZYXDEVSUITE)),) ZYXDEVSUITE := /usr/lib/ZyXdevSuite/ZyXdev_arm ifneq ($(wildcard $(ZYXDEVSUITE)),$(ZYXDEVSUITE)) $(error "The default ZYXDEVSUITE directory $(ZYXDEVSUITE) does not exist, probably you want to override this by setting the ZYXDEVSUITE variable in your environment to the location where you installed it.") endif endif ifneq ($(wildcard $(ZYXDEVSUITE)),$(ZYXDEVSUITE)) $(error "ZYXDEVSUITE directory $(ZYXDEVSUITE) does not exist") endif ZYXDEVSUITEARM := $(ZYXDEVSUITE) # add zyxdevsuitearm to path PATH := $(ZYXDEVSUITEARM)/bin:$(PATH) include $(ZYXDEVSUITEARM)/ds_rules # all files in SOUND_DIR are audio files AUDIO_FILES := \ $(foreach file, \ $(notdir $(wildcard $(SOUND_DIR)/*.*)), \ $(CURDIR)/$(SOUND_DIR)/$(file)) # all *.splash.*jpg files in BITMAPS_DIR are splash image files SPLASH_FILES := \ $(foreach file, \ $(notdir $(wildcard $(BITMAPS_DIR)/*.splash.*jpg)), \ $(CURDIR)/$(BITMAPS_DIR)/$(file)) PNG_IMAGE_FILES := \ $(foreach file, \ $(notdir $(wildcard $(BITMAPS_DIR)/*.png)), \ $(CURDIR)/$(BITMAPS_DIR)/$(file)) BMP_IMAGE_FILES := \ $(foreach file, \ $(notdir $(wildcard $(BITMAPS_DIR)/*font*.bmp)), \ $(CURDIR)/$(BITMAPS_DIR)/$(file)) # TODO: obsolete with wfbl SERVE_NIFI := zyx-serve-nifi # define c compiler, etc... NDS_ARM9_CC = arm-eabi-gcc NDS_ARM9_CXX = arm-eabi-gcc NDS_ARM9_OBJCOPY = arm-eabi-objcopy NDS_ARM7_CC = arm-eabi-gcc NDS_ARM7_CXX = arm-eabi-gcc NDS_ARM7_OBJCOPY = arm-eabi-objcopy # common includes and libdirs INCLUDES := # todo: figure out why this instead of "../load_bin.h" in # /cloader/arm9_loader.c causes problems #INCLUDES += $(CURDIR) LIBDIRS := # initialize common_cflags COMMON_CFLAGS := COMMON_CFLAGS += -Wall ifneq ($(strip $(FMODE)),) COMMON_CFLAGS += -DFMODE=$(FMODE) endif # use this to enable compilation of the 'pro' version #COMMON_CFLAGS += -DIM_POOR_OR_LICENSED_OR_NOT COMMON_CFLAGS += -DIM_POOR_OR_LICENSED_OR_NOT # add common cflags COMMON_CFLAGS += -O2 # perhaps some way exists to use gdb, maybe with desmume #COMMON_CFLAGS += -g # TODO: educational comments for all these # nds arm9 flags NDS_ARM9_CFLAGS := $(COMMON_CFLAGS) NDS_ARM9_CFLAGS += -mcpu=arm9tdmi NDS_ARM9_CFLAGS += -mtune=arm9tdmi NDS_ARM9_CFLAGS += -DARM9 NDS_ARM9_CFLAGS += -fomit-frame-pointer NDS_ARM9_CFLAGS += -ffast-math NDS_ARM9_CFLAGS += -mthumb NDS_ARM9_CFLAGS += -mthumb-interwork # nds arm7 flags NDS_ARM7_CFLAGS := $(COMMON_CFLAGS) NDS_ARM7_CFLAGS += -mcpu=arm7tdmi NDS_ARM7_CFLAGS += -mtune=arm7tdmi NDS_ARM7_CFLAGS += -DARM7 NDS_ARM7_CFLAGS += -fomit-frame-pointer NDS_ARM7_CFLAGS += -ffast-math NDS_ARM7_CFLAGS += -mthumb NDS_ARM7_CFLAGS += -mthumb-interwork NDS_ARM9_INCLUDES := $(INCLUDES) NDS_ARM7_INCLUDES := $(INCLUDES) NDS_ARM9_LIBDIRS := $(LIBDIRS) NDS_ARM7_LIBDIRS := $(LIBDIRS) NDS_ARM9_INCLUDES += $(ZYXDEVSUITE)/include NDS_ARM7_INCLUDES += $(ZYXDEVSUITE)/include NDS_ARM9_LIBDIRS += $(ZYXDEVSUITE)/lib NDS_ARM7_LIBDIRS += $(ZYXDEVSUITE)/lib NDS_ARM9_INCLUDES += $(ZYXDEVSUITE)/libnds/include NDS_ARM7_INCLUDES += $(ZYXDEVSUITE)/libnds/include NDS_ARM9_LIBDIRS += $(ZYXDEVSUITE)/libnds/lib NDS_ARM7_LIBDIRS += $(ZYXDEVSUITE)/libnds/lib NDS_ARM9_INCLUDES += $(ZYXDEVSUITE)/arm-eabi/include NDS_ARM7_INCLUDES += $(ZYXDEVSUITE)/arm-eabi/include NDS_ARM9_INCLUDES += $(BITMAPS_DIR) #NDS_ARM9_INCLUDES += /usr/include #NDS_ARM7_INCLUDES += /usr/include #NDS_ARM9_LIBDIRS += /usr/lib #NDS_ARM7_LIBDIRS += /usr/lib NDS_ARM9_LIBS := NDS_ARM7_LIBS := # maxmod sound library NDS_ARM9_LIBS += mm9 NDS_ARM7_LIBS += mm7 # flash fat filesystem access library NDS_ARM9_LIBS += fat # wifi library NDS_ARM9_LIBS += dswifi9 NDS_ARM7_LIBS += dswifi7 # main nds library NDS_ARM9_LIBS += nds9 NDS_ARM7_LIBS += nds7 NDS_ARM9_DEPS = $(patsubst %.c,%.d,$(NDS_ARM9_SOURCES)) NDS_ARM7_DEPS = $(patsubst %.c,%.d,$(NDS_ARM7_SOURCES)) NDS_ARM9_OBJECTS = $(patsubst %.c,%.o,$(NDS_ARM9_SOURCES)) # XXX first pass is with .s, then try generating .bin's and loading from fat NDS_ARM9_OBJECTS += $(patsubst %.jpg,%.o,$(SPLASH_FILES)) NDS_ARM9_OBJECTS += $(patsubst %.bmp,%.o,$(BMP_IMAGE_FILES)) NDS_ARM9_OBJECTS += $(patsubst %.png,%.o,$(PNG_IMAGE_FILES)) NDS_ARM9_OBJECTS += sounds.bin.o NDS_ARM9_OBJECTS += load.bin.o NDS_ARM7_OBJECTS = $(patsubst %.c,%.o,$(NDS_ARM7_SOURCES)) NDS_ARM9_INCFLAGS := $(foreach dir,$(NDS_ARM9_INCLUDES),-I$(dir)) NDS_ARM7_INCFLAGS := $(foreach dir,$(NDS_ARM7_INCLUDES),-I$(dir)) NDS_ARM9_LDFLAGS := $(foreach dir,$(NDS_ARM9_LIBDIRS),-L$(dir)) NDS_ARM7_LDFLAGS := $(foreach dir,$(NDS_ARM7_LIBDIRS),-L$(dir)) NDS_ARM9_LDFLAGS += $(foreach lib,$(NDS_ARM9_LIBS),-l$(lib)) NDS_ARM7_LDFLAGS += $(foreach lib,$(NDS_ARM7_LIBS),-l$(lib)) NDS_ARM9_CFLAGS += $(NDS_ARM9_INCFLAGS) NDS_ARM7_CFLAGS += $(NDS_ARM7_INCFLAGS) # arm9 gets to use the implicit rules, while arm7 uses static rules CC = $(NDS_ARM9_CC) OBJCOPY = $(NDS_ARM9_OBJCOPY) CFLAGS = $(NDS_ARM9_CFLAGS) ############################################################################# ############# # Variables # ############# ALL_TARGETS = \ gzmcp-client.nds \ nroot ############################################################################# ############################################################################# # Build Rules ############################################################################# # Build Rules :: pattern rules # the generic rule is %.o: %.c $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ # note: based on nds examples, this must(?) be near default as well, though # not mentioned as such in the gnu make manual where it was copied # from. # note: using -MM instead of -M to ignore system headers # note: using -MG because we generate some header files (e.g. sounds.h) %.d: %.c set -e; rm -f $@; \ $(CC) -MM -MG $(CPPFLAGS) $< > $@.$$$$; \ sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \ rm -f $@.$$$$ # image resources via grit %.s %.h: %.bmp %.grit grit $< -fts -o$*.s %.s %.h: %.jpg %.grit grit $< -fts -o$*.s %.s %.h: %.png %.grit grit $< -fts -o$*.s %.o: %.s $(CC) -x assembler-with-cpp -c -o $*.o $< ############################################################################# # Build Rules :: special first is default default: make all make nroot make tidy all: $(ALL_TARGETS) ############################################################################# # Build Rules :: ARM7 $(NDS_ARM7_OBJECTS): %.o: %.c $(NDS_ARM7_CC) -c $(NDS_ARM7_CFLAGS) $(CPPFLAGS) $< -o $@ ############################################################################# # Build Rules :: ARM9/rest cloader/arm9_loader.o: load_bin.h # desmume testing dmtest: gzmcp-client.nds desmume gzmcp-client.nds # for development serving up via wmb dev: make all make tidy make serve serve: gzmcp-client.nds sudo $(SERVE_NIFI) gzmcp-client_r4.nds nroot: gzmcp-client.nds mkdir -p nroot/gzmcp mkdir -p nroot/boot cp gzmcp-client.nds nroot/gzmcp/ cp resources/text/example.defaults nroot/gzmcp/defaults cp resources/text/example.midispec nroot/gzmcp/midispec cp resources/text/example.presets nroot/gzmcp/presets cp resources/text/example.zds-boot.cfg nroot/boot/zds-boot.cfg cp resources/text/example.zds-boot.cfg nroot/boot/g_zds-boot.cfg # generate maxmod soundbank sources that can be referenced by our sources # -d is to make it suitable for an nds project sounds.bin sounds.h: $(AUDIO_FILES) mmutil $^ -d -osounds.bin -hsounds.h sounds.bin.o sounds_bin.h: sounds.bin $(bin2o) load.bin.o load_bin.h: load.bin # bin2o needs much improvement $(bin2o) # todo: specify deps as a patsubst on all files under cl/bl load.bin: make -C cloader/bootloader .PHONY: tidy tidy: @echo removing transient files rm -f *~ rm -f *.o rm -f *.d rm -f *.elf rm -f nds-client.arm[79] rm -f .builderr rm -f .map rm -f load_bin.h rm -f load.bin rm -f sounds.h rm -f sounds_bin.h rm -f sounds.bin rm -f cloader/*~ rm -rf cloader/bootloader/build rm -f cloader/bootloader/*~ rm -f cloader/bootloader/source/*~ rm -f cloader/*.o rm -f cloader/*.d .PHONY: clean clean: tidy make -C cloader/bootloader clean rm -rf nroot rm -rf nroot rm -f $(ALL_TARGETS) rm -f $(NDS_ARM9_DEPS) rm -f $(NDS_ARM7_DEPS) rm -f $(NDS_ARM9_OBJECTS) rm -f $(NDS_ARM7_OBJECTS) rm -f $(BITMAPS_DIR)/*.[sh] nds-client.arm7: $(NDS_ARM7_OBJECTS) $(NDS_ARM7_CC) \ -specs=ds_arm7.specs \ $(NDS_ARM7_CFLAGS) \ $(CPPFLAGS) \ -mno-fpu \ -Wl,-Map,.map \ $^ \ $(NDS_ARM7_LDFLAGS) \ -o $@.elf $(NDS_ARM7_OBJCOPY) \ -O binary \ $@.elf \ $@ # TODO: split this into at least two targets nds-client.arm9: $(NDS_ARM9_OBJECTS) $(CC) \ -specs=ds_arm9.specs \ $(CFLAGS) \ $(CPPFLAGS) \ -mno-fpu \ -Wl,-Map,.map \ $^ \ $(NDS_ARM9_LDFLAGS) \ -o $@.elf $(OBJCOPY) \ -O binary \ $@.elf \ $@ gzmcp-client.nds: nds-client.arm9 nds-client.arm7 @echo BUILD: running ndstool to combine arm7 and arm9 executables... ndstool \ -c $@ \ -9 nds-client.arm9 \ -7 nds-client.arm7 \ -o $(BANNER_IMAGE) \ -b $(LOGO_IMAGE) \ $(LOGO_STRING) \ >> ./.builderr 2>&1 @echo @echo @echo BUILD: shiny new nds homebrew ready to rock-n-roll!!! @echo @echo # include the automatically generated dependencies # note: the - means it is ok if some of the dependency files do not exist -include $(NDS_ARM9_DEPS) -include $(NDS_ARM7_DEPS) # # END MAKEFILE #############################################################################