diff options
Diffstat (limited to 'main/src/addins/CBinding/Project/CProject.cs')
-rw-r--r-- | main/src/addins/CBinding/Project/CProject.cs | 553 |
1 files changed, 0 insertions, 553 deletions
diff --git a/main/src/addins/CBinding/Project/CProject.cs b/main/src/addins/CBinding/Project/CProject.cs deleted file mode 100644 index 231830b4f0..0000000000 --- a/main/src/addins/CBinding/Project/CProject.cs +++ /dev/null @@ -1,553 +0,0 @@ -// -// CProject.cs: C/C++ Project -// -// Authors: -// Marcos David Marin Amador <MarcosMarin@gmail.com> -// -// Copyright (C) 2007 Marcos David Marin Amador -// -// -// This source code is licenced under The MIT License: -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - -using System; -using System.IO; -using System.Xml; -using System.Collections.Generic; -using System.ComponentModel; - -using Mono.Addins; - -using MonoDevelop.Core; -using MonoDevelop.Core.Execution; -using MonoDevelop.Core.ProgressMonitoring; -using MonoDevelop.Projects; -using MonoDevelop.Core.Serialization; -using MonoDevelop.Deployment; -using MonoDevelop.Deployment.Linux; -using CBinding.Parser; -using MonoDevelop.Ide; - -namespace CBinding -{ - public enum Language { - C, - CPP, - OBJC, - OBJCPP - } - - public enum CProjectCommands { - AddPackage, - UpdateClassPad, - ShowPackageDetails, - GotoDeclaration, - } - - [DataInclude(typeof(CProjectConfiguration))] - public class CProject : Project, IDeployable - { - [ItemProperty ("Compiler", ValueType = typeof(CCompiler))] - private ICompiler compiler_manager; - - [ItemProperty ("Language")] - private Language language; - - [ItemProperty("Target")] - CBinding.CompileTarget target = CBinding.CompileTarget.Bin; - - private ProjectPackageCollection packages = new ProjectPackageCollection (); - - public event ProjectPackageEventHandler PackageAddedToProject; - public event ProjectPackageEventHandler PackageRemovedFromProject; - - /// <summary> - /// Extensions for C/C++ source files - /// </summary> - public static string[] SourceExtensions = { ".C", ".CC", ".CPP", ".CXX", ".M", ".MM" }; - - /// <summary> - /// Extensions for C/C++ header files - /// </summary> - public static string[] HeaderExtensions = { ".H", ".HH", ".HPP", ".HXX" }; - - private void Init () - { - packages.Project = this; - - if (IdeApp.IsInitialized) - IdeApp.Workspace.ItemAddedToSolution += OnEntryAddedToCombine; - } - - public CProject () - { - Init (); - } - - public CProject (ProjectCreateInformation info, - XmlElement projectOptions, string language) - { - Init (); - string binPath = "."; - - if (info != null) { - Name = info.ProjectName; - binPath = info.BinPath; - } - - switch (language) - { - case "C": - this.language = Language.C; - break; - case "CPP": - this.language = Language.CPP; - break; - case "Objective C": - this.language = Language.OBJC; - break; - case "Objective C++": - this.language = Language.OBJCPP; - break; - } - - Compiler = null; // use default compiler depending on language - - CProjectConfiguration configuration = - (CProjectConfiguration)CreateConfiguration ("Debug"); - - configuration.DefineSymbols = "DEBUG MONODEVELOP"; - configuration.DebugMode = true; - - Configurations.Add (configuration); - - configuration = - (CProjectConfiguration)CreateConfiguration ("Release"); - - configuration.DebugMode = false; - configuration.OptimizationLevel = 3; - configuration.DefineSymbols = "MONODEVELOP"; - Configurations.Add (configuration); - - foreach (CProjectConfiguration c in Configurations) { - c.OutputDirectory = Path.Combine (binPath, c.Id); - c.SourceDirectory = info.ProjectBasePath; - c.Output = Name; - - if (projectOptions != null) { - if (projectOptions.Attributes["Target"] != null) { - c.CompileTarget = (CBinding.CompileTarget)Enum.Parse ( - typeof(CBinding.CompileTarget), - projectOptions.Attributes["Target"].InnerText); - } - if (projectOptions.GetAttribute ("ExternalConsole") == "True") { - c.ExternalConsole = true; - c.PauseConsoleOutput = true; - } - if (projectOptions.Attributes["PauseConsoleOutput"] != null) { - c.PauseConsoleOutput = bool.Parse ( - projectOptions.Attributes["PauseConsoleOutput"].InnerText); - } - if (projectOptions.Attributes["CompilerArgs"].InnerText != null) { - c.ExtraCompilerArguments = projectOptions.Attributes["CompilerArgs"].InnerText; - } - if (projectOptions.Attributes["LinkerArgs"].InnerText != null) { - c.ExtraLinkerArguments = projectOptions.Attributes["LinkerArgs"].InnerText; - } - } - } - } - - public override IEnumerable<string> GetProjectTypes () - { - yield return "Native"; - } - - public override string[] SupportedLanguages { - get { return new string[] { "C", "CPP", "Objective C", "Objective C++" }; } - } - - public CompileTarget CompileTarget { - get { return target; } - set { target = value; } - } - - public override bool IsCompileable (string fileName) - { - string ext = Path.GetExtension (fileName.ToUpper ()); - - if (language == Language.C) { - return (ext == ".C"); - } else { - return (0 <= Array.IndexOf (SourceExtensions, ext)); - } - } - - public override IEnumerable<SolutionItem> GetReferencedItems (ConfigurationSelector configuration) - { - foreach (var p in base.GetReferencedItems (configuration)) - yield return p; - - if (ParentSolution == null) - yield break; - - foreach (Package p in Packages) { - if (p.IsProject && p.Name != Name) { - var cp = ParentSolution.FindProjectByName (p.Name) as CProject; - if (cp != null) - yield return cp; - } - } - } - - public static bool IsHeaderFile (string filename) - { - return (0 <= Array.IndexOf (HeaderExtensions, Path.GetExtension (filename.ToUpper ()))); - } - - /// <summary> - /// Ths pkg-config package is for internal MonoDevelop use only, it is not deployed. - /// </summary> - public void WriteMDPkgPackage (ConfigurationSelector configuration) - { - string pkgfile = Path.Combine (BaseDirectory, Name + ".md.pc"); - - CProjectConfiguration config = (CProjectConfiguration)GetConfiguration (configuration); - - List<string> headerDirectories = new List<string> (); - - foreach (ProjectFile f in Files) { - if (IsHeaderFile (f.Name)) { - string dir = Path.GetDirectoryName (f.FilePath); - - if (!headerDirectories.Contains (dir)) { - headerDirectories.Add (dir); - } - } - } - - using (StreamWriter writer = new StreamWriter (pkgfile)) { - writer.WriteLine ("Name: {0}", Name); - writer.WriteLine ("Description: {0}", Description); - writer.WriteLine ("Version: {0}", Version); - writer.WriteLine ("Libs: -L\"{0}\" -l{1}", config.OutputDirectory, config.Output.StartsWith ("lib", StringComparison.OrdinalIgnoreCase)? - config.Output.Substring (3): - config.Output); -// writer.WriteLine ("Cflags: -I{0}", BaseDirectory); - writer.WriteLine ("Cflags: -I\"{0}\"", string.Join ("\" -I\"", headerDirectories.ToArray ())); - } - - // If this project compiles into a shared object we need to - // export the output path to the LD_LIBRARY_PATH - string literal = "LD_LIBRARY_PATH"; - string ld_library_path = Environment.GetEnvironmentVariable (literal); - - if (string.IsNullOrEmpty (ld_library_path)) { - Environment.SetEnvironmentVariable (literal, config.OutputDirectory); - } else if (!ld_library_path.Contains (config.OutputDirectory)) { - ld_library_path = string.Format ("{0}:{1}", config.OutputDirectory, ld_library_path); - Environment.SetEnvironmentVariable (literal, ld_library_path); - } - } - - /// <summary> - /// This is the pkg-config package that gets deployed. - /// <returns>The pkg-config package's filename</returns> - /// </summary> - private string WriteDeployablePgkPackage (Project project, CProjectConfiguration config) - { - // FIXME: This should probably be grabed from somewhere. - string prefix = "/usr/local"; - string pkgfile = Path.Combine (BaseDirectory, Name + ".pc"); - - using (StreamWriter writer = new StreamWriter (pkgfile)) { - writer.WriteLine ("prefix={0}", prefix); - writer.WriteLine ("exec_prefix=${prefix}"); - writer.WriteLine ("libdir=${exec_prefix}/lib"); - writer.WriteLine ("includedir=${prefix}/include"); - writer.WriteLine (); - writer.WriteLine ("Name: {0}", Name); - writer.WriteLine ("Description: {0}", Description); - writer.WriteLine ("Version: {0}", Version); - writer.WriteLine ("Requires: {0}", string.Join (" ", Packages.ToStringArray ())); - // TODO: How should I get this? - writer.WriteLine ("Conflicts: {0}", string.Empty); - writer.Write ("Libs: -L${libdir} "); - writer.WriteLine ("-l{0}", config.Output.StartsWith ("lib", StringComparison.OrdinalIgnoreCase)? - config.Output.Substring (3): - config.Output); - writer.Write ("Cflags: -I${includedir}/"); - writer.WriteLine ("{0} {1}", Name, Compiler.GetDefineFlags (project, config)); - } - - return pkgfile; - } - - protected override BuildResult DoBuild (IProgressMonitor monitor, ConfigurationSelector configuration) - { - CProjectConfiguration pc = (CProjectConfiguration) GetConfiguration (configuration); - pc.SourceDirectory = BaseDirectory; - - return compiler_manager.Compile (this, - Files, packages, - pc, - monitor); - } - - protected virtual ExecutionCommand CreateExecutionCommand (CProjectConfiguration conf) - { - string app = Path.Combine (conf.OutputDirectory, conf.Output); - NativeExecutionCommand cmd = new NativeExecutionCommand (app); - cmd.Arguments = conf.CommandLineParameters; - cmd.WorkingDirectory = Path.GetFullPath (conf.OutputDirectory); - cmd.EnvironmentVariables = conf.EnvironmentVariables; - return cmd; - } - - protected override bool OnGetCanExecute (ExecutionContext context, ConfigurationSelector solutionConfiguration) - { - CProjectConfiguration conf = (CProjectConfiguration) GetConfiguration (solutionConfiguration); - ExecutionCommand cmd = CreateExecutionCommand (conf); - return (target == CBinding.CompileTarget.Bin) && context.ExecutionHandler.CanExecute (cmd); - } - - protected override void DoExecute (IProgressMonitor monitor, ExecutionContext context, ConfigurationSelector configuration) - { - CProjectConfiguration conf = (CProjectConfiguration) GetConfiguration (configuration); - bool pause = conf.PauseConsoleOutput; - IConsole console; - - if (conf.CompileTarget != CBinding.CompileTarget.Bin) { - MessageService.ShowMessage ("Compile target is not an executable!"); - return; - } - - monitor.Log.WriteLine ("Running project..."); - - if (conf.ExternalConsole) - console = context.ExternalConsoleFactory.CreateConsole (!pause); - else - console = context.ConsoleFactory.CreateConsole (!pause); - - AggregatedOperationMonitor operationMonitor = new AggregatedOperationMonitor (monitor); - - try { - ExecutionCommand cmd = CreateExecutionCommand (conf); - if (!context.ExecutionHandler.CanExecute (cmd)) { - monitor.ReportError ("Cannot execute \"" + conf.Output + "\". The selected execution mode is not supported for C projects.", null); - return; - } - - IProcessAsyncOperation op = context.ExecutionHandler.Execute (cmd, console); - - operationMonitor.AddOperation (op); - op.WaitForCompleted (); - - monitor.Log.WriteLine ("The operation exited with code: {0}", op.ExitCode); - } catch (Exception ex) { - LoggingService.LogError (string.Format ("Cannot execute \"{0}\"", conf.Output), ex); - monitor.ReportError ("Cannot execute \"" + conf.Output + "\"", ex); - } finally { - operationMonitor.Dispose (); - console.Dispose (); - } - } - - public override FilePath GetOutputFileName (ConfigurationSelector configuration) - { - CProjectConfiguration conf = (CProjectConfiguration) GetConfiguration (configuration); - return conf.OutputDirectory.Combine (conf.CompiledOutputName); - } - - public override SolutionItemConfiguration CreateConfiguration (string name) - { - CProjectConfiguration conf = new CProjectConfiguration (); - - conf.Name = name; - - return conf; - } - - public Language Language { - get { return language; } - set { language = value; } - } - - public ICompiler Compiler { - get { return compiler_manager; } - set { - if (value != null) { - compiler_manager = value; - } else { - object[] compilers = AddinManager.GetExtensionObjects ("/CBinding/Compilers"); - string compiler; - - // TODO: This should depend on platform (eg: windows would be mingw or msvc) - if (language == Language.C) - compiler = PropertyService.Get ("CBinding.DefaultCCompiler", new GccCompiler ().Name); - else - compiler = PropertyService.Get ("CBinding.DefaultCppCompiler", new GppCompiler ().Name); - - foreach (ICompiler c in compilers) { - if (compiler == c.Name) { - compiler_manager = c; - } - } - } - } - } - - [Browsable(false)] - [ItemProperty ("Packages")] - public ProjectPackageCollection Packages { - get { return packages; } - set { - packages = value; - packages.Project = this; - } - } - - protected override void OnFileAddedToProject (ProjectFileEventArgs args) - { - base.OnFileAddedToProject (args); - - foreach (ProjectFileEventInfo e in args) { - if (!Loading && !IsCompileable (e.ProjectFile.Name) && - e.ProjectFile.BuildAction == BuildAction.Compile) { - e.ProjectFile.BuildAction = BuildAction.None; - } - - if (e.ProjectFile.BuildAction == BuildAction.Compile) - TagDatabaseManager.Instance.UpdateFileTags (this, e.ProjectFile.Name); - } - } - - protected override void OnFileChangedInProject (ProjectFileEventArgs e) - { - base.OnFileChangedInProject (e); - - foreach (ProjectFileEventInfo fe in e) - TagDatabaseManager.Instance.UpdateFileTags (this, fe.ProjectFile.Name); - } - - protected override void OnFileRemovedFromProject (ProjectFileEventArgs e) - { - base.OnFileRemovedFromProject (e); - - foreach (ProjectFileEventInfo fe in e) - TagDatabaseManager.Instance.RemoveFileInfo (this, fe.ProjectFile.Name); - } - - - private static void OnEntryAddedToCombine (object sender, SolutionItemEventArgs e) - { - CProject p = e.SolutionItem as CProject; - - if (p == null) - return; - - foreach (ProjectFile f in p.Files) - TagDatabaseManager.Instance.UpdateFileTags (p, f.Name); - } - - internal void NotifyPackageRemovedFromProject (Package package) - { - PackageRemovedFromProject (this, new ProjectPackageEventArgs (this, package)); - } - - internal void NotifyPackageAddedToProject (Package package) - { - PackageAddedToProject (this, new ProjectPackageEventArgs (this, package)); - } - - public DeployFileCollection GetDeployFiles (ConfigurationSelector configuration) - { - DeployFileCollection deployFiles = new DeployFileCollection (); - - CProjectConfiguration conf = (CProjectConfiguration) GetConfiguration (configuration); - CompileTarget target = conf.CompileTarget; - - // Headers and resources - foreach (ProjectFile f in Files) { - if (f.BuildAction == BuildAction.Content) { - string targetDirectory = - (IsHeaderFile (f.Name) ? TargetDirectory.Include : TargetDirectory.ProgramFiles); - - deployFiles.Add (new DeployFile (this, f.FilePath, f.ProjectVirtualPath, targetDirectory)); - } - } - - // Output - string output = GetOutputFileName (configuration); - if (!string.IsNullOrEmpty (output)) { - string targetDirectory = string.Empty; - - switch (target) { - case CompileTarget.Bin: - targetDirectory = TargetDirectory.ProgramFiles; - break; - case CompileTarget.SharedLibrary: - targetDirectory = TargetDirectory.ProgramFiles; - break; - case CompileTarget.StaticLibrary: - targetDirectory = TargetDirectory.ProgramFiles; - break; - } - - deployFiles.Add (new DeployFile (this, output, Path.GetFileName (output), targetDirectory)); - } - - // PkgPackage - if (target != CompileTarget.Bin) { - string pkgfile = WriteDeployablePgkPackage (this, conf); - deployFiles.Add (new DeployFile (this, Path.Combine (BaseDirectory, pkgfile), pkgfile, LinuxTargetDirectory.PkgConfig)); - } - - return deployFiles; - } - - /// <summary> - /// Finds the corresponding source or header file - /// </summary> - /// <param name="sourceFile"> - /// The name of the file to be matched - /// <see cref="System.String"/> - /// </param> - /// <returns> - /// The corresponding file, or null if not found - /// <see cref="System.String"/> - /// </returns> - public string MatchingFile (string sourceFile) { - string filenameStub = Path.GetFileNameWithoutExtension (sourceFile); - bool wantHeader = !CProject.IsHeaderFile (sourceFile); - - foreach (ProjectFile file in this.Files) { - if (filenameStub == Path.GetFileNameWithoutExtension (file.Name) - && (wantHeader == IsHeaderFile (file.Name))) { - return file.Name; - } - } - - return null; - } - } -} |