-rw-r--r-- | lib/component_factory.cc | 96 |
1 files changed, 43 insertions, 53 deletions
diff --git a/lib/component_factory.cc b/lib/component_factory.cc index 1253111..a5ced6b 100644 --- a/lib/component_factory.cc +++ b/lib/component_factory.cc @@ -36,8 +36,7 @@ namespace sitecing { try { // XXX: or just compare it off? string noro = strip_prefix(dp,root_source); return; - }catch(utility_no_affix& una) { - } + }catch(utility_no_affix& una) { } // .so binaries try { string noso = strip_suffix(dp,".so"); @@ -51,15 +50,15 @@ namespace sitecing { return; }catch(utility_no_prefix& unp) { throw konforka::exception(CODEPOINT,"component is outside of component root"); - }catch(utility_no_suffix& uns) { - } + }catch(utility_no_suffix& uns) { } + try { // preprocessor targets + string noro = strip_prefix(dp,root_intermediate); for(int ppt=0;ppt<sizeof(pp_targets)/sizeof(*pp_targets);ppt++) { try { - string nos = strip_suffix(dp,pp_targets[ppt]); - string noro = strip_prefix(nos,root_intermediate); - deps.push_back(root_source+noro); - ifstream imports((root_intermediate+noro+".imports").c_str(),ios::in); + string nos = strip_suffix(noro,pp_targets[ppt]); + deps.push_back(root_source+nos); // depends on the source + ifstream imports((root_intermediate+nos+".imports").c_str(),ios::in); if(imports.good()) { string str; while(!imports.eof()) { @@ -68,7 +67,7 @@ namespace sitecing { deps.push_back(root_intermediate+str+".classname"); } } - ifstream ancestors((root_intermediate+noro+".ancestors").c_str(),ios::in); + ifstream ancestors((root_intermediate+nos+".ancestors").c_str(),ios::in); if(ancestors.good()) { string str; while(!ancestors.eof()) { @@ -77,22 +76,19 @@ namespace sitecing { deps.push_back(root_intermediate+str+".classname"); } } - config_options *co_intermediate_deps = config.lookup_config(noro,config_options::flag_intermediate_deps); + config_options *co_intermediate_deps = config.lookup_config(nos,config_options::flag_intermediate_deps); if(co_intermediate_deps) { for(list<string>::const_iterator i=co_intermediate_deps->intermediate_deps.begin();i!=co_intermediate_deps->intermediate_deps.end();++i) deps.push_back(*i); } return; - }catch(utility_no_affix& una) { - // do nothing. must be a cpp dependency. - } + }catch(utility_no_suffix& uns) { } } // compiler targets for(int cct=0;cct<sizeof(cc_targets)/sizeof(*cc_targets);cct++) { try { - string nos = strip_suffix(dp,cc_targets[cct]); - string noro = strip_prefix(nos,root_intermediate); - deps.push_back(root_intermediate+noro+".cc"); + string nos = strip_suffix(noro,cc_targets[cct]); + deps.push_back(root_intermediate+nos+".cc"); config_options *co_cpp_deps = config.lookup_config(noro,config_options::flag_cpp_deps); if( (!co_cpp_deps) || co_cpp_deps->cpp_deps) { ifstream df((root_intermediate+noro+".d").c_str(),ios::in); @@ -101,15 +97,14 @@ namespace sitecing { while(!df.eof()) { df >> str; if(str.find_first_of("\\:")==string::npos) - deps.push_back(combine_path(config.root_source+noro,str)); + deps.push_back(combine_path(config.root_source+nos,str)); } } } // XXX: extra deps like IntermediateDeps? - }catch(utility_no_affix& una) { - // do nothing. - } + }catch(utility_no_suffix& uns) { } } + }catch(utility_no_prefix& unp) { } } bool component_factory::is_uptodate(const string& dst,file_list_t *deps) { @@ -140,8 +135,7 @@ namespace sitecing { string noro = strip_prefix(dp,root_source); // building the sources is left up to developer return; - }catch(utility_no_prefix& unp) { - } + }catch(utility_no_prefix& unp) { } // .so files try { string noso = strip_suffix(dp,".so"); @@ -183,89 +177,85 @@ namespace sitecing { return; }catch(utility_no_prefix& unp) { throw konforka::exception(CODEPOINT,"component is outside of component root"); - }catch(utility_no_suffix& uns) { - } + }catch(utility_no_suffix& uns) { } + try { + string noro = strip_prefix(dp,root_intermediate); // compiler targets for(int cct=0;cct<sizeof(cc_targets)/sizeof(*cc_targets);cct++) { try { - string nos = strip_suffix(dp,cc_targets[cct]); - string noro = strip_prefix(nos,root_intermediate); - string cc = root_intermediate+noro+".cc"; - string o = root_intermediate+noro+".o"; + string nos = strip_suffix(noro,cc_targets[cct]); + string cc = root_intermediate+nos+".cc"; + string o = root_intermediate+nos+".o"; if(access(cc.c_str(),R_OK)) throw konforka::exception(CODEPOINT,string("can't access preprocessed component code (")+cc+")"); make_path(dir_name(cc),0755); - string pwd = dir_name(root_source+noro); + string pwd = dir_name(root_source+nos); auto_chdir dir_changer(pwd); - file_lock lock_source(root_intermediate+noro+".lock"); - file_lock lock_cc(root_intermediate+noro+".o.lock"); - int stdO = open((root_intermediate+noro+".stdout").c_str(),O_CREAT|O_TRUNC|O_WRONLY,0664); + file_lock lock_source(root_intermediate+nos+".lock"); + file_lock lock_cc(root_intermediate+nos+".o.lock"); + int stdO = open((root_intermediate+nos+".stdout").c_str(),O_CREAT|O_TRUNC|O_WRONLY,0664); if(stdO<0) throw konforka::exception(CODEPOINT,"failed to open/create compiler stdout"); - int stdE = open((root_intermediate+noro+".stderr").c_str(),O_CREAT|O_TRUNC|O_WRONLY,0664); + int stdE = open((root_intermediate+nos+".stderr").c_str(),O_CREAT|O_TRUNC|O_WRONLY,0664); if(stdE<0) { close(stdO); throw konforka::exception(CODEPOINT,"failed to open/create compiler's stderr"); } list<string> args; - config_options *co_cpp_flags = config.lookup_config(noro,config_options::flag_cpp_flags); + config_options *co_cpp_flags = config.lookup_config(nos,config_options::flag_cpp_flags); if(co_cpp_flags) { args.insert(args.end(),co_cpp_flags->cpp_flags.begin(),co_cpp_flags->cpp_flags.end()); } // TODO: maybe move it to separare config option like CoreCPPFLags? args.push_back("-I"+root_intermediate); args.push_back("-I"+root_source); - args.push_back("-MD"); args.push_back("-MF"); args.push_back(root_intermediate+noro+".d"); + args.push_back("-MD"); args.push_back("-MF"); args.push_back(root_intermediate+nos+".d"); args.push_back("-c"); args.push_back(cc); args.push_back("-o"); args.push_back(o); // TODO: "g++" configurable int rv = execute("g++",args,stdO,stdE); if(! (WIFEXITED(rv) && !WEXITSTATUS(rv)) ) - throw compile_error(CODEPOINT,"failed to compile component",noro); + throw compile_error(CODEPOINT,"failed to compile component",nos); return; - }catch(utility_no_affix& una) { - // do nothing, not a compiler target - } + }catch(utility_no_suffix& uns) { } } // preprocessor targets for(int ppt=0;ppt<sizeof(pp_targets)/sizeof(*pp_targets);ppt++) { try { - string nos = strip_suffix(dp,pp_targets[ppt]); - string noro = strip_prefix(nos,root_intermediate); - string src = root_source+noro; + string nos = strip_suffix(noro,pp_targets[ppt]); + string src = root_source+nos; if(access(src.c_str(),R_OK)) throw konforka::exception(CODEPOINT,string("can't access component source (")+src+")"); - make_path(dir_name(root_intermediate+noro),0755); - file_lock lock(root_intermediate+noro+".lock"); + make_path(dir_name(root_intermediate+nos),0755); + file_lock lock(root_intermediate+nos+".lock"); sitecing_parser parser(*this); - config_options *co_skeleton = config.lookup_config(noro,config_options::flag_skeleton); + config_options *co_skeleton = config.lookup_config(nos,config_options::flag_skeleton); if(co_skeleton) parser.skeleton = co_skeleton->skeleton; static const char *id_chars = "abcdefghijklmnopqrstuvwxyz0123456789_ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - parser.class_name = normalize_path(noro,strip_leading_slash|strip_trailing_slash); + parser.class_name = normalize_path(nos,strip_leading_slash|strip_trailing_slash); for(string::size_type illc = parser.class_name.find_first_not_of(id_chars);illc!=string::npos;illc=parser.class_name.find_first_not_of(id_chars,illc)) { string::size_type lc = parser.class_name.find_first_of(id_chars,illc); int n = ((lc==string::npos)?parser.class_name.length():lc)-illc; parser.class_name.replace(illc,n,n,'_'); } parser.class_name = "_SCC_"+parser.class_name; - parser.output_basename = nos; - parser.component_basename = noro; + parser.output_basename = root_intermediate+nos; + parser.component_basename = nos; try { parser.preprocess(src); - string sf = root_intermediate+noro+".pp_stamp"; + string sf = root_intermediate+nos+".pp_stamp"; ofstream sfs(sf.c_str(),ios::trunc|ios::out); // touch .pp_stamp }catch(preprocessor_error& pe) { - pe.component_name = noro; + pe.component_name = nos; pe.see(CODEPOINT); throw; } return; - }catch(utility_no_affix& una) { - // must be a crap from .d file - } + }catch(utility_no_suffix& uns) { } } + }catch(utility_no_prefix& unp) { } cerr << "ignoring build request for " << dp << endl; } |