using System;
using System.IO;
using System.Text;
using MonoDevelop.Core;
using MonoDevelop.Autotools;
using MonoDevelop.Projects;
using MonoDevelop.Deployment;
namespace MonoDevelop.ValaBinding
{
///
/// Handler for makefile generation
///
public class MakefileHandler: IMakefileHandler
{
#region IMakefileHandler implementation
public bool CanDeploy (MonoDevelop.Projects.SolutionItem entry, MakefileType type)
{
return entry is ValaProject;
}
///
/// Deploys a makefile to build the default configuration.
///
///
/// TODO: Make configuration-based targets as advertised.
///
public Makefile Deploy (AutotoolsContext ctx, MonoDevelop.Projects.SolutionItem entry, MonoDevelop.Core.IProgressMonitor monitor)
{
Makefile mkfile = new Makefile ();
ValaProject project = (ValaProject) entry;
ValaProjectConfiguration conf = (ValaProjectConfiguration)project.DefaultConfiguration;
StringBuilder files = new StringBuilder ();
foreach (ProjectFile t in project.Files) {
if(BuildAction.Compile == t.BuildAction) {
files.Append ("\\\n\t" + FileService.AbsoluteToRelativePath(project.BaseDirectory, t.FilePath));
}
}
string dir = ctx.DeployContext.GetResolvedPath (TargetDirectory.ProgramFiles, FileService.AbsoluteToRelativePath(conf.OutputDirectory, ctx.TargetSolution.BaseDirectory));
dir = dir.Replace ("@prefix@", "$(prefix)");
dir = dir.Replace ("@PACKAGE@", "$(PACKAGE)");
TemplateEngine templateEngine = new TemplateEngine ();
templateEngine.Variables ["TOP_SRCDIR"] = FileService.AbsoluteToRelativePath (project.BaseDirectory, ctx.TargetSolution.BaseDirectory);
templateEngine.Variables ["FILES"] = files.ToString ();
templateEngine.Variables ["BUILD_DIR"] = ".";
templateEngine.Variables ["INSTALL_DIR"] = "$(DESTDIR)" + dir;
templateEngine.Variables ["ALL_TARGET"] = string.Format("all-{0}", conf.Name);
templateEngine.Variables ["VFLAGS"] = string.Format("{0} {1}", ValaCompiler.GetCompilerFlags(conf), ValaCompiler.GeneratePkgCompilerArgs(project.Packages));
templateEngine.Variables ["VTARGET"] = conf.CompiledOutputName;
StringWriter sw = new StringWriter ();
string mt;
if (ctx.MakefileType == MakefileType.AutotoolsMakefile)
mt = "Makefile.am.template";
else
mt = "Makefile.template";
using (Stream stream = GetType().Assembly.GetManifestResourceStream (mt)) {
StreamReader reader = new StreamReader (stream);
templateEngine.Process (reader, sw);
reader.Close ();
}
mkfile.Append (sw.ToString ());
return mkfile;
}
#endregion
}
}