📄 proj_tree_builder.cpp
字号:
list<CProjKey>* depends_ids){ depends_ids->clear(); ITERATE(list<string>, p, depends_libs) { const string& id = *p; depends_ids->push_back(CProjKey(CProjKey::eLib, id)); }}bool SMakeProjectT::IsConfigurableDefine(const string& define){ return NStr::StartsWith(define, "@") && NStr::EndsWith (define, "@");}string SMakeProjectT::StripConfigurableDefine(const string& define){ return IsConfigurableDefine(define) ? define.substr(1, define.length() - 2): "";}//-----------------------------------------------------------------------------void SAppProjectT::CreateNcbiCToolkitLibs(const CSimpleMakeFileContents& makefile, list<string>* libs_list){ CSimpleMakeFileContents::TContents::const_iterator k = makefile.m_Contents.find("NCBI_C_LIBS"); if (k == makefile.m_Contents.end()) { return; } const list<string>& values = k->second; ITERATE(list<string>, p, values) { const string& val = *p; if ( NStr::StartsWith(val, "-l") ) { string lib_id = val.substr(2); libs_list->push_back(lib_id); } else { libs_list->push_back(val); } } libs_list->sort(); libs_list->unique();}CProjKey SAppProjectT::DoCreate(const string& source_base_dir, const string& proj_name, const string& applib_mfilepath, const TFiles& makeapp , CProjectItemsTree* tree){ CProjectItemsTree::TFiles::const_iterator m = makeapp.find(applib_mfilepath); if (m == makeapp.end()) { LOG_POST(Info << "No Makefile.*.app for Makefile.in :" + applib_mfilepath); return CProjKey(); } const CSimpleMakeFileContents& makefile = m->second; CSimpleMakeFileContents::TContents::const_iterator k = makefile.m_Contents.find("SRC"); if (k == makefile.m_Contents.end()) { LOG_POST(Warning << "No SRC key in Makefile.*.app :" + applib_mfilepath); return CProjKey(); } //sources - relative pathes from source_base_dir //We'll create relative pathes from them CProjSRCResolver src_resolver(applib_mfilepath, source_base_dir, k->second); list<string> sources; src_resolver.ResolveTo(&sources); //depends list<string> depends; k = makefile.m_Contents.find("LIB"); if (k != makefile.m_Contents.end()) depends = k->second; //Adjust depends by information from msvc Makefile CMsvcProjectMakefile project_makefile ((CDirEntry::ConcatPath (source_base_dir, CreateMsvcProjectMakefileName(proj_name, CProjKey::eApp)))); list<string> added_depends; project_makefile.GetAdditionalLIB(SConfigInfo(), &added_depends); list<string> excluded_depends; project_makefile.GetExcludedLIB(SConfigInfo(), &excluded_depends); list<string> adj_depends(depends); copy(added_depends.begin(), added_depends.end(), back_inserter(adj_depends)); adj_depends.sort(); adj_depends.unique(); PLibExclude pred(excluded_depends); EraseIf(adj_depends, pred); list<CProjKey> depends_ids; SMakeProjectT::ConvertLibDepends(adj_depends, &depends_ids); /////////////////////////////////// //requires list<string> requires; k = makefile.m_Contents.find("REQUIRES"); if (k != makefile.m_Contents.end()) requires = k->second; //project name k = makefile.m_Contents.find("APP"); if (k == makefile.m_Contents.end() || k->second.empty()) { LOG_POST(Error << "No APP key or empty in Makefile.*.app :" + applib_mfilepath); return CProjKey(); } string proj_id = k->second.front(); //LIBS list<string> libs_3_party; k = makefile.m_Contents.find("LIBS"); if (k != makefile.m_Contents.end()) { const list<string> libs_flags = k->second; SMakeProjectT::Create3PartyLibs(libs_flags, &libs_3_party); } //CPPFLAGS list<string> include_dirs; list<string> defines; k = makefile.m_Contents.find("CPPFLAGS"); if (k != makefile.m_Contents.end()) { const list<string> cpp_flags = k->second; SMakeProjectT::CreateIncludeDirs(cpp_flags, source_base_dir, &include_dirs); SMakeProjectT::CreateDefines(cpp_flags, &defines); } //NCBI_C_LIBS - Special case for NCBI C Toolkit k = makefile.m_Contents.find("NCBI_C_LIBS"); list<string> ncbi_clibs; if (k != makefile.m_Contents.end()) { libs_3_party.push_back("NCBI_C_LIBS"); CreateNcbiCToolkitLibs(makefile, &ncbi_clibs); } CProjItem project(CProjKey::eApp, proj_name, proj_id, source_base_dir, sources, depends_ids, requires, libs_3_party, include_dirs, defines); // project.m_NcbiCLibs = ncbi_clibs; //DATATOOL_SRC k = makefile.m_Contents.find("DATATOOL_SRC"); if ( k != makefile.m_Contents.end() ) { //Add depends from datatoool for ASN projects project.m_Depends.push_back(CProjKey(CProjKey::eApp, GetApp().GetDatatoolId())); const list<string> datatool_src_list = k->second; ITERATE(list<string>, i, datatool_src_list) { const string& src = *i; //Will process .asn or .dtd files string source_file_path = CDirEntry::ConcatPath(source_base_dir, src); source_file_path = CDirEntry::NormalizePath(source_file_path); if ( CDirEntry(source_file_path + ".asn").Exists() ) source_file_path += ".asn"; else if ( CDirEntry(source_file_path + ".dtd").Exists() ) source_file_path += ".dtd"; CDataToolGeneratedSrc data_tool_src; CDataToolGeneratedSrc::LoadFrom(source_file_path, &data_tool_src); if ( !data_tool_src.IsEmpty() ) project.m_DatatoolSources.push_back(data_tool_src); } } CProjKey proj_key(CProjKey::eApp, proj_id); tree->m_Projects[proj_key] = project; return proj_key;}//-----------------------------------------------------------------------------CProjKey SLibProjectT::DoCreate(const string& source_base_dir, const string& proj_name, const string& applib_mfilepath, const TFiles& makelib , CProjectItemsTree* tree){ TFiles::const_iterator m = makelib.find(applib_mfilepath); if (m == makelib.end()) { LOG_POST(Info << "No Makefile.*.lib for Makefile.in :" + applib_mfilepath); return CProjKey(); } CSimpleMakeFileContents::TContents::const_iterator k = m->second.m_Contents.find("SRC"); if (k == m->second.m_Contents.end()) { LOG_POST(Warning << "No SRC key in Makefile.*.lib :" + applib_mfilepath); return CProjKey(); } // sources - relative pathes from source_base_dir // We'll create relative pathes from them) CProjSRCResolver src_resolver(applib_mfilepath, source_base_dir, k->second); list<string> sources; src_resolver.ResolveTo(&sources); // depends - TODO list<CProjKey> depends_ids; k = m->second.m_Contents.find("ASN_DEP"); if (k != m->second.m_Contents.end()) { const list<string> depends = k->second; SMakeProjectT::ConvertLibDepends(depends, &depends_ids); } //requires list<string> requires; k = m->second.m_Contents.find("REQUIRES"); if (k != m->second.m_Contents.end()) requires = k->second; //project name k = m->second.m_Contents.find("LIB"); if (k == m->second.m_Contents.end() || k->second.empty()) { LOG_POST(Error << "No LIB key or empty in Makefile.*.lib :" + applib_mfilepath); return CProjKey(); } string proj_id = k->second.front(); //LIBS list<string> libs_3_party; k = m->second.m_Contents.find("LIBS"); if (k != m->second.m_Contents.end()) { const list<string> libs_flags = k->second; SMakeProjectT::Create3PartyLibs(libs_flags, &libs_3_party); } //CPPFLAGS list<string> include_dirs; list<string> defines; k = m->second.m_Contents.find("CPPFLAGS"); if (k != m->second.m_Contents.end()) { const list<string> cpp_flags = k->second; SMakeProjectT::CreateIncludeDirs(cpp_flags, source_base_dir, &include_dirs); SMakeProjectT::CreateDefines(cpp_flags, &defines); } CProjKey proj_key(CProjKey::eLib, proj_id); tree->m_Projects[proj_key] = CProjItem(CProjKey::eLib, proj_name, proj_id, source_base_dir, sources, depends_ids, requires, libs_3_party, include_dirs, defines); return proj_key;}//-----------------------------------------------------------------------------CProjKey SAsnProjectT::DoCreate(const string& source_base_dir, const string& proj_name, const string& applib_mfilepath, const TFiles& makeapp, const TFiles& makelib, CProjectItemsTree* tree){ TAsnType asn_type = GetAsnProjectType(applib_mfilepath, makeapp, makelib); if (asn_type == eMultiple) { return SAsnProjectMultipleT::DoCreate(source_base_dir, proj_name, applib_mfilepath, makeapp, makelib, tree); } if(asn_type == eSingle) { return SAsnProjectSingleT::DoCreate(source_base_dir, proj_name, applib_mfilepath, makeapp, makelib, tree); } LOG_POST(Error << "Unsupported ASN project" + NStr::IntToString(asn_type)); return CProjKey();}SAsnProjectT::TAsnType SAsnProjectT::GetAsnProjectType(const string& applib_mfilepath, const TFiles& makeapp, const TFiles& makelib){ TFiles::const_iterator p = makeapp.find(applib_mfilepath); if ( p != makeapp.end() ) { const CSimpleMakeFileContents& fc = p->second; if (fc.m_Contents.find("ASN") != fc.m_Contents.end() ) return eMultiple; else return eSingle; } p = makelib.find(applib_mfilepath); if ( p != makelib.end() ) { const CSimpleMakeFileContents& fc = p->second; if (fc.m_Contents.find("ASN") != fc.m_Contents.end() ) return eMultiple; else return eSingle; } LOG_POST(Error << "Can not define ASN project: " + applib_mfilepath); return eNoAsn;}//-----------------------------------------------------------------------------CProjKey SAsnProjectSingleT::DoCreate(const string& source_base_dir,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -