summaryrefslogtreecommitdiffabout
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--lib/component_factory.cc114
1 files changed, 80 insertions, 34 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,36 +142,25 @@ namespace sitecing {
string noso = strip_suffix(dp,".so");
string noro = strip_prefix(noso,root_so);
- string cc = root_intermediate+noro+".cc";
- if(access(cc.c_str(),R_OK))
- throw konforka::exception(CODEPOINT,string("can't access preprocessed component code (")+cc+")");
+ 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);
- string pwd = dir_name(root_source+noro);
- auto_chdir dir_changer(pwd);
- file_lock lock_source(root_intermediate+noro+".lock");
+ file_lock lock_cc(root_intermediate+noro+".o.lock");
file_lock lock_so(root_so+noro+".so.lock");
- int stdO = open((root_intermediate+noro+".stdout").c_str(),O_CREAT|O_TRUNC|O_WRONLY,0664);
+ 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 compiler stdout");
- int stdE = open((root_intermediate+noro+".stderr").c_str(),O_CREAT|O_TRUNC|O_WRONLY,0664);
+ 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 compiler's stderr");
+ throw konforka::exception(CODEPOINT,"failed to open/create linker stderr");
}
list<string> args;
- config_options *co_cpp_flags = config.lookup_config(noro,config_options::flag_cpp_flags);
- if(co_cpp_flags) {
- 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(cc);
+ args.push_back(o);
file_list_t ancestors;
get_ancestors(noro,ancestors);
@@ -169,8 +170,10 @@ namespace sitecing {
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)) )
- throw compile_error(CODEPOINT,"failed to compile component",noro);
+ // TODO:TODO: linker_error
+ throw compile_error(CODEPOINT,"failed to link component",noro);
return;
}catch(utility_no_prefix& unp) {
@@ -178,4 +181,47 @@ namespace sitecing {
}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(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_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)
+ throw konforka::exception(CODEPOINT,"failed to open/create compiler stdout");
+ int stdE = open((root_intermediate+noro+".stderr").c_str(),O_CREAT|O_TRUNC|O_WRONLY,0664);
+ if(stdE<0) {
+ close(stdO);
+ throw konforka::exception(CODEPOINT,"failed to open/create compiler's stderr");
+ }
+ list<string> args;
+ config_options *co_cpp_flags = config.lookup_config(noro,config_options::flag_cpp_flags);
+ if(co_cpp_flags) {
+ args.insert(args.end(),co_cpp_flags->cpp_flags.begin(),co_cpp_flags->cpp_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("-c");
+ args.push_back(cc);
+ args.push_back("-o"); args.push_back(o);
+ // TODO: "g++" configurable
+ int rv = execute("g++",args,stdO,stdE);
+ if(! (WIFEXITED(rv) && !WEXITSTATUS(rv)) )
+ throw compile_error(CODEPOINT,"failed to compile component",noro);
+ return;
+ }catch(utility_no_affix& una) {
+ // do nothing, not a compiler target
+ }
+ }
// preprocessor targets
for(int ppt=0;ppt<sizeof(pp_targets)/sizeof(*pp_targets);ppt++) {