.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_;
}
};

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

被折叠的 条评论
为什么被折叠?



