freemyipod r535 - Code Review

Jump to: navigation, search
Repository:freemyipod
Revision:r534‎ | r535 | r536 >
Date:14:45, 6 February 2011
Author:theseven
Status:new
Tags:
Comment:
Fork boot menu app for iPod Nano 2G
Modified paths:
  • /apps/bootmenu-ipodnano2g (added) (history)

Diff [purge]

Index: apps/bootmenu-ipodnano2g/SOURCES
@@ -0,0 +1 @@
 2+main.c
Index: apps/bootmenu-ipodnano2g/ls.x
@@ -0,0 +1,42 @@
 2+ENTRY(__emcore_entrypoint)
 3+OUTPUT_FORMAT(elf32-littlearm)
 4+OUTPUT_ARCH(arm)
 5+
 6+MEMORY
 7+{
 8+ VIRTUAL : ORIGIN = 0x00000000, LENGTH = 0x10000000
 9+}
 10+
 11+SECTIONS
 12+{
 13+ .text :
 14+ {
 15+ __emcore_app_base = .;
 16+ KEEP(.emcoreentrypoint*)
 17+ *(.emcoreentrypoint*)
 18+ *(.text*)
 19+ *(.glue_7)
 20+ *(.glue_7t)
 21+ . = ALIGN(0x10);
 22+ } > VIRTUAL
 23+
 24+ .data :
 25+ {
 26+ *(.rodata*)
 27+ . = ALIGN(0x4);
 28+ *(.data*)
 29+ . = ALIGN(0x4);
 30+ } > VIRTUAL
 31+
 32+ .bss (NOLOAD) :
 33+ {
 34+ *(.bss*)
 35+ *(COMMON)
 36+ } > VIRTUAL
 37+
 38+ /DISCARD/ :
 39+ {
 40+ *(.eh_frame)
 41+ }
 42+
 43+}
Index: apps/bootmenu-ipodnano2g/images/icons.psd
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: apps/bootmenu-ipodnano2g/images/icons.psd
Property changes on: apps/bootmenu-ipodnano2g/images/icons.psd
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
 44+application/octet-stream
\ No newline at end of property
Index: apps/bootmenu-ipodnano2g/images/background.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: apps/bootmenu-ipodnano2g/images/background.png
Property changes on: apps/bootmenu-ipodnano2g/images/background.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
 45+application/octet-stream
\ No newline at end of property
Index: apps/bootmenu-ipodnano2g/images/background.psd
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: apps/bootmenu-ipodnano2g/images/background.psd
Property changes on: apps/bootmenu-ipodnano2g/images/background.psd
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
 46+application/octet-stream
\ No newline at end of property
Index: apps/bootmenu-ipodnano2g/images/rockbox.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: apps/bootmenu-ipodnano2g/images/rockbox.png
Property changes on: apps/bootmenu-ipodnano2g/images/rockbox.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
 47+application/octet-stream
\ No newline at end of property
Index: apps/bootmenu-ipodnano2g/images/rockbox.psd
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: apps/bootmenu-ipodnano2g/images/rockbox.psd
Property changes on: apps/bootmenu-ipodnano2g/images/rockbox.psd
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
 48+application/octet-stream
\ No newline at end of property
Index: apps/bootmenu-ipodnano2g/images/icons.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: apps/bootmenu-ipodnano2g/images/icons.png
Property changes on: apps/bootmenu-ipodnano2g/images/icons.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
 49+application/octet-stream
\ No newline at end of property
Index: apps/bootmenu-ipodnano2g/main.c
@@ -0,0 +1,358 @@
 2+#include "emcoreapp.h"
 3+#include "libboot.h"
 4+#include "libpng.h"
 5+#include "libui.h"
 6+
 7+
 8+void* framebuf;
 9+
 10+
 11+bool mychooser_preblit(struct chooser_data* data)
 12+{
 13+ char buf[4];
 14+ struct chooser_action_handler_wheel_data* adata;
 15+ adata = (struct chooser_action_handler_wheel_data*)(data->actionhandlerdata);
 16+ snprintf(buf, sizeof(buf), "%3d", adata->timeout_remaining / 1000000);
 17+ rendertext(framebuf, 302, 232, 320, 0xffffcccc, 0, buf);
 18+ return false;
 19+}
 20+
 21+
 22+struct chooser_renderer_iconflow_itemdata mychooser_rparams_0 =
 23+{
 24+ .icon = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 80), LIBUI_POINT(0, 56)),
 25+ LIBUI_POINT(80, 72)),
 26+ .icon_selected = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 80), LIBUI_POINT(0, 56)),
 27+ LIBUI_POINT(80, 72)),
 28+ .text = "Power off",
 29+ .text_color = 0xffffcccc,
 30+};
 31+
 32+struct chooser_renderer_iconflow_itemdata mychooser_rparams_1 =
 33+{
 34+ .icon = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 80), LIBUI_POINT(0, 0)),
 35+ LIBUI_POINT(80, 25)),
 36+ .icon_selected = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 80), LIBUI_POINT(0, 0)),
 37+ LIBUI_POINT(80, 25)),
 38+ .text = "Rockbox",
 39+ .text_color = 0xffffcccc,
 40+};
 41+
 42+struct chooser_renderer_iconflow_itemdata mychooser_rparams_2 =
 43+{
 44+ .icon = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 80), LIBUI_POINT(0, 25)),
 45+ LIBUI_POINT(80, 31)),
 46+ .icon_selected = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 80), LIBUI_POINT(0, 25)),
 47+ LIBUI_POINT(80, 31)),
 48+ .text = "emCORE console",
 49+ .text_color = 0xffffcccc,
 50+};
 51+
 52+struct chooser_renderer_iconflow_itemdata mychooser_rparams_3 =
 53+{
 54+ .icon = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 80), LIBUI_POINT(0, 130)),
 55+ LIBUI_POINT(80, 55)),
 56+ .icon_selected = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 80), LIBUI_POINT(0, 130)),
 57+ LIBUI_POINT(80, 55)),
 58+ .text = "UMSboot",
 59+ .text_color = 0xffffcccc,
 60+};
 61+
 62+struct chooser_renderer_iconflow_params mychooser_rparams =
 63+{
 64+ .version = CHOOSER_RENDERER_LIST_PARAMS_VERSION,
 65+ .copy_dest = LIBUI_LOCATION(LIBUI_BUFFER(NULL, 320), LIBUI_POINT(0, 0)),
 66+ .copy_src = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 320), LIBUI_POINT(0, 0)),
 67+ LIBUI_POINT(320, 240)),
 68+ .bg_dest = LIBUI_LOCATION(LIBUI_BUFFER(NULL, 0), LIBUI_POINT(0, 0)),
 69+ .bg_src = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 0), LIBUI_POINT(0, 0)),
 70+ LIBUI_POINT(0, 0)),
 71+ .bg_opacity = 0,
 72+ .fill_dest = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 0), LIBUI_POINT(0, 0)),
 73+ LIBUI_POINT(0, 0)),
 74+ .fill_color = 0,
 75+ .viewport = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 320), LIBUI_POINT(0, 30)),
 76+ LIBUI_POINT(320, 130)),
 77+ .text_pos = LIBUI_POINT(160, 215),
 78+ .blit_dest = LIBUI_POINT(0, 0),
 79+ .blit_src = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 320), LIBUI_POINT(0, 0)),
 80+ LIBUI_POINT(320, 240)),
 81+ .smoothness = 500000,
 82+ .startposition = -3,
 83+ .iconsinview = 4,
 84+ .preblit = mychooser_preblit,
 85+ .postblit = NULL
 86+};
 87+
 88+struct chooser_action_handler_wheel_params mychooser_aparams =
 89+{
 90+ .version = CHOOSER_ACTION_HANDLER_WHEEL_PARAMS_VERSION,
 91+ .stepsperitem = 512,
 92+ .eventfilter = NULL,
 93+ .timeout_initial = 30500000,
 94+ .timeout_idle = 300500000,
 95+ .timeout_item = 0,
 96+ .tick_force_redraw = true,
 97+ .buttoncount = 3,
 98+ .buttonmap =
 99+ {
 100+ CHOOSER_ACTION_HANDLER_WHEEL_ACTION_SELECT,
 101+ CHOOSER_ACTION_HANDLER_WHEEL_ACTION_NEXT,
 102+ CHOOSER_ACTION_HANDLER_WHEEL_ACTION_PREV
 103+ }
 104+};
 105+
 106+struct chooser_info mychooser =
 107+{
 108+ .version = CHOOSER_INFO_VERSION,
 109+ .actionhandler = NULL,
 110+ .actionhandlerparams = &mychooser_aparams,
 111+ .renderer = NULL,
 112+ .rendererparams = &mychooser_rparams,
 113+ .userparams = NULL,
 114+ .tickinterval = 990000,
 115+ .itemcount = 4,
 116+ .defaultitem = 1,
 117+ .items =
 118+ {
 119+ {
 120+ .user = (void*)0,
 121+ .actionparams = NULL,
 122+ .renderparams = &mychooser_rparams_0
 123+ },
 124+ {
 125+ .user = (void*)1,
 126+ .actionparams = NULL,
 127+ .renderparams = &mychooser_rparams_1
 128+ },
 129+ {
 130+ .user = (void*)2,
 131+ .actionparams = NULL,
 132+ .renderparams = &mychooser_rparams_2
 133+ },
 134+ {
 135+ .user = (void*)3,
 136+ .actionparams = NULL,
 137+ .renderparams = &mychooser_rparams_3
 138+ }
 139+ }
 140+};
 141+
 142+
 143+static void main()
 144+{
 145+ struct emcorelib_header* libboot = get_library(0x4c424365, LIBBOOT_API_VERSION, LIBSOURCE_BOOTFLASH, "libboot ");
 146+ if (!libboot) panicf(PANIC_KILLTHREAD, "Could not load booting library!");
 147+ struct libboot_api* boot = (struct libboot_api*)libboot->api;
 148+ struct emcorelib_header* libpng = get_library(0x64474e50, LIBPNG_API_VERSION, LIBSOURCE_BOOTFLASH, "libpng ");
 149+ if (!libpng) panicf(PANIC_KILLTHREAD, "Could not load PNG decoder library!");
 150+ struct libpng_api* png = (struct libpng_api*)libpng->api;
 151+ struct emcorelib_header* libui = get_library(0x49554365, LIBUI_API_VERSION, LIBSOURCE_BOOTFLASH, "libui ");
 152+ if (!libui) panicf(PANIC_KILLTHREAD, "Could not load user interface library!");
 153+ struct libui_api* ui = (struct libui_api*)libui->api;
 154+ int size = bootflash_filesize("backgrnd");
 155+ if (size == -1) panicf(PANIC_KILLTHREAD, "Could not find background image!");
 156+ void* buf = memalign(0x10, size);
 157+ if (!buf) panicf(PANIC_KILLTHREAD, "Could not allocate buffer for background image!");
 158+ bootflash_read("backgrnd", buf, 0, size);
 159+ struct png_info* handle = png->png_open(buf, size);
 160+ if (!handle) panicf(PANIC_KILLTHREAD, "Could not parse background image!");
 161+ struct png_rgb* bg = png->png_decode_rgb(handle);
 162+ if (!bg) panicf(PANIC_KILLTHREAD, "Could not decode background image!");
 163+ png->png_destroy(handle);
 164+ free(buf);
 165+ size = bootflash_filesize("iconset ");
 166+ if (size == -1) panicf(PANIC_KILLTHREAD, "Could not find icon set!");
 167+ buf = memalign(0x10, size);
 168+ if (!buf) panicf(PANIC_KILLTHREAD, "Could not allocate buffer for icon set!");
 169+ bootflash_read("iconset ", buf, 0, size);
 170+ handle = png->png_open(buf, size);
 171+ if (!handle) panicf(PANIC_KILLTHREAD, "Could not parse icon set!");
 172+ struct png_rgba* icons = png->png_decode_rgba(handle);
 173+ if (!icons) panicf(PANIC_KILLTHREAD, "Could not decode icon set!");
 174+ png->png_destroy(handle);
 175+ free(buf);
 176+ size = bootflash_filesize("rbxlogo ");
 177+ if (size == -1) panicf(PANIC_KILLTHREAD, "Could not find Rockbox logo!");
 178+ buf = memalign(0x10, size);
 179+ if (!buf) panicf(PANIC_KILLTHREAD, "Could not allocate buffer for Rockbox logo!");
 180+ bootflash_read("rbxlogo ", buf, 0, size);
 181+ handle = png->png_open(buf, size);
 182+ if (!handle) panicf(PANIC_KILLTHREAD, "Could not parse Rockbox logo!");
 183+ struct png_rgb* rbxlogo = png->png_decode_rgb(handle);
 184+ if (!rbxlogo) panicf(PANIC_KILLTHREAD, "Could not decode Rockbox logo!");
 185+ png->png_destroy(handle);
 186+ free(buf);
 187+ framebuf = malloc(320 * 240 * 3);
 188+ if (!framebuf) panicf(PANIC_KILLTHREAD, "Could not allocate framebuffer!");
 189+ mychooser.actionhandler = ui->chooser_action_handler_wheel;
 190+ mychooser.renderer = ui->chooser_renderer_iconflow;
 191+ mychooser_rparams.copy_dest.buf.addr = framebuf;
 192+ mychooser_rparams.copy_src.loc.buf.addr = bg;
 193+ mychooser_rparams.viewport.loc.buf.addr = framebuf;
 194+ mychooser_rparams.blit_src.loc.buf.addr = framebuf;
 195+ mychooser_rparams_0.icon.loc.buf.addr = icons;
 196+ mychooser_rparams_0.icon_selected.loc.buf.addr = icons;
 197+ mychooser_rparams_1.icon.loc.buf.addr = icons;
 198+ mychooser_rparams_1.icon_selected.loc.buf.addr = icons;
 199+ mychooser_rparams_2.icon.loc.buf.addr = icons;
 200+ mychooser_rparams_2.icon_selected.loc.buf.addr = icons;
 201+ mychooser_rparams_3.icon.loc.buf.addr = icons;
 202+ mychooser_rparams_3.icon_selected.loc.buf.addr = icons;
 203+ void* firmware = NULL;
 204+ while (!firmware)
 205+ {
 206+ const struct chooser_item* result = ui->chooser_run(&mychooser);
 207+ switch ((int)(result->user))
 208+ {
 209+ case 0:
 210+ shutdown(true);
 211+ power_off();
 212+ break;
 213+ case 1:
 214+ {
 215+ int i;
 216+ for (i = 0; i <= 300; i += 60)
 217+ {
 218+ if (i < 300)
 219+ ui->blend(320, 240, 50, framebuf, 0, 0, 320,
 220+ framebuf, 0, 0, 320, bg, 0, 0, 320);
 221+ else memcpy(framebuf, bg, 320 * 240 * 3);
 222+ ui->blit(MIN(280, i), 86, 3, framebuf, 320 - i, 10, 320, rbxlogo, 0, 0, 280);
 223+ displaylcd(0, 0, 320, 240, framebuf, 0, 0, 320);
 224+ }
 225+ int fd = file_open("/.rockbox/rockbox.ipod", O_RDONLY);
 226+ if (fd > 0)
 227+ {
 228+ size = filesize(fd);
 229+ if (size > 0)
 230+ {
 231+ void* buf = memalign(0x10, size);
 232+ if (buf)
 233+ {
 234+ if (read(fd, buf, size) == size)
 235+ if (!boot->verify_rockbox_checksum(buf, size))
 236+ firmware = buf;
 237+ if (!firmware) free(buf);
 238+ }
 239+ }
 240+ close(fd);
 241+ }
 242+ if (!firmware)
 243+ {
 244+ rendertext(framebuf, 76, 140, 320, 0xff3333ff, 0xa0000000, "Loading rockbox.ipod failed!");
 245+ rendertext(framebuf, 76, 148, 320, 0xff3333ff, 0xa0000000, " Trying fallback image... ");
 246+ displaylcd(0, 0, 320, 240, framebuf, 0, 0, 320);
 247+ sleep(5000000);
 248+ size = bootflash_filesize("rockbox ");
 249+ if (size > 0)
 250+ {
 251+ void* buf = memalign(0x10, size);
 252+ if (buf)
 253+ {
 254+ bootflash_read("rockbox ", buf, 0, size);
 255+ if (bootflash_attributes("rockbox ") & 0x800)
 256+ {
 257+ void* buf2 = malloc(0x100000);
 258+ if (buf2)
 259+ {
 260+ if (!ucl_decompress(buf, size, buf2, (uint32_t*)&size))
 261+ {
 262+ free(buf);
 263+ buf = realloc(buf2, size);
 264+ if (!buf) buf = buf2;
 265+ if (!boot->verify_rockbox_checksum(buf, size))
 266+ firmware = buf;
 267+ else free(buf);
 268+ }
 269+ else
 270+ {
 271+ free(buf2);
 272+ free(buf);
 273+ }
 274+ }
 275+ else free(buf);
 276+ }
 277+ else
 278+ {
 279+ if (!boot->verify_rockbox_checksum(buf, size)) firmware = buf;
 280+ else free(buf);
 281+ }
 282+ }
 283+ }
 284+ }
 285+ if (!firmware)
 286+ {
 287+ memcpy(framebuf, bg, 320 * 240 * 3);
 288+ rendertext(framebuf, 91, 140, 320, 0xff3333ff, 0xa0000000, "Loading Rockbox failed!");
 289+ rendertext(framebuf, 91, 148, 320, 0xff3333ff, 0xa0000000, "Returning to main menu.");
 290+ displaylcd(0, 0, 320, 240, framebuf, 0, 0, 320);
 291+ sleep(5000000);
 292+ }
 293+ break;
 294+ }
 295+ case 2:
 296+ goto leave;
 297+ case 3:
 298+ size = bootflash_filesize("umsboot ");
 299+ if (size > 0)
 300+ {
 301+ void* buf = memalign(0x10, size);
 302+ if (buf)
 303+ {
 304+ bootflash_read("umsboot ", buf, 0, size);
 305+ if (bootflash_attributes("umsboot ") & 0x800)
 306+ {
 307+ void* buf2 = malloc(0x10000);
 308+ if (buf2)
 309+ {
 310+ if (!ucl_decompress(buf, size, buf2, (uint32_t*)&size))
 311+ {
 312+ free(buf);
 313+ buf = realloc(buf2, size);
 314+ if (!buf) buf = buf2;
 315+ firmware = buf;
 316+ }
 317+ else
 318+ {
 319+ free(buf2);
 320+ free(buf);
 321+ }
 322+ }
 323+ else free(buf);
 324+ }
 325+ else firmware = buf;
 326+ }
 327+ }
 328+ if (!firmware)
 329+ {
 330+ memcpy(framebuf, bg, 320 * 240 * 3);
 331+ rendertext(framebuf, 91, 140, 320, 0xff3333ff, 0xa0000000, "Loading UMSboot failed!");
 332+ rendertext(framebuf, 91, 148, 320, 0xff3333ff, 0xa0000000, "Returning to main menu.");
 333+ displaylcd(0, 0, 320, 240, framebuf, 0, 0, 320);
 334+ sleep(5000000);
 335+ }
 336+ break;
 337+ }
 338+ }
 339+leave:
 340+ free(framebuf);
 341+ free(rbxlogo);
 342+ free(icons);
 343+ free(bg);
 344+ release_library(libui);
 345+ library_unload(libui);
 346+ release_library(libpng);
 347+ library_unload(libpng);
 348+ release_library(libboot);
 349+ library_unload(libboot);
 350+ if (firmware)
 351+ {
 352+ shutdown(false);
 353+ execfirmware((void*)0x08000000, firmware, size);
 354+ }
 355+ else cputs(3, "Dropped into emCORE console.\n");
 356+}
 357+
 358+
 359+EMCORE_APP_HEADER("Boot menu", main, 127)
Index: apps/bootmenu-ipodnano2g/version.h
@@ -0,0 +1,36 @@
 2+//
 3+//
 4+// Copyright 2010 TheSeven
 5+//
 6+//
 7+// This file is part of emBIOS.
 8+//
 9+// emBIOS is free software: you can redistribute it and/or
 10+// modify it under the terms of the GNU General Public License as
 11+// published by the Free Software Foundation, either version 2 of the
 12+// License, or (at your option) any later version.
 13+//
 14+// emBIOS is distributed in the hope that it will be useful,
 15+// but WITHOUT ANY WARRANTY; without even the implied warranty of
 16+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 17+// See the GNU General Public License for more details.
 18+//
 19+// You should have received a copy of the GNU General Public License along
 20+// with emBIOS. If not, see <http://www.gnu.org/licenses/>.
 21+//
 22+//
 23+
 24+
 25+#ifndef __VERSION_H__
 26+#define __VERSION_H__
 27+
 28+
 29+#define VERSION "0.0.1pre"
 30+#define VERSION_MAJOR 0
 31+#define VERSION_MINOR 0
 32+#define VERSION_PATCH 1
 33+#define VERSION_SVN "$REVISION$"
 34+#define VERSION_SVN_INT $REVISIONINT$
 35+
 36+
 37+#endif
\ No newline at end of file
Index: apps/bootmenu-ipodnano2g/Makefile
@@ -0,0 +1,123 @@
 2+NAME := bootmenu-ipodclassic
 3+STACKSIZE := 4096
 4+COMPRESS := true
 5+
 6+EMCOREDIR ?= ../../emcore/trunk/
 7+LIBBOOTDIR ?= ../../libs/boot/
 8+LIBPNGDIR ?= ../../libs/png/
 9+LIBUIDIR ?= ../../libs/ui/
 10+
 11+ifeq ($(shell uname),WindowsNT)
 12+CCACHE :=
 13+else
 14+CCACHE := $(shell which ccache)
 15+endif
 16+
 17+CROSS ?= arm-elf-eabi-
 18+CC := $(CCACHE) $(CROSS)gcc
 19+AS := $(CROSS)as
 20+LD := $(CROSS)ld
 21+OBJCOPY := $(CROSS)objcopy
 22+ELF2ECA := $(CROSS)elf2emcoreapp
 23+
 24+LIBINCLUDES := -I$(LIBPNGDIR)/export -I$(LIBUIDIR)/export
 25+
 26+CFLAGS += -Os -fno-pie -fno-stack-protector -fomit-frame-pointer -I. -I$(EMCOREDIR)/export $(LIBINCLUDES) -ffunction-sections -fdata-sections -mcpu=arm940t -DARM_ARCH=4
 27+LDFLAGS += "$(shell $(CC) -print-libgcc-file-name)" --emit-relocs --gc-sections
 28+
 29+preprocess = $(shell $(CC) $(PPCFLAGS) $(2) -E -P -x c $(1) | grep -v "^\#")
 30+preprocesspaths = $(shell $(CC) $(PPCFLAGS) $(2) -E -P -x c $(1) | grep -v "^\#" | sed -e "s:^..*:$(dir $(1))&:")
 31+
 32+REVISION := $(shell svnversion .)
 33+REVISIONINT := $(shell echo $(REVISION) | sed -e "s/[^0-9].*$$//")
 34+
 35+HELPERS := build/__emcore_armhelpers.o
 36+
 37+SRC := $(call preprocesspaths,SOURCES,-I. -I..)
 38+OBJ := $(SRC:%.c=build/%.o)
 39+OBJ := $(OBJ:%.S=build/%.o) $(HELPERS)
 40+
 41+all: $(NAME)
 42+
 43+-include $(OBJ:%=%.dep)
 44+
 45+$(NAME): build/$(NAME).emcoreapp
 46+
 47+build/$(NAME).emcoreapp: build/$(NAME).elf
 48+ @echo [EMCAPP] $<
 49+ifeq ($(COMPRESS),true)
 50+ @$(ELF2ECA) -z -s $(STACKSIZE) -o $@ $^
 51+else
 52+ @$(ELF2ECA) -s $(STACKSIZE) -o $@ $^
 53+endif
 54+
 55+build/$(NAME).elf: ls.x $(OBJ)
 56+ @echo [LD] $@
 57+ @$(LD) $(LDFLAGS) -o $@ -T ls.x $(OBJ)
 58+
 59+build/%.o: %.c build/version.h
 60+ @echo [CC] $<
 61+ifeq ($(shell uname),WindowsNT)
 62+ @-if not exist $(subst /,\,$(dir $@)) md $(subst /,\,$(dir $@))
 63+else
 64+ @-mkdir -p $(dir $@)
 65+endif
 66+ @$(CC) -c $(CFLAGS) -o $@ $<
 67+ @$(CC) -MM $(CFLAGS) $< > $@.dep.tmp
 68+ @sed -e "s|.*:|$@:|" < $@.dep.tmp > $@.dep
 69+ifeq ($(shell uname),WindowsNT)
 70+ @sed -e "s/.*://" -e "s/\\$$//" < $@.dep.tmp | fmt -1 | sed -e "s/^ *//" -e "s/$$/:/" >> $@.dep
 71+else
 72+ @sed -e 's/.*://' -e 's/\\$$//' < $@.dep.tmp | fmt -1 | sed -e 's/^ *//' -e 's/$$/:/' >> $@.dep
 73+endif
 74+ @rm -f $@.dep.tmp
 75+
 76+build/%.o: %.S build/version.h
 77+ @echo [CC] $<
 78+ifeq ($(shell uname),WindowsNT)
 79+ @-if not exist $(subst /,\,$(dir $@)) md $(subst /,\,$(dir $@))
 80+else
 81+ @-mkdir -p $(dir $@)
 82+endif
 83+ @$(CC) -c $(CFLAGS) -o $@ $<
 84+ @$(CC) -MM $(CFLAGS) $< > $@.dep.tmp
 85+ @sed -e "s|.*:|$@:|" < $@.dep.tmp > $@.dep
 86+ifeq ($(shell uname),WindowsNT)
 87+ @sed -e "s/.*://" -e "s/\\$$//" < $@.dep.tmp | fmt -1 | sed -e "s/^ *//" -e "s/$$/:/" >> $@.dep
 88+else
 89+ @sed -e 's/.*://' -e 's/\\$$//' < $@.dep.tmp | fmt -1 | sed -e 's/^ *//' -e 's/$$/:/' >> $@.dep
 90+endif
 91+ @rm -f $@.dep.tmp
 92+
 93+build/__emcore_%.o: $(EMCOREDIR)/export/%.c
 94+ @echo [CC] $<
 95+ifeq ($(shell uname),WindowsNT)
 96+ @-if not exist $(subst /,\,$(dir $@)) md $(subst /,\,$(dir $@))
 97+else
 98+ @-mkdir -p $(dir $@)
 99+endif
 100+ @$(CC) -c $(CFLAGS) -o $@ $<
 101+
 102+build/__emcore_%.o: $(EMCOREDIR)/export/%.S
 103+ @echo [CC] $<
 104+ifeq ($(shell uname),WindowsNT)
 105+ @-if not exist $(subst /,\,$(dir $@)) md $(subst /,\,$(dir $@))
 106+else
 107+ @-mkdir -p $(dir $@)
 108+endif
 109+ @$(CC) -c $(CFLAGS) -o $@ $<
 110+
 111+build/version.h: version.h .svn/entries
 112+ @echo [PP] $<
 113+ifeq ($(shell uname),WindowsNT)
 114+ @-if not exist build md build
 115+ @sed -e "s/\$$REVISION\$$/$(REVISION)/" -e "s/\$$REVISIONINT\$$/$(REVISIONINT)/" < $< > $@
 116+else
 117+ @-mkdir -p build
 118+ @sed -e 's/\$$REVISION\$$/$(REVISION)/' -e 's/\$$REVISIONINT\$$/$(REVISIONINT)/' < $< > $@
 119+endif
 120+
 121+clean:
 122+ @rm -rf build
 123+
 124+.PHONY: all clean $(NAME)
Index: apps/bootmenu-ipodnano2g
Property changes on: apps/bootmenu-ipodnano2g
___________________________________________________________________
Added: svn:ignore
## -0,0 +1 ##
 125+build