| # __________ __ ___. |
| # Open \______ \ ____ ____ | | _\_ |__ _______ ___ |
| # Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / |
| # Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < |
| # Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ |
| # \/ \/ \/ \/ \/ |
| |
| # libtools.make |
| # |
| # Common Makefile for tools used by Rockbox Utility. |
| # Provides rules for building as library, universal library (OS X) and |
| # standalone binary. |
| # |
| # LIBSOURCES is a list of files to build the lib |
| # SOURCES is a list of files to build for the main binary |
| # EXTRADEPS is a list of make targets dependencies |
| # |
| ifndef V |
| SILENT = @ |
| endif |
| |
| # Get directory this Makefile is in for relative paths. |
| TOP := $(dir $(lastword $(MAKEFILE_LIST))) |
| |
| # overwrite for releases |
| ifndef APPVERSION |
| APPVERSION=$(shell $(TOP)/../tools/version.sh ../) |
| endif |
| CFLAGS += -DVERSION=\"$(APPVERSION)\" |
| TARGET_DIR = $(shell pwd)/ |
| |
| BINARY = $(OUTPUT) |
| # when building a Windows binary add the correct file suffix |
| ifeq ($(findstring CYGWIN,$(shell uname)),CYGWIN) |
| BINARY = $(OUTPUT).exe |
| CFLAGS+=-mno-cygwin |
| else |
| ifeq ($(findstring MINGW,$(shell uname)),MINGW) |
| BINARY = $(OUTPUT).exe |
| else |
| ifeq ($(findstring mingw,$(CROSS)$(CC)),mingw) |
| BINARY = $(OUTPUT).exe |
| endif |
| endif |
| endif |
| |
| NATIVECC = gcc |
| CC = gcc |
| ifeq ($(findstring Darwin,$(shell uname)),Darwin) |
| # building against SDK 10.4 is not compatible with gcc-4.2 (default on newer Xcode) |
| # might need adjustment for older Xcode. |
| CC = gcc-4.0 |
| CFLAGS += -isysroot /Developer/SDKs/MacOSX10.4u.sdk -mmacosx-version-min=10.4 |
| NATIVECC = gcc-4.0 |
| endif |
| WINDRES = windres |
| |
| ifndef BUILD_DIR |
| BUILD_DIR = $(TARGET_DIR)build |
| endif |
| OBJDIR = $(abspath $(BUILD_DIR)/$(RBARCH))/ |
| |
| ifdef RBARCH |
| CFLAGS += -arch $(RBARCH) |
| endif |
| |
| all: $(BINARY) |
| |
| OBJS := $(patsubst %.c,%.o,$(addprefix $(OBJDIR),$(notdir $(SOURCES)))) |
| LIBOBJS := $(patsubst %.c,%.o,$(addprefix $(OBJDIR),$(notdir $(LIBSOURCES)))) |
| |
| # additional link dependencies for the standalone executable |
| # extra dependencies: libucl |
| LIBUCL = libucl$(RBARCH).a |
| $(LIBUCL): $(OBJDIR)$(LIBUCL) |
| |
| $(OBJDIR)$(LIBUCL): |
| $(SILENT)$(MAKE) -C $(TOP)/../tools/ucl/src TARGET_DIR=$(OBJDIR) $@ |
| |
| # building the standalone executable |
| $(BINARY): $(OBJS) $(EXTRADEPS) $(addprefix $(OBJDIR),$(EXTRALIBOBJS)) |
| @echo LD $@ |
| # $(SILENT)mkdir -p $(dir $@) |
| # EXTRADEPS need to be built into OBJDIR. |
| $(SILENT)$(CROSS)$(CC) $(CFLAGS) $(LDOPTS) -o $(BINARY) \ |
| $(OBJS) $(addprefix $(OBJDIR),$(EXTRADEPS)) \ |
| $(addprefix $(OBJDIR),$(EXTRALIBOBJS)) |
| |
| # common rules |
| $(OBJDIR)%.o: %.c |
| @echo CC $< |
| $(SILENT)mkdir -p $(dir $@) |
| $(SILENT)$(CROSS)$(CC) $(CFLAGS) -c -o $@ $< |
| |
| # lib rules |
| lib$(OUTPUT)$(RBARCH).a: $(TARGET_DIR)lib$(OUTPUT)$(RBARCH).a |
| lib$(OUTPUT)$(RBARCH): $(TARGET_DIR)lib$(OUTPUT)$(RBARCH).a |
| |
| $(TARGET_DIR)lib$(OUTPUT)$(RBARCH).a: $(LIBOBJS) \ |
| $(addprefix $(OBJDIR),$(EXTRALIBOBJS)) |
| # rules to build a DLL. Only works for W32 as target (i.e. MinGW toolchain) |
| dll: $(OUTPUT).dll |
| $(OUTPUT).dll: $(TARGET_DIR)$(OUTPUT).dll |
| $(TARGET_DIR)$(OUTPUT).dll: $(LIBOBJS) $(addprefix $(OBJDIR),$(EXTRALIBOBJS)) |
| @echo DLL $(notdir $@) |
| $(SILENT)mkdir -p $(dir $@) |
| $(SILENT)$(CROSS)$(CC) $(CFLAGS) -shared -o $@ $^ \ |
| -Wl,--output-def,$(TARGET_DIR)$(OUTPUT).def |
| |
| $(TARGET_DIR)lib$(OUTPUT)$(RBARCH).a: $(LIBOBJS) $(addprefix $(OBJDIR),$(EXTRALIBOBJS)) |
| @echo AR $(notdir $@) |
| $(SILENT)mkdir -p $(dir $@) |
| $(SILENT)$(AR) rucs $@ $^ |
| |
| # some trickery to build ppc and i386 from a single call |
| ifeq ($(RBARCH),) |
| $(TARGET_DIR)lib$(OUTPUT)i386.a: |
| make RBARCH=i386 TARGET_DIR=$(TARGET_DIR) lib$(OUTPUT)i386.a |
| |
| $(TARGET_DIR)lib$(OUTPUT)ppc.a: |
| make RBARCH=ppc TARGET_DIR=$(TARGET_DIR) lib$(OUTPUT)ppc.a |
| endif |
| |
| lib$(OUTPUT)-universal: $(TARGET_DIR)lib$(OUTPUT)i386.a \ |
| $(TARGET_DIR)lib$(OUTPUT)ppc.a |
| @echo LIPO $(notdir $(TARGET_DIR)lib$(OUTPUT).a) |
| $(SILENT) rm -f $(TARGET_DIR)lib$(OUTPUT).a |
| $(SILENT)lipo -create $(TARGET_DIR)lib$(OUTPUT)i386.a \ |
| $(TARGET_DIR)lib$(OUTPUT)ppc.a \ |
| -output $(TARGET_DIR)lib$(OUTPUT).a |
| |
| clean: |
| rm -f $(OBJS) $(OUTPUT) $(TARGET_DIR)lib$(OUTPUT)*.a $(OUTPUT).dmg |
| rm -rf $(OUTPUT)-* i386 ppc $(OBJDIR) |
| |
| # OS X specifics |
| $(OUTPUT)-i386: |
| $(MAKE) RBARCH=i386 |
| mv $(OUTPUT) $@ |
| |
| $(OUTPUT)-ppc: |
| $(MAKE) RBARCH=ppc |
| mv $(OUTPUT) $@ |
| |
| $(OUTPUT)-mac: $(OUTPUT)-i386 $(OUTPUT)-ppc |
| @echo LIPO $@ |
| $(SILENT)lipo -create $(OUTPUT)-ppc $(OUTPUT)-i386 -output $@ |
| |
| $(OUTPUT).dmg: $(OUTPUT)-mac |
| @echo DMG $@ |
| $(SILENT)mkdir -p $(OUTPUT)-dmg |
| $(SILENT)cp -p $(OUTPUT)-mac $(OUTPUT)-dmg |
| $(SILENT)hdiutil create -srcfolder $(OUTPUT)-dmg $@ |