Vs2012在Linux开发中的应用(6):改写Makefile项目的Build过程
来源:互联网 发布:肩膀疼 知乎 编辑:程序博客网 时间:2024/05/23 05:07
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过程
- Vs2012在Linux开发中的应用(5):项目属性的定义
- Vs2012在Linux开发中的应用(1):开发环境
- Vs2012在Linux开发中的应用(2):方案设计
- Vs2012在Linux开发中的应用(4):公共属性的定义
- Vs2012在Linux开发中的应用(8): 编译Linux内核
- Vs2012在Linux开发中的应用(7): 编译UBOOT
- Vs2012在Linux开发中的应用(9): 编译应用程序
- Vs2012在Linux开发中的应用(10): 参数转换
- Vs2012在Linux开发中的应用(11): 编译单个文件
- Vs2012在Linux开发中的应用(12): 编译静态库
- Vs2012在Linux开发中的应用(13): 添加对x86 Linux的支持
- Makefile 在实际项目中(chiplevel CPM)的应用- build-test
- Makefile 在实际项目中(chiplevel CPM)的应用 build-lib
- Vs2012在Linux开发中的应用(15): 添加可用的调试器
- Vs2012在Linux开发中的应用(3):添加新平台hi3516
- Build Variant在项目中的应用
- Makefile的在工程中的一般性应用
- (LeetCode)Two Sum
- ELF头文件学习
- 第13天 努力啦
- Qt5的插件机制(5)--QLibrary类与QPluginLoader类
- 在树莓派 Rasbian 上安装http服务器和 ftp服务器,远程访问被封
- Vs2012在Linux开发中的应用(6):改写Makefile项目的Build过程
- Qt5的插件机制(6)--开发Qt插件时几个重要的宏
- 个人官网第二次升级顺利完成
- Computer Science Conference Rankings
- [Windows]_[初级]_[Release程序的崩溃报告minidump解决方案]
- 第一章、C#委托和事件(Delegate、Event、EventHandler、EventArgs)
- 安卓第三课:关于第四章中的OPENGL【大方向上的介绍】
- hdu5024 网络赛水题
- JavaScript 中的多线程通信