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的结果

Vs2012在Linux开发中的应用(6):改写Makefile项目的Build过程的更多相关文章

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

    在Linux的开发过程中使用过多个IDE.code::blocks.eclipse.source insight.还有嵌入式厂商提供的各种IDE.如VisualDsp等,感觉总是不如vs强大好用.尽管 ...

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

    VS的项目属性表实际上是由一系列的XML文件定义的,都存放在C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\2052文件夹下.我们全然能够 ...

  3. Android应用开发中,第三方集成新浪微博(sinaWeiboSDK)的过程记录

    作为一个android开发人员,不可避免的要学会使用和集成第三方API的能力 而新浪微博作为现在最主要的新闻速递媒体,使用十分普遍,并且提供了较为详细的API接入方法,故此选择集成sinaWeibiS ...

  4. Unity中加入Android项目的Build步骤

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 简介: 有的项目需要在Android中加入Unity功能,例如ANDROID应用中嵌入Un ...

  5. Vs2013在Linux开发中的应用(19): 启动gdb

    快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 1.1    载入调试引擎 因为我们无法干预VC的调试引擎载入.但能够侦听VC的调试引擎载入事件, ...

  6. 4、linux开发中常用指令

    1.cat /proc/device 可以查看各个全部字符设备和块设备,在register_chrdev中设置的名字在打印出来的信息中可以看到:2.top 可以看各个应用程序占用CPU量及PID等信息 ...

  7. linux开发中常用的命令及技巧(连载)

    1.在内核或uboot目录下搜索相关内容/文件名时:grep "USB" * -nR find -name "*USB*" 2.查看系统中设备 cat  /pr ...

  8. eclipse中java项目的build path详解

    BuildPath中只支持加入jar文件,具体方法如下:在eclips里在工程名上右键->build path->contigure bud path->java build pat ...

  9. eclipse中java项目的build path详解(转载)

    BuildPath中只支持加入jar文件,具体方法如下:在eclips里在工程名上右键->build path->contigure bud path->java build pat ...

随机推荐

  1. BNUOJ4359 无爱编号

    无爱编号 Time Limit: 2000ms Memory Limit: 65536KB   64-bit integer IO format: %lld      Java class name: ...

  2. windows下在指定目录下打开命令行

    直接用cd的话比较麻烦,可以先进入制定目录后,按住shift键,鼠标右键可以选择“在此处打开命令窗口”

  3. 九度oj 题目1447:最短路

    题目描述: 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线 ...

  4. 14-new和this

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  5. redis主从原理介绍(三)

    博客参考:散尽浮华的Redis主从复制下的工作原理梳理 此作者写的非常好,此处只做挪用,方便自己查看. Redis主从复制的配置十分简单,它可以使从服务器是主服务器的完全拷贝.需要清除Redis主从复 ...

  6. BZOJ 2127 happiness ——网络流

    [题目分析] 基本上是第一次真正的使用最小割的模型. 同时加上一个数然后最后再减去是处理负数的一种方法. 设立出来最小割的模型然后解方程是一件很重要的事情,建议取一个相对来说比较简单的值带入求解. 这 ...

  7. BZOJ 1026: [SCOI2009]windy数 【数位dp】

    Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? In ...

  8. 常州模拟赛d3t1 神在夏至祭降下了神谕

    题目描述 我们村子在过去的400年中,断绝与下界的接触,过着自给自足的生活. 夏至祭是一场迎接祖灵于夏季归来,同时祈求丰收的庆典. 村里的男人会在广场上演出夏之军和冬之军的战争.夏之军会打倒冬之军的大 ...

  9. 【树状数组区间修改区间求和】codevs 1082 线段树练习 3

    http://codevs.cn/problem/1082/ [AC] #include<bits/stdc++.h> using namespace std; typedef long ...

  10. 背单词(bzoj 4567)

    Description Lweb 面对如山的英语单词,陷入了深深的沉思,“我怎么样才能快点学完,然后去玩三国杀呢?”.这时候睿智 的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他的计 ...