SameBoy/Makefile

214 lines
5.8 KiB
Makefile
Raw Normal View History

2016-08-20 14:51:17 +00:00
# Set target, configuration, version and destination folders
PLATFORM := $(shell uname -s)
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
VERSION := 0.6
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
2016-08-20 14:51:17 +00:00
# Set tools
2016-03-30 20:07:55 +00:00
CC := clang
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
# Set compilation and linkage flags based on target, platform and configuration
2016-03-30 20:07:55 +00:00
2016-08-20 14:51:17 +00:00
CFLAGS += -Werror -Wall -std=gnu11 -ICore -D_GNU_SOURCE -DVERSION="$(VERSION)" -I. -D_USE_MATH_DEFINES
2016-03-30 20:07:55 +00:00
SDL_LDFLAGS := -lSDL
2016-08-20 14:51:17 +00:00
ifeq ($(PLATFORM),windows32)
CFLAGS += -IWindows
LDFLAGS += -lmsvcrt -lSDLmain -Wl,/MANIFESTFILE:NUL
2016-08-20 14:51:17 +00:00
else
2016-03-30 20:07:55 +00:00
LDFLAGS += -lc -lm
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)
2016-07-17 19:43:23 +00:00
CFLAGS += -F/Library/Frameworks
2016-03-30 20:07:55 +00:00
OCFLAGS += -x objective-c -fobjc-arc -Wno-deprecated-declarations -isysroot $(shell xcode-select -p)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk -mmacosx-version-min=10.9
2016-06-09 15:22:47 +00:00
LDFLAGS += -framework AppKit -framework Carbon
2016-03-30 20:07:55 +00:00
SDL_LDFLAGS := -framework SDL
endif
2016-08-20 14:51:17 +00:00
ifeq ($(PLATFORM),windows32)
CFLAGS += -Wno-deprecated-declarations # Seems like Microsoft deprecated every single LIBC function
LDFLAGS += -Wl,/NODEFAULTLIB:libcmt
endif
2016-04-01 19:53:29 +00:00
ifeq ($(CONF),debug)
CFLAGS += -g
2016-08-20 14:51:17 +00:00
ifeq ($(PLATFORM),windows32)
LDFLAGS += -Wl,/debug
endif
2016-04-01 19:53:29 +00:00
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" or "release")
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/SDL.dll
else
SDL_TARGET := $(BIN)/sdl/sameboy
endif
2016-03-30 20:07:55 +00:00
cocoa: $(BIN)/Sameboy.app
2016-08-20 14:51:17 +00:00
sdl: $(SDL_TARGET) $(BIN)/sdl/dmg_boot.bin $(BIN)/sdl/cgb_boot.bin $(BIN)/sdl/LICENSE
2016-03-30 20:07:55 +00:00
bootroms: $(BIN)/BootROMs/cgb_boot.bin $(BIN)/BootROMs/dmg_boot.bin
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)
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)
SDL_SOURCES += $(shell ls SDL/*.m)
2016-03-30 20:07:55 +00:00
endif
CORE_OBJECTS := $(patsubst %,$(OBJ)/%.o,$(CORE_SOURCES))
COCOA_OBJECTS := $(patsubst %,$(OBJ)/%.o,$(COCOA_SOURCES))
SDL_OBJECTS := $(patsubst %,$(OBJ)/%.o,$(SDL_SOURCES))
ALL_OBJECTS := $(CORE_OBJECTS) $(COCOA_OBJECTS) $(SDL_OBJECTS)
# Automatic dependency generation
2016-08-20 14:51:17 +00:00
ifneq ($(MAKECMDGOALS),clean)
-include $(CORE_OBJECTS:.o=.dep)
ifneq ($(filter $(MAKECMDGOALS),sdl),)
-include $(SDL_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
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
2016-08-20 14:51:17 +00:00
Shaders:$(shell ls Shaders/*.fsh)
2016-03-30 20:07:55 +00:00
$(BIN)/Sameboy.app: $(BIN)/Sameboy.app/Contents/MacOS/Sameboy \
2016-08-20 14:51:17 +00:00
$(shell ls Cocoa/*.icns) \
2016-04-01 20:36:43 +00:00
Cocoa/License.html \
Cocoa/info.plist \
2016-03-30 20:07:55 +00:00
$(BIN)/BootROMs/dmg_boot.bin \
$(BIN)/BootROMs/cgb_boot.bin \
$(BIN)/Sameboy.app/Contents/Resources/Base.lproj/Document.nib \
2016-04-13 19:43:16 +00:00
$(BIN)/Sameboy.app/Contents/Resources/Base.lproj/MainMenu.nib \
$(BIN)/Sameboy.app/Contents/Resources/Base.lproj/Preferences.nib \
Shaders
2016-08-20 14:51:17 +00:00
$(MKDIR) -p $(BIN)/Sameboy.app/Contents/Resources
2016-03-30 20:07:55 +00:00
cp Cocoa/*.icns $(BIN)/BootROMs/dmg_boot.bin $(BIN)/BootROMs/cgb_boot.bin $(BIN)/Sameboy.app/Contents/Resources/
2016-04-01 20:36:43 +00:00
sed s/@VERSION/$(VERSION)/ < Cocoa/info.plist > $(BIN)/Sameboy.app/Contents/info.plist
2016-04-01 19:13:05 +00:00
cp Cocoa/License.html $(BIN)/Sameboy.app/Contents/Resources/Credits.html
2016-08-20 14:51:17 +00:00
$(MKDIR) -p $(BIN)/Sameboy.app/Contents/Resources/Shaders
cp Shaders/*.fsh $(BIN)/Sameboy.app/Contents/Resources/Shaders
2016-03-30 20:07:55 +00:00
$(BIN)/Sameboy.app/Contents/MacOS/Sameboy: $(CORE_OBJECTS) $(COCOA_OBJECTS)
2016-08-20 14:51:17 +00:00
-@$(MKDIR) -p $(dir $@)
2016-03-30 20:07:55 +00:00
$(CC) $^ -o $@ $(LDFLAGS) -framework OpenGL -framework AudioUnit
ifeq ($(CONF), release)
strip $@
endif
2016-03-30 20:07:55 +00:00
$(BIN)/Sameboy.app/Contents/Resources/Base.lproj/%.nib: Cocoa/%.xib
ibtool --compile $@ $^
2016-08-20 14:51:17 +00:00
# SDL Port
# Unix versions build only one binary
2016-03-30 20:07:55 +00:00
$(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
$(OBJ)/%.res: %.rc
-@$(MKDIR) -p $(dir $@)
rc /fo $@ /dVERSION=\"$(VERSION)\" $^
%.o: %.res
cvtres /OUT:"$@" $^
2016-08-20 14:51:17 +00:00
# We must provide SDL.dll with the Windows port. This is an AWFUL HACK to find it.
SPACE :=
SPACE +=
$(BIN)/sdl/SDL.dll:
@$(eval POTENTIAL_MATCHES := $(subst @@@," ",$(patsubst %,%/SDL.dll,$(subst ;,$(SPACE),$(subst $(SPACE),@@@,$(lib))))))
@$(eval MATCH := $(shell ls $(POTENTIAL_MATCHES) 2> NUL | head -n 1))
cp "$(MATCH)" $@
$(BIN)/sdl/%.bin: $(BIN)/BootROMs/%.bin
-@$(MKDIR) -p $(dir $@)
cp -f $^ $@
2016-03-30 20:07:55 +00:00
2016-08-20 14:51:17 +00:00
$(BIN)/sdl/LICENSE: LICENSE
cp -f $^ $@
# Boot ROMs
2016-03-30 20:07:55 +00:00
$(BIN)/BootROMs/%.bin: BootROMs/%.asm
2016-08-20 14:51:17 +00:00
-@$(MKDIR) -p $(dir $@)
2016-03-30 20:07:55 +00:00
cd BootROMs && rgbasm -o ../$@.tmp ../$<
rgblink -o $@.tmp2 $@.tmp
2016-08-06 21:39:32 +00:00
head -c $(if $(findstring dmg,$@), 256, 2304) $@.tmp2 > $@
2016-03-30 20:07:55 +00:00
@rm $@.tmp $@.tmp2
2016-08-20 14:51:17 +00:00
# Clean
2016-03-30 20:07:55 +00:00
clean:
2016-08-20 14:51:17 +00:00
rm -rf build