public Makefile Deploy(AutotoolsContext ctx, SolutionItem entry, IProgressMonitor monitor) { generateAutotools = ctx.MakefileType == MakefileType.AutotoolsMakefile; monitor.BeginTask(GettextCatalog.GetString( "Creating {0} for Solution {1}", generateAutotools ? "Makefile.am" : "Makefile", entry.Name), 1); Makefile solutionMakefile = new Makefile(); StringBuilder solutionTop = new StringBuilder(); try { SolutionFolder solutionFolder = (SolutionFolder)entry; string targetDirectory = solutionFolder.BaseDirectory; StringBuilder subdirs = new StringBuilder(); subdirs.Append("#Warning: This is an automatically generated file, do not edit!\n"); if (!generateAutotools) { solutionTop.AppendFormat("top_srcdir={0}\n", FileService.AbsoluteToRelativePath( entry.BaseDirectory, ctx.TargetSolution.BaseDirectory)); solutionTop.Append("include $(top_srcdir)/config.make\n"); solutionTop.Append("include $(top_srcdir)/Makefile.include\n"); solutionTop.Append("include $(top_srcdir)/rules.make\n\n"); solutionTop.Append("#include $(top_srcdir)/custom-hooks.make\n\n"); } ArrayList children = new ArrayList(); foreach (SolutionConfiguration config in solutionFolder.ParentSolution.Configurations) { if (!ctx.IsSupportedConfiguration(config.Id)) { continue; } if (generateAutotools) { subdirs.AppendFormat("if {0}\n", "ENABLE_" + ctx.EscapeAndUpperConfigName(config.Id)); } else { subdirs.AppendFormat("ifeq ($(CONFIG),{0})\n", ctx.EscapeAndUpperConfigName(config.Id)); } subdirs.Append(" SUBDIRS = "); foreach (SolutionItem ce in CalculateSubDirOrder(ctx, solutionFolder, config)) { string baseDirectory; if (!(ce is SolutionEntityItem) && !(ce is SolutionFolder)) { continue; } // Ignore projects which can't be deployed IMakefileHandler handler = AutotoolsContext.GetMakefileHandler(ce, ctx.MakefileType); if (handler == null) { continue; } baseDirectory = ce.BaseDirectory; if (solutionFolder.BaseDirectory == baseDirectory) { subdirs.Append(" . "); } else { if (!baseDirectory.StartsWith(solutionFolder.BaseDirectory)) { throw new Exception(GettextCatalog.GetString( "Child projects must be in sub-directories of their parent")); } // add the subdirectory to the list string path = FileService.AbsoluteToRelativePath(targetDirectory, baseDirectory); if (path.StartsWith("." + Path.DirectorySeparatorChar)) { path = path.Substring(2); } AutotoolsContext.CheckSpaces(path); subdirs.Append(" "); subdirs.Append(AutotoolsContext.EscapeStringForAutomake(path)); } if (!children.Contains(ce)) { children.Add(ce); } } subdirs.Append("\nendif\n"); } solutionTop.Append(subdirs.ToString()); string includedProject = null; // deploy recursively foreach (SolutionItem ce in children) { IMakefileHandler handler = AutotoolsContext.GetMakefileHandler(ce, ctx.MakefileType); Makefile makefile; string outpath; if (handler != null && handler.CanDeploy(ce, ctx.MakefileType)) { ctx.RegisterBuiltProject(ce); makefile = handler.Deploy(ctx, ce, monitor); if (targetDirectory == ce.BaseDirectory) { if (includedProject != null) { throw new Exception(GettextCatalog.GetString( "More than 1 project in the same directory as the top-level solution is not supported.")); } // project is in the solution directory string projectMakefileName = ce.Name + ".make"; includedProject = String.Format("include {0}", projectMakefileName); outpath = Path.Combine(targetDirectory, projectMakefileName); ctx.AddGeneratedFile(outpath); if (!generateAutotools) { solutionMakefile.SetVariable("EXTRA_DIST", projectMakefileName); } } else { makefile.AppendToVariable("EXTRA_DIST", generateAutotools ? String.Empty : "Makefile"); outpath = Path.Combine(ce.BaseDirectory, "Makefile"); if (generateAutotools) { ctx.AddAutoconfFile(outpath); outpath = outpath + ".am"; } else { makefile.Append("install: install-local\nuninstall: uninstall-local\nclean: clean-local\n"); if (ce is SolutionFolder) { //non TargetCombine makefile.Append("dist-local: dist-local-recursive\n"); } else { makefile.Append("include $(top_srcdir)/rules.make\n"); } } ctx.AddGeneratedFile(outpath); } StreamWriter writer = new StreamWriter(outpath); makefile.Write(writer); writer.Close(); } else { monitor.Log.WriteLine("Project '{0}' skipped.", ce.Name); } } if (includedProject != null) { solutionTop.Append(GettextCatalog.GetString("\n# Include project specific makefile\n")); solutionTop.Append(includedProject); } if (generateAutotools) { solutionMakefile.Append(solutionTop.ToString()); } else { TemplateEngine templateEngine = new TemplateEngine(); templateEngine.Variables ["MAKEFILE_SOLUTION_TOP"] = solutionTop.ToString(); Stream stream = ctx.GetTemplateStream("Makefile.solution.template"); StreamReader reader = new StreamReader(stream); StringWriter sw = new StringWriter(); templateEngine.Process(reader, sw); reader.Close(); solutionMakefile.Append(sw.ToString()); if (solutionFolder.IsRoot) { // Emit dist and distcheck targets only for TargetCombine reader = new StreamReader(Path.Combine(ctx.TemplateDir, "make-dist.targets")); solutionMakefile.Append(reader.ReadToEnd()); reader.Close(); } } monitor.Step(1); } finally { monitor.EndTask(); } return(solutionMakefile); }
void CreateConfigureDotAC(Solution solution, string defaultConf, IProgressMonitor monitor, AutotoolsContext context) { monitor.Log.WriteLine(GettextCatalog.GetString("Creating configure.ac")); TemplateEngine templateEngine = new TemplateEngine(); templateEngine.Variables["WARNING"] = "Warning: This is an automatically generated file, do not edit!"; // add solution configuration options StringBuilder config_options = new StringBuilder(); foreach (SolutionConfiguration config in solution.Configurations) { string name = context.EscapeAndUpperConfigName(config.Id).ToLower(); string def = config.Id == defaultConf ? "YES" : "NO"; string ac_var = "enable_" + name; // test to see if a configuration was enabled config_options.AppendFormat("AC_ARG_ENABLE({0},\n", name); config_options.AppendFormat(" AC_HELP_STRING([--enable-{0}],\n", name); config_options.AppendFormat(" [Use '{0}' Configuration [default={1}]]),\n", context.EscapeAndUpperConfigName(config.Id), def); config_options.AppendFormat(" {0}=yes, {0}=no)\n", ac_var); config_options.AppendFormat("AM_CONDITIONAL({0}, test x${1} = xyes)\n", ac_var.ToUpper(), ac_var); // if yes, populate some vars config_options.AppendFormat("if test \"x${0}\" = \"xyes\" ; then\n", ac_var); // AppendConfigVariables ( combine, config.Name, config_options ); config_options.Append(" CONFIG_REQUESTED=\"yes\"\nfi\n"); } // if no configuration was specified, set to default (if there is a default) if (defaultConf != null) { config_options.Append("if test -z \"$CONFIG_REQUESTED\" ; then\n"); // AppendConfigVariables ( combine, defaultConf, config_options ); config_options.AppendFormat(" AM_CONDITIONAL(ENABLE_{0}, true)\n", context.EscapeAndUpperConfigName(defaultConf)); config_options.AppendFormat("\tenable_{0}=yes\n", context.EscapeAndUpperConfigName(defaultConf).ToLower()); config_options.Append("fi\n"); } // Add specific user switch if (switchs != null) { foreach (Switch s in switchs) { string name = s.SwitchName.ToLowerInvariant(); config_options.AppendLine(string.Format(@"AC_ARG_ENABLE({0}, AC_HELP_STRING([--enable-{0}], [{1}]), enable_{2}=yes, enable_{2}=no) AM_CONDITIONAL(ENABLE_{3}, test x$enable_{2} = xyes)", name, s.HelpStr, name.Replace('-', '_'), name.Replace('-', '_').ToUpperInvariant())); } } templateEngine.Variables ["CONFIG_OPTIONS"] = config_options.ToString(); // build compiler checks StringBuilder compiler_checks = new StringBuilder(); foreach (string compiler in context.GetCommandChecks()) { compiler_checks.AppendFormat("AC_PATH_PROG({0}, {1}, no)\n", compiler.ToUpper(), compiler); compiler_checks.AppendFormat("if test \"x${0}\" = \"xno\"; then\n", compiler.ToUpper()); compiler_checks.AppendFormat(" AC_MSG_ERROR([{0} Not found])\n", compiler); compiler_checks.Append("fi\n"); } templateEngine.Variables["COMPILER_CHECKS"] = compiler_checks.ToString(); // build list of *.in files StringBuilder configFiles = new StringBuilder(); string tmpmf = null; foreach (string makefile in context.GetAutoConfFiles()) { tmpmf = FileService.AbsoluteToRelativePath(solution_dir, makefile); if (PlatformID.Unix != Environment.OSVersion.Platform) { tmpmf = tmpmf.Replace("\\", "/"); } AutotoolsContext.CheckSpaces(tmpmf); configFiles.Append(FileService.NormalizeRelativePath(tmpmf)); configFiles.Append("\n"); } templateEngine.Variables["CONFIG_FILES"] = configFiles.ToString(); // build list of pkgconfig checks we must make StringWriter packageChecks = new StringWriter(); packageChecks.WriteLine("dnl package checks, common for all configs"); Set <SystemPackage> commonPackages = context.GetCommonRequiredPackages(); foreach (SystemPackage pkg in commonPackages) { packageChecks.WriteLine("PKG_CHECK_MODULES([{0}], [{1}])", AutotoolsContext.GetPkgConfigVariable(pkg.Name), pkg.Name); } packageChecks.WriteLine("\ndnl package checks, per config"); foreach (SolutionConfiguration config in solution.Configurations) { Set <SystemPackage> pkgs = context.GetRequiredPackages(config.Id, true); if (pkgs == null || pkgs.Count == 0) { continue; } packageChecks.WriteLine(@"if test ""x$enable_{0}"" = ""xyes""; then", context.EscapeAndUpperConfigName(config.Id).ToLower()); foreach (SystemPackage pkg in pkgs) { packageChecks.WriteLine("\tPKG_CHECK_MODULES([{0}], [{1}])", AutotoolsContext.GetPkgConfigVariable(pkg.Name), pkg.Name); } packageChecks.WriteLine("fi"); } templateEngine.Variables["PACKAGE_CHECKS"] = packageChecks.ToString(); templateEngine.Variables["SOLUTION_NAME"] = solution_name; templateEngine.Variables["VERSION"] = solution_version; string configureFileName = Path.Combine(solution_dir, "configure.ac"); StreamWriter writer = new StreamWriter(configureFileName); Stream stream = context.GetTemplateStream("configure.ac.template"); StreamReader reader = new StreamReader(stream); templateEngine.Process(reader, writer); reader.Close(); writer.Close(); context.AddGeneratedFile(configureFileName); }