Пример #1
0
        /// <summary>链接静态库</summary>
        /// <returns></returns>
        protected override String OnBuild(String name)
        {
            /*
             * -mcpu=cortex-m3 -mthumb -g --specs=nano.specs -nostartfiles
             * -Wl,-Map=$(BIN_DIR)/application.map -Os -Wl,--gc-sections -Wl,--cref -Wl,--entry=Reset_Handler -Wl,--no-enum-size-warning -Wl,--no-wchar-size-warning
             * $(LFLAGS) -o $(BIN_DIR)/$(TARGET).axf  $(OBJ_LIST) $(OBJ_DIR)/ram_1.r.o $(LIBFLAGS) -T./rlx8195A-symbol-v02-img2.ld
             */

            var lstName = GetListPath(name);
            var objName = GetObjPath(name);

            var sb = new StringBuilder();

            // 指定CPU和指令集
            if (!CPU.IsNullOrEmpty())
            {
                sb.AppendFormat("-mcpu={0}", CPU.ToLower());
            }
            // 指定优化等级
            sb.AppendFormat(" -O{0}", Debug ? 0 : 3);
            if (!Specs.IsNullOrEmpty())
            {
                sb.AppendFormat(" --specs={0}", Specs);
            }
            // 只链接静态库,不找动态库
            sb.Append(" -static");
            if (!Entry.IsNullOrEmpty())
            {
                sb.AppendFormat(" -Wl,--entry={0}", Entry);
            }
            sb.Append(" -Wl,--cref");
            // 链接时输出详细过程
            if (LinkVerbose)
            {
                sb.Append(" -Wl,--verbose");
            }
            // 为每个函数和数据项分配独立的段
            //sb.Append(" -ffunction-sections -fdata-sections");
            // 删除未使用段
            sb.AppendFormat(" -Wl,--gc-sections");
            // Linux风格,4字节枚举、有符号字符
            if (Linux)
            {
                sb.Append(" -Wl,--no-enum-size-warning -Wl,--no-wchar-size-warning");
            }
            // 调试版打开所有警告
            if (Debug)
            {
                sb.Append(" -W -Wall -g2");
            }
            else
            {
                sb.Append(" -w");
            }

            var icf = Scatter;

            if (icf.IsNullOrEmpty())
            {
                icf = ".".AsDirectory().GetAllFiles("*.ld", false).FirstOrDefault()?.Name;
            }
            if (!icf.IsNullOrEmpty() && File.Exists(icf.GetFullPath()))
            {
                sb.AppendFormat(" -T\"{0}\"", icf);
            }

            var axf = objName.EnsureEnd(".axf");

            sb.AppendFormat(" -Wl,-Map=\"{0}.map\" -o \"{1}\"", lstName, axf);
            //sb.AppendFormat(" -o \"{0}\"", axf);

            sb.Append(" -Xlinker \"-(\"");

            return(sb.ToString());
        }