From 82ba1f8f4e1eba03a935bdf3c02875956d1de442 Mon Sep 17 00:00:00 2001 From: Alberto Fustinoni Date: Thu, 21 Jun 2018 13:51:11 +0900 Subject: [PATCH] MSVC build --- Makefile | 25 ++++++-- Makefile.libretro | 155 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 174 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 09d89600..f034ac01 100644 --- a/Makefile +++ b/Makefile @@ -1,14 +1,20 @@ +$(LD) ?= $(CC) TARGET ?= PicoDrive -CFLAGS += -Wall -g CFLAGS += -I. -ifndef DEBUG -CFLAGS += -O3 -DNDEBUG + +ifneq ("$(PLATFORM)", "libretro") + CFLAGS += -Wall -g + ifndef DEBUG + CFLAGS += -O3 -DNDEBUG + endif endif # This is actually needed, bevieve me. # If you really have to disable this, set NO_ALIGN_FUNCTIONS elsewhere. ifndef NO_ALIGN_FUNCTIONS -CFLAGS += -falign-functions=2 + ifeq (,$(findstring msvc,$(platform))) + CFLAGS += -falign-functions=2 + endif endif all: config.mak target_ @@ -192,9 +198,9 @@ clean: $(TARGET): $(OBJS) ifeq ($(STATIC_LINKING), 1) - $(AR) rcs $@ $^ + $(AR) rcs $@ $(OBJS) else - $(CC) -o $@ $(CFLAGS) $^ $(LDFLAGS) $(LDLIBS) + $(LD) $(LINKOUT)$@ $^ $(LDFLAGS) $(LDLIBS) endif pprof: platform/linux/pprof.c @@ -203,6 +209,9 @@ pprof: platform/linux/pprof.c tools/textfilter: tools/textfilter.c make -C tools/ textfilter +%.o: %.c + $(CC) -c $(OBJOUT)$@ $< $(CFLAGS) + .s.o: $(CC) $(CFLAGS) -c $< -o $@ @@ -224,7 +233,11 @@ pico/cd/gfx_cd.o: CFLAGS += -fno-strict-aliasing # not using O3 and -fno-expensive-optimizations seems to also help, but you may # want to remove this stuff for better performance if your compiler can handle it ifndef DEBUG +ifeq (,$(findstring msvc,$(platform))) cpu/fame/famec.o: CFLAGS += -g0 -O2 -fno-expensive-optimizations +else +cpu/fame/famec.o: CFLAGS += -Od +endif endif pico/carthw_cfg.c: pico/carthw.cfg diff --git a/Makefile.libretro b/Makefile.libretro index 26ee1c1e..97cb9b3f 100644 --- a/Makefile.libretro +++ b/Makefile.libretro @@ -1,5 +1,12 @@ # Makefile for PicoDrive (libretro) +SPACE := +SPACE := $(SPACE) $(SPACE) +BACKSLASH := +BACKSLASH := \$(BACKSLASH) +filter_out1 = $(filter-out $(firstword $1),$1) +filter_out2 = $(call filter_out1,$(call filter_out1,$1)) + ifeq ($(platform),) platform = unix ifeq ($(shell uname -a),) @@ -441,6 +448,100 @@ else ifeq ($(platform), gcw0) use_drz80 = 0 use_cz80 = 1 +# Windows MSVC 2017 all architectures +else ifneq (,$(findstring windows_msvc2017,$(platform))) + NO_GCC := 1 + + PlatformSuffix = $(subst windows_msvc2017_,,$(platform)) + ifneq (,$(findstring desktop,$(PlatformSuffix))) + WinPartition = desktop + MSVC2017CompileFlags = -DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP -FS + LDFLAGS += -MANIFEST -LTCG:incremental -NXCOMPAT -DYNAMICBASE -DEBUG -OPT:REF -INCREMENTAL:NO -SUBSYSTEM:WINDOWS -MANIFESTUAC:"level='asInvoker' uiAccess='false'" -OPT:ICF -ERRORREPORT:PROMPT -NOLOGO -TLBID:1 + LIBS += kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib + else ifneq (,$(findstring uwp,$(PlatformSuffix))) + WinPartition = uwp + MSVC2017CompileFlags = -DWINAPI_FAMILY=WINAPI_FAMILY_APP -D_WINDLL -D_UNICODE -DUNICODE -D__WRL_NO_DEFAULT_LIB__ -EHsc -FS + LDFLAGS += -APPCONTAINER -NXCOMPAT -DYNAMICBASE -MANIFEST:NO -LTCG -OPT:REF -SUBSYSTEM:CONSOLE -MANIFESTUAC:NO -OPT:ICF -ERRORREPORT:PROMPT -NOLOGO -TLBID:1 -DEBUG:FULL -WINMD:NO + LIBS += WindowsApp.lib + endif + + SHARED := + LIBM := + + CFLAGS += $(MSVC2017CompileFlags) + CXXFLAGS += $(MSVC2017CompileFlags) + + TargetArchMoniker = $(subst $(WinPartition)_,,$(PlatformSuffix)) + + CC = cl.exe + CXX = cl.exe + LD = link.exe + + reg_query = $(call filter_out2,$(subst $2,,$(shell reg query "$2" -v "$1" 2>nul))) + fix_path = $(subst $(SPACE),\ ,$(subst \,/,$1)) + + ProgramFiles86w := $(shell cmd /c "echo %PROGRAMFILES(x86)%") + ProgramFiles86 := $(shell cygpath "$(ProgramFiles86w)") + + WindowsSdkDir ?= $(call reg_query,InstallationFolder,HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\Windows\v10.0) + WindowsSdkDir ?= $(call reg_query,InstallationFolder,HKEY_CURRENT_USER\SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\Windows\v10.0) + WindowsSdkDir ?= $(call reg_query,InstallationFolder,HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v10.0) + WindowsSdkDir ?= $(call reg_query,InstallationFolder,HKEY_CURRENT_USER\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v10.0) + WindowsSdkDir := $(WindowsSdkDir) + + WindowsSDKVersion ?= $(firstword $(foreach folder,$(subst $(subst \,/,$(WindowsSdkDir)Include/),,$(wildcard $(call fix_path,$(WindowsSdkDir)Include\*))),$(if $(wildcard $(call fix_path,$(WindowsSdkDir)Include/$(folder)/um/Windows.h)),$(folder),)))$(BACKSLASH) + WindowsSDKVersion := $(WindowsSDKVersion) + + VsInstallBuildTools = $(ProgramFiles86)/Microsoft Visual Studio/2017/BuildTools + VsInstallEnterprise = $(ProgramFiles86)/Microsoft Visual Studio/2017/Enterprise + VsInstallProfessional = $(ProgramFiles86)/Microsoft Visual Studio/2017/Professional + VsInstallCommunity = $(ProgramFiles86)/Microsoft Visual Studio/2017/Community + + VsInstallRoot ?= $(shell if [ -d "$(VsInstallBuildTools)" ]; then echo "$(VsInstallBuildTools)"; fi) + ifeq ($(VsInstallRoot), ) + VsInstallRoot = $(shell if [ -d "$(VsInstallEnterprise)" ]; then echo "$(VsInstallEnterprise)"; fi) + endif + ifeq ($(VsInstallRoot), ) + VsInstallRoot = $(shell if [ -d "$(VsInstallProfessional)" ]; then echo "$(VsInstallProfessional)"; fi) + endif + ifeq ($(VsInstallRoot), ) + VsInstallRoot = $(shell if [ -d "$(VsInstallCommunity)" ]; then echo "$(VsInstallCommunity)"; fi) + endif + VsInstallRoot := $(VsInstallRoot) + + VcCompilerToolsVer := $(shell cat "$(VsInstallRoot)/VC/Auxiliary/Build/Microsoft.VCToolsVersion.default.txt" | grep -o '[0-9\.]*') + VcCompilerToolsDir := $(VsInstallRoot)/VC/Tools/MSVC/$(VcCompilerToolsVer) + + WindowsSDKSharedIncludeDir := $(shell cygpath -w "$(WindowsSdkDir)\Include\$(WindowsSDKVersion)\shared") + WindowsSDKUCRTIncludeDir := $(shell cygpath -w "$(WindowsSdkDir)\Include\$(WindowsSDKVersion)\ucrt") + WindowsSDKUMIncludeDir := $(shell cygpath -w "$(WindowsSdkDir)\Include\$(WindowsSDKVersion)\um") + WindowsSDKUCRTLibDir := $(shell cygpath -w "$(WindowsSdkDir)\Lib\$(WindowsSDKVersion)\ucrt\$(TargetArchMoniker)") + WindowsSDKUMLibDir := $(shell cygpath -w "$(WindowsSdkDir)\Lib\$(WindowsSDKVersion)\um\$(TargetArchMoniker)") + + # For some reason the HostX86 compiler doesn't like compiling for x64 + # ("no such file" opening a shared library), and vice-versa. + # Work around it for now by using the strictly x86 compiler for x86, and x64 for x64. + # NOTE: What about ARM? + ifneq (,$(findstring x64,$(TargetArchMoniker))) + VCCompilerToolsBinDir := $(VcCompilerToolsDir)\bin\HostX64 + else + VCCompilerToolsBinDir := $(VcCompilerToolsDir)\bin\HostX86 + endif + + PATH := $(shell IFS=$$'\n'; cygpath "$(VCCompilerToolsBinDir)/$(TargetArchMoniker)"):$(PATH) + PATH := $(PATH):$(shell IFS=$$'\n'; cygpath "$(VsInstallRoot)/Common7/IDE") + INCLUDE := $(shell IFS=$$'\n'; cygpath -w "$(VcCompilerToolsDir)/include") + LIB := $(shell IFS=$$'\n'; cygpath -w "$(VcCompilerToolsDir)/lib/$(TargetArchMoniker)") + ifneq (,$(findstring uwp,$(PlatformSuffix))) + LIB := $(shell IFS=$$'\n'; cygpath -w "$(LIB)/store") + endif + + export INCLUDE := $(INCLUDE);$(WindowsSDKSharedIncludeDir);$(WindowsSDKUCRTIncludeDir);$(WindowsSDKUMIncludeDir) + export LIB := $(LIB);$(WindowsSDKUCRTLibDir);$(WindowsSDKUMLibDir) + TARGET := $(TARGET_NAME)_libretro.dll + PSS_STYLE :=2 + LDFLAGS += -DLL + # Windows else use_sh2drc = 1 @@ -479,4 +580,58 @@ LDFLAGS += $(SHARED) $(fpic) PLATFORM = libretro NO_CONFIG_MAK = yes +OBJOUT = -o +LINKOUT = -o + +ifneq (,$(findstring msvc,$(platform))) + CFLAGS += -wd4702 -wd4711 -wd4202 -wd4101 +endif + +ifeq ($(DEBUG), 1) + ifneq (,$(findstring msvc,$(platform))) + ifeq ($(STATIC_LINKING),1) + CFLAGS += -MTd + CXXFLAGS += -MTd + else + CFLAGS += -MDd + CXXFLAGS += -MDd + endif + + CFLAGS += -Od -Zi -DDEBUG -D_DEBUG + CXXFLAGS += -Od -Zi -DDEBUG -D_DEBUG + else + CFLAGS += -O0 -g -DDEBUG + CXXFLAGS += -O0 -g -DDEBUG + endif +else + ifneq (,$(findstring msvc,$(platform))) + ifeq ($(STATIC_LINKING),1) + CFLAGS += -MT + CXXFLAGS += -MT + else + CFLAGS += -MD + CXXFLAGS += -MD + endif + + CFLAGS += -O2 -DNDEBUG + CXXFLAGS += -O2 -DNDEBUG + else + CFLAGS += -O3 -DNDEBUG + CXXFLAGS += -O3 -DNDEBUG + endif +endif + +ifneq (,$(findstring msvc,$(platform))) + OBJOUT = -Fo + LINKOUT = -out: +ifeq ($(STATIC_LINKING),1) + LD ?= lib.exe + STATIC_LINKING=0 +else + LD = link.exe +endif +else + LD = $(CXX) +endif + include Makefile