From: Mikko Rasa Date: Thu, 13 Mar 2008 20:14:25 +0000 (+0000) Subject: Change arch and prefix to global options X-Git-Tag: 0.9~11 X-Git-Url: http://git.tdb.fi/?a=commitdiff_plain;h=0f5283a54fd188072eca23fbd980a43c6c869913;p=builder.git Change arch and prefix to global options --- diff --git a/builderrc b/builderrc index 6b2b0ea..b128266 100644 --- a/builderrc +++ b/builderrc @@ -8,11 +8,11 @@ binary_package "opengl" }; }; -binary_package "pthread" +binary_package "opengl/win32" { build_info { - library "pthread"; + library "opengl32"; }; }; @@ -59,6 +59,22 @@ binary_package "devil" }; }; +binary_package "devil/win32" +{ + build_info + { + library "DevIL"; + }; +}; + +binary_package "openal/win32" +{ + build_info + { + library "OpenAL32"; + }; +}; + architecture "arm" { prefix "arm-linux-gnu"; @@ -81,17 +97,3 @@ profile "release" option "strip" "1"; option "outdir" "$profile"; }; - -profile "win32" -{ - option "arch" "win32"; - option "prefix" "$HOME/local/$arch"; - option "outdir" "$profile"; -}; - -profile "arm" -{ - option "arch" "arm"; - option "prefix" "$HOME/local/$arch"; - option "outdir" "$profile"; -}; diff --git a/source/architecture.h b/source/architecture.h index 16ff505..a205e53 100644 --- a/source/architecture.h +++ b/source/architecture.h @@ -30,6 +30,7 @@ public: Architecture(Builder &b, const std::string &n); void set_tool(const std::string &t, const std::string &p); std::string get_tool(const std::string &t) const; + const std::string &get_name() const { return name; } const std::string &get_prefix() const { return prefix; } private: Builder &builder; diff --git a/source/archive.cpp b/source/archive.cpp index 70d6363..a018dc9 100644 --- a/source/archive.cpp +++ b/source/archive.cpp @@ -22,7 +22,7 @@ Archive::Archive(Builder &b, const StaticLibrary &lib): const Component &comp=lib.get_component(); std::string tool="AR"; - argv.push_back(builder.get_architecture(comp.get_package().get_arch()).get_tool(tool)); + argv.push_back(builder.get_current_arch().get_tool(tool)); argv.push_back("rc"); argv.push_back(lib.get_name()); 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) diff --git a/source/builder.h b/source/builder.h index 42ddcc4..d19511c 100644 --- a/source/builder.h +++ b/source/builder.h @@ -39,10 +39,12 @@ public: SourcePackage *get_main_package() const { return main_pkg; } Target *get_target(const std::string &) const; const TargetMap &get_targets() const { return targets; } - Target *get_header(const std::string &, const std::string &, const std::string &, const StringList &); - Target *get_library(const std::string &, const std::string &, const StringList &, LibMode); + Target *get_header(const std::string &, const std::string &, const StringList &); + Target *get_library(const std::string &, const StringList &, LibMode); const Msp::Path &get_cwd() const { return cwd; } const Architecture &get_architecture(const std::string &) const; + const Architecture &get_current_arch() const; + const std::string &get_prefix() const { return prefix; } void apply_profile_template(Config &, const std::string &) const; void add_target(Target *); void problem(const std::string &, const std::string &); @@ -81,7 +83,7 @@ private: StringList cmdline_targets; StringMap cmdline_options; - Msp::Path cwd; + Msp::Path cwd; PackageMap packages; SourcePackage *main_pkg; @@ -109,11 +111,13 @@ private: bool conf_only; bool build_all; bool create_makefile; + std::string current_arch; + std::string prefix; int load_build_file(const Msp::Path &); int create_targets(); Target *get_header(const Msp::Path &); - Target *get_library(const std::string &, const std::string &, const Msp::Path &, LibMode); + Target *get_library(const std::string &, const Msp::Path &, LibMode); void update_hash(std::string &, const std::string &); int do_build(); int do_clean(); diff --git a/source/compile.cpp b/source/compile.cpp index 44d4d62..5380263 100644 --- a/source/compile.cpp +++ b/source/compile.cpp @@ -31,7 +31,7 @@ Compile::Compile(Builder &b, const ObjectFile &obj): else tool="CC"; - argv.push_back(builder.get_architecture(comp.get_package().get_arch()).get_tool(tool)); + argv.push_back(builder.get_current_arch().get_tool(tool)); argv.push_back("-c"); const BuildInfo &binfo=comp.get_build_info(); diff --git a/source/condition.cpp b/source/condition.cpp index 4b45dca..5cce444 100644 --- a/source/condition.cpp +++ b/source/condition.cpp @@ -6,6 +6,7 @@ Distributed under the LGPL */ #include +#include "builder.h" #include "condition.h" #include "sourcepackage.h" @@ -44,7 +45,13 @@ bool Condition::eval() if(i->second[1]=='=') ++start; - if((conf.get_option(i->first).value==i->second.substr(start))==neg) + string value; + if(conf.is_option(i->first)) + value=conf.get_option(i->first).value; + else if(i->first=="arch") + value=pkg.get_builder().get_current_arch().get_name(); + + if((value==i->second.substr(start))==neg) result=false; } diff --git a/source/config.cpp b/source/config.cpp index b3685d5..753a4ef 100644 --- a/source/config.cpp +++ b/source/config.cpp @@ -157,8 +157,10 @@ void Config::finish() string value; if(is_option(var)) value=get_option(var).value; - else - value=getenv(var.c_str()); + else if(var=="arch") + value=package.get_builder().get_current_arch().get_name(); + else if(const char *ptr=getenv(var.c_str())) + value=ptr; opt.value.replace(dollar, end-dollar, value); @@ -211,7 +213,8 @@ void Config::load() try { - IO::File in(fn.str()); + IO::File inf(fn.str()); + IO::Buffered in(inf); mtime=Time::TimeStamp::from_unixtime(stat(fn).st_mtime); diff --git a/source/executable.cpp b/source/executable.cpp index 076728c..ea2f4e0 100644 --- a/source/executable.cpp +++ b/source/executable.cpp @@ -44,12 +44,11 @@ void Executable::find_depends() queue.erase(queue.begin()); const StringList &libpath=c->get_build_info().libpath; - const string &arch=c->get_package().get_arch(); const list &libs=c->get_build_info().libs; for(StringList::const_iterator i=libs.begin(); i!=libs.end(); ++i) { - Target *lib=builder.get_library(*i, arch, libpath, libmode); + Target *lib=builder.get_library(*i, libpath, libmode); if(lib) { dep_libs.push_back(lib); @@ -89,8 +88,9 @@ we need to pass the value to the Target c'tor. */ string Executable::generate_target_name(const Component &c) { + const SourcePackage &pkg=c.get_package(); string prefix, suffix; - const string &arch=c.get_package().get_arch(); + const string &arch=pkg.get_builder().get_current_arch().get_name(); if(c.get_type()==Component::LIBRARY) { @@ -108,5 +108,5 @@ string Executable::generate_target_name(const Component &c) suffix=".exe"; } - return (c.get_package().get_out_dir()/(prefix+c.get_name()+suffix)).str(); + return (pkg.get_out_dir()/(prefix+c.get_name()+suffix)).str(); } diff --git a/source/install.cpp b/source/install.cpp index c26024a..6dcaef0 100644 --- a/source/install.cpp +++ b/source/install.cpp @@ -48,7 +48,7 @@ string Install::generate_target_name(const Target &tgt) { const SourcePackage *spkg=dynamic_cast(tgt.get_package()); - Path base=spkg->get_prefix(); + Path base=spkg->get_builder().get_prefix(); string tgtname=tgt.get_name().substr(tgt.get_name().rfind('/')+1); string mid; diff --git a/source/link.cpp b/source/link.cpp index 14a7d46..7d37ac4 100644 --- a/source/link.cpp +++ b/source/link.cpp @@ -27,7 +27,7 @@ Link::Link(Builder &b, const Executable &exe): //XXX Determine whether to use g++ or gcc string tool="LXX"; - argv.push_back(builder.get_architecture(comp.get_package().get_arch()).get_tool(tool)); + argv.push_back(builder.get_current_arch().get_tool(tool)); if(comp.get_type()==Component::LIBRARY || comp.get_type()==Component::MODULE) argv.push_back("-shared"); diff --git a/source/objectfile.cpp b/source/objectfile.cpp index c0a233f..3fd88d2 100644 --- a/source/objectfile.cpp +++ b/source/objectfile.cpp @@ -71,13 +71,12 @@ void ObjectFile::find_depends(Target *tgt) if(!src) return; - const string &arch=comp.get_package().get_arch(); const StringList &incpath=comp.get_build_info().incpath; const list &includes=src->get_includes(); for(list::const_iterator i=includes.begin(); i!=includes.end(); ++i) { - Target *hdr2=builder.get_header(*i, arch, path, incpath); + Target *hdr2=builder.get_header(*i, path, incpath); if(hdr2 && find(depends.begin(), depends.end(), hdr2)==depends.end()) add_depend(hdr2); } @@ -94,5 +93,6 @@ void ObjectFile::add_depend(Target *tgt) string ObjectFile::generate_target_name(const Component &comp, const string &src) { - return (comp.get_package().get_temp_dir()/comp.get_name()/(splitext(basename(src)).base+".o")).str(); + const SourcePackage &pkg=comp.get_package(); + return (pkg.get_temp_dir()/comp.get_name()/(splitext(basename(src)).base+".o")).str(); } diff --git a/source/sourcefile.cpp b/source/sourcefile.cpp index f05d203..af1c04a 100644 --- a/source/sourcefile.cpp +++ b/source/sourcefile.cpp @@ -52,12 +52,11 @@ void SourceFile::find_depends() includes=deps_cache.get_deps(name); const StringList &incpath=comp->get_build_info().incpath; - const string &arch=comp->get_package().get_arch(); string path=name.substr(0, name.rfind('/')); for(list::iterator i=includes.begin(); i!=includes.end(); ++i) { - Target *hdr=builder.get_header(*i, arch, path, incpath); + Target *hdr=builder.get_header(*i, path, incpath); if(hdr) add_depend(hdr); } diff --git a/source/sourcepackage.cpp b/source/sourcepackage.cpp index ef4fd57..ef0e60c 100644 --- a/source/sourcepackage.cpp +++ b/source/sourcepackage.cpp @@ -30,7 +30,7 @@ SourcePackage::SourcePackage(Builder &b, const string &n, const Path &s): Msp::Path SourcePackage::get_temp_dir() const { - return source/config.get_option("tempdir").value/config.get_option("profile").value; + return source/config.get_option("tempdir").value/builder.get_current_arch().get_name()/config.get_option("profile").value; } Msp::Path SourcePackage::get_out_dir() const @@ -143,21 +143,8 @@ void SourcePackage::init_config() config.add_option("strip", "0", "Strip symbols from programs"); config.add_option("debug", "0", "Produce debugging symbols"); config.add_option("cpu", "auto", "CPU type to optimize for"); - config.add_option("arch", "native", "Architecture for cross-compiling"); config.add_option("staticlibs", "local", "Use static libraries"); - unsigned flags=get_install_flags(); - if(flags) - config.add_option("prefix", "$HOME/local", "Installation prefix"); - /*if(flags&INCLUDE) - config.add_option("includedir", "$prefix/include", "Header installation directory"); - if(flags&BIN) - config.add_option("includedir", "$prefix/bin", "Binary installation directory"); - if(flags&LIB) - config.add_option("includedir", "$prefix/lib", "Library installation directory"); - if(flags&DATA) - config.add_option("includedir", "$prefix/share", "Data installation directory");*/ - for(FeatureList::iterator i=features.begin(); i!=features.end(); ++i) config.add_option("with_"+i->name, "0", i->descr); @@ -194,10 +181,13 @@ void SourcePackage::create_build_info() unsigned flags=get_install_flags(); + build_info.incpath.push_back((Path(builder.get_prefix())/"include").str()); + build_info.libpath.push_back((Path(builder.get_prefix())/"lib").str()); + if(flags&INCLUDE) - export_binfo.incpath.push_back((Path(config.get_option("prefix").value)/"include").str()); + export_binfo.incpath.push_back((Path(builder.get_prefix())/"include").str()); if(flags&LIB) - export_binfo.libpath.push_back((Path(config.get_option("prefix").value)/"lib").str()); + export_binfo.libpath.push_back((Path(builder.get_prefix())/"lib").str()); string optimize=config.get_option("optimize").value; if(lexical_cast(optimize)) diff --git a/source/sourcepackage.h b/source/sourcepackage.h index f47f259..3b6ef11 100644 --- a/source/sourcepackage.h +++ b/source/sourcepackage.h @@ -58,14 +58,12 @@ public: const Msp::Path &get_source() const { return source; } Msp::Path get_temp_dir() const; Msp::Path get_out_dir() const; - Msp::Path get_prefix() const { return config.get_option("prefix").value; } const ComponentList &get_components() const { return components; } const Config &get_config() const { return config; } const BuildInfo &get_build_info() const { return build_info; } const BuildInfo &get_exported_binfo() const { return export_binfo; } Builder &get_builder() const { return builder; } unsigned get_install_flags(); - const std::string &get_arch() const { return config.get_option("arch").value; } LibMode get_library_mode() const; const PathList &get_tar_files() const { return tar_files; } DependencyCache &get_deps_cache() const { return deps_cache; }