BREW Makefile 生成工具的编写

来源:互联网 发布:政府网站域名 编辑:程序博客网 时间:2024/05/21 09:14

 

  之前一直使用高通的BREW Makefile VC插件来生成Makefile,遇到了一些问题。

 

1.如果VC项目的文件放在多个子目录下的话,只会生成子目录的c文件规则,漏掉了cpp文件规则。

2.头文件包含目录转换有误。会将包含环境变量的头文件目录前后加上&quot字符。

3.cpp工程要想使用不同的编译器的话(RealView/GCC),需要手动将BREW SDK Tools目录下的CppAppTemplate.mak替换为RVCT40或GCC模板文件。这种替换有时还会导致插件不能工作,一直没有找到保险的规律。

 

  除此之外,还有ARM编译器默认不能使用全局变量等问题,不过可以靠修改BREW SDK Tools的模板文件来解决。但前述三个问题,并没有写死在模板文件里,需要经常修改,很是麻烦。因此产生了自己写一个BREW Makefile 生成工具的想法。

 

  生成工具的主要参考是一个用VC2005的vcproj文件生成对应的makefile文件的技术文章,期间还尝试制作了VC插件和安装程序。下面记录一下开发过程中的关键点和相应的参考资料。

 

一.Microsoft.VisualStudio.VCProjectEngine

  使用这个类以及VCProject类可以轻松得到项目包含的文件以及项目的各种设置,省去了自己解释.vcproj这个xml文件的麻烦。具体使用方法可见

  Tool for Converting VC++2005 Project to Linux Makefile

  http://www.codeproject.com/KB/cross-platform/sln2mak.aspx

 

二.VC插件

  参照上面的文章,制作了一个生成makefile的命令行工具,使用上不如高通的VC插件方便。经过查找一些资料,发现制作一个VC的插件,也不是很困难的事情。VC里甚至有一个向导来帮助生成大部分辅助代码(新建项目->其它项目类型->扩展性->Visual Studio外接程序)。这方面比较好的资料有

  Line Counter - Writing a Visual Studio 2005 & 2008 Add-In

  http://www.codeproject.com/KB/macros/LineCounterAddin.aspx

 

  如果选择用C#来编写插件,那么向导会生成一个Connect.cs文件。

  这个文件里的OnConnection方法决定了插件的表现形式,是放到某个菜单里,还是放到工具栏里。我在这里碰到一个问题,无法正确得到“Tools”菜单的中文名,最后不得已将菜单名强制设为“工具”。

 

  当点击了插件项后,就会执行这个文件的Exec函数。我在这里新建了一个窗口,让用户选择编译器,当用户点击生成时,调用一里面编写好的转换工具,生成makefile。另外外接程序主类里的_applicationObject对象,可以访问到当前工程。

 

BREW Makefile 生成工具

 

三、安装程序

  其实这个项目,我遇到的最大困难是制作一个安装文件。我需要把插件的.dll文件和.addin文件拷贝到目标电脑的“我的文档”下的相应目录,并设置一些环境变量。VC里也有一个安装工程(新建项目->其它项目类型->安装和部署->安装项目)。这个工程不用写一行代码,就可以把文件拷贝到安装程序指定的目录下。但是我没有发现简单的解决我上面两个需求的方法。直到我看到了这篇文章。

  A Custom Action for Deploying a Visual Studio 2005 Add-in

  http://www.codeproject.com/KB/install/AddinCustomAction.aspx

 

  基本的思路是继承安装程序类,除了执行基类的操作外,再写代码执行拷贝文件、注册环境变量等特殊操作。

 

四、其它问题

http://www.mztools.com/articles/2005/MZ2005003.aspx

这个网站上有很多关于插件的文章。我在上面找到了如何从VS的命令行启动插件的方法。

 

关于插件从VS菜单里消失的问题,这个网站也做了详细解释。

如果在插件的OnConnection事件里,处理的connectMode是ext_ConnectMode.ext_cm_UISetup,则这个插件的UI输入永久加入。意思是VS第一次检测到这个事件时,发送ext_ConnectMode.ext_cm_UISetup给插件,加入插件UI,之后不会在主动发送这个事件。如果这之后出现什么问题,导致插件UI丢失,就需要通知VS重新发送这个事件。方法有二:

 

a.找到插件的.addin文件。将它移动到VS无法自动侦测的目录。启动一次VS。移回来,再次启动VS。

   VS又会认为这是一个新插件,并发送UISetup事件。

 

b.启动VS时加参数 devenv.exe /reset

   VS会重置插件,发送UISetup事件