Vs2012在Linux开发中的应用(6):改写Makefile项目的Build过程

MSBUILD的编译过程实际上是依据一系列的targets文件定义的。当我们在IDE运行生成、批生成、清理命令的时候。VS会查找这些命令相应的Task并运行它,以下我们逐个分析这个过程。

当运行生成操作时,MSBUILD将运行一个叫”Build”的任务,在targets文件里是这样定义的:

  <Target

      Name="Build"

      Condition=" '$(_InvalidConfigurationWarning)' !='true' "

      DependsOnTargets="$(BuildDependsOn)"

      Returns="@(ManagedTargetPath);@(WinMDFullPath)">

    <ItemGroup>

      <ManagedTargetPathInclude="$(TargetPath)" Condition="'$(ManagedAssembly)' == 'true'" />

    </ItemGroup>

  </Target>

这里的BuildDependsOn定义为:

    <BuildDependsOn>

     _PrepareForBuild;

     $(BuildSteps);

     AfterBuild;

     FinalizeBuildStatus;

    </BuildDependsOn>

将BuildSteps扩展开:

    <BuildStepsCondition="'$(BuildSteps)' == ''">

     ResolveReferences;

     PrepareForBuild;

     InitializeBuildStatus;

     BuildGenerateSources;

     BuildCompile;

     BuildLink;

    </BuildSteps>

也就是说MSBUILD将依次运行这几个任务:

     _PrepareForBuild;

     ResolveReferences;

     PrepareForBuild;

     InitializeBuildStatus;

     BuildGenerateSources;

     BuildCompile;

     BuildLink;

     AfterBuild;

     FinalizeBuildStatus;

但当我们的项目是使用Makefile编译的时候。并不须要让MSBUILD控制整个过程,由于这个过程已经在Makefile中完毕了,我们仅仅要重载Build这个任务就能够了。

  <Target

      Name="Build"

      Condition=" '$(GNUProjectType)' == 'UBoot' or'$(GNUProjectType)' == 'LinuxKernel' or '$(GNUProjectType)' == 'LinuxMakeApp' "

    >

    <EmbedLinuxMakeTask

      TargetName="Build"

      ProjectDir="$(ProjectDir)"

      HostIp="$(HOST_IP)"

      HostUser="$(HOST_USER)"

      HostPasswd="$(HOST_PASSWD)"

      Python2="$(PYTHON2_EXE)"

      PythonFile="$(PythonFile)"

      />

  </Target>

当然,在此之前须要告诉MSBUILD,EmbedLinuxMakeTask这个任务在哪里:

  <UsingTaskTaskName="EmbedLinuxMakeTask" AssemblyFile=" EmbedLinux.dll" />

这样当编译UBOOT、内核或者使用Makefile的应用程序时,MSBUILD将自己主动运行EmbedLinux.dll中定义的EmbedLinuxMakeTask这一任务。!

在这个任务的实现中,我们将运行由PythonFile指定的脚本,并将此脚本的输出重定向到VS的编译信息输出窗体中。这个脚本做为项目文件的一部分,须要完毕编译和错误信息转换的功能。而SSH登录的操作则是一个通用的操作,放在任务的实现代码中。

EmbedLinuxMakeTask的运行过程为:

Ø  载入python2.exe

Ø  在PYTHON中写入VS中的环境变量

Ø  定义默认的编译和信息转换的行为

Ø  载入项目中指定的编译脚本。改写默认行为

Ø  開始运行登录操作

Ø  运行编译操作,在编译过程中完毕错误信息的转换

Ø  返回Make的结果

原文地址:https://www.cnblogs.com/wzzkaifa/p/6891337.html