5d236b2bfd
It's now easier to force rebuild of files depending on the svn revision version.c/version.h are generated once with new tools/genversion.sh Changes in the VCS are still not auto detected, so you'll have to remove builddir/version.* if you want to change the string in your binaries APPSVERSION is now called RBVERSION and is defined in the generated header instead of being defined by the Makefiles appsversion is now called rbversion (the plugin api number didn't change since old modules are still binary compatible) Change some bootloaders to use knwon-at-buildtime RBVERSION instead of "%s" + rbversion You'll need to run make clean to regenerate dependencies after the removal of apps/version.h To build binaries with a different version string, hand-edit tools/version.sh or tools/genversion.sh (which calls the former) git-svn-id: svn://svn.rockbox.org/rockbox/trunk@26320 a1c6a512-1295-4272-9138-f99709370657
352 lines
12 KiB
Makefile
352 lines
12 KiB
Makefile
# __________ __ ___.
|
|
# Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
# Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
# Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
# Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
# \/ \/ \/ \/ \/
|
|
# $Id$
|
|
#
|
|
|
|
include $(TOOLSDIR)/functions.make
|
|
|
|
DEFINES = -DROCKBOX -DMEMORYSIZE=$(MEMORYSIZE) -DMEM=$(MEMORYSIZE) $(TARGET) \
|
|
-DTARGET_ID=$(TARGET_ID) -DTARGET_NAME=\"$(MODELNAME)\" $(BUILDDATE) \
|
|
$(EXTRA_DEFINES) # <-- -DSIMULATOR or not
|
|
INCLUDES = -I$(BUILDDIR) -I$(BUILDDIR)/lang $(TARGET_INC)
|
|
|
|
CFLAGS = $(INCLUDES) $(DEFINES) $(GCCOPTS)
|
|
PPCFLAGS = $(filter-out -g -Dmain=SDL_main,$(CFLAGS)) # cygwin sdl-config fix
|
|
|
|
TOOLS = $(TOOLSDIR)/rdf2binary $(TOOLSDIR)/convbdf \
|
|
$(TOOLSDIR)/codepages $(TOOLSDIR)/scramble $(TOOLSDIR)/bmp2rb \
|
|
$(TOOLSDIR)/uclpack $(TOOLSDIR)/mkboot $(TOOLSDIR)/iaudio_bl_flash.c \
|
|
$(TOOLSDIR)/iaudio_bl_flash.h
|
|
|
|
|
|
ifeq (,$(PREFIX))
|
|
ifdef SIMVER
|
|
# for sims, set simdisk/ as default
|
|
PREFIX = simdisk
|
|
INSTALL = --install="$(PREFIX)"
|
|
else
|
|
# /dev/null as magic to tell it wasn't set, error out later in buildzip.pl
|
|
INSTALL = --install=/dev/null
|
|
endif
|
|
else
|
|
INSTALL = --install="$(PREFIX)"
|
|
endif
|
|
|
|
RBINFO = $(BUILDDIR)/rockbox-info.txt
|
|
|
|
# list suffixes to be understood by $*
|
|
.SUFFIXES: .rock .codec .map .elf .c .S .o .bmp .a
|
|
|
|
.PHONY: all clean tags zip tools manual bin build info langs
|
|
|
|
ifeq (,$(filter clean veryclean reconf tags voice voicetools manual manual-pdf manual-html manual-zhtml manual-txt manual-ztxt manual-zip help fontzip ,$(MAKECMDGOALS)))
|
|
# none of the above
|
|
DEPFILE = $(BUILDDIR)/make.dep
|
|
|
|
endif
|
|
|
|
all: $(DEPFILE) build
|
|
|
|
# Subdir makefiles. their primary purpose is to populate SRC, OTHER_SRC &
|
|
# ASMDEFS_SRC but they also define special dependencies and compile rules
|
|
include $(TOOLSDIR)/tools.make
|
|
|
|
ifeq (,$(findstring checkwps,$(APPSDIR)))
|
|
ifeq (,$(findstring database,$(APPSDIR)))
|
|
include $(FIRMDIR)/firmware.make
|
|
include $(ROOTDIR)/apps/bitmaps/bitmaps.make
|
|
endif
|
|
endif
|
|
|
|
ifneq (,$(findstring bootloader,$(APPSDIR)))
|
|
include $(APPSDIR)/bootloader.make
|
|
else ifneq (,$(findstring bootbox,$(APPSDIR)))
|
|
BOOTBOXLDOPTS = -Wl,--gc-sections
|
|
include $(APPSDIR)/bootbox.make
|
|
else ifneq (,$(findstring checkwps,$(APPSDIR)))
|
|
include $(APPSDIR)/checkwps.make
|
|
else ifneq (,$(findstring database,$(APPSDIR)))
|
|
include $(APPSDIR)/database.make
|
|
else
|
|
include $(APPSDIR)/apps.make
|
|
include $(APPSDIR)/lang/lang.make
|
|
|
|
ifdef SOFTWARECODECS
|
|
include $(APPSDIR)/codecs/codecs.make
|
|
endif
|
|
|
|
ifdef ENABLEDPLUGINS
|
|
include $(APPSDIR)/plugins/bitmaps/pluginbitmaps.make
|
|
include $(APPSDIR)/plugins/plugins.make
|
|
endif
|
|
|
|
ifdef SIMVER
|
|
include $(ROOTDIR)/uisimulator/uisimulator.make
|
|
endif
|
|
endif # bootloader
|
|
|
|
OBJ := $(SRC:.c=.o)
|
|
OBJ := $(OBJ:.S=.o)
|
|
OBJ += $(BMP:.bmp=.o)
|
|
OBJ := $(subst $(ROOTDIR),$(BUILDDIR),$(OBJ))
|
|
|
|
build: $(TOOLS) $(BUILDDIR)/$(BINARY) $(CODECS) $(ROCKS) $(ARCHOSROM) $(RBINFO)
|
|
|
|
$(RBINFO): $(BUILDDIR)/$(BINARY)
|
|
$(SILENT)echo Creating $(@F)
|
|
$(SILENT)$(TOOLSDIR)/mkinfo.pl $@
|
|
|
|
$(DEPFILE) dep:
|
|
$(call PRINTS,Generating dependencies)
|
|
@echo foo > /dev/null # there must be a "real" command in the rule
|
|
$(call mkdepfile,$(DEPFILE),$(SRC))
|
|
$(call mkdepfile,$(DEPFILE),$(OTHER_SRC:%.lua=))
|
|
$(call mkdepfile,$(DEPFILE),$(ASMDEFS_SRC))
|
|
@mv $(DEPFILE)_ $(DEPFILE)
|
|
$(call bmpdepfile,$(DEPFILE),$(BMP) $(PBMP))
|
|
|
|
bin: $(DEPFILE) $(TOOLS) $(BUILDDIR)/$(BINARY) $(RBINFO)
|
|
rocks: $(DEPFILE) $(TOOLS) $(ROCKS)
|
|
codecs: $(DEPFILE) $(TOOLS) $(CODECS)
|
|
tools: $(TOOLS)
|
|
|
|
-include $(DEPFILE)
|
|
|
|
veryclean: clean
|
|
$(SILENT)rm -rf $(TOOLS)
|
|
|
|
clean:
|
|
$(SILENT)echo Cleaning build directory
|
|
$(SILENT)rm -rf rockbox.zip rockbox.7z rockbox.tar rockbox.tar.gz \
|
|
rockbox.tar.bz2 TAGS apps firmware tools comsim sim lang \
|
|
manual *.pdf *.a credits.raw rockbox.ipod bitmaps \
|
|
pluginbitmaps UI256.bmp rockbox-full.zip html txt \
|
|
rockbox-manual*.zip sysfont.h rockbox-info.txt voicefontids \
|
|
*.wav *.mp3 *.voice $(CLEANOBJS) \
|
|
$(LINKRAM) $(LINKROM) rockbox.elf rockbox.map rockbox.bin \
|
|
make.dep rombox.elf rombox.map rombox.bin rombox.ucl romstart.txt \
|
|
$(BINARY) $(FLASHFILE) uisimulator bootloader flash $(BOOTLINK)
|
|
|
|
#### linking the binaries: ####
|
|
|
|
.SECONDEXPANSION:
|
|
|
|
ifeq (,$(findstring bootloader,$(APPSDIR)))
|
|
# not bootloader
|
|
|
|
OBJ += $(LANG_O)
|
|
|
|
ifndef SIMVER
|
|
|
|
## target build
|
|
CONFIGFILE := $(FIRMDIR)/export/config/$(MODELNAME).h
|
|
RAMLDS := $(FIRMDIR)/target/$(CPU)/$(MANUFACTURER)/app.lds
|
|
LINKRAM := $(BUILDDIR)/ram.link
|
|
ROMLDS := $(FIRMDIR)/rom.lds
|
|
LINKROM := $(BUILDDIR)/rom.link
|
|
|
|
|
|
$(LINKRAM): $(RAMLDS) $(CONFIGFILE)
|
|
$(call PRINTS,PP $(@F))
|
|
$(call preprocess2file,$<,$@,-DLOADADDRESS=$(LOADADDRESS))
|
|
|
|
$(LINKROM): $(ROMLDS)
|
|
$(call PRINTS,PP $(@F))
|
|
$(call preprocess2file,$<,$@,-DLOADADDRESS=$(LOADADDRESS))
|
|
|
|
$(BUILDDIR)/rockbox.elf : $$(OBJ) $$(FIRMLIB) $$(VOICESPEEXLIB) $$(LINKRAM)
|
|
$(call PRINTS,LD $(@F))$(CC) $(GCCOPTS) -Os -nostdlib -o $@ $(OBJ) \
|
|
-L$(BUILDDIR)/firmware -lfirmware \
|
|
-L$(BUILDDIR)/apps/codecs $(VOICESPEEXLIB:lib%.a=-l%) \
|
|
-lgcc $(BOOTBOXLDOPTS) \
|
|
-T$(LINKRAM) -Wl,-Map,$(BUILDDIR)/rockbox.map
|
|
|
|
$(BUILDDIR)/rombox.elf : $$(OBJ) $$(FIRMLIB) $$(VOICESPEEXLIB) $$(LINKROM)
|
|
$(call PRINTS,LD $(@F))$(CC) $(GCCOPTS) -Os -nostdlib -o $@ $(OBJ) \
|
|
$(VOICESPEEXLIB) $(FIRMLIB) -lgcc -L$(BUILDDIR)/firmware \
|
|
-T$(LINKROM) -Wl,-Map,$(BUILDDIR)/rombox.map
|
|
|
|
$(BUILDDIR)/rockbox.bin : $(BUILDDIR)/rockbox.elf
|
|
$(call PRINTS,OC $(@F))$(OC) $(if $(filter yes, $(USE_ELF)), -S -x, -O binary) $< $@
|
|
|
|
$(BUILDDIR)/rombox.bin : $(BUILDDIR)/rombox.elf
|
|
$(call PRINTS,OC $(@F))$(OC) -O binary $< $@
|
|
|
|
#
|
|
# If there's a flashfile defined for this target (rockbox.ucl for Archos
|
|
# models) Then check if the mkfirmware script fails, as then it is (likely)
|
|
# because the image is too big and we need to create a compressed image
|
|
# instead.
|
|
#
|
|
$(BUILDDIR)/$(BINARY) : $(BUILDDIR)/rockbox.bin $(FLASHFILE)
|
|
$(call PRINTS,SCRAMBLE $(notdir $@))($(MKFIRMWARE) $< $@; \
|
|
stat=$$?; \
|
|
if test -n "$(FLASHFILE)"; then \
|
|
if test "$$stat" -ne 0; then \
|
|
echo "Image too big, making a compressed version!"; \
|
|
$(MAKE) -C $(FIRMDIR)/decompressor OBJDIR=$(BUILDDIR)/firmware/decompressor; \
|
|
$(MKFIRMWARE) $(BUILDDIR)/firmware/decompressor/compressed.bin $@; \
|
|
fi \
|
|
fi )
|
|
|
|
# archos
|
|
$(BUILDDIR)/rockbox.ucl: $(BUILDDIR)/rockbox.bin
|
|
$(call PRINTS,UCLPACK $(@F))$(TOOLSDIR)/uclpack --best --2e -b1048576 $< $@ >/dev/null
|
|
|
|
MAXINFILE = $(BUILDDIR)/temp.txt
|
|
MAXOUTFILE = $(BUILDDIR)/romstart.txt
|
|
|
|
$(BUILDDIR)/rombox.ucl: $(BUILDDIR)/rombox.bin $(MAXOUTFILE)
|
|
$(call PRINTS,UCLPACK $(@F))$(TOOLSDIR)/uclpack --none $< $@ >/dev/null; \
|
|
perl $(TOOLSDIR)/romsizetest.pl `cat $(MAXOUTFILE)` $<; \
|
|
if test $$? -ne 0; then \
|
|
echo "removing UCL file again, making it a fake one"; \
|
|
echo "fake" > $@; \
|
|
fi
|
|
|
|
$(MAXOUTFILE):
|
|
$(call PRINTS,Creating $(@F))
|
|
$(SILENT)$(shell echo '#include "config.h"' > $(MAXINFILE))
|
|
$(SILENT)$(shell echo "ROM_START" >> $(MAXINFILE))
|
|
$(call preprocess2file,$(MAXINFILE),$(MAXOUTFILE))
|
|
$(SILENT)rm $(MAXINFILE)
|
|
|
|
# iriver
|
|
$(BUILDDIR)/rombox.iriver: $(BUILDDIR)/rombox.bin
|
|
$(call PRINTS,Build ROM file)$(MKFIRMWARE) $< $@
|
|
|
|
endif # !SIMVER
|
|
endif # !bootloader
|
|
|
|
|
|
voicetools:
|
|
$(SILENT)$(MAKE) -C $(TOOLSDIR) CC=$(HOSTCC) AR=$(HOSTAR) rbspeexenc voicefont wavtrim
|
|
|
|
tags:
|
|
$(SILENT)rm -f TAGS
|
|
$(SILENT)etags -o $(BUILDDIR)/TAGS $(filter-out %.o,$(SRC) $(OTHER_SRC))
|
|
|
|
fontzip:
|
|
$(SILENT)$(TOOLSDIR)/buildzip.pl $(VERBOSEOPT) -m \"$(MODELNAME)\" -r "$(ROOTDIR)" --rbdir="$(RBDIR)" -f 1 -o rockbox-fonts.zip $(TARGET) $(BINARY)
|
|
|
|
zip:
|
|
$(SILENT)for f in `cat $(BUILDDIR)/apps/features`; do feat="$$feat:$$f" ; done ; \
|
|
$(TOOLSDIR)/buildzip.pl $(VERBOSEOPT) -m \"$(MODELNAME)\" -i \"$(TARGET_ID)\" -r "$(ROOTDIR)" --rbdir="$(RBDIR)" $(TARGET) $(BINARY)
|
|
|
|
mapzip:
|
|
$(SILENT)find . -name "*.map" | xargs zip rockbox-maps.zip
|
|
|
|
fullzip:
|
|
$(SILENT)for f in `cat $(BUILDDIR)/apps/features`; do feat="$$feat:$$f" ; done; \
|
|
$(TOOLSDIR)/buildzip.pl $(VERBOSEOPT) -m \"$(MODELNAME)\" -i \"$(TARGET_ID)\" -r "$(ROOTDIR)" --rbdir="$(RBDIR)" -f 2 -o rockbox-full.zip $(TARGET) $(BINARY)
|
|
|
|
7zip:
|
|
$(SILENT)for f in `cat $(BUILDDIR)/apps/features`; do feat="$$feat:$$f" ; done; \
|
|
$(TOOLSDIR)/buildzip.pl $(VERBOSEOPT) -m \"$(MODELNAME)\" -i \"$(TARGET_ID)\" -o "rockbox.7z" -z "7za a -mx=9" -r "$(ROOTDIR)" --rbdir="$(RBDIR)" $(TARGET) $(BINARY)
|
|
|
|
tar:
|
|
$(SILENT)rm -f rockbox.tar
|
|
$(SILENT)for f in `cat $(BUILDDIR)/apps/features`; do feat="$$feat:$$f" ; done; \
|
|
$(TOOLSDIR)/buildzip.pl $(VERBOSEOPT) -m \"$(MODELNAME)\" -i \"$(TARGET_ID)\" -o "rockbox.tar" -z "tar -cf" -r "$(ROOTDIR)" --rbdir="$(RBDIR)" $(TARGET) $(BINARY)
|
|
|
|
bzip2: tar
|
|
$(SILENT)bzip2 -f9 rockbox.tar
|
|
|
|
gzip: tar
|
|
$(SILENT)gzip -f9 rockbox.tar
|
|
|
|
manual manual-pdf:
|
|
$(SILENT)$(MAKE) -C $(MANUALDIR) OBJDIR=$(BUILDDIR)/manual manual-pdf
|
|
manual-html:
|
|
$(SILENT)$(MAKE) -C $(MANUALDIR) OBJDIR=$(BUILDDIR)/manual manual-html
|
|
manual-zhtml: manual-zip
|
|
manual-txt:
|
|
$(SILENT)$(MAKE) -C $(MANUALDIR) OBJDIR=$(BUILDDIR)/manual manual-txt
|
|
manual-ztxt:
|
|
$(SILENT)$(MAKE) -C $(MANUALDIR) OBJDIR=$(BUILDDIR)/manual manual-txt-zip
|
|
manual-zip:
|
|
$(SILENT)$(MAKE) -C $(MANUALDIR) OBJDIR=$(BUILDDIR)/manual manual-zip
|
|
|
|
ifdef TTS_ENGINE
|
|
|
|
voice: voicetools features
|
|
$(SILENT)for f in `cat $(BUILDDIR)/apps/features`; do feat="$$feat:$$f" ; done ; \
|
|
for lang in `echo $(VOICELANGUAGE) |sed "s/,/ /g"`; do $(TOOLSDIR)/voice.pl -V -l=$$lang -t=$(MODELNAME)$$feat -i=$(TARGET_ID) -e="$(ENCODER)" -E="$(ENC_OPTS)" -s=$(TTS_ENGINE) -S="$(TTS_OPTS)"; done \
|
|
|
|
endif
|
|
|
|
install:
|
|
@echo "Installing your build in your '$(PREFIX)' dir"
|
|
$(SILENT)for f in `cat $(BUILDDIR)/apps/features`; do feat="$$feat:$$f" ; done; \
|
|
$(TOOLSDIR)/buildzip.pl $(VERBOSEOPT) -m "$(MODELNAME)" -i "$(TARGET_ID)" $(INSTALL) -z "zip -r0" -r "$(ROOTDIR)" --rbdir="$(RBDIR)" -f 0 $(TARGET) $(BINARY)
|
|
|
|
fullinstall:
|
|
@echo "Installing a full setup in your '$(PREFIX)' dir"
|
|
$(SILENT)for f in `cat $(BUILDDIR)/apps/features`; do feat="$$feat:$$f" ; done; \
|
|
$(TOOLSDIR)/buildzip.pl $(VERBOSEOPT) -m "$(MODELNAME)" -i "$(TARGET_ID)" $(INSTALL) -z "zip -r0" -r "$(ROOTDIR)" --rbdir="$(RBDIR)" -f 2 $(TARGET) $(BINARY)
|
|
|
|
help:
|
|
@echo "A few helpful make targets"
|
|
@echo ""
|
|
@echo "all - builds a full Rockbox (default), including tools"
|
|
@echo "bin - builds only the Rockbox.<target name> file"
|
|
@echo "rocks - builds only plugins"
|
|
@echo "codecs - builds only codecs"
|
|
@echo "dep - regenerates make dependency database"
|
|
@echo "clean - cleans a build directory (not tools)"
|
|
@echo "veryclean - cleans the build and tools directories"
|
|
@echo "manual - builds a manual (pdf)"
|
|
@echo "manual-html - HTML manual"
|
|
@echo "manual-zip - HTML manual (zipped)"
|
|
@echo "manual-txt - txt manual"
|
|
@echo "fullzip - creates a rockbox.zip of your build with fonts"
|
|
@echo "zip - creates a rockbox.zip of your build (no fonts)"
|
|
@echo "gzip - creates a rockbox.tar.gz of your build (no fonts)"
|
|
@echo "bzip2 - creates a rockbox.tar.bz2 of your build (no fonts)"
|
|
@echo "7zip - creates a rockbox.7z of your build (no fonts)"
|
|
@echo "fontzip - creates rockbox-fonts.zip"
|
|
@echo "mapzip - creates rockbox-maps.zip with all .map files"
|
|
@echo "tools - builds the tools only"
|
|
@echo "voice - creates the voice clips (voice builds only)"
|
|
@echo "voicetools - builds the voice tools only"
|
|
@echo "install - installs your build (at PREFIX, defaults to simdisk/ for simulators (no fonts))"
|
|
@echo "fullinstall - installs your build (like install, but with fonts)"
|
|
@echo "reconf - rerun configure with the same selection"
|
|
|
|
### general compile rules:
|
|
|
|
# when source and object are in different locations (normal):
|
|
$(BUILDDIR)/%.o: $(ROOTDIR)/%.c
|
|
$(SILENT)mkdir -p $(dir $@)
|
|
$(call PRINTS,CC $(subst $(ROOTDIR)/,,$<))$(CC) $(CFLAGS) -c $< -o $@
|
|
|
|
$(BUILDDIR)/%.o: $(ROOTDIR)/%.S
|
|
$(SILENT)mkdir -p $(dir $@)
|
|
$(call PRINTS,CC $(subst $(ROOTDIR)/,,$<))$(CC) $(CFLAGS) -c $< -o $@
|
|
|
|
# generated definitions for use in .S files
|
|
$(BUILDDIR)/%_asmdefs.h: $(ROOTDIR)/%_asmdefs.c
|
|
$(call PRINTS,ASMDEFS $(@F))
|
|
$(SILENT)mkdir -p $(dir $@)
|
|
$(call asmdefs2file,$<,$@)
|
|
|
|
# when source and object are both in BUILDDIR (generated code):
|
|
%.o: %.c
|
|
$(SILENT)mkdir -p $(dir $@)
|
|
$(call PRINTS,CC $(subst $(ROOTDIR)/,,$<))$(CC) $(CFLAGS) -c $< -o $@
|
|
|
|
%.o: %.S
|
|
$(SILENT)mkdir -p $(dir $@)
|
|
$(call PRINTS,CC $(subst $(ROOTDIR)/,,$<))$(CC) $(CFLAGS) -c $< -o $@
|
|
|
|
Makefile: $(TOOLSDIR)/configure
|
|
ifneq (reconf,$(MAKECMDGOALS))
|
|
$(SILENT)echo "*** tools/configure is newer than Makefile. You should run 'make reconf'."
|
|
endif
|
|
|
|
reconf:
|
|
$(SILENT$)PREFIX=$(PREFIX) $(TOOLSDIR)/configure $(CONFIGURE_OPTIONS)
|