Makefile 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. #pngcrush -rem iTXt -rem tEXt -d out *.png
  2. PREFIX = $(DEVKITPPC)/bin/powerpc-eabi-
  3. CC = $(PREFIX)gcc
  4. AS = $(PREFIX)as
  5. OBJCOPY = $(PREFIX)objcopy
  6. ELF2DOL =$(DEVKITPPC)/bin/elf2dol
  7. GDB = $(PREFIX)gdb
  8. BIN2S = $(DEVKITPPC)/bin/bin2s
  9. TARGET_STUB = stub
  10. TARGET_APP = channelapp
  11. TARGET_CHAN = channelapp-channel
  12. WIIPAX = ../../wiipax/client/wiipax
  13. BASE_ADDR = 0x81330000
  14. DIR_STUB = stub
  15. DIR_SRC = source
  16. DIR_DATA = data
  17. DIR_DATA_CRYPT = $(DIR_DATA)/crypt
  18. DIR_I18N = i18n
  19. DIR_BUILD = build
  20. DIR_BUILD_CHAN = $(DIR_BUILD)/channel
  21. DIR_INCLUDES = $(DIR_BUILD) \
  22. $(DEVKITPRO)/libogc/include \
  23. $(DEVKITPRO)/portlibs/ppc/include \
  24. $(DEVKITPRO)/portlibs/ppc/include/freetype2
  25. DIR_LIBS = \
  26. $(DEVKITPRO)/libogc/lib/wii \
  27. $(DEVKITPRO)/portlibs/ppc/lib
  28. LIBS = fat wiiuse bte mxml png15 z ogc m db freetype
  29. MACHDEP = -g -DGEKKO -mrvl -mcpu=750 -meabi -mhard-float
  30. CFLAGS = $(MACHDEP) -Os -Wall -DBASE_ADDR=$(BASE_ADDR) $(DIR_INCLUDES:%=-I%)
  31. # using -Os for the stub makes it dependent on libgcc
  32. CFLAGS_STUB = $(MACHDEP) -O2 -Wall -DBASE_ADDR=$(BASE_ADDR) $(DIR_INCLUDES:%=-I%)
  33. ASFLAGS = -D_LANGUAGE_ASSEMBLY -DHW_RVL
  34. LDFLAGS_STUB = $(MACHDEP) -Wl,--section-start,.init=0x80001800 -nostartfiles -nodefaultlibs
  35. LDFLAGS_APP = $(MACHDEP) -specs=newrvl.spec -Wl,--section-start,.init=$(BASE_ADDR) \
  36. $(DIR_LIBS:%=-L%) $(LIBS:%=-l%) -Wl,-Map,channelapp.map
  37. LDFLAGS_CHAN = $(MACHDEP) -specs=newrvl.spec -Wl,--section-start,.init=$(BASE_ADDR) -Wl,-e,_stub_start $(DIR_LIBS:%=-L%) $(LIBS:%=-l%) -Wl,-Map,channelapp_chan.map
  38. FILES_STUB = $(wildcard $(DIR_STUB)/*.S) $(wildcard $(DIR_STUB)/*.c)
  39. FILES_STUB_OBJx = $(FILES_STUB:$(DIR_STUB)/%.S=$(DIR_BUILD)/%.o)
  40. FILES_STUB_OBJ = $(FILES_STUB_OBJx:$(DIR_STUB)/%.c=$(DIR_BUILD)/%.o)
  41. BANNER_BIN = banner/banner.bin
  42. BANNER_OBJ = $(DIR_BUILD)/banner_bin.o
  43. FILES_TTF = $(wildcard $(DIR_DATA)/*.ttf)
  44. FILES_TTF_OBJ = $(FILES_TTF:$(DIR_DATA)/%.ttf=$(DIR_BUILD)/%_ttf.o)
  45. FILES_PNG = $(wildcard $(DIR_DATA)/*.png)
  46. FILES_PNG_OBJ = $(FILES_PNG:$(DIR_DATA)/%.png=$(DIR_BUILD)/%_png.o)
  47. POTPL = $(DIR_I18N)/template.pot
  48. POTPL_MRG = $(DIR_I18N)/template.merge.pot
  49. FILES_PO = $(wildcard $(DIR_I18N)/*.po)
  50. FILES_PO_ENC = $(FILES_PO:$(DIR_I18N)/%.po=$(DIR_BUILD)/%.enc.po)
  51. FILES_MO = $(FILES_PO_ENC:$(DIR_BUILD)/%.enc.po=$(DIR_BUILD)/%.mo)
  52. FILES_MO_OBJ = $(FILES_MO:$(DIR_BUILD)/%.mo=$(DIR_BUILD)/%_mo.o)
  53. ENCODING = utf-8
  54. FILES_PO_MRG = $(FILES_PO:$(DIR_I18N)/%.po=$(DIR_I18N)/merge/%.po)
  55. FILES_SRC = $(wildcard $(DIR_SRC)/*.c)
  56. FILES_SRC_OBJ = $(FILES_SRC:$(DIR_SRC)/%.c=$(DIR_BUILD)/%.o) \
  57. $(DIR_BUILD)/$(TARGET_STUB)_bin.o $(BANNER_OBJ) \
  58. $(FILES_PNG_OBJ) $(FILES_MO_OBJ) $(FILES_TTF_OBJ)
  59. FILES_CHAN = $(DIR_CHAN)/nandloader.S
  60. FILES_CHAN_OBJ = $(DIR_BUILD)/nandloader.o $(FILES_SRC_OBJ)
  61. .PHONY: all channel world clean upload gdb debug
  62. all:
  63. @[ -d $(DIR_BUILD) ] || mkdir $(DIR_BUILD)
  64. @$(MAKE) --no-print-directory data
  65. @$(MAKE) --no-print-directory $(TARGET_APP).elf
  66. channel:
  67. @$(MAKE) --no-print-directory all
  68. @$(MAKE) --no-print-directory $(TARGET_CHAN).dol
  69. world:
  70. @$(MAKE) --no-print-directory all
  71. @$(MAKE) --no-print-directory $(TARGET_CHAN).dol
  72. data: $(BANNER_OBJ) $(FILES_PNG_OBJ) $(FILES_MO_OBJ) \
  73. $(FILES_PNG_INT_OBJ) $(FILES_INT_OBJ) \
  74. $(FILES_TTF_OBJ)
  75. %.bin: %.elf
  76. @echo $(@F)
  77. @$(OBJCOPY) -O binary $< $@
  78. %.dol: %.elf $(ELF2DOL)
  79. @echo $(@F)
  80. @$(ELF2DOL) $< $@
  81. $(TARGET_STUB).elf: $(FILES_STUB_OBJ)
  82. @echo $(@F)
  83. @$(CC) $(FILES_STUB_OBJ) $(LDFLAGS_STUB) -o $@
  84. $(TARGET_APP)_nopax.elf: $(FILES_SRC_OBJ) newrvl.ld
  85. @echo $(@F)
  86. @$(CC) $(FILES_SRC_OBJ) $(LDFLAGS_APP) -o $@
  87. $(TARGET_APP).elf: $(TARGET_APP)_nopax.elf
  88. @$(WIIPAX) -s devkitfail $< $@
  89. $(TARGET_CHAN).elf: $(TARGET_APP)_nopax.elf
  90. @echo $(@F)
  91. @$(WIIPAX) -s dkfailchannel $< $@
  92. $(DIR_BUILD)/$(TARGET_STUB)_bin.o: $(TARGET_STUB).bin
  93. @echo $(@F)
  94. @$(BIN2S) -a 32 $< | $(AS) -o $@
  95. $(BANNER_BIN):
  96. @$(MAKE) -C banner
  97. $(BANNER_OBJ): $(BANNER_BIN)
  98. @echo $(@F)
  99. @$(BIN2S) -a 32 $< | $(AS) -o $@
  100. @echo "extern const u8 $(<F:%.bin=%_bin)[];" > $(@:%.o=%.h)
  101. @echo "extern const u8 $(<F:%.bin=%_bin)_end;" >> $(@:%.o=%.h)
  102. @echo "extern const u32 $(<F:%.bin=%_bin)_size;" >> $(@:%.o=%.h)
  103. $(DIR_BUILD)/%_png.o: $(DIR_DATA)/%.png
  104. @echo $(@F)
  105. @$(BIN2S) -a 32 $< | $(AS) -o $@
  106. @echo "extern const u8 $(<F:%.png=%_png)[];" > $(@:%.o=%.h)
  107. @echo "extern const u8 $(<F:%.png=%_png)_end;" >> $(@:%.o=%.h)
  108. @echo "extern const u32 $(<F:%.png=%_png)_size;" >> $(@:%.o=%.h)
  109. $(DIR_BUILD)/%_ttf.o: $(DIR_DATA)/%.ttf
  110. @echo $(@F)
  111. @$(BIN2S) -a 32 $< | $(AS) -o $@
  112. @echo "extern const u8 $(<F:%.ttf=%_ttf)[];" > $(@:%.o=%.h)
  113. @echo "extern const u8 $(<F:%.ttf=%_ttf)_end;" >> $(@:%.o=%.h)
  114. @echo "extern const u32 $(<F:%.ttf=%_ttf)_size;" >> $(@:%.o=%.h)
  115. $(DIR_BUILD)/%_mo.o: $(DIR_BUILD)/%.mo
  116. @echo $(@F)
  117. @$(BIN2S) -a 32 $< | $(AS) -o $@
  118. @echo "extern const u8 $(<F:%.mo=%_mo)[];" > $(@:%.o=%.h)
  119. @echo "extern const u8 $(<F:%.mo=%_mo)_end;" >> $(@:%.o=%.h)
  120. @echo "extern const u32 $(<F:%.mo=%_mo)_size;" >> $(@:%.o=%.h)
  121. $(DIR_BUILD)/%.o: $(DIR_INT)/%
  122. @echo $(@F)
  123. @$(BIN2S) -a 32 $< | $(AS) -o $@
  124. @echo "extern const u8 $(subst .,_,$(<F))[];" > $(@:%.o=%.h)
  125. @echo "extern const u8 $(subst .,_,$(<F))_end;" >> $(@:%.o=%.h)
  126. @echo "extern const u32 $(subst .,_,$(<F))_size;" >> $(@:%.o=%.h)
  127. $(DIR_BUILD)/%.mo: $(DIR_BUILD)/%.enc.po
  128. @echo $(@F)
  129. @msgfmt --no-hash -o $@ $<
  130. $(DIR_BUILD)/%.enc.po: $(DIR_I18N)/%.po
  131. @echo $(@F)
  132. @msgconv -t $(ENCODING) -o $@ $<
  133. $(DIR_BUILD)/%.o: $(DIR_STUB)/%.c
  134. @echo $(@F)
  135. @$(CC) $(CFLAGS_STUB) -MMD -MP -MF $(@:%.o=%.d) -c $< -o $@
  136. $(DIR_BUILD)/%.o: $(DIR_STUB)/%.S
  137. @echo $(@F)
  138. @$(CC) $(ASFLAGS) -c $< -o $@
  139. $(DIR_BUILD)/%.o: $(DIR_SRC)/%.c
  140. @echo $(@F)
  141. @$(CC) $(CFLAGS) -MMD -MP -MF $(@:%.o=%.d) -c $< -o $@
  142. -include $(FILES_SRC_OBJ:%.o=%.d)
  143. clean:
  144. rm -rf $(DIR_BUILD) \
  145. *.elf *.dol *.bin *.map i18n/merge/* $(POTPL).gen
  146. @$(MAKE) -C banner clean
  147. wiiload:
  148. @$(MAKE) --no-print-directory all
  149. @$(DEVKITPPC)/bin/wiiload $(TARGET_APP).elf
  150. upload: wiiload
  151. $(POTPL).gen: source/*.c
  152. @echo "GETTEXT $(POTPL).gen"
  153. @xgettext --from-code=UTF-8 -C -o $(POTPL).gen --keyword=_ source/*.c
  154. @sed -i.bak s/CHARSET/UTF-8/g $(POTPL).gen
  155. $(POTPL): $(POTPL).gen
  156. @echo "MERGE $(POTPL_MRG)"
  157. @msgmerge $(POTPL) $(POTPL).gen > $(POTPL_MRG)
  158. @mv -v $(POTPL_MRG) $(POTPL)
  159. @rm $(POTPL).gen.bak
  160. genmsgs: $(POTPL)
  161. msgmerge: $(POTPL) $(FILES_PO_MRG)
  162. movemerge:
  163. @mv -v i18n/merge/* i18n
  164. msgupdate: msgmerge movemerge msgstats
  165. %.postats: %.po
  166. @echo -n "$<: "
  167. @msgfmt --statistics -o /dev/null $<
  168. msgstats: $(FILES_PO:%.po=%.postats)
  169. msgmergestats: msgmerge $(FILES_PO_MRG:%.po=%.postats)
  170. $(DIR_I18N)/merge/%.po : $(DIR_I18N)/%.po $(POTPL)
  171. @[ ! -d $(DIR_I18N)/merge ] && mkdir -p $(DIR_I18N)/merge || true
  172. @echo "MERGE $(@F)"
  173. @msgmerge -o $@ $(@:$(DIR_I18N)/merge/%.po=$(DIR_I18N)/%.po) $(POTPL)
  174. gdb:
  175. $(GDB) -n $(TARGET_APP)_nopax.elf
  176. debug:
  177. $(GDB) -n $(TARGET_APP)_nopax.elf -x gdb.txt