!IF !DEFINED(BOOTIMAGE_VERSION)
BOOTIMAGE_VERSION = latest
!ENDIF

!IF !DEFINED(VERSION)
VERSION = version-missing
!ENDIF

!IF !DEFINED(GIT_LABEL)
GIT_LABEL = git-label-missing
!ENDIF

!IF DEFINED(PLATFORM)

LINK_FLAGS = /nologo shell32.lib
CL_FLAGS = /nologo /O2 /WX /W3 /D_CRT_SECURE_NO_WARNINGS /DFACTOR_VERSION=$(VERSION) /DFACTOR_GIT_LABEL=$(GIT_LABEL)
CL_FLAGS_VISTA = /D_WIN32_WINNT=0x0600

!IF DEFINED(DEBUG)
LINK_FLAGS = $(LINK_FLAGS) /DEBUG
CL_FLAGS = $(CL_FLAGS) /Zi /DFACTOR_DEBUG
!ENDIF

!IF "$(PLATFORM)" == "x86-32"
LINK_FLAGS = $(LINK_FLAGS) /safeseh
PLAF_DLL_OBJS = vm\os-windows-x86.32.obj vm\safeseh.obj vm\cpu-x86.obj

!ELSEIF "$(PLATFORM)" == "x86-32-vista"
LINK_FLAGS = $(LINK_FLAGS) /safeseh
CL_FLAGS = $(CL_FLAGS) $(CL_FLAGS_VISTA)
PLAF_DLL_OBJS = vm\os-windows-x86.32.obj vm\safeseh.obj vm\cpu-x86.obj

!ELSEIF "$(PLATFORM)" == "x86-64"
PLAF_DLL_OBJS = vm\os-windows-x86.64.obj vm\cpu-x86.obj

!ELSEIF "$(PLATFORM)" == "x86-64-vista"
CL_FLAGS = $(CL_FLAGS) $(CL_FLAGS_VISTA)
PLAF_DLL_OBJS = vm\os-windows-x86.64.obj vm\cpu-x86.obj
!ENDIF

!IF DEFINED(DEBUG)
LINK_FLAGS = $(LINK_FLAGS) /DEBUG
CL_FLAGS = $(CL_FLAGS) /Zi /DFACTOR_DEBUG
!ENDIF

ML_FLAGS = /nologo /safeseh

EXE_OBJS = vm\main-windows.obj vm\factor.res

DLL_OBJS = $(PLAF_DLL_OBJS) \
	vm\os-windows.obj \
	vm\aging_collector.obj \
	vm\alien.obj \
	vm\arrays.obj \
	vm\bignum.obj \
	vm\byte_arrays.obj \
	vm\callbacks.obj \
	vm\callstack.obj \
	vm\code_blocks.obj \
	vm\code_heap.obj \
	vm\compaction.obj \
	vm\contexts.obj \
	vm\data_heap.obj \
	vm\data_heap_checker.obj \
	vm\debug.obj \
	vm\dispatch.obj \
	vm\entry_points.obj \
	vm\errors.obj \
	vm\factor.obj \
	vm\free_list.obj \
	vm\full_collector.obj \
	vm\gc.obj \
	vm/gc_info.obj \
	vm\image.obj \
	vm\inline_cache.obj \
	vm\instruction_operands.obj \
	vm\io.obj \
	vm\jit.obj \
	vm\math.obj \
	vm\mvm.obj \
	vm\mvm-windows.obj \
	vm\nursery_collector.obj \
	vm\object_start_map.obj \
	vm\objects.obj \
	vm\primitives.obj \
	vm\quotations.obj \
	vm\run.obj \
	vm\safepoints.obj \
	vm\sampling_profiler.obj \
	vm\strings.obj \
	vm\to_tenured_collector.obj \
	vm\tuples.obj \
	vm\utilities.obj \
	vm\vm.obj \
	vm\words.obj

.cpp.obj:
	cl /EHsc $(CL_FLAGS) /Fo$@ /c $<

.c.obj:
	cl $(CL_FLAGS) /Fo$@ /c $<

.asm.obj:
	ml $(ML_FLAGS) /Fo$@ /c $<

.rs.res:
	rc $<

libfactor-ffi-test.dll: vm/ffi_test.obj
	link $(LINK_FLAGS) /out:libfactor-ffi-test.dll /dll vm/ffi_test.obj

factor.dll.lib: $(DLL_OBJS)
	link $(LINK_FLAGS) /implib:factor.dll.lib /out:factor.dll /dll $(DLL_OBJS)

factor.com: $(EXE_OBJS) $(DLL_OBJS)
	link $(LINK_FLAGS) /out:factor.com /SUBSYSTEM:console $(EXE_OBJS) $(DLL_OBJS)

factor.exe: $(EXE_OBJS) $(DLL_OBJS)
	link $(LINK_FLAGS) /out:factor.exe /SUBSYSTEM:windows $(EXE_OBJS) $(DLL_OBJS)

all: factor.com factor.exe factor.dll.lib libfactor-ffi-test.dll

!ENDIF

default:
	@echo Usage: nmake /f Nmakefile platform
	@echo Where platform is one of:
	@echo x86-32
	@echo x86-64
	@echo x86-32-vista
	@echo x86-64-vista
	@exit 1

x86-32:
	nmake /nologo PLATFORM=x86-32 /f Nmakefile all

x86-64:
	nmake /nologo PLATFORM=x86-64 /f Nmakefile all

x86-32-vista:
	nmake /nologo PLATFORM=x86-32-vista /f Nmakefile all

x86-64-vista:
	nmake /nologo PLATFORM=x86-64-vista /f Nmakefile all

clean:
	del vm\*.obj
	if exist factor.lib del factor.lib
	if exist factor.res del factor.res
	if exist factor.com del factor.com
	if exist factor.exe del factor.exe
	if exist factor.dll del factor.dll
	if exist factor.dll.lib del factor.dll.lib

.PHONY: all default x86-32 x86-64 x86-32-vista x86-64-vista clean

.SUFFIXES: .rs