+/**
+Prepares the build information for building.
+*/
+void Component::create_build_info()
+{
+ build_info.add(pkg.get_build_info());
+
+ for(PackageList::iterator i=requires.begin(); i!=requires.end(); ++i)
+ build_info.add((*i)->get_exported_binfo());
+
+ for(StringList::iterator i=build_info.incpath.begin(); i!=build_info.incpath.end(); ++i)
+ *i=(pkg.get_source() / *i).str();
+ for(StringList::iterator i=build_info.libpath.begin(); i!=build_info.libpath.end(); ++i)
+ *i=(pkg.get_source() / *i).str();
+
+ if(type==PROGRAM)
+ {
+ string strip=pkg.get_config().get_option("strip").value;
+ if(lexical_cast<bool>(strip))
+ build_info.ldflags.push_back("-s");
+ }
+
+ if(modular)
+ {
+ build_info.ldflags.push_back("-rdynamic");
+ build_info.libs.push_back("dl");
+ }
+ else if(module_host)
+ {
+ const PathList &host_src=module_host->get_sources();
+ for(PathList::const_iterator i=host_src.begin(); i!=host_src.end(); ++i)
+ build_info.incpath.push_back(i->str());
+ }
+
+ build_info.unique();
+}
+
+/**
+Creates all targets needed for building this component.
+*/
+void Component::create_targets() const
+{
+ Builder &builder=pkg.get_builder();
+ Target *world=builder.get_target("world");
+ Target *def_tgt=builder.get_target("default");
+
+ PathList files=collect_source_files();
+
+ bool build_exe=(type!=HEADERS);
+
+ list<ObjectFile *> objs;
+ list<Target *> inst_tgts;
+ for(PathList::const_iterator i=files.begin(); i!=files.end(); ++i)
+ {
+ string basename=(*i)[-1];
+ string ext=splitext(basename).ext;
+ if((ext==".cpp" || ext==".c") && build_exe)
+ {
+ SourceFile *src=new SourceFile(builder, this, i->str());
+
+ // Compile sources
+ ObjectFile *obj=new ObjectFile(builder, *this, *src);
+ objs.push_back(obj);
+ }
+ else if(ext==".h")
+ {
+ Target *hdr=builder.get_target(i->str());
+ if(!hdr)
+ hdr=new Header(builder, this, i->str());
+
+ // Install headers if requested
+ if(!install_headers.empty())
+ inst_tgts.push_back(hdr);
+ }
+ }
+
+ if(build_exe)
+ {
+ Executable *exe=0;
+ StaticLibrary *slib=0;
+ if(type==LIBRARY)
+ {
+ exe=new SharedLibrary(builder, *this, objs);
+ slib=new StaticLibrary(builder, *this, objs);
+ }
+ else
+ exe=new Executable(builder, *this, objs);
+
+ if(&pkg==builder.get_main_package() && deflt)
+ {
+ def_tgt->add_depend(exe);
+ if(slib) def_tgt->add_depend(slib);
+ }
+ else
+ {
+ world->add_depend(exe);
+ if(slib) world->add_depend(slib);
+ }
+
+ if(install)
+ {
+ inst_tgts.push_back(exe);
+ if(slib)
+ inst_tgts.push_back(slib);
+ }
+ }
+
+ Target *inst_tgt=builder.get_target("install");
+ for(TargetList::const_iterator i=inst_tgts.begin(); i!=inst_tgts.end(); ++i)
+ inst_tgt->add_depend(new Install(builder, pkg, **i));
+}
+
+/**
+Collects all files belonging to the component.
+*/
+PathList Component::collect_source_files() const
+{
+ PathList files;
+ for(PathList::const_iterator i=sources.begin(); i!=sources.end(); ++i)
+ {
+ struct stat st=stat(*i);
+ if(S_ISDIR(st.st_mode))
+ {
+ list<string> sfiles=list_files(*i);
+ for(list<string>::iterator j=sfiles.begin(); j!=sfiles.end(); ++j)
+ files.push_back(*i / *j);
+ }
+ else
+ files.push_back(*i);
+ }
+
+ return files;
+}
+
+