summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore 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 @@
1#ifndef __SITECING_SITECING_EXCEPTION_H 1#ifndef __SITECING_SITECING_EXCEPTION_H
2#define __SITECING_SITECING_EXCEPTION_H 2#define __SITECING_SITECING_EXCEPTION_H
3 3
4#include <konforka/exception.h> 4#include <konforka/exception.h>
5 5
6/** 6/**
7 * @file 7 * @file
8 * @brief The site-C-ing specific exception. 8 * @brief The site-C-ing specific exception.
9 */ 9 */
10 10
11namespace sitecing { 11namespace sitecing {
12 12
13 /** 13 /**
14 * The comonent failed to link.
15 */
16 class link_error : public konforka::exception {
17 public:
18 /**
19 * The component path
20 */
21 string component_path;
22
23 /**
24 * @param w the message.
25 * @param cp component path.
26 */
27 link_error(const string& w,const string& cp)
28 : konforka::exception(NOCODEPOINT,w), component_path(cp) { }
29 /**
30 * @param fi the file name where the exception is thrown from.
31 * @param fu the function name where the exception originates from.
32 * @param l the line number where the exception originates from.
33 * @param w the message.
34 * @param cp component path.
35 */
36 link_error(const string& fi,const string& fu,int l,const string& w,const string& cp)
37 : konforka::exception(fi,fu,l,w), component_path(cp) { }
38 ~link_error() throw() { }
39 };
40
41 /**
14 * The component failed to compile. 42 * The component failed to compile.
15 */ 43 */
16 class compile_error : public konforka::exception { 44 class compile_error : public konforka::exception {
17 public: 45 public:
18 /** 46 /**
19 * The component path 47 * The component path
20 */ 48 */
21 string component_path; 49 string component_path;
22 50
23 /** 51 /**
24 * @param w the message. 52 * @param w the message.
25 * @param cp component path. 53 * @param cp component path.
26 */ 54 */
27 compile_error(const string& w,const string& cp) 55 compile_error(const string& w,const string& cp)
28 : konforka::exception(NOCODEPOINT,w), component_path(cp) { } 56 : konforka::exception(NOCODEPOINT,w), component_path(cp) { }
29 /** 57 /**
30 * @param whe point in code. 58 * @param whe point in code.
31 * @param wha the message. 59 * @param wha the message.
32 * @param cp component path. 60 * @param cp component path.
33 */ 61 */
34 compile_error(const string &whe,const string& wha,const string& cp) 62 compile_error(const string &whe,const string& wha,const string& cp)
35 : konforka::exception(whe,wha), component_path(cp) { } 63 : konforka::exception(whe,wha), component_path(cp) { }
36 /** 64 /**
37 * @param fi the file name where the exception is thrown from. 65 * @param fi the file name where the exception is thrown from.
38 * @param fu the function name where the exception originates from. 66 * @param fu the function name where the exception originates from.
39 * @param l the line number where the exception originates from. 67 * @param l the line number where the exception originates from.
68 * @param w the message.
40 * @param cp component path. 69 * @param cp component path.
41 */ 70 */
42 compile_error(const string &fi,const string& fu,int l,const string& w,const string& cp) 71 compile_error(const string &fi,const string& fu,int l,const string& w,const string& cp)
43 : konforka::exception(fi,fu,l,w), component_path(cp) { } 72 : konforka::exception(fi,fu,l,w), component_path(cp) { }
44 ~compile_error() throw() { } 73 ~compile_error() throw() { }
45 }; 74 };
46 75
47 /** 76 /**
48 * Failed to preprocess component source. 77 * Failed to preprocess component source.
49 */ 78 */
50 class preprocessor_error : public konforka::exception { 79 class preprocessor_error : public konforka::exception {
51 public: 80 public:
52 /** 81 /**
53 * Component name. 82 * Component name.
54 */ 83 */
55 string component_name; 84 string component_name;
56 /** 85 /**
57 * The line number of the source code where the error occured. 86 * The line number of the source code where the error occured.
58 */ 87 */
59 int line_number; 88 int line_number;
60 89
61 /** 90 /**
62 * @param fi file name where the exception originates from. 91 * @param fi file name where the exception originates from.
63 * @param fu the function name where the exception originates from. 92 * @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 {
151 throw konforka::exception(CODEPOINT,"failed to open/create linker stdout"); 151 throw konforka::exception(CODEPOINT,"failed to open/create linker stdout");
152 int stdE = open((root_intermediate+noro+".ld.stderr").c_str(),O_CREAT|O_TRUNC|O_WRONLY,0664); 152 int stdE = open((root_intermediate+noro+".ld.stderr").c_str(),O_CREAT|O_TRUNC|O_WRONLY,0664);
153 if(stdE<0) { 153 if(stdE<0) {
154 close(stdO); 154 close(stdO);
155 throw konforka::exception(CODEPOINT,"failed to open/create linker stderr"); 155 throw konforka::exception(CODEPOINT,"failed to open/create linker stderr");
156 } 156 }
157 list<string> args; 157 list<string> args;
158 config_options *co_ld_flags = config.lookup_config(noro,config_options::flag_ld_flags); 158 config_options *co_ld_flags = config.lookup_config(noro,config_options::flag_ld_flags);
159 if(co_ld_flags) { 159 if(co_ld_flags) {
160 args.insert(args.end(),co_ld_flags->ld_flags.begin(),co_ld_flags->ld_flags.end()); 160 args.insert(args.end(),co_ld_flags->ld_flags.begin(),co_ld_flags->ld_flags.end());
161 } 161 }
162 args.push_back("-shared"); 162 args.push_back("-shared");
163 args.push_back(o); 163 args.push_back(o);
164 file_list_t ancestors; 164 file_list_t ancestors;
165 get_ancestors(noro,ancestors); 165 get_ancestors(noro,ancestors);
166 for(file_list_t::const_iterator i=ancestors.begin();i!=ancestors.end();++i) { 166 for(file_list_t::const_iterator i=ancestors.begin();i!=ancestors.end();++i) {
167 string aso=root_so+*i+".so"; 167 string aso=root_so+*i+".so";
168 make(aso); 168 make(aso);
169 args.push_back(aso); 169 args.push_back(aso);
170 } 170 }
171 args.push_back("-o"); args.push_back(dp); 171 args.push_back("-o"); args.push_back(dp);
172 // TODO: "g++" configurable 172 // TODO: "g++" configurable
173 int rv = execute("g++",args,stdO,stdE); 173 int rv = execute("g++",args,stdO,stdE);
174 if(! (WIFEXITED(rv) && !WEXITSTATUS(rv)) ) 174 if(! (WIFEXITED(rv) && !WEXITSTATUS(rv)) )
175 // TODO:TODO: linker_error 175 throw link_error(CODEPOINT,"failed to link component",noro);
176 throw compile_error(CODEPOINT,"failed to link component",noro);
177 return; 176 return;
178 }catch(utility_no_prefix& unp) { 177 }catch(utility_no_prefix& unp) {
179 throw konforka::exception(CODEPOINT,"component is outside of component root"); 178 throw konforka::exception(CODEPOINT,"component is outside of component root");
180 }catch(utility_no_suffix& uns) { } 179 }catch(utility_no_suffix& uns) { }
181 try { 180 try {
182 string noro = strip_prefix(dp,root_intermediate); 181 string noro = strip_prefix(dp,root_intermediate);
183 // compiler targets 182 // compiler targets
184 for(int cct=0;cct<sizeof(cc_targets)/sizeof(*cc_targets);cct++) { 183 for(int cct=0;cct<sizeof(cc_targets)/sizeof(*cc_targets);cct++) {
185 try { 184 try {
186 string nos = strip_suffix(noro,cc_targets[cct]); 185 string nos = strip_suffix(noro,cc_targets[cct]);
187 string cc = root_intermediate+nos+".cc"; 186 string cc = root_intermediate+nos+".cc";
188 string o = root_intermediate+nos+".o"; 187 string o = root_intermediate+nos+".o";
189 if(access(cc.c_str(),R_OK)) 188 if(access(cc.c_str(),R_OK))
190 throw konforka::exception(CODEPOINT,string("can't access preprocessed component code (")+cc+")"); 189 throw konforka::exception(CODEPOINT,string("can't access preprocessed component code (")+cc+")");
191 make_path(dir_name(cc),0755); 190 make_path(dir_name(cc),0755);
192 string pwd = dir_name(root_source+nos); 191 string pwd = dir_name(root_source+nos);
193 auto_chdir dir_changer(pwd); 192 auto_chdir dir_changer(pwd);
194 file_lock lock_source(root_intermediate+nos+".lock"); 193 file_lock lock_source(root_intermediate+nos+".lock");
195 file_lock lock_cc(root_intermediate+nos+".o.lock"); 194 file_lock lock_cc(root_intermediate+nos+".o.lock");
196 int stdO = open((root_intermediate+nos+".stdout").c_str(),O_CREAT|O_TRUNC|O_WRONLY,0664); 195 int stdO = open((root_intermediate+nos+".stdout").c_str(),O_CREAT|O_TRUNC|O_WRONLY,0664);
197 if(stdO<0) 196 if(stdO<0)
198 throw konforka::exception(CODEPOINT,"failed to open/create compiler stdout"); 197 throw konforka::exception(CODEPOINT,"failed to open/create compiler stdout");
199 int stdE = open((root_intermediate+nos+".stderr").c_str(),O_CREAT|O_TRUNC|O_WRONLY,0664); 198 int stdE = open((root_intermediate+nos+".stderr").c_str(),O_CREAT|O_TRUNC|O_WRONLY,0664);
200 if(stdE<0) { 199 if(stdE<0) {