X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Farchitecture.h;h=360f3dd9f6321919df742d4fa7992ffbce0f9e27;hb=bf0883b6dd3946612922aa1b7c04a87d06442df7;hp=a205e5389998b854a6401dc83302095c2927a9b2;hpb=0f5283a54fd188072eca23fbd980a43c6c869913;p=builder.git diff --git a/source/architecture.h b/source/architecture.h index a205e53..360f3dd 100644 --- a/source/architecture.h +++ b/source/architecture.h @@ -1,44 +1,89 @@ -/* $Id$ - -This file is part of builder -Copyright © 2006-2007 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - #ifndef ARCHITECTURE_H_ #define ARCHITECTURE_H_ +#include #include -#include "misc.h" +#include "buildinfo.h" +#include "pattern.h" class Builder; +/** +Stores information about an architecture. This includes CPU type, model and +bitness and operating system. +*/ class Architecture { public: - class Loader: public Msp::DataFile::Loader + class Loader: public Msp::DataFile::ObjectLoader { public: Loader(Architecture &); - Architecture &get_object() { return arch; } - private: - Architecture &arch; - - void tool(const std::string &t, const std::string &p); }; - 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; } + typedef std::list PatternList; + private: - Builder &builder; + Builder &builder; + std::string type; + std::string cpu; + std::string fpu; + std::string system; + unsigned bits; + std::string toolchain; std::string name; - std::string prefix; - StringMap tools; + bool native; + std::string cross_prefix; + std::map filename_patterns; + +public: + Architecture(Builder &b, const std::string &spec); + + const std::string &get_type() const { return type; } + const std::string &get_name() const { return name; } + const std::string &get_system() const { return system; } + unsigned get_bits() const { return bits; } + const std::string &get_cpu() const { return cpu; } + const std::string &get_fpu() const { return fpu; } + const std::string &get_toolchain() const { return toolchain; } + bool match_name(const std::string &) const; + std::string best_match(const std::vector &) const; + bool is_native() const { return native; } + bool is_cross() const { return !cross_prefix.empty(); } + + const std::string &get_cross_prefix() const { return cross_prefix; } + + template + const PatternList &get_patterns() const; + + template + std::string create_filename(const std::string &) const; + +private: + template + void add_pattern(const std::string &); + +private: + static void resolve_aliases(std::vector &); + void parse_specification(const std::string &); }; -typedef std::map ArchMap; +template +inline const Architecture::PatternList &Architecture::get_patterns() const +{ + std::map::const_iterator i = filename_patterns.find(typeid(T).name()); + if(i!=filename_patterns.end()) + return i->second; + + static PatternList empty; + return empty; +} + +template +inline std::string Architecture::create_filename(const std::string &base) const +{ + const PatternList &patterns = get_patterns(); + return patterns.empty() ? base : patterns.front().apply(base); +} #endif