]> gitweb.factorcode.org Git - factor.git/blobdiff - Nmakefile
Fixes #2966
[factor.git] / Nmakefile
old mode 100755 (executable)
new mode 100644 (file)
index 1e6d3a0..f87fb76
--- a/Nmakefile
+++ b/Nmakefile
@@ -1,36 +1,91 @@
-!IF !DEFINED(BOOTIMAGE_VERSION)
-BOOTIMAGE_VERSION = latest
+VERSION = 0.100
+
+# Crazy hack to do shell commands
+# We do it in Nmakefile because that way we don't have to invoke build through build.cmd
+# and we can just do ``nmake /f Nmakefile x86-64-vista`` or similar
+# and we still get the git branch, id, etc
+
+!IF [git describe --all > git-describe.tmp] == 0
+GIT_DESCRIBE = \
+!INCLUDE <git-describe.tmp>
+!IF [del git-describe.tmp] == 0
+!ENDIF
+!ENDIF
+
+!IF [git rev-parse HEAD > git-id.tmp] == 0
+GIT_ID = \
+!INCLUDE <git-id.tmp>
+!IF [del git-id.tmp] == 0
+!ENDIF
 !ENDIF
 
 !ENDIF
 
+!IF [git rev-parse --abbrev-ref HEAD > git-branch.tmp] == 0
+GIT_BRANCH = \
+!INCLUDE <git-branch.tmp>
+!IF [del git-branch.tmp] == 0
+!ENDIF
+!ENDIF
+
+GIT_LABEL = $(GIT_DESCRIBE)-$(GIT_ID)
+
 !IF DEFINED(PLATFORM)
 
 !IF DEFINED(PLATFORM)
 
-LINK_FLAGS = /nologo shell32.lib
-CL_FLAGS = /nologo /O2 /W3 /D_CRT_SECURE_NO_WARNINGS
+LINK_FLAGS = /nologo shell32.lib user32.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 "$(PLATFORM)" == "x86-32"
+LINK_FLAGS = $(LINK_FLAGS) /safeseh /largeaddressaware
+PLAF_DLL_OBJS = vm\os-windows-x86.32.obj vm\safeseh.obj vm\cpu-x86.obj
+SUBSYSTEM_COM_FLAGS = console,"5.01"
+SUBSYSTEM_EXE_FLAGS = windows,"5.01"
+
+!ELSEIF "$(PLATFORM)" == "x86-32-vista"
+LINK_FLAGS = $(LINK_FLAGS) /safeseh /largeaddressaware
+CL_FLAGS = $(CL_FLAGS) $(CL_FLAGS_VISTA)
+PLAF_DLL_OBJS = vm\os-windows-x86.32.obj vm\safeseh.obj vm\cpu-x86.obj
+SUBSYSTEM_COM_FLAGS = console
+SUBSYSTEM_EXE_FLAGS = windows
+
+!ELSEIF "$(PLATFORM)" == "x86-64"
+PLAF_DLL_OBJS = vm\os-windows-x86.64.obj vm\cpu-x86.obj
+SUBSYSTEM_COM_FLAGS = console,"5.02"
+SUBSYSTEM_EXE_FLAGS = windows,"5.02"
+
+
+!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
+SUBSYSTEM_COM_FLAGS = console
+SUBSYSTEM_EXE_FLAGS = windows
+
+!ELSE
+CL_FLAGS = $(CL_FLAGS) $(CL_FLAGS_VISTA)
+PLAF_DLL_OBJS = vm\os-windows-x86.64.obj vm\cpu-x86.obj
+SUBSYSTEM_COM_FLAGS = console
+SUBSYSTEM_EXE_FLAGS = windows
+
+!ENDIF
 
 !IF DEFINED(DEBUG)
 LINK_FLAGS = $(LINK_FLAGS) /DEBUG
 CL_FLAGS = $(CL_FLAGS) /Zi /DFACTOR_DEBUG
 !ENDIF
 
 
 !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-nt-x86.32.obj vm\safeseh.obj
-!ELSEIF "$(PLATFORM)" == "x86-64"
-PLAF_DLL_OBJS = vm\os-windows-nt-x86.64.obj
+!IF DEFINED(REPRODUCIBLE)
+CL_FLAGS = $(CL_FLAGS) /DFACTOR_REPRODUCIBLE
 !ENDIF
 
 ML_FLAGS = /nologo /safeseh
 
 !ENDIF
 
 ML_FLAGS = /nologo /safeseh
 
-EXE_OBJS = vm\main-windows-nt.obj vm\factor.res
+EXE_OBJS = vm\main-windows.obj vm\factor.res
 
 DLL_OBJS = $(PLAF_DLL_OBJS) \
        vm\os-windows.obj \
 
 DLL_OBJS = $(PLAF_DLL_OBJS) \
        vm\os-windows.obj \
-       vm\os-windows-nt.obj \
        vm\aging_collector.obj \
        vm\alien.obj \
        vm\arrays.obj \
        vm\bignum.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\byte_arrays.obj \
        vm\callbacks.obj \
        vm\callstack.obj \
@@ -45,7 +100,6 @@ DLL_OBJS = $(PLAF_DLL_OBJS) \
        vm\entry_points.obj \
        vm\errors.obj \
        vm\factor.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\full_collector.obj \
        vm\gc.obj \
        vm\image.obj \
@@ -55,26 +109,28 @@ DLL_OBJS = $(PLAF_DLL_OBJS) \
        vm\jit.obj \
        vm\math.obj \
        vm\mvm.obj \
        vm\jit.obj \
        vm\math.obj \
        vm\mvm.obj \
-       vm\mvm-windows-nt.obj \
+       vm\mvm-windows.obj \
        vm\nursery_collector.obj \
        vm\object_start_map.obj \
        vm\objects.obj \
        vm\primitives.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\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\strings.obj \
        vm\to_tenured_collector.obj \
        vm\tuples.obj \
        vm\utilities.obj \
-        vm\vm.obj \
+       vm\vm.obj \
        vm\words.obj
 
        vm\words.obj
 
-.cpp.obj:
-       cl /EHsc $(CL_FLAGS) /Fo$@ /c $<
+# batch mode has ::
+.cpp.obj::
+       cl /EHsc $(CL_FLAGS) /MP /Fovm/ /c $<
 
 
-.c.obj:
-       cl $(CL_FLAGS) /Fo$@ /c $<
+.c.obj::
+       cl /EHsc $(CL_FLAGS) /MP /Fovm/ /c $<
 
 .asm.obj:
        ml $(ML_FLAGS) /Fo$@ /c $<
 
 .asm.obj:
        ml $(ML_FLAGS) /Fo$@ /c $<
@@ -83,16 +139,26 @@ DLL_OBJS = $(PLAF_DLL_OBJS) \
        rc $<
 
 libfactor-ffi-test.dll: vm/ffi_test.obj
        rc $<
 
 libfactor-ffi-test.dll: vm/ffi_test.obj
-       link $(LINK_FLAGS) /out:libfactor-ffi-test.dll /dll vm/ffi_test.obj
+       link $(LINK_FLAGS) /out:libfactor-ffi-test.dll /dll /def:vm\ffi_test.def 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)
 
 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)
+       link $(LINK_FLAGS) /out:factor.com /SUBSYSTEM:$(SUBSYSTEM_COM_FLAGS) $(EXE_OBJS) $(DLL_OBJS)
 
 factor.exe: $(EXE_OBJS) $(DLL_OBJS)
 
 factor.exe: $(EXE_OBJS) $(DLL_OBJS)
-       link $(LINK_FLAGS) /out:factor.exe /SUBSYSTEM:windows $(EXE_OBJS) $(DLL_OBJS)
+       link $(LINK_FLAGS) /out:factor.exe /SUBSYSTEM:$(SUBSYSTEM_EXE_FLAGS) $(EXE_OBJS) $(DLL_OBJS)
+
+# If we compile factor.exe, run mt.exe, and run factor.exe,
+# then Windows caches the manifest. Even on a recompile without applying
+# the mt.exe tool, if the factor.exe.manifest file is present, the manifest
+# is applied. To avoid this, we delete the .manifest file on clean
+# and copy it from a reference file on compilation and mt.exe.
+#
+factor.exe.manifest: factor.exe
+       copy factor.exe.manifest.in factor.exe.manifest
+       mt -manifest factor.exe.manifest -outputresource:"factor.exe;#1"
 
 all: factor.com factor.exe factor.dll.lib libfactor-ffi-test.dll
 
 
 all: factor.com factor.exe factor.dll.lib libfactor-ffi-test.dll
 
@@ -103,6 +169,8 @@ default:
        @echo Where platform is one of:
        @echo x86-32
        @echo x86-64
        @echo Where platform is one of:
        @echo x86-32
        @echo x86-64
+       @echo x86-32-vista
+       @echo x86-64-vista
        @exit 1
 
 x86-32:
        @exit 1
 
 x86-32:
@@ -111,14 +179,27 @@ x86-32:
 x86-64:
        nmake /nologo PLATFORM=x86-64 /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
 clean:
        del vm\*.obj
+       if exist vm\factor.res del vm\factor.res
        if exist factor.lib del factor.lib
        if exist factor.com del factor.com
        if exist factor.exe del factor.exe
        if exist factor.lib del factor.lib
        if exist factor.com del factor.com
        if exist factor.exe del factor.exe
+       if exist factor.exe.manifest del factor.exe.manifest
+       if exist factor.exp del factor.exp
        if exist factor.dll del factor.dll
        if exist factor.dll.lib del factor.dll.lib
        if exist factor.dll del factor.dll
        if exist factor.dll.lib del factor.dll.lib
+       if exist factor.dll.exp del factor.dll.exp
+       if exist libfactor-ffi-test.dll del libfactor-ffi-test.dll
+       if exist libfactor-ffi-test.exp del libfactor-ffi-test.exp
+       if exist libfactor-ffi-test.lib del libfactor-ffi-test.lib
 
 
-.PHONY: all default x86-32 x86-64 clean
+.PHONY: all default x86-32 x86-64 x86-32-vista x86-64-vista clean factor.exe.manifest
 
 .SUFFIXES: .rs
 
 .SUFFIXES: .rs