找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 8920|回复: 6

MPC使用介绍(一)

[复制链接]
发表于 2008-4-22 12:49:58 | 显示全部楼层 |阅读模式
学习ACE也是很久以前的事情了,但是一直没有接触到MPC,最近学习CORBA,使用了TAO作为CORBA库,在使用的过程中简单接触了一下MPC,但是由于MPC的相关文档都是英文的,对于文不好的人是一种折磨(包括本人),因此有了翻译一个MPC文档的想法,原本在早前是看到一个更相信的MPC帮助文档的,但是学习的时候却怎么也找不到了(如果有谁找到了,请告诉我,谢谢),因此我翻译的是基于1.4a的(原文在http://downloads.ociweb.com/MPC/html/MakeProjectCreator.html),如果有什么不足之处,欢迎大家指出来。同时也欢迎大家转载,不过希望能注明出处ACE开发者



1. MPC介绍

MPC是一个用来从mpc文件中生成不同编译工具所支持的项目文件的工具。MPC项目文件是构造单一编译目标的源文件的集合。MPC使用平台特定的输入和mpc文件一起生成不同编译工具所支持的项目文件,如:makefile, Visual C++工作区和项目文件,Visual Studio解决方案和项目文件,等。MPC同特定的项目文件相比有如下优点:能够最大限度的减少需要维护的项目文件数量;同时支持项目继承;语法简单,易于维护;等。


2. 使用MPC

一个MPC项目由一系列描述不同编译目标(如库和可执行文件)的参数集合,这些参数包括目标名称、包含路径、源文件、头文件等。一个或多个MPC项目可以定义在一个单独的mpc文件中。而MPC工作区是一系列项目的集合。
项目可以通过mpc.pl脚本来生成,一个或多个mpc文件可以通过命令行选项来传递到mpc.pl脚本进行处理。如果没有mpc文件被指定,则脚本会自动搜索项目相关文件(如源文件、头文件等)并组合成一个项目。
下图显示了如何通过mpc.pl生成项目文件:
(本来想上传附件的,结果没法上传,请大家参考原文图片)


如果需要生成工作区,则必须使用mwc.pl脚本来生成。该脚本会通过mpc文件生成相应的项目并基于这些项目创建一个工作区。如果没有mwc文件传递到脚本,则脚本会在当前目录以及所有子目录下搜索所有的mpc文件来组合成一个工作区。对于基于make的项目类型(如:make、gnumake、bmake、nmake),工作区是一个顶层的makefile;而对于如Visual Studio一样的基于GUI的工具,工作区则是集合了所有项目的一个顶层工作区文件。
下图显示了如何通过mwc.pl生成工作区文件:
(本来想上传附件的,结果没法上传,请大家参考原文图片)

2.1 支持的生成工具

MPC可以生成多个生产工具所支持的项目和工作区。表1列出了MPC支持的类型(由MPCMWC-type命令行选择指定)以及对应的生成工具(原文与此有些区别,我使用的是ACE 5.6中支持的类型,?表示不确定,空表示不清楚,有知道的请告诉我,谢谢):

表1. 支持的生成工具
类型生成工具
automakeGNU Automake
bcb2007Borland C++ Builder ?
bds4
bmakeBorland Make
borland
ccCC/GCC ?
em3Microsoft eMbedded Visual C++ 3.0 & 4.0
ghsGreen Hills C++ Builder
gnuaceGNU Make for ACE/TAO only (ACE扩展)
gnuautobuildGNU Auto Build
htmlHTML ?
make普通make,通过该模式生成的makefile可以用于各种make工具,但是,因为配置原因,不能同ACE/TAO扩展一起使用。
nmakeMicrosoft NMake
sleVisual SlickEdit
vc6Visual C++ 6.0
vc7Visual C++ 7.0
vc71Visual C++ 7.1
vc8Visual C++ 8.0

2.2 命令行

工作区创建器(mwc.pl)和项目创建器(mpc.pl)的命令行选项是一致的。项目创建器用于通过从命令行传入的mpc文件来生成一个或多个工程,工作区创建器用于生成一个或多个工作区以及工作区相关的项目。表2描述了支持的命令行选项,其中粗体字表示常用选项,斜体字表示项目相关选项:

表2. 命令行选项
选项描述
-base该选项允许强制项目继承指定的项目,该选项可以多个同时使用来强制继承多个项目。
-exclude如果该选项同mwc.pl一起使用,则在搜索mpc文件时,用逗号分隔的目录或者mwc文件将会排除在所搜路径之外,每个需要排除的元素都应该使用相对于起始路径的路径来指定;如果该选项同mpc.pl一起使用,则没有任何作用。
-expand_vars该选项指定MPC使用环境变量的值(同-use_env选项一起使用)或者通过-relative选项指定的值来直接替换$()变量。
-feature_file该选项允许用户覆盖缺省的特性文件(MPC/config/default.features或者ACE_wrappers/bin/MakeProjectCreator/config/default.features)。该文件中的特性值将覆盖config目录下的global.features文件中的相应特性值。参见特性文件
-features在处理之前设置特性列表,该列表需要使用逗号进行分割且不能有空格。
-genins该选择指定MPC在处理完每一个项目之后生成一个“安装”文件。这些“安装”文件可以同prj_install.pl脚本一起使用,该脚本会拷贝部分项目相关文件到用户指定的位置。
-global该选项指定全局输入文件。该文件中的所有值将会应用到所有生成的项目文件中去,该选项的缺省值是ACE_wrappers/bin/MakeProjectCreator/global.mpb或者MPC/config/global.mpb
-hierarchy如果该选项同mwc.pl一起使用,则会在执行目录和处理的每个mpc文件之间的目录下生成一个工作区文件;该选项同mpc.pl一起使用没有任何作用。该选项在生成“make”相关的工作区文件时为确实选项。
-include该选项用于添加所有包含路径。这些搜索路径用于定位基础项目文件、模板输入文件以及模板。该选项可以在同一命令行上指定多次。
-into将输出文件放到由选项参数指定的路径中去,该路径必须是全路径。
-language该选项用于指定在生成项目时使用的语言。缺省语言为cplusplus,同时也支持csharpjavavb
-make_coexistence基于make的项目通常的工作区文件为Makefilebmakenmake)。该选项使用后面介绍的方式来使不同的make类型的项目文件可以共存于同一个目录:
bmake
nmake的工作区文件将不再为Makefile,而是工作区名称后跟项目类型后缀(.bmake或者.nmake)。
-name_ modifier该选项允许用户更改输出的项目文件名和工作区文件名。这些文件名通常由mpc文件和mwc文件来决定,但是仍然可以通过模式来进行替换。通过该选项传入的参数将会作为模式来使用,并且任何在模式中出现的星号(*)将会使用项目文件名和工作区文件名来进行替换,这些用来进行替换的项目文件名和工作区文件名由生成的文件类型来决定。
-apply_project该选项只能同-name_ modifier选项一起使用才起作用。当同-name_ modifier一起使用时,模式将会同时应用到项目名称。
-noreldefs该选项指定不要生成缺省的关联定义。关于关联定义可以参考-relative选项。
-notoplevel该选项要求mwc.pl只生产工作区相关的项目文件,而不要生成关联的工作区文件;该选项要求mpc.pl只处理传入的mpc文件,但不要生成任何项目文件。
-recurse递归的搜索当前目录以及子目录下的文件。如果目录由逗号分隔的列表传入(如:-recurse=examples,apps,TAO),则在搜索时排除这些目录。
-relative使用相对路径来替换$()指定的变量。缺省情况下,所有以_ROOT结尾的环境变量都将自动作为相对路径替换符来使用。更多信息参考下面的-relative选项介绍
-template该选项允许用户指定替换模板。每一个有自己的模板的项目和该选项指定的模板将会替换缺省使用的模板。
-ti每一个项目都有一组模板输入文件。通过该选项,可以为某一个特定的项目类型覆盖缺省的模板输入文件。更多信息参考下面的-ti选项介绍
-type该选项指定生成的项目和工作区类型。该选项可以多次使用来一次生成多个不同类型的项目和工作区。
-use_env该选项告诉MPC使用相应的环境变量来替换所有$()变量,而不是使用-relative选项指定的值来进行替换。
-static指定生成静态库类型的项目文件,缺省情况下生成动态库类型的项目文件。
-value_project该选项通过命令行来覆盖mpc项目设置,该选项能够为项目生成新的名称/值对,但是,该选项指定的必须是有效的项目名称/值对。更多信息参考下面的-value_project选项介绍
-value_template该选项通过命令行来覆盖已经存在的模板输入值,该选项能够为项目生成新的名称/值对。更多信息参考下面的-value_template选项介绍
-version输出MPC版本,不进行任何处理。
-complete该选项用于生成tcsh的complete命令来允许tcsh用户对文件名和选项进行补全。

2.2.1 选项补充说明

下面是对-relative-ti-value_project-value_template选项的一些补充说明:

2.2.1.1 -relative选项

某些项目类型不支持通过$()来访问环境变量,但是MPC必须要保证在这些情况下生成的项目可用。为了避免在这种情况下,生成的项目文件中没有$(),相对路径将会在需要的时候用于替换$()变量。

-relative选项需要一个名称/值对的参数。如:

mwc.pl -relative PROJ_TOP=/usr/projects/top

在上面的例子中,如果$(PROJ_TOP)在任何mpbmpcmpd或者mpt文件中作为变量出现,那么将会使用相对于/usr/projects/top的路径来替换该变量。如,如果一个在/usr/projects/top/dir下的mpc文件中有如下内容:

project {
includes += $(PROJ_TOP)
}


那么,在生成的项目文件中将会有类似如下的内容:

CPPFLAGS += -I..

在这种情况下,$(PROJ_TOP)字符串将根据mpc文件所在的路径相对于由选项所指定的路径的路径来进行替换。


2.2.1.2 -ti选项

-ti选项允许用户针对不同的生成类型指定不同的模板输入文件。模板输入文件对应四种不同的分类:dlllibdll_exelib_exe。并不是所有的项目类型都区分这四种分类,但是不同项目类型的模板都会同不同的模板输入文件进行组合,并根据不同的生成类型来产生不同的输出结果。

-ti选项用于覆盖缺省的模板输入文件名,-ti选项使用单一的形如type:file的参数,type是上面提到的四种分类中的一种,file是在包含所搜路径中能找到的的mpt文件除去后缀的文件名称。

下面的例子给出了-ti选项的用法。该用法指出当生成静态库类型的项目(lib)时,使用vc7lib模板输入文件;而当生成动态库类型的项目(dll)时,使用vc7dll模板输入文件。

mpc.pl -type vc71 -ti lib:vc7lib -ti dll:vc7dll

上面例子中的情况在vc71类型中正好是缺省情况,但是同样描述出可以为不同分类指定不同的模板输入文件。

2.2.1.3 -value_project选项


-value_project在需要修改一个或多个mpc文件中的MPC变量时非常有用。例如,当你想在所有生成的项目中增加一个搜索路径的时候,可以使用如下命令:

mwc.pl -value_project includes+=/include/path

在上面的例子中,MPC会在所有生成的项目文件中增加/include/path作为搜索路径。


2.2.1.4 -value_template选项

该选项用于修改或增加模板输入名称/值对。例如,当你想为vc71类型的项目仅仅生成Release编译目标的时候,可以使用如下的命令:

mwc.pl -type vc71 -value_template configurations=Release


需要了解已经定义好的模板输入变量,请参考如下mpd文件($ACE_ROOT/bin/MakeProjectCreator/templates/*.mpd$MPC_ROOT/templates/*.mpd)并搜索使用<%%>括起来的名称。所有不是项目关键字(见预定义关键字)的名称都是模板变量。

2.3 环境变量

MPC使用部分环境变量来改变处理任务的方式。下面是能影响MPC的一些环境变量:

MPC使用环境变量MPC_COMMANDLINE来添加到mwc.pl脚本和mpc.pl脚本的命令行选项来影响执行的效果,该环境变量的值会添加到任何实际通过命令行传入的选项之前。

环境变量MPC_DEPENDENCY_COMBINED_STATIC_LIBRARY只影响项目类型为em3、vc6、vc7、vc71和vc8的静态库类型的项目的工作区依赖关系。如果该环境变量被设置,MPC将会为单个工作区中的项目生成项目见的依赖关系,这通常并不是用户想要的结果,因为这些依赖关系通常会产生副作用。

如果环境变量MPC_LOGGING被设置,MPC会解析值并根据设置来提供普通信息、警告信息和诊断信息。如果值包含info=1MPC会输出普通信息;如果值包含warn=1MPC会输出警告信息;如果值包含diag=1MPC会输出诊断信息;如果只包含detail=1MPC会输出相信的信息;没有前面提到的都没有,MPC会采取同MPC_SILIENT一样的处理方式。

环境变量MPC_SILIENT告诉只输出错误信息。不过,处理指示仍然会输出。
如果环境变量MPC_VERBOSE_ORDERING被设置,而在“after”中引用的项目还未处理,则MPC会对用户发出警告。该环境变量仅仅影响mwc.pl脚本。


[ 本帖最后由 earthdog 于 2008-4-22 13:04 编辑 ]
发表于 2008-9-5 11:09:08 | 显示全部楼层
我现在正在学基于c++的CORBA编程,程序要在linux下运行,要写makefile,但苦于是新手,写起来较困难,看到您提供的mpc生成makefile,很高兴,向学习一下。谢谢你提供的宝贵的资源。
发表于 2008-9-5 11:21:12 | 显示全部楼层
谢谢楼主提供的资源,能提供全部的吗?
发表于 2008-9-5 12:22:46 | 显示全部楼层
谢谢楼主的分享!!
 楼主| 发表于 2008-10-28 19:31:02 | 显示全部楼层

回复 #3 qiluruanjian 的帖子

很抱歉没有及时回复你的问题,因为最近一直比较忙,其实关于完整的MPC在最开始我就一起贴出来了,由于发帖字数的限制,总共五个部分:
MPC使用介绍(一)
MPC使用介绍(二)
MPC使用介绍(三)
MPC使用介绍(四)
MPC使用介绍(五)

[ 本帖最后由 earthdog 于 2008-10-28 19:32 编辑 ]
 楼主| 发表于 2008-10-29 10:48:39 | 显示全部楼层
补充一个单独的MPC下载地址:
MPC下载
发表于 2009-8-21 13:31:29 | 显示全部楼层
楼主的工作成果相当有价值!
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-3-29 16:10 , Processed in 0.018118 second(s), 7 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表