Skip to content

Commit 0c67859

Browse files
committed
新增编译引擎NewLife.Build,测试通过
1 parent 82ad479 commit 0c67859

File tree

7 files changed

+268
-62
lines changed

7 files changed

+268
-62
lines changed

Src/NewLife.Build/Builder.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ public static String All
6868
public String Link { get; set; }
6969
/// <summary>链接静态库</summary>
7070
public String Ar { get; set; }
71+
/// <summary>导出对象</summary>
72+
public String ObjCopy { get; set; }
7173
/// <summary>头文件包含目录</summary>
7274
public String IncPath { get; set; }
7375
/// <summary>库文件包含目录</summary>
@@ -263,10 +265,7 @@ public Int32 Assemble(String file, Boolean showCmd)
263265
/// <summary>汇编程序</summary>
264266
/// <param name="file"></param>
265267
/// <returns></returns>
266-
protected virtual String OnAssemble(String file)
267-
{
268-
return null;
269-
}
268+
protected virtual String OnAssemble(String file) { return null; }
270269

271270
/// <summary>编译所有文件</summary>
272271
/// <returns></returns>
@@ -503,8 +502,11 @@ public Int32 Build(String name = null)
503502
// 预处理axf。修改编译信息
504503
BuildHelper.WriteBuildInfo(axf);
505504

506-
var bin = name.EnsureEnd(".bin");
507-
Dump(axf, bin);
505+
var target = name.EnsureEnd(".bin");
506+
XTrace.WriteLine("生成:{0}", target);
507+
Console.WriteLine("");
508+
509+
Dump(axf, target);
508510

509511
if (name.Contains("\\")) name = name.Substring("\\", "_");
510512
if (rs == 0)

Src/NewLife.Build/GCC.cs

Lines changed: 119 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,25 @@ public GCC()
2626
}
2727
#endregion
2828

29+
/// <summary>初始化</summary>
30+
/// <param name="addlib"></param>
31+
/// <returns></returns>
32+
public override Boolean Init(Boolean addlib)
33+
{
34+
var basePath = ToolPath.CombinePath("bin").GetFullPath();
35+
36+
Complier = basePath.CombinePath("arm-none-eabi-gcc.exe").GetFullPath();
37+
Asm = basePath.CombinePath("arm-none-eabi-gcc.exe");
38+
Link = basePath.CombinePath("armlink.exe");
39+
Ar = basePath.CombinePath("arm-none-eabi-ar.exe");
40+
ObjCopy = basePath.CombinePath("arm-none-eabi-objcopy.exe");
41+
42+
IncPath = basePath.CombinePath(@"..\arm-none-eabi\include").GetFullPath();
43+
LibPath = basePath.CombinePath(@"..\arm-none-eabi\lib").GetFullPath();
44+
45+
return base.Init();
46+
}
47+
2948
#region 主要编译方法
3049
/// <summary>获取编译用的命令行</summary>
3150
/// <param name="cpp">是否C++</param>
@@ -48,20 +67,119 @@ public override String GetCompileCommand(Boolean cpp)
4867
//sb.AppendFormat(" -D__NO_SYSTEM_INIT -D{0}", Flash);
4968
//sb.AppendFormat(" -D{0}", Flash);
5069
//if (GD32) sb.Append(" -DGD32");
70+
if (Debug) sb.Append(" -DDEBUG -DUSE_FULL_ASSERT");
71+
if (Tiny) sb.Append(" -DTINY");
72+
foreach (var item in Defines)
73+
{
74+
sb.AppendFormat(" -D{0}", item);
75+
}
76+
77+
foreach (var item in ExtCompiles)
78+
{
79+
sb.AppendFormat(" {0}", item.Trim());
80+
}
81+
82+
return sb.ToString();
83+
}
84+
85+
/// <summary>汇编程序</summary>
86+
/// <param name="file"></param>
87+
/// <returns></returns>
88+
protected override String OnAssemble(String file)
89+
{
90+
var sb = new StringBuilder();
91+
sb.Append("-ggdb");
92+
if (file.EndsWithIgnoreCase(".cpp"))
93+
sb.Append(" -std=c++17");
94+
sb.AppendFormat(" -mlittle-endian -mthumb -mcpu={0} -mthumb-interwork -O{1}", CPU, Debug ? 0 : 3);
95+
sb.AppendFormat(" -ffunction-sections -fdata-sections");
96+
sb.AppendFormat(" -fno-exceptions -MD");
97+
//sb.AppendFormat(" -D{0}", Flash);
98+
//if (GD32) sb.Append(" -DGD32");
5199
foreach (var item in Defines)
52100
{
53101
sb.AppendFormat(" -D{0}", item);
54102
}
55103
if (Debug) sb.Append(" -DDEBUG -DUSE_FULL_ASSERT");
56104
if (Tiny) sb.Append(" -DTINY");
105+
sb.AppendFormat(" -I.");
106+
foreach (var item in Includes)
107+
{
108+
sb.AppendFormat(" -I{0}", item);
109+
}
57110

58-
foreach (var item in ExtCompiles)
111+
return sb.ToString();
112+
}
113+
114+
/// <summary>链接静态库</summary>
115+
/// <returns></returns>
116+
protected override String OnBuildLib(String lib)
117+
{
118+
var sb = new StringBuilder();
119+
sb.AppendFormat(" -r \"{0}\"", lib);
120+
121+
return sb.ToString();
122+
}
123+
124+
/// <summary>链接静态库</summary>
125+
/// <returns></returns>
126+
protected override String OnBuild(String name)
127+
{
128+
/*
129+
* --cpu Cortex-M3 *.o --library_type=microlib --strict --scatter ".\Obj\SmartOSF1_Debug.sct"
130+
* --summary_stderr --info summarysizes --map --xref --callgraph --symbols
131+
* --info sizes --info totals --info unused --info veneers
132+
* --list ".\Lis\SmartOSF1_Debug.map"
133+
* -o .\Obj\SmartOSF1_Debug.axf
134+
*
135+
* --cpu Cortex-M0 *.o --library_type=microlib --diag_suppress 6803 --strict --scatter ".\Obj\Smart130.sct"
136+
* --summary_stderr --info summarysizes --map --xref --callgraph --symbols
137+
* --info sizes --info totals --info unused --info veneers
138+
* --list ".\Lis\Smart130.map"
139+
* -o .\Obj\Smart130.axf
140+
*/
141+
142+
var lstName = GetListPath(name);
143+
var objName = GetObjPath(name);
144+
145+
var sb = new StringBuilder();
146+
sb.AppendFormat("--cpu {0} --library_type=microlib --strict", CPU);
147+
if (!Scatter.IsNullOrEmpty() && File.Exists(Scatter.GetFullPath()))
148+
sb.AppendFormat(" --scatter \"{0}\"", Scatter);
149+
else
150+
sb.AppendFormat(" --ro-base 0x08000000 --rw-base 0x20000000 --first __Vectors");
151+
//sb.Append(" --summary_stderr --info summarysizes --map --xref --callgraph --symbols");
152+
//sb.Append(" --info sizes --info totals --info unused --info veneers");
153+
sb.Append(" --summary_stderr --info summarysizes --map --xref --callgraph --symbols");
154+
sb.Append(" --info sizes --info totals --info veneers --diag_suppress L6803 --diag_suppress L6314");
155+
156+
foreach (var item in ExtBuilds)
59157
{
60158
sb.AppendFormat(" {0}", item.Trim());
61159
}
62160

161+
var axf = objName.EnsureEnd(".axf");
162+
sb.AppendFormat(" --list \"{0}.map\" -o \"{1}\"", lstName, axf);
163+
63164
return sb.ToString();
64165
}
166+
167+
/// <summary>导出目标文件</summary>
168+
/// <param name="axf"></param>
169+
/// <param name="target"></param>
170+
/// <returns></returns>
171+
protected override Boolean Dump(String axf, String target)
172+
{
173+
var cmd = "";
174+
if (target.EndsWithIgnoreCase(".bin"))
175+
cmd = "--bin -o \"{0}\" \"{1}\"".F(axf, target);
176+
else
177+
cmd = "--i32 -o \"{0}\" \"{1}\"".F(axf, target);
178+
179+
var rs = ObjCopy.Run(cmd, 3000, WriteLog);
180+
181+
return rs != 0;
182+
}
65183
#endregion
66184
}
67185

Src/NewLife.Build/ICC.cs

Lines changed: 112 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,25 @@ public ICC()
2626
}
2727
#endregion
2828

29+
/// <summary>初始化</summary>
30+
/// <param name="addlib"></param>
31+
/// <returns></returns>
32+
public override Boolean Init(Boolean addlib)
33+
{
34+
var basePath = ToolPath.CombinePath("arm\\bin").GetFullPath();
35+
36+
Complier = basePath.CombinePath("iccarm.exe").GetFullPath();
37+
Asm = basePath.CombinePath("iasmarm.exe");
38+
Link = basePath.CombinePath("ilinkarm.exe");
39+
Ar = basePath.CombinePath("iarchive.exe");
40+
ObjCopy = basePath.CombinePath("ielftool.exe");
41+
42+
IncPath = basePath.CombinePath(@"arm\include").GetFullPath();
43+
LibPath = basePath.CombinePath(@"arm\lib").GetFullPath();
44+
45+
return base.Init();
46+
}
47+
2948
#region 主要编译方法
3049
/// <summary>获取编译用的命令行</summary>
3150
/// <param name="cpp">是否C++</param>
@@ -56,18 +75,110 @@ public override String GetCompileCommand(Boolean cpp)
5675
//var basePath = Complier.CombinePath(@"..\..\..\").GetFullPath();
5776
//sb.AppendFormat(" --dlib_config \"{0}\\arm\\INC\\c\\DLib_Config_Normal.h\"", basePath);
5877

78+
foreach (var item in ExtCompiles)
79+
{
80+
sb.AppendFormat(" {0}", item.Trim());
81+
}
82+
83+
return sb.ToString();
84+
}
85+
86+
/// <summary>汇编程序</summary>
87+
/// <param name="file"></param>
88+
/// <returns></returns>
89+
protected override String OnAssemble(String file)
90+
{
91+
/*
92+
* -s+ -M<> -w+ -r --cpu Cortex-M3 --fpu None
93+
* -s+ 标记符大小写敏感
94+
* -r 调试输出
95+
*/
96+
var sb = new StringBuilder();
97+
sb.Append("-s+ -M<> -w+ -S");
98+
sb.AppendFormat(" --cpu {0}", CPU);
99+
if (Cortex >= 4) sb.Append(" --fpu=None");
59100
foreach (var item in Defines)
60101
{
61102
sb.AppendFormat(" -D{0}", item);
62103
}
104+
if (Debug) sb.Append(" -r");
105+
if (Tiny) sb.Append(" -DTINY");
63106

64-
foreach (var item in ExtCompiles)
107+
return sb.ToString();
108+
}
109+
110+
/// <summary>链接静态库</summary>
111+
/// <returns></returns>
112+
protected override String OnBuildLib(String lib)
113+
{
114+
var sb = new StringBuilder();
115+
sb.AppendFormat(" --create \"{0}\"", lib);
116+
117+
return sb.ToString();
118+
}
119+
120+
/// <summary>链接静态库</summary>
121+
/// <returns></returns>
122+
protected override String OnBuild(String name)
123+
{
124+
/*
125+
* -o \Exe\application.axf
126+
* --redirect _Printf=_PrintfTiny
127+
* --redirect _Scanf=_ScanfSmallNoMb
128+
* --keep bootloader
129+
* --keep gImage2EntryFun0
130+
* --keep RAM_IMG2_VALID_PATTEN
131+
* --image_input=\ram_1.r.bin,bootloader,LOADER,4
132+
* --map \List\application.map
133+
* --log veneers
134+
* --log_file \List\application.log
135+
* --config \image2.icf
136+
* --diag_suppress Lt009,Lp005,Lp006
137+
* --entry Reset_Handler --no_exceptions --no_vfe
138+
*/
139+
var lstName = GetListPath(name);
140+
var objName = GetObjPath(name);
141+
142+
var sb = new StringBuilder();
143+
//sb.AppendFormat("--cpu {0} --library_type=microlib --strict", CPU);
144+
var icf = Scatter;
145+
if (icf.IsNullOrEmpty()) icf = ".".AsDirectory().GetAllFiles("*.icf", false).FirstOrDefault()?.FullName;
146+
if (!icf.IsNullOrEmpty() && File.Exists(icf.GetFullPath()))
147+
sb.AppendFormat(" --config \"{0}\"", icf);
148+
//else
149+
// sb.AppendFormat(" --ro-base 0x08000000 --rw-base 0x20000000 --first __Vectors");
150+
sb.Append(" --entry Reset_Handler --no_exceptions --no_vfe");
151+
152+
foreach (var item in ExtBuilds)
65153
{
66154
sb.AppendFormat(" {0}", item.Trim());
67155
}
68156

157+
var axf = objName.EnsureEnd(".axf");
158+
sb.AppendFormat(" --list \"{0}.map\" -o \"{1}\"", lstName, axf);
159+
69160
return sb.ToString();
70161
}
162+
163+
/// <summary>导出目标文件</summary>
164+
/// <param name="axf"></param>
165+
/// <param name="target"></param>
166+
/// <returns></returns>
167+
protected override Boolean Dump(String axf, String target)
168+
{
169+
XTrace.WriteLine("生成:{0}", target);
170+
Console.WriteLine("");
171+
172+
var cmd = "";
173+
if (target.EndsWithIgnoreCase(".bin"))
174+
cmd = "--bin \"{0}\" \"{1}\"".F(axf, target);
175+
else
176+
cmd = "--ihex \"{0}\" \"{1}\"".F(axf, target);
177+
178+
var rs = ObjCopy.Run(cmd, 3000, WriteLog);
179+
180+
return rs != 0;
181+
}
71182
#endregion
72183
}
73184

0 commit comments

Comments
 (0)