private void CopyExternalLibrariesToOutputDirectory(Entity target, Dictionary <Entity, VirtualFile> projectLibraries, out IEnumerable <string> externalLibraries, out IEnumerable <VirtualFile> copiedLibraries) { VirtualDirectory deployDirectory = DeployEntity.Decorate(target).DeployDirectory; VirtualDirectory externalDirectory = deployDirectory.Directory("auto-deployed-external-libraries"); externalDirectory.Clear(); executionContext.Observable.OnNext(new Change(() => externalDirectory.UnClear(), "Cleared automatic copied external libraries.")); externalLibraries = Enumerable.Empty <string>(); copiedLibraries = Enumerable.Empty <VirtualFile>(); List <VirtualFile> newLibraryFiles = new List <VirtualFile>(); if (deployDirectory.Files("*.so", true).Except(projectLibraries.Values).Any()) { externalLibraries = deployDirectory.Files("*.so", true).Except(projectLibraries.Values) .Select(f => f.FullName).ToArray(); //external libraries where copied by user; no further action is required return; } BuildEntity buildEntity = BuildEntity.Decorate(target); if (!buildEntity.HasBuildSystem) { TargetEntity targetEntity = TargetEntity.Decorate(target); executionContext.WriteWarning(new CMakeBuildSystemNotFoundException(targetEntity.FullName, buildEntity.BuildType).Message); return; } externalLibraries = buildEntity.BuildSystem.ExternalLibraries; TargetEntity entity = TargetEntity.Decorate(target); if (entity.Version >= new Version(20, 6)) { foreach (string externalLibrary in buildEntity.BuildSystem.ExternalLibraries) { VirtualFile newFile = fileSystem.GetFile(externalLibrary).CopyTo(deployDirectory); newLibraryFiles.Add(newFile); executionContext.Observable.OnNext(new Change(() => newFile.Delete(), $"Copied {externalLibrary} to {newFile.FullName}.")); } } else { foreach (string externalLibrary in buildEntity.BuildSystem.ExternalLibraries) { executionContext.WriteWarning($"The library {externalLibrary} must be transferred to the device {entity.FullName} into the directory \"usr/local/lib\" manually."); } } copiedLibraries = newLibraryFiles; }
/// <summary> /// Initialize the virtual directory /// </summary> private void InitializeVirtualDirectory() { _sharePaths = new List <string>(); _mDirectory.SetExtensions(GetExtenstions()); _mDirectory.AddExtension(".pls"); _mDirectory.AddExtension(".m3u"); _mDirectory.Clear(); if (_useMyVideoShares) { AddSection("movies"); } if (_useMyMusicShares) { AddSection("music"); } XmlDocument doc = new XmlDocument(); string path = Config.GetFile(Config.Dir.Config, "MPlayer_GUIPlugin.xml"); doc.Load(path); if (doc.DocumentElement != null) { XmlNodeList listShare = doc.DocumentElement.SelectNodes("/mplayergui/Share"); if (listShare != null) { foreach (XmlNode nodeShare in listShare) { Share share = new Share { Name = nodeShare.Attributes["name"].Value, Path = nodeShare.Attributes["path"].Value }; if (!_sharePaths.Contains(share.Path.ToLower())) { _sharePaths.Add(share.Path.ToLower()); _mDirectory.Add(share); } } } } }
public async Task InstallSdk(VirtualFile packedSdk, VirtualDirectory destination, ChangeObservable observable, bool force) { using (IEditableSettings editableSettings = settingsProvider.StartSettingTransaction()) { if (!force && destination.Files(searchRecursive: true).Any()) { throw new FileExistsException(destination.FullName); } if (force) { destination.Clear(); observable.OnNext(new Change(destination.UnClear, "Cleared destination directory.")); } using (IProgressNotifier progressNotifier = Console.IsInputRedirected || Console.IsOutputRedirected ? null : progressVisualizer.Spawn(1, "Install SDK.", null)) { await fileUnpackService.Unpack(packedSdk, destination, progressNotifier, observable).ConfigureAwait(false); } editableSettings.AddSetting(Constants.SdkPathsKey, $"{destination.FullName}"); } }
public (bool, VirtualDirectory) EnsureConfigured(BuildInformation buildInformation, bool showWarningsToUser, ChangeObservable observable = null, bool throwOnError = false, bool showMessagesToUser = true) { if (!CmakeFileExists()) { GenerateCmakeFile(); } VirtualDirectory cmakeFolder = CreateCmakeFolder(); bool success = ConfigureCMake(); return(success, cmakeFolder); void GenerateCmakeFile() { VirtualFile cMakeFile = buildInformation.RootFileEntity.Directory.File(Constants.CMakeFileName); //TODO Generate cmakefile with template system //TODO Set src folders in cmake file (consider foreign project structure) CMakeFileGenerator.WriteCMakeFile(cMakeFile, buildInformation.RootEntity.Name); observable?.OnNext(new Change(() => { /*Do not delete, because user need to make changes perhaps*/ }, $"Generated cmake file {cMakeFile.FullName}")); } bool CmakeFileExists() { return(buildInformation.RootFileEntity.Directory.FileExists(Constants.CMakeFileName)); } VirtualDirectory CreateCmakeFolder() { VirtualDirectory result = buildInformation.BuildEntity.BuildSystemDirectory; if (buildInformation.Configure && !buildInformation.NoConfigure) { result.Clear(); observable?.OnNext(new Change(() => result.UnClear(), $"Cleared cmake directory.")); } return(result); } string GetRealBuildType() { string buildType = !string.IsNullOrEmpty(buildInformation.BuildType) ? buildInformation.BuildType : Constants.ReleaseFolderName; return(buildType); } bool ConfigureCMake() { executionContext.WriteInformation("Checking if CMake needs to be reconfigured...", showMessagesToUser); if ((!cmakeFolder.FileExists("CMakeCache.txt") || buildInformation.Configure || !IsCorrectlyConfigured() || OutputOptionDiffersFromStagingPrefix()) && !buildInformation.NoConfigure) { string cmakeCommand = GenerateCmakeCommand(buildInformation.Target.Name, buildInformation.Target.LongVersion); if (showMessagesToUser) { executionContext.WriteInformation("Configuring CMake..."); } return(CallCmake(cmakeFolder, cmakeCommand, showMessagesToUser, throwOnError, showWarningsToUser)); } if (!string.IsNullOrEmpty(buildInformation.BuildProperties)) { executionContext.WriteWarning($"The specified build options will not be used, " + $"because no reconfiguration is necessary. " + $"To force a reconfiguration please use the '--configure' command option.", showMessagesToUser); } return(true); string GenerateCmakeCommand(string target, string version) { List <string> commandParts = new List <string>(); string sdkRoot = buildInformation.SdkInformation.Root.FullName.Replace("\\", "/"); if (!buildInformation.BuildProperties.Contains("-DCMAKE_TOOLCHAIN_FILE ")) { commandParts.Add(ToolchainFileOption.Replace("%SDK_ROOT%", sdkRoot)); } if (!buildInformation.BuildProperties.Contains("-DARP_TOOLCHAIN_ROOT ")) { commandParts.Add(ToolchainRootOption.Replace("%SDK_ROOT%", sdkRoot)); } if (!buildInformation.BuildProperties.Contains("-DCMAKE_BUILD_TYPE ")) { commandParts.Add(BuildTypeOption.Replace("%BUILD_TYPE%", GetRealBuildType())); } if (!buildInformation.BuildProperties.Contains("-DARP_DEVICE ")) { commandParts.Add(DeviceOption.Replace("%TARGET%", $"\"{target}\"")); } if (!buildInformation.BuildProperties.Contains("-DARP_DEVICE_VERSION ")) { commandParts.Add(DeviceVersionOption.Replace("%VERSION%", $"\"{version}\"")); } if (!buildInformation.BuildProperties.Contains("-DCMAKE_STAGING_PREFIX ")) { commandParts.Add(StagingPrefixOption.Replace("%STAGING_PREFIX%", GenerateStagingPrefixForTarget())); } if (!buildInformation.BuildProperties.Contains("-DCMAKE_PREFIX_PATH ") && IsIncludePathAvailable(out string includePath)) { commandParts.Add(PrefixPathOption.Replace("%PREFIX_PATH%", includePath)); } if (!buildInformation.BuildProperties.Contains("-G ")) { commandParts.Add(GeneratorOption); if (buildInformation.SdkInformation.MakeFile != null && !buildInformation.BuildProperties.Contains("-DCMAKE_MAKE_PROGRAM ")) { commandParts.Add(MakeFileOption.Replace("%MAKE_EXE%", $"\"{buildInformation.SdkInformation.MakeFile.FullName.Replace("\\", "/")}\"")); } } if (!string.IsNullOrEmpty(buildInformation.BuildProperties)) { commandParts.Add(buildInformation.BuildProperties); } commandParts.Add($"\"{buildInformation.RootFileEntity.Directory.FullName.Replace("\\", "/")}\""); return(string.Join(" ", commandParts)); string GenerateStagingPrefixForTarget() { string basePath = buildInformation.RootFileEntity.Directory.FullName; return(buildInformation.Output != null ? OutputOptionFullPath() : Path.Combine(basePath, Constants.LibraryFolderName) .Replace(Path.DirectorySeparatorChar, '/')); } bool IsIncludePathAvailable(out string path) { path = null; if (!buildInformation.RootFileEntity.Directory.DirectoryExists("external")) { return(false); } Dictionary <Version, VirtualDirectory> versions = new Dictionary <Version, VirtualDirectory>(); VirtualDirectory externalDirectory = buildInformation.RootFileEntity.Directory.Directory("external"); foreach (VirtualDirectory directory in externalDirectory.Directories) { Match patternMatch = IncludeDirectoryPattern.Match(directory.Name); if (!patternMatch.Success || !Version.TryParse(patternMatch.Groups["version"].Value, out Version includeVersion) || target != patternMatch.Groups["name"].Value) { continue; } versions.Add(includeVersion, directory); } Version actualVersion = Version.Parse(buildInformation.Target.Version); Version bestMatch = versions.Keys.Where(v => v <= actualVersion) .OrderByDescending(v => v) .FirstOrDefault(); if (bestMatch != null) { VirtualDirectory directory = versions[bestMatch]; if (directory.DirectoryExists(buildInformation.BuildType)) { path = directory.Directory(buildInformation.BuildType).FullName; } else if (directory.DirectoryExists(Constants.ReleaseFolderName)) { path = directory.Directory(Constants.ReleaseFolderName).FullName; } else { path = directory.FullName; } } else { path = externalDirectory.FullName; } return(true); } } string OutputOptionFullPath() { return(fileSystem.GetDirectory(buildInformation.Output, buildInformation.RootFileEntity.Directory.FullName) .FullName.Replace(Path.DirectorySeparatorChar, '/')); } bool OutputOptionDiffersFromStagingPrefix() { return(buildInformation.Output != null && !buildInformation.BuildEntity.BuildSystem.InstallationPaths.Any(p => p.StartsWith(OutputOptionFullPath(), StringComparison.Ordinal))); } bool IsCorrectlyConfigured() { try { return(buildInformation.BuildEntity.HasBuildSystem && buildInformation.BuildEntity.BuildSystem != null); } catch (Exception e) { if (!IsTimeout(e)) { executionContext.WriteVerbose($"The project is not correctly configured:{Environment.NewLine}{e}"); return(false); } } return(true); //this is a timeout so we dont know if it is correctly configured bool IsTimeout(Exception exception) { return(exception is TimeoutException || exception is AggregateException aggregate && aggregate.InnerExceptions.Any(e => e is TimeoutException)); } } } }