summaryrefslogtreecommitdiffabout
path: root/lib
Unidiff
Diffstat (limited to 'lib') (more/less context) (ignore whitespace changes)
-rw-r--r--lib/component_factory.cc25
1 files changed, 21 insertions, 4 deletions
diff --git a/lib/component_factory.cc b/lib/component_factory.cc
index 5c18bb7..b5e95af 100644
--- a/lib/component_factory.cc
+++ b/lib/component_factory.cc
@@ -115,7 +115,6 @@ namespace sitecing {
115 115
116 bool component_factory::is_uptodate(const string& dst,file_list_t *deps) { 116 bool component_factory::is_uptodate(const string& dst,file_list_t *deps) {
117 string dp = normalize_path(dst,strip_trailing_slash); 117 string dp = normalize_path(dst,strip_trailing_slash);
118 // XXX: or just compare it off, instead of throwing things around.
119 try { 118 try {
120 string noro = strip_prefix(dp,root_intermediate); 119 string noro = strip_prefix(dp,root_intermediate);
121 for(int ppt=0;(ppt+1)<sizeof(pp_targets)/sizeof(*pp_targets);ppt++) { 120 for(int ppt=0;(ppt+1)<sizeof(pp_targets)/sizeof(*pp_targets);ppt++) {
@@ -127,6 +126,7 @@ namespace sitecing {
127 bool rv = file_factory::is_uptodate(dst,deps); 126 bool rv = file_factory::is_uptodate(dst,deps);
128 return rv; 127 return rv;
129 }catch(utility_no_prefix& unp) { } 128 }catch(utility_no_prefix& unp) { }
129 // XXX: or just compare it off, instead of throwing things around.
130 try { 130 try {
131 strip_prefix(dp,root_so); 131 strip_prefix(dp,root_so);
132 return file_factory::is_uptodate(dst,deps); 132 return file_factory::is_uptodate(dst,deps);
@@ -147,6 +147,7 @@ namespace sitecing {
147 string noso = strip_suffix(dp,".so"); 147 string noso = strip_suffix(dp,".so");
148 string noro = strip_prefix(noso,root_so); 148 string noro = strip_prefix(noso,root_so);
149 string o = root_intermediate+noro+".o"; 149 string o = root_intermediate+noro+".o";
150 cerr << "Linking " << noro << endl;
150 if(access(o.c_str(),R_OK)) 151 if(access(o.c_str(),R_OK))
151 throw konforka::exception(CODEPOINT,string("can't access compiled component code (")+o+")"); 152 throw konforka::exception(CODEPOINT,string("can't access compiled component code (")+o+")");
152 make_path(dir_name(root_so+noro),0755); 153 make_path(dir_name(root_so+noro),0755);
@@ -191,6 +192,7 @@ namespace sitecing {
191 string nos = strip_suffix(noro,cc_targets[cct]); 192 string nos = strip_suffix(noro,cc_targets[cct]);
192 string cc = root_intermediate+nos+".cc"; 193 string cc = root_intermediate+nos+".cc";
193 string o = root_intermediate+nos+".o"; 194 string o = root_intermediate+nos+".o";
195 cerr << "Compiling " << nos << endl;
194 if(access(cc.c_str(),R_OK)) 196 if(access(cc.c_str(),R_OK))
195 throw konforka::exception(CODEPOINT,string("can't access preprocessed component code (")+cc+")"); 197 throw konforka::exception(CODEPOINT,string("can't access preprocessed component code (")+cc+")");
196 make_path(dir_name(cc),0755); 198 make_path(dir_name(cc),0755);
@@ -230,6 +232,7 @@ namespace sitecing {
230 try { 232 try {
231 string nos = strip_suffix(noro,pp_targets[ppt]); 233 string nos = strip_suffix(noro,pp_targets[ppt]);
232 string src = root_source+nos; 234 string src = root_source+nos;
235 cerr << "Preprocessing " << nos << endl;
233 if(access(src.c_str(),R_OK)) 236 if(access(src.c_str(),R_OK))
234 throw konforka::exception(CODEPOINT,string("can't access component source (")+src+")"); 237 throw konforka::exception(CODEPOINT,string("can't access component source (")+src+")");
235 make_path(dir_name(root_intermediate+nos),0755); 238 make_path(dir_name(root_intermediate+nos),0755);
@@ -264,17 +267,31 @@ namespace sitecing {
264 cerr << "ignoring build request for " << dp << endl; 267 cerr << "ignoring build request for " << dp << endl;
265 } 268 }
266 269
270 void component_factory::make(const string& dst) {
271 string dp = normalize_path(dst,strip_trailing_slash);
272 try {
273 string noso = strip_suffix(dp,".so");
274 string noro = strip_prefix(noso,root_so);
275 file_list_t a;
276 get_ancestors(noro,a);
277 for(file_list_t::const_iterator i=a.begin();i!=a.end();++i) {
278 make(root_so+*i+".so");
279 }
280 }catch(utility_no_affix& una) { }
281 file_factory::make(dst);
282 }
283
267 int component_factory::execute(const string& cmd, const list<string>& args,int stdo,int stde) { 284 int component_factory::execute(const string& cmd, const list<string>& args,int stdo,int stde) {
268 // XXX: is it right that we do stdio/stderr tricks outside of the function? 285 // XXX: is it right that we do stdio/stderr tricks outside of the function?
269 cerr << "executing: " << cmd; 286 // cerr << "executing: " << cmd;
270 vector<const char*> argv(args.size()+2); 287 vector<const char*> argv(args.size()+2);
271 argv[0]=cmd.c_str(); 288 argv[0]=cmd.c_str();
272 int an = 1; 289 int an = 1;
273 for(list<string>::const_iterator i=args.begin();i!=args.end();i++) { 290 for(list<string>::const_iterator i=args.begin();i!=args.end();i++) {
274 cerr << " " << *i ; 291 // cerr << " " << *i ;
275 argv[an++] = i->c_str(); 292 argv[an++] = i->c_str();
276 } 293 }
277 cerr << endl; 294 // cerr << endl;
278 argv[an++]=NULL; 295 argv[an++]=NULL;
279 pid_t pid = vfork(); 296 pid_t pid = vfork();
280 if(pid==-1) { 297 if(pid==-1) {