1 <?xml version=
"1.0" encoding=
"utf-8"?>
2 <Project DefaultTargets=
"Build" ToolsVersion=
"4.0" xmlns=
"http://schemas.microsoft.com/developer/msbuild/2003">
4 <UsingTask TaskName=
"_CheckConfigurationProperty" TaskFactory=
"CodeTaskFactory" AssemblyFile=
"$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
6 <ConfFile ParameterType=
"System.String" Required=
"true" />
7 <ConfRegEx ParameterType=
"System.String" Required=
"true" />
8 <ConfPropertyName ParameterType=
"System.String" Output=
"true" />
9 <ConfPropertyValue ParameterType=
"System.String" Output=
"true" />
10 <ConfPropertyFoundMatch ParameterType=
"System.String" Output=
"true" />
13 <Using Namespace=
"System" />
14 <Using Namespace=
"System.Text.RegularExpressions" />
15 <Using Namespace=
"System.IO" />
16 <Code Type=
"Fragment" Language=
"cs">
19 ConfPropertyName =
"";
20 ConfPropertyValue =
"";
21 ConfPropertyFoundMatch =
"false";
23 if (File.Exists (ConfFile))
25 var regex = new Regex (ConfRegEx);
26 using (StreamReader reader = new StreamReader(ConfFile))
29 while ((line = reader.ReadLine ()) != null)
31 var match = regex.Match (line);
32 if (match != null && match.Success)
34 if (match.Groups != null && match.Groups.Count ==
1)
36 var propertyLine = match.Groups[
0].ToString ();
37 if (!String.IsNullOrEmpty (propertyLine))
39 var propertyLineItems = propertyLine.Split ('=');
40 if (propertyLineItems != null && propertyLineItems.Length ==
2)
42 ConfPropertyName = propertyLineItems[
0].Trim ();
43 ConfPropertyValue = propertyLineItems[
1].Trim ();
47 ConfPropertyFoundMatch =
"true";
58 <UsingTask TaskName=
"_GetLLVMConfiguration" TaskFactory=
"CodeTaskFactory" AssemblyFile=
"$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
60 <LLVMConfTool ParameterType=
"System.String" Required=
"true" />
61 <LLVMConfToolArg ParameterType=
"System.String" Required=
"true" />
62 <LLVMConfToolOut ParameterType=
"System.String" Output=
"true" />
65 <Using Namespace=
"System" />
66 <Using Namespace=
"System.Text" />
67 <Using Namespace=
"System.Diagnostics" />
68 <Code Type=
"Fragment" Language=
"cs">
70 var process = new Process ();
72 process.StartInfo.FileName = LLVMConfTool;
73 process.StartInfo.Arguments = LLVMConfToolArg;
74 process.StartInfo.UseShellExecute = false;
75 process.StartInfo.RedirectStandardOutput = true;
78 LLVMConfToolOut = process.StandardOutput.ReadToEnd ().Trim ();
79 process.WaitForExit ();
81 if (LLVMConfToolArg.StartsWith (
"--libnames"))
83 var libs = LLVMConfToolOut.Split (' ');
84 StringBuilder libNames = new StringBuilder ();
85 foreach (var lib in libs)
87 var libPrefixEnd = lib.StartsWith (
"lib") ?
3 :
0;
88 var libExtensionStart = lib.LastIndexOf (
".");
90 if (libNames.Length !=
0)
91 libNames.Append (
" ");
93 libNames.Append (lib.Substring (libPrefixEnd, libExtensionStart - libPrefixEnd) +
".lib");
96 LLVMConfToolOut = libNames.ToString ();
99 if (process.ExitCode !=
0)
100 LLVMConfToolOut =
"";
107 <_MonoSourceDir>$([System.IO.Path]::GetFullPath('$(MONO_DIR)').TrimEnd('\'))
</_MonoSourceDir>
108 <_MonoOutputDir>$([System.IO.Path]::GetFullPath('$(OutDir)'))
</_MonoOutputDir>
112 <_LLVMSourceDir Condition=
"'$(_LLVMSourceDir)' == ''">$(MONO_INTERNAL_LLVM_SOURCE_DIR)
</_LLVMSourceDir>
113 <_LLVMSourceDir Condition=
"'$(_LLVMSourceDir)' == ''">$(_MonoSourceDir)\external\llvm
</_LLVMSourceDir>
114 <_LLVMBuildDir>$([System.IO.Path]::GetFullPath('$(MONO_BUILD_DIR_PREFIX)$(Platform)\obj\external\llvm-build\$(Configuration)'))
</_LLVMBuildDir>
115 <_LLVMInstallDir>$(_LLVMBuildDir)\install
</_LLVMInstallDir>
119 <_BtlsSourceDir Condition=
"'$(_BtlsSourceDir)' == ''">$(_MonoSourceDir)\external\boringssl
</_BtlsSourceDir>
120 <_MonoBtlsSourceDir>$(_MonoSourceDir)\mono\btls
</_MonoBtlsSourceDir>
121 <_BtlsBuildDir>$([System.IO.Path]::GetFullPath('$(MONO_BUILD_DIR_PREFIX)$(Platform)\obj\external\btls-build-shared\$(Configuration)'))
</_BtlsBuildDir>
124 <Target Name=
"_CheckEnableBtls" Condition=
"'$(MONO_ENABLE_BTLS)' != 'true'">
125 <_CheckConfigurationProperty ConfFile=
"$(MONO_DIR)/cygconfig.h" ConfRegEx=
".*#define.*HAVE_BTLS.*1">
126 <Output TaskParameter=
"ConfPropertyFoundMatch" PropertyName=
"MONO_ENABLE_BTLS" />
127 </_CheckConfigurationProperty>
130 <Target Name=
"_CheckEnableLLVM" Condition=
"'$(MONO_ENABLE_LLVM)' != 'true'">
131 <_CheckConfigurationProperty ConfFile=
"$(MONO_DIR)/cygconfig.h" ConfRegEx=
".*#define.*ENABLE_LLVM.*1">
132 <Output TaskParameter=
"ConfPropertyFoundMatch" PropertyName=
"MONO_ENABLE_LLVM" />
133 </_CheckConfigurationProperty>
136 <Target Name=
"_CheckInternalLLVM" Condition=
"'$(_MonoEnableInternalLLVM)' != 'true' and '$(_MonoEnableExternalLLVM)' != 'true' and '$(MONO_ENABLE_LLVM)' == 'true'" DependsOnTargets=
"_CheckEnableLLVM">
137 <_CheckConfigurationProperty ConfFile=
"$(MONO_DIR)/cygconfig.h" ConfRegEx=
".*#define.*INTERNAL_LLVM.*1">
138 <Output TaskParameter=
"ConfPropertyFoundMatch" PropertyName=
"_MonoEnableInternalLLVM" />
139 </_CheckConfigurationProperty>
142 <Target Name=
"_CheckExternalLLVM" Condition=
"'$(_MonoEnableExternalLLVM)' != 'true' and '$(_MonoEnableInternalLLVM)' != 'true' and '$(MONO_ENABLE_LLVM)' == 'true'" DependsOnTargets=
"_CheckEnableLLVM">
143 <_CheckConfigurationProperty ConfFile=
"$(MONO_DIR)\Makefile" ConfRegEx=
".*EXTERNAL_LLVM_CONFIG_WIN32.*llvm-config.exe">
144 <Output TaskParameter=
"ConfPropertyFoundMatch" PropertyName=
"_MonoEnableExternalLLVM" />
145 <Output TaskParameter=
"ConfPropertyValue" PropertyName=
"_CheckExternalLLVMOutput" />
146 </_CheckConfigurationProperty>
148 <_MonoLLVMConfig Condition=
"'$(_MonoEnableExternalLLVM)' == 'true'">$(_CheckExternalLLVMOutput)
</_MonoLLVMConfig>
152 <Target Name=
"_SetDefaultLLVMProperties" Condition=
"'$(MONO_ENABLE_LLVM)' == 'true'">
153 <PropertyGroup Condition=
"'$(MONO_EXTERNAL_LLVM_CONFIG)' != ''">
154 <_MonoEnableExternalLLVM>true
</_MonoEnableExternalLLVM>
155 <_MonoEnableInternalLLVM>false
</_MonoEnableInternalLLVM>
156 <_MonoLLVMConfig>$(MONO_EXTERNAL_LLVM_CONFIG)
</_MonoLLVMConfig>
159 <PropertyGroup Condition=
"'$(MONO_EXTERNAL_LLVM_CONFIG)' == ''">
160 <_MonoEnableExternalLLVM>false
</_MonoEnableExternalLLVM>
161 <_MonoEnableInternalLLVM>true
</_MonoEnableInternalLLVM>
162 <_MonoLLVMConfig>$(_LLVMInstallDir)\bin\llvm-config.exe
</_MonoLLVMConfig>
166 <Target Name=
"_SetupMonoLLVMBuildProperties" Condition=
"$(MONO_ENABLE_LLVM)=='true'">
168 <Error Text=
"LLVM config executable $(_MonoLLVMConfig) not found." Condition=
"!Exists($(_MonoLLVMConfig))" />
170 <_GetLLVMConfiguration LLVMConfTool=
"$(_MonoLLVMConfig)" LLVMConfToolArg=
"--version">
171 <Output TaskParameter=
"LLVMConfToolOut" PropertyName=
"MONO_LLVM_VERSION" />
172 </_GetLLVMConfiguration>
174 <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'))" />
175 <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'))" />
177 <_GetLLVMConfiguration LLVMConfTool=
"$(_MonoLLVMConfig)" LLVMConfToolArg=
"--mono-api-version">
178 <Output TaskParameter=
"LLVMConfToolOut" PropertyName=
"MONO_LLVM_API_VERSION" />
179 </_GetLLVMConfiguration>
182 <_MonoLLVMConfigComponents>analysis core bitwriter x86codegen
</_MonoLLVMConfigComponents>
183 <!-- Currently LLVM JIT is only supported on OSX and including the libraries will get some duplicated symbols during linking.
184 <_MonoLLVMConfigComponents Condition="$(MONO_LLVM_API_VERSION) < 600">$(_MonoLLVMConfigComponents)mcjit jit</_MonoLLVMConfigComponents>
185 <_MonoLLVMConfigComponents Condition="$(MONO_LLVM_API_VERSION) >= 600">$(_MonoLLVMConfigComponents)mcjit orcjit</_MonoLLVMConfigComponents>
189 <_GetLLVMConfiguration LLVMConfTool=
"$(_MonoLLVMConfig)" LLVMConfToolArg=
"--libnames $(_MonoLLVMConfigComponents)">
190 <Output TaskParameter=
"LLVMConfToolOut" PropertyName=
"MONO_LLVM_LIBS" />
191 </_GetLLVMConfiguration>
194 <MONO_LLVM_LIBS>$(MONO_LLVM_LIBS.Split(' '))
</MONO_LLVM_LIBS>
197 <_GetLLVMConfiguration LLVMConfTool=
"$(_MonoLLVMConfig)" LLVMConfToolArg=
"--includedir">
198 <Output TaskParameter=
"LLVMConfToolOut" PropertyName=
"MONO_LLVM_INCLUDE_DIR" />
199 </_GetLLVMConfiguration>
201 <_GetLLVMConfiguration LLVMConfTool=
"$(_MonoLLVMConfig)" LLVMConfToolArg=
"--bindir">
202 <Output TaskParameter=
"LLVMConfToolOut" PropertyName=
"MONO_LLVM_BIN_DIR" />
203 </_GetLLVMConfiguration>
205 <_GetLLVMConfiguration LLVMConfTool=
"$(_MonoLLVMConfig)" LLVMConfToolArg=
"--libdir">
206 <Output TaskParameter=
"LLVMConfToolOut" PropertyName=
"MONO_LLVM_LIB_DIR" />
207 </_GetLLVMConfiguration>
209 <Message Importance=
"normal" Text=
"LLVM build properties:" />
210 <Message Importance=
"normal" Text=
"MONO_LLVM_VERSION = $(MONO_LLVM_VERSION)" />
211 <Message Importance=
"normal" Text=
"MONO_LLVM_API_VERSION = $(MONO_LLVM_API_VERSION)" />
212 <Message Importance=
"normal" Text=
"MONO_LLVM_LIBS = $(MONO_LLVM_LIBS)" />
213 <Message Importance=
"normal" Text=
"MONO_LLVM_INCLUDE_DIR = $(MONO_LLVM_INCLUDE_DIR)" />
214 <Message Importance=
"normal" Text=
"MONO_LLVM_BIN_DIR = $(MONO_LLVM_BIN_DIR)" />
215 <Message Importance=
"normal" Text=
"MONO_LLVM_LIB_DIR = $(MONO_LLVM_LIB_DIR)" />
219 <Target Name=
"_ConfigureExternalMonoLLVMBuildEnvironment" DependsOnTargets=
"_SetDefaultLLVMProperties;_CheckEnableLLVM;_CheckInternalLLVM;_CheckExternalLLVM" />
220 <Target Name=
"_ConfigureExternalMonoBTLSBuildEnvironment" DependsOnTargets=
"_CheckEnableBtls" />
221 <Target Name=
"_ConfigureExternalMonoBuildEnvironment" DependsOnTargets=
"_ConfigureExternalMonoLLVMBuildEnvironment;_ConfigureExternalMonoBTLSBuildEnvironment" />
224 <PrepareForBuildDependsOn>
225 _ConfigureExternalMonoBuildEnvironment;
226 $(PrepareForBuildDependsOn);
227 </PrepareForBuildDependsOn>