!IF DEFINED(DEBUG)
LINK_FLAGS = /nologo /DEBUG shell32.lib
CL_FLAGS = /nologo /Zi /O2 /W3 /DFACTOR_DEBUG
!ELSE
LINK_FLAGS = /nologo shell32.lib
CL_FLAGS = /nologo /O2 /W3
!ENDIF

EXE_OBJS = factor.dll.lib vm\main-windows-nt.obj vm\factor.res

DLL_OBJS = vm\os-windows-nt.obj \
	vm\os-windows.obj \
	vm\aging_collector.obj \
	vm\alien.obj \
	vm\arrays.obj \
	vm\bignum.obj \
	vm\booleans.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\image.obj \
	vm\inline_cache.obj \
	vm\instruction_operands.obj \
	vm\io.obj \
	vm\jit.obj \
	vm\math.obj \
	vm\nursery_collector.obj \
	vm\object_start_map.obj \
	vm\objects.obj \
	vm\primitives.obj \
	vm\profiler.obj \
	vm\quotations.obj \
	vm\run.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 $<

.rs.res:
	rc $<

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

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)
	link $(LINK_FLAGS) /out:factor.com /SUBSYSTEM:console $(EXE_OBJS)

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

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

.PHONY: all clean

.SUFFIXES: .rs