SameBoy/Makefile

355 lines
11 KiB
Makefile
Raw Normal View History

# Make hacks
.INTERMEDIATE:
2016-08-20 14:51:17 +00:00
# Set target, configuration, version and destination folders
PLATFORM := $(shell uname -s)
ifneq ($(findstring MINGW,$(PLATFORM)),)
PLATFORM := windows32
USE_WINDRES := true
endif
2016-08-20 14:51:17 +00:00
ifneq ($(findstring MSYS,$(PLATFORM)),)
PLATFORM := windows32
endif
ifeq ($(PLATFORM),windows32)
_ := $(shell chcp 65001)
endif
2016-08-20 14:51:17 +00:00
ifeq ($(PLATFORM),Darwin)
DEFAULT := cocoa
2016-03-30 20:07:55 +00:00
else
DEFAULT := sdl
2016-03-30 20:07:55 +00:00
endif
default: $(DEFAULT)
ifeq ($(MAKECMDGOALS),)
MAKECMDGOALS := $(DEFAULT)
endif
2018-07-11 17:07:54 +00:00
VERSION := 0.11.1
export VERSION
2016-08-20 14:51:17 +00:00
CONF ?= debug
2016-04-01 20:36:43 +00:00
2016-03-30 20:07:55 +00:00
BIN := build/bin
OBJ := build/obj
BOOTROMS_DIR ?= $(BIN)/BootROMs
2016-03-30 20:07:55 +00:00
ifdef DATA_DIR
CFLAGS += -DDATA_DIR="\"$(DATA_DIR)\""
endif
2016-08-20 14:51:17 +00:00
# Set tools
# Use clang if it's available.
2019-05-09 16:01:15 +00:00
ifeq ($(origin CC),default)
ifneq (, $(shell which clang))
CC := clang
endif
2019-05-09 16:01:15 +00:00
endif
2016-08-20 14:51:17 +00:00
ifeq ($(PLATFORM),windows32)
# To force use of the Unix version instead of the Windows version
MKDIR := $(shell which mkdir)
else
MKDIR := mkdir
endif
ifeq ($(CONF),native_release)
override CONF := release
LDFLAGS += -march=native -mtune=native
CFLAGS += -march=native -mtune=native
endif
2016-08-20 14:51:17 +00:00
# Set compilation and linkage flags based on target, platform and configuration
2016-03-30 20:07:55 +00:00
OPEN_DIALOG = OpenDialog/gtk.c
ifeq ($(PLATFORM),windows32)
OPEN_DIALOG = OpenDialog/windows.c
endif
ifeq ($(PLATFORM),Darwin)
OPEN_DIALOG = OpenDialog/cocoa.m
endif
2019-05-10 19:05:03 +00:00
CFLAGS += -Werror -Wall -Wno-strict-aliasing -Wno-unknown-warning -Wno-unknown-warning-option -Wno-multichar -Wno-int-in-bool-context -std=gnu11 -D_GNU_SOURCE -DVERSION="$(VERSION)" -I. -D_USE_MATH_DEFINES
2017-12-23 15:29:42 +00:00
SDL_LDFLAGS := -lSDL2 -lGL
2016-08-20 14:51:17 +00:00
ifeq ($(PLATFORM),windows32)
CFLAGS += -IWindows -Drandom=rand
LDFLAGS += -lmsvcrt -lcomdlg32 -lSDL2main -Wl,/MANIFESTFILE:NUL
2017-12-29 11:06:38 +00:00
SDL_LDFLAGS := -lSDL2 -lopengl32
2016-08-20 14:51:17 +00:00
else
LDFLAGS += -lc -lm -ldl
2016-08-20 14:51:17 +00:00
endif
2016-03-30 20:07:55 +00:00
2016-08-20 14:51:17 +00:00
ifeq ($(PLATFORM),Darwin)
SYSROOT := $(shell xcodebuild -sdk macosx -version Path 2> /dev/null)
2016-07-17 19:43:23 +00:00
CFLAGS += -F/Library/Frameworks
OCFLAGS += -x objective-c -fobjc-arc -Wno-deprecated-declarations -isysroot $(SYSROOT) -mmacosx-version-min=10.9
2018-06-15 17:03:59 +00:00
LDFLAGS += -framework AppKit -framework PreferencePanes -framework Carbon -framework QuartzCore -weak_framework Metal -weak_framework MetalKit
2017-12-23 15:29:42 +00:00
SDL_LDFLAGS := -F/Library/Frameworks -framework SDL2 -framework OpenGL
2016-03-30 20:07:55 +00:00
endif
CFLAGS += -Wno-deprecated-declarations
2016-08-20 14:51:17 +00:00
ifeq ($(PLATFORM),windows32)
2017-05-24 18:44:43 +00:00
CFLAGS += -Wno-deprecated-declarations # Seems like Microsoft deprecated every single LIBC function
LDFLAGS += -Wl,/NODEFAULTLIB:libcmt.lib
2016-08-20 14:51:17 +00:00
endif
2016-04-01 19:53:29 +00:00
ifeq ($(CONF),debug)
CFLAGS += -g
else ifeq ($(CONF), release)
2016-08-20 14:51:17 +00:00
CFLAGS += -O3 -DNDEBUG
ifneq ($(PLATFORM),windows32)
LDFLAGS += -flto
2016-08-20 14:51:17 +00:00
CFLAGS += -flto
endif
2016-04-01 19:53:29 +00:00
else
$(error Invalid value for CONF: $(CONF). Use "debug", "release" or "native_release")
2016-04-01 19:53:29 +00:00
endif
2016-08-20 14:51:17 +00:00
# Define our targets
ifeq ($(PLATFORM),windows32)
SDL_TARGET := $(BIN)/SDL/sameboy.exe $(BIN)/SDL/sameboy_debugger.exe $(BIN)/SDL/SDL2.dll
2016-09-03 00:39:32 +00:00
TESTER_TARGET := $(BIN)/tester/sameboy_tester.exe
2016-08-20 14:51:17 +00:00
else
SDL_TARGET := $(BIN)/SDL/sameboy
2016-09-03 00:39:32 +00:00
TESTER_TARGET := $(BIN)/tester/sameboy_tester
2016-08-20 14:51:17 +00:00
endif
cocoa: $(BIN)/SameBoy.app
quicklook: $(BIN)/SameBoy.qlgenerator
sdl: $(SDL_TARGET) $(BIN)/SDL/dmg_boot.bin $(BIN)/SDL/cgb_boot.bin $(BIN)/SDL/agb_boot.bin $(BIN)/SDL/sgb_boot.bin $(BIN)/SDL/sgb2_boot.bin $(BIN)/SDL/LICENSE $(BIN)/SDL/registers.sym $(BIN)/SDL/background.bmp $(BIN)/SDL/Shaders
bootroms: $(BIN)/BootROMs/agb_boot.bin $(BIN)/BootROMs/cgb_boot.bin $(BIN)/BootROMs/dmg_boot.bin $(BIN)/BootROMs/sgb_boot.bin $(BIN)/BootROMs/sgb2_boot.bin
2018-12-01 15:28:57 +00:00
tester: $(TESTER_TARGET) $(BIN)/tester/dmg_boot.bin $(BIN)/tester/cgb_boot.bin $(BIN)/tester/agb_boot.bin $(BIN)/tester/sgb_boot.bin $(BIN)/tester/sgb2_boot.bin
all: cocoa sdl tester libretro
2016-03-30 20:07:55 +00:00
2016-08-20 14:51:17 +00:00
# Get a list of our source files and their respective object file targets
CORE_SOURCES := $(shell ls Core/*.c)
SDL_SOURCES := $(shell ls SDL/*.c) $(OPEN_DIALOG)
2016-09-03 00:39:32 +00:00
TESTER_SOURCES := $(shell ls Tester/*.c)
2016-03-30 20:07:55 +00:00
2016-08-20 14:51:17 +00:00
ifeq ($(PLATFORM),Darwin)
COCOA_SOURCES := $(shell ls Cocoa/*.m) $(shell ls HexFiend/*.m)
QUICKLOOK_SOURCES := $(shell ls QuickLook/*.m) $(shell ls QuickLook/*.c)
2016-03-30 20:07:55 +00:00
endif
ifeq ($(PLATFORM),windows32)
CORE_SOURCES += $(shell ls Windows/*.c)
endif
2016-03-30 20:07:55 +00:00
CORE_OBJECTS := $(patsubst %,$(OBJ)/%.o,$(CORE_SOURCES))
COCOA_OBJECTS := $(patsubst %,$(OBJ)/%.o,$(COCOA_SOURCES))
QUICKLOOK_OBJECTS := $(patsubst %,$(OBJ)/%.o,$(QUICKLOOK_SOURCES))
2016-03-30 20:07:55 +00:00
SDL_OBJECTS := $(patsubst %,$(OBJ)/%.o,$(SDL_SOURCES))
2016-09-03 00:39:32 +00:00
TESTER_OBJECTS := $(patsubst %,$(OBJ)/%.o,$(TESTER_SOURCES))
2016-03-30 20:07:55 +00:00
# Automatic dependency generation
2016-08-20 14:51:17 +00:00
2017-10-15 17:26:49 +00:00
ifneq ($(filter-out clean bootroms libretro %.bin, $(MAKECMDGOALS)),)
-include $(CORE_OBJECTS:.o=.dep)
ifneq ($(filter $(MAKECMDGOALS),sdl),)
-include $(SDL_OBJECTS:.o=.dep)
endif
2016-09-03 00:39:32 +00:00
ifneq ($(filter $(MAKECMDGOALS),tester),)
-include $(TESTER_OBJECTS:.o=.dep)
endif
ifneq ($(filter $(MAKECMDGOALS),cocoa),)
-include $(COCOA_OBJECTS:.o=.dep)
endif
endif
2016-03-30 20:07:55 +00:00
$(OBJ)/%.dep: %
2016-08-20 14:51:17 +00:00
-@$(MKDIR) -p $(dir $@)
2016-03-30 20:07:55 +00:00
$(CC) $(CFLAGS) -MT $(OBJ)/$^.o -M $^ -c -o $@
2016-08-20 14:51:17 +00:00
# Compilation rules
$(OBJ)/Core/%.c.o: Core/%.c
-@$(MKDIR) -p $(dir $@)
$(CC) $(CFLAGS) -DGB_INTERNAL -c $< -o $@
2016-03-30 20:07:55 +00:00
$(OBJ)/%.c.o: %.c
2016-08-20 14:51:17 +00:00
-@$(MKDIR) -p $(dir $@)
2016-03-30 20:07:55 +00:00
$(CC) $(CFLAGS) -c $< -o $@
# HexFiend requires more flags
$(OBJ)/HexFiend/%.m.o: HexFiend/%.m
2016-08-20 14:51:17 +00:00
-@$(MKDIR) -p $(dir $@)
$(CC) $(CFLAGS) $(OCFLAGS) -c $< -o $@ -fno-objc-arc -include HexFiend/HexFiend_2_Framework_Prefix.pch
2016-03-30 20:07:55 +00:00
$(OBJ)/%.m.o: %.m
2016-08-20 14:51:17 +00:00
-@$(MKDIR) -p $(dir $@)
2016-03-30 20:07:55 +00:00
$(CC) $(CFLAGS) $(OCFLAGS) -c $< -o $@
# Cocoa Port
$(BIN)/SameBoy.app: $(BIN)/SameBoy.app/Contents/MacOS/SameBoy \
2018-12-01 14:08:59 +00:00
$(shell ls Cocoa/*.icns Cocoa/*.png) \
Cocoa/License.html \
Cocoa/Info.plist \
2017-02-20 12:37:15 +00:00
Misc/registers.sym \
$(BIN)/SameBoy.app/Contents/Resources/dmg_boot.bin \
$(BIN)/SameBoy.app/Contents/Resources/cgb_boot.bin \
$(BIN)/SameBoy.app/Contents/Resources/agb_boot.bin \
$(BIN)/SameBoy.app/Contents/Resources/sgb_boot.bin \
2018-12-01 15:28:57 +00:00
$(BIN)/SameBoy.app/Contents/Resources/sgb2_boot.bin \
$(patsubst %.xib,%.nib,$(addprefix $(BIN)/SameBoy.app/Contents/Resources/Base.lproj/,$(shell cd Cocoa;ls *.xib))) \
$(BIN)/SameBoy.qlgenerator \
Shaders
$(MKDIR) -p $(BIN)/SameBoy.app/Contents/Resources
2018-12-01 14:08:59 +00:00
cp Cocoa/*.icns Cocoa/*.png Misc/registers.sym $(BIN)/SameBoy.app/Contents/Resources/
sed s/@VERSION/$(VERSION)/ < Cocoa/Info.plist > $(BIN)/SameBoy.app/Contents/Info.plist
cp Cocoa/License.html $(BIN)/SameBoy.app/Contents/Resources/Credits.html
$(MKDIR) -p $(BIN)/SameBoy.app/Contents/Resources/Shaders
cp Shaders/*.fsh Shaders/*.metal $(BIN)/SameBoy.app/Contents/Resources/Shaders
$(MKDIR) -p $(BIN)/SameBoy.app/Contents/Library/QuickLook/
cp -rf $(BIN)/SameBoy.qlgenerator $(BIN)/SameBoy.app/Contents/Library/QuickLook/
$(BIN)/SameBoy.app/Contents/MacOS/SameBoy: $(CORE_OBJECTS) $(COCOA_OBJECTS)
2016-08-20 14:51:17 +00:00
-@$(MKDIR) -p $(dir $@)
2017-12-30 14:23:17 +00:00
$(CC) $^ -o $@ $(LDFLAGS) -framework OpenGL -framework AudioUnit -framework AVFoundation -framework CoreVideo -framework CoreMedia -framework IOKit
ifeq ($(CONF), release)
2019-05-10 19:29:30 +00:00
strip $@
endif
2016-03-30 20:07:55 +00:00
$(BIN)/SameBoy.app/Contents/Resources/Base.lproj/%.nib: Cocoa/%.xib
2016-03-30 20:07:55 +00:00
ibtool --compile $@ $^
# Quick Look generator
$(BIN)/SameBoy.qlgenerator: $(BIN)/SameBoy.qlgenerator/Contents/MacOS/SameBoyQL \
$(shell ls QuickLook/*.png) \
QuickLook/Info.plist \
$(BIN)/SameBoy.qlgenerator/Contents/Resources/cgb_boot_fast.bin
$(MKDIR) -p $(BIN)/SameBoy.qlgenerator/Contents/Resources
cp QuickLook/*.png $(BIN)/SameBoy.qlgenerator/Contents/Resources/
sed s/@VERSION/$(VERSION)/ < QuickLook/Info.plist > $(BIN)/SameBoy.qlgenerator/Contents/Info.plist
# Currently, SameBoy.app includes two "copies" of each Core .o file once in the app itself and
# once in the QL Generator. It should probably become a dylib instead.
$(BIN)/SameBoy.qlgenerator/Contents/MacOS/SameBoyQL: $(CORE_OBJECTS) $(QUICKLOOK_OBJECTS)
-@$(MKDIR) -p $(dir $@)
$(CC) $^ -o $@ $(LDFLAGS) -bundle -framework Cocoa -framework Quicklook
ifeq ($(CONF), release)
strip -u -r -s QuickLook/exports.sym $@
endif
# cgb_boot_fast.bin is not a standard boot ROM, we don't expect it to exist in the user-provided
# boot ROM directory.
$(BIN)/SameBoy.qlgenerator/Contents/Resources/cgb_boot_fast.bin: $(BIN)/BootROMs/cgb_boot_fast.bin
-@$(MKDIR) -p $(dir $@)
cp -f $^ $@
2016-08-20 14:51:17 +00:00
# SDL Port
# Unix versions build only one binary
$(BIN)/SDL/sameboy: $(CORE_OBJECTS) $(SDL_OBJECTS)
2016-08-20 14:51:17 +00:00
-@$(MKDIR) -p $(dir $@)
2016-03-30 20:07:55 +00:00
$(CC) $^ -o $@ $(LDFLAGS) $(SDL_LDFLAGS)
ifeq ($(CONF), release)
strip $@
endif
2016-08-20 14:51:17 +00:00
# Windows version builds two, one with a conole and one without it
$(BIN)/SDL/sameboy.exe: $(CORE_OBJECTS) $(SDL_OBJECTS) $(OBJ)/Windows/resources.o
2016-08-20 14:51:17 +00:00
-@$(MKDIR) -p $(dir $@)
$(CC) $^ -o $@ $(LDFLAGS) $(SDL_LDFLAGS) -Wl,/subsystem:windows
$(BIN)/SDL/sameboy_debugger.exe: $(CORE_OBJECTS) $(SDL_OBJECTS) $(OBJ)/Windows/resources.o
2016-08-20 14:51:17 +00:00
-@$(MKDIR) -p $(dir $@)
$(CC) $^ -o $@ $(LDFLAGS) $(SDL_LDFLAGS) -Wl,/subsystem:console
ifneq ($(USE_WINDRES),)
$(OBJ)/%.o: %.rc
-@$(MKDIR) -p $(dir $@)
2018-03-29 20:11:53 +00:00
windres --preprocessor cpp -DVERSION=\"$(VERSION)\" $^ $@
else
$(OBJ)/%.res: %.rc
-@$(MKDIR) -p $(dir $@)
rc /fo $@ /dVERSION=\"$(VERSION)\" $^
%.o: %.res
cvtres /OUT:"$@" $^
endif
2018-03-12 21:38:05 +00:00
# We must provide SDL2.dll with the Windows port.
$(BIN)/SDL/SDL2.dll:
2018-03-12 21:38:05 +00:00
@$(eval MATCH := $(shell where $$LIB:SDL2.dll))
2016-08-20 14:51:17 +00:00
cp "$(MATCH)" $@
2016-09-03 00:39:32 +00:00
# Tester
$(BIN)/tester/sameboy_tester: $(CORE_OBJECTS) $(TESTER_OBJECTS)
-@$(MKDIR) -p $(dir $@)
$(CC) $^ -o $@ $(LDFLAGS)
ifeq ($(CONF), release)
strip $@
endif
$(BIN)/tester/sameboy_tester.exe: $(CORE_OBJECTS) $(SDL_OBJECTS)
-@$(MKDIR) -p $(dir $@)
$(CC) $^ -o $@ $(LDFLAGS) -Wl,/subsystem:console
$(BIN)/SDL/%.bin $(BIN)/tester/%.bin: $(BOOTROMS_DIR)/%.bin
-@$(MKDIR) -p $(dir $@)
cp -f $^ $@
$(BIN)/SameBoy.app/Contents/Resources/%.bin: $(BOOTROMS_DIR)/%.bin
2016-08-20 14:51:17 +00:00
-@$(MKDIR) -p $(dir $@)
cp -f $^ $@
2016-03-30 20:07:55 +00:00
$(BIN)/SDL/LICENSE: LICENSE
2017-12-23 15:29:42 +00:00
-@$(MKDIR) -p $(dir $@)
2016-08-20 14:51:17 +00:00
cp -f $^ $@
$(BIN)/SDL/registers.sym: Misc/registers.sym
2017-12-23 15:29:42 +00:00
-@$(MKDIR) -p $(dir $@)
cp -f $^ $@
2017-10-04 09:43:31 +00:00
$(BIN)/SDL/background.bmp: SDL/background.bmp
2017-12-23 15:29:42 +00:00
-@$(MKDIR) -p $(dir $@)
2017-02-20 12:37:15 +00:00
cp -f $^ $@
2017-12-23 15:29:42 +00:00
$(BIN)/SDL/Shaders: Shaders
2018-06-15 15:08:54 +00:00
-@$(MKDIR) -p $@
cp -rf Shaders/*.fsh $@
2017-12-23 15:29:42 +00:00
2016-08-20 14:51:17 +00:00
# Boot ROMs
$(OBJ)/%.1bpp: %.png
-@$(MKDIR) -p $(dir $@)
rgbgfx -d 1 -h -o $@ $<
2019-06-14 11:31:17 +00:00
$(OBJ)/BootROMs/SameBoyLogo.rle: $(OBJ)/BootROMs/SameBoyLogo.1bpp build/logo-compress
2019-06-21 14:08:10 +00:00
./build/logo-compress < $< > $@
build/logo-compress: BootROMs/logo-compress.c
$(CC) $< -o $@
$(BIN)/BootROMs/agb_boot.bin: BootROMs/cgb_boot.asm
$(BIN)/BootROMs/cgb_boot_fast.bin: BootROMs/cgb_boot.asm
$(BIN)/BootROMs/sgb2_boot: BootROMs/sgb_boot.asm
2019-06-14 11:31:17 +00:00
$(BIN)/BootROMs/%.bin: BootROMs/%.asm $(OBJ)/BootROMs/SameBoyLogo.rle
2016-08-20 14:51:17 +00:00
-@$(MKDIR) -p $(dir $@)
rgbasm -i $(OBJ)/BootROMs/ -i BootROMs/ -o $@.tmp $<
2016-03-30 20:07:55 +00:00
rgblink -o $@.tmp2 $@.tmp
dd if=$@.tmp2 of=$@ count=1 bs=$(if $(findstring dmg,$@)$(findstring sgb,$@),256,2304)
2016-03-30 20:07:55 +00:00
@rm $@.tmp $@.tmp2
# Libretro Core (uses its own build system)
libretro:
2017-10-12 21:14:32 +00:00
$(MAKE) -C libretro
2016-08-20 14:51:17 +00:00
# Clean
2016-03-30 20:07:55 +00:00
clean:
rm -rf build
2018-07-11 17:07:54 +00:00
.PHONY: libretro