Added 'keywords' and 'eol-style' properties.
[kugel-rb.git] / tools / root.make
blobd58ef4de65f66342268e347fbc6c517efbbb54e1
1 # __________ __ ___.
2 # Open \______ \ ____ ____ | | _\_ |__ _______ ___
3 # Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
4 # Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
5 # Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
6 # \/ \/ \/ \/ \/
7 # $Id$
10 include $(TOOLSDIR)/functions.make
12 DEFINES = -DROCKBOX -DMEMORYSIZE=$(MEMORYSIZE) -DMEM=$(MEMORYSIZE) $(TARGET) \
13 -DTARGET_ID=$(TARGET_ID) -DTARGET_NAME=\"$(MODELNAME)\" \
14 -DAPPSVERSION=\"$(VERSION)\" $(BUILDDATE) \
15 $(EXTRA_DEFINES) # <-- -DSIMULATOR or not
16 INCLUDES = -I$(BUILDDIR) $(TARGET_INC)
18 CFLAGS = $(INCLUDES) $(DEFINES) $(GCCOPTS)
19 PPCFLAGS = $(filter-out -Dmain=SDL_main,$(CFLAGS)) # cygwin sdl-config fix
21 TOOLS = $(TOOLSDIR)/rdf2binary $(TOOLSDIR)/convbdf \
22 $(TOOLSDIR)/codepages $(TOOLSDIR)/scramble $(TOOLSDIR)/bmp2rb \
23 $(TOOLSDIR)/uclpack $(TOOLSDIR)/mktccboot $(TOOLSDIR)/mkboot
25 RBINFO = $(BUILDDIR)/rockbox-info.txt
27 # list suffixes to be understood by $*
28 .SUFFIXES: .rock .codec .map .elf .c .S .o .bmp .a
30 .PHONY: all clean tags zip tools manual bin build info langs
32 DEPFILE = $(BUILDDIR)/make.dep
34 all: $(DEPFILE) build
36 # Subdir makefiles. their primary purpose is to populate SRC & OTHER_SRC
37 # but they also define special dependencies and compile rules
38 include $(TOOLSDIR)/tools.make
39 include $(FIRMDIR)/firmware.make
40 include $(ROOTDIR)/apps/bitmaps/bitmaps.make
42 ifneq (,$(findstring bootloader,$(APPSDIR)))
43 include $(APPSDIR)/bootloader.make
44 else ifneq (,$(findstring bootbox,$(APPSDIR)))
45 BOOTBOXLDOPTS = -Wl,--gc-sections
46 include $(APPSDIR)/bootbox.make
47 else
48 include $(APPSDIR)/apps.make
49 include $(APPSDIR)/lang/lang.make
51 ifdef SOFTWARECODECS
52 include $(APPSDIR)/codecs/codecs.make
53 endif
55 ifdef ENABLEDPLUGINS
56 include $(APPSDIR)/plugins/bitmaps/pluginbitmaps.make
57 include $(APPSDIR)/plugins/plugins.make
58 endif
60 ifdef SIMVER
61 include $(ROOTDIR)/uisimulator/uisimulator.make
62 endif
63 endif # bootloader
65 OBJ := $(SRC:.c=.o)
66 OBJ := $(OBJ:.S=.o)
67 OBJ += $(BMP:.bmp=.o)
68 OBJ := $(subst $(ROOTDIR),$(BUILDDIR),$(OBJ))
70 build: $(TOOLS) $(BUILDDIR)/$(BINARY) $(CODECS) $(ROCKS) $(ARCHOSROM) $(RBINFO)
72 $(RBINFO): $(BUILDDIR)/$(BINARY)
73 $(SILENT)echo Creating $(@F)
74 $(SILENT)$(TOOLSDIR)/mkinfo.pl $@
76 ifneq (clean,$(findstring clean,$(MAKECMDGOALS))) # don't build deps before cleaning
77 $(DEPFILE) dep:
78 $(call PRINTS,Generating dependencies)
79 @echo foo > /dev/null # there must be a "real" command in the rule
80 $(call mkdepfile,$(DEPFILE),$(SRC) $(OTHER_SRC))
81 $(call bmpdepfile,$(DEPFILE),$(BMP) $(PBMP))
82 endif
84 bin: $(DEPFILE) $(TOOLS) $(BUILDDIR)/$(BINARY)
85 rocks: $(DEPFILE) $(TOOLS) $(ROCKS)
86 codecs: $(DEPFILE) $(TOOLS) $(CODECS)
88 -include $(DEPFILE)
90 veryclean: clean
91 $(SILENT)rm -rf $(TOOLS)
93 clean:
94 $(SILENT)echo Cleaning build directory
95 $(SILENT)rm -rf rockbox.zip rockbox.7z rockbox.tar rockbox.tar.gz \
96 rockbox.tar.bz2 TAGS apps firmware comsim sim lang.[ch] \
97 manual *.pdf *.a credits.raw rockbox.ipod bitmaps \
98 pluginbitmaps UI256.bmp rockbox-full.zip html txt \
99 rockbox-manual*.zip sysfont.h rockbox-info.txt voicefontids \
100 *.wav *.mp3 *.voice max_language_size.h $(CLEANOBJS) \
101 $(LINKRAM) $(LINKROM) rockbox.elf rockbox.map rockbox.bin \
102 $(DEPFILE) rombox.elf rombox.map rombox.bin rombox.ucl \
103 $(BINARY) $(FLASHFILE) uisimulator bootloader flash $(BOOTLINK)
105 #### linking the binaries: ####
107 .SECONDEXPANSION:
109 ifeq (,$(findstring bootloader,$(APPSDIR)))
110 # not bootloader
112 OBJ += $(LANG_O)
114 ifndef SIMVER
116 ## target build
117 RAMLDS := $(FIRMDIR)/target/$(CPU)/$(MANUFACTURER)/app.lds
118 LINKRAM := $(BUILDDIR)/ram.link
119 ROMLDS := $(FIRMDIR)/rom.lds
120 LINKROM := $(BUILDDIR)/rom.link
123 $(LINKRAM): $(RAMLDS)
124 $(call PRINTS,PP $(@F))
125 $(call preprocess2file,$<,$@,-DLOADADDRESS=$(LOADADDRESS))
127 $(LINKROM): $(ROMLDS)
128 $(call PRINTS,PP $(@F))
129 $(call preprocess2file,$<,$@,-DLOADADDRESS=$(LOADADDRESS))
131 $(BUILDDIR)/rockbox.elf : $$(OBJ) $$(FIRMLIB) $$(VOICESPEEXLIB) $$(LINKRAM)
132 $(call PRINTS,LD $(@F))$(CC) $(GCCOPTS) -Os -nostdlib -o $@ $(OBJ) \
133 -L$(BUILDDIR)/firmware -lfirmware \
134 -L$(BUILDDIR)/apps/codecs $(VOICESPEEXLIB:lib%.a=-l%) \
135 -lgcc $(BOOTBOXLDOPTS) \
136 -T$(LINKRAM) -Wl,-Map,$(BUILDDIR)/rockbox.map
138 $(BUILDDIR)/rombox.elf : $$(OBJ) $$(FIRMLIB) $$(VOICESPEEXLIB) $$(LINKROM)
139 $(call PRINTS,LD $(@F))$(CC) $(GCCOPTS) -Os -nostdlib -o $@ $(OBJ) \
140 $(VOICESPEEXLIB) $(FIRMLIB) -lgcc -L$(BUILDDIR)/firmware \
141 -T$(LINKROM) -Wl,-Map,$(BUILDDIR)/rombox.map
143 $(BUILDDIR)/rockbox.bin : $(BUILDDIR)/rockbox.elf
144 $(call PRINTS,OC $(@F))$(OC) $(if $(filter yes, $(USE_ELF)), -S -x, -O binary) $< $@
146 $(BUILDDIR)/rombox.bin : $(BUILDDIR)/rombox.elf
147 $(call PRINTS,OC $(@F))$(OC) -O binary $< $@
150 # If there's a flashfile defined for this target (rockbox.ucl for Archos
151 # models) Then check if the mkfirmware script fails, as then it is (likely)
152 # because the image is too big and we need to create a compressed image
153 # instead.
155 $(BUILDDIR)/$(BINARY) : $(BUILDDIR)/rockbox.bin $(FLASHFILE)
156 $(call PRINTS,SCRAMBLE $(notdir $@))($(MKFIRMWARE) $< $@; \
157 stat=$$?; \
158 if test -n "$(FLASHFILE)"; then \
159 if test "$$stat" -ne 0; then \
160 echo "Image too big, making a compressed version!"; \
161 $(MAKE) -C $(FIRMDIR)/decompressor OBJDIR=$(BUILDDIR)/firmware/decompressor; \
162 $(MKFIRMWARE) $(BUILDDIR)/firmware/decompressor/compressed.bin $@; \
163 fi \
164 fi )
166 # archos
167 $(BUILDDIR)/rockbox.ucl: $(BUILDDIR)/rockbox.bin
168 $(call PRINTS,UCLPACK $(@F))$(TOOLSDIR)/uclpack --best --2e -b1048576 $< $@ >/dev/null 2>&1
170 MAXINFILE = $(BUILDDIR)/temp.txt
171 MAXOUTFILE = $(BUILDDIR)/romstart.txt
173 $(BUILDDIR)/rombox.ucl: $(BUILDDIR)/rombox.bin $(MAXOUTFILE)
174 $(call PRINTS,UCLPACK $(@F))$(TOOLSDIR)/uclpack --none $< $@ >/dev/null; \
175 perl $(TOOLSDIR)/romsizetest.pl `cat $(MAXOUTFILE)` $<; \
176 if test $$? -ne 0; then \
177 echo "removing UCL file again, making it a fake one"; \
178 echo "fake" > $@; \
181 $(MAXOUTFILE):
182 $(call PRINTS,Creating $(@F))
183 $(SILENT)$(shell echo '#include "config.h"' > $(MAXINFILE))
184 $(SILENT)$(shell echo "ROM_START" >> $(MAXINFILE))
185 $(call preprocess2file,$(MAXINFILE),$(MAXOUTFILE))
186 $(SILENT)rm $(MAXINFILE)
188 # iriver
189 $(BUILDDIR)/rombox.iriver: $(BUILDDIR)/rombox.bin
190 $(call PRINTS,Build ROM file)$(MKFIRMWARE) $< $@
192 endif # !SIMVER
193 endif # !bootloader
196 voicetools:
197 $(SILENT)$(MAKE) -C $(TOOLSDIR) CC=$(HOSTCC) AR=$(HOSTAR) rbspeexenc voicefont wavtrim
199 tags:
200 $(SILENT)rm -f TAGS
201 $(SILENT)etags -o $(BUILDDIR)/TAGS $(filter-out %.o,$(SRC) $(OTHER_SRC))
203 fontzip:
204 $(SILENT)$(TOOLSDIR)/buildzip.pl $(VERBOSEOPT) -t \"$(MODELNAME)\" -r "$(ROOTDIR)" --rbdir="$(RBDIR)" -f 1 -o rockbox-fonts.zip $(TARGET) $(BINARY)
206 zip:
207 $(SILENT)for f in `cat $(BUILDDIR)/apps/features`; do feat="$$feat:$$f" ; done ; \
208 $(TOOLSDIR)/buildzip.pl $(VERBOSEOPT) -t \"$(MODELNAME)$$feat\" -i \"$(TARGET_ID)\" -r "$(ROOTDIR)" --rbdir="$(RBDIR)" $(TARGET) $(BINARY)
210 mapzip:
211 $(SILENT)find . -name "*.map" | xargs zip rockbox-maps.zip
213 fullzip:
214 $(SILENT)for f in `cat $(BUILDDIR)/apps/features`; do feat="$$feat:$$f" ; done; \
215 $(TOOLSDIR)/buildzip.pl $(VERBOSEOPT) -t \"$(MODELNAME)$$feat\" -i \"$(TARGET_ID)\" -r "$(ROOTDIR)" --rbdir="$(RBDIR)" -f 2 -o rockbox-full.zip $(TARGET) $(BINARY)
217 7zip:
218 $(SILENT)for f in `cat $(BUILDDIR)/apps/features`; do feat="$$feat:$$f" ; done; \
219 $(TOOLSDIR)/buildzip.pl $(VERBOSEOPT) -t \"$(MODELNAME)$$feat\" -i \"$(TARGET_ID)\" -o "rockbox.7z" -z "7za a -mx=9" -r "$(ROOTDIR)" --rbdir="$(RBDIR)" $(TARGET) $(BINARY)
221 tar:
222 $(SILENT)rm -f rockbox.tar
223 $(SILENT)for f in `cat $(BUILDDIR)/apps/features`; do feat="$$feat:$$f" ; done; \
224 $(TOOLSDIR)/buildzip.pl $(VERBOSEOPT) -t \"$(MODELNAME)$$feat\" -i \"$(TARGET_ID)\" -o "rockbox.tar" -z "tar -cf" -r "$(ROOTDIR)" --rbdir="$(RBDIR)" $(TARGET) $(BINARY)
226 bzip2: tar
227 $(SILENT)bzip2 -f9 rockbox.tar
229 gzip: tar
230 $(SILENT)gzip -f9 rockbox.tar
232 manual manual-pdf:
233 $(SILENT)$(MAKE) -C $(MANUALDIR) OBJDIR=$(BUILDDIR)/manual manual-pdf
234 manual-html:
235 $(SILENT)$(MAKE) -C $(MANUALDIR) OBJDIR=$(BUILDDIR)/manual manual-html
236 manual-zhtml: manual-zip
237 manual-txt:
238 $(SILENT)$(MAKE) -C $(MANUALDIR) OBJDIR=$(BUILDDIR)/manual manual-txt
239 manual-ztxt:
240 $(SILENT)$(MAKE) -C $(MANUALDIR) OBJDIR=$(BUILDDIR)/manual manual-txt-zip
241 manual-zip:
242 $(SILENT)$(MAKE) -C $(MANUALDIR) OBJDIR=$(BUILDDIR)/manual manual-zip
244 ifdef TTS_ENGINE
246 voice: voicetools features
247 $(SILENT)for f in `cat $(BUILDDIR)/apps/features`; do feat="$$feat:$$f" ; done ; \
248 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 \
250 endif
252 ifdef SIMVER
254 install:
255 @echo "Installing your build in your 'simdisk' dir"
256 $(SILENT)for f in `cat $(BUILDDIR)/apps/features`; do feat="$$feat:$$f" ; done; \
257 $(TOOLSDIR)/buildzip.pl $(VERBOSEOPT) -t \"$(MODELNAME)$$feat\" -i \"$(TARGET_ID)\" -s -r "$(ROOTDIR)" --rbdir="$(RBDIR)" -f 0 $(TARGET) $(BINARY)
259 fullinstall:
260 @echo "Installing a full setup in your 'simdisk' dir"
261 $(SILENT)for f in `cat $(BUILDDIR)/apps/features`; do feat="$$feat:$$f" ; done; \
262 $(TOOLSDIR)/buildzip.pl $(VERBOSEOPT) -t \"$(MODELNAME)$$feat\" -i \"$(TARGET_ID)\" -s -r "$(ROOTDIR)" --rbdir="$(RBDIR)" -f 2 $(TARGET) $(BINARY)
264 endif
266 help:
267 @echo "A few helpful make targets"
268 @echo ""
269 @echo "all - builds a full Rockbox (default), including tools"
270 @echo "bin - builds only the Rockbox.<target name> file"
271 @echo "rocks - builds only plugins"
272 @echo "codecs - builds only codecs"
273 @echo "dep - regenerates make dependency database"
274 @echo "clean - cleans a build directory (not tools)"
275 @echo "veryclean - cleans the build and tools directories"
276 @echo "manual - builds a manual (pdf)"
277 @echo "manual-html - HTML manual"
278 @echo "manual-zip - HTML manual (zipped)"
279 @echo "manual-txt - txt manual"
280 @echo "fullzip - creates a rockbox.zip of your build with fonts"
281 @echo "zip - creates a rockbox.zip of your build (no fonts)"
282 @echo "gzip - creates a rockbox.tar.gz of your build (no fonts)"
283 @echo "bzip2 - creates a rockbox.tar.bz2 of your build (no fonts)"
284 @echo "7zip - creates a rockbox.7z of your build (no fonts)"
285 @echo "fontzip - creates rockbox-fonts.zip"
286 @echo "mapzip - creates rockbox-maps.zip with all .map files"
287 @echo "tools - builds the tools only"
288 @echo "voice - creates the voice clips (voice builds only)"
289 @echo "voicetools - builds the voice tools only"
290 @echo "install - installs your build (for simulator builds only, no fonts)"
291 @echo "fullinstall - installs your build (for simulator builds only, with fonts)"
293 ### general compile rules:
295 # when source and object are in different locations (normal):
296 $(BUILDDIR)/%.o: $(ROOTDIR)/%.c
297 $(SILENT)mkdir -p $(dir $@)
298 $(call PRINTS,CC $(subst $(ROOTDIR)/,,$<))$(CC) $(CFLAGS) -c $< -o $@
300 $(BUILDDIR)/%.o: $(ROOTDIR)/%.S
301 $(SILENT)mkdir -p $(dir $@)
302 $(call PRINTS,CC $(subst $(ROOTDIR)/,,$<))$(CC) $(CFLAGS) -c $< -o $@
304 # when source and object are both in BUILDDIR (generated code):
305 %.o: %.c
306 $(SILENT)mkdir -p $(dir $@)
307 $(call PRINTS,CC $(subst $(ROOTDIR)/,,$<))$(CC) $(CFLAGS) -c $< -o $@
309 %.o: %.S
310 $(SILENT)mkdir -p $(dir $@)
311 $(call PRINTS,CC $(subst $(ROOTDIR)/,,$<))$(CC) $(CFLAGS) -c $< -o $@