-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,71 +1,100 @@ | |||
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 | ||
11 | namespace sitecing { | 11 | namespace 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. |
64 | * @param l the line number where the exception originate from. | 93 | * @param l the line number where the exception originate from. |
65 | * @param w the error message. | 94 | * @param w the error message. |
66 | * @param cn the component name. | 95 | * @param cn the component name. |
67 | * @param ln the line of the component source where the error occured. | 96 | * @param ln the line of the component source where the error occured. |
68 | */ | 97 | */ |
69 | preprocessor_error(const string& fi,const string& fu,int l,const string& w,const string& cn,int ln) | 98 | preprocessor_error(const string& fi,const string& fu,int l,const string& w,const string& cn,int ln) |
70 | : konforka::exception(fi,fu,l,w), component_name(cn), line_number(ln) { } | 99 | : konforka::exception(fi,fu,l,w), component_name(cn), line_number(ln) { } |
71 | /** | 100 | /** |
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 | |||
@@ -143,66 +143,65 @@ namespace sitecing { | |||
143 | string o = root_intermediate+noro+".o"; | 143 | string o = root_intermediate+noro+".o"; |
144 | if(access(o.c_str(),R_OK)) | 144 | if(access(o.c_str(),R_OK)) |
145 | throw konforka::exception(CODEPOINT,string("can't access compiled component code (")+o+")"); | 145 | throw konforka::exception(CODEPOINT,string("can't access compiled component code (")+o+")"); |
146 | make_path(dir_name(root_so+noro),0755); | 146 | make_path(dir_name(root_so+noro),0755); |
147 | file_lock lock_cc(root_intermediate+noro+".o.lock"); | 147 | file_lock lock_cc(root_intermediate+noro+".o.lock"); |
148 | file_lock lock_so(root_so+noro+".so.lock"); | 148 | file_lock lock_so(root_so+noro+".so.lock"); |
149 | int stdO = open((root_intermediate+noro+".ld.stdout").c_str(),O_CREAT|O_TRUNC|O_WRONLY,0664); | 149 | int stdO = open((root_intermediate+noro+".ld.stdout").c_str(),O_CREAT|O_TRUNC|O_WRONLY,0664); |
150 | if(stdO<0) | 150 | if(stdO<0) |
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) { |
201 | close(stdO); | 200 | close(stdO); |
202 | throw konforka::exception(CODEPOINT,"failed to open/create compiler's stderr"); | 201 | throw konforka::exception(CODEPOINT,"failed to open/create compiler's stderr"); |
203 | } | 202 | } |
204 | list<string> args; | 203 | list<string> args; |
205 | config_options *co_cpp_flags = config.lookup_config(nos,config_options::flag_cpp_flags); | 204 | config_options *co_cpp_flags = config.lookup_config(nos,config_options::flag_cpp_flags); |
206 | if(co_cpp_flags) { | 205 | if(co_cpp_flags) { |
207 | args.insert(args.end(),co_cpp_flags->cpp_flags.begin(),co_cpp_flags->cpp_flags.end()); | 206 | args.insert(args.end(),co_cpp_flags->cpp_flags.begin(),co_cpp_flags->cpp_flags.end()); |
208 | } | 207 | } |