X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbuilder.cpp;h=77579ea45e60a894da24fb44182e972e7c9ba2be;hb=433f9ef196b6f5af6bb38447b650f5afaa5a783a;hp=76522ad1aaa446f0f305f97881e0d2216491b694;hpb=04c316da6d5d90e43cba262f54d90ca231f703bf;p=builder.git diff --git a/source/builder.cpp b/source/builder.cpp index 76522ad..77579ea 100644 --- a/source/builder.cpp +++ b/source/builder.cpp @@ -1,13 +1,12 @@ /* $Id$ This file is part of builder -Copyright © 2006-2009 Mikko Rasa, Mikkosoft Productions +Copyright © 2006-2010 Mikko Rasa, Mikkosoft Productions Distributed under the LGPL */ #include #include -#include #include #include #include @@ -54,6 +53,7 @@ void update_hash(string &hash, const string &value) Builder::Builder(int argc, char **argv): main_pkg(0), + native_arch(*this, string()), analyzer(0), build(false), clean(0), @@ -139,25 +139,29 @@ Builder::Builder(int argc, char **argv): cwd = FS::getcwd(); - utsname un; - string sysname = "native"; - if(uname(&un)==0) - sysname = tolower(un.sysname); - - native_arch = &archs.insert(ArchMap::value_type(sysname, Architecture(*this, sysname, true))).first->second; - native_arch->set_tool("CC", "gcc"); - native_arch->set_tool("CXX", "g++"); - native_arch->set_tool("LD", "gcc"); - native_arch->set_tool("LXX", "g++"); - native_arch->set_tool("AR", "ar"); + native_arch.set_tool("CC", "gcc"); + native_arch.set_tool("CXX", "g++"); + native_arch.set_tool("LD", "gcc"); + native_arch.set_tool("LXX", "g++"); + native_arch.set_tool("AR", "ar"); load_build_file((FS::get_sys_data_dir(argv[0], "builder")/"builderrc").str()); load_build_file((FS::get_user_data_dir("builder")/"rc").str()); if(arch.empty()) - current_arch = native_arch; + current_arch = &native_arch; else - current_arch = &get_architecture(arch); + current_arch = new Architecture(*this, arch); + + if(!current_arch->is_native()) + { + for(StringMap::const_iterator i=cross_prefixes.begin(); i!=cross_prefixes.end(); ++i) + if(current_arch->match_name(i->first)) + { + current_arch->set_cross_prefix(i->second); + break; + } + } if(prfx.empty()) { @@ -247,7 +251,11 @@ int Builder::main() return 0; if(verbose>=2) - IO::print("Building on %s, for %s\n", native_arch->get_name(), current_arch->get_name()); + { + IO::print("Building on %s, for %s%s\n", native_arch.get_name(), + current_arch->get_name(), (current_arch->is_native() ? " (native)" : "")); + IO::print("Prefix is %s\n", prefix); + } if(verbose>=1) IO::print("%d active packages, %d targets\n", all_reqs.size(), targets.size()); if(verbose>=2) @@ -326,7 +334,7 @@ string Builder::run_pkgconfig(const string &pkg, const string &what) Package *Builder::get_package(const string &name) { - PackageMap::iterator i = packages.find(format("%s/%s", name, current_arch->get_name())); + PackageMap::iterator i = packages.find(format("%s/%s", name, current_arch->get_system())); if(i==packages.end()) i = packages.find(name); if(i!=packages.end()) @@ -409,7 +417,7 @@ Target *Builder::get_header(const string &include, const FS::Path &from, const l if(current_arch->is_native()) syspath.push_back("/usr/include"); else - syspath.push_back("/usr/"+current_arch->get_prefix()+"/include"); + syspath.push_back("/usr/"+current_arch->get_cross_prefix()+"/include"); if(cxx_ver!="-") syspath.push_back((FS::Path("/usr/include/c++/")/cxx_ver).str()); @@ -444,7 +452,7 @@ Target *Builder::get_library(const string &lib, const list &path, LibMod syspath.push_back("/usr/lib"); } else - syspath.push_back("/usr/"+current_arch->get_prefix()+"/lib"); + syspath.push_back("/usr/"+current_arch->get_cross_prefix()+"/lib"); if(verbose>=5) IO::print("Looking for library %s with path %s\n", lib, join(path.begin(), path.end())); @@ -460,15 +468,6 @@ Target *Builder::get_library(const string &lib, const list &path, LibMod return tgt; } -const Architecture &Builder::get_architecture(const string &arch) const -{ - ArchMap::const_iterator i = archs.find(arch); - if(i==archs.end()) - throw KeyError("Unknown architecture", arch); - - return i->second; -} - void Builder::apply_profile_template(Config &config, const string &pt) const { vector parts = split(pt, '-'); @@ -677,7 +676,8 @@ Target *Builder::get_library(const string &lib, const FS::Path &path, LibMode mo if(mode!=ALL_STATIC) { - if(current_arch->get_name()=="win32") + // XXX Should probably let the Architecture populate the list + if(current_arch->get_system()=="windows") { candidates.push_back("lib"+lib+".dll"); candidates.push_back(lib+".dll"); @@ -689,7 +689,7 @@ Target *Builder::get_library(const string &lib, const FS::Path &path, LibMode mo /* Static libraries are always considered, since sometimes shared versions may not be available */ candidates.push_back("lib"+lib+".a"); - if(current_arch->get_name()=="win32") + if(current_arch->get_system()=="windows") candidates.push_back("lib"+lib+".dll.a"); for(StringList::iterator i=candidates.begin(); i!=candidates.end(); ++i) @@ -859,19 +859,12 @@ Builder::Loader::Loader(Builder &b, const FS::Path &s): bld(b), src(s) { - add("architecture", &Loader::architecture); add("binary_package", &Loader::binpkg); + add("cross_prefix", &Loader::cross_prefix); add("profile", &Loader::profile); add("package", &Loader::package); } -void Builder::Loader::architecture(const string &n) -{ - Architecture arch(bld, n); - load_sub(arch); - bld.archs.insert(ArchMap::value_type(n, arch)); -} - void Builder::Loader::binpkg(const string &n) { BinaryPackage *pkg = new BinaryPackage(bld, n); @@ -879,6 +872,11 @@ void Builder::Loader::binpkg(const string &n) bld.packages.insert(PackageMap::value_type(n, pkg)); } +void Builder::Loader::cross_prefix(const string &a, const string &p) +{ + bld.cross_prefixes[a] = p; +} + void Builder::Loader::profile(const string &n) { StringMap prf;