Vs2012在Linux开发中的应用(9): 编译应用程序
来源:互联网 发布:集美大学网络中 编辑:程序博客网 时间:2024/05/19 23:24
快乐虾
http://blog.csdn.net/lights_joy/
欢迎转载,但请保留作者信息
应用程序的开发有两种方式,一种是使用Makefile,这种方式和之前的Uboot和内核的编译类似,不再说明。另一种方式是利用MSBUILD来控制生成过程,我们重载MSBUILD生成过程中的调用的任务来完成自己的编译任务。
1.1 重载任务
在targets中重载BuildCompile和Link,这里有个很奇怪的问题,如果不加上Build这个Target,MSBUILD并不会调用我们的BuildCompile目标,但是我们的这个目标仅仅是直接从Build.Steps.target这个文件中复制出来的,仅此而已。不明所以,先放一放:
<Target
Name="Build"
DependsOnTargets="$(BuildDependsOn)"
Condition=" '$(GNUProjectType)' =='LinuxMsbuildApp'"
Returns="@(ManagedTargetPath);@(WinMDFullPath)">
<ItemGroup>
<ManagedTargetPathInclude="$(TargetPath)"Condition="'$(ManagedAssembly)' == 'true'" />
</ItemGroup>
</Target>
<Target
Name="BuildCompile"
Condition=" '$(GNUProjectType)' =='LinuxMsbuildApp'"
>
<EmbedLinuxCompilerTask
TargetName="Compiler"
ProjectDir="$(ProjectDir)"
HostIp="$(HostIp)"
HostUser="$(HostUser)"
HostPasswd="$(HostPasswd)"
Python2="$(Python2Exe)"
HostShareRoot="$(HostShareRoot)"
HostShareRootWin="$(HostShareRootWin)"
ToolchainRoot="$(ToolchainRoot)"
CrossCompile="$(CrossCompile)"
Platform="$(Platform)"
Configuration="$(Configuration)"
ProjectFiles="@(ClCompile)"
LinkOptions="@(Link)"
/>
</Target>
<Target
Name="Link"
Condition=" '$(GNUProjectType)' =='LinuxMsbuildApp'"
>
<EmbedLinuxCompilerTask
TargetName="Link"
ProjectDir="$(ProjectDir)"
HostIp="$(HostIp)"
HostUser="$(HostUser)"
HostPasswd="$(HostPasswd)"
Python2="$(Python2Exe)"
HostShareRoot="$(HostShareRoot)"
HostShareRootWin="$(HostShareRootWin)"
ToolchainRoot="$(ToolchainRoot)"
CrossCompile="$(CrossCompile)"
Platform="$(Platform)"
Configuration="$(Configuration)"
ProjectFiles="@(ClCompile)"
LinkOptions="%(Link.AdditionalDependencies)"
/>
</Target>
<UsingTaskTaskName="EmbedLinuxCompilerTask"AssemblyFile="EmbedLinux.dll" />
<Target
Name="ClCompile"
Condition=" '$(GNUProjectType)' =='LinuxMsbuildApp'"
>
<EmbedLinuxMakeTask
TargetName="ClCompile"
ProjectDir="$(ProjectDir)"
HostIp="$(HostIp)"
HostUser="$(HostUser)"
HostPasswd="$(HostPasswd)"
Python2="$(Python2Exe)"
PythonFile="$(PythonFile)"
HostShareRoot="$(HostShareRoot)"
HostShareRootWin="$(HostShareRootWin)"
ToolchainRoot="$(ToolchainRoot)"
CrossCompile="$(CrossCompile)"
Platform="$(Platform)"
Configuration="$(Configuration)"
/>
</Target>
<Target
Name="Clean"
Condition=" '$(GNUProjectType)' =='LinuxMsbuildApp'"
>
<EmbedLinuxCompilerTask
TargetName="Clean"
ProjectDir="$(ProjectDir)"
HostIp="$(HostIp)"
HostUser="$(HostUser)"
HostPasswd="$(HostPasswd)"
Python2="$(Python2Exe)"
HostShareRoot="$(HostShareRoot)"
HostShareRootWin="$(HostShareRootWin)"
ToolchainRoot="$(ToolchainRoot)"
CrossCompile="$(CrossCompile)"
Platform="$(Platform)"
Configuration="$(Configuration)"
ProjectFiles="@(ClCompile)"
LinkOptions="@(Link)"
/>
</Target>
<Target
Name="Rebuild"
Condition=" '$(GNUProjectType)' =='LinuxMsbuildApp'"
DependsOnTargets="$(RebuildDependsOn)"
Returns="@(ManagedTargetPath);@(WinMDFullPath)">
<ItemGroup>
<ManagedTargetPathInclude="$(TargetPath)"Condition="'$(ManagedAssembly)' == 'true'" />
</ItemGroup>
</Target>
这里需要注意的另一点是不能只重载Build任务,因为这样将导致我们无法取到Link的参数!!
在执行“生成”任务时,会在$(IntDir)目录下生成一个名为$(ProjectName).lastbuildstate的文件,当这个文件生成时再调用“生成”命令将没有响应,直接返回
========== 生成:成功 0个,失败 0个,最新 1个,跳过 0个 ==========
此时可以先删掉此文件就可以进行生成操作了,Rebuild操作不受此影响,当生成失败时也不受此影响。
在上面的重载列表中:
BuildCompile将在“生成”或者“重新生成”命令中调用
Link将在“生成”或者“重新生成”或者“仅重新链接…”命令中调用且需要BuildCompile成功
ClCompile将在编译单个文件时调用,但是这两个操作可以用同一个Task去实现它
Clean将在重新生成或者清理时调用
1.2 任务的实现
在VS运行的过程中,MSBUILD会一直保持在运行状态:
而不是每次任务都重新执行一次,因此我们在MSBUILD第一次加载我们的任务DLL时,启动一个Python实例(上图中的Python2.exe),利用这个实例去执行SSH登录操作,并一真保持连接以加快执行速度。
当执行编译任务时,我们通过管道向此PYTHON实例发送bash命令,python将此命令转发执行并分析执行结果,再通过管道将结果发送给VS。这样VS就只需要发送命令并等待结果!!!
- Vs2012在Linux开发中的应用(9): 编译应用程序
- Vs2012在Linux开发中的应用(8): 编译Linux内核
- Vs2012在Linux开发中的应用(7): 编译UBOOT
- Vs2012在Linux开发中的应用(11): 编译单个文件
- Vs2012在Linux开发中的应用(12): 编译静态库
- Vs2012在Linux开发中的应用(1):开发环境
- Vs2012在Linux开发中的应用(2):方案设计
- Vs2012在Linux开发中的应用(10): 参数转换
- Vs2012在Linux开发中的应用(13): 添加对x86 Linux的支持
- Vs2013在Linux开发中的应用(18): 应用程序调试方案
- Vs2012在Linux开发中的应用(3):添加新平台hi3516
- Vs2012在Linux开发中的应用(4):公共属性的定义
- Vs2012在Linux开发中的应用(5):项目属性的定义
- Vs2012在Linux开发中的应用(6):改写Makefile项目的Build过程
- Vs2012在Linux开发中的应用(15): 添加可用的调试器
- stlport 5.2.1在vs2012中的编译
- OpenSSL在VS2012中的编译和配置
- iconv 编译在vs2012
- java堆栈(转)
- Jlink RTT弱爆了,Jlink Scope来啦
- WebService详解以及C#如何创建WebService和WebService的引用
- 15款Cocos2d-x游戏源码汇总
- 读写配置文件
- Vs2012在Linux开发中的应用(9): 编译应用程序
- 杨辉三角C#编程原理
- 使用final关键字修饰一个变量的三种情况
- Python测试框架nose之设计case(2)
- Servlet跳转到jsp中无法显示css
- LPC1549如何 利用Jlink工具的J-Scope来实时观察变量,不影响CPU运行
- 基于MATLAB的滤波算法
- Golang的演化历程
- 浅析VO、DTO、DO、PO的概念、区别和用处