@@ -171,7 +171,11 @@ ifneq ($(MOC_HEADERS),)
171171 RARCH_OBJ += $(MOC_OBJ )
172172endif
173173
174- all : $(TARGET ) config.mk
174+ ifeq ($(HAVE_METAL ) , 1)
175+ METALLIB := default.metallib
176+ endif
177+
178+ all : $(TARGET ) $(METALLIB ) config.mk
175179
176180define INFO
177181ASFLAGS: $(ASFLAGS )
@@ -230,6 +234,23 @@ $(TARGET): $(RARCH_OBJ)
230234 @$(if $(Q ) , $(shell echo echo LD $@ ) ,)
231235 $(Q )$(LINK ) -o $@ $(RARCH_OBJ ) $(LIBS ) $(LDFLAGS ) $(LIBRARY_DIRS )
232236
237+ # Compile the Metal shader library used by gfx/drivers/metal.m via
238+ # [device newDefaultLibrary]. Xcode produces this automatically for the
239+ # Metal.xcodeproj build; the commandline build has to do it by hand.
240+ # The .metallib must sit next to the retroarch binary at runtime.
241+ ifeq ($(HAVE_METAL ) , 1)
242+ METAL_SHADER_SRCS := gfx/common/metal/Shaders.metal gfx/common/metal/menu_pipeline.metal
243+ METAL_AIR_FILES := $(METAL_SHADER_SRCS:.metal=.air )
244+
245+ % .air : % .metal
246+ @$(if $(Q ) , $(shell echo echo METAL $< ) ,)
247+ $(Q ) xcrun -sdk macosx metal $(ARCHFLAGS ) -c $< -o $@
248+
249+ default.metallib : $(METAL_AIR_FILES )
250+ @$(if $(Q ) , $(shell echo echo METALLIB $@ ) ,)
251+ $(Q ) xcrun -sdk macosx metallib $(METAL_AIR_FILES ) -o $@
252+ endif
253+
233254$(OBJDIR ) /% .o : % .c config.h config.mk
234255 @mkdir -p $(dir $@ )
235256 @$(if $(Q ) , $(shell echo echo CC $< ) ,)
@@ -245,6 +266,16 @@ $(OBJDIR)/%.o: %.m
245266 @$(if $(Q ) , $(shell echo echo OBJC $< ) ,)
246267 $(Q )$(CXX ) $(OBJCFLAGS ) $(DEFINES ) -MMD -c -o $@ $<
247268
269+ # ARC (Automatic Reference Counting) overrides. These three Objective-C
270+ # files use ARC-only constructs (__weak, etc.) and must be built with
271+ # -fobjc-arc. The rest of the RetroArch Objective-C code is MRC-written
272+ # (explicit retain/release, NSAutoreleasePool, etc.) and would fail to
273+ # compile under ARC — so we cannot set -fobjc-arc globally. Xcode does
274+ # the equivalent via per-file CLANG_ENABLE_OBJC_ARC=YES build settings.
275+ $(OBJDIR ) /gfx/drivers/metal.o : OBJCFLAGS += -fobjc-arc
276+ $(OBJDIR ) /gfx/common/metal/metal_renderer.o : OBJCFLAGS += -fobjc-arc
277+ $(OBJDIR ) /input/drivers_joypad/mfi_joypad.o : OBJCFLAGS += -fobjc-arc
278+
248279$(OBJDIR ) /% .o : % .S config.h config.mk $(HEADERS )
249280 @mkdir -p $(dir $@ )
250281 @$(if $(Q ) , $(shell echo echo AS $< ) ,)
@@ -264,6 +295,9 @@ install: $(TARGET)
264295 mkdir -p $(DESTDIR )$(MAN_DIR ) /man6 2> /dev/null || /bin/true
265296 mkdir -p $(DESTDIR )$(DATA_DIR ) /pixmaps 2> /dev/null || /bin/true
266297 cp $(TARGET ) $(DESTDIR )$(BIN_DIR )
298+ @if test " $( HAVE_METAL) " = " 1" && test -f default.metallib; then \
299+ cp default.metallib $(DESTDIR )$(BIN_DIR ) /; \
300+ fi
267301 cp tools/cg2glsl.py $(DESTDIR )$(BIN_DIR ) /retroarch-cg2glsl
268302 cp retroarch.cfg $(DESTDIR )$(GLOBAL_CONFIG_DIR )
269303 cp com.libretro.RetroArch.metainfo.xml $(DESTDIR )$(DATA_DIR ) /metainfo
@@ -316,6 +350,7 @@ clean:
316350 $(Q ) rm -rf $(OBJDIR_BASE )
317351 $(Q ) rm -f $(TARGET )
318352 $(Q ) rm -f * .d
353+ $(Q ) rm -f default.metallib gfx/common/metal/* .air
319354
320355.PHONY : all install uninstall clean
321356
0 commit comments