#
#  Rules for building the Allegro library with DMC. This file is included
#  by the primary makefile, and should not be used directly.
#
#  See makefile.all for a list of the available targets.



# -------- define some variables that the primary makefile will use --------

PLATFORM = DMC
CC = dmc
LIBRARIAN = lib
RESOURCE_COMPILER = rcc
EXE = .exe
OBJ = .obj
HTML = html

PLATFORM_DIR = obj/dmc

ifdef STATICLINK

# -------- link as a static library --------

OBJ_DIR = obj\dmc\$(VERSION)_s
IMPLIB_BASENAME = $(VERSION)_s.lib
IMPLIB_NAME = lib\dmc\$(IMPLIB_BASENAME)
LIB_NAME = $(IMPLIB_NAME)

else

# -------- link as a DLL --------

OBJ_DIR = obj\dmc\$(VERSION)
IMPLIB_BASENAME = $(VERSION).lib
DLL_BASENAME = $(VERSION)$(LIBRARY_VERSION).dll
DLL_NAME = lib\dmc\$(DLL_BASENAME)
IMPLIB_NAME = lib\dmc\$(IMPLIB_BASENAME)
LIB_NAME = $(DLL_NAME) $(IMPLIB_NAME)
EXPDEF_NAME = lib\dmc\allegro.def

endif # STATICLINK



# -------- check that environment path variable is set --------

.PHONY: badwin baddmcdir badusec

ifeq ($(OS),Windows_NT)
   WINSYSDIR = $(SYSTEMROOT)
   ifeq ($(WINSYSDIR),)
      WINSYSDIR = $(SystemRoot)
   endif
   WINSUBDIR = system32
else
   WINSYSDIR = $(WINDIR)
   ifeq ($(WINSYSDIR),)
      WINSYSDIR = $(windir)
   endif
   WINSUBDIR = system
endif

ifneq ($(WINSYSDIR),)
   WINDIR_U = $(subst \,/,$(WINSYSDIR)/$(WINSUBDIR))
   WINDIR_D = $(subst /,\,$(WINSYSDIR)\$(WINSUBDIR))
else

badwin:
	@echo Your SYSTEMROOT or WINDIR environment variable is not set!
endif

ifdef DMCDIR
   DMCDIR_U = $(subst \,/,$(DMCDIR))
   DMCDIR_D = $(subst /,\,$(DMCDIR))
else
baddmcdir:
	@echo Your DMCDIR environment variable is not set!
	@echo See the docs/build/dmc.txt file!
endif

#
# Note: this warning doesn't get triggered when doing 'make lib', but it 
#       doesn't really matter. The C version always gets built, regardless 
#       of the setting.
#
ifndef ALLEGRO_USE_C
badusec:
	@echo You must use the C-only version of Allegro when building with DMC.
	@echo Set ALLEGRO_USE_C=1 when running make.
endif

NULLSTRING :=
SPACE := $(NULLSTRING) # special magic to get an isolated space character

ifneq ($(findstring $(SPACE),$(DMCDIR)),)
badspaces:
	@echo There are spaces in your DMCDIR environment variable:
	@echo please change it to the 8.3 short filename version,
	@echo or move your compiler to a different directory.
endif



# -------- give a sensible default target for make without any args --------

.PHONY: _default

_default: default



# -------- decide what compiler options to use --------

ifdef WARNMODE
   WFLAGS = -wc
else
   WFLAGS = -w2 -w7
endif

ifndef TARGET_OPTS
   TARGET_OPTS = -o -5
endif

OFLAGS = $(TARGET_OPTS)

CFLAGS = -v0 -DALLEGRO_LIB_BUILD -Jm -mn -WD



ifdef DEBUGMODE

# -------- debugging build --------

CFLAGS += -DDEBUGMODE=$(DEBUGMODE) $(WFLAGS) $(PFLAGS) -g
SFLAGS = -DDEBUGMODE=$(DEBUGMODE) $(WFLAGS)
LFLAGS += -g

else
ifdef PROFILEMODE

# -------- profiling build --------

CFLAGS += $(WFLAGS) $(OFLAGS) $(PFLAGS) 
SFLAGS = $(WFLAGS)
LFLAGS += 

else

# -------- optimised build --------

CFLAGS += $(WFLAGS) $(OFLAGS) $(PFLAGS)
SFLAGS = $(WFLAGS)
ifndef SYMBOLMODE
   LFLAGS +=
endif

endif
endif



# -------- list platform specific objects and programs --------

VPATH = src/win src/misc tests/win tools/win src/c

# ------ build a C-only version ------
CFLAGS += -DALLEGRO_NO_ASM
SFLAGS += -DALLEGRO_NO_ASM

OBJECT_LIST = $(COMMON_OBJECTS) $(C_OBJECTS) $(basename $(notdir $(ALLEGRO_SRC_WIN_FILES)))
# The dllver resource cannot be compiled into a OBJ file by DM's rcc program. 
# It will be created and linked in later at make lib time. Also, the asmlock.s file does not
# exist in the C build.
OBJECT_LIST := $(subst dllver,,$(OBJECT_LIST))   
OBJECT_LIST := $(subst asmlock,,$(OBJECT_LIST))

LIBRARIES = kernel32.lib user32.lib gdi32.lib comdlg32.lib ole32.lib dinput.lib ddraw.lib winmm.lib dsound.lib dxguid.lib

ifdef PROFILEMODE
   LIBRARIES += -lgmon
endif

PROGRAMS = dibgrab dibhello dibsound dxwindow scrsave wfixicon

dibgrab: tests/win/dibgrab.exe
dibhello: tests/win/dibhello.exe
dibsound: tests/win/dibsound.exe
dxwindow: tests/win/dxwindow.exe
scrsave: tests/win/scrsave.scr
wfixicon: tools/win/wfixicon.exe



# -------- rules for installing and removing the library files --------

INSTALLDIR = $(DMCDIR_U)
LIBDIR = lib
INCDIR = include

$(DMCDIR_U)/lib/$(IMPLIB_BASENAME): $(IMPLIB_NAME) $(DMCDIR_U)/lib
	copy lib\dmc\$(IMPLIB_BASENAME) $(DMCDIR_D)\lib

$(WINDIR_U)/$(DLL_BASENAME): $(DLL_NAME)
	copy lib\dmc\$(DLL_BASENAME) $(WINDIR_D)

HEADERS = $(DMCDIR_U)/include/winalleg.h                  \
          $(DMCDIR_U)/include/allegro/platform/aintwin.h  \
          $(DMCDIR_U)/include/allegro/platform/al386gcc.h \
          $(DMCDIR_U)/include/allegro/platform/aldmc.h    \
          $(DMCDIR_U)/include/allegro/platform/alplatf.h  \
          $(DMCDIR_U)/include/allegro/platform/astdint.h  \
          $(DMCDIR_U)/include/allegro/platform/alwin.h

INSTALL_FILES = $(DMCDIR_U)/lib/$(IMPLIB_BASENAME)

ifndef STATICLINK
   INSTALL_FILES += $(WINDIR_U)/$(DLL_BASENAME)
endif

INSTALL_FILES += $(HEADERS)

install: generic-install
	@echo The $(DESCRIPTION) $(PLATFORM) library has been installed.

UNINSTALL_FILES = $(DMCDIR_U)/lib/liballeg.a             \
                  $(DMCDIR_U)/lib/liballd.a              \
                  $(DMCDIR_U)/lib/liballp.a              \
                  $(DMCDIR_U)/lib/liballeg_s.a           \
                  $(DMCDIR_U)/lib/liballd_s.a            \
                  $(DMCDIR_U)/lib/liballp_s.a            \
                  $(WINDIR_U)/alleg$(LIBRARY_VERSION).dll \
                  $(WINDIR_U)/alld$(LIBRARY_VERSION).dll  \
                  $(WINDIR_U)/allp$(LIBRARY_VERSION).dll  \
                  $(HEADERS)

uninstall: generic-uninstall
	@echo All gone!



# -------- helper function for compressing the executables --------

.PHONY: compress

compress:
ifdef UPX_BIN
	$(UPX_BIN) demo/*.exe examples/*.exe setup/*.exe tests/*.exe tools/*.exe lib/dmc/all*.dll
else
	@echo No executable compressor specified! You must set the environment variable
	@echo UPX_BIN to point to upx.exe.
endif



# -------- test capabilities --------

TEST_CPP = $(CC) -c src/misc/test.cpp -o$(PLATFORM_DIR)/test.obj

include makefile.tst



# -------- finally, we get to the fun part... --------

DLLWRAP = dllwrap
WINDRES = windres
AR = ar

ifdef STATICLINK

# -------- link as a static library --------

define MAKE_LIB
   $(LIBRARIAN) -p128 -n -c $(LIB_NAME) $(OBJECTS) 
endef

COMPILE_FLAGS = -DALLEGRO_STATICLINK 

else

# -------- link as a DLL --------

#   $(DLLWRAP) $(PFLAGS) --target i386-dmc --def $(EXPDEF_NAME) -o$(DLL_NAME) $(OBJECTS) $(LIBRARIES) --output-lib $(IMPLIB_NAME)

LINKER_OBJECTS = $(subst $(SPACE),+,$(subst /,\,$(OBJECTS)))
LINKER_LIBS    = $(subst -l,,$(subst $(SPACE),+,$(subst /,\,$(LIBRARIES))))
LINKER_EXDEF   = $(subst /,\,$(EXPDEF_NAME))
LINKER_DLL     = $(subst /,\,$(DLL_NAME))
LINKER_IMPLIB  = $(subst /,\,$(IMPLIB_NAME))

#   link /noi /implib:$(LINKER_IMPLIB) $(LINKER_OBJECTS),$(LINKER_DLL),,$(LINKER_LIBS),$(LINKER_EXDEF)

define MAKE_LIB
   $(RESOURCE_COMPILER) -32 src/win/dllver.rc -o$(OBJ_DIR)/dllver.res
   $(CC) -v0 -L/EXETYPE:NT -L/SUBSYSTEM:CONSOLE -L/IMPLIB:$(LINKER_IMPLIB) -o$(LINKER_DLL) $(subst /,\,$(OBJECTS)) $(subst /,\,$(LIBRARIES)) $(LINKER_EXDEF) $(OBJ_DIR)\dllver.res
endef

endif # STATICLINK

COMPILE_FLAGS += $(subst src/,-DALLEGRO_SRC ,$(findstring src/, $<))$(CFLAGS)

$(OBJ_DIR)/%.obj: %.c
	$(CC) $(COMPILE_FLAGS) -I. -I./include -o$@ -c $<

$(OBJ_DIR)/%.obj: %.cpp
	$(CC) $(COMPILE_FLAGS) -I. -I./include -o$@ -c $<
	
$(OBJ_DIR)/%.res: %.rc
	$(RESOURCE_COMPILER) -32 $< -o$@
	
obj/dmc/%.res: %.rc
	$(RESOURCE_COMPILER) -32 $< -o$@
	
tests/win/dibsound.exe: $(OBJ_DIR)/dibsound.obj obj/dmc/dibsound.res $(IMPLIB_NAME)
	$(CC) $(LFLAGS) $(PFLAGS) -otests\win\dibsound.exe $(OBJ_DIR)\dibsound.obj obj\dmc\dibsound.res $(IMPLIB_NAME) $(LIBRARIES)

tests/win/dxwindow.exe: $(OBJ_DIR)/dxwindow.obj obj/dmc/dxwindow.res $(IMPLIB_NAME)
	$(CC) $(LFLAGS) $(PFLAGS) -otests\win\dxwindow.exe $(OBJ_DIR)\dxwindow.obj obj\dmc\dxwindow.res $(IMPLIB_NAME) $(LIBRARIES)

tests/win/scrsave.scr: $(OBJ_DIR)/scrsave.obj obj/dmc/scrsave.res $(IMPLIB_NAME)
	$(CC) $(LFLAGS) $(PFLAGS) -otests\win\scrsave.scr $(OBJ_DIR)\scrsave.obj obj\dmc\scrsave.res $(IMPLIB_NAME) $(LIBRARIES)

tools/win/%.exe: $(OBJ_DIR)/%.obj $(IMPLIB_NAME)
	$(CC) $(LFLAGS) $(PFLAGS) -o$(subst /,\,$@) $(subst /,\,$<) $(IMPLIB_NAME) $(LIBRARIES)

obj/dmc/demo.res: demo/demo.dat tools/win/wfixicon.exe
ifdef STATICLINK
	tools/win/wfixicon.exe obj/dmc/demo.ico -ro -d demo/demo.dat SHIP3 GAME_PAL
else
	copy tools\win\wfixicon.exe lib\dmc\wfixicon.exe
	lib/dmc/wfixicon.exe obj/dmc/demo.ico -ro -d demo/demo.dat SHIP3 GAME_PAL
	del lib\dmc\wfixicon.exe
endif

demo/demo.exe: obj/dmc/demo.res $(IMPLIB_NAME)
	$(CC) $(LFLAGS) $(PFLAGS) -o$(subst /,\,$@) $(subst /,\,$(OBJECTS_DEMO)) obj\dmc\demo.res $(IMPLIB_NAME) $(LIBRARIES) -L/SUBSYSTEM:WINDOWS

# Use -DSETUP_USE_COMPILED_DATAFILES ???
$(OBJ_DIR)/setup.obj: setup/setup.c
	$(CC) $(COMPILE_FLAGS) -I. -I./include -o$(OBJ_DIR)/setup.obj -c setup/setup.c

examples/%.exe setup/%.exe tests/%.exe: $(OBJ_DIR)/%.obj $(IMPLIB_NAME)
	$(CC) $(LFLAGS) $(PFLAGS) -L/SUBSYSTEM:WINDOWS -o$(subst /,\,$@) $(subst /,\,$<) $(subst /,\,$(IMPLIB_NAME)) $(LIBRARIES)

LINK_CONSOLE_DEPS = $(IMPLIB_NAME)

define LINK_CONSOLE
   $(CC) $(LFLAGS) $(PFLAGS) -o$(subst /,\,$@) $(subst /,\,$<) $(IMPLIB_NAME) $(LIBRARIES)
endef

obj/dmc/asmdef.inc: obj/dmc/asmdef.exe
	obj/dmc/asmdef.exe obj/dmc/asmdef.inc

obj/dmc/asmdef.exe: src/i386/asmdef.c
	$(CC) -O $(WFLAGS) $(PFLAGS) -I. -I./include -oobj/dmc/asmdef.exe src/i386/asmdef.c

define LINK_WITHOUT_LIB
   $(CC) $(LFLAGS) $(PFLAGS) -o$(subst /,\,$@) $(subst /,\,$^) -L/SUBSYSTEM:WINDOWS
endef

PLUGIN_LIB = lib\dmc\$(VERY_SHORT_VERSION)dat.lib
PLUGINS_H = obj\dmc\plugins.h
PLUGIN_DEPS = $(IMPLIB_NAME) $(PLUGIN_LIB) $(PLUGIN_RUNNER) 
PLUGIN_SCR = scm

define GENERATE_PLUGINS_H
   copy /B tools\plugins\*.inc obj\dmc\plugins.h
endef

define MAKE_PLUGIN_LIB
   $(LIBRARIAN) -c $(PLUGIN_LIB) $(PLUGIN_OBJS)
endef

define LINK_WITH_PLUGINS
   $(CC) $(LFLAGS) $(PFLAGS) -o$(subst /,\,$@) $(subst /,\,$<) $(strip $(PLUGIN_LIB) $(addprefix @,$(PLUGIN_SCRIPTS)) $(IMPLIB_NAME) $(LIBRARIES)) -L/SUBSYSTEM:WINDOWS
endef

define LINK_CONSOLE_WITH_PLUGINS
   $(CC) $(LFLAGS) $(PFLAGS) -o$(subst /,\,$@) $(subst /,\,$<) $(strip $(PLUGIN_LIB) $(addprefix @,$(PLUGIN_SCRIPTS)) $(IMPLIB_NAME) $(LIBRARIES)) 
endef
