4504de828a
The logo is compressed using PB8, a form of RLE with unary-coded run lengths. Each block representing 8 bytes consists of a control byte, where each bit (MSB to LSB) is 0 for literal or 1 for repeat previous, followed by the literals in that block. PB8 compression is also used in a few NES games. A variant called PB16, where 1 means repeat 2 bytes back, is used in the Game Boy port of 240p Test Suite and in Libbet and the Magic Floor. Switching from logo-compress RLE to PB8 decreases the compressed logo data size from 287 bytes to 253 bytes, saving 34 bytes. The decompression code is also about 10 bytes smaller.
360 lines
11 KiB
Makefile
360 lines
11 KiB
Makefile
# Make hacks
|
|
.INTERMEDIATE:
|
|
|
|
# Set target, configuration, version and destination folders
|
|
|
|
PLATFORM := $(shell uname -s)
|
|
ifneq ($(findstring MINGW,$(PLATFORM)),)
|
|
PLATFORM := windows32
|
|
USE_WINDRES := true
|
|
endif
|
|
|
|
ifneq ($(findstring MSYS,$(PLATFORM)),)
|
|
PLATFORM := windows32
|
|
endif
|
|
|
|
ifeq ($(PLATFORM),windows32)
|
|
_ := $(shell chcp 65001)
|
|
EXESUFFIX:=.exe
|
|
else
|
|
EXESUFFIX:=
|
|
endif
|
|
|
|
PB8_COMPRESS := build/pb8$(EXESUFFIX)
|
|
|
|
ifeq ($(PLATFORM),Darwin)
|
|
DEFAULT := cocoa
|
|
else
|
|
DEFAULT := sdl
|
|
endif
|
|
|
|
default: $(DEFAULT)
|
|
|
|
ifeq ($(MAKECMDGOALS),)
|
|
MAKECMDGOALS := $(DEFAULT)
|
|
endif
|
|
|
|
VERSION := 0.12.1
|
|
export VERSION
|
|
CONF ?= debug
|
|
|
|
BIN := build/bin
|
|
OBJ := build/obj
|
|
BOOTROMS_DIR ?= $(BIN)/BootROMs
|
|
|
|
ifdef DATA_DIR
|
|
CFLAGS += -DDATA_DIR="\"$(DATA_DIR)\""
|
|
endif
|
|
|
|
# Set tools
|
|
|
|
# Use clang if it's available.
|
|
ifeq ($(origin CC),default)
|
|
ifneq (, $(shell which clang))
|
|
CC := clang
|
|
endif
|
|
endif
|
|
|
|
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
|
|
|
|
# Set compilation and linkage flags based on target, platform and configuration
|
|
|
|
OPEN_DIALOG = OpenDialog/gtk.c
|
|
|
|
ifeq ($(PLATFORM),windows32)
|
|
OPEN_DIALOG = OpenDialog/windows.c
|
|
endif
|
|
|
|
ifeq ($(PLATFORM),Darwin)
|
|
OPEN_DIALOG = OpenDialog/cocoa.m
|
|
endif
|
|
|
|
|
|
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
|
|
SDL_LDFLAGS := -lSDL2 -lGL
|
|
ifeq ($(PLATFORM),windows32)
|
|
CFLAGS += -IWindows -Drandom=rand
|
|
LDFLAGS += -lmsvcrt -lcomdlg32 -lSDL2main -Wl,/MANIFESTFILE:NUL
|
|
SDL_LDFLAGS := -lSDL2 -lopengl32
|
|
else
|
|
LDFLAGS += -lc -lm -ldl
|
|
endif
|
|
|
|
ifeq ($(PLATFORM),Darwin)
|
|
SYSROOT := $(shell xcodebuild -sdk macosx -version Path 2> /dev/null)
|
|
CFLAGS += -F/Library/Frameworks
|
|
OCFLAGS += -x objective-c -fobjc-arc -Wno-deprecated-declarations -isysroot $(SYSROOT) -mmacosx-version-min=10.9
|
|
LDFLAGS += -framework AppKit -framework PreferencePanes -framework Carbon -framework QuartzCore -weak_framework Metal -weak_framework MetalKit
|
|
SDL_LDFLAGS := -F/Library/Frameworks -framework SDL2 -framework OpenGL
|
|
endif
|
|
CFLAGS += -Wno-deprecated-declarations
|
|
ifeq ($(PLATFORM),windows32)
|
|
CFLAGS += -Wno-deprecated-declarations # Seems like Microsoft deprecated every single LIBC function
|
|
LDFLAGS += -Wl,/NODEFAULTLIB:libcmt.lib
|
|
endif
|
|
|
|
ifeq ($(CONF),debug)
|
|
CFLAGS += -g
|
|
else ifeq ($(CONF), release)
|
|
CFLAGS += -O3 -DNDEBUG
|
|
ifneq ($(PLATFORM),windows32)
|
|
LDFLAGS += -flto
|
|
CFLAGS += -flto
|
|
endif
|
|
else
|
|
$(error Invalid value for CONF: $(CONF). Use "debug", "release" or "native_release")
|
|
endif
|
|
|
|
# Define our targets
|
|
|
|
ifeq ($(PLATFORM),windows32)
|
|
SDL_TARGET := $(BIN)/SDL/sameboy.exe $(BIN)/SDL/sameboy_debugger.exe $(BIN)/SDL/SDL2.dll
|
|
TESTER_TARGET := $(BIN)/tester/sameboy_tester.exe
|
|
else
|
|
SDL_TARGET := $(BIN)/SDL/sameboy
|
|
TESTER_TARGET := $(BIN)/tester/sameboy_tester
|
|
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
|
|
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
|
|
|
|
# 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)
|
|
TESTER_SOURCES := $(shell ls Tester/*.c)
|
|
|
|
ifeq ($(PLATFORM),Darwin)
|
|
COCOA_SOURCES := $(shell ls Cocoa/*.m) $(shell ls HexFiend/*.m)
|
|
QUICKLOOK_SOURCES := $(shell ls QuickLook/*.m) $(shell ls QuickLook/*.c)
|
|
endif
|
|
|
|
ifeq ($(PLATFORM),windows32)
|
|
CORE_SOURCES += $(shell ls Windows/*.c)
|
|
endif
|
|
|
|
CORE_OBJECTS := $(patsubst %,$(OBJ)/%.o,$(CORE_SOURCES))
|
|
COCOA_OBJECTS := $(patsubst %,$(OBJ)/%.o,$(COCOA_SOURCES))
|
|
QUICKLOOK_OBJECTS := $(patsubst %,$(OBJ)/%.o,$(QUICKLOOK_SOURCES))
|
|
SDL_OBJECTS := $(patsubst %,$(OBJ)/%.o,$(SDL_SOURCES))
|
|
TESTER_OBJECTS := $(patsubst %,$(OBJ)/%.o,$(TESTER_SOURCES))
|
|
|
|
# Automatic dependency generation
|
|
|
|
ifneq ($(filter-out clean bootroms libretro %.bin, $(MAKECMDGOALS)),)
|
|
-include $(CORE_OBJECTS:.o=.dep)
|
|
ifneq ($(filter $(MAKECMDGOALS),sdl),)
|
|
-include $(SDL_OBJECTS:.o=.dep)
|
|
endif
|
|
ifneq ($(filter $(MAKECMDGOALS),tester),)
|
|
-include $(TESTER_OBJECTS:.o=.dep)
|
|
endif
|
|
ifneq ($(filter $(MAKECMDGOALS),cocoa),)
|
|
-include $(COCOA_OBJECTS:.o=.dep)
|
|
endif
|
|
endif
|
|
|
|
$(OBJ)/%.dep: %
|
|
-@$(MKDIR) -p $(dir $@)
|
|
$(CC) $(CFLAGS) -MT $(OBJ)/$^.o -M $^ -c -o $@
|
|
|
|
# Compilation rules
|
|
|
|
$(OBJ)/Core/%.c.o: Core/%.c
|
|
-@$(MKDIR) -p $(dir $@)
|
|
$(CC) $(CFLAGS) -DGB_INTERNAL -c $< -o $@
|
|
|
|
$(OBJ)/%.c.o: %.c
|
|
-@$(MKDIR) -p $(dir $@)
|
|
$(CC) $(CFLAGS) -c $< -o $@
|
|
|
|
# HexFiend requires more flags
|
|
$(OBJ)/HexFiend/%.m.o: HexFiend/%.m
|
|
-@$(MKDIR) -p $(dir $@)
|
|
$(CC) $(CFLAGS) $(OCFLAGS) -c $< -o $@ -fno-objc-arc -include HexFiend/HexFiend_2_Framework_Prefix.pch
|
|
|
|
$(OBJ)/%.m.o: %.m
|
|
-@$(MKDIR) -p $(dir $@)
|
|
$(CC) $(CFLAGS) $(OCFLAGS) -c $< -o $@
|
|
|
|
# Cocoa Port
|
|
|
|
$(BIN)/SameBoy.app: $(BIN)/SameBoy.app/Contents/MacOS/SameBoy \
|
|
$(shell ls Cocoa/*.icns Cocoa/*.png) \
|
|
Cocoa/License.html \
|
|
Cocoa/Info.plist \
|
|
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 \
|
|
$(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
|
|
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)
|
|
-@$(MKDIR) -p $(dir $@)
|
|
$(CC) $^ -o $@ $(LDFLAGS) -framework OpenGL -framework AudioUnit -framework AVFoundation -framework CoreVideo -framework CoreMedia -framework IOKit
|
|
ifeq ($(CONF), release)
|
|
strip $@
|
|
endif
|
|
|
|
$(BIN)/SameBoy.app/Contents/Resources/Base.lproj/%.nib: Cocoa/%.xib
|
|
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 $^ $@
|
|
|
|
# SDL Port
|
|
|
|
# Unix versions build only one binary
|
|
$(BIN)/SDL/sameboy: $(CORE_OBJECTS) $(SDL_OBJECTS)
|
|
-@$(MKDIR) -p $(dir $@)
|
|
$(CC) $^ -o $@ $(LDFLAGS) $(SDL_LDFLAGS)
|
|
ifeq ($(CONF), release)
|
|
strip $@
|
|
endif
|
|
|
|
# Windows version builds two, one with a conole and one without it
|
|
$(BIN)/SDL/sameboy.exe: $(CORE_OBJECTS) $(SDL_OBJECTS) $(OBJ)/Windows/resources.o
|
|
-@$(MKDIR) -p $(dir $@)
|
|
$(CC) $^ -o $@ $(LDFLAGS) $(SDL_LDFLAGS) -Wl,/subsystem:windows
|
|
|
|
$(BIN)/SDL/sameboy_debugger.exe: $(CORE_OBJECTS) $(SDL_OBJECTS) $(OBJ)/Windows/resources.o
|
|
-@$(MKDIR) -p $(dir $@)
|
|
$(CC) $^ -o $@ $(LDFLAGS) $(SDL_LDFLAGS) -Wl,/subsystem:console
|
|
|
|
ifneq ($(USE_WINDRES),)
|
|
$(OBJ)/%.o: %.rc
|
|
-@$(MKDIR) -p $(dir $@)
|
|
windres --preprocessor cpp -DVERSION=\"$(VERSION)\" $^ $@
|
|
else
|
|
$(OBJ)/%.res: %.rc
|
|
-@$(MKDIR) -p $(dir $@)
|
|
rc /fo $@ /dVERSION=\"$(VERSION)\" $^
|
|
|
|
%.o: %.res
|
|
cvtres /OUT:"$@" $^
|
|
endif
|
|
|
|
# We must provide SDL2.dll with the Windows port.
|
|
$(BIN)/SDL/SDL2.dll:
|
|
@$(eval MATCH := $(shell where $$LIB:SDL2.dll))
|
|
cp "$(MATCH)" $@
|
|
|
|
# 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
|
|
-@$(MKDIR) -p $(dir $@)
|
|
cp -f $^ $@
|
|
|
|
$(BIN)/SDL/LICENSE: LICENSE
|
|
-@$(MKDIR) -p $(dir $@)
|
|
cp -f $^ $@
|
|
|
|
$(BIN)/SDL/registers.sym: Misc/registers.sym
|
|
-@$(MKDIR) -p $(dir $@)
|
|
cp -f $^ $@
|
|
|
|
$(BIN)/SDL/background.bmp: SDL/background.bmp
|
|
-@$(MKDIR) -p $(dir $@)
|
|
cp -f $^ $@
|
|
|
|
$(BIN)/SDL/Shaders: Shaders
|
|
-@$(MKDIR) -p $@
|
|
cp -rf Shaders/*.fsh $@
|
|
|
|
# Boot ROMs
|
|
|
|
$(OBJ)/%.1bpp: %.png
|
|
-@$(MKDIR) -p $(dir $@)
|
|
rgbgfx -d 1 -h -o $@ $<
|
|
|
|
$(OBJ)/BootROMs/SameBoyLogo.pb8: $(OBJ)/BootROMs/SameBoyLogo.1bpp $(PB8_COMPRESS)
|
|
$(realpath $(PB8_COMPRESS)) -l 384 $< $@
|
|
|
|
$(PB8_COMPRESS): BootROMs/pb8.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
|
|
|
|
$(BIN)/BootROMs/%.bin: BootROMs/%.asm $(OBJ)/BootROMs/SameBoyLogo.pb8
|
|
-@$(MKDIR) -p $(dir $@)
|
|
rgbasm -i $(OBJ)/BootROMs/ -i BootROMs/ -o $@.tmp $<
|
|
rgblink -o $@.tmp2 $@.tmp
|
|
dd if=$@.tmp2 of=$@ count=1 bs=$(if $(findstring dmg,$@)$(findstring sgb,$@),256,2304)
|
|
@rm $@.tmp $@.tmp2
|
|
|
|
# Libretro Core (uses its own build system)
|
|
libretro:
|
|
$(MAKE) -C libretro
|
|
|
|
# Clean
|
|
clean:
|
|
rm -rf build
|
|
|
|
.PHONY: libretro
|