From be6c1ae1dcc97cb3e3019c0384f1bc933fcd321c Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Fri, 4 May 2012 21:14:29 +0300 Subject: [PATCH] Tool names are no longer retrieved from Architecture --- source/architecture.cpp | 34 ----------------------- source/architecture.h | 6 ---- source/virtualfilesystem.cpp | 53 ++++++++++++++++++------------------ source/virtualfilesystem.h | 2 +- 4 files changed, 27 insertions(+), 68 deletions(-) diff --git a/source/architecture.cpp b/source/architecture.cpp index 8e618de..a416551 100644 --- a/source/architecture.cpp +++ b/source/architecture.cpp @@ -122,39 +122,11 @@ Architecture::Architecture(Builder &b, const string &spec): } } -void Architecture::set_tool(const string &t, const string &p) -{ - tools[t] = p; -} - void Architecture::set_cross_prefix(const string &p) { cross_prefix = p; } -std::string Architecture::get_tool(const string &t) const -{ - StringMap::const_iterator i = tools.find(t); - if(i!=tools.end()) - { - if(i->second[0]=='-') - return cross_prefix+i->second; - else - return i->second; - } - - const Architecture &native_arch = builder.get_native_arch(); - if(this!=&native_arch) - { - if(!cross_prefix.empty()) - return cross_prefix+"-"+native_arch.get_tool(t); - else - return native_arch.get_tool(t); - } - else - throw invalid_argument("Unknown tool"); -} - bool Architecture::match_name(const string &pattern) const { vector parts = split(pattern, "-"); @@ -230,10 +202,4 @@ Architecture::Loader::Loader(Architecture &a): arch(a) { add("prefix", &Architecture::cross_prefix); - add("tool", &Loader::tool); -} - -void Architecture::Loader::tool(const string &t, const string &p) -{ - arch.tools[t] = p; } diff --git a/source/architecture.h b/source/architecture.h index 3ea13a0..c07297a 100644 --- a/source/architecture.h +++ b/source/architecture.h @@ -3,7 +3,6 @@ #include #include "buildinfo.h" -#include "misc.h" #include "pattern.h" class Builder; @@ -20,8 +19,6 @@ public: public: Loader(Architecture &); Architecture &get_object() { return arch; } - private: - void tool(const std::string &t, const std::string &p); }; typedef std::list PatternList; @@ -35,7 +32,6 @@ private: std::string name; bool native; std::string cross_prefix; - StringMap tools; PatternList sharedlib_patterns; PatternList staticlib_patterns; PatternList executable_patterns; @@ -50,9 +46,7 @@ public: bool match_name(const std::string &) const; bool is_native() const { return native; } - void set_tool(const std::string &t, const std::string &p); void set_cross_prefix(const std::string &); - std::string get_tool(const std::string &t) const; const std::string &get_cross_prefix() const { return cross_prefix; } const PatternList &get_shared_library_patterns() const { return sharedlib_patterns; } diff --git a/source/virtualfilesystem.cpp b/source/virtualfilesystem.cpp index ef7605b..7febdb6 100644 --- a/source/virtualfilesystem.cpp +++ b/source/virtualfilesystem.cpp @@ -158,45 +158,44 @@ FileTarget *VirtualFileSystem::get_header(const FS::Path &fn) FileTarget *VirtualFileSystem::get_library(const string &lib, const FS::Path &path, LibMode mode) { - // Populate a list of candidate filenames - StringList candidates; - const Architecture &arch = builder.get_current_arch(); - if(mode!=ALL_STATIC) - fill_candidates(candidates, arch.get_shared_library_patterns(), lib); - - /* Static libraries are always considered, since sometimes shared versions - may not be available */ - fill_candidates(candidates, arch.get_static_library_patterns(), lib); - for(StringList::iterator i=candidates.begin(); i!=candidates.end(); ++i) + /* Try dynamic libraries only if library mode permits it */ + if(mode!=ALL_STATIC) { - FS::Path full = path/ *i; - FileTarget *tgt = get_target(full); - - if(tgt) + FS::Path fn = try_patterns(path, arch.get_shared_library_patterns(), lib); + if(!fn.empty()) { - Target *real_tgt = tgt->get_real_target(); - - /* Ignore dynamic libraries from local packages unless library mode is - DYNAMIC */ - if(dynamic_cast(real_tgt) && mode!=DYNAMIC) - continue; - else if(tgt) + FileTarget *tgt = get_target(fn); + if(!tgt) + return new SystemLibrary(builder, fn.str()); + else if(mode==DYNAMIC || !tgt->get_package()) return tgt; } - else if(FS::is_reg(full)) - { - tgt = new SystemLibrary(builder, full.str()); + } + + /* Static libraries are always considered, since sometimes shared versions + may not be available */ + FS::Path fn = try_patterns(path, arch.get_static_library_patterns(), lib); + if(!fn.empty()) + { + if(FileTarget *tgt = get_target(fn)) return tgt; - } + else + return new SystemLibrary(builder, fn.str()); } return 0; } -void VirtualFileSystem::fill_candidates(StringList &candidates, const list &patterns, const string &base) +FS::Path VirtualFileSystem::try_patterns(const FS::Path &dir, const list &patterns, const string &base) { for(list::const_iterator i=patterns.begin(); i!=patterns.end(); ++i) - candidates.push_back(i->apply(base)); + { + FS::Path full = dir/i->apply(base); + if(get_target(full) || FS::is_reg(full)) + return full; + } + + return FS::Path(); } diff --git a/source/virtualfilesystem.h b/source/virtualfilesystem.h index 5ecc04b..09a4bf7 100644 --- a/source/virtualfilesystem.h +++ b/source/virtualfilesystem.h @@ -52,7 +52,7 @@ private: FileTarget *get_library(const std::string &, const Msp::FS::Path &, LibMode); - void fill_candidates(std::list &, const std::list &, const std::string &); + Msp::FS::Path try_patterns(const Msp::FS::Path &, const std::list &, const std::string &); }; #endif -- 2.43.0