예제 #1
0
        private void ParseConfigurations(XElement configs, ConfigurationHolder holder)
        {
            handleImport(configs, (XElement elem) => {
                ParseConfigurations(elem, holder);
            });

            XElement shared = configs.Element("shared");

            if (shared != null)
            {
                Configuration config = new Configuration(holder.GetName() + "_shared");
                config.IsShared = true;
                ParseConfiguration(shared, config, holder);

                holder.SetSharedConfiguration(config);
            }

            foreach (XElement configElem in configs.Elements("configuration"))
            {
                Configuration config = new Configuration((string)configElem.Attribute("name"));

                ParseConfiguration(configElem, config, holder);

                holder.AddConfiguration(config);
            }
        }
예제 #2
0
        private bool AddSourceToTarget(Source source, Target target, ref List <Source> targetSources)
        {
            if (source.Target != null)
            {
                Utils.WriteLine("Warning, source " + source.Path + " matches multiple targets. " + source.Target.Name + " and " + target.Name);
                return(false);
            }

            source.Target = target;

            if (source.Filter == null)
            {
                Utils.WriteLine("Error, source " + source.Path + " have no filter.");
                return(false);
            }

            targetSources.Add(source);

            m_writer.WriteStartElement(target.BuildElementName);
            m_writer.WriteAttributeString("Include", Utils.RelativePath(source.Path, m_project.Path));

            // Write custom build options
            if (target.BuildConfiguration != null)
            {
                foreach (Configuration config in m_project.Configurations)
                {
                    CustomBuildOptions configOptions;
                    if (target.BuildConfiguration.Configurations.TryGetValue(config.Name, out configOptions))
                    {
                        configOptions = configOptions.Merge(target.BuildConfiguration.Shared);
                    }
                    else
                    {
                        configOptions = target.BuildConfiguration.Shared;
                    }

                    if (configOptions != null)
                    {
                        WriteCustomBuildOption(config, "Command", configOptions.Command);
                        WriteCustomBuildOption(config, "Outputs", configOptions.Outputs);
                        WriteCustomBuildOption(config, "Message", configOptions.Message);
                        WriteCustomBuildOption(config, "AdditionalInputs", configOptions.Inputs);
                        WriteCustomBuildOption(config, "LinkObjects", configOptions.Link);
                        WriteCustomBuildOption(config, "TreatOutputAsContent", configOptions.IsContent);
                    }
                    else
                    {
                        Utils.WriteLine("Warning, build target " + target.Name + " specifies no build options for configuration " + config.Name);
                    }
                }
            }

            // Match specific build rules:
            string solutionRelPath = Utils.RelativePath(source.Path, m_project.Solution.Path);

            ConfigurationHolder mergedFileConfig = new ConfigurationHolder();

            // Add empty configurations for all project configurations
            foreach (Configuration config in m_project.Configurations)
            {
                mergedFileConfig.AddConfiguration(new Configuration(config.Name));
            }

            // First, match from the project
            foreach (ConfigurationRule rule in m_project.ConfigurationRules)
            {
                if (rule.Pattern.IsMatch(solutionRelPath))
                {
                    mergedFileConfig.Merge(rule);
                }
            }

            // Then solution
            foreach (ConfigurationRule rule in m_project.Solution.ConfigurationRules)
            {
                if (rule.Pattern.IsMatch(solutionRelPath))
                {
                    mergedFileConfig.Merge(rule);
                }
            }

            foreach (Configuration config in mergedFileConfig.Configurations)
            {
                if (config.ExcludedFromBuild)
                {
                    m_writer.WriteStartElement("ExcludedFromBuild");
                    WriteConfigurationCondition(config);
                    m_writer.WriteValue(true);
                    m_writer.WriteEndElement();
                }
                foreach (KeyValuePair <ClCompileOption, object> val in config.ClCompileOptions)
                {
                    m_writer.WriteStartElement(val.Key.ToString());
                    WriteConfigurationCondition(config);
                    m_writer.WriteValue(config.ValueToString(val.Key, val.Value));
                    m_writer.WriteEndElement();
                }
            }

            m_writer.WriteEndElement();
            return(true);
        }