大量 vcproj 构建顺序管理工具的实现(二)

本文详细阐述了如何解析并排序模块依赖关系,包括初始化处理、遍历依赖、累加依赖计数及最终使用STL排序算法的过程。

.bat / .sln / .vcproj 文件的解析后续再说,这里先讨论下模块依赖关系的排序。

假设我们通过上一步获取了模块之间的依赖关系了,存储为这种结构:

struct ProjectInfo;
typedef std::map<std::string, ProjectInfo *> DependProjects;
//一个 VC 项目的信息
struct ProjectInfo
{
	ProjectInfo(): uiDependencyCount_(0), uiDependencyLevel_(0)
	{}

	std::string		sProjectNameLowerCase_;	//小写项目名字(唯一),专用于查找
	DependProjects	prjDepends_;			//本项目隐式依赖的项目列表

	UINT32			uiDependencyLevel_;		//依赖层次,层次越小的项目越早 Build
	UINT32			uiDependencyCount_;		//本项目被多少个项目依赖,计数越大的越早 Build
};


先描述一下具体的排序算法:

1)遍历初始项目列表,取出完全无任何依赖关系的项目(prjDepends_ 字段无任何元素的项目)放入已处理项目列表内,设置其 uiDependencyLevel_ 为 1

2)在无限循环里遍历初始项目列表,取出所依赖项目都在已处理项目列表内的那些项目,以遍历次数设置其 uiDependencyLevel_ 为 2,3 ...,直到初始项目列表为空

3)双重循环累加项目内的 uiDependencyCount_ 字段

4)最后是STL排序算法需要的 functor 定义

//给项目排序,2字段排序
struct Pred_ByBuildOrder
{
	bool operator()(ProjectInfo const *lhs, ProjectInfo const *rhs) const
	{
		//按依赖层次排序,层次小的优先 Build
		if( lhs->uiDependencyLevel_ < rhs->uiDependencyLevel_ )
			return true;
		if( lhs->uiDependencyLevel_ > rhs->uiDependencyLevel_ )
			return false;

		//按依赖此项目的项目个数排序,依赖计数大的优先 Build
		return lhs->uiDependencyCount_ > rhs->uiDependencyCount_;
	}
};


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值