Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/msvc
diff options
context:
space:
mode:
authorlateralusX <lateralusx.github@gmail.com>2018-11-06 18:23:56 +0300
committerlateralusX <lateralusx.github@gmail.com>2018-11-12 17:16:14 +0300
commit269d02cf5b3c906954bbba944fc9d5918fa1ad75 (patch)
treeb0d789dcf9579773bbbf5929272f1d590f41b6a9 /msvc
parentf038e7cd8a4edcfc9ebbfb8dfd0b595fdcaada15 (diff)
Add support for LLVM integrated build as part of Visual Studio solution
build. LLVM build follows similar pattern as BTLS build and will be build as part of regular Visual Studio build Mono runtime if LLVM has been enabled through the autogen.sh, --enable-llvm or –with-llvm argument. It is also supports msbuild properties MONO_ENABLE_LLVM, MONO_EXTERNAL_LLVM_CONFIG, if Visual Studio Mono runtime has been built without using autogen.sh. When just using –enable-llvm, LLVM build will try to build internal LLVM branch under external/llvm or if override has been set in props file (using MONO_INTERNAL_LLVM_SOURCE_DIR), an alternative LLVM source directory path. If –with-llvm has been used pointing to an llvm-config.exe, no internal LLVM will be build, but the external LLVM build will be used. Needed LLVM executables (opt.exe, llc.exe) will be installed into regular Visual Studio Mono runtime build output directory. The internal Mono LLVM 6.0 release will build as part of changes to this commit, but it has not yet been fixed to work as expected during runtime. That work will be done in different commit. The Mono LLVM 3.6 branch will however work as expected for Windows x64 and can be setup and used using –with-llvm argument or build as part of Visual Studio build Mono runtime by enabling msbuild properties, MONO_ENABLE_LLVM and MONO_INTERNAL_LLVM_SOURCE_DIR.
Diffstat (limited to 'msvc')
-rw-r--r--msvc/build-external-btls.vcxproj16
-rw-r--r--msvc/build-external-llvm.bat383
-rw-r--r--msvc/build-external-llvm.vcxproj169
-rw-r--r--msvc/build-init.vcxproj30
-rw-r--r--msvc/libmini-llvm.targets5
-rw-r--r--msvc/libmini.vcxproj58
-rw-r--r--msvc/libmono-dynamic.vcxproj50
-rw-r--r--msvc/libmonodac.vcxproj2
-rw-r--r--msvc/mono.external.targets220
-rw-r--r--msvc/mono.props20
-rw-r--r--msvc/mono.sln15
-rw-r--r--msvc/mono.vcxproj28
-rwxr-xr-xmsvc/winsetup.bat13
13 files changed, 918 insertions, 91 deletions
diff --git a/msvc/build-external-btls.vcxproj b/msvc/build-external-btls.vcxproj
index fbdd0a8f7c5..bbb2357067d 100644
--- a/msvc/build-external-btls.vcxproj
+++ b/msvc/build-external-btls.vcxproj
@@ -145,25 +145,15 @@
</PostBuildEvent>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <Import Project="mono.external.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
<PropertyGroup>
<_BtlsCFlags Condition="'$(MONO_PREPROCESSOR_DEFINITIONS)' != ''">$(MONO_PREPROCESSOR_DEFINITIONS.Replace(";"," "))</_BtlsCFlags>
<_BtlsCFlags>$(_BtlsCFlags.Trim())</_BtlsCFlags>
<_BtlsCFlags Condition="'$(_BtlsCFlags)' != ''">-D$(_BtlsCFlags.Replace(" "," -D"))</_BtlsCFlags>
- <_BtlsBuildDir>$(MONO_BUILD_DIR_PREFIX)$(Platform)\obj\external\btls-build-shared\$(Configuration)</_BtlsBuildDir>
<_BtlsBuildCommand>build-external-btls.bat &quot;$(MONO_DIR)&quot; &quot;$(_BtlsBuildDir)&quot; &quot;$(OutDir)&quot; &quot;$(_BtlsCFlags)&quot; &quot;$(Platform)&quot; &quot;$(Configuration)&quot;</_BtlsBuildCommand>
- <_BtlsCheckCommand>findstr /i /r /c:&quot;.*#define.*HAVE_BTLS.*1&quot; $(MONO_DIR)/cygconfig.h >nul 2>&amp;1</_BtlsCheckCommand>
</PropertyGroup>
- <Target Name="_CheckEnableBtls" Condition="'$(MONO_ENABLE_BTLS)' == ''">
- <Exec Command="$(_BtlsCheckCommand)" IgnoreExitCode="true" EchoOff="true">
- <Output TaskParameter="ExitCode" PropertyName="_CheckEnableBtlsExitCode"/>
- </Exec>
- <PropertyGroup>
- <MONO_ENABLE_BTLS Condition="'$(_CheckEnableBtlsExitCode)' == '0'">true</MONO_ENABLE_BTLS>
- <MONO_ENABLE_BTLS Condition="'$(_CheckEnableBtlsExitCode)' == '1'">false</MONO_ENABLE_BTLS>
- </PropertyGroup>
- </Target>
<Target Name="_AfterBuildExternalBtls" Condition="'$(MONO_ENABLE_BTLS)' == 'true'">
<Exec Command="$(_BtlsBuildCommand) &quot;Build&quot; &quot;$(MSBuildBinPath)\&quot;">
<Output TaskParameter="ExitCode" PropertyName="_BuildExternalBtlsExitCode" />
@@ -174,6 +164,6 @@
<Output TaskParameter="ExitCode" PropertyName="_CleanExternalBtlsExitCode" />
</Exec>
</Target>
- <Target Name="AfterBuild" DependsOnTargets="_CheckEnableBtls;_AfterBuildExternalBtls" />
- <Target Name="AfterClean" DependsOnTargets="_CheckEnableBtls;_AfterCleanExternalBtls" />
+ <Target Name="AfterBuild" DependsOnTargets="_ConfigureExternalMonoBTLSBuildEnvironment;_AfterBuildExternalBtls" />
+ <Target Name="AfterClean" DependsOnTargets="_ConfigureExternalMonoBTLSBuildEnvironment;_AfterCleanExternalBtls" />
</Project> \ No newline at end of file
diff --git a/msvc/build-external-llvm.bat b/msvc/build-external-llvm.bat
new file mode 100644
index 00000000000..508bc0a1810
--- /dev/null
+++ b/msvc/build-external-llvm.bat
@@ -0,0 +1,383 @@
+:: --------------------------------------------------
+:: Run full LLVM build using msvc toolchain and available cmake generator.
+:: Script needs to be run from within a matching build environment, x86|x64.
+:: When executed from withing Visual Studio build environment current
+:: build environment will be inherited by script.
+::
+:: %1 LLVM source root directory.
+:: %2 LLVM build root directory.
+:: %3 LLVM install root directory.
+:: %4 Mono distribution root directory.
+:: %5 VS CFLAGS.
+:: %6 VS platform (Win32/x64)
+:: %7 VS configuration (Debug/Release)
+:: %8 VS target
+:: %9 MsBuild bin path, if used.
+:: --------------------------------------------------
+
+@echo off
+setlocal
+
+set TEMP_PATH=%PATH%
+set BUILD_RESULT=1
+
+set CL_BIN_NAME=cl.exe
+set LINK_BIN_NAME=link.exe
+set GIT_BIN_NAME=git.exe
+set CMAKE_BIN_NAME=cmake.exe
+set NINJA_BIN_NAME=ninja.exe
+set PYTHON_BIN_NAME=python.exe
+
+set LLVM_DIR=%~1
+set LLVM_BUILD_DIR=%~2
+set LLVM_INSTALL_DIR=%~3
+set MONO_DIST_DIR=%~4
+set VS_CFLAGS=%~5
+set VS_PLATFORM=%~6
+set VS_CONFIGURATION=%~7
+set VS_TARGET=%~8
+set MSBUILD_BIN_PATH=%~9
+
+:: Setup toolchain.
+:: set GIT=
+:: set CMAKE=
+:: set NINJA=
+set MSBUILD=%MSBUILD_BIN_PATH%msbuild.exe
+
+if "%LLVM_DIR%" == "" (
+ echo Missing LLVM source directory argument.
+ goto ECHO_USAGE
+)
+
+if "%LLVM_BUILD_DIR%" == "" (
+ echo Missing LLVM build directory argument.
+ goto ECHO_USAGE
+)
+
+if "%LLVM_INSTALL_DIR%" == "" (
+ echo Missing LLVM install directory argument.
+ goto ECHO_USAGE
+)
+
+if "%MONO_DIST_DIR%" == "" (
+ echo Missing Mono dist directory argument.
+ goto ECHO_USAGE
+)
+
+if "%VS_CFLAGS%" == "" (
+ echo Missing CFLAGS argument.
+ goto ECHO_USAGE
+)
+
+if "%VS_PLATFORM%" == "" (
+ set VS_PLATFORM=x64
+)
+
+if "%VS_CONFIGURATION%" == "" (
+ set VS_CONFIGURATION=Release
+)
+
+if "%VS_TARGET%" == "" (
+ set VS_TARGET=Build
+)
+
+if not exist %LLVM_DIR% (
+ echo Could not find "%LLVM_DIR%".
+ goto ON_ERROR
+)
+
+set LLVM_CFLAGS=%VS_CFLAGS%
+set LLVM_ARCH=x86_64
+if /i "%VS_PLATFORM%" == "win32" (
+ set LLVM_ARCH=i386
+)
+
+:: Check if executed from VS2015/VS2017 build environment.
+if "%VisualStudioVersion%" == "14.0" (
+ goto ON_ENV_OK
+)
+
+if "%VisualStudioVersion%" == "15.0" (
+ goto ON_ENV_OK
+)
+
+:: Executed outside VS2015/VS2017 build environment, try to locate Visual Studio C/C++ compiler and linker.
+call :FIND_PROGRAM "" "%CL_BIN_NAME%" CL_PATH
+if "%CL_PATH%" == "" (
+ goto ON_ENV_WARNING
+)
+
+call :FIND_PROGRAM "" "%LINK_BIN_NAME%" LINK_PATH
+if "%LINK_PATH%" == "" (
+ goto ON_ENV_WARNING
+)
+
+goto ON_ENV_OK
+
+:ON_ENV_WARNING
+
+:: VS 2015.
+set VC_VARS_ALL_FILE=%ProgramFiles(x86)%\Microsoft Visual Studio 14.0\VC\vcvarsall.bat
+IF EXIST "%VC_VARS_ALL_FILE%" (
+ echo For VS2015 builds, make sure to run this from within Visual Studio build or using "VS2015 x86|x64 Native Tools Command Prompt" command prompt.
+ echo Setup a "VS2015 x86|x64 Native Tools Command Prompt" command prompt by using "%VC_VARS_ALL_FILE% x86|amd64".
+)
+
+:: VS 2017.
+set VSWHERE_TOOLS_BIN=%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe
+if exist "%VSWHERE_TOOLS_BIN%" (
+ echo For VS2017 builds, make sure to run this from within Visual Studio build or using "x86|x64 Native Tools Command Prompt for VS2017" command prompt.
+ for /f "tokens=*" %%a IN ('"%VSWHERE_TOOLS_BIN%" -latest -property installationPath') do (
+ echo Setup a "x86|x64 Native Tools Command Prompt for VS2017" command prompt by using "%%a\VC\Auxiliary\Build\vcvars32.bat|vcvars64.bat".
+ )
+)
+
+echo Could not detect Visual Studio build environment. You may experience build problems if wrong toolchain is auto detected.
+
+:ON_ENV_OK
+
+:: Setup all cmake related generator, tools and variables.
+call :SETUP_CMAKE_ENVIRONMENT
+if "%CMAKE%" == "" (
+ echo Failed to located working %CMAKE_BIN_NAME%, needs to be accessible in PATH or set using CMAKE environment variable.
+ goto ON_ERROR
+)
+
+if "%CMAKE_GENERATOR%" == "" (
+ echo Failed to setup cmake generator.
+ goto ON_ERROR
+)
+
+:: Check target.
+if /i "%VS_TARGET%" == "build" (
+ goto ON_BUILD_LLVM
+)
+
+if /i "%VS_TARGET%" == "install" (
+ goto ON_INSTALL_LLVM
+)
+
+if /i "%VS_TARGET%" == "clean" (
+ goto ON_CLEAN_LLVM
+)
+
+:ON_BUILD_LLVM
+
+:: If not set by caller, check environment for working git.exe.
+call :FIND_PROGRAM "%GIT%" "%GIT_BIN_NAME%" GIT
+if "%GIT%" == "" (
+ echo Failed to located working %GIT_BIN_NAME%, needs to be accessible in PATH or set using GIT environment variable.
+ goto ON_ERROR
+)
+
+:: Make sure llvm submodule is up to date.
+pushd
+cd %LLVM_DIR%
+echo Updating llvm submodule.
+"%GIT%" submodule update --init
+if not ERRORLEVEL == 0 (
+ "%GIT%" submodule init
+ "%GIT%" submodule update
+ if not ERRORLEVEL == 0 (
+ echo Git llvm submodules failed to updated. You may experience compilation problems if some submodules are out of date.
+ )
+)
+popd
+
+if not exist "%LLVM_BUILD_DIR%" (
+ mkdir "%LLVM_BUILD_DIR%"
+)
+
+cd "%LLVM_BUILD_DIR%"
+
+:: Make sure cmake pick up msvc toolchain regardless of selected generator (Visual Studio|Ninja)
+set CC=%CL_BIN_NAME%
+set CXX=%CL_BIN_NAME%
+
+set CMAKE_GENERATOR_ARGS=
+if /i "%CMAKE_GENERATOR%" == "ninja" (
+ set CMAKE_GENERATOR_ARGS=-DCMAKE_BUILD_TYPE=%VS_CONFIGURATION%
+) else (
+ set CMAKE_GENERATOR_ARGS=-Thost=x64
+)
+
+:: Run cmake.
+"%CMAKE%" ^
+-DCMAKE_INSTALL_PREFIX="%LLVM_INSTALL_DIR%" ^
+-DLLVM_TARGETS_TO_BUILD="X86" ^
+-DLLVM_BUILD_TESTS=Off ^
+-DLLVM_INCLUDE_TESTS=Off ^
+-DLLVM_BUILD_EXAMPLES=Off ^
+-DLLVM_INCLUDE_EXAMPLES=Off ^
+-DLLVM_TOOLS_TO_BUILD="opt;llc;llvm-config;llvm-dis;llvm-mc" ^
+-DLLVM_ENABLE_LIBXML2=Off ^
+-DCMAKE_SYSTEM_PROCESSOR="%LLVM_ARCH%" ^
+%CMAKE_GENERATOR_ARGS% ^
+-G "%CMAKE_GENERATOR%" ^
+"%LLVM_DIR%"
+
+if not ERRORLEVEL == 0 (
+ goto ON_ERROR
+)
+
+if /i "%CMAKE_GENERATOR%" == "ninja" (
+ :: Build LLVM using ninja build system.
+ call "%NINJA%" -j4 || (
+ goto ON_ERROR
+ )
+) else (
+ :: Build LLVM using msbuild build system.
+ call "%MSBUILD%" llvm.sln /p:Configuration=%VS_CONFIGURATION% /p:Platform=%VS_PLATFORM% /t:%VS_TARGET% /m:4 || (
+ goto ON_ERROR
+ )
+)
+
+:ON_INSTALL_LLVM
+
+:: Make sure build install folder exists.
+if not exist "%LLVM_INSTALL_DIR%" (
+ echo Could not find "%LLVM_INSTALL_DIR%", creating folder for build output.
+ mkdir "%LLVM_INSTALL_DIR%"
+)
+
+:: Make sure Mono dist folder exists.
+if not exist "%MONO_DIST_DIR%" (
+ echo Could not find "%MONO_DIST_DIR%", creating folder for build output.
+ mkdir "%MONO_DIST_DIR%"
+)
+
+if exist "%LLVM_BUILD_DIR%\build.ninja" (
+ pushd
+ cd "%LLVM_BUILD_DIR%"
+ call "%NINJA%" install
+ popd
+)
+
+if exist "%LLVM_BUILD_DIR%\llvm.sln" (
+ "%MSBUILD%" "%LLVM_BUILD_DIR%\llvm.sln" /p:Configuration=%VS_CONFIGURATION% /p:Platform=%VS_PLATFORM% /t:Install
+)
+
+if not exist "%LLVM_INSTALL_DIR%\bin\opt.exe" (
+ echo Missing LLVM build output, "%LLVM_INSTALL_DIR%\bin\opt.exe"
+ goto ON_ERROR
+)
+
+if not exist "%LLVM_INSTALL_DIR%\bin\llc.exe" (
+ echo Missing LLVM build output, "%LLVM_INSTALL_DIR%\bin\llc.exe"
+ goto ON_ERROR
+)
+
+copy "%LLVM_INSTALL_DIR%\bin\opt.exe" "%MONO_DIST_DIR%"
+copy "%LLVM_INSTALL_DIR%\bin\llc.exe" "%MONO_DIST_DIR%"
+
+goto ON_SUCCESS
+
+:ON_CLEAN_LLVM
+
+if exist "%LLVM_BUILD_DIR%\build.ninja" (
+ pushd
+ cd "%LLVM_BUILD_DIR%"
+ call "%NINJA%" clean
+ popd
+)
+
+if exist "%LLVM_BUILD_DIR%\llvm.sln" (
+ "%MSBUILD%" "%LLVM_BUILD_DIR%\llvm.sln" /p:Configuration=%VS_CONFIGURATION% /p:Platform=%VS_PLATFORM% /t:Clean
+)
+
+goto ON_SUCCESS
+
+:ON_SUCCESS
+
+set BUILD_RESULT=0
+goto ON_EXIT
+
+:ECHO_USAGE:
+ ECHO Usage: build-external-llvm.bat [llvm_src_dir] [llvm_build_dir] [llvm_install_dir] [mono_dist_dir] [vs_cflags] [vs_plaform] [vs_configuration].
+
+:ON_ERROR
+ echo Failed to build LLVM.
+ goto ON_EXIT
+
+:ON_EXIT
+ set PATH=%TEMP_PATH%
+ exit /b %BUILD_RESULT%
+
+:: ##############################################################################################################################
+:: Functions
+
+:: --------------------------------------------------
+:: Finds a program using environment.
+::
+:: %1 Existing program to check for.
+:: %2 Name of binary to locate.
+:: %3 Output, variable to set if found requested program.
+:: --------------------------------------------------
+:FIND_PROGRAM
+
+:: If not set by caller, check environment for program.
+if exist "%~1" (
+ goto :EOF
+)
+
+call where /q "%~2" && (
+ for /f "delims=" %%a in ('where "%~2"') do (
+ set "%~3=%%a"
+ )
+) || (
+ set "%~3="
+)
+
+goto :EOF
+
+:: --------------------------------------------------
+:: Setup up cmake build environment, including generator, build tools and variables.
+:: --------------------------------------------------
+:SETUP_CMAKE_ENVIRONMENT
+
+:: If not set by caller, check environment for working cmake.exe.
+call :FIND_PROGRAM "%CMAKE%" "%CMAKE_BIN_NAME%" CMAKE
+if "%CMAKE%" == "" (
+ goto _SETUP_CMAKE_ENVIRONMENT_EXIT
+)
+
+echo Found CMake: %CMAKE%
+
+:: Check for optional cmake generate and build tools.
+call :FIND_PROGRAM "%NINJA%" "%NINJA_BIN_NAME%" NINJA
+
+if not "%NINJA%" == "" (
+ goto _SETUP_CMAKE_ENVIRONMENT_NINJA_GENERATOR
+)
+
+:_SETUP_CMAKE_ENVIRONMENT_VS_GENERATOR
+
+echo Using Visual Studio build generator.
+
+:: Detect VS version to use right cmake generator.
+set CMAKE_GENERATOR=Visual Studio 14 2015
+if "%VisualStudioVersion%" == "15.0" (
+ set CMAKE_GENERATOR=Visual Studio 15 2017
+)
+
+if /i "%VS_PLATFORM%" == "x64" (
+ set CMAKE_GENERATOR=%CMAKE_GENERATOR% Win64
+)
+
+set LLVM_BUILD_OUTPUT_DIR=%LLVM_BUILD_DIR%\%VS_CONFIGURATION%
+
+goto _SETUP_CMAKE_ENVIRONMENT_EXIT
+
+:_SETUP_CMAKE_ENVIRONMENT_NINJA_GENERATOR
+
+echo Found Ninja: %NINJA%
+echo Using Ninja build generator.
+
+set CMAKE_GENERATOR=Ninja
+set LLVM_BUILD_OUTPUT_DIR=%LLVM_BUILD_DIR%
+
+:_SETUP_CMAKE_ENVIRONMENT_EXIT
+
+goto :EOF
+
+@echo on
diff --git a/msvc/build-external-llvm.vcxproj b/msvc/build-external-llvm.vcxproj
new file mode 100644
index 00000000000..6ab7a02a671
--- /dev/null
+++ b/msvc/build-external-llvm.vcxproj
@@ -0,0 +1,169 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{C3D4C623-55F8-4653-980D-61AA629B4E1D}</ProjectGuid>
+ <RootNamespace>buildexternalllvm</RootNamespace>
+ <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Utility</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v140</PlatformToolset>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Utility</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>v140</PlatformToolset>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Utility</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v140</PlatformToolset>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Utility</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>v140</PlatformToolset>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="Shared">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="mono.props" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="mono.props" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="mono.props" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="mono.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <OutDir>$(MONO_BUILD_DIR_PREFIX)$(Platform)\bin\$(Configuration)\</OutDir>
+ <IntDir>$(MONO_BUILD_DIR_PREFIX)$(Platform)\obj\$(ProjectName)$(MONO_TARGET_SUFFIX)\$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <OutDir>$(MONO_BUILD_DIR_PREFIX)$(Platform)\bin\$(Configuration)\</OutDir>
+ <IntDir>$(MONO_BUILD_DIR_PREFIX)$(Platform)\obj\$(ProjectName)$(MONO_TARGET_SUFFIX)\$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <OutDir>$(MONO_BUILD_DIR_PREFIX)$(Platform)\bin\$(Configuration)\</OutDir>
+ <IntDir>$(MONO_BUILD_DIR_PREFIX)$(Platform)\obj\$(ProjectName)$(MONO_TARGET_SUFFIX)\$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <OutDir>$(MONO_BUILD_DIR_PREFIX)$(Platform)\bin\$(Configuration)\</OutDir>
+ <IntDir>$(MONO_BUILD_DIR_PREFIX)$(Platform)\obj\$(ProjectName)$(MONO_TARGET_SUFFIX)\$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <SDLCheck>true</SDLCheck>
+ </ClCompile>
+ <PostBuildEvent>
+ <Command>
+ </Command>
+ </PostBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <SDLCheck>true</SDLCheck>
+ </ClCompile>
+ <PostBuildEvent>
+ <Command>
+ </Command>
+ </PostBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <SDLCheck>true</SDLCheck>
+ </ClCompile>
+ <Link>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ </Link>
+ <PostBuildEvent>
+ <Command>
+ </Command>
+ </PostBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <SDLCheck>true</SDLCheck>
+ </ClCompile>
+ <Link>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ </Link>
+ <PostBuildEvent>
+ <Command>
+ </Command>
+ </PostBuildEvent>
+ </ItemDefinitionGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <Import Project="mono.external.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+ <PropertyGroup>
+ <_LLVMCFlags Condition="'$(MONO_PREPROCESSOR_DEFINITIONS)' != ''">$(MONO_PREPROCESSOR_DEFINITIONS.Replace(";"," "))</_LLVMCFlags>
+ <_LLVMCFlags>$(_LLVMCFlags.Trim())</_LLVMCFlags>
+ <_LLVMCFlags Condition="'$(_LLVMCFlags)' != ''">-D$(_LLVMCFlags.Replace(" "," -D"))</_LLVMCFlags>
+ <_LLVMBuildCommand>build-external-llvm.bat &quot;$(_LLVMSourceDir)&quot; &quot;$(_LLVMBuildDir)&quot; &quot;$(_LLVMInstallDir)&quot; &quot;$(_MonoOutputDir)&quot; &quot;$(_LLVMCFlags)&quot; &quot;$(Platform)&quot; &quot;$(Configuration)&quot;</_LLVMBuildCommand>
+ </PropertyGroup>
+ <Target Name="_AfterBuildExternalLLVM" Condition="'$(MONO_ENABLE_LLVM)' == 'true' and '$(_MonoEnableInternalLLVM)' == 'true'">
+ <Exec Command="$(_LLVMBuildCommand) &quot;Build&quot; &quot;$(MSBuildBinPath)\&quot;">
+ <Output TaskParameter="ExitCode" PropertyName="_BuildExternalLLVMExitCode" />
+ </Exec>
+ </Target>
+ <Target Name="_AfterCleanExternalLLVM" Condition="'$(MONO_ENABLE_LLVM)' == 'true' and '$(_MonoEnableInternalLLVM)' == 'true'">
+ <Exec Command="$(_LLVMBuildCommand) &quot;Clean&quot; &quot;$(MSBuildBinPath)\&quot;">
+ <Output TaskParameter="ExitCode" PropertyName="_CleanExternalLLVMExitCode" />
+ </Exec>
+ </Target>
+ <Target Name="AfterBuild" DependsOnTargets="_ConfigureExternalMonoLLVMBuildEnvironment;_AfterBuildExternalLLVM" />
+ <Target Name="AfterClean" DependsOnTargets="_ConfigureExternalMonoLLVMBuildEnvironment;_AfterCleanExternalLLVM" />
+</Project> \ No newline at end of file
diff --git a/msvc/build-init.vcxproj b/msvc/build-init.vcxproj
index a288e844b90..57c90df4c56 100644
--- a/msvc/build-init.vcxproj
+++ b/msvc/build-init.vcxproj
@@ -149,31 +149,21 @@
</PostBuildEvent>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <Import Project="mono.external.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
- <PropertyGroup Label="LLVMProperties" Condition="$(MONO_ENABLE_LLVM)=='true'">
- <LLVMConfig>$(MONO_LLVM_BIN_DIR)/llvm-config.exe</LLVMConfig>
- </PropertyGroup>
+
<Target Name="AfterBuildWinSetup">
- <Exec Command="winsetup.bat">
+ <PropertyGroup>
+ <_OptionalDefines Condition="'$(MONO_ENABLE_BTLS)' == 'true'">$(_OptionalDefines);HAVE_BTLS</_OptionalDefines>
+ <_OptionalDefines Condition="'$(MONO_ENABLE_LLVM)' == 'true'">$(_OptionalDefines);ENABLE_LLVM;ENABLE_LLVM_RUNTIME</_OptionalDefines>
+ <_OptionalDefines>$(_OptionalDefines.Trim(';'))</_OptionalDefines>
+ </PropertyGroup>
+ <Exec Command="winsetup.bat &quot;$(_OptionalDefines)&quot;">
<Output TaskParameter="ExitCode" PropertyName="WinSetupExitCode" />
</Exec>
<Error Text="Failed running winsetup.bat" Condition="$(WinSetupExitCode) != 0" />
</Target>
- <Target Name="AfterBuildLLVMSetup" Condition="$(MONO_ENABLE_LLVM)=='true'">
- <Message Importance="high" Text="Validating LLVM configuration..." />
- <Error Text="LLVM executable $(LLVMConfig) not found." Condition="!Exists($(LLVMConfig))" />
- <Message Importance="high" Text="LLVM Version:" />
- <Exec Command="$(MONO_LLVM_BIN_DIR)/llvm-config.exe --version" ConsoleToMSBuild="true">
- <Output TaskParameter="ConsoleOutput" PropertyName="MonoLLVMVersion" />
- </Exec>
- <Message Importance="high" Text="LLVM API Version:" />
- <Exec Command="$(MONO_LLVM_BIN_DIR)/llvm-config.exe --mono-api-version" ConsoleToMSBuild="true" EchoOff="true">
- <Output TaskParameter="ConsoleOutput" PropertyName="MonoLLVMAPIVersion" />
- </Exec>
- <Error Text="Compiling with stock LLVM is not supported, please use the Mono LLVM repo at https://github.com/mono/llvm." Condition="!$(MonoLLVMVersion.Contains('mono'))" />
- <Error Text="Expected llvm version 4, but llvm-config --version returned $(MonoLLVMAPIVersion)." Condition="$(MonoLLVMAPIVersion) != '4'" />
- <Message Importance="high" Text="Successfully validated LLVM configuration." />
- </Target>
- <Target Name="AfterBuild" DependsOnTargets="AfterBuildWinSetup;AfterBuildLLVMSetup" />
+
+ <Target Name="AfterBuild" DependsOnTargets="AfterBuildWinSetup" />
</Project> \ No newline at end of file
diff --git a/msvc/libmini-llvm.targets b/msvc/libmini-llvm.targets
index 47ecbde4416..751007c3392 100644
--- a/msvc/libmini-llvm.targets
+++ b/msvc/libmini-llvm.targets
@@ -7,18 +7,23 @@
<ItemGroup Label="llvm_sources">
<ClCompile Include="$(MonoSourceLocation)\mono\mini\mini-llvm-loaded.c">
<ExcludedFromBuild>$(ExcludeLLVMFromWindowsBuild)</ExcludedFromBuild>
+ <_MonoLLVMSourceFile>true</_MonoLLVMSourceFile>
</ClCompile>
<ClCompile Include="$(MonoSourceLocation)\mono\mini\mini-llvm.c">
<ExcludedFromBuild>$(ExcludeLLVMFromWindowsBuild)</ExcludedFromBuild>
+ <_MonoLLVMSourceFile>true</_MonoLLVMSourceFile>
</ClCompile>
<ClCompile Include="$(MonoSourceLocation)\mono\mini\llvm-runtime.cpp">
<ExcludedFromBuild>$(ExcludeLLVMFromWindowsBuild)</ExcludedFromBuild>
+ <_MonoLLVMSourceFile>true</_MonoLLVMSourceFile>
</ClCompile>
<ClCompile Include="$(MonoSourceLocation)\mono\mini\mini-llvm-cpp.cpp">
<ExcludedFromBuild>$(ExcludeLLVMFromWindowsBuild)</ExcludedFromBuild>
+ <_MonoLLVMSourceFile>true</_MonoLLVMSourceFile>
</ClCompile>
<ClCompile Include="$(MonoSourceLocation)\mono\mini\llvm-jit.cpp">
<ExcludedFromBuild>$(ExcludeLLVMFromWindowsBuild)</ExcludedFromBuild>
+ <_MonoLLVMSourceFile>true</_MonoLLVMSourceFile>
</ClCompile>
</ItemGroup>
</Project>
diff --git a/msvc/libmini.vcxproj b/msvc/libmini.vcxproj
index 5e411d0eb6b..e5c24e1a670 100644
--- a/msvc/libmini.vcxproj
+++ b/msvc/libmini.vcxproj
@@ -100,7 +100,7 @@
<ClCompile>
<AdditionalOptions>/D /NODEFAULTLIB:LIBCD" " %(AdditionalOptions)</AdditionalOptions>
<Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>$(MONO_DIR);$(MONO_INCLUDE_DIR);$(LIBGC_CPPFLAGS_INCLUDE);$(GLIB_CFLAGS_INCLUDE);$(MONO_LLVM_INCLUDE_DIR);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>$(MONO_DIR);$(MONO_INCLUDE_DIR);$(LIBGC_CPPFLAGS_INCLUDE);$(GLIB_CFLAGS_INCLUDE);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;WIN32_LEAN_AND_MEAN;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeader>
</PrecompiledHeader>
@@ -113,9 +113,7 @@
<SubSystem>Windows</SubSystem>
</Link>
<PostBuildEvent />
- <Lib>
- <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- </Lib>
+ <Lib />
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<PreBuildEvent>
@@ -125,7 +123,7 @@
<ClCompile>
<AdditionalOptions>/D /NODEFAULTLIB:LIBCD" " %(AdditionalOptions)</AdditionalOptions>
<Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>$(MONO_DIR);$(MONO_INCLUDE_DIR);$(LIBGC_CPPFLAGS_INCLUDE);$(GLIB_CFLAGS_INCLUDE);$(MONO_LLVM_INCLUDE_DIR);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>$(MONO_DIR);$(MONO_INCLUDE_DIR);$(LIBGC_CPPFLAGS_INCLUDE);$(GLIB_CFLAGS_INCLUDE);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;WIN32_LEAN_AND_MEAN;WIN64;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeader>
</PrecompiledHeader>
@@ -138,9 +136,7 @@
<SubSystem>Windows</SubSystem>
</Link>
<PostBuildEvent />
- <Lib>
- <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- </Lib>
+ <Lib />
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<PreBuildEvent>
@@ -150,7 +146,7 @@
<ClCompile>
<AdditionalOptions>/D /NODEFAULTLIB:LIBCD" " %(AdditionalOptions)</AdditionalOptions>
<IntrinsicFunctions>true</IntrinsicFunctions>
- <AdditionalIncludeDirectories>$(MONO_DIR);$(MONO_INCLUDE_DIR);$(LIBGC_CPPFLAGS_INCLUDE);$(GLIB_CFLAGS_INCLUDE);$(MONO_LLVM_INCLUDE_DIR);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>$(MONO_DIR);$(MONO_INCLUDE_DIR);$(LIBGC_CPPFLAGS_INCLUDE);$(GLIB_CFLAGS_INCLUDE);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;WIN32_LEAN_AND_MEAN;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeader>
</PrecompiledHeader>
@@ -164,9 +160,7 @@
<OptimizeReferences>true</OptimizeReferences>
</Link>
<PostBuildEvent />
- <Lib>
- <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- </Lib>
+ <Lib />
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<PreBuildEvent>
@@ -176,7 +170,7 @@
<ClCompile>
<AdditionalOptions>/D /NODEFAULTLIB:LIBCD" " %(AdditionalOptions)</AdditionalOptions>
<IntrinsicFunctions>true</IntrinsicFunctions>
- <AdditionalIncludeDirectories>$(MONO_DIR);$(MONO_INCLUDE_DIR);$(LIBGC_CPPFLAGS_INCLUDE);$(GLIB_CFLAGS_INCLUDE);$(MONO_LLVM_INCLUDE_DIR);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>$(MONO_DIR);$(MONO_INCLUDE_DIR);$(LIBGC_CPPFLAGS_INCLUDE);$(GLIB_CFLAGS_INCLUDE);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;WIN32_LEAN_AND_MEAN;WIN64;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeader>
</PrecompiledHeader>
@@ -190,9 +184,7 @@
<OptimizeReferences>true</OptimizeReferences>
</Link>
<PostBuildEvent />
- <Lib>
- <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- </Lib>
+ <Lib />
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(MONO_COMPILE_AS_CPP)'=='true'">
<ClCompile>
@@ -201,6 +193,40 @@
</ItemDefinitionGroup>
<Import Project="libmini.targets" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <Import Project="mono.external.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
+ <Target Name="_SetupMonoLLVMCompileItems" Condition="$(MONO_ENABLE_LLVM)=='true'">
+ <ItemGroup>
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(MONO_LLVM_INCLUDE_DIR);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>LLVM_API_VERSION=$(MONO_LLVM_API_VERSION);%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Condition="'%(ClCompile._MonoLLVMSourceFile)' == 'true'">
+ <ExcludedFromBuild>false</ExcludedFromBuild>
+ </ClCompile>
+ </ItemGroup>
+ </Target>
+ <Target Name="_SetupMonoLLVMLinkItems" Condition="$(MONO_ENABLE_LLVM)=='true'">
+ <ItemGroup>
+ <Lib>
+ <AdditionalLibraryDirectories>$(MONO_LLVM_LIB_DIR);%(Lib.AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <AdditionalDependencies>$(MONO_LLVM_LIBS);%(Lib.AdditionalDependencies)</AdditionalDependencies>
+ </Lib>
+ </ItemGroup>
+ </Target>
+ <Target Name="_ConfigureExternalCompileDependency" DependsOnTargets="_ConfigureExternalMonoBuildEnvironment;_SetupMonoLLVMBuildProperties;_SetupMonoLLVMCompileItems" />
+ <Target Name="_ConfigureExternalLinkDependency" DependsOnTargets="_ConfigureExternalMonoBuildEnvironment;_SetupMonoLLVMBuildProperties;_SetupMonoLLVMLinkItems" />
+ <PropertyGroup>
+ <PrepareForBuildDependsOn>
+ _ConfigureExternalCompileDependency;
+ $(PrepareForBuildDependsOn);
+ </PrepareForBuildDependsOn>
+ <ComputeLibInputsTargets>
+ $(ComputeLibInputsTargets);
+ _ConfigureExternalLinkDependency;
+ </ComputeLibInputsTargets>
+ </PropertyGroup>
</Project> \ No newline at end of file
diff --git a/msvc/libmono-dynamic.vcxproj b/msvc/libmono-dynamic.vcxproj
index cbb0d9a0d0f..5fe31adc64c 100644
--- a/msvc/libmono-dynamic.vcxproj
+++ b/msvc/libmono-dynamic.vcxproj
@@ -97,7 +97,7 @@
<ClCompile>
<AdditionalOptions>/D /NODEFAULTLIB:LIBCD" " %(AdditionalOptions)</AdditionalOptions>
<Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>$(MONO_DIR);$(MONO_INCLUDE_DIR);$(LIBGC_CPPFLAGS_INCLUDE);$(GLIB_CFLAGS_INCLUDE);$(MONO_LLVM_INCLUDE_DIR);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>$(MONO_DIR);$(MONO_INCLUDE_DIR);$(LIBGC_CPPFLAGS_INCLUDE);$(GLIB_CFLAGS_INCLUDE);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;WIN32_LEAN_AND_MEAN;$(GC_DEFINES);MONO_DLL_EXPORT;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeader>
</PrecompiledHeader>
@@ -114,13 +114,11 @@
</ProjectReference>
<Link>
<AdditionalDependencies Condition="'$(MONO_TARGET_GC)'=='boehm'">$(GC_LIB);%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>$(MONO_LLVM_LIB_DIR);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ModuleDefinitionFile>
</ModuleDefinitionFile>
<DataExecutionPrevention>
</DataExecutionPrevention>
<ImportLibrary>$(MONO_BUILD_DIR_PREFIX)$(Platform)\lib\$(Configuration)\$(TargetName).lib</ImportLibrary>
- <AdditionalDependencies>$(MONO_LLVM_LIBS);%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<PostBuildEvent>
<Command>.\libmono.bat "$(MONO_INCLUDE_DIR)" "$(SolutionDir)include\mono" -q</Command>
@@ -137,7 +135,7 @@
<ClCompile>
<AdditionalOptions>/D /NODEFAULTLIB:LIBCD" " %(AdditionalOptions)</AdditionalOptions>
<Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>$(MONO_DIR);$(MONO_INCLUDE_DIR);$(LIBGC_CPPFLAGS_INCLUDE);$(GLIB_CFLAGS_INCLUDE);$(MONO_LLVM_INCLUDE_DIR);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>$(MONO_DIR);$(MONO_INCLUDE_DIR);$(LIBGC_CPPFLAGS_INCLUDE);$(GLIB_CFLAGS_INCLUDE);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;WIN32_LEAN_AND_MEAN;$(GC_DEFINES);MONO_DLL_EXPORT;WIN64;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeader>
</PrecompiledHeader>
@@ -154,11 +152,9 @@
</ProjectReference>
<Link>
<AdditionalDependencies Condition="'$(MONO_TARGET_GC)'=='boehm'">$(GC_LIB);%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>$(MONO_LLVM_LIB_DIR);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ModuleDefinitionFile>
</ModuleDefinitionFile>
<ImportLibrary>$(MONO_BUILD_DIR_PREFIX)$(Platform)\lib\$(Configuration)\$(TargetName).lib</ImportLibrary>
- <AdditionalDependencies>$(MONO_LLVM_LIBS);%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<PostBuildEvent>
<Command>.\libmono.bat "$(MONO_INCLUDE_DIR)" "$(SolutionDir)include\mono" -q</Command>
@@ -172,7 +168,7 @@
<ClCompile>
<AdditionalOptions>/D /NODEFAULTLIB:LIBCD" " %(AdditionalOptions)</AdditionalOptions>
<IntrinsicFunctions>true</IntrinsicFunctions>
- <AdditionalIncludeDirectories>$(MONO_DIR);$(MONO_INCLUDE_DIR);$(LIBGC_CPPFLAGS_INCLUDE);$(GLIB_CFLAGS_INCLUDE);$(MONO_LLVM_INCLUDE_DIR);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>$(MONO_DIR);$(MONO_INCLUDE_DIR);$(LIBGC_CPPFLAGS_INCLUDE);$(GLIB_CFLAGS_INCLUDE);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;WIN32_LEAN_AND_MEAN;$(GC_DEFINES);MONO_DLL_EXPORT;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>true</StringPooling>
<PrecompiledHeader>
@@ -186,13 +182,11 @@
<ProjectReference />
<Link>
<AdditionalDependencies Condition="'$(MONO_TARGET_GC)'=='boehm'">$(GC_LIB);%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>$(MONO_LLVM_LIB_DIR);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ModuleDefinitionFile>
</ModuleDefinitionFile>
<DataExecutionPrevention>
</DataExecutionPrevention>
<ImportLibrary>$(MONO_BUILD_DIR_PREFIX)$(Platform)\lib\$(Configuration)\$(TargetName).lib</ImportLibrary>
- <AdditionalDependencies>$(MONO_LLVM_LIBS);%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<PostBuildEvent>
<Command>.\libmono.bat "$(MONO_INCLUDE_DIR)" "$(SolutionDir)include\mono" -q</Command>
@@ -212,7 +206,7 @@
<ClCompile>
<AdditionalOptions>/D /NODEFAULTLIB:LIBCD" " %(AdditionalOptions)</AdditionalOptions>
<IntrinsicFunctions>true</IntrinsicFunctions>
- <AdditionalIncludeDirectories>$(MONO_DIR);$(MONO_INCLUDE_DIR);$(LIBGC_CPPFLAGS_INCLUDE);$(GLIB_CFLAGS_INCLUDE);$(MONO_LLVM_INCLUDE_DIR);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <AdditionalIncludeDirectories>$(MONO_DIR);$(MONO_INCLUDE_DIR);$(LIBGC_CPPFLAGS_INCLUDE);$(GLIB_CFLAGS_INCLUDE);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;WIN32_LEAN_AND_MEAN;$(GC_DEFINES);MONO_DLL_EXPORT;WIN64;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>true</StringPooling>
<PrecompiledHeader>
@@ -226,11 +220,9 @@
<ProjectReference />
<Link>
<AdditionalDependencies Condition="'$(MONO_TARGET_GC)'=='boehm'">$(GC_LIB);%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>$(MONO_LLVM_LIB_DIR);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<ModuleDefinitionFile>
</ModuleDefinitionFile>
<ImportLibrary>$(MONO_BUILD_DIR_PREFIX)$(Platform)\lib\$(Configuration)\$(TargetName).lib</ImportLibrary>
- <AdditionalDependencies>$(MONO_LLVM_LIBS);%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<PostBuildEvent>
<Command>.\libmono.bat "$(MONO_INCLUDE_DIR)" "$(SolutionDir)include\mono" -q</Command>
@@ -261,6 +253,40 @@
<Import Project="libmini.targets" />
<Import Project="libgcmonosgen.targets" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <Import Project="mono.external.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
+ <Target Name="_SetupMonoLLVMCompileItems" Condition="$(MONO_ENABLE_LLVM)=='true'">
+ <ItemGroup>
+ <ClCompile>
+ <AdditionalIncludeDirectories>$(MONO_LLVM_INCLUDE_DIR);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>LLVM_API_VERSION=$(MONO_LLVM_API_VERSION);%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Condition="'%(ClCompile._MonoLLVMSourceFile)' == 'true'">
+ <ExcludedFromBuild>false</ExcludedFromBuild>
+ </ClCompile>
+ </ItemGroup>
+ </Target>
+ <Target Name="_SetupMonoLLVMLinkItems" Condition="$(MONO_ENABLE_LLVM)=='true'">
+ <ItemGroup>
+ <Link>
+ <AdditionalLibraryDirectories>$(MONO_LLVM_LIB_DIR);%(Link.AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <AdditionalDependencies>$(MONO_LLVM_LIBS);%(Link.AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemGroup>
+ </Target>
+ <Target Name="_ConfigureExternalCompileDependency" DependsOnTargets="_ConfigureExternalMonoBuildEnvironment;_SetupMonoLLVMBuildProperties;_SetupMonoLLVMCompileItems" />
+ <Target Name="_ConfigureExternalLinkDependency" DependsOnTargets="_ConfigureExternalMonoBuildEnvironment;_SetupMonoLLVMBuildProperties;_SetupMonoLLVMLinkItems" />
+ <PropertyGroup>
+ <PrepareForBuildDependsOn>
+ _ConfigureExternalCompileDependency;
+ $(PrepareForBuildDependsOn);
+ </PrepareForBuildDependsOn>
+ <ComputeLinkInputsTargets>
+ $(ComputeLinkInputsTargets);
+ _ConfigureExternalLinkDependency;
+ </ComputeLinkInputsTargets>
+ </PropertyGroup>
</Project> \ No newline at end of file
diff --git a/msvc/libmonodac.vcxproj b/msvc/libmonodac.vcxproj
index 90f75e603e6..a66edd90ead 100644
--- a/msvc/libmonodac.vcxproj
+++ b/msvc/libmonodac.vcxproj
@@ -85,7 +85,6 @@
<ModuleDefinitionFile>
</ModuleDefinitionFile>
<ImportLibrary>$(MONO_BUILD_DIR_PREFIX)$(Platform)\lib\$(Configuration)\$(TargetName).lib</ImportLibrary>
- <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<PostBuildEvent>
<Command>
@@ -124,7 +123,6 @@
<ModuleDefinitionFile>
</ModuleDefinitionFile>
<ImportLibrary>$(MONO_BUILD_DIR_PREFIX)$(Platform)\lib\$(Configuration)\$(TargetName).lib</ImportLibrary>
- <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<PostBuildEvent>
<Command>
diff --git a/msvc/mono.external.targets b/msvc/mono.external.targets
new file mode 100644
index 00000000000..9551a71e9b0
--- /dev/null
+++ b/msvc/mono.external.targets
@@ -0,0 +1,220 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+
+ <UsingTask TaskName="_CheckConfigurationProperty" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
+ <ParameterGroup>
+ <ConfFile ParameterType="System.String" Required="true" />
+ <ConfRegEx ParameterType="System.String" Required="true" />
+ <ConfPropertyName ParameterType="System.String" Output="true" />
+ <ConfPropertyValue ParameterType="System.String" Output="true" />
+ <ConfPropertyFoundMatch ParameterType="System.String" Output="true" />
+ </ParameterGroup>
+ <Task>
+ <Code Type="Fragment" Language="cs">
+ <![CDATA[
+
+ ConfPropertyName = "";
+ ConfPropertyValue = "";
+ ConfPropertyFoundMatch = "false";
+
+ var regex = new System.Text.RegularExpressions.Regex (ConfRegEx);
+ using (StreamReader reader = new StreamReader(ConfFile))
+ {
+ string line;
+ while ((line = reader.ReadLine ()) != null)
+ {
+ var match = regex.Match (line);
+ if (match != null && match.Success)
+ {
+ if (match.Groups != null && match.Groups.Count == 1)
+ {
+ var propertyLine = match.Groups[0].ToString ();
+ if (!String.IsNullOrEmpty (propertyLine))
+ {
+ var propertyLineItems = propertyLine.Split ('=');
+ if (propertyLineItems != null && propertyLineItems.Length == 2)
+ {
+ ConfPropertyName = propertyLineItems[0].Trim ();
+ ConfPropertyValue = propertyLineItems[1].Trim ();
+ }
+ }
+ }
+ ConfPropertyFoundMatch = "true";
+ break;
+ }
+ }
+ }
+ ]]>
+ </Code>
+ </Task>
+ </UsingTask>
+
+ <UsingTask TaskName="_GetLLVMConfiguration" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
+ <ParameterGroup>
+ <LLVMConfTool ParameterType="System.String" Required="true" />
+ <LLVMConfToolArg ParameterType="System.String" Required="true" />
+ <LLVMConfToolOut ParameterType="System.String" Output="true" />
+ </ParameterGroup>
+ <Task>
+ <Using Namespace="System" />
+ <Using Namespace="System.Text" />
+ <Using Namespace="System.Diagnostics" />
+ <Code Type="Fragment" Language="cs">
+ <![CDATA[
+ var process = new Process ();
+
+ process.StartInfo.FileName = LLVMConfTool;
+ process.StartInfo.Arguments = LLVMConfToolArg;
+ process.StartInfo.UseShellExecute = false;
+ process.StartInfo.RedirectStandardOutput = true;
+ process.Start ();
+
+ LLVMConfToolOut = process.StandardOutput.ReadToEnd ().Trim ();
+ process.WaitForExit ();
+
+ if (LLVMConfToolArg.StartsWith ("--libnames"))
+ {
+ var libs = LLVMConfToolOut.Split (' ');
+ StringBuilder libNames = new StringBuilder ();
+ foreach (var lib in libs)
+ {
+ var libPrefixEnd = lib.StartsWith ("lib") ? 3 : 0;
+ var libExtensionStart = lib.LastIndexOf (".");
+
+ if (libNames.Length != 0)
+ libNames.Append (" ");
+
+ libNames.Append (lib.Substring (libPrefixEnd, libExtensionStart - libPrefixEnd) + ".lib");
+ }
+
+ LLVMConfToolOut = libNames.ToString ();
+ }
+
+ if (process.ExitCode != 0)
+ LLVMConfToolOut = "";
+ ]]>
+ </Code>
+ </Task>
+ </UsingTask>
+
+ <PropertyGroup>
+ <_MonoSourceDir>$([System.IO.Path]::GetFullPath('$(MONO_DIR)').TrimEnd('\'))</_MonoSourceDir>
+ <_MonoOutputDir>$([System.IO.Path]::GetFullPath('$(OutDir)'))</_MonoOutputDir>
+ </PropertyGroup>
+
+ <PropertyGroup>
+ <_LLVMSourceDir>$(MONO_INTERNAL_LLVM_SOURCE_DIR)</_LLVMSourceDir>
+ <_LLVMSourceDir Condition="'$(_LLVMSourceDir)' == ''">$(_MonoSourceDir)\external\llvm</_LLVMSourceDir>
+ <_LLVMBuildDir>$([System.IO.Path]::GetFullPath('$(MONO_BUILD_DIR_PREFIX)$(Platform)\obj\external\llvm-build\$(Configuration)'))</_LLVMBuildDir>
+ <_LLVMInstallDir>$(_LLVMBuildDir)\install</_LLVMInstallDir>
+ </PropertyGroup>
+
+ <PropertyGroup>
+ <_BtlsBuildDir>$([System.IO.Path]::GetFullPath('$(MONO_BUILD_DIR_PREFIX)$(Platform)\obj\external\btls-build-shared\$(Configuration)'))</_BtlsBuildDir>
+ </PropertyGroup>
+
+ <Target Name="_CheckEnableBtls" Condition="'$(MONO_ENABLE_BTLS)' != 'true'">
+ <_CheckConfigurationProperty ConfFile="$(MONO_DIR)/cygconfig.h" ConfRegEx=".*#define.*HAVE_BTLS.*1">
+ <Output TaskParameter="ConfPropertyFoundMatch" PropertyName="MONO_ENABLE_BTLS" />
+ </_CheckConfigurationProperty>
+ </Target>
+
+ <Target Name="_CheckEnableLLVM" Condition="'$(MONO_ENABLE_LLVM)' != 'true'">
+ <_CheckConfigurationProperty ConfFile="$(MONO_DIR)/cygconfig.h" ConfRegEx=".*#define.*ENABLE_LLVM.*1">
+ <Output TaskParameter="ConfPropertyFoundMatch" PropertyName="MONO_ENABLE_LLVM" />
+ </_CheckConfigurationProperty>
+ </Target>
+
+ <Target Name="_CheckInternalLLVM" Condition="'$(_MonoEnableInternalLLVM)' != 'true' and '$(_MonoEnableExternalLLVM)' != 'true' and '$(MONO_ENABLE_LLVM)' == 'true'" DependsOnTargets="_CheckEnableLLVM">
+ <_CheckConfigurationProperty ConfFile="$(MONO_DIR)/cygconfig.h" ConfRegEx=".*#define.*INTERNAL_LLVM.*1">
+ <Output TaskParameter="ConfPropertyFoundMatch" PropertyName="_MonoEnableInternalLLVM" />
+ </_CheckConfigurationProperty>
+ </Target>
+
+ <Target Name="_CheckExternalLLVM" Condition="'$(_MonoEnableExternalLLVM)' != 'true' and '$(_MonoEnableInternalLLVM)' != 'true' and '$(MONO_ENABLE_LLVM)' == 'true'" DependsOnTargets="_CheckEnableLLVM">
+ <_CheckConfigurationProperty ConfFile="$(MONO_DIR)\Makefile" ConfRegEx=".*EXTERNAL_LLVM_CONFIG_WIN32.*llvm-config.exe">
+ <Output TaskParameter="ConfPropertyFoundMatch" PropertyName="_MonoEnableExternalLLVM" />
+ <Output TaskParameter="ConfPropertyValue" PropertyName="_CheckExternalLLVMOutput" />
+ </_CheckConfigurationProperty>
+ <PropertyGroup>
+ <_MonoLLVMConfig Condition="'$(_MonoEnableExternalLLVM)' == 'true'">$(_CheckExternalLLVMOutput)</_MonoLLVMConfig>
+ </PropertyGroup>
+ </Target>
+
+ <Target Name="_SetDefaultLLVMProperties" Condition="'$(MONO_ENABLE_LLVM)' == 'true'">
+ <PropertyGroup Condition="'$(MONO_EXTERNAL_LLVM_CONFIG)' != ''">
+ <_MonoEnableExternalLLVM>true</_MonoEnableExternalLLVM>
+ <_MonoEnableInternalLLVM>false</_MonoEnableInternalLLVM>
+ <_MonoLLVMConfig>$(MONO_EXTERNAL_LLVM_CONFIG)</_MonoLLVMConfig>
+ </PropertyGroup>
+
+ <PropertyGroup Condition="'$(MONO_EXTERNAL_LLVM_CONFIG)' == ''">
+ <_MonoEnableExternalLLVM>false</_MonoEnableExternalLLVM>
+ <_MonoEnableInternalLLVM>true</_MonoEnableInternalLLVM>
+ <_MonoLLVMConfig>$(_LLVMInstallDir)\bin\llvm-config.exe</_MonoLLVMConfig>
+ </PropertyGroup>
+ </Target>
+
+ <Target Name="_SetupMonoLLVMBuildProperties" Condition="$(MONO_ENABLE_LLVM)=='true'">
+
+ <Error Text="LLVM config executable $(_MonoLLVMConfig) not found." Condition="!Exists($(_MonoLLVMConfig))" />
+
+ <_GetLLVMConfiguration LLVMConfTool="$(_MonoLLVMConfig)" LLVMConfToolArg="--version">
+ <Output TaskParameter="LLVMConfToolOut" PropertyName="MONO_LLVM_VERSION" />
+ </_GetLLVMConfiguration>
+
+ <Error Text="Compiling with stock LLVM is not supported, please use the Mono LLVM repo at https://github.com/mono/llvm." Condition="!$(MONO_LLVM_VERSION.Contains('mono'))" />
+ <Error Text="Expected llvm version 3.6 or 6.0, but llvm-config --version returned $(MONO_LLVM_VERSION)." Condition="!$(MONO_LLVM_VERSION.StartsWith('3.6')) and !$(MONO_LLVM_VERSION.StartsWith('6.0'))" />
+
+ <_GetLLVMConfiguration LLVMConfTool="$(_MonoLLVMConfig)" LLVMConfToolArg="--mono-api-version">
+ <Output TaskParameter="LLVMConfToolOut" PropertyName="MONO_LLVM_API_VERSION" />
+ </_GetLLVMConfiguration>
+
+ <PropertyGroup>
+ <_MonoLLVMConfigComponents>analysis core bitwriter mcjit x86codegen</_MonoLLVMConfigComponents>
+ <_MonoLLVMConfigComponents Condition="$(MONO_LLVM_API_VERSION) &lt; 600">$(_MonoLLVMConfigComponents) jit</_MonoLLVMConfigComponents>
+ <_MonoLLVMConfigComponents Condition="$(MONO_LLVM_API_VERSION) &gt;= 600">$(_MonoLLVMConfigComponents) orcjit</_MonoLLVMConfigComponents>
+ </PropertyGroup>
+
+ <_GetLLVMConfiguration LLVMConfTool="$(_MonoLLVMConfig)" LLVMConfToolArg="--libnames $(_MonoLLVMConfigComponents)">
+ <Output TaskParameter="LLVMConfToolOut" PropertyName="MONO_LLVM_LIBS" />
+ </_GetLLVMConfiguration>
+
+ <PropertyGroup>
+ <MONO_LLVM_LIBS>$(MONO_LLVM_LIBS.Split(' '))</MONO_LLVM_LIBS>
+ </PropertyGroup>
+
+ <_GetLLVMConfiguration LLVMConfTool="$(_MonoLLVMConfig)" LLVMConfToolArg="--includedir">
+ <Output TaskParameter="LLVMConfToolOut" PropertyName="MONO_LLVM_INCLUDE_DIR" />
+ </_GetLLVMConfiguration>
+
+ <_GetLLVMConfiguration LLVMConfTool="$(_MonoLLVMConfig)" LLVMConfToolArg="--bindir">
+ <Output TaskParameter="LLVMConfToolOut" PropertyName="MONO_LLVM_BIN_DIR" />
+ </_GetLLVMConfiguration>
+
+ <_GetLLVMConfiguration LLVMConfTool="$(_MonoLLVMConfig)" LLVMConfToolArg="--libdir">
+ <Output TaskParameter="LLVMConfToolOut" PropertyName="MONO_LLVM_LIB_DIR" />
+ </_GetLLVMConfiguration>
+
+ <Message Importance="normal" Text="LLVM build properties:" />
+ <Message Importance="normal" Text="MONO_LLVM_VERSION = $(MONO_LLVM_VERSION)" />
+ <Message Importance="normal" Text="MONO_LLVM_API_VERSION = $(MONO_LLVM_API_VERSION)" />
+ <Message Importance="normal" Text="MONO_LLVM_LIBS = $(MONO_LLVM_LIBS)" />
+ <Message Importance="normal" Text="MONO_LLVM_INCLUDE_DIR = $(MONO_LLVM_INCLUDE_DIR)" />
+ <Message Importance="normal" Text="MONO_LLVM_BIN_DIR = $(MONO_LLVM_BIN_DIR)" />
+ <Message Importance="normal" Text="MONO_LLVM_LIB_DIR = $(MONO_LLVM_LIB_DIR)" />
+
+ </Target>
+
+ <Target Name="_ConfigureExternalMonoLLVMBuildEnvironment" DependsOnTargets="_SetDefaultLLVMProperties;_CheckEnableLLVM;_CheckInternalLLVM;_CheckExternalLLVM" />
+ <Target Name="_ConfigureExternalMonoBTLSBuildEnvironment" DependsOnTargets="_CheckEnableBtls" />
+ <Target Name="_ConfigureExternalMonoBuildEnvironment" DependsOnTargets="_ConfigureExternalMonoLLVMBuildEnvironment;_ConfigureExternalMonoBTLSBuildEnvironment" />
+
+ <PropertyGroup>
+ <PrepareForBuildDependsOn>
+ _ConfigureExternalMonoBuildEnvironment;
+ $(PrepareForBuildDependsOn);
+ </PrepareForBuildDependsOn>
+ </PropertyGroup>
+
+</Project> \ No newline at end of file
diff --git a/msvc/mono.props b/msvc/mono.props
index dd88cc7ab84..2de8f1851c4 100644
--- a/msvc/mono.props
+++ b/msvc/mono.props
@@ -5,8 +5,6 @@
<MONO_BUILD_DIR_PREFIX>$(MSBuildProjectDirectory)/./build/</MONO_BUILD_DIR_PREFIX>
<!-- Change this to custom distribution tree location to enable out of source tree distribution, example c:/mono-dist/ -->
<MONO_INSTALL_DIR_PREFIX>$(MSBuildProjectDirectory)/./dist/</MONO_INSTALL_DIR_PREFIX>
- <!-- Change this to custom install tree location to enable out of source tree builds, example c:/mono-llvm/ -->
- <MONO_LLVM_INSTALL_DIR_PREFIX>$(MONO_INSTALL_DIR_PREFIX)llvm/</MONO_LLVM_INSTALL_DIR_PREFIX>
<!-- GC in use, sgen or boehm, default is sgen. -->
<MONO_TARGET_GC>sgen</MONO_TARGET_GC>
<!-- When true, build targets will get a suffix based on used GC. Makes it possible to have builds using different GC's in same build folders, sharing common targets. -->
@@ -19,6 +17,10 @@
<MONO_USE_STATIC_LIBMONO>false</MONO_USE_STATIC_LIBMONO>
<!-- When true, mono binaries will link and include llvm. When false, mono binaries will not link and include llvm. -->
<MONO_ENABLE_LLVM>false</MONO_ENABLE_LLVM>
+ <!-- When set, use an alternative LLVM source location for internal LLVM build. -->
+ <MONO_INTERNAL_LLVM_SOURCE_DIR></MONO_INTERNAL_LLVM_SOURCE_DIR>
+ <!-- When set, use an external pre-build LLVM library instead of internal one. -->
+ <MONO_EXTERNAL_LLVM_CONFIG></MONO_EXTERNAL_LLVM_CONFIG>
<!-- When true, ported mono projects will build using C++ instead of C compiler. When false, all project will be build using the default compiler. -->
<MONO_COMPILE_AS_CPP>false</MONO_COMPILE_AS_CPP>
</PropertyGroup>
@@ -36,11 +38,6 @@
<LIBGC_CPPFLAGS_INCLUDE>$(MONO_LIBGC_INCLUDE_DIR)</LIBGC_CPPFLAGS_INCLUDE>
<GLIB_CFLAGS_INCLUDE>$(MONO_EGLIB_SOURCE_DIR)</GLIB_CFLAGS_INCLUDE>
</PropertyGroup>
- <PropertyGroup Label="MonoLLVMDirectories">
- <MONO_LLVM_INCLUDE_DIR>$(MONO_LLVM_INSTALL_DIR_PREFIX)include</MONO_LLVM_INCLUDE_DIR>
- <MONO_LLVM_LIB_DIR>$(MONO_LLVM_INSTALL_DIR_PREFIX)lib</MONO_LLVM_LIB_DIR>
- <MONO_LLVM_BIN_DIR>$(MONO_LLVM_INSTALL_DIR_PREFIX)bin</MONO_LLVM_BIN_DIR>
- </PropertyGroup>
<PropertyGroup Label="Static-C-Runtime" Condition="$(MONO_USE_STATIC_C_RUNTIME)=='true'">
<MONO_C_RUNTIME Condition="'$(Configuration)'=='Debug'">MultiThreadedDebug</MONO_C_RUNTIME>
<MONO_C_RUNTIME Condition="'$(Configuration)'!='Debug'">MultiThreaded</MONO_C_RUNTIME>
@@ -77,12 +74,6 @@
<PropertyGroup Label="MonoProfiler">
<VTUNE_INCLUDE_DIR>$(ProgramFiles)/Intel/VTune Amplifier XE 2013/include</VTUNE_INCLUDE_DIR>
</PropertyGroup>
- <PropertyGroup Label="MONO_ENABLE_LLVM" Condition="$(MONO_ENABLE_LLVM)=='true'">
- <MONO_LLVM_CODEGEN_LIBS>LLVMX86CodeGen.lib;LLVMX86Desc.lib;LLVMX86Info.lib;LLVMObject.lib;LLVMBitReader.lib;LLVMMCDisassembler.lib;LLVMX86AsmPrinter.lib;LLVMX86Utils.lib;LLVMSelectionDAG.lib;LLVMAsmPrinter.lib;LLVMMCParser.lib;LLVMCodeGen.lib;LLVMScalarOpts.lib;LLVMInstCombine.lib;LLVMTransformUtils.lib;LLVMipa.lib</MONO_LLVM_CODEGEN_LIBS>
- <MONO_LLVM_JIT_LIBS>LLVMMCJIT.lib;LLVMRuntimeDyld.lib;LLVMObject.lib;LLVMMCParser.lib;LLVMBitReader.lib;LLVMJIT.lib;LLVMExecutionEngine.lib;LLVMCodeGen.lib;LLVMScalarOpts.lib;LLVMInstCombine.lib;LLVMTransformUtils.lib</MONO_LLVM_JIT_LIBS>
- <MONO_LLVM_LIBS>$(MONO_LLVM_CODEGEN_LIBS);$(MONO_LLVM_JIT_LIBS);LLVMBitWriter.lib;LLVMAnalysis.lib;LLVMTarget.lib;LLVMMC.lib;LLVMCore.lib;LLVMSupport.lib</MONO_LLVM_LIBS>
- <MONO_ADDITIONAL_PREPROCESSOR_DEFINITIONS>ENABLE_LLVM=1;$(MONO_ADDITIONAL_PREPROCESSOR_DEFINITIONS)</MONO_ADDITIONAL_PREPROCESSOR_DEFINITIONS>
- </PropertyGroup>
<ItemGroup>
<BuildMacro Include="MONO_BUILD_DIR_PREFIX">
<Value>$(MONO_BUILD_DIR_PREFIX)</Value>
@@ -111,6 +102,9 @@
<BuildMacro Include="MONO_ENABLE_LLVM">
<Value>$(MONO_ENABLE_LLVM)</Value>
</BuildMacro>
+ <BuildMacro Include="MONO_EXTERNAL_LLVM_CONFIG">
+ <Value>$(MONO_EXTERNAL_LLVM_CONFIG)</Value>
+ </BuildMacro>
<BuildMacro Include="MONO_COMPILE_AS_CPP">
<Value>$(MONO_COMPILE_AS_CPP)</Value>
</BuildMacro>
diff --git a/msvc/mono.sln b/msvc/mono.sln
index 4db4deeecaa..1f51a6a6269 100644
--- a/msvc/mono.sln
+++ b/msvc/mono.sln
@@ -66,6 +66,7 @@ EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "eglib", "eglib.vcxproj", "{158073ED-99AE-4196-9EDC-DDB2344F8466}"
ProjectSection(ProjectDependencies) = postProject
{92AE7622-5F58-4234-9A26-9EC71876B3F4} = {92AE7622-5F58-4234-9A26-9EC71876B3F4}
+ {C3D4C623-55F8-4653-980D-61AA629B4E1D} = {C3D4C623-55F8-4653-980D-61AA629B4E1D}
{E41DDF41-0916-454B-A7C2-6E410E45CAFD} = {E41DDF41-0916-454B-A7C2-6E410E45CAFD}
EndProjectSection
EndProject
@@ -209,6 +210,11 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "build-external-btls", "buil
{92AE7622-5F58-4234-9A26-9EC71876B3F4} = {92AE7622-5F58-4234-9A26-9EC71876B3F4}
EndProjectSection
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "build-external-llvm", "build-external-llvm.vcxproj", "{C3D4C623-55F8-4653-980D-61AA629B4E1D}"
+ ProjectSection(ProjectDependencies) = postProject
+ {92AE7622-5F58-4234-9A26-9EC71876B3F4} = {92AE7622-5F58-4234-9A26-9EC71876B3F4}
+ EndProjectSection
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
@@ -433,6 +439,14 @@ Global
{E41DDF41-0916-454B-A7C2-6E410E45CAFD}.Release|Win32.Build.0 = Release|Win32
{E41DDF41-0916-454B-A7C2-6E410E45CAFD}.Release|x64.ActiveCfg = Release|x64
{E41DDF41-0916-454B-A7C2-6E410E45CAFD}.Release|x64.Build.0 = Release|x64
+ {C3D4C623-55F8-4653-980D-61AA629B4E1D}.Debug|Win32.ActiveCfg = Debug|Win32
+ {C3D4C623-55F8-4653-980D-61AA629B4E1D}.Debug|Win32.Build.0 = Debug|Win32
+ {C3D4C623-55F8-4653-980D-61AA629B4E1D}.Debug|x64.ActiveCfg = Debug|x64
+ {C3D4C623-55F8-4653-980D-61AA629B4E1D}.Debug|x64.Build.0 = Debug|x64
+ {C3D4C623-55F8-4653-980D-61AA629B4E1D}.Release|Win32.ActiveCfg = Release|Win32
+ {C3D4C623-55F8-4653-980D-61AA629B4E1D}.Release|Win32.Build.0 = Release|Win32
+ {C3D4C623-55F8-4653-980D-61AA629B4E1D}.Release|x64.ActiveCfg = Release|x64
+ {C3D4C623-55F8-4653-980D-61AA629B4E1D}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -472,6 +486,7 @@ Global
{88D2EB79-592D-45F8-B849-AE021C1D983A} = {0EBA83B7-0EB4-4C83-A900-77300A97E8B1}
{675F4175-FFB1-480D-AD36-F397578844D4} = {DE3617B4-17A8-4E5F-A00F-BA43D956881F}
{E41DDF41-0916-454B-A7C2-6E410E45CAFD} = {7AF3635B-001C-42BF-94B9-C036CFDCA71D}
+ {C3D4C623-55F8-4653-980D-61AA629B4E1D} = {7AF3635B-001C-42BF-94B9-C036CFDCA71D}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
AMDCaPersistentConfig = Debug|Win32
diff --git a/msvc/mono.vcxproj b/msvc/mono.vcxproj
index b8de263f6c5..d42026f04f6 100644
--- a/msvc/mono.vcxproj
+++ b/msvc/mono.vcxproj
@@ -103,8 +103,7 @@
</ClCompile>
<ProjectReference />
<Link>
- <AdditionalDependencies>$(MONO_LIBMONO_LIB);$(MONO_LLVM_LIBS);%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>$(MONO_LLVM_LIB_DIR);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <AdditionalDependencies>$(MONO_LIBMONO_LIB);%(AdditionalDependencies)</AdditionalDependencies>
<SubSystem>Console</SubSystem>
<DataExecutionPrevention>
</DataExecutionPrevention>
@@ -131,8 +130,7 @@
<LinkLibraryDependencies>false</LinkLibraryDependencies>
</ProjectReference>
<Link>
- <AdditionalDependencies>$(MONO_LIBMONO_LIB);$(MONO_LLVM_LIBS);%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>$(MONO_LLVM_LIB_DIR);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <AdditionalDependencies>$(MONO_LIBMONO_LIB);%(AdditionalDependencies)</AdditionalDependencies>
<SubSystem>Console</SubSystem>
<ShowProgress>
</ShowProgress>
@@ -152,8 +150,7 @@
<LinkLibraryDependencies>false</LinkLibraryDependencies>
</ProjectReference>
<Link>
- <AdditionalDependencies>$(MONO_LIBMONO_LIB);$(MONO_LLVM_LIBS);%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>$(MONO_LLVM_LIB_DIR);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <AdditionalDependencies>$(MONO_LIBMONO_LIB);%(AdditionalDependencies)</AdditionalDependencies>
<SubSystem>Console</SubSystem>
<DataExecutionPrevention>
</DataExecutionPrevention>
@@ -176,8 +173,7 @@
<LinkLibraryDependencies>false</LinkLibraryDependencies>
</ProjectReference>
<Link>
- <AdditionalDependencies>$(MONO_LIBMONO_LIB);$(MONO_LLVM_LIBS);%(AdditionalDependencies)</AdditionalDependencies>
- <AdditionalLibraryDirectories>$(MONO_LLVM_LIB_DIR);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <AdditionalDependencies>$(MONO_LIBMONO_LIB);%(AdditionalDependencies)</AdditionalDependencies>
<SubSystem>Console</SubSystem>
</Link>
</ItemDefinitionGroup>
@@ -198,6 +194,22 @@
</ProjectReference>
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <Import Project="mono.external.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
+ <Target Name="_SetupMonoLLVMLinkItems" Condition="$(MONO_ENABLE_LLVM)=='true'">
+ <ItemGroup>
+ <Link>
+ <AdditionalLibraryDirectories>$(MONO_LLVM_LIB_DIR);%(Lib.AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <AdditionalDependencies>$(MONO_LLVM_LIBS);%(Lib.AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemGroup>
+ </Target>
+ <Target Name="_ConfigureExternalLinkDependency" DependsOnTargets="_ConfigureExternalMonoBuildEnvironment;_SetupMonoLLVMBuildProperties;_SetupMonoLLVMLinkItems" />
+ <PropertyGroup>
+ <ComputeLibInputsTargets>
+ $(ComputeLibInputsTargets);
+ _ConfigureExternalLinkDependency;
+ </ComputeLibInputsTargets>
+ </PropertyGroup>
</Project> \ No newline at end of file
diff --git a/msvc/winsetup.bat b/msvc/winsetup.bat
index 31363704164..aff095a122c 100755
--- a/msvc/winsetup.bat
+++ b/msvc/winsetup.bat
@@ -6,6 +6,7 @@ SET CYG_CONFIG_H="%~dp0..\cygconfig.h"
SET WIN_CONFIG_H="%~dp0..\winconfig.h"
SET CONFIGURE_AC="%~dp0..\configure.ac"
SET VERSION_H="%~dp0..\mono\mini\version.h"
+SET OPTIONAL_DEFINES=%~1
ECHO Setting up Mono configuration headers...
@@ -63,13 +64,11 @@ echo #define PACKAGE_VERSION "%MONO_VERSION%" >> %CONFIG_H_TEMP%
echo #define VERSION "%MONO_VERSION%" >> %CONFIG_H_TEMP%
echo #define MONO_CORLIB_VERSION "%MONO_CORLIB_VERSION%" >> %CONFIG_H_TEMP%
-:: Add dynamic configuration parameters set in original config.h affecting msvc build.
-for /f "tokens=*" %%a in ('findstr /i /r /c:".*#define.*HAVE_BTLS.*1" %CYG_CONFIG_H%') do (
- echo #define HAVE_BTLS 1 >> %CONFIG_H_TEMP%
-)
-
-for /f "tokens=*" %%a in ('findstr /i /r /c:".*#define.*LLVM.*" %CYG_CONFIG_H%') do (
- echo %%a >> %CONFIG_H_TEMP%
+:: Add dynamic configuration parameters affecting msvc build.
+for %%a in (%OPTIONAL_DEFINES%) do (
+ echo #ifndef %%a >> %CONFIG_H_TEMP%
+ echo #define %%a 1 >> %CONFIG_H_TEMP%
+ echo #endif >> %CONFIG_H_TEMP%
)
echo #endif >> %CONFIG_H_TEMP%