author | Michael Krelin <hacker@klever.net> | 2005-03-31 14:16:18 (UTC) |
---|---|---|
committer | Michael Krelin <hacker@klever.net> | 2005-03-31 14:16:18 (UTC) |
commit | 333ec38b9a3a5a9d0f0fb03a97c004710ef525de (patch) (side-by-side diff) | |
tree | e0a1e5b458ede7ca1b14cd6fb45d1ec648156494 | |
parent | ef14961fe10614eb15c71dd5b0b83f292bd7a5b0 (diff) | |
download | sitecing-333ec38b9a3a5a9d0f0fb03a97c004710ef525de.zip sitecing-333ec38b9a3a5a9d0f0fb03a97c004710ef525de.tar.gz sitecing-333ec38b9a3a5a9d0f0fb03a97c004710ef525de.tar.bz2 |
link_error exception introduced
-rw-r--r-- | include/sitecing/sitecing_exception.h | 29 | ||||
-rw-r--r-- | lib/component_factory.cc | 3 |
2 files changed, 30 insertions, 2 deletions
diff --git a/include/sitecing/sitecing_exception.h b/include/sitecing/sitecing_exception.h index bf475ac..cb5edd9 100644 --- a/include/sitecing/sitecing_exception.h +++ b/include/sitecing/sitecing_exception.h @@ -1,87 +1,116 @@ #ifndef __SITECING_SITECING_EXCEPTION_H #define __SITECING_SITECING_EXCEPTION_H #include <konforka/exception.h> /** * @file * @brief The site-C-ing specific exception. */ namespace sitecing { /** + * The comonent failed to link. + */ + class link_error : public konforka::exception { + public: + /** + * The component path + */ + string component_path; + + /** + * @param w the message. + * @param cp component path. + */ + link_error(const string& w,const string& cp) + : konforka::exception(NOCODEPOINT,w), component_path(cp) { } + /** + * @param fi the file name where the exception is thrown from. + * @param fu the function name where the exception originates from. + * @param l the line number where the exception originates from. + * @param w the message. + * @param cp component path. + */ + link_error(const string& fi,const string& fu,int l,const string& w,const string& cp) + : konforka::exception(fi,fu,l,w), component_path(cp) { } + ~link_error() throw() { } + }; + + /** * The component failed to compile. */ class compile_error : public konforka::exception { public: /** * The component path */ string component_path; /** * @param w the message. * @param cp component path. */ compile_error(const string& w,const string& cp) : konforka::exception(NOCODEPOINT,w), component_path(cp) { } /** * @param whe point in code. * @param wha the message. * @param cp component path. */ compile_error(const string &whe,const string& wha,const string& cp) : konforka::exception(whe,wha), component_path(cp) { } /** * @param fi the file name where the exception is thrown from. * @param fu the function name where the exception originates from. * @param l the line number where the exception originates from. + * @param w the message. * @param cp component path. */ compile_error(const string &fi,const string& fu,int l,const string& w,const string& cp) : konforka::exception(fi,fu,l,w), component_path(cp) { } ~compile_error() throw() { } }; /** * Failed to preprocess component source. */ class preprocessor_error : public konforka::exception { public: /** * Component name. */ string component_name; /** * The line number of the source code where the error occured. */ int line_number; /** * @param fi file name where the exception originates from. * @param fu the function name where the exception originates from. * @param l the line number where the exception originate from. * @param w the error message. * @param cn the component name. * @param ln the line of the component source where the error occured. */ preprocessor_error(const string& fi,const string& fu,int l,const string& w,const string& cn,int ln) : konforka::exception(fi,fu,l,w), component_name(cn), line_number(ln) { } /** * @param fi file name where the exception originates from. * @param fu the function name where the exception originates from. * @param l the line number where the exception originate from. * @param w the error message. * @param cn the component name. */ preprocessor_error(const string& fi,const string& fu,int l,const string& w,const string& cn) : konforka::exception(fi,fu,l,w), component_name(cn), line_number(-1) { } /** * @param fi file name where the exception originates from. * @param fu the function name where the exception originates from. * @param l the line number where the exception originate from. * @param w the error message. * @param ln the line of the component source where the error occured. */ preprocessor_error(const string& fi,const string& fu,int l,const string& w,int ln) diff --git a/lib/component_factory.cc b/lib/component_factory.cc index a5ced6b..2a2eefe 100644 --- a/lib/component_factory.cc +++ b/lib/component_factory.cc @@ -127,98 +127,97 @@ namespace sitecing { }catch(utility_no_prefix& unp) { } return true; } void component_factory::build(const string& dst) { string dp = normalize_path(dst,strip_trailing_slash); // sources try { string noro = strip_prefix(dp,root_source); // building the sources is left up to developer return; }catch(utility_no_prefix& unp) { } // .so files try { string noso = strip_suffix(dp,".so"); string noro = strip_prefix(noso,root_so); string o = root_intermediate+noro+".o"; if(access(o.c_str(),R_OK)) throw konforka::exception(CODEPOINT,string("can't access compiled component code (")+o+")"); make_path(dir_name(root_so+noro),0755); file_lock lock_cc(root_intermediate+noro+".o.lock"); file_lock lock_so(root_so+noro+".so.lock"); int stdO = open((root_intermediate+noro+".ld.stdout").c_str(),O_CREAT|O_TRUNC|O_WRONLY,0664); if(stdO<0) throw konforka::exception(CODEPOINT,"failed to open/create linker stdout"); int stdE = open((root_intermediate+noro+".ld.stderr").c_str(),O_CREAT|O_TRUNC|O_WRONLY,0664); if(stdE<0) { close(stdO); throw konforka::exception(CODEPOINT,"failed to open/create linker stderr"); } list<string> args; config_options *co_ld_flags = config.lookup_config(noro,config_options::flag_ld_flags); if(co_ld_flags) { args.insert(args.end(),co_ld_flags->ld_flags.begin(),co_ld_flags->ld_flags.end()); } args.push_back("-shared"); args.push_back(o); file_list_t ancestors; get_ancestors(noro,ancestors); for(file_list_t::const_iterator i=ancestors.begin();i!=ancestors.end();++i) { string aso=root_so+*i+".so"; make(aso); args.push_back(aso); } args.push_back("-o"); args.push_back(dp); // TODO: "g++" configurable int rv = execute("g++",args,stdO,stdE); if(! (WIFEXITED(rv) && !WEXITSTATUS(rv)) ) - // TODO:TODO: linker_error - throw compile_error(CODEPOINT,"failed to link component",noro); + throw link_error(CODEPOINT,"failed to link component",noro); return; }catch(utility_no_prefix& unp) { throw konforka::exception(CODEPOINT,"component is outside of component root"); }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(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+nos); auto_chdir dir_changer(pwd); 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+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(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+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",nos); return; }catch(utility_no_suffix& uns) { } } // preprocessor targets for(int ppt=0;ppt<sizeof(pp_targets)/sizeof(*pp_targets);ppt++) { |