-rw-r--r-- | lib/component_factory.cc | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/lib/component_factory.cc b/lib/component_factory.cc index d9692de..af3d911 100644 --- a/lib/component_factory.cc +++ b/lib/component_factory.cc | |||
@@ -8,12 +8,13 @@ | |||
8 | #include <fcntl.h> | 8 | #include <fcntl.h> |
9 | #include <iostream> | 9 | #include <iostream> |
10 | #include <fstream> | 10 | #include <fstream> |
11 | #include <stdexcept> | 11 | #include <stdexcept> |
12 | #include <vector> | 12 | #include <vector> |
13 | using namespace std; | 13 | using namespace std; |
14 | #include <konforka/util.h> | ||
14 | #include "sitecing/component_factory.h" | 15 | #include "sitecing/component_factory.h" |
15 | #include "sitecing/sitecing_util.h" | 16 | #include "sitecing/sitecing_util.h" |
16 | #include "sitecing/sitecing_parser.h" | 17 | #include "sitecing/sitecing_parser.h" |
17 | #include "sitecing/sitecing_exception.h" | 18 | #include "sitecing/sitecing_exception.h" |
18 | #endif | 19 | #endif |
19 | 20 | ||
@@ -21,20 +22,20 @@ namespace sitecing { | |||
21 | 22 | ||
22 | static const char *pp_targets[] = { ".cc", ".h", ".imports", ".classname", ".baseclassname", ".ancestors", ".pp_stamp" }; | 23 | static const char *pp_targets[] = { ".cc", ".h", ".imports", ".classname", ".baseclassname", ".ancestors", ".pp_stamp" }; |
23 | static const char *cc_targets[] = { ".o", ".d" }; | 24 | static const char *cc_targets[] = { ".o", ".d" }; |
24 | 25 | ||
25 | component_factory::component_factory(configuration& c) | 26 | component_factory::component_factory(configuration& c) |
26 | : config(c), | 27 | : config(c), |
27 | root_source(normalize_path(c.root_source,strip_trailing_slash)+'/'), | 28 | root_source(konforka::normalize_path(c.root_source,konforka::strip_trailing_slash)+'/'), |
28 | root_intermediate(normalize_path(c.root_intermediate,strip_trailing_slash)+'/'), | 29 | root_intermediate(konforka::normalize_path(c.root_intermediate,konforka::strip_trailing_slash)+'/'), |
29 | root_so(normalize_path(c.root_so,strip_trailing_slash)+'/') { | 30 | root_so(konforka::normalize_path(c.root_so,konforka::strip_trailing_slash)+'/') { |
30 | } | 31 | } |
31 | 32 | ||
32 | void component_factory::get_dependencies(const string& dst,file_list_t& deps) { | 33 | void component_factory::get_dependencies(const string& dst,file_list_t& deps) { |
33 | deps.clear(); | 34 | deps.clear(); |
34 | string dp = normalize_path(dst,strip_trailing_slash); | 35 | string dp = konforka::normalize_path(dst,konforka::strip_trailing_slash); |
35 | // source documents | 36 | // source documents |
36 | try { // XXX: or just compare it off? | 37 | try { // XXX: or just compare it off? |
37 | string noro = strip_prefix(dp,root_source); | 38 | string noro = strip_prefix(dp,root_source); |
38 | return; | 39 | return; |
39 | }catch(utility_no_affix& una) { } | 40 | }catch(utility_no_affix& una) { } |
40 | // .so binaries | 41 | // .so binaries |
@@ -95,13 +96,13 @@ namespace sitecing { | |||
95 | ifstream df((root_intermediate+nos+".d").c_str(),ios::in); | 96 | ifstream df((root_intermediate+nos+".d").c_str(),ios::in); |
96 | if(df.good()) { | 97 | if(df.good()) { |
97 | string str; | 98 | string str; |
98 | while(!df.eof()) { | 99 | while(!df.eof()) { |
99 | df >> str; | 100 | df >> str; |
100 | if(str.find_first_of("\\:")==string::npos) | 101 | if(str.find_first_of("\\:")==string::npos) |
101 | deps.push_back(combine_path(config.root_source+nos,str)); | 102 | deps.push_back(konforka::combine_path(config.root_source+nos,str)); |
102 | } | 103 | } |
103 | } | 104 | } |
104 | } | 105 | } |
105 | // XXX: intermediate_deps should be broken down | 106 | // XXX: intermediate_deps should be broken down |
106 | config_options *co_intermediate_deps = config.lookup_config(nos,config_options::flag_intermediate_deps); | 107 | config_options *co_intermediate_deps = config.lookup_config(nos,config_options::flag_intermediate_deps); |
107 | if(co_intermediate_deps) { | 108 | if(co_intermediate_deps) { |
@@ -111,13 +112,13 @@ namespace sitecing { | |||
111 | }catch(utility_no_suffix& uns) { } | 112 | }catch(utility_no_suffix& uns) { } |
112 | } | 113 | } |
113 | }catch(utility_no_prefix& unp) { } | 114 | }catch(utility_no_prefix& unp) { } |
114 | } | 115 | } |
115 | 116 | ||
116 | bool component_factory::is_uptodate(const string& dst,file_list_t *deps) { | 117 | bool component_factory::is_uptodate(const string& dst,file_list_t *deps) { |
117 | string dp = normalize_path(dst,strip_trailing_slash); | 118 | string dp = konforka::normalize_path(dst,konforka::strip_trailing_slash); |
118 | try { | 119 | try { |
119 | string noro = strip_prefix(dp,root_intermediate); | 120 | string noro = strip_prefix(dp,root_intermediate); |
120 | for(int ppt=0;(ppt+1)<sizeof(pp_targets)/sizeof(*pp_targets);ppt++) { | 121 | for(int ppt=0;(ppt+1)<sizeof(pp_targets)/sizeof(*pp_targets);ppt++) { |
121 | try { | 122 | try { |
122 | string nos = strip_suffix(noro,pp_targets[ppt]); | 123 | string nos = strip_suffix(noro,pp_targets[ppt]); |
123 | return file_factory::is_uptodate(root_intermediate+nos+".pp_stamp",deps); | 124 | return file_factory::is_uptodate(root_intermediate+nos+".pp_stamp",deps); |
@@ -132,13 +133,13 @@ namespace sitecing { | |||
132 | return file_factory::is_uptodate(dst,deps); | 133 | return file_factory::is_uptodate(dst,deps); |
133 | }catch(utility_no_prefix& unp) { } | 134 | }catch(utility_no_prefix& unp) { } |
134 | return true; | 135 | return true; |
135 | } | 136 | } |
136 | 137 | ||
137 | void component_factory::build(const string& dst) { | 138 | void component_factory::build(const string& dst) { |
138 | string dp = normalize_path(dst,strip_trailing_slash); | 139 | string dp = konforka::normalize_path(dst,konforka::strip_trailing_slash); |
139 | // sources | 140 | // sources |
140 | try { | 141 | try { |
141 | string noro = strip_prefix(dp,root_source); | 142 | string noro = strip_prefix(dp,root_source); |
142 | // building the sources is left up to developer | 143 | // building the sources is left up to developer |
143 | return; | 144 | return; |
144 | }catch(utility_no_prefix& unp) { } | 145 | }catch(utility_no_prefix& unp) { } |
@@ -147,13 +148,13 @@ namespace sitecing { | |||
147 | string noso = strip_suffix(dp,".so"); | 148 | string noso = strip_suffix(dp,".so"); |
148 | string noro = strip_prefix(noso,root_so); | 149 | string noro = strip_prefix(noso,root_so); |
149 | string o = root_intermediate+noro+".o"; | 150 | string o = root_intermediate+noro+".o"; |
150 | cerr << "Linking " << noro << endl; | 151 | cerr << "Linking " << noro << endl; |
151 | if(access(o.c_str(),R_OK)) | 152 | if(access(o.c_str(),R_OK)) |
152 | throw konforka::exception(CODEPOINT,string("can't access compiled component code (")+o+")"); | 153 | throw konforka::exception(CODEPOINT,string("can't access compiled component code (")+o+")"); |
153 | make_path(dir_name(root_so+noro),0755); | 154 | konforka::make_path(konforka::dir_name(root_so+noro),0755); |
154 | file_lock lock_cc(root_intermediate+noro+".o.lock"); | 155 | file_lock lock_cc(root_intermediate+noro+".o.lock"); |
155 | file_lock lock_so(root_so+noro+".so.lock"); | 156 | file_lock lock_so(root_so+noro+".so.lock"); |
156 | int stdO = open((root_intermediate+noro+".ld.stdout").c_str(),O_CREAT|O_TRUNC|O_WRONLY,0664); | 157 | int stdO = open((root_intermediate+noro+".ld.stdout").c_str(),O_CREAT|O_TRUNC|O_WRONLY,0664); |
157 | if(stdO<0) | 158 | if(stdO<0) |
158 | throw konforka::exception(CODEPOINT,"failed to open/create linker stdout"); | 159 | throw konforka::exception(CODEPOINT,"failed to open/create linker stdout"); |
159 | int stdE = open((root_intermediate+noro+".ld.stderr").c_str(),O_CREAT|O_TRUNC|O_WRONLY,0664); | 160 | int stdE = open((root_intermediate+noro+".ld.stderr").c_str(),O_CREAT|O_TRUNC|O_WRONLY,0664); |
@@ -192,14 +193,14 @@ namespace sitecing { | |||
192 | string nos = strip_suffix(noro,cc_targets[cct]); | 193 | string nos = strip_suffix(noro,cc_targets[cct]); |
193 | string cc = root_intermediate+nos+".cc"; | 194 | string cc = root_intermediate+nos+".cc"; |
194 | string o = root_intermediate+nos+".o"; | 195 | string o = root_intermediate+nos+".o"; |
195 | cerr << "Compiling " << nos << endl; | 196 | cerr << "Compiling " << nos << endl; |
196 | if(access(cc.c_str(),R_OK)) | 197 | if(access(cc.c_str(),R_OK)) |
197 | throw konforka::exception(CODEPOINT,string("can't access preprocessed component code (")+cc+")"); | 198 | throw konforka::exception(CODEPOINT,string("can't access preprocessed component code (")+cc+")"); |
198 | make_path(dir_name(cc),0755); | 199 | konforka::make_path(konforka::dir_name(cc),0755); |
199 | string pwd = dir_name(root_source+nos); | 200 | string pwd = konforka::dir_name(root_source+nos); |
200 | auto_chdir dir_changer(pwd); | 201 | auto_chdir dir_changer(pwd); |
201 | file_lock lock_source(root_intermediate+nos+".lock"); | 202 | file_lock lock_source(root_intermediate+nos+".lock"); |
202 | file_lock lock_cc(root_intermediate+nos+".o.lock"); | 203 | file_lock lock_cc(root_intermediate+nos+".o.lock"); |
203 | int stdO = open((root_intermediate+nos+".stdout").c_str(),O_CREAT|O_TRUNC|O_WRONLY,0664); | 204 | int stdO = open((root_intermediate+nos+".stdout").c_str(),O_CREAT|O_TRUNC|O_WRONLY,0664); |
204 | if(stdO<0) | 205 | if(stdO<0) |
205 | throw konforka::exception(CODEPOINT,"failed to open/create compiler stdout"); | 206 | throw konforka::exception(CODEPOINT,"failed to open/create compiler stdout"); |
@@ -232,20 +233,20 @@ namespace sitecing { | |||
232 | try { | 233 | try { |
233 | string nos = strip_suffix(noro,pp_targets[ppt]); | 234 | string nos = strip_suffix(noro,pp_targets[ppt]); |
234 | string src = root_source+nos; | 235 | string src = root_source+nos; |
235 | cerr << "Preprocessing " << nos << endl; | 236 | cerr << "Preprocessing " << nos << endl; |
236 | if(access(src.c_str(),R_OK)) | 237 | if(access(src.c_str(),R_OK)) |
237 | throw konforka::exception(CODEPOINT,string("can't access component source (")+src+")"); | 238 | throw konforka::exception(CODEPOINT,string("can't access component source (")+src+")"); |
238 | make_path(dir_name(root_intermediate+nos),0755); | 239 | konforka::make_path(konforka::dir_name(root_intermediate+nos),0755); |
239 | file_lock lock(root_intermediate+nos+".lock"); | 240 | file_lock lock(root_intermediate+nos+".lock"); |
240 | sitecing_parser parser(*this); | 241 | sitecing_parser parser(*this); |
241 | config_options *co_skeleton = config.lookup_config(nos,config_options::flag_skeleton); | 242 | config_options *co_skeleton = config.lookup_config(nos,config_options::flag_skeleton); |
242 | if(co_skeleton) | 243 | if(co_skeleton) |
243 | parser.skeleton = co_skeleton->skeleton; | 244 | parser.skeleton = co_skeleton->skeleton; |
244 | static const char *id_chars = "abcdefghijklmnopqrstuvwxyz0123456789_ABCDEFGHIJKLMNOPQRSTUVWXYZ"; | 245 | static const char *id_chars = "abcdefghijklmnopqrstuvwxyz0123456789_ABCDEFGHIJKLMNOPQRSTUVWXYZ"; |
245 | parser.class_name = normalize_path(nos,strip_leading_slash|strip_trailing_slash); | 246 | parser.class_name = konforka::normalize_path(nos,konforka::strip_leading_slash|konforka::strip_trailing_slash); |
246 | 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)) { | 247 | 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)) { |
247 | string::size_type lc = parser.class_name.find_first_of(id_chars,illc); | 248 | string::size_type lc = parser.class_name.find_first_of(id_chars,illc); |
248 | int n = ((lc==string::npos)?parser.class_name.length():lc)-illc; | 249 | int n = ((lc==string::npos)?parser.class_name.length():lc)-illc; |
249 | parser.class_name.replace(illc,n,n,'_'); | 250 | parser.class_name.replace(illc,n,n,'_'); |
250 | } | 251 | } |
251 | parser.class_name = "_SCC_"+parser.class_name; | 252 | parser.class_name = "_SCC_"+parser.class_name; |
@@ -265,13 +266,13 @@ namespace sitecing { | |||
265 | } | 266 | } |
266 | }catch(utility_no_prefix& unp) { } | 267 | }catch(utility_no_prefix& unp) { } |
267 | cerr << "ignoring build request for " << dp << endl; | 268 | cerr << "ignoring build request for " << dp << endl; |
268 | } | 269 | } |
269 | 270 | ||
270 | void component_factory::make(const string& dst) { | 271 | void component_factory::make(const string& dst) { |
271 | string dp = normalize_path(dst,strip_trailing_slash); | 272 | string dp = konforka::normalize_path(dst,konforka::strip_trailing_slash); |
272 | try { | 273 | try { |
273 | string noso = strip_suffix(dp,".so"); | 274 | string noso = strip_suffix(dp,".so"); |
274 | string noro = strip_prefix(noso,root_so); | 275 | string noro = strip_prefix(noso,root_so); |
275 | file_list_t a; | 276 | file_list_t a; |
276 | get_ancestors(noro,a); | 277 | get_ancestors(noro,a); |
277 | for(file_list_t::const_iterator i=a.begin();i!=a.end();++i) { | 278 | for(file_list_t::const_iterator i=a.begin();i!=a.end();++i) { |
@@ -314,23 +315,23 @@ namespace sitecing { | |||
314 | if(waitpid(pid,&rv,0)<0) | 315 | if(waitpid(pid,&rv,0)<0) |
315 | throw konforka::exception(CODEPOINT,"failed to waitpid()"); | 316 | throw konforka::exception(CODEPOINT,"failed to waitpid()"); |
316 | return rv; | 317 | return rv; |
317 | } | 318 | } |
318 | 319 | ||
319 | string component_factory::get_classname(const string& component) { | 320 | string component_factory::get_classname(const string& component) { |
320 | string cn = root_intermediate+normalize_path(component,strip_trailing_slash|strip_leading_slash)+".classname"; | 321 | string cn = root_intermediate+konforka::normalize_path(component,konforka::strip_trailing_slash|konforka::strip_leading_slash)+".classname"; |
321 | make(cn); | 322 | make(cn); |
322 | ifstream ifs(cn.c_str()); | 323 | ifstream ifs(cn.c_str()); |
323 | if(!ifs.good()) | 324 | if(!ifs.good()) |
324 | throw konforka::exception(CODEPOINT,"failed to access component .classname"); | 325 | throw konforka::exception(CODEPOINT,"failed to access component .classname"); |
325 | ifs >> cn; | 326 | ifs >> cn; |
326 | return cn; | 327 | return cn; |
327 | } | 328 | } |
328 | 329 | ||
329 | void component_factory::get_ancestors(const string& component,file_list_t& rv) { | 330 | void component_factory::get_ancestors(const string& component,file_list_t& rv) { |
330 | string cn = root_intermediate+normalize_path(component,strip_trailing_slash|strip_leading_slash)+".ancestors"; | 331 | string cn = root_intermediate+konforka::normalize_path(component,konforka::strip_trailing_slash|konforka::strip_leading_slash)+".ancestors"; |
331 | make(cn); | 332 | make(cn); |
332 | ifstream ifs(cn.c_str()); | 333 | ifstream ifs(cn.c_str()); |
333 | if(!ifs.good()) | 334 | if(!ifs.good()) |
334 | throw konforka::exception(CODEPOINT,string("failed to access component '")+component+"' .ancestors"); | 335 | throw konforka::exception(CODEPOINT,string("failed to access component '")+component+"' .ancestors"); |
335 | rv.clear(); | 336 | rv.clear(); |
336 | while(!ifs.eof()) { | 337 | while(!ifs.eof()) { |