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. ctype.h 第2章

    ctype.h ctype.h是c标准函数库中的头文件   定义了一批c语言字符分类函数   (c character classification functions) 用于测试字符是否属于特定的字 ...

  2. EXPDP/IMPDP任务的查看与管理

    EXPDP/IMPDP相比传统的exp/imp的最本质区别在于服务器端执行,客户端发出指定后,通过API启动服务器的备份job,在执行过程中,可以拿下Ctrl+C组合键,退出当前交互模式,退出之后,导 ...

  3. [BZOJ2342] [Shoi2011]双倍回文(manacher)

    传送门 manacher...... 先跑一边manacher是必须的 然后枚举双倍回文串的对称轴x 把这个双倍回文串分成4段,w wR w wR 发现,只有当 y <= x + p[x] / ...

  4. 【2018.12.10】NOI模拟赛3

    题目 WZJ题解 大概就是全场就我写不过 $FFT$ 系列吧……自闭 T1 奶一口,下次再写不出这种 $NTT$ 裸题题目我就艹了自己 -_-||| 而且这跟我口胡的自创模拟题 $set1$ 的 $T ...

  5. c/s委托练习

    今天玩了玩C/S开发,也随便练习了很久不用的委托 父窗体中写的代码 #region 委托与事件传递    public delegate void TextChangedHandler(string ...

  6. 解决PHP无法接收post超过1000个字段的问题

    今天在做与后台交互的的过程中,发现php对于接收的POST有一个限制,超出1000个字段之后便无法接收,项目要求在不改变PHP配置的情况下通过前端方式解决,通过分析并且网上差一些大牛的资料终于找到了解 ...

  7. Python入门--11--自定义函数

    使用def定义自定义函数 举个栗子: def myfristFunction(): print "we are 伐木累!" #输入myfristFunction() 会输出:we ...

  8. 很好的linux下GPIO驱动详解文章

    原文地址  http://blog.csdn.net/llxmedici/article/details/6282372 打算跟着友善之臂的<mini2440 linux移植开发指南>来做 ...

  9. Hello SpringMVC

    1. MVC框架能做哪些事情? 讲url映射到java类或者方法 封装用户提交的数据 处理请求-调用相关业务处理-封装相应数据 将相应数据进行渲染 jsp/html/freemaker等 ... 2. ...

  10. 每日记录 2016-4-29 HTML5本地存储

    HTML5本地存储 一.HTML5 localStorage 在HTML5中,本地存储是一个window的属性,包括localStorage和 sessionStorage,从名字应该可以很清楚的辨认 ...