diff --git a/Makefile b/Makefile index 8e62df81..abb8c51c 100644 --- a/Makefile +++ b/Makefile @@ -2,6 +2,12 @@ .SUFFIXES: #--------------------------------------------------------------------------------- +# GNU make treats spaces as separators in variable-expanded file names. Keep +# exported paths readable, and escape them only where make parses a path list. +empty := +space := $(empty) $(empty) +escape = $(subst $(space),\ ,$(1)) + ifeq ($(strip $(DEVKITPRO)),) $(error "Please set DEVKITPRO in your environment. export DEVKITPRO=devkitPro") endif @@ -16,7 +22,7 @@ export LIBOGC_MAJOR := 2 export LIBOGC_MINOR := 1 export LIBOGC_PATCH := 0 -include $(DEVKITPPC)/base_rules +include $(call escape,$(DEVKITPPC))/base_rules DATESTRING := $(shell date -u +%Y%m%d) VERSTRING := $(shell printf "r%s.%s" "$$(git rev-list --count HEAD)" "$$(git rev-parse --short=7 HEAD)") @@ -48,8 +54,8 @@ export INCDIR := $(BASEDIR)/include else #--------------------------------------------------------------------------------- -export LIBDIR := $(LIBS)/$(PLATFORM) -export DEPSDIR := $(DEPS)/$(PLATFORM) +LIBDIR := $(call escape,$(LIBS)/$(PLATFORM)) +DEPSDIR := $(call escape,$(DEPS)/$(PLATFORM)) #--------------------------------------------------------------------------------- endif @@ -71,52 +77,53 @@ ISOLIB := $(LIBDIR)/libiso9660 WIIKEYBLIB := $(LIBDIR)/libwiikeyboard #--------------------------------------------------------------------------------- -DEFINCS := -I$(BASEDIR) -I$(INCDIR) -INCLUDES := $(DEFINCS) -I$(LWIPDIR)/include -I$(LWIPDIR)/include/ipv4 -I$(LWIPDIR)/include/netif \ - -I$(INCDIR)/ogc -I$(INCDIR)/ogc/machine \ - -I$(INCDIR)/modplay \ - -I$(INCDIR)/bte \ - -I$(INCDIR)/sdcard +DEFINCS := -I$(call escape,$(BASEDIR)) -I$(call escape,$(INCDIR)) +INCLUDES := $(DEFINCS) -I$(call escape,$(LWIPDIR)/include) -I$(call escape,$(LWIPDIR)/include/ipv4) -I$(call escape,$(LWIPDIR)/include/netif) \ + -I$(call escape,$(INCDIR)/ogc) -I$(call escape,$(INCDIR)/ogc/machine) \ + -I$(call escape,$(INCDIR)/modplay) \ + -I$(call escape,$(INCDIR)/bte) \ + -I$(call escape,$(INCDIR)/sdcard) MACHDEP := -DGEKKO -mcpu=750 -meabi -msdata=sysv -mhard-float -ffunction-sections -fdata-sections ifeq ($(PLATFORM),wii) -INCLUDES += -I$(BUILD)/wii +INCLUDES += -I$(call escape,$(BUILD)/wii) MACHDEP += -DHW_RVL -Wa,-mbroadway endif ifeq ($(PLATFORM),cube) -INCLUDES += -I$(BUILD)/cube +INCLUDES += -I$(call escape,$(BUILD)/cube) MACHDEP += -DHW_DOL -Wa,-mgekko endif -INCLUDES += -I$(PORTLIBS_PATH)/ppc/include +INCLUDES += -I$(call escape,$(PORTLIBS_PATH)/ppc/include) CFLAGS := -DLIBOGC_INTERNAL -g -O2 -fno-strict-aliasing -Wall -Wno-address-of-packed-member -Wno-prio-ctor-dtor $(MACHDEP) $(INCLUDES) ASFLAGS := $(MACHDEP) -mregnames -D_LANGUAGE_ASSEMBLY $(INCLUDES) #--------------------------------------------------------------------------------- -VPATH := $(LWIPDIR) \ - $(LWIPDIR)/arch/gc \ - $(LWIPDIR)/arch/gc/netif \ - $(LWIPDIR)/core \ - $(LWIPDIR)/core/ipv4 \ - $(LWIPDIR)/netif \ - $(OGCDIR) \ - $(MODDIR) \ - $(DBDIR) \ - $(DBDIR)/uIP \ - $(DIDIR) \ - $(BTEDIR) \ - $(WIIUSEDIR) \ - $(TINYSMBDIR) \ - $(LIBASNDDIR) \ - $(LIBAESNDDIR) \ - $(LIBISODIR) \ - $(LIBWIIKEYB) \ - $(LIBCDIR) +VPATH_ROOT := $(if $(strip $(PLATFORM)),../..,$(BASEDIR)) +VPATH := $(call escape,$(VPATH_ROOT)/lwip) \ + $(call escape,$(VPATH_ROOT)/lwip/arch/gc) \ + $(call escape,$(VPATH_ROOT)/lwip/arch/gc/netif) \ + $(call escape,$(VPATH_ROOT)/lwip/core) \ + $(call escape,$(VPATH_ROOT)/lwip/core/ipv4) \ + $(call escape,$(VPATH_ROOT)/lwip/netif) \ + $(call escape,$(VPATH_ROOT)/libogc) \ + $(call escape,$(VPATH_ROOT)/libmodplay) \ + $(call escape,$(VPATH_ROOT)/libdb) \ + $(call escape,$(VPATH_ROOT)/libdb/uIP) \ + $(call escape,$(VPATH_ROOT)/libdi) \ + $(call escape,$(VPATH_ROOT)/lwbt) \ + $(call escape,$(VPATH_ROOT)/wiiuse) \ + $(call escape,$(VPATH_ROOT)/libtinysmb) \ + $(call escape,$(VPATH_ROOT)/libasnd) \ + $(call escape,$(VPATH_ROOT)/libaesnd) \ + $(call escape,$(VPATH_ROOT)/libiso9660) \ + $(call escape,$(VPATH_ROOT)/libwiikeyboard) \ + $(call escape,$(VPATH_ROOT)/libc) #--------------------------------------------------------------------------------- @@ -184,18 +191,18 @@ all: wii cube #--------------------------------------------------------------------------------- wii: include/ogc/libversion.h #--------------------------------------------------------------------------------- - @[ -d $(LIBS)/wii ] || mkdir -p $(LIBS)/wii - @[ -d $(DEPS)/wii ] || mkdir -p $(DEPS)/wii - @[ -d $(BUILD)/wii ] || mkdir -p $(BUILD)/wii - @$(MAKE) PLATFORM=wii libs -C $(BUILD)/wii -f $(CURDIR)/Makefile + @[ -d "$(LIBS)/wii" ] || mkdir -p "$(LIBS)/wii" + @[ -d "$(DEPS)/wii" ] || mkdir -p "$(DEPS)/wii" + @[ -d "$(BUILD)/wii" ] || mkdir -p "$(BUILD)/wii" + @$(MAKE) PLATFORM=wii libs -C "$(BUILD)/wii" -f "$(CURDIR)/Makefile" #--------------------------------------------------------------------------------- cube: include/ogc/libversion.h #--------------------------------------------------------------------------------- - @[ -d $(LIBS)/cube ] || mkdir -p $(LIBS)/cube - @[ -d $(DEPS)/cube ] || mkdir -p $(DEPS)/cube - @[ -d $(BUILD)/cube ] || mkdir -p $(BUILD)/cube - @$(MAKE) PLATFORM=cube libs -C $(BUILD)/cube -f $(CURDIR)/Makefile + @[ -d "$(LIBS)/cube" ] || mkdir -p "$(LIBS)/cube" + @[ -d "$(DEPS)/cube" ] || mkdir -p "$(DEPS)/cube" + @[ -d "$(BUILD)/cube" ] || mkdir -p "$(BUILD)/cube" + @$(MAKE) PLATFORM=cube libs -C "$(BUILD)/cube" -f "$(CURDIR)/Makefile" #--------------------------------------------------------------------------------- @@ -224,16 +231,16 @@ aesndlib.o: aesnddspmixer.h #--------------------------------------------------------------------------------- #--------------------------------------------------------------------------------- -asnd_dsp_mixer.h: $(LIBASNDDIR)/dsp_mixer/dsp_mixer.s +asnd_dsp_mixer.h: $(call escape,$(LIBASNDDIR))/dsp_mixer/dsp_mixer.s #--------------------------------------------------------------------------------- @echo $(notdir $<) - @gcdsptool -c $< -o $@ + @gcdsptool -c "$<" -o "$@" #--------------------------------------------------------------------------------- -aesnddspmixer.h: $(LIBAESNDDIR)/dspcode/dspmixer.s +aesnddspmixer.h: $(call escape,$(LIBAESNDDIR))/dspcode/dspmixer.s #--------------------------------------------------------------------------------- @echo $(notdir $<) - @gcdsptool -c $< -o $@ + @gcdsptool -c "$<" -o "$@" #--------------------------------------------------------------------------------- $(BBALIB).a: $(LWIPOBJ) @@ -266,19 +273,19 @@ $(WIIUSELIB).a: $(WIIUSEOBJ) #--------------------------------------------------------------------------------- install: wii cube #--------------------------------------------------------------------------------- - @mkdir -p $(DESTDIR)$(DEVKITPRO)/libogc2/gamecube/lib - @mkdir -p $(DESTDIR)$(DEVKITPRO)/libogc2/wii/lib - @cp -frv include $(DESTDIR)$(DEVKITPRO)/libogc2/gamecube - @cp -frv include $(DESTDIR)$(DEVKITPRO)/libogc2/wii - @cp -frv lib/cube/*.a $(DESTDIR)$(DEVKITPRO)/libogc2/gamecube/lib - @cp -frv lib/wii/*.a $(DESTDIR)$(DEVKITPRO)/libogc2/wii/lib - @cp -frv *_license.txt $(DESTDIR)$(DEVKITPRO)/libogc2 - @cp -frv *_rules $(DESTDIR)$(DEVKITPRO)/libogc2 + @mkdir -p "$(DESTDIR)$(DEVKITPRO)/libogc2/gamecube/lib" + @mkdir -p "$(DESTDIR)$(DEVKITPRO)/libogc2/wii/lib" + @cp -frv include "$(DESTDIR)$(DEVKITPRO)/libogc2/gamecube" + @cp -frv include "$(DESTDIR)$(DEVKITPRO)/libogc2/wii" + @cp -frv lib/cube/*.a "$(DESTDIR)$(DEVKITPRO)/libogc2/gamecube/lib" + @cp -frv lib/wii/*.a "$(DESTDIR)$(DEVKITPRO)/libogc2/wii/lib" + @cp -frv *_license.txt "$(DESTDIR)$(DEVKITPRO)/libogc2" + @cp -frv *_rules "$(DESTDIR)$(DEVKITPRO)/libogc2" #--------------------------------------------------------------------------------- uninstall: #--------------------------------------------------------------------------------- - @rm -frv $(DESTDIR)$(DEVKITPRO)/libogc2 + @rm -frv "$(DESTDIR)$(DEVKITPRO)/libogc2" LIBRARIES := $(OGCLIB).a $(MODLIB).a $(DBLIB).a $(TINYSMBLIB).a $(ASNDLIB).a $(AESNDLIB).a $(ISOLIB).a @@ -290,6 +297,15 @@ ifeq ($(PLATFORM),wii) LIBRARIES += $(BTELIB).a $(WIIUSELIB).a $(DILIB).a $(WIIKEYBLIB).a endif +# base_rules' generic archive recipe leaves $@ unquoted. Keep the archive +# target safe when the checkout or output directory contains spaces. +$(LIBRARIES): +#--------------------------------------------------------------------------------- + $(SILENTMSG) $(notdir $@) + $(ADD_COMPILE_COMMAND) end + $(SILENTCMD)rm -f "$@" + $(SILENTCMD)$(AR) -rc "$@" $^ + #--------------------------------------------------------------------------------- libs: $(LIBRARIES) #--------------------------------------------------------------------------------- @@ -297,9 +313,9 @@ libs: $(LIBRARIES) #--------------------------------------------------------------------------------- clean: #--------------------------------------------------------------------------------- - rm -fr $(BUILD) - rm -fr $(DEPS) - rm -fr $(LIBS) + rm -fr "$(BUILD)" + rm -fr "$(DEPS)" + rm -fr "$(LIBS)" #--------------------------------------------------------------------------------- docs: @@ -311,4 +327,4 @@ docker: #--------------------------------------------------------------------------------- docker build --no-cache -t ghcr.io/extremscorner/libogc2:$(DATESTRING) -t ghcr.io/extremscorner/libogc2:latest . --include $(DEPSDIR)/*.d +-include $(call escape,$(DEPSDIR))/*.d