Beispiel #1
0
        AddSetting(
            string name,
            Bam.Core.TokenizedStringArray value,
            string condition     = null,
            bool inheritExisting = false)
        {
            lock (this.Settings)
            {
                if (0 == value.Count)
                {
                    return;
                }
                var linearized = value.ToString(';');
                if (this.Settings.Any(item => item.Name == name && item.Condition == condition))
                {
                    var settingOption = this.Settings.Where(item => item.Name == name && item.Condition == condition).First();
                    if (settingOption.Value.Contains(linearized))
                    {
                        return;
                    }
                    throw new Bam.Core.Exception("Cannot append {3}, to the option {0} as it already exists for condition {1}: {2}",
                                                 name,
                                                 condition,
                                                 settingOption.Value.ToString(),
                                                 linearized);
                }

                this.Settings.AddUnique(new VSSetting(name, inheritExisting ? System.String.Format("{0};%({1})", linearized, name) : linearized, condition));
            }
        }
Beispiel #2
0
        IExternalSourceGeneratorPolicy.GenerateSource(
            ExternalSourceGenerator sender,
            Bam.Core.ExecutionContext context,
            Bam.Core.TokenizedString executable,
            Bam.Core.TokenizedStringArray arguments,
            Bam.Core.TokenizedString output_directory,
            System.Collections.Generic.IReadOnlyDictionary <string, Bam.Core.TokenizedString> expected_output_files,
            System.Collections.Generic.IReadOnlyDictionary <string, Bam.Core.TokenizedString> input_files
            )
        {
            Bam.Core.IOWrapper.CreateDirectoryIfNotExists(output_directory.ToString());
            var program         = executable.ToStringQuoteIfNecessary();
            var linearised_args = arguments.ToString(' ');

            Bam.Core.Log.Info("Running: {0} {1}", program, linearised_args);
            Bam.Core.OSUtilities.RunExecutable(program, linearised_args);
            foreach (var expected_file in expected_output_files)
            {
                if (!System.IO.File.Exists(expected_file.Value.ToString()))
                {
                    throw new Bam.Core.Exception(
                              "Expected '{0}' to exist (key={1}), but it does not",
                              expected_file.Value.ToString(),
                              expected_file.Key
                              );
                }
            }
        }
        IExternalSourceGeneratorPolicy.GenerateSource(
            ExternalSourceGenerator sender,
            Bam.Core.ExecutionContext context,
            Bam.Core.TokenizedString executable,
            Bam.Core.TokenizedStringArray arguments,
            Bam.Core.TokenizedString output_directory,
            System.Collections.Generic.IReadOnlyDictionary <string, Bam.Core.TokenizedString> expected_output_files,
            System.Collections.Generic.IReadOnlyDictionary <string, Bam.Core.TokenizedString> input_files
            )
        {
            var encapsulating = sender.GetEncapsulatingReferencedModule();

            var workspace = Bam.Core.Graph.Instance.MetaData as XcodeBuilder.WorkspaceMeta;
            var target    = workspace.EnsureTargetExists(encapsulating);

            if (encapsulating == sender)
            {
                target.SetType(XcodeBuilder.Target.EProductType.Utility);
            }
            var configuration = target.GetConfiguration(encapsulating);

            if (encapsulating == sender)
            {
                configuration.SetProductName(Bam.Core.TokenizedString.CreateVerbatim("${TARGET_NAME}"));
            }

            var commands = new Bam.Core.StringArray();

            commands.Add(
                System.String.Format(
                    "[[ ! -d {0} ]] && mkdir -p {0}",
                    Bam.Core.IOWrapper.EscapeSpacesInPath(output_directory.ToString())
                    )
                );

            var condition_text = new System.Text.StringBuilder();

            condition_text.Append("if [[ ");
            var last_output = expected_output_files.Values.Last();

            foreach (var output in expected_output_files.Values)
            {
                var output_path = Bam.Core.IOWrapper.EscapeSpacesInPath(output.ToString());
                condition_text.AppendFormat("! -e {0} ", output_path);
                foreach (var input in input_files.Values)
                {
                    var input_path = Bam.Core.IOWrapper.EscapeSpacesInPath(input.ToString());
                    condition_text.AppendFormat("|| {1} -nt {0} ", output_path, input_path);
                }
                if (output != last_output)
                {
                    condition_text.AppendFormat("|| ");
                }
            }
            condition_text.AppendLine("]]");
            condition_text.AppendLine("then");

            var cmd_line = System.String.Format("{0} {1}", executable.ToStringQuoteIfNecessary(), arguments.ToString(' '));

            condition_text.AppendLine(System.String.Format("\techo {0}", cmd_line));
            condition_text.AppendLine(System.String.Format("\t{0}", cmd_line));
            condition_text.AppendLine("fi");
            commands.Add(condition_text.ToString());

            target.AddPreBuildCommands(commands, configuration);
        }
        IExternalSourceGeneratorPolicy.GenerateSource(
            ExternalSourceGenerator sender,
            Bam.Core.ExecutionContext context,
            Bam.Core.TokenizedString executable,
            Bam.Core.TokenizedStringArray arguments,
            Bam.Core.TokenizedString output_directory,
            System.Collections.Generic.IReadOnlyDictionary <string, Bam.Core.TokenizedString> expected_output_files,
            System.Collections.Generic.IReadOnlyDictionary <string, Bam.Core.TokenizedString> input_files
            )
        {
            var encapsulating = sender.GetEncapsulatingReferencedModule();

            var solution = Bam.Core.Graph.Instance.MetaData as VSSolutionBuilder.VSSolution;
            var project  = solution.EnsureProjectExists(encapsulating);
            var config   = project.GetConfiguration(encapsulating);

            var args = new Bam.Core.StringArray();

            args.Add(System.String.Format("{0} {1}", executable.ToStringQuoteIfNecessary(), arguments.ToString(' ')));

            foreach (var input in input_files.Values)
            {
                config.AddOtherFile(input);
                var customBuild = config.GetSettingsGroup(
                    VSSolutionBuilder.VSSettingsGroup.ESettingsGroup.CustomBuild,
                    include: input,
                    uniqueToProject: true
                    );
                customBuild.AddSetting("Command", args.ToString(' '), condition: config.ConditionText);
                customBuild.AddSetting("Message", System.String.Format("Generating outputs from {0}", input.ToString()), condition: config.ConditionText);
                customBuild.AddSetting("Outputs", expected_output_files.Values, condition: config.ConditionText);
                customBuild.AddSetting("AdditionalInputs", input_files.Values, condition: config.ConditionText);
            }
        }
        IExternalSourceGeneratorPolicy.GenerateSource(
            ExternalSourceGenerator sender,
            Bam.Core.ExecutionContext context,
            Bam.Core.TokenizedString executable,
            Bam.Core.TokenizedStringArray arguments,
            Bam.Core.TokenizedString output_directory,
            System.Collections.Generic.IReadOnlyDictionary <string, Bam.Core.TokenizedString> expected_output_files,
            System.Collections.Generic.IReadOnlyDictionary <string, Bam.Core.TokenizedString> input_files
            )
        {
            var meta = new MakeFileBuilder.MakeFileMeta(sender);
            var rule = meta.AddRule();

            rule.AddTarget(expected_output_files.Values.First());
            foreach (var input in input_files.Values)
            {
                rule.AddPrerequisite(input);
            }

            rule.AddShellCommand(
                System.String.Format("{0} {1}", executable.ToStringQuoteIfNecessary(), arguments.ToString(' '))
                );

            meta.CommonMetaData.AddDirectory(output_directory.ToString());
        }