author | Michael Krelin <hacker@klever.net> | 2005-03-29 21:03:31 (UTC) |
---|---|---|
committer | Michael Krelin <hacker@klever.net> | 2005-03-29 21:03:31 (UTC) |
commit | 642dc685bd0a3f1526e22827a4539aa0e06aeff7 (patch) (side-by-side diff) | |
tree | f796be7c3093982f18dfd630a3f95c0a2c769eb3 /lib | |
parent | b0e2dda829db4560e2c0ed7556803124a396b89f (diff) | |
download | sitecing-642dc685bd0a3f1526e22827a4539aa0e06aeff7.zip sitecing-642dc685bd0a3f1526e22827a4539aa0e06aeff7.tar.gz sitecing-642dc685bd0a3f1526e22827a4539aa0e06aeff7.tar.bz2 |
split .so generation into compile and link stage
-rw-r--r-- | lib/component_factory.cc | 108 |
1 files changed, 77 insertions, 31 deletions
diff --git a/lib/component_factory.cc b/lib/component_factory.cc index bcf19f2..f8666dc 100644 --- a/lib/component_factory.cc +++ b/lib/component_factory.cc @@ -21,4 +21,5 @@ namespace sitecing { static const char *pp_targets[] = { ".cc", ".h", ".imports", ".classname", ".baseclassname", ".ancestors" }; + static const char *cc_targets[] = { ".o", ".d" }; component_factory::component_factory(configuration& c) @@ -42,17 +43,5 @@ namespace sitecing { string noso = strip_suffix(dp,".so"); string noro = strip_prefix(noso,root_so); - deps.push_back(root_intermediate+noro+".cc"); - config_options *co_cpp_deps = config.lookup_config(noro,config_options::flag_cpp_deps); - if( (!co_cpp_deps) || co_cpp_deps->cpp_deps) { - ifstream df((root_intermediate+noro+".d").c_str(),ios::in); - if(df.good()) { - string str; - while(!df.eof()) { - df >> str; - if(str.find_first_of("\\:")==string::npos) - deps.push_back(combine_path(config.root_source+noro,str)); - } - } - } + deps.push_back(root_intermediate+noro+".o"); config_options *co_so_deps = config.lookup_config(noro,config_options::flag_so_deps); if(co_so_deps) { @@ -99,4 +88,27 @@ namespace sitecing { } } + // compiler targets + for(int cct=0;cct<sizeof(cc_targets)/sizeof(*cc_targets);cct++) { + try { + string nos = strip_suffix(dp,cc_targets[cct]); + string noro = strip_prefix(nos,root_intermediate); + deps.push_back(root_intermediate+noro+".cc"); + config_options *co_cpp_deps = config.lookup_config(noro,config_options::flag_cpp_deps); + if( (!co_cpp_deps) || co_cpp_deps->cpp_deps) { + ifstream df((root_intermediate+noro+".d").c_str(),ios::in); + if(df.good()) { + string str; + while(!df.eof()) { + df >> str; + if(str.find_first_of("\\:")==string::npos) + deps.push_back(combine_path(config.root_source+noro,str)); + } + } + } + // XXX: extra deps like IntermediateDeps? + }catch(utility_no_affix& una) { + // do nothing. + } + } } @@ -130,12 +142,57 @@ namespace sitecing { string noso = strip_suffix(dp,".so"); string noro = strip_prefix(noso,root_so); + string o = root_intermediate+noro+".o"; + if(access(o.c_str(),R_OK)) + throw konforka::exception(CODEPOINT,string("can't access compiled component code (")+o+")"); + make_path(dir_name(root_so+noro),0755); + file_lock lock_cc(root_intermediate+noro+".o.lock"); + file_lock lock_so(root_so+noro+".so.lock"); + int stdO = open((root_intermediate+noro+".ld.stdout").c_str(),O_CREAT|O_TRUNC|O_WRONLY,0664); + if(stdO<0) + 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); + return; + }catch(utility_no_prefix& unp) { + throw konforka::exception(CODEPOINT,"component is outside of component root"); + }catch(utility_no_suffix& uns) { + } + // compiler targets + for(int cct=0;cct<sizeof(cc_targets)/sizeof(*cc_targets);cct++) { + try { + string nos = strip_suffix(dp,cc_targets[cct]); + string noro = strip_prefix(nos,root_intermediate); string cc = root_intermediate+noro+".cc"; + string o = root_intermediate+noro+".o"; if(access(cc.c_str(),R_OK)) throw konforka::exception(CODEPOINT,string("can't access preprocessed component code (")+cc+")"); - make_path(dir_name(root_so+noro),0755); + make_path(dir_name(cc),0755); string pwd = dir_name(root_source+noro); auto_chdir dir_changer(pwd); file_lock lock_source(root_intermediate+noro+".lock"); - file_lock lock_so(root_so+noro+".so.lock"); + file_lock lock_cc(root_intermediate+noro+".o.lock"); int stdO = open((root_intermediate+noro+".stdout").c_str(),O_CREAT|O_TRUNC|O_WRONLY,0664); if(stdO<0) @@ -151,22 +208,11 @@ namespace sitecing { args.insert(args.end(),co_cpp_flags->cpp_flags.begin(),co_cpp_flags->cpp_flags.end()); } - 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()); - } // TODO: maybe move it to separare config option like CoreCPPFLags? args.push_back("-I"+root_intermediate); args.push_back("-I"+root_source); args.push_back("-MD"); args.push_back("-MF"); args.push_back(root_intermediate+noro+".d"); - args.push_back("-shared"); - args.push_back("-o"); args.push_back(dp); + args.push_back("-c"); args.push_back(cc); - 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(o); // TODO: "g++" configurable int rv = execute("g++",args,stdO,stdE); @@ -174,7 +220,7 @@ namespace sitecing { throw compile_error(CODEPOINT,"failed to compile component",noro); return; - }catch(utility_no_prefix& unp) { - throw konforka::exception(CODEPOINT,"component is outside of component root"); - }catch(utility_no_suffix& uns) { + }catch(utility_no_affix& una) { + // do nothing, not a compiler target + } } // preprocessor targets |