X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbuilder.cpp;h=aabfc00f3908213795ad2fd2a73fb67e6b4dbbb1;hb=0f5283a54fd188072eca23fbd980a43c6c869913;hp=8bef2c6e5d7a67d5126d86fbfa53b1295f5eb482;hpb=b50019441dd16d4aaba1eeffc381ded3e4a4be2d;p=builder.git diff --git a/source/builder.cpp b/source/builder.cpp index 8bef2c6..aabfc00 100644 --- a/source/builder.cpp +++ b/source/builder.cpp @@ -52,7 +52,8 @@ Builder::Builder(int argc, char **argv): conf_all(false), conf_only(false), build_all(false), - create_makefile(false) + create_makefile(false), + current_arch("native") { string analyze_mode; string work_dir; @@ -73,10 +74,12 @@ Builder::Builder(int argc, char **argv): getopt.add_option('C', "chdir", work_dir, GetOpt::REQUIRED_ARG); getopt.add_option('P', "progress", show_progress, GetOpt::NO_ARG); getopt.add_option('W', "what-if", what_if, GetOpt::REQUIRED_ARG); + getopt.add_option( "arch", current_arch, GetOpt::REQUIRED_ARG); getopt.add_option( "conf-only", conf_only, GetOpt::NO_ARG); getopt.add_option( "full-paths", full_paths, GetOpt::NO_ARG); //getopt.add_option( "makefile", create_makefile, GetOpt::NO_ARG); getopt.add_option( "max-depth", max_depth, GetOpt::REQUIRED_ARG); + getopt.add_option( "prefix", prefix, GetOpt::REQUIRED_ARG); getopt(argc, argv); if(!analyze_mode.empty()) @@ -125,21 +128,29 @@ Builder::Builder(int argc, char **argv): native_arch.set_tool("LXX", "g++"); native_arch.set_tool("AR", "ar"); - const char *home=getenv("HOME"); - if(home) - load_build_file((Path(home)/".builderrc").str()); + load_build_file((get_home_dir()/".builderrc").str()); + + if(prefix.empty()) + { + if(current_arch=="native") + prefix=(get_home_dir()/"local").str(); + else + prefix=(get_home_dir()/"local"/current_arch).str(); + } } /** -Gets a package with the specified name, possibly creating it. +Gets a package by name, possibly creating it. -@param n Package name +@param name Package name @return Pointer to the package, or 0 if the package could not be located */ -Package *Builder::get_package(const string &n) +Package *Builder::get_package(const string &name) { - PackageMap::iterator i=packages.find(n); + PackageMap::iterator i=packages.find(format("%s/%s", name, current_arch)); + if(i==packages.end()) + i=packages.find(name); if(i!=packages.end()) return i->second; @@ -147,7 +158,7 @@ Package *Builder::get_package(const string &n) list argv; argv.push_back("pkg-config"); argv.push_back("--variable=source"); - argv.push_back(n); + argv.push_back(name); if(verbose>=4) cout<<"Running "<second; break; } // Package source not found - create a binary package - Package *pkg=BinaryPackage::from_pkgconfig(*this, n); + Package *pkg=BinaryPackage::from_pkgconfig(*this, name); - packages.insert(PackageMap::value_type(n, pkg)); + packages.insert(PackageMap::value_type(name, pkg)); if(!pkg) - problem(n, "not found"); + problem(name, "not found"); return pkg; } @@ -201,7 +214,7 @@ path. Considers known targets as well as existing files. If a matching target is not found but a file exists, a new SystemHeader target will be created and returned. */ -Target *Builder::get_header(const string &include, const string &arch, const string &from, const list &path) +Target *Builder::get_header(const string &include, const string &from, const list &path) { string hash(8, 0); update_hash(hash, from); @@ -217,7 +230,7 @@ Target *Builder::get_header(const string &include, const string &arch, const str if(cxx_ver.empty()) { StringList argv; - argv.push_back(get_architecture(arch).get_tool("CXX")); + argv.push_back(get_current_arch().get_tool("CXX")); argv.push_back("--version"); cxx_ver=Regex("[0-9]\\.[0-9.]+").match(run_command(argv))[0].str; while(!cxx_ver.empty() && !exists(Path("/usr/include/c++")/cxx_ver)) @@ -236,10 +249,10 @@ Target *Builder::get_header(const string &include, const string &arch, const str cout<<"Looking for include "< &path, LibMode mode) +Target *Builder::get_library(const string &lib, const list &path, LibMode mode) { string hash(8, 0); for(list::const_iterator i=path.begin(); i!=path.end(); ++i) @@ -279,22 +292,22 @@ Target *Builder::get_library(const string &lib, const string &arch, const listsecond; StringList syspath; - if(arch=="native") + if(current_arch=="native") { syspath.push_back("/lib"); syspath.push_back("/usr/lib"); } else - syspath.push_back("/usr/"+get_architecture(arch).get_prefix()+"/lib"); + syspath.push_back("/usr/"+get_current_arch().get_prefix()+"/lib"); if(verbose>=5) cout<<"Looking for library "<second; } +const Architecture &Builder::get_current_arch() const +{ + return get_architecture(current_arch); +} + void Builder::apply_profile_template(Config &config, const string &pt) const { vector parts=split(pt, '-'); @@ -362,14 +380,6 @@ int Builder::main() PackageList all_reqs=main_pkg->collect_requires(); - for(PackageList::const_iterator i=all_reqs.begin(); i!=all_reqs.end(); ++i) - { - SourcePackage *spkg=dynamic_cast(*i); - string prob; - if(spkg && spkg->get_arch()!=main_pkg->get_arch()) - problem(spkg->get_name(), format("wrong architecture (%s)", spkg->get_arch())); - } - if(conf_only) return 0; @@ -608,14 +618,14 @@ Target *Builder::get_header(const Msp::Path &fn) return 0; } -Target *Builder::get_library(const string &lib, const string &arch, const Path &path, LibMode mode) +Target *Builder::get_library(const string &lib, const Path &path, LibMode mode) { // Populate a list of candidate filenames StringList candidates; if(mode!=ALL_STATIC) { - if(arch=="win32") + if(current_arch=="win32") { candidates.push_back("lib"+lib+".dll"); candidates.push_back(lib+".dll"); @@ -627,7 +637,7 @@ Target *Builder::get_library(const string &lib, const string &arch, const Path & /* Static libraries are always considered, since sometimes shared versions may not be available */ candidates.push_back("lib"+lib+".a"); - if(arch=="win32") + if(current_arch=="win32") candidates.push_back("lib"+lib+".dll.a"); for(StringList::iterator i=candidates.begin(); i!=candidates.end(); ++i)