static int Main() { var paths = new XABuildPaths(); if (!Directory.Exists(paths.XamarinAndroidBuildOutput)) { Console.WriteLine($"Unable to find Xamarin.Android build output at {paths.XamarinAndroidBuildOutput}"); return(1); } //Create a custom xabuild.exe.config CreateConfig(paths); //Create link to .NETFramework and .NETPortable directory foreach (var dir in Directory.GetDirectories(paths.SystemProfiles)) { var name = Path.GetFileName(dir); if (!SymbolicLink.Create(Path.Combine(paths.FrameworksDirectory, name), dir)) { return(1); } } return(MSBuildApp.Main()); }
static int Main() { var paths = new XABuildPaths(); try { if (!Directory.Exists(paths.XamarinAndroidBuildOutput)) { Console.WriteLine($"Unable to find Xamarin.Android build output at {paths.XamarinAndroidBuildOutput}"); return(1); } //Create a custom xabuild.exe.config var xml = CreateConfig(paths); //Symbolic links to be created: key=system, value=in-tree var symbolicLinks = new Dictionary <string, string> (); foreach (var dir in Directory.EnumerateDirectories(paths.SystemFrameworks)) { if (Path.GetFileName(dir) != "MonoAndroid") { symbolicLinks [dir] = Path.Combine(paths.FrameworksDirectory, Path.GetFileName(dir)); } } foreach (var dir in paths.SystemTargetsDirectories) { symbolicLinks [dir] = Path.Combine(paths.MSBuildExtensionsPath, Path.GetFileName(dir)); } if (symbolicLinks.Values.Any(d => !Directory.Exists(d))) { //Hold open the file while creating the symbolic links using (var writer = OpenSysLinksFile(paths)) { foreach (var pair in symbolicLinks) { var systemDirectory = pair.Key; var symbolicLink = pair.Value; Console.WriteLine($"[xabuild] creating symbolic link '{symbolicLink}' -> '{systemDirectory}'"); if (!SymbolicLink.Create(symbolicLink, systemDirectory)) { return(1); } writer.WriteLine(Path.GetFileName(symbolicLink)); } } } return(MSBuildApp.Main()); } finally { //NOTE: these are temporary files foreach (var file in new [] { paths.MSBuildExeTempPath, paths.XABuildConfig }) { if (File.Exists(file)) { File.Delete(file); } } } }
static int Main() { var paths = new XABuildPaths(); try { if (!Directory.Exists(paths.XamarinAndroidBuildOutput)) { Console.WriteLine($"Unable to find Xamarin.Android build output at {paths.XamarinAndroidBuildOutput}"); return(1); } //Create a custom xabuild.exe.config var xml = CreateConfig(paths); //Hold open the file while creating the symbolic links using (var writer = OpenSysLinksFile(paths)) { //Create link to .NETFramework and .NETPortable directory foreach (var dir in Directory.GetDirectories(paths.SystemProfiles)) { var name = Path.GetFileName(dir); if (!SymbolicLink.Create(Path.Combine(paths.FrameworksDirectory, name), dir)) { return(1); } writer.WriteLine(name); } } int exitCode = MSBuildApp.Main(); if (exitCode != 0) { Console.WriteLine($"MSBuildApp.Main exited with {exitCode}, xabuild configuration is:"); var settings = new XmlWriterSettings { Indent = true, NewLineOnAttributes = true, }; using (var writer = XmlTextWriter.Create(Console.Out, settings)) { xml.WriteTo(writer); } } return(exitCode); } finally { //NOTE: these are temporary files foreach (var file in new [] { paths.MSBuildExeTempPath, paths.XABuildConfig }) { if (File.Exists(file)) { File.Delete(file); } } } }
static int Main() { var paths = new XABuildPaths(); try { if (!Directory.Exists(paths.XamarinAndroidBuildOutput)) { Console.WriteLine($"Unable to find Xamarin.Android build output at {paths.XamarinAndroidBuildOutput}"); return(1); } //Create a custom xabuild.exe.config var xml = CreateConfig(paths); //Symbolic links to .NETFramework and .NETPortable directory var systemDirectories = Directory.EnumerateDirectories(paths.SystemProfiles) .Where(d => Path.GetFileName(d) != "MonoAndroid") //NOTE: this happened on one of our VSTS build agents .ToArray(); var symbolicLinks = systemDirectories .Select(d => Path.Combine(paths.FrameworksDirectory, Path.GetFileName(d))) .ToArray(); if (symbolicLinks.Any(d => !Directory.Exists(d))) { //Hold open the file while creating the symbolic links using (var writer = OpenSysLinksFile(paths)) { for (int i = 0; i < systemDirectories.Length; i++) { var symbolicLink = symbolicLinks [i]; var systemDirectory = systemDirectories [i]; Console.WriteLine($"[xabuild] creating symbolic link '{symbolicLink}' -> '{systemDirectory}'"); if (!SymbolicLink.Create(symbolicLink, systemDirectory)) { return(1); } writer.WriteLine(Path.GetFileName(symbolicLink)); } } } return(MSBuildApp.Main()); } finally { //NOTE: these are temporary files foreach (var file in new [] { paths.MSBuildExeTempPath, paths.XABuildConfig }) { if (File.Exists(file)) { File.Delete(file); } } } }
static int Main() { var paths = new XABuildPaths(); try { if (!Directory.Exists(paths.XamarinAndroidBuildOutput)) { Console.WriteLine($"Unable to find Xamarin.Android build output at {paths.XamarinAndroidBuildOutput}"); return(1); } //Create a custom xabuild.exe.config CreateConfig(paths); //Create link to .NETFramework and .NETPortable directory foreach (var dir in Directory.GetDirectories(paths.SystemProfiles)) { var name = Path.GetFileName(dir); if (!SymbolicLink.Create(Path.Combine(paths.FrameworksDirectory, name), dir)) { return(1); } } return(MSBuildApp.Main()); } finally { //NOTE: these are temporary files foreach (var file in new [] { paths.MSBuildExeTempPath, paths.XABuildConfig }) { if (File.Exists(file)) { File.Delete(file); } } } }
static int Main() { var paths = new XABuildPaths(); try { if (!Directory.Exists(paths.XamarinAndroidBuildOutput)) { Console.WriteLine($"Unable to find Xamarin.Android build output at {paths.XamarinAndroidBuildOutput}"); return(1); } //Create a custom xabuild.exe.config var xml = CreateConfig(paths); //Create link to .NETFramework and .NETPortable directory foreach (var dir in Directory.GetDirectories(paths.SystemProfiles)) { var name = Path.GetFileName(dir); if (!SymbolicLink.Create(Path.Combine(paths.FrameworksDirectory, name), dir)) { return(1); } //NOTE: on Windows, the NUnit tests can throw IOException when running xabuild in parallel for (int i = 0;; i++) { try { File.AppendAllText(Path.Combine(paths.FrameworksDirectory, ".__sys_links.txt"), name + "\n"); break; } catch (IOException) { if (i == 2) { throw; //Fail after 3 tries } Thread.Sleep(100); } } } int exitCode = MSBuildApp.Main(); if (exitCode != 0) { Console.WriteLine($"MSBuildApp.Main exited with {exitCode}, xabuild configuration is:"); var settings = new XmlWriterSettings { Indent = true, NewLineOnAttributes = true, }; using (var writer = XmlTextWriter.Create(Console.Out, settings)) { xml.WriteTo(writer); } } return(exitCode); } finally { //NOTE: these are temporary files foreach (var file in new [] { paths.MSBuildExeTempPath, paths.XABuildConfig }) { if (File.Exists(file)) { File.Delete(file); } } } }
static int Main() { var paths = new XABuildPaths(); try { //HACK: running on Mono, MSBuild cannot resolve System.Reflection.Metadata if (!paths.IsWindows) { AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { var name = new AssemblyName(args.Name); if (name.Name == "System.Reflection.Metadata") { var path = Path.Combine(paths.MSBuildBin, $"{name.Name}.dll"); return(Assembly.LoadFile(path)); } //Return null, to revert to default .NET behavior return(null); }; } if (!Directory.Exists(paths.XamarinAndroidBuildOutput)) { Console.WriteLine($"Unable to find Xamarin.Android build output at {paths.XamarinAndroidBuildOutput}"); return(1); } // Create a custom xabuild.exe.config CreateConfig(paths); // Create a Microsoft.Build.NuGetSdkResolver.xml CreateSdkResolverConfig(paths); //Symbolic links to be created: key=in-tree-dir, value=system-dir var symbolicLinks = new Dictionary <string, string> (); if (paths.IsMacOS || paths.IsLinux) { foreach (var dir in Directory.EnumerateDirectories(paths.MonoSystemFrameworkRoot)) { if (Path.GetFileName(dir).EndsWith("-api", StringComparison.OrdinalIgnoreCase)) { var inTreeFramework = Path.Combine(paths.XamarinAndroidBuildOutput, "lib", "xamarin.android", Path.GetFileName(dir)); symbolicLinks [inTreeFramework] = dir; } } } foreach (var dir in Directory.EnumerateDirectories(paths.SystemFrameworks)) { if (Path.GetFileName(dir) != "MonoAndroid") { var inTreeFramework = Path.Combine(paths.FrameworksDirectory, Path.GetFileName(dir)); symbolicLinks [inTreeFramework] = dir; } } foreach (var dir in paths.SystemTargetsDirectories) { var inTreeTargetsDir = Path.Combine(paths.MSBuildExtensionsPath, Path.GetFileName(dir)); if (!symbolicLinks.ContainsKey(inTreeTargetsDir)) { symbolicLinks [inTreeTargetsDir] = dir; continue; } var prevTargetDir = symbolicLinks [inTreeTargetsDir]; symbolicLinks.Remove(inTreeTargetsDir); if (Directory.Exists(inTreeTargetsDir) && SymbolicLink.IsPathSymlink(inTreeTargetsDir)) { Console.WriteLine($"Removing old symlink: {inTreeTargetsDir}"); Directory.Delete(inTreeTargetsDir); } var subTargetDirs = Directory.EnumerateDirectories(prevTargetDir) .Concat(Directory.EnumerateDirectories(dir)); foreach (var subDir in subTargetDirs) { var inTreeTargetSubdir = Path.Combine(inTreeTargetsDir, Path.GetFileName(subDir)); symbolicLinks [inTreeTargetSubdir] = subDir; } } if (symbolicLinks.Keys.Any(d => !Directory.Exists(d))) { //Hold open the file while creating the symbolic links using (var writer = OpenSysLinksFile(paths)) { foreach (var pair in symbolicLinks) { var systemDirectory = pair.Value; var symbolicLink = pair.Key; Console.WriteLine($"[xabuild] creating symbolic link '{symbolicLink}' -> '{systemDirectory}'"); if (!SymbolicLink.Create(symbolicLink, systemDirectory)) { return(1); } writer.WriteLine(Path.GetFileName(symbolicLink)); } } } return(MSBuildApp.Main()); } finally { //NOTE: this is a temporary directory Directory.Delete(paths.MSBuildTempPath, recursive: true); } }
static int Main() { var paths = new XABuildPaths(); try { //HACK: running on Mono, MSBuild cannot resolve System.Reflection.Metadata if (!paths.IsWindows) { AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { var name = new AssemblyName(args.Name); if (name.Name == "System.Reflection.Metadata") { var path = Path.Combine(paths.MSBuildBin, $"{name.Name}.dll"); return(Assembly.LoadFile(path)); } //Return null, to revert to default .NET behavior return(null); }; } if (!Directory.Exists(paths.XamarinAndroidBuildOutput)) { Console.WriteLine($"Unable to find Xamarin.Android build output at {paths.XamarinAndroidBuildOutput}"); return(1); } //Create a custom xabuild.exe.config var xml = CreateConfig(paths); //Symbolic links to be created: key=system, value=in-tree var symbolicLinks = new Dictionary <string, string> (); foreach (var dir in Directory.EnumerateDirectories(paths.SystemFrameworks)) { if (Path.GetFileName(dir) != "MonoAndroid") { symbolicLinks [dir] = Path.Combine(paths.FrameworksDirectory, Path.GetFileName(dir)); } } foreach (var dir in paths.SystemTargetsDirectories) { symbolicLinks [dir] = Path.Combine(paths.MSBuildExtensionsPath, Path.GetFileName(dir)); } if (symbolicLinks.Values.Any(d => !Directory.Exists(d))) { //Hold open the file while creating the symbolic links using (var writer = OpenSysLinksFile(paths)) { foreach (var pair in symbolicLinks) { var systemDirectory = pair.Key; var symbolicLink = pair.Value; Console.WriteLine($"[xabuild] creating symbolic link '{symbolicLink}' -> '{systemDirectory}'"); if (!SymbolicLink.Create(symbolicLink, systemDirectory)) { return(1); } writer.WriteLine(Path.GetFileName(symbolicLink)); } } } return(MSBuildApp.Main()); } finally { //NOTE: these are temporary files foreach (var file in new [] { paths.MSBuildExeTempPath, paths.XABuildConfig }) { if (File.Exists(file)) { File.Delete(file); } } } }