X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fsourcepackage.cpp;h=ab66c0056651cbfddaa768fed2dbb47577779870;hb=6f76342d14c7b7ec7b9629fcfd40199bca1e5e0f;hp=e946d018a51953a44149a6888179500a2923fd32;hpb=87ea54db19306434bac3e765c9bd3464fd53f390;p=builder.git diff --git a/source/sourcepackage.cpp b/source/sourcepackage.cpp index e946d01..ab66c00 100644 --- a/source/sourcepackage.cpp +++ b/source/sourcepackage.cpp @@ -1,16 +1,12 @@ -/* $Id$ - -This file is part of builder -Copyright © 2007-2010 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - +#include #include #include #include #include "binarypackage.h" #include "builder.h" #include "misc.h" +#include "pkgconfigfile.h" +#include "tool.h" #include "sourcepackage.h" using namespace std; @@ -75,7 +71,51 @@ LibMode SourcePackage::get_library_mode() const else if(mode=="none") return DYNAMIC; else - throw Exception("Unknown library mode"); + throw runtime_error("unknown library mode"); +} + +string SourcePackage::expand_string(const string &str) const +{ + string result = str; + string::size_type dollar = 0; + unsigned n = 0; + while((dollar = result.find('$'))!=string::npos) + { + if(n>1000) + throw bad_expansion("nested too deep"); + + string::size_type end; + string var; + if(dollar+1=2) - IO::print("Configuration of %s changed\n", name); + builder.get_logger().log("configure", format("Configuration of %s changed", name)); if(!builder.get_dry_run()) config.save(); } @@ -103,7 +142,7 @@ void SourcePackage::do_configure(const StringMap &opts, unsigned flag) { const StringList &reqs = i->get_requires(); for(StringList::const_iterator j=reqs.begin(); j!=reqs.end(); ++j) - if(Package *pkg = builder.get_package(*j)) + if(Package *pkg = builder.get_package_manager().find_package(*j)) requires.push_back(pkg); } @@ -117,11 +156,7 @@ void SourcePackage::do_configure(const StringMap &opts, unsigned flag) deps_cache.load(); for(ComponentList::iterator i=components.begin(); i!=components.end(); ++i) - { - const PackageList &reqs = i->get_requires(); - for(PackageList::const_iterator j=reqs.begin(); j!=reqs.end(); ++j) - (*j)->configure(opts, flag&2); - } + i->configure(opts, flag); } void SourcePackage::init_config() @@ -147,8 +182,6 @@ void SourcePackage::init_config() void SourcePackage::create_build_info() { - build_info.add(builder.get_current_arch().get_build_info()); - // XXX Currently, a package-specific settings will override cmdline. This might or might not be desirable. const StringList &warnings = builder.get_warnings(); build_info.warnings.insert(build_info.warnings.begin(), warnings.begin(), warnings.end()); @@ -166,25 +199,25 @@ void SourcePackage::create_build_info() string optimize = config.get_option("optimize").value; if(!optimize.empty() && optimize!="0") { - build_info.cflags.push_back("-O"+optimize); - build_info.ldflags.push_back("-O"+optimize); + if(optimize=="s" || optimize=="size") + build_info.optimize = -1; + else + build_info.optimize = lexical_cast(optimize); } if(lexical_cast(config.get_option("debug").value)) { - build_info.cflags.push_back("-ggdb"); - build_info.defines.push_back("DEBUG"); + build_info.debug = true; + build_info.defines["DEBUG"] = "1"; } for(FeatureList::iterator i=features.begin(); i!=features.end(); ++i) if(lexical_cast(config.get_option("with_"+i->name).value)) - build_info.cflags.push_back("-DWITH_"+toupper(i->name)); + build_info.defines["WITH_"+toupper(i->name)] = "1"; for(ConditionList::iterator i=conditions.begin(); i!=conditions.end(); ++i) if(i->eval()) - build_info.add(i->get_build_info()); - - build_info.unique(); + build_info.update_from(i->get_build_info()); for(list::iterator i=components.begin(); i!=components.end(); ++i) { @@ -192,8 +225,23 @@ void SourcePackage::create_build_info() if(i->get_type()==Component::LIBRARY) export_binfo.libs.push_back(i->get_name()); } +} - export_binfo.unique(); +void SourcePackage::create_targets() +{ + bool pc_needed = false; + for(ComponentList::const_iterator i=components.begin(); i!=components.end(); ++i) + { + i->create_targets(); + if(i->get_type()==Component::LIBRARY || i->get_type()==Component::HEADERS) + pc_needed = true; + } + + if(pc_needed) + { + PkgConfigFile *pc = new PkgConfigFile(builder, *this); + builder.get_target("install")->add_depend(builder.get_toolchain().get_tool("CP").create_target(*pc)); + } } @@ -274,5 +322,5 @@ void SourcePackage::Loader::tar_file(const string &f) SourcePackage &spkg = static_cast(pkg); for(ComponentList::iterator i=spkg.components.begin(); i!=spkg.components.end(); ++i) if(i->get_type()==Component::TARBALL && i->get_name()=="@src") - const_cast(i->get_sources()).push_back(spkg.source/f); + const_cast(i->get_sources()).push_back((spkg.source/f).str()); }