zoukankan      html  css  js  c++  java
  • 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的结果

  • 相关阅读:
    SPLAY,LCT学习笔记(五)
    SPLAY,LCT学习笔记(四)
    SPLAY,LCT学习笔记(三)
    NOI 2012 随机数生成器
    SPLAY,LCT学习笔记(二)
    SPLAY,LCT学习笔记(一)
    bzoj 1503 郁闷的出纳员
    bzoj 1112 poi 2008 砖块
    bzoj 1064 noi2008 假面舞会题解
    数论知识点总结(noip范围)
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/6891337.html
Copyright © 2011-2022 走看看