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. 图论trainning-part-1 F. Highways

    F. Highways Time Limit: 1000ms Memory Limit: 10000KB 64-bit integer IO format: %lld      Java class ...

  2. NYOJ 7 街区最短路径问题

    街区最短路径问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 一个街区有很多住户,街区的街道只能为东西.南北两种方向. 住户只可以沿着街道行走. 各个街道之间的间 ...

  3. Working out (DP)

    Summer is coming! It's time for Iahub and Iahubina to work out, as they both want to look hot at the ...

  4. 原生 ajax get请求数据

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

  5. LINUX远程强制重启/proc/sys/kernel/sysrq /proc/sysrq-trigger

    1.     # echo 1 > /proc/sys/kernel/sysrq 2.     # echo b > /proc/sysrq-trigger 1. /proc/sys/ke ...

  6. HDU4405-Aeroplane chess(概率DP求期望)

    Hzz loves aeroplane chess very much. The chess map contains N+1 grids labeled from 0 to N. Hzz start ...

  7. angular中ng-repeat去重

    [html] view plain copy print?在CODE上查看代码片派生到我的代码片 <div ng-app="myApp" ng-controller=&quo ...

  8. *Codeforces587E. Duff as a Queen

    $n \leq 200000$的序列,支持以下$q \leq 4e4$个操作:区间异或$k$:查询区间能异或出多少不同的数.数字$0 \leq a_i \leq 1e9$. 大概是要区间线性基.区间修 ...

  9. Mysql安装及自动化部署脚本方案

    一.简介 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库, 每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据. 我们也可以将数据存储在文件中,但是 ...

  10. JDBC 数据库连接 Java操作数据库 jdbc快速入门

    JDBC基本概念 Java DataBase Connectivity 数据库连接 java操作数据库 本质上(sun公司的程序员)定义的一套操作关系型数据库的规则 既接口  更新内容之前 代码 pa ...