X-Git-Url: https://gitweb.factorcode.org/gitweb.cgi?p=factor.git;a=blobdiff_plain;f=Nmakefile;h=065d24a757cc00a5710bf97b574b96c2e45e9b48;hp=d7a5d26122e4f3342cc2f576d4b8bb3038dbba61;hb=HEAD;hpb=bc7f9ee669c46ac6890a5c5627ce5f26e721043a diff --git a/Nmakefile b/Nmakefile index d7a5d26122..f87fb76d2d 100644 --- a/Nmakefile +++ b/Nmakefile @@ -1,34 +1,47 @@ -!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 +!IF [del git-describe.tmp] == 0 +!ENDIF !ENDIF -!IF !DEFINED(VERSION) -VERSION = version-missing +!IF [git rev-parse HEAD > git-id.tmp] == 0 +GIT_ID = \ +!INCLUDE +!IF [del git-id.tmp] == 0 +!ENDIF !ENDIF -!IF !DEFINED(GIT_LABEL) -GIT_LABEL = git-label-missing +!IF [git rev-parse --abbrev-ref HEAD > git-branch.tmp] == 0 +GIT_BRANCH = \ +!INCLUDE +!IF [del git-branch.tmp] == 0 +!ENDIF !ENDIF +GIT_LABEL = $(GIT_DESCRIBE)-$(GIT_ID) + !IF DEFINED(PLATFORM) -LINK_FLAGS = /nologo shell32.lib +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 DEFINED(DEBUG) -LINK_FLAGS = $(LINK_FLAGS) /DEBUG -CL_FLAGS = $(CL_FLAGS) /Zi /DFACTOR_DEBUG -!ENDIF - !IF "$(PLATFORM)" == "x86-32" -LINK_FLAGS = $(LINK_FLAGS) /safeseh +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 +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 @@ -45,6 +58,13 @@ 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) @@ -52,6 +72,10 @@ LINK_FLAGS = $(LINK_FLAGS) /DEBUG CL_FLAGS = $(CL_FLAGS) /Zi /DFACTOR_DEBUG !ENDIF +!IF DEFINED(REPRODUCIBLE) +CL_FLAGS = $(CL_FLAGS) /DFACTOR_REPRODUCIBLE +!ENDIF + ML_FLAGS = /nologo /safeseh EXE_OBJS = vm\main-windows.obj vm\factor.res @@ -76,10 +100,8 @@ DLL_OBJS = $(PLAF_DLL_OBJS) \ 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 \ @@ -103,11 +125,12 @@ DLL_OBJS = $(PLAF_DLL_OBJS) \ vm\vm.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 $< @@ -127,6 +150,16 @@ factor.com: $(EXE_OBJS) $(DLL_OBJS) factor.exe: $(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 !ENDIF @@ -154,16 +187,19 @@ x86-64-vista: clean: del vm\*.obj + if exist vm\factor.res del vm\factor.res 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.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.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 x86-32-vista x86-64-vista clean +.PHONY: all default x86-32 x86-64 x86-32-vista x86-64-vista clean factor.exe.manifest .SUFFIXES: .rs