private void AddBuildToolProperties(BuildTool buildTool, Project proj)
        {
            ProjectPropertyGroupElement group = proj.Xml.AddPropertyGroup();

            if (!string.IsNullOrEmpty(buildTool.BuildToolWrapper))
            {
                group.AddProperty(ToolWrapperTag, buildTool.BuildToolWrapper);
            }

            group.AddProperty(CCompilerTag,   buildTool.ToolPath + buildTool.CCompiler.Exec);
            group.AddProperty(CppCompilerTag, buildTool.ToolPath + buildTool.CppCompiler.Exec);
            group.AddProperty(AsmCompilerTag, buildTool.ToolPath + buildTool.AsmCompiler.Exec);
            group.AddProperty(LinkerTag,      buildTool.ToolPath + buildTool.Linker.Exec);
            group.AddProperty(ArchiverTag,    buildTool.ToolPath + buildTool.Archiver.Exec);
            group.AddProperty(FromElfTag,     buildTool.ToolPath + buildTool.FromELF.Exec);

            foreach (MiscBuildTool tool in buildTool.MiscTools)
            {
                group.AddProperty(tool.Name, tool.ToolPath + tool.BuildTool.Exec);
            }
        }
        private void AddBuildTools(BuildTool buildTool, Project proj)
        {
            foreach (MiscBuildTool tool in buildTool.MiscTools)
            {
                AddBuildScript(tool.Name, tool.BuildTool.Conditional, ToEnvVar(ToolWrapperTag), tool.BuildToolOptions, proj, ToEnvVar(tool.Name + "_FLAGS"));
            }

            AddBuildScript(CCompilerTargetTag  , buildTool.CCompiler.Conditional  , ToEnvVar(ToolWrapperTag), buildTool.BuildOptions.CFlags       , proj, ToEnvVar(CommonToolFlagTag), ToEnvVar(CFlagTag)  , ToEnvVar(CCppCommonFlagTag));
            AddBuildScript(CppCompilerTargetTag, buildTool.CppCompiler.Conditional, ToEnvVar(ToolWrapperTag), buildTool.BuildOptions.CppFlags     , proj, ToEnvVar(CommonToolFlagTag), ToEnvVar(CppFlagTag), ToEnvVar(CCppCommonFlagTag));
            AddBuildScript(AsmCompilerTargetTag, buildTool.AsmCompiler.Conditional, ToEnvVar(ToolWrapperTag), buildTool.BuildOptions.AsmFlags, proj, ToEnvVar(CommonToolFlagTag), ToEnvVar(AsmFlagTag));
            AddBuildScript(LibTargetTag        , buildTool.Archiver.Conditional   , ToEnvVar(ToolWrapperTag), buildTool.BuildOptions.ArchiverFlags, proj, ToEnvVar(CommonToolFlagTag), ToEnvVar(ArchiverFlagTag));
            AddBuildScript(ExeTargetTag        , buildTool.Linker.Conditional     , ToEnvVar(ToolWrapperTag), buildTool.BuildOptions.LinkerFlags  , proj, ToEnvVar(CommonToolFlagTag), ToEnvVar(LinkerFlagTag));

        }
        internal void LoadTargetFile(BuildTool tool, string fileName)
        {
            Project proj;
            string fullpath = ExpandEnvVars(fileName, "");

            try
            {
                proj = LoadProject(fullpath);

                foreach (ProjectImportElement import in proj.Xml.Imports)
                {
                    if (string.IsNullOrEmpty(import.Condition))
                    {
                        LoadTargetFile(tool, ExpandVars(import.Project, Path.GetDirectoryName(fileName)));
                    }
                }

                Regex expISA = new Regex(@"'\$\(INSTRUCTION_SET\)'=='", RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);

                foreach (ProjectPropertyGroupElement pg in proj.Xml.PropertyGroups)
                {
                    if (expISA.IsMatch(pg.Condition))
                    {
                        ISA isa = LoadISASettings(pg);
                        if (isa != null)
                        {
                            tool.SupportedISAs.Add(isa);
                        }
                        continue;
                    }

                    tool.BuildOptions = LoadToolChainOptions(pg);

                    foreach (ProjectPropertyElement bp in pg.Properties)
                    {
                        string cond = CombineConditionals(pg.Condition, bp.Condition);

                        switch (bp.Name)
                        {
                            case "BuildToolName":
                                tool.Name = bp.Value;
                                break;
                            case "Documentation":
                                tool.Documentation = bp.Value;
                                break;
                            case "BuildToolGuid":
                                tool.Guid = bp.Value;
                                break;
                            case ObjExtFlag:
                                tool.ObjExt = bp.Value;
                                break;
                            case LibExtFlag:
                                tool.LibExt = bp.Value;
                                break;
                            case ExeExtFlag:
                                tool.BinExt = bp.Value;
                                break;

                            case CCompilerTag:
                                tool.CCompiler.Exec = RemoveWrapper(bp.Value);
                                break;
                            case CppCompilerTag:
                                tool.CppCompiler.Exec = RemoveWrapper(bp.Value);
                                break;
                            case AsmCompilerTag:
                                tool.AsmCompiler.Exec = RemoveWrapper(bp.Value);
                                break;
                            case ArchiverTag:
                                tool.Archiver.Exec = RemoveWrapper(bp.Value);
                                break;
                            case LinkerTag:
                                tool.Linker.Exec = RemoveWrapper(bp.Value);
                                break;
                            case FromElfTag:
                                tool.FromELF.Exec = RemoveWrapper(bp.Value);
                                break;
                            case ToolWrapperTag:
                            case AdsWrapperTag:
                            case AdiWrapperTag:
                            case ArcWrapperTag:
                                tool.BuildToolWrapper = RemoveWrapper(bp.Value);
                                break;
                            case PKUI_CpuNamesTag:
                                {
                                    List<string> pts = (List<string>)this.DeserializeXml(bp.Value, typeof(List<string>));
                                    tool.SupportedCpuNames.AddRange(pts);
                                }
                                break;
                            case "ProcessorTypes":
                            case CpuNamesTag:
                                {
                                    foreach (string sType in bp.Value.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries))
                                    {
                                        tool.SupportedCpuNames.Add(sType);
                                    }
                                }
                                break;
                            case PKUI_ISAsTag:
                                {
                                    List<ISA> isas = (List<ISA>)this.DeserializeXml(bp.Value, typeof(List<ISA>));
                                    tool.SupportedISAs.AddRange(isas);
                                }
                                break;
                            case ISAsTag:
                                {
                                    //legacy
                                    if (bp.Value.Contains(";"))
                                    {
                                        foreach (string sISA in bp.Value.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries))
                                        {
                                            ISA isa = new ISA();
                                            isa.Name = sISA;
                                            isa.Guid = System.Guid.NewGuid().ToString("B");

                                            tool.SupportedISAs.Add(isa);
                                        }
                                    }
                                }
                                break;

                            default:
                                {
                                    MFProperty prop = new MFProperty();
                                    prop.Name = bp.Name;
                                    prop.Value = bp.Value;
                                    prop.Condition = cond;

                                    tool.Properties.Add(prop);
                                }
                                break;
                        }
                    }
                }

                foreach (ProjectItemGroupElement big in proj.Xml.ItemGroups)
                {
                    foreach (ProjectItemElement bi in big.Items)
                    {
                        string cond = CombineConditionals(big.Condition, bi.Condition);

                        MFProperty prop = new MFProperty();
                        prop.Name = bi.ItemType;
                        prop.Value = bi.Include;
                        prop.Condition = cond;

                        tool.Items.Add(prop);
                    }
                }

                foreach (ProjectTargetElement targ in proj.Xml.Targets)
                {
                    switch (targ.Name)
                    {
                        case AdiAsmTargetTag:
                        case ArmAsmTargetTag:
                        case ArcAsmTargetTag:
                        case AsmCompilerTargetTag:
                            tool.AsmCompiler.Conditional = targ.Condition;
                            tool.AsmCompiler.Description = AsmCompilerTag;
                            LoadTargetTasks(targ, tool.BuildOptions.EnvironmentVariables, tool.AsmCompiler, tool.BuildOptions.AsmFlags, tool.BuildOptions.CommonFlags);
                            break;
                        case AdiCCompilerTargetTag:
                        case ArmCCompilerTargetTag:
                        case ArcCCompilerTargetTag:
                        case CCompilerTargetTag:
                            tool.CCompiler.Conditional = targ.Condition;
                            tool.CCompiler.Description = CCompilerTag;
                            LoadTargetTasks(targ, tool.BuildOptions.EnvironmentVariables, tool.CCompiler, tool.BuildOptions.CFlags, tool.BuildOptions.C_CppFlags, tool.BuildOptions.CommonFlags);
                            break;
                        case AdiCppCompilerTargetTag:
                        case ArmCppCompilerTargetTag:
                        case ArcCppCompilerTargetTag:
                        case CppCompilerTargetTag:
                            tool.CppCompiler.Conditional = targ.Condition;
                            tool.CppCompiler.Description = CppCompilerTag;
                            LoadTargetTasks(targ, tool.BuildOptions.EnvironmentVariables, tool.CppCompiler, tool.BuildOptions.CppFlags, tool.BuildOptions.C_CppFlags, tool.BuildOptions.CommonFlags);
                            break;
                        case AdiLibTargetTag:
                        case ArmLibTargetTag:
                        case ArcLibTargetTag:
                        case LibTargetTag:
                            tool.Archiver.Conditional = targ.Condition;
                            tool.Archiver.Description = ArchiverTag;
                            LoadTargetTasks(targ, tool.BuildOptions.EnvironmentVariables, tool.Archiver, tool.BuildOptions.ArchiverFlags);
                            break;
                        case AdiExeTargetTag:
                        case ArmExeTargetTag:
                        case ArcExeTargetTag:
                        case ExeTargetTag:
                            tool.Linker.Conditional = targ.Condition;
                            tool.Linker.Description = LinkerTag;
                            LoadTargetTasks(targ, tool.BuildOptions.EnvironmentVariables, tool.Linker, tool.BuildOptions.LinkerFlags);
                            break;
                        default:
                            MiscBuildTool misc = new MiscBuildTool();
                            misc.BuildTool.Conditional = targ.Condition;
                            misc.BuildTool.Exec = targ.Name;
                            misc.BuildTool.Description = targ.Name;
                            misc.Name = targ.Name;
                            LoadTargetTasks(targ, misc.EnvironmentVariables, misc.BuildTool, misc.BuildToolOptions);
                            tool.MiscTools.Add(misc);
                            break;
                    }
                }

                BuildToolDefine[] tools = new BuildToolDefine[]
            {
                tool.Archiver,
                tool.AsmCompiler,
                tool.CCompiler,
                tool.CppCompiler,
                tool.Linker,
                tool.FromELF,
            };

                //first time to determine path
                foreach (BuildToolDefine td in tools)
                {
                    ExtractToolPath(tool, td.Exec);
                }
                //second time to remove path from exec command
                foreach (BuildToolDefine td in tools)
                {
                    td.Exec = ExtractToolPath(tool, td.Exec);
                }

                tool.ProjectPath = ConvertPathToEnv(fileName);
            }
            catch (Exception e)
            {
                System.Diagnostics.Debug.WriteLine("Error: loading target file: " + fullpath + "\r\n", e.Message);
            }
        }
        internal BuildTool LoadBuildToolFromTargetFile(string fileName)
        {
            BuildTool tool = new BuildTool();


            string fullpath = ExpandEnvVars(fileName, "");

            if (!File.Exists(fullpath)) return null;

            //TODO: Load processor/proctype specific data into processor/procType build options

            tool.Name = Path.GetFileNameWithoutExtension(fullpath).ToUpper().Replace("MICROSOFT.SPOT.SYSTEM.", "");

            string settingsFile = Path.Combine(Path.GetDirectoryName(fullpath), Path.GetFileNameWithoutExtension(fullpath) + ".settings");

            if (File.Exists(settingsFile))
            {
                LoadTargetFile(tool, settingsFile);
            }

            LoadTargetFile(tool, fullpath);

            m_helper.DefaultInventory.BuildTools.Add(tool);

            return tool;
        }
        // -- //

        internal void SaveTargetFile(BuildTool tool)
        {
            string fullpath = ExpandEnvVars(tool.ProjectPath, "");
            try
            {
                Project proj = GenerateBuildToolTargetFile(tool);
                proj.Save(fullpath);
            }
            catch (Exception e)
            {
                System.Diagnostics.Debug.WriteLine("Error: saving target file: " + fullpath + "\r\n", e.Message);
            }
        }
        private string ExtractToolPath(BuildTool tool, string exeLocation)
        {
            if (string.IsNullOrEmpty(exeLocation)) return "";

            exeLocation = exeLocation.Trim();

            exeLocation = exeLocation.TrimStart(' ', '"', '\\');
            exeLocation = exeLocation.TrimEnd(' ', '"');

            exeLocation = exeLocation.Replace(ToEnvVar(AdiWrapperTag), "");
            exeLocation = exeLocation.Replace(ToEnvVar(ArcWrapperTag), "");
            exeLocation = exeLocation.Replace(ToEnvVar(AdsWrapperTag), "");

            if (string.IsNullOrEmpty(tool.ToolPath))
            {
                string tmp = exeLocation.Replace("\"", "");

                tool.ToolPath = Path.GetDirectoryName(tmp) + "\\";
                exeLocation = exeLocation.Remove(0, tool.ToolPath.Length).TrimStart(' ', '\\', '"');
            }
            else if (exeLocation.ToLower().StartsWith(tool.ToolPath.ToLower()))
            {
                exeLocation = exeLocation.Remove(0, tool.ToolPath.Length).TrimStart(' ', '\\', '"');
            }
            else
            {
                do
                {
                    tool.ToolPath = Path.GetDirectoryName(tool.ToolPath);
                }
                while (tool.ToolPath.Length > 0 && exeLocation.ToLower().StartsWith(tool.ToolPath.ToLower()));

                if (tool.ToolPath.Length > 0)
                {
                    exeLocation = exeLocation.Remove(0, tool.ToolPath.Length);
                }
            }

            return exeLocation.TrimStart('\\', ' ', '"');
        }
        private Project GenerateBuildToolTargetFile(BuildTool buildTool)
        {
            Project proj = new Project();
            proj.Xml.DefaultTargets = "Build";

            ProjectPropertyGroupElement mainGrp = proj.Xml.AddPropertyGroup();
            mainGrp.AddProperty("BuildToolName", buildTool.Name);
            mainGrp.AddProperty("BuildToolGuid", buildTool.Guid);
            mainGrp.AddProperty("Documentation", buildTool.Documentation);
            if (buildTool.SupportedCpuNames.Count > 0)
            {
                mainGrp.AddProperty(CpuNamesTag, string.Join( ";", buildTool.SupportedCpuNames.ToArray() ) );
            }
            if (buildTool.SupportedISAs.Count > 0)
            {
                foreach (ISA isa in buildTool.SupportedISAs)
                {
                    ProjectPropertyGroupElement bgISA = proj.Xml.AddPropertyGroup();

                    bgISA.Condition = "'$(INSTRUCTION_SET)'=='" + isa.Name + "'";

                    bgISA.AddProperty(ISAsTag, isa.Name);

                    AddBuildToolFlags(isa.BuildToolOptions, proj, bgISA);
                }
            }
    
            AddBuildToolProperties(buildTool, proj);

            if (buildTool.Properties.Count > 0)
            {
                ProjectPropertyGroupElement bpg = proj.Xml.AddPropertyGroup();
                foreach (MFProperty prop in buildTool.Properties)
                {
                    ProjectPropertyElement bp = bpg.AddProperty(prop.Name, prop.Value);
                    bp.Condition = prop.Condition;
                }
            }

            AddEnvVarCollection(buildTool.BuildOptions.EnvironmentVariables, proj);
            AddBuildToolFlags(buildTool.BuildOptions, proj, null);
            AddMiscToolFlags(buildTool.MiscTools, proj);


            if (buildTool.Items.Count > 0)
            {
                ProjectItemGroupElement big = proj.Xml.AddItemGroup();
                foreach (MFProperty prop in buildTool.Items)
                {
                    ProjectItemElement bi = big.AddItem(prop.Name, prop.Value);
                    bi.Condition = prop.Condition;
                }
            }

            AddBuildTools(buildTool, proj);

            return proj;
        }
 public void CopyTo(BuildTool dest)
 {
     CopyHelper.CopyTo(this, dest);
 }
        private void addBuildToolToolStripMenuItem_Click(object sender, EventArgs e)
        {
            TreeNode parent = treeViewInventory.Nodes[0].Nodes["BuildTools"];
            BuildTool newTool = new BuildTool();

            newTool.Guid = Guid.NewGuid().ToString("B").ToUpper();

            TreeNode newNode = AddTreeElement(parent, "<New Build Tool>", newTool, true, DefaultInventory.BuildTools, c_defaultInventoryKey);

            DefaultInventory.BuildTools.Add(newTool);

            treeViewInventory.SelectedNode = newNode;
            newNode.BeginEdit();
        }