예제 #1
0
        public void ParseObj(Boolean debug)
        {
            var map = ".map";

            // 调试版
            if (debug)
            {
                map = "D" + map;
            }

            // 找到映射文件
            var mp = "List".AsDirectory().GetAllFiles("*" + map).FirstOrDefault();

            if (mp == null || !mp.Exists)
            {
                return;
            }

            Console.WriteLine(mp.FullName);
            var name = mp.Name.TrimEnd(".map");

            // 读取所有需要用到的对象文件
            var txt  = File.ReadAllText(mp.FullName).Substring("Library Member Name", "Library Totals");
            var ns   = txt.Trim().Split("\r\n");
            var objs = ns.Select(e => e.Split().Last()).Where(e => e.EndsWith(".o")).ToArray();

            // 找到原始对象文件
            var list = new List <String>();

            foreach (var obj in objs)
            {
                // 注意,不同目录可能有同名对象文件,所以需要同时在两个目录里面找
                var fs = FindObjs(obj, debug);
                if (fs.Length > 0)
                {
                    foreach (var item in fs)
                    {
                        // 无法识别需要哪个同名文件,全部加入
                        if (!list.Contains(item))
                        {
                            list.Add(item);
                        }
                    }
                }
            }

            Console.WriteLine("objs={0} list={1}", objs.Length, list.Count);

            // 引入基础库以及核心库的全部对象
            var bs = Root.CombinePath("Tool/Obj");

            if (debug)
            {
                bs += "D";
            }
            foreach (var item in bs.CombinePath("Core").AsDirectory().GetAllFiles("*.o"))
            {
                if (!list.Contains(item.FullName))
                {
                    list.Add(item.FullName);
                }
            }
            foreach (var item in bs.CombinePath("Kernel").AsDirectory().GetAllFiles("*.o"))
            {
                if (!list.Contains(item.FullName))
                {
                    list.Add(item.FullName);
                }
            }

            list.Sort();

            //Objs = list;

            // 链接打包
            name = "SmartOS";
            if (debug)
            {
                name += "D";
            }
            var lib = Temp.CombinePath(name + ".lib");

            BuildLib(lib, list);
            Objs.Add(lib);
        }