X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fsourcepackage.cpp;h=60276daff288bb48cc2292bf12e91f5b88d882e2;hb=dc4b917034c9d3718f07139e2f0f3631a080c6f3;hp=5209be4c58754b9f59b456c449fe565e038cf9f3;hpb=433f9ef196b6f5af6bb38447b650f5afaa5a783a;p=builder.git diff --git a/source/sourcepackage.cpp b/source/sourcepackage.cpp index 5209be4..60276da 100644 --- a/source/sourcepackage.cpp +++ b/source/sourcepackage.cpp @@ -1,10 +1,4 @@ -/* $Id$ - -This file is part of builder -Copyright © 2007-2010 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - +#include #include #include #include @@ -75,7 +69,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+1get_requires(); - requires.insert(requires.end(), reqs.begin(), reqs.end()); - } - for(PackageList::iterator i=requires.begin(); i!=requires.end(); ++i) { BinaryPackage *bpkg = dynamic_cast(*i); @@ -123,6 +153,9 @@ void SourcePackage::do_configure(const StringMap &opts, unsigned flag) } deps_cache.load(); + + for(ComponentList::iterator i=components.begin(); i!=components.end(); ++i) + i->configure(opts, flag); } void SourcePackage::init_config() @@ -130,7 +163,7 @@ void SourcePackage::init_config() config.add_option("profile", "default", "Configuration profile"); config.add_option("tempdir", "temp", "Directory for storing temporary files"); config.add_option("outdir", ".", "Directory to put build results in"); - config.add_option("optimize", "0", "Apply compiler optimizations"); + config.add_option("optimize", "0", "Compiler optimization level"); config.add_option("strip", "no", "Strip symbols from programs"); config.add_option("debug", "no", "Produce debugging symbols"); config.add_option("staticlibs", "local", "Use static libraries"); @@ -148,18 +181,6 @@ void SourcePackage::init_config() void SourcePackage::create_build_info() { - build_info.add(builder.get_current_arch().get_build_info()); - - for(PackageList::iterator i=base_reqs.begin(); i!=base_reqs.end(); ++i) - { - const BuildInfo &ebi = (*i)->get_exported_binfo(); - build_info.add(ebi); - - export_binfo.cflags.insert(export_binfo.cflags.end(), ebi.cflags.begin(), ebi.cflags.end()); - export_binfo.incpath.insert(export_binfo.incpath.end(), ebi.incpath.begin(), ebi.incpath.end()); - export_binfo.defines.insert(export_binfo.defines.end(), ebi.defines.begin(), ebi.defines.end()); - } - // 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()); @@ -175,25 +196,27 @@ void SourcePackage::create_build_info() export_binfo.libpath.push_back((builder.get_prefix()/"lib").str()); string optimize = config.get_option("optimize").value; - if(lexical_cast(optimize)) + 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.update_from(i->get_build_info()); build_info.unique(); @@ -285,5 +308,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()); }