summaryrefslogtreecommitdiffabout
authorMichael Krelin <hacker@klever.net>2005-03-31 14:16:18 (UTC)
committer Michael Krelin <hacker@klever.net>2005-03-31 14:16:18 (UTC)
commit333ec38b9a3a5a9d0f0fb03a97c004710ef525de (patch) (side-by-side diff)
treee0a1e5b458ede7ca1b14cd6fb45d1ec648156494
parentef14961fe10614eb15c71dd5b0b83f292bd7a5b0 (diff)
downloadsitecing-333ec38b9a3a5a9d0f0fb03a97c004710ef525de.zip
sitecing-333ec38b9a3a5a9d0f0fb03a97c004710ef525de.tar.gz
sitecing-333ec38b9a3a5a9d0f0fb03a97c004710ef525de.tar.bz2
link_error exception introduced
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--include/sitecing/sitecing_exception.h29
-rw-r--r--lib/component_factory.cc3
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,63 +1,92 @@
#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.
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
@@ -151,50 +151,49 @@ namespace sitecing {
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) {