]> git.tdb.fi Git - builder.git/commitdiff
Change arch and prefix to global options
authorMikko Rasa <tdb@tdb.fi>
Thu, 13 Mar 2008 20:14:25 +0000 (20:14 +0000)
committerMikko Rasa <tdb@tdb.fi>
Thu, 13 Mar 2008 20:14:25 +0000 (20:14 +0000)
15 files changed:
builderrc
source/architecture.h
source/archive.cpp
source/builder.cpp
source/builder.h
source/compile.cpp
source/condition.cpp
source/config.cpp
source/executable.cpp
source/install.cpp
source/link.cpp
source/objectfile.cpp
source/sourcefile.cpp
source/sourcepackage.cpp
source/sourcepackage.h

index 6b2b0eadbf4dc4e8bfc08a65a81abbb8598fd592..b12826656a36b959ed3e2678161848b17105fb3c 100644 (file)
--- 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";
-};
index 16ff50547c465e6ccb77957321fdcc6593b88cad..a205e5389998b854a6401dc83302095c2927a9b2 100644 (file)
@@ -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;
index 70d63632824b1e8accf6bd5e54c135877c76d1ea..a018dc9235c4421351003565cb4e6a2c1c438af9 100644 (file)
@@ -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());
index 8bef2c6e5d7a67d5126d86fbfa53b1295f5eb482..aabfc00f3908213795ad2fd2a73fb67e6b4dbbb1 100644 (file)
@@ -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<string> argv;
        argv.push_back("pkg-config");
        argv.push_back("--variable=source");
-       argv.push_back(n);
+       argv.push_back(name);
        if(verbose>=4)
                cout<<"Running "<<join(argv.begin(), argv.end())<<'\n';
        string srcdir=strip(run_command(argv));
@@ -157,29 +168,31 @@ Package *Builder::get_package(const string &n)
                dirs.push_back(srcdir);
 
        // Make some other guesses about the source directory
-       string dirname=n;
-       if(!dirname.compare(0, 3, "msp"))
-               dirname.erase(0, 3);
-       dirs.push_back(cwd/dirname);
-       dirs.push_back(cwd/".."/dirname);
+       dirs.push_back(cwd/name);
+       dirs.push_back(cwd/".."/name);
+       if(!name.compare(0, 3, "msp"))
+       {
+               dirs.push_back(cwd/name.substr(3));
+               dirs.push_back(cwd/".."/name.substr(3));
+       }
 
        // Go through the candidate directories and look for a Build file
        for(PathList::iterator j=dirs.begin(); j!=dirs.end(); ++j)
                if(!load_build_file(*j/"Build"))
                {
-                       i=packages.find(n);
+                       i=packages.find(name);
                        if(i!=packages.end())
                                return i->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<string> &path)
+Target *Builder::get_header(const string &include, const string &from, const list<string> &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 "<<fn<<" with path "<<join(path.begin(), path.end())<<'\n';
 
        StringList syspath;
-       if(arch=="native")
+       if(current_arch=="native")
                syspath.push_back("/usr/include");
        else
-               syspath.push_back("/usr/"+get_architecture(arch).get_prefix()+"/include");
+               syspath.push_back("/usr/"+get_architecture(current_arch).get_prefix()+"/include");
        syspath.push_back((Path("/usr/include/c++/")/cxx_ver/fn).str());
 
        Target *tgt=0;
@@ -266,7 +279,7 @@ a new SystemLibrary target will be created and returned.
 
 @return  Some kind of library target, if a match was found
 */
-Target *Builder::get_library(const string &lib, const string &arch, const list<string> &path, LibMode mode)
+Target *Builder::get_library(const string &lib, const list<string> &path, LibMode mode)
 {
        string hash(8, 0);
        for(list<string>::const_iterator i=path.begin(); i!=path.end(); ++i)
@@ -279,22 +292,22 @@ Target *Builder::get_library(const string &lib, const string &arch, const list<s
                return i->second;
 
        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 "<<lib<<" with path "<<join(path.begin(), path.end())<<'\n';
 
        Target *tgt=0;
        for(StringList::const_iterator j=path.begin(); (!tgt && j!=path.end()); ++j)
-               tgt=get_library(lib, arch, cwd/ *j, mode);
+               tgt=get_library(lib, cwd/ *j, mode);
        for(StringList::iterator j=syspath.begin(); (!tgt && j!=syspath.end()); ++j)
-               tgt=get_library(lib, arch, *j, mode);
+               tgt=get_library(lib, *j, mode);
 
        libraries.insert(TargetMap::value_type(id, tgt));
 
@@ -305,11 +318,16 @@ const Architecture &Builder::get_architecture(const string &arch) const
 {
        ArchMap::const_iterator i=archs.find(arch);
        if(i==archs.end())
-               throw InvalidParameterValue("Unknown architecture");
+               throw KeyError("Unknown architecture", arch);
 
        return i->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<string> 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<SourcePackage *>(*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)
index 42ddcc43b25ba31c60f5a138694607c2f884f332..d19511c87e8932a736f3fc0105ff513c4916f429 100644 (file)
@@ -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();
index 44d4d6255fe1c2d57caea506e6d00809d7fce541..53802639dae7786675aff8e9ff994582bed2334b 100644 (file)
@@ -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();
index 4b45dca51f2eeaf06a13880d2c214b3fe557d594..5cce44462d3e984b9f61e85f2152e9c994a70d07 100644 (file)
@@ -6,6 +6,7 @@ Distributed under the LGPL
 */
 
 #include <msp/strings/utils.h>
+#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;
        }
 
index b3685d565db45d828a49ea99cab5a9bdc7cbf0ef..753a4ef65b0577dca6bf0301290898461cd188de 100644 (file)
@@ -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);
 
index 076728c833ae81c5f2a35d0f9035f84406b3f098..ea2f4e0204684cb94ea25799fcd57e50a8029040 100644 (file)
@@ -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<string> &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();
 }
index c26024a801874328f61e755144d59fc30f0bfc7e..6dcaef0ca9da3c3656ad85723d447438daffcff4 100644 (file)
@@ -48,7 +48,7 @@ string Install::generate_target_name(const Target &tgt)
 {
        const SourcePackage *spkg=dynamic_cast<const SourcePackage *>(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;
index 14a7d46df7bd77749427c3793c71239c6b8b4bd1..7d37ac4f619685ccaf4ffea257953480cad805a5 100644 (file)
@@ -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");
index c0a233f56d8f51fe3d916ec4c70776330314d7ed..3fd88d25b06f83af74eb8a051e55d4af05a2cf06 100644 (file)
@@ -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<string> &includes=src->get_includes();
        for(list<string>::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();
 }
index f05d2035edb534b62ac8a56bc06c9bfd5b8b010c..af1c04a5cf4205be339b86a1e9cead91f8a02f90 100644 (file)
@@ -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<string>::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);
        }
index ef4fd5760a26fd1a90f7fb077d3256612c4b9fca..ef0e60cbb7b2a3373dea85d6da7e50a5426ac6bd 100644 (file)
@@ -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<unsigned>(optimize))
index f47f25931489928c0f98524a62b85f37cd867f72..3b6ef11d845bb36262f776817fa9a44859c19bf7 100644 (file)
@@ -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; }