Vs2012在Linux开发中的应用(9): 编译应用程序

快乐虾

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就只需要发送命令并等待结果!!!

时间: 2024-12-24 08:52:43

Vs2012在Linux开发中的应用(9): 编译应用程序的相关文章

Vs2012在Linux开发中的应用(8): 编译Linux内核

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在有了UBOOT的编译基础之后,编译Linux内核就简单多了,所不同的只有两个地方,一个是错误信息的转换,另一个是内核需要进行参数配置. 1.1    错误信息转换 UBOOT的错误信息中,文件名是不带路径的,而内核的错误信息中,文件名是带相对路径的,因此我们对转换脚本略做修改: #user code begin classCUBootMake: error=False defBuild(sel

Vs2012在Linux开发中的应用(7): 编译UBOOT

在完成前一节所述的操作后,我们就可以尝试在VS下编译UBOOT了. 我们仅仅需要改写项目中的make.py: #user code begin classCUBootMake: error=False defBuild(self,chan): self.error=False exec_command(chan, "cd/work/projects/hi3516dvs_2v/u-boot/v1/u-boot-2010.06 && " "makeARCH=arm

Vs2012在Linux开发中的应用(12): 编译静态库

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 原来以为要生成静态库只需要重载<Lib>任务就可以了: <Target Name="Lib" > <Message Text="lib target" Importance="High" /> <EmbedLinuxLinkTask TargetName="ImpLib" Projec

Vs2012在Linux开发中的应用(11): 编译单个文件

 快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 当按Ctrl+F7编译单个文件的时候,同样会调用ClCompile任务,但有一个很奇怪的问题: 如果我们的文件配置与公共配置不一致: 这个时候MSBUILD会先后再次调用ClCompile的任务,第一次调用的时候会把三个包含目录全部传递进来,第二次调用只会传递两个公共的包含目录. 这一切的罪魁祸首是因为我们在重载ClCompile时少掉了DependsOn这个条件: <Target Nam

Vs2012在Linux开发中的应用(2):方案设计

1.1     代码提示功能 在vs中开发中,Visual Assist是一个非常优秀的插件,我们仍然可以使用它进行代码的分析,但它只能支持vcxproj工程,因而我们选择对vcxproj的工程进行扩展,这样VisualAssist就可以正常使用了. 此外,VS的智能感知不支持GCC的一些扩展,在做代码分析的时候可能出错,我们采用强制包含头文件的方式解决一部分问题: 注意,这个文件的目的是让VS能够进行代码的分析,而不是让VS具有编译这些代码的能力!!! 这个头文件类似于这样的: #pragma

Vs2012在Linux开发中的应用(1):开发环境

在Linux的开发过程中使用过多个IDE,code::blocks.eclipse.source insight.还有嵌入式厂商提供的各种IDE,如VisualDsp等,感觉总是不如vs强大好用.虽然VS并不提供gcc的编译和调试支持,在之前的开发中只能充当一个编辑器的作用,但VS提供了强大的SDK,本文将探讨如何扩展VS,使之支持Linux的开发. 其实像Visual Gdb之类的工具已经有了类似的功能,无非不免费而已,做这件事只有一个原因:好玩-- 1.1     开发环境 主机开发环境:

Vs2012在Linux开发中的应用(5):项目属性的定义

VS的项目属性表实际上是由一系列的XML文件定义的,都存放在C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\2052目录下,我们完全可以仿照它们的定义添加自己的属性页. 首先在项目文件中导入自定义的目标: <Import Condition="$(Platform)=='hi3516'" Project=" EmbedLinux.targets" /> 这里的EmbedLinux.target

Vs2012在Linux开发中的应用(15): 添加可用的调试器

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在VS的调试属性页中列出了此项目可用的调试器: 首先到MSBUILD目录下找这个页面的参数,很容易有收获: C:\Program Files(x86)\MSBuild\Microsoft.Cpp\v4.0\V110\2052\debugger_remote_windows.xml(3):<RuleName="WindowsRemoteDebugger" DisplayName=&

Vs2012在Linux开发中的应用(3):添加新平台hi3516

下面我们将为VS2012添加一个新的平台支持,因为最近在用海思的hi3516,就选它吧! 1.1     复制平台文件 原来一直觉得要让VS支持一个新的平台需要编写代码,某天在看MSBUILD目录的时候突然发现了一个神奇的目录: 新平台的秘密就在这里!! 这里的hi3516原来是没有的,只是为了添加对hi3516这个平台的支持而加上去的.我们将ARM目录复制一份,改名为hi3516. 然后将文件名中的ARM改为hi3516,将hi3516目录下所有文件中的"ARM"字符串替换为&quo