快乐虾

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

 




Logo

更多推荐