]> git.tdb.fi Git - builder.git/commitdiff
Include libmode in library lookup hash
authorMikko Rasa <tdb@tdb.fi>
Thu, 29 May 2008 00:27:08 +0000 (00:27 +0000)
committerMikko Rasa <tdb@tdb.fi>
Thu, 29 May 2008 00:27:08 +0000 (00:27 +0000)
Redesign Target::build
Always remove target before rebuilding to avoid trouble with ar

20 files changed:
source/builder.cpp
source/executable.cpp
source/executable.h
source/file.h
source/install.cpp
source/install.h
source/link.cpp
source/objectfile.cpp
source/objectfile.h
source/pkgconfig.cpp
source/pkgconfig.h
source/sourcefile.h
source/staticlibrary.cpp
source/staticlibrary.h
source/systemlibrary.h
source/tarball.cpp
source/tarball.h
source/target.cpp
source/target.h
source/virtualtarget.h

index aabfc00f3908213795ad2fd2a73fb67e6b4dbbb1..d3aabf9de4e07fadc86ef472896f9b815bc0eac8 100644 (file)
@@ -285,8 +285,7 @@ Target *Builder::get_library(const string &lib, const list<string> &path, LibMod
        for(list<string>::const_iterator i=path.begin(); i!=path.end(); ++i)
                update_hash(hash, *i);
 
-       //XXX Incorporate mode into id
-       string id=hash+lib;
+       string id=hash+string(1, mode)+lib;
        TargetMap::iterator i=libraries.find(id);
        if(i!=libraries.end())
                return i->second;
index 488dd2966a27279e1d85ac8100f1be51977fdafd..5d1e1c8f24fbf428a8dff009c886a3efde3f7c58 100644 (file)
@@ -80,9 +80,9 @@ void Executable::find_depends()
        deps_ready=true;
 }
 
-Action *Executable::build()
+Action *Executable::create_action()
 {
-       return Target::build(new Link(builder, *this));;
+       return new Link(builder, *this);
 }
 
 /**
index 7d6ea28b46d70b8e656573a1826a690e0d4a9b95..e415668e9890de8ab6106fa72d8e8f6850ace991 100644 (file)
@@ -24,10 +24,11 @@ public:
        const char      *get_type() const      { return "Executable"; }
        const Component &get_component() const { return comp; }
        void            find_depends();
-       Action          *build();
 private:
        const Component &comp;
 
+       virtual Action  *create_action();
+
        static std::string generate_target_name(const Component &);
 };
 
index 35c10872d14ae5d32ab9ca6252dec2ddf2e154af..cd3eccf6b48c963d125d70cfb34824b16ecaabb8 100644 (file)
@@ -15,7 +15,8 @@ class File: public Target
 public:
        File(Builder &, const std::string &);
        virtual const char *get_type() const { return "File"; }
-       virtual Action *build() { return 0; }
+private:
+       virtual Action    *create_action()     { return 0; }
 };
 
 #endif
index 6dcaef0ca9da3c3656ad85723d447438daffcff4..721f9636460f7d0b92a558733d5384443eb1e553 100644 (file)
@@ -39,9 +39,9 @@ void Install::check_rebuild()
        }
 }
 
-Action *Install::build()
+Action *Install::create_action()
 {
-       return Target::build(new Copy(builder, *package, depends.front()->get_name(), name));
+       return new Copy(builder, *package, depends.front()->get_name(), name);
 }
 
 string Install::generate_target_name(const Target &tgt)
index 672161580c8ee3b2bc67b5ac5d7d8396c3d62f2b..84c2b23ef49cb9189c75fd469ba48cc8a1dcac0d 100644 (file)
@@ -20,9 +20,10 @@ public:
        Install(Builder &, const SourcePackage &, Target &);
        const char *get_type() const { return "Install"; }
        void       check_rebuild();
-       Action     *build();
 private:
-       std::string generate_target_name(const Target &);
+       virtual Action *create_action();
+
+       static std::string generate_target_name(const Target &);
 };
 
 #endif
index 910387e2299b7c55b1d224b6a1b75853673a40ab..f775158cea53d73ab9b9f676b49b77f4f59fe0cb 100644 (file)
@@ -56,7 +56,7 @@ Link::Link(Builder &b, const Executable &exe):
                else if(SharedLibrary *shlib=dynamic_cast<SharedLibrary *>(tgt))
                        argv.push_back("-l"+shlib->get_libname());
                else if(dynamic_cast<StaticLibrary *>(tgt))
-                       argv.push_back(relative((*i)->get_name(), work_dir).str());
+                       argv.push_back((*i)->get_name());
                else if(SystemLibrary *syslib=dynamic_cast<SystemLibrary *>(tgt))
                        argv.push_back("-l"+syslib->get_libname());
        }
index 3fd88d25b06f83af74eb8a051e55d4af05a2cf06..6790082861875c087fee7f34d953e3e4445f8bf5 100644 (file)
@@ -48,10 +48,6 @@ void ObjectFile::find_depends()
        deps_ready=new_deps.empty();
 }
 
-Action *ObjectFile::build()
-{
-       return Target::build(new Compile(builder, *this));
-}
 
 /**
 Recursively looks for header targets and adds them as dependencies.
@@ -91,6 +87,11 @@ void ObjectFile::add_depend(Target *tgt)
        new_deps.push_back(tgt);
 }
 
+Action *ObjectFile::create_action()
+{
+       return new Compile(builder, *this);
+}
+
 string ObjectFile::generate_target_name(const Component &comp, const string &src)
 {
        const SourcePackage &pkg=comp.get_package();
index 21a988d4ce5abe093ee3968e40c7163fd5931064..dbb49fe02c8355d3f43f9eaa24f3ce0016a25851 100644 (file)
@@ -23,13 +23,13 @@ public:
        const char      *get_type() const      { return "ObjectFile"; }
        const Component &get_component() const { return comp; }
        void            find_depends();
-       Action          *build();
 private:
        const Component &comp;
        TargetList      new_deps;
        
        void find_depends(Target *);
        void add_depend(Target *);
+       virtual Action  *create_action();
 
        static std::string generate_target_name(const Component &, const std::string &);
 };
index d31ab9d2d9ce01cc4d8be570ba37d3fe428ea9f0..e8fca575200eddf305fa1af8e2b3cef9b844f531 100644 (file)
@@ -16,7 +16,7 @@ PkgConfig::PkgConfig(Builder &b, const SourcePackage &p):
        buildable=true;
 }
 
-Action *PkgConfig::build()
+Action *PkgConfig::create_action()
 {
-       return Target::build(new PkgConfigAction(builder, *this));
+       return new PkgConfigAction(builder, *this);
 }
index f88e248cb4b5d3327a55a1d825383bf07eb7b83e..20e5fbfaac88380040283198ed7f42cdc4429cee 100644 (file)
@@ -19,9 +19,10 @@ class PkgConfig: public Target
 public:
        PkgConfig(Builder &, const SourcePackage &);
        const char *get_type() const { return "PkgConfig"; }
-       Action     *build();
 private:
        const Package &pkg;
+
+       virtual Action *create_action();
 };
 
 #endif
index a6688d07ff0ce2022abdf5dc2c01a25ae473f29c..ea6ed05f9efab6bc8d547cd5e0b33799dff549de 100644 (file)
@@ -23,10 +23,11 @@ public:
        const char       *get_type() const     { return "SourceFile"; }
        const Component  *get_component() const { return comp; }
        void             find_depends();
-       Action           *build() { return 0; }
 private:
        const Component *comp;
        StringList      includes;
+
+       virtual Action    *create_action()     { return 0; }
 };
 
 #endif
index 56d857e02a1aa049fa4713faea44748223ea6f3a..9a35677efcd3891d1a61e097e15e57016fbd6529 100644 (file)
@@ -22,9 +22,9 @@ StaticLibrary::StaticLibrary(Builder &b, const Component &c, const std::list<Obj
                add_depend(*i);
 }
 
-Action *StaticLibrary::build()
+Action *StaticLibrary::create_action()
 {
-       return Target::build(new Archive(builder, *this));;
+       return new Archive(builder, *this);
 }
 
 string StaticLibrary::generate_target_name(const Component &c)
index cd0342ea47b950ef88c0b25bc3c5427569018e13..cb27138abe6d67f7264747c12194568e60aebc8c 100644 (file)
@@ -22,10 +22,11 @@ public:
        StaticLibrary(Builder &, const Component &, const std::list<ObjectFile *> &);
        const char      *get_type() const      { return "StaticLibrary"; }
        const Component &get_component() const { return comp; }
-       Action          *build();
 private:
        const Component &comp;
 
+       virtual Action  *create_action();
+
        std::string generate_target_name(const Component &);
 };
 
index a0b315acee348c8696fa7378c91981da7d713280..2b56f4cf61f41e22822890e8f96d9ccdf88d8844 100644 (file)
@@ -19,9 +19,10 @@ public:
        SystemLibrary(Builder &, const std::string &);
        const char        *get_type() const    { return "SystemLibrary"; }
        const std::string &get_libname() const { return libname; }
-       Action            *build()             { return 0; }
 private:
        std::string libname;
+
+       virtual Action    *create_action()     { return 0; }
 };
 
 #endif
index 5d7678d28a79e33f55a076166b8886915365f5c2..5782cecdca9b2bf15590ca7326f36dfcab7d91cf 100644 (file)
@@ -45,9 +45,9 @@ void TarBall::find_depends()
        deps_ready=true;
 }
 
-Action *TarBall::build()
+Action *TarBall::create_action()
 {
-       return Target::build(new Tar(builder, *this));
+       return new Tar(builder, *this);
 }
 
 string TarBall::create_target_name(const SourcePackage &pkg, const string &extra_ver)
index 04cd661eb7995a88c9187b2db27e5761cf980a93..cadd0325f642c01305b794aadd311c94c6f35ade 100644 (file)
@@ -17,11 +17,12 @@ public:
        virtual const char *get_type() const { return "TarBall"; }
        const SourcePackage *get_package() const;
        virtual void find_depends();
-       virtual Action *build();
 private:
        std::string tarname;
 
-       std::string create_target_name(const SourcePackage &, const std::string &);
+       virtual Action *create_action();
+
+       static std::string create_target_name(const SourcePackage &, const std::string &);
 };
 
 #endif
index b094e941e6984707f47d47e75bea1f2455188b60..f17b88e103c6a8a3725d079ecaf046339b1c0824 100644 (file)
@@ -68,6 +68,28 @@ void Target::prepare()
 
 }
 
+Action *Target::build()
+{
+       if(!buildable)
+       {
+               rebuild=false;
+               return 0;
+       }
+
+       if(!builder.get_dry_run() && exists(name))
+               unlink(name);
+
+       Action *action=create_action();
+       if(action)
+       {
+               action->signal_done.connect(sigc::mem_fun(this, &Target::build_done));
+
+               building=true;
+       }
+
+       return action;
+}
+
 /**
 Returns the number of targets that need to be rebuilt in order to get this
 target up-to-date.
@@ -144,17 +166,6 @@ void Target::check_rebuild()
                mark_rebuild("Package options changed");
 }
 
-/**
-Hooks the target up with the given action, then returns it.  This should be
-called from the public build() function of buildable targets.
-*/
-Action *Target::build(Action *action)
-{
-       building=true;
-       action->signal_done.connect(sigc::mem_fun(this, &Target::build_done));
-       return action;
-}
-
 /**
 Handles for the build_done signal of Action.
 */
index cf1d18651c9ed5f92c0ac0792b1ae6d75bf153a8..04a360dab57394ec23c305b69825a80135edcee9 100644 (file)
@@ -49,7 +49,7 @@ public:
        /**
        Creates and returns an Action suitable for building this target.
        */
-       virtual Action     *build()=0;
+       Action             *build();
 
        void               reset_count()               { counted=false; }
        virtual unsigned   count_rebuild();
@@ -76,7 +76,7 @@ protected:
        Target(Builder &, const Package *, const std::string &);
        void         mark_rebuild(const std::string &);
        virtual void check_rebuild();
-       Action       *build(Action *);
+       virtual Action *create_action() =0;
        virtual void build_done();
 };
 
index aec308016983fec9d3c463ebdd91270b50160389..67c3014b719bd20f4cfca09fea7600cf3fff958a 100644 (file)
@@ -18,10 +18,10 @@ class VirtualTarget: public Target
 public:
        VirtualTarget(Builder &b, const std::string &n): Target(b, 0, n) { }
        const char *get_type() const { return "VirtualTarget"; }
-       Action     *build()          { rebuild=false; return 0; }
        unsigned   count_rebuild();
 private:
        void check_rebuild();
+       virtual Action *create_action() { return 0; }
 };
 
 #endif