make bininstall rule depend on the binary
[rockbox:rockbox.git] / tools / root.make
1 #             __________               __   ___.
2 #   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
3 #   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
4 #   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
5 #   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
6 #                     \/            \/     \/    \/            \/
7 # $Id$
8 #
9
10 include $(TOOLSDIR)/functions.make
11
12 DEFINES = -DROCKBOX -DMEMORYSIZE=$(MEMORYSIZE) -DMEM=$(MEMORYSIZE) $(TARGET) \
13         -DTARGET_ID=$(TARGET_ID) -DTARGET_NAME=\"$(MODELNAME)\" $(BUILDDATE) \
14         $(EXTRA_DEFINES) # <-- -DSIMULATOR or not
15 INCLUDES = -I$(BUILDDIR) -I$(BUILDDIR)/lang $(TARGET_INC)
16
17 CFLAGS = $(INCLUDES) $(DEFINES) $(GCCOPTS) 
18 PPCFLAGS = $(filter-out -g -Dmain=SDL_main,$(CFLAGS)) # cygwin sdl-config fix
19
20 TOOLS = $(TOOLSDIR)/rdf2binary $(TOOLSDIR)/convbdf \
21         $(TOOLSDIR)/codepages $(TOOLSDIR)/scramble $(TOOLSDIR)/bmp2rb \
22         $(TOOLSDIR)/uclpack $(TOOLSDIR)/mkboot $(TOOLSDIR)/iaudio_bl_flash.c \
23         $(TOOLSDIR)/iaudio_bl_flash.h
24
25
26 ifeq (,$(PREFIX))
27 ifdef SIMVER
28 # for sims, set simdisk/ as default
29 PREFIX = simdisk
30 INSTALL = --install="$(PREFIX)"
31 else
32 # /dev/null as magic to tell it wasn't set, error out later in buildzip.pl
33 INSTALL = --install=/dev/null
34 endif
35 else
36 INSTALL = --install="$(PREFIX)"
37 endif
38
39 RBINFO = $(BUILDDIR)/rockbox-info.txt
40
41 # list suffixes to be understood by $*
42 .SUFFIXES: .rock .codec .map .elf .c .S .o .bmp .a
43
44 .PHONY: all clean tags zip tools manual bin build info langs
45
46 ifeq (,$(filter clean veryclean reconf tags voice voicetools manual manual-pdf manual-html manual-zhtml manual-txt manual-ztxt manual-zip help fontzip ,$(MAKECMDGOALS)))
47 # none of the above
48 DEPFILE = $(BUILDDIR)/make.dep
49
50 endif
51
52 all: $(DEPFILE) build
53
54 # Subdir makefiles. their primary purpose is to populate SRC, OTHER_SRC &
55 # ASMDEFS_SRC but they also define special dependencies and compile rules
56 include $(TOOLSDIR)/tools.make
57
58 ifeq (,$(findstring checkwps,$(APPSDIR)))
59   ifeq (,$(findstring database,$(APPSDIR)))
60     include $(FIRMDIR)/firmware.make
61     include $(ROOTDIR)/lib/skin_parser/skin_parser.make
62     include $(ROOTDIR)/apps/bitmaps/bitmaps.make
63   endif
64 endif
65
66 ifneq (,$(findstring bootloader,$(APPSDIR)))
67   include $(APPSDIR)/bootloader.make
68 else ifneq (,$(findstring bootbox,$(APPSDIR)))
69   BOOTBOXLDOPTS = -Wl,--gc-sections
70   include $(APPSDIR)/bootbox.make
71 else ifneq (,$(findstring checkwps,$(APPSDIR)))
72   include $(APPSDIR)/checkwps.make
73 else ifneq (,$(findstring database,$(APPSDIR)))
74   include $(APPSDIR)/database.make
75 else
76   include $(APPSDIR)/apps.make
77   include $(APPSDIR)/lang/lang.make
78
79   ifdef SOFTWARECODECS
80     include $(APPSDIR)/codecs/codecs.make
81   endif
82
83   ifdef ENABLEDPLUGINS
84     include $(APPSDIR)/plugins/bitmaps/pluginbitmaps.make
85     include $(APPSDIR)/plugins/plugins.make
86   endif
87
88   ifdef SIMVER
89     include $(ROOTDIR)/uisimulator/uisimulator.make
90   endif
91 endif # bootloader
92
93 OBJ := $(SRC:.c=.o)
94 OBJ := $(OBJ:.S=.o)
95 OBJ += $(BMP:.bmp=.o)
96 OBJ := $(subst $(ROOTDIR),$(BUILDDIR),$(OBJ))
97
98 build: $(TOOLS) $(BUILDDIR)/$(BINARY) $(CODECS) $(ROCKS) $(ARCHOSROM) $(RBINFO)
99
100 $(RBINFO): $(BUILDDIR)/$(BINARY)
101         $(SILENT)echo Creating $(@F)
102         $(SILENT)$(TOOLSDIR)/mkinfo.pl $@
103
104 $(DEPFILE) dep:
105         $(call PRINTS,Generating dependencies)
106         @echo foo > /dev/null # there must be a "real" command in the rule
107         $(call mkdepfile,$(DEPFILE),$(SRC))
108         $(call mkdepfile,$(DEPFILE),$(OTHER_SRC:%.lua=))
109         $(call mkdepfile,$(DEPFILE),$(ASMDEFS_SRC))
110         @mv $(DEPFILE)_ $(DEPFILE)
111         $(call bmpdepfile,$(DEPFILE),$(BMP) $(PBMP))
112
113 bin: $(DEPFILE) $(TOOLS) $(BUILDDIR)/$(BINARY) $(RBINFO)
114 rocks: $(DEPFILE) $(TOOLS) $(ROCKS)
115 codecs: $(DEPFILE) $(TOOLS) $(CODECS)
116 tools: $(TOOLS)
117
118 -include $(DEPFILE)
119
120 veryclean: clean
121         $(SILENT)rm -rf $(TOOLS)
122
123 clean:
124         $(SILENT)echo Cleaning build directory
125         $(SILENT)rm -rf rockbox.zip rockbox.7z rockbox.tar rockbox.tar.gz \
126                 rockbox.tar.bz2 TAGS apps firmware tools comsim sim lang lib \
127                 manual *.pdf *.a credits.raw rockbox.ipod bitmaps \
128                 pluginbitmaps UI256.bmp rockbox-full.zip html txt \
129                 rockbox-manual*.zip sysfont.h rockbox-info.txt voicefontids \
130                 *.wav *.mp3 *.voice $(CLEANOBJS) \
131                 $(LINKRAM) $(LINKROM) rockbox.elf rockbox.map rockbox.bin \
132                 make.dep rombox.elf rombox.map rombox.bin rombox.ucl romstart.txt \
133                 $(BINARY) $(FLASHFILE) uisimulator bootloader flash $(BOOTLINK)
134
135 #### linking the binaries: ####
136
137 .SECONDEXPANSION:
138
139 ifeq (,$(findstring bootloader,$(APPSDIR)))
140 # not bootloader
141
142 OBJ += $(LANG_O)
143
144 ifndef SIMVER
145
146 ## target build
147 CONFIGFILE := $(FIRMDIR)/export/config/$(MODELNAME).h
148 RAMLDS := $(FIRMDIR)/target/$(CPU)/$(MANUFACTURER)/app.lds
149 LINKRAM := $(BUILDDIR)/ram.link
150 ROMLDS := $(FIRMDIR)/rom.lds
151 LINKROM := $(BUILDDIR)/rom.link
152
153
154 $(LINKRAM): $(RAMLDS) $(CONFIGFILE)
155         $(call PRINTS,PP $(@F))
156         $(call preprocess2file,$<,$@,-DLOADADDRESS=$(LOADADDRESS))
157
158 $(LINKROM): $(ROMLDS)
159         $(call PRINTS,PP $(@F))
160         $(call preprocess2file,$<,$@,-DLOADADDRESS=$(LOADADDRESS))
161
162 $(BUILDDIR)/rockbox.elf : $$(OBJ) $$(FIRMLIB) $$(VOICESPEEXLIB) $$(SKINLIB) $$(LINKRAM)
163         $(call PRINTS,LD $(@F))$(CC) $(GCCOPTS) -Os -nostdlib -o $@ $(OBJ) \
164                 -L$(BUILDDIR)/firmware -lfirmware \
165                 -L$(BUILDDIR)/apps/codecs $(VOICESPEEXLIB:lib%.a=-l%) \
166                 -lgcc $(BOOTBOXLDOPTS) \
167                 -T$(LINKRAM) -Wl,-Map,$(BUILDDIR)/rockbox.map
168
169 $(BUILDDIR)/rombox.elf : $$(OBJ) $$(FIRMLIB) $$(VOICESPEEXLIB) $$(SKINLIB) $$(LINKROM)
170         $(call PRINTS,LD $(@F))$(CC) $(GCCOPTS) -Os -nostdlib -o $@ $(OBJ) \
171                 $(VOICESPEEXLIB) $(FIRMLIB) -lgcc -L$(BUILDDIR)/firmware \
172                 -T$(LINKROM) -Wl,-Map,$(BUILDDIR)/rombox.map
173
174 $(BUILDDIR)/rockbox.bin : $(BUILDDIR)/rockbox.elf
175         $(call PRINTS,OC $(@F))$(OC) $(if $(filter yes, $(USE_ELF)), -S -x, -O binary) $< $@
176
177 $(BUILDDIR)/rombox.bin : $(BUILDDIR)/rombox.elf
178         $(call PRINTS,OC $(@F))$(OC) -O binary $< $@
179
180 #
181 # If there's a flashfile defined for this target (rockbox.ucl for Archos
182 # models) Then check if the mkfirmware script fails, as then it is (likely)
183 # because the image is too big and we need to create a compressed image
184 # instead.
185 #
186 $(BUILDDIR)/$(BINARY) : $(BUILDDIR)/rockbox.bin $(FLASHFILE)
187         $(call PRINTS,SCRAMBLE $(notdir $@))($(MKFIRMWARE) $< $@; \
188         stat=$$?; \
189         if test -n "$(FLASHFILE)"; then \
190           if test "$$stat" -ne 0; then \
191             echo "Image too big, making a compressed version!"; \
192             $(MAKE) -C $(FIRMDIR)/decompressor OBJDIR=$(BUILDDIR)/firmware/decompressor; \
193             $(MKFIRMWARE) $(BUILDDIR)/firmware/decompressor/compressed.bin $@; \
194           fi \
195         fi )
196
197 # archos
198 $(BUILDDIR)/rockbox.ucl: $(BUILDDIR)/rockbox.bin
199         $(call PRINTS,UCLPACK $(@F))$(TOOLSDIR)/uclpack --best --2e -b1048576 $< $@ >/dev/null
200
201 MAXINFILE = $(BUILDDIR)/temp.txt
202 MAXOUTFILE = $(BUILDDIR)/romstart.txt
203
204 $(BUILDDIR)/rombox.ucl: $(BUILDDIR)/rombox.bin $(MAXOUTFILE)
205         $(call PRINTS,UCLPACK $(@F))$(TOOLSDIR)/uclpack --none $< $@ >/dev/null; \
206                 perl $(TOOLSDIR)/romsizetest.pl `cat $(MAXOUTFILE)` $<; \
207                 if test $$? -ne 0; then \
208                   echo "removing UCL file again, making it a fake one"; \
209                   echo "fake" > $@; \
210                 fi
211
212 $(MAXOUTFILE):
213         $(call PRINTS,Creating $(@F))
214         $(SILENT)$(shell echo '#include "config.h"' > $(MAXINFILE))
215         $(SILENT)$(shell echo "ROM_START" >> $(MAXINFILE))
216         $(call preprocess2file,$(MAXINFILE),$(MAXOUTFILE))
217         $(SILENT)rm $(MAXINFILE)
218
219 # iriver
220 $(BUILDDIR)/rombox.iriver: $(BUILDDIR)/rombox.bin
221         $(call PRINTS,Build ROM file)$(MKFIRMWARE) $< $@
222
223 endif # !SIMVER
224 endif # !bootloader
225
226
227 voicetools:
228         $(SILENT)$(MAKE) -C $(TOOLSDIR) CC=$(HOSTCC) AR=$(HOSTAR) rbspeexenc voicefont wavtrim
229
230 tags:
231         $(SILENT)rm -f TAGS
232         $(SILENT)etags -o $(BUILDDIR)/TAGS $(filter-out %.o,$(SRC) $(OTHER_SRC))
233
234 fontzip:
235         $(SILENT)$(TOOLSDIR)/buildzip.pl $(VERBOSEOPT) -m \"$(MODELNAME)\" -r "$(ROOTDIR)" --rbdir="$(RBDIR)" -f 1 -o rockbox-fonts.zip $(TARGET) $(BINARY)
236
237 zip:
238         $(SILENT)$(TOOLSDIR)/buildzip.pl $(VERBOSEOPT) -m \"$(MODELNAME)\" -i \"$(TARGET_ID)\"  -r "$(ROOTDIR)" --rbdir="$(RBDIR)" $(TARGET) $(BINARY)
239
240 mapzip:
241         $(SILENT)find . -name "*.map" | xargs zip rockbox-maps.zip
242
243 fullzip:
244         $(SILENT)$(TOOLSDIR)/buildzip.pl $(VERBOSEOPT) -m \"$(MODELNAME)\" -i \"$(TARGET_ID)\"  -r "$(ROOTDIR)" --rbdir="$(RBDIR)" -f 2 -o rockbox-full.zip $(TARGET) $(BINARY)
245
246 7zip:
247         $(SILENT)$(TOOLSDIR)/buildzip.pl $(VERBOSEOPT) -m \"$(MODELNAME)\" -i \"$(TARGET_ID)\"  -o "rockbox.7z" -z "7za a -mx=9" -r "$(ROOTDIR)" --rbdir="$(RBDIR)" $(TARGET) $(BINARY)
248
249 tar:
250         $(SILENT)rm -f rockbox.tar
251         $(SILENT)$(TOOLSDIR)/buildzip.pl $(VERBOSEOPT) -m \"$(MODELNAME)\" -i \"$(TARGET_ID)\"  -o "rockbox.tar" -z "tar -cf" -r "$(ROOTDIR)" --rbdir="$(RBDIR)" $(TARGET) $(BINARY)
252
253 bzip2: tar
254         $(SILENT)bzip2 -f9 rockbox.tar
255
256 gzip: tar
257         $(SILENT)gzip -f9 rockbox.tar
258
259 manual manual-pdf:
260         $(SILENT)$(MAKE) -C $(MANUALDIR) OBJDIR=$(BUILDDIR)/manual manual-pdf
261 manual-html:
262         $(SILENT)$(MAKE) -C $(MANUALDIR) OBJDIR=$(BUILDDIR)/manual manual-html
263 manual-zhtml: manual-zip
264 manual-txt:
265         $(SILENT)$(MAKE) -C $(MANUALDIR) OBJDIR=$(BUILDDIR)/manual manual-txt
266 manual-ztxt:
267         $(SILENT)$(MAKE) -C $(MANUALDIR) OBJDIR=$(BUILDDIR)/manual manual-txt-zip
268 manual-zip:
269         $(SILENT)$(MAKE) -C $(MANUALDIR) OBJDIR=$(BUILDDIR)/manual manual-zip
270
271 ifdef TTS_ENGINE
272
273 voice: voicetools features
274         $(SILENT)for f in `cat $(BUILDDIR)/apps/features`; do feat="$$feat:$$f" ; done ; \
275         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 \
276
277 endif
278
279 bininstall: $(BUILDDIR)/$(BINARY)
280         @echo "Installing your rockbox binary in your '$(PREFIX)' dir"
281         $(SILENT)cp $(BINARY) $(PREFIX)/.rockbox/
282
283 install:
284         @echo "Installing your build in your '$(PREFIX)' dir"
285         $(SILENT)$(TOOLSDIR)/buildzip.pl $(VERBOSEOPT) -m "$(MODELNAME)" -i "$(TARGET_ID)" $(INSTALL) -z "zip -r0" -r "$(ROOTDIR)" --rbdir="$(RBDIR)" -f 0 $(TARGET) $(BINARY)
286
287 fullinstall:
288         @echo "Installing a full setup in your '$(PREFIX)' dir"
289         $(SILENT)$(TOOLSDIR)/buildzip.pl $(VERBOSEOPT) -m "$(MODELNAME)" -i "$(TARGET_ID)" $(INSTALL) -z "zip -r0" -r "$(ROOTDIR)" --rbdir="$(RBDIR)" -f 2 $(TARGET) $(BINARY)
290
291 help:
292         @echo "A few helpful make targets"
293         @echo ""
294         @echo "all         - builds a full Rockbox (default), including tools"
295         @echo "bin         - builds only the Rockbox.<target name> file"
296         @echo "rocks       - builds only plugins"
297         @echo "codecs      - builds only codecs"
298         @echo "dep         - regenerates make dependency database"
299         @echo "clean       - cleans a build directory (not tools)"
300         @echo "veryclean   - cleans the build and tools directories"
301         @echo "manual      - builds a manual (pdf)"
302         @echo "manual-html - HTML manual"
303         @echo "manual-zip  - HTML manual (zipped)"
304         @echo "manual-txt  - txt manual"
305         @echo "fullzip     - creates a rockbox.zip of your build with fonts"
306         @echo "zip         - creates a rockbox.zip of your build (no fonts)"
307         @echo "gzip        - creates a rockbox.tar.gz of your build (no fonts)"
308         @echo "bzip2       - creates a rockbox.tar.bz2 of your build (no fonts)"
309         @echo "7zip        - creates a rockbox.7z of your build (no fonts)"
310         @echo "fontzip     - creates rockbox-fonts.zip"
311         @echo "mapzip      - creates rockbox-maps.zip with all .map files"
312         @echo "tools       - builds the tools only"
313         @echo "voice       - creates the voice clips (voice builds only)"
314         @echo "voicetools  - builds the voice tools only"
315         @echo "install     - installs your build (at PREFIX, defaults to simdisk/ for simulators (no fonts))"
316         @echo "fullinstall - installs your build (like install, but with fonts)"
317         @echo "reconf      - rerun configure with the same selection"
318
319 ### general compile rules:
320
321 # when source and object are in different locations (normal):
322 $(BUILDDIR)/%.o: $(ROOTDIR)/%.c
323         $(SILENT)mkdir -p $(dir $@)
324         $(call PRINTS,CC $(subst $(ROOTDIR)/,,$<))$(CC) $(CFLAGS) -c $< -o $@
325
326 $(BUILDDIR)/%.o: $(ROOTDIR)/%.S
327         $(SILENT)mkdir -p $(dir $@)
328         $(call PRINTS,CC $(subst $(ROOTDIR)/,,$<))$(CC) $(CFLAGS) -c $< -o $@
329
330 # generated definitions for use in .S files
331 $(BUILDDIR)/%_asmdefs.h: $(ROOTDIR)/%_asmdefs.c
332         $(call PRINTS,ASMDEFS $(@F))
333         $(SILENT)mkdir -p $(dir $@)
334         $(call asmdefs2file,$<,$@)
335
336 # when source and object are both in BUILDDIR (generated code):
337 %.o: %.c
338         $(SILENT)mkdir -p $(dir $@)
339         $(call PRINTS,CC $(subst $(ROOTDIR)/,,$<))$(CC) $(CFLAGS) -c $< -o $@
340
341 %.o: %.S
342         $(SILENT)mkdir -p $(dir $@)
343         $(call PRINTS,CC $(subst $(ROOTDIR)/,,$<))$(CC) $(CFLAGS) -c $< -o $@
344
345 Makefile: $(TOOLSDIR)/configure
346 ifneq (reconf,$(MAKECMDGOALS))
347         $(SILENT)echo "*** tools/configure is newer than Makefile. You should run 'make reconf'."
348 endif
349
350 reconf:
351         $(SILENT$)PREFIX=$(PREFIX) $(TOOLSDIR)/configure $(CONFIGURE_OPTIONS)