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

来源:互联网 发布:方舟生存进化帧数优化 编辑:程序博客网 时间:2024/06/04 00:43

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

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

struct ProjectInfo;typedef std::map<std::string, ProjectInfo *> DependProjects;//一个 VC 项目的信息struct ProjectInfo{ProjectInfo(): uiDependencyCount_(0), uiDependencyLevel_(0){}std::stringsProjectNameLowerCase_;//小写项目名字(唯一),专用于查找DependProjectsprjDepends_;//本项目隐式依赖的项目列表UINT32uiDependencyLevel_;//依赖层次,层次越小的项目越早 BuildUINT32uiDependencyCount_;//本项目被多少个项目依赖,计数越大的越早 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{//按依赖层次排序,层次小的优先 Buildif( lhs->uiDependencyLevel_ < rhs->uiDependencyLevel_ )return true;if( lhs->uiDependencyLevel_ > rhs->uiDependencyLevel_ )return false;//按依赖此项目的项目个数排序,依赖计数大的优先 Buildreturn lhs->uiDependencyCount_ > rhs->uiDependencyCount_;}};


0 0
原创粉丝点击