Skip to content

Commit ab1d23a

Browse files
Fea,添加Linux交叉编译支持
1 parent 50988ee commit ab1d23a

File tree

8 files changed

+130
-43
lines changed

8 files changed

+130
-43
lines changed

README.md

Lines changed: 43 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,51 @@ msbuild "D:\ConsoleApplication2\ConsoleApplication2.vcxproj" -p:Configuration=Re
7575
msbuild "D:\ConsoleApplication2\ConsoleApplication2.vcxproj" -p:Configuration=Release;Platform=x64
7676
7777
```
78+
## 2.4. 全局支持的属性
79+
### 2.4.1. PlatformToolset 全局属性
80+
工具集,目前支持`YY_Cross_Clang_1_0``YY_Cross_GCC_1_0`
81+
82+
示例:
83+
```xml
84+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x86'" Label="Configuration">
85+
<PlatformToolset>YY_Cross_GCC_1_0</PlatformToolset>
86+
</PropertyGroup>
87+
```
88+
### 2.4.2. Platform 全局属性
89+
一般来说,Platform拥有以下几种可能:
90+
* ARM
91+
* ARM64
92+
* MIPS
93+
* x64
94+
* x86
95+
96+
> 注意:Platform是在调用msbuild时传入的,一般不应该直接设置到工程。
97+
98+
### 2.4.3. PlatformTriplet 全局属性
99+
平台的Triplet值,比如说:i686-linux-gnu。一般无需设置,框架会根据Platform属性自动调整。
100+
其默认对照关系如下:
101+
102+
| Platform | Linux PlatformTriplet 默认值 | MacOS PlatformTriplet 默认值 |
103+
| --------- | ---------------------------- | ---------------------------- |
104+
| x86 | i686-linux-gnu | 尚未就绪
105+
| x64 | x86_64-linux-gnu | 尚未就绪
106+
| ARM | arm-linux-gnueabihf | 尚未就绪
107+
| ARM64 | aarch64-linux-gnu | 尚未就绪
108+
| MIPS | mips-linux-gnu | 不支持
109+
110+
示例:
111+
```xml
112+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x86'" Label="Configuration">
113+
<PlatformTriplet>i686-linux-gnu</PlatformTriplet>
114+
</PropertyGroup>
115+
```
116+
117+
### 2.4.4. Sysroot 全局属性
118+
用于自定义库目录以及头文件位置。此路径会通过`--sysroot`传递给编译器以及链接器。
119+
78120

79121
# 3. 支持的属性以及元素参数映射情况
122+
80123
## 3.1. ClCompile
81124
它描述了C/C++代码编译参数配置情况。
82125

@@ -519,20 +562,6 @@ ObjCAutomaticRefCounting开启时发生异常保证不泄露内存。
519562
</ClCompile>
520563
```
521564

522-
### 3.1.31. Sysroot 属性(字符串)
523-
设置库和头文件的根目录,一般交叉编译时需要。
524-
525-
| Windows(MSVC) | Linux(GCC/CLang) | OSX(GCC/CLang)
526-
| ----------------- | ----------------- | --------
527-
| 自动忽略 | --sysroot | --sysroot
528-
529-
示例:
530-
```xml
531-
<ClCompile>
532-
<Sysroot>Usr/aarch64-linux-gnu</Sysroot>
533-
</ClCompile>
534-
```
535-
536565
## 3.2. Link
537566
链接配置。
538567

@@ -812,20 +841,6 @@ Apple特有的Framework引用(-framework)。
812841
</Link>
813842
```
814843

815-
### 3.1.22. Sysroot 属性(字符串)
816-
设置库和头文件的根目录,一般交叉编译时需要。
817-
818-
| Windows(MSVC) | Linux(GCC/CLang) | OSX(GCC/CLang)
819-
| ----------------- | ----------------- | --------
820-
| 自动忽略 | --sysroot | --sysroot
821-
822-
示例:
823-
```xml
824-
<Link>
825-
<Sysroot>Usr/aarch64-linux-gnu</Sysroot>
826-
</Link>
827-
```
828-
829844
# 附: 我怎么自己编译 MSBuildCppCrossToolset?
830845
> 温馨提示:普通用户无需关心如何编译 MSBuildCppCrossToolset。只需要从Release产物中下载即可。
831846

Samples/ReadMe.md

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,25 @@ export VCTargetsPath=/home/mouri/Workspace/MSBuildCppCrossToolsetRelease/VCTarge
1414

1515
### 编译项目
1616
一般来说,Platform拥有以下几种可能:
17-
* ARM
18-
* ARM64
19-
* MIPS
20-
* x64
21-
* x86(注意:对于Windows系统下的vcxproj来说叫Win32)
2217

23-
> 温馨提示:Windows下搞不懂x86还是Win32的可以先尝试Win32,如果报错那么尝试一下x86。
18+
| Platform | Linux PlatformTriplet 默认值 | MacOS PlatformTriplet 默认值 | 备注
19+
| --------- | ---------------------------- | --------------------- | ---
20+
| x86 | i686-linux-gnu | 尚未就绪 | (注意:对于Windows系统下的vcxproj来说叫Win32)
21+
| x64 | x86_64-linux-gnu | 尚未就绪
22+
| ARM | arm-linux-gnueabihf | 尚未就绪
23+
| ARM64 | aarch64-linux-gnu | 尚未就绪
24+
| MIPS | mips-linux-gnu | 不支持
25+
26+
> 温馨提示:Windows下Platform搞不懂x86还是Win32的可以先尝试Win32,如果报错那么尝试一下x86。
27+
28+
如果对默认的PlatformTriplet不满意,可以在Configuration区域覆盖PlatformTriplet属性实现自定义。Configuration区域亦可自定义Sysroot属性。
29+
30+
31+
交叉编译时,必须安装对应的Triplet,比如对于一个x64的Ubuntu,使用GCC编译ARM64小端的Linux程序,则先安装`g++-aarch64-linux-gun`
32+
33+
```
34+
sudo apt-get install g++-aarch64-linux-gun
35+
```
2436

2537
; 假设项目位置为 `/home/mouri/Workspace/MSBuildCppCrossToolsetWorkspace/Samples`。并且编译一些 Release,那么可以输入如下命令:
2638

YY.Build.Cross.Tasks/Cross/Compile.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ public Compile()
5454
switchOrderList.Add("ForcedIncludeFiles");
5555
switchOrderList.Add("EnableASAN");
5656
switchOrderList.Add("AdditionalOptions");
57+
switchOrderList.Add("TargetArch");
5758
switchOrderList.Add("Sysroot");
5859
switchOrderList.Add("DependenceFile");
5960

@@ -992,6 +993,33 @@ public virtual string Sysroot
992993
}
993994
}
994995

996+
// 例如 x86_64-linux-gnu
997+
// 注意:仅clang支持,并且此选项位内部设置,跟随PlatformTriplet
998+
public virtual string TargetArch
999+
{
1000+
get
1001+
{
1002+
if (IsPropertySet("TargetArch"))
1003+
{
1004+
return base.ActiveToolSwitches["TargetArch"].Value;
1005+
}
1006+
return null;
1007+
}
1008+
set
1009+
{
1010+
base.ActiveToolSwitches.Remove("TargetArch");
1011+
ToolSwitch toolSwitch = new ToolSwitch(ToolSwitchType.String);
1012+
toolSwitch.DisplayName = "目标体系结构";
1013+
toolSwitch.Description = "目标的体系结构";
1014+
toolSwitch.ArgumentRelationList = new ArrayList();
1015+
toolSwitch.Name = "TargetArch";
1016+
toolSwitch.Value = value;
1017+
toolSwitch.SwitchValue = "--target=";
1018+
base.ActiveToolSwitches.Add("TargetArch", toolSwitch);
1019+
AddActiveSwitchToolValue(toolSwitch);
1020+
}
1021+
}
1022+
9951023
protected override bool GenerateCostomCommandsAccordingToType(CommandLineBuilder builder, string switchName, bool dummyForBackwardCompatibility, CommandLineFormat format = CommandLineFormat.ForBuildLog, EscapeFormat escapeFormat = EscapeFormat.Default)
9961024
{
9971025
if (string.Equals(switchName, "DependenceFile", StringComparison.OrdinalIgnoreCase))

YY.Build.Cross.Tasks/Cross/Ld.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public Ld()
4141
switchOrderList.Add("Relocation");
4242
switchOrderList.Add("FunctionBinding");
4343
switchOrderList.Add("NoExecStackRequired");
44+
switchOrderList.Add("TargetArch");
4445
switchOrderList.Add("SysRoot");
4546
switchOrderList.Add("LinkDll");
4647
switchOrderList.Add("WholeArchiveBegin");
@@ -827,6 +828,33 @@ public virtual string SysRoot
827828
}
828829
}
829830

831+
// 例如 x86_64-linux-gnu
832+
// 注意:仅clang支持,并且此选项位内部设置,跟随PlatformTriplet
833+
public virtual string TargetArch
834+
{
835+
get
836+
{
837+
if (IsPropertySet("TargetArch"))
838+
{
839+
return base.ActiveToolSwitches["TargetArch"].Value;
840+
}
841+
return null;
842+
}
843+
set
844+
{
845+
base.ActiveToolSwitches.Remove("TargetArch");
846+
ToolSwitch toolSwitch = new ToolSwitch(ToolSwitchType.String);
847+
toolSwitch.DisplayName = "目标体系结构";
848+
toolSwitch.Description = "目标的体系结构";
849+
toolSwitch.ArgumentRelationList = new ArrayList();
850+
toolSwitch.Name = "TargetArch";
851+
toolSwitch.Value = value;
852+
toolSwitch.SwitchValue = "--target=";
853+
base.ActiveToolSwitches.Add("TargetArch", toolSwitch);
854+
AddActiveSwitchToolValue(toolSwitch);
855+
}
856+
}
857+
830858
protected override string TrackerIntermediateDirectory
831859
{
832860
get

YY.Build.Cross.Tasks/Targets/Linux/Platforms/YY_Cross_Clang_1_0/Toolset.props

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,12 @@ Copyright (C) Microsoft Corporation. All rights reserved.
1616
<Import Project="$(VCTargetsPath)\Application Type\$(ApplicationType)\$(ApplicationTypeRevision)\YY.Linux.Cross.props" />
1717

1818
<PropertyGroup>
19-
<Sysroot></Sysroot>
20-
<ClangTarget></ClangTarget>
19+
<ClangTarget>$(PlatformTriplet)</ClangTarget>
2120
<ToolExe>clang++</ToolExe>
2221
<RemoteCCompileToolExe Condition="'$(RemoteCCompileToolExe)' == ''">clang++</RemoteCCompileToolExe>
2322
<RemoteCppCompileToolExe Condition="'$(RemoteCppCompileToolExe)' == ''">clang++</RemoteCppCompileToolExe>
2423
<RemoteLdToolExe Condition="'$(RemoteLdToolExe)' == ''">clang++</RemoteLdToolExe>
25-
<RemoteArToolExe Condition="'$(RemoteArToolExe)' == ''">ar</RemoteArToolExe>
24+
<RemoteArToolExe Condition="'$(RemoteArToolExe)' == ''">$(PlatformTriplet)-ar</RemoteArToolExe>
2625
<RemoteGdbserverToolExe Condition="'$(RemoteGdbserverToolExe)' == ''">gdbserver</RemoteGdbserverToolExe>
2726
<RemoteGdbToolExe Condition="'$(RemoteGdbToolExe)' == ''">gdb</RemoteGdbToolExe>
2827
<!-- Set $(ExecutablePath) used by Microsoft.Cpp.CurrentVersion.targets's SetBuildDefaultEnvironmentVariables target to set the PATH env var -->

YY.Build.Cross.Tasks/Targets/Linux/Platforms/YY_Cross_GCC_1_0/Toolset.props

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,12 @@ Copyright (C) Microsoft Corporation. All rights reserved.
1616
<Import Project="$(VCTargetsPath)\Application Type\$(ApplicationType)\$(ApplicationTypeRevision)\YY.Linux.Cross.props" />
1717

1818
<PropertyGroup>
19-
<Sysroot></Sysroot>
2019
<ClangTarget></ClangTarget>
2120
<ToolExe>g++</ToolExe>
22-
<RemoteCCompileToolExe Condition="'$(RemoteCCompileToolExe)' == ''">g++</RemoteCCompileToolExe>
23-
<RemoteCppCompileToolExe Condition="'$(RemoteCppCompileToolExe)' == ''">g++</RemoteCppCompileToolExe>
24-
<RemoteLdToolExe Condition="'$(RemoteLdToolExe)' == ''">g++</RemoteLdToolExe>
25-
<RemoteArToolExe Condition="'$(RemoteArToolExe)' == ''">ar</RemoteArToolExe>
21+
<RemoteCCompileToolExe Condition="'$(RemoteCCompileToolExe)' == ''">$(PlatformTriplet)-g++</RemoteCCompileToolExe>
22+
<RemoteCppCompileToolExe Condition="'$(RemoteCppCompileToolExe)' == ''">$(PlatformTriplet)-g++</RemoteCppCompileToolExe>
23+
<RemoteLdToolExe Condition="'$(RemoteLdToolExe)' == ''">$(PlatformTriplet)-g++</RemoteLdToolExe>
24+
<RemoteArToolExe Condition="'$(RemoteArToolExe)' == ''">$(PlatformTriplet)-ar</RemoteArToolExe>
2625
<RemoteGdbserverToolExe Condition="'$(RemoteGdbserverToolExe)' == ''">gdbserver</RemoteGdbserverToolExe>
2726
<RemoteGdbToolExe Condition="'$(RemoteGdbToolExe)' == ''">gdb</RemoteGdbToolExe>
2827
<!-- Set $(ExecutablePath) used by Microsoft.Cpp.CurrentVersion.targets's SetBuildDefaultEnvironmentVariables target to set the PATH env var -->

YY.Build.Cross.Tasks/Targets/Linux/YY.Linux.Cross.targets

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ Copyright (C) Microsoft Corporation. All rights reserved.
7676
<CompileAs Condition="'%(ClCompile.CompileAs)' == 'Default' and '%(ClCompile.Extension)' == '.c'">CompileAsC</CompileAs>
7777
<WholeProgramOptimization Condition="'%(ClCompile.LinkTimeOptimization)' == 'true'">true</WholeProgramOptimization>
7878
<FloatingPointModel Condition="'%(ClCompile.RelaxIEEE)' == 'true'">Fast</FloatingPointModel>
79+
<Sysroot>$(Sysroot)</Sysroot>
80+
<TargetArch>$(ClangTarget)</TargetArch>
7981
</ClCompile>
8082

8183
<ClCompile>
@@ -155,6 +157,7 @@ Copyright (C) Microsoft Corporation. All rights reserved.
155157
EnableASAN="%(ClCompile.EnableASAN)"
156158
AdditionalOptions="%(ClCompile.AdditionalOptions)"
157159
Sysroot="%(ClCompile.Sysroot)"
160+
TargetArch="%(ClCompile.TargetArch)"
158161
TrackerLogDirectory="$(TLogLocation)"
159162
TLogReadFiles="$(TLogLocation)\compile.read.1.tlog"
160163
TLogWriteFiles="$(TLogLocation)\compile.write.1.tlog"
@@ -201,7 +204,8 @@ Copyright (C) Microsoft Corporation. All rights reserved.
201204
BuildingInIde="%(Link.BuildingInIde)"
202205
EnableASAN="%(Link.EnableASAN)"
203206
UseOfStl="%(Link.UseOfStl)"
204-
Sysroot="%(ClCompile.Sysroot)"
207+
Sysroot="$(Sysroot)"
208+
TargetArch="$(ClangTarget)"
205209
TrackerLogDirectory="$(TLogLocation)"
206210
TLogReadFiles="$(TLogLocation)\link.read.1.tlog"
207211
TLogWriteFiles="$(TLogLocation)\link.write.1.tlog"

YY.Build.Cross.Tasks/YY.Build.Cross.Tasks.projitems

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
<None Include="$(MSBuildThisFileDirectory)Targets\Linux\YY.Linux.Cross.targets" />
2626
<None Include="$(MSBuildThisFileDirectory)Targets\OSX\Platforms\YY_Cross_Clang_1_0\Toolset.props" />
2727
<None Include="$(MSBuildThisFileDirectory)Targets\OSX\Platforms\YY_Cross_Clang_1_0\Toolset.targets" />
28+
<None Include="$(MSBuildThisFileDirectory)Targets\OSX\Platforms\YY_Cross_GCC_1_0\Toolset.props" />
29+
<None Include="$(MSBuildThisFileDirectory)Targets\OSX\Platforms\YY_Cross_GCC_1_0\Toolset.targets" />
2830
<None Include="$(MSBuildThisFileDirectory)Targets\OSX\YY.OSX.Cross.props" />
2931
<None Include="$(MSBuildThisFileDirectory)Targets\OSX\YY.OSX.Cross.targets" />
3032
</ItemGroup>

0 commit comments

Comments
 (0)