# Copyright 2005, 2010 Aplix Corporation. All rights reserved.

APP := app/$(notdir $(basename $(CURDIR)))
TARGET := win32vc_custom4

TOP = ../../

CONFIG_FILES := config.gmk
CONFIG_FILES += $(TOP)/app/config.gmk
CONFIG_FILES += $(TOP)/target/$(TARGET)/config.gmk

-include $(CONFIG_FILES)

ROMIZER_FLAGS += \
	-keepall

.PHONY: clean

all: $(TARGET_EXE)
lib: $(TARGET_LIB)
app: $(TARGET_EXE) $(TARGET_APP)

# rhfBNg
dirs := $(BUILD)/classes $(BUILD)/appclasses $(BUILD)/native $(BUILD)/target

$(dirs):
	mkdir -p $@

# RANX̃rh
CONF_SRC_ALT := $(shell $(FIND) $(TOP)/target/$(TARGET)/alt_javasrc/ -name "C.java" -follow)
ifneq ($(CONF_SRC_ALT),)
	CONF_SRC := $(TOP)/vmclasses/src/jp/co/aplix/conf/C.java
endif
CONF_OBJS := $(CONF_SRC_ALT:.java=.class)
CONF_OBJS := $(CONF_OBJS:$(TOP)/target/$(TARGET)/alt_javasrc/%=$(BUILD)/classes/%)

CORE_SRCS := $(filter-out %package-info.java,$(shell $(FIND) $(TOP)/vmclasses/src -name "*.java"))
CORE_SRCS := $(filter-out $(CONF_SRC),$(CORE_SRCS))
CORE_OBJS := $(CORE_SRCS:.java=.class)
CORE_OBJS := $(CORE_OBJS:$(TOP)/vmclasses/src/%=$(BUILD)/classes/%)

CORE_SRCS += $(CONF_SRC_ALT)
CORE_OBJS += $(CONF_OBJS) 

$(CORE_OBJS): $(CORE_SRCS)
	$(JAVAC) $(JAVACFLAGS) -nowarn -d $(BUILD)/classes $(CORE_SRCS)

# AvP[Ṽrh
ALLAPP_SRCS := $(shell $(FIND) src -name "*.java")
COMMON_SRCS := $(filter-out src/target/%,$(ALLAPP_SRCS))
COMMON_OBJS := $(COMMON_SRCS:.java=.class)
COMMON_OBJS := $(COMMON_OBJS:src/%=$(BUILD)/appclasses/%)
TARGET_SRCS := $(filter src/target/$(TARGET)/%,$(ALLAPP_SRCS))
TARGET_OBJS := $(TARGET_SRCS:.java=.class)
TARGET_OBJS := $(TARGET_OBJS:src/target/$(TARGET)/%=$(BUILD)/appclasses/%)
APP_SRCS := $(filter-out %package-info.java,$(COMMON_SRCS) $(TARGET_SRCS))
APP_OBJS := $(filter-out %package-info.class,$(COMMON_OBJS) $(TARGET_OBJS))

$(APP_OBJS): $(APP_SRCS) $(CORE_OBJS)
	$(JAVAC) $(JAVACFLAGS) -d $(BUILD)/appclasses $(APP_SRCS)

# AvP[ṼlCeBu\bh
NATIVE_INCS := $(wildcard native/*.h)
NATIVE_SRCS := $(wildcard native/*.c)
NATIVE_OBJS := $(NATIVE_SRCS:.c=.$(OBJ_EXT))
NATIVE_OBJS := $(NATIVE_OBJS:native/%=$(BUILD)/native/%)

# AvP[Ṽ}CY
HEADERS := $(patsubst %,-h %,$(notdir $(NATIVE_INCS)))

# }CY\[X
ROM_RESOURCES := $(wildcard rom_resources/*.bin)\
		 $(wildcard rom_resources/*.bmp)\
		 $(wildcard rom_resources/*.png)\
		 $(wildcard rom_resources/*.gif)\
		 $(wildcard rom_resources/*.jpg)

$(CLASS_DATA): $(NATIVE_INCS) $(ROMIZER)
$(CLASS_DATA): $(CORE_OBJS) $(APP_OBJS) $(ROM_RESOURCES)
	java -cp $(ROMIZER) avm.romize.main.romizer $(ROMIZER_FLAGS) \
	$(HEADERS) -i $(BUILD)/classes -i $(BUILD)/appclasses -o $@

# }CYf[^̃IuWFNg
CLASS_OBJECT := $(CLASS_DATA:.c=.$(OBJ_EXT))

# ǉAvP[Ṽf[^
ifdef ADDIN_APP
OPTIONS := DEBUG=$(DEBUG) JDWP=$(JDWP) TEST=$(TEST) VERBOSE=$(VERBOSE)
OPTIONS += ADDIN_APP=
ADDIN_DATA := $(ADDIN_APP:%=$(TOP)/app/%/$(TARGET_APP))
$(ADDIN_DATA): FORCE
	cd $(subst $(TARGET_APP),,$@) && $(MAKE) app $(OPTIONS)
FORCE:

$(ADDIN_SRC): $(ADDIN_DATA)
	$(APP2SRC) $(ADDIN_DATA) > $@

ADDIN_OBJECT := $(ADDIN_SRC:.c=.$(OBJ_EXT))
endif

TARGET_OBJS = $(OBJECTS) $(NATIVE_OBJS) $(CLASS_OBJECT) $(ADDIN_OBJECT)

# s`̃rh
$(TARGET_EXE): $(dirs) $(TARGET_OBJS) $(VM_LIB)
	$(LD) $(LDFLAGS) $(TARGET_OBJS) $(LIBS)
	$(OBJCOPY)

# ^[QbgCu̍쐬
$(TARGET_LIB): $(dirs) $(TARGET_OBJS)
	$(AR) $(ARFLAGS) $(TARGET_OBJS)

# [hAvP[Vf[^̍쐬
$(TARGET_APP): $(APP_OBJS)
	cat `$(FIND) $(BUILD)/appclasses -name "*.class"` > $@

# ʂ̃[

.SUFFIXS:

INCDIR += native

$(OBJECTS) $(NATIVE_OBJS) $(CORE_OBJS) $(APP_OBJS): $(CONFIG_FILES)
$(ADDIN_SRC): $(CONFIG_FILES)

$(CLASS_OBJECT): $(NATIVE_INCS)
$(CLASS_OBJECT): $(CLASS_DATA)
	$(CC) $(CFLAGS) $(CFLAGS_CLASS_DATA) $(DEFINES) $(INCLUDES) $(OUTPUT_OPTION) $<

$(ADDIN_OBJECT): $(ADDIN_SRC)
	$(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) $(OUTPUT_OPTION) $<

$(NATIVE_OBJS): $(NATIVE_INCS)
$(NATIVE_OBJS): $(BUILD)/native/%.$(OBJ_EXT): native/%.c
	$(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) $(OUTPUT_OPTION) $<

$(s_OBJS): $(BUILD)/target/%.$(OBJ_EXT): $(SRCDIR)/%.s
	$(AS) $(ASFLAGS) $(OUTPUT_OPTION) $<

$(S_OBJS): $(BUILD)/target/%.$(OBJ_EXT): $(SRCDIR)/%.S
	$(AS) $(ASFLAGS) $(DEFINES) $(INCLUDES) $(OUTPUT_OPTION) $<

$(C_OBJS): $(wildcard $(TOP)/target/$(TARGET)/include/*.h)
$(C_OBJS): $(wildcard $(TOP)/app/include/*.h)
$(C_OBJS): $(BUILD)/target/%.$(OBJ_EXT): $(SRCDIR)/%.c
	$(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) $(OUTPUT_OPTION) $<

clean:
	-rm -rf $(BUILD)

