X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Farchitecture.cpp;h=7faefeb456f3953548084782c63079fc466a59fc;hb=8170b77be8c1ec66f4e860fe88dafa791031e57f;hp=9c96e8a512bdee0ad144c230a4f14ef907e12161;hpb=4e6fd9a7436d61af311ab83b5ec264b37078fe76;p=builder.git diff --git a/source/architecture.cpp b/source/architecture.cpp index 9c96e8a..7faefeb 100644 --- a/source/architecture.cpp +++ b/source/architecture.cpp @@ -1,15 +1,8 @@ -/* $Id$ - -This file is part of builder -Copyright © 2007-2010 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - #include #ifndef WIN32 #include #endif -#include +#include #include #include "architecture.h" #include "builder.h" @@ -91,8 +84,6 @@ Architecture::Architecture(Builder &b, const string &spec): const Architecture &native_arch = builder.get_native_arch(); if(type.empty()) type = native_arch.type; - if(cpu.empty()) - cpu = native_arch.cpu; if(system.empty()) system = native_arch.system; if(!bits) @@ -105,66 +96,45 @@ Architecture::Architecture(Builder &b, const string &spec): if(type!=native_arch.type || system!=native_arch.system) cross_prefix = format("%s-%s", type, system); - else if(bits!=native_arch.bits) - { - build_info.cflags.push_back(format("-m%d", bits)); - build_info.ldflags.push_back(format("-m%d", bits)); - } - else + else if(bits==native_arch.bits) native = true; - - if(!cpu.empty()) - build_info.cflags.push_back(format("-march=%s", cpu)); } name = type; if(!cpu.empty()) name += format("-%s", cpu); name += format("-%d-%s", bits, system); -} -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(system=="windows") { - if(i->second[0]=='-') - return cross_prefix+i->second; - else - return i->second; + sharedlib_patterns.push_back(Pattern("%.dll")); + sharedlib_patterns.push_back(Pattern("lib%.dll")); + /* XXX Hack: Consider import libraries (*.dll.a) as dynamic libraries, + even though technically they are linked statically. */ + sharedlib_patterns.push_back(Pattern("lib%.dll.a")); + staticlib_patterns.push_back(Pattern("lib%.a")); + executable_patterns.push_back(Pattern("%.exe")); } - - const Architecture &native_arch = builder.get_native_arch(); - if(this!=&native_arch) + else { - if(!cross_prefix.empty()) - return cross_prefix+"-"+native_arch.get_tool(t); - else - return native_arch.get_tool(t); + sharedlib_patterns.push_back(Pattern("lib%.so")); + staticlib_patterns.push_back(Pattern("lib%.a")); + executable_patterns.push_back(Pattern("%")); } - else - throw KeyError("Unknown tool", t); } bool Architecture::match_name(const string &pattern) const { - vector parts = split(pattern, "-"); + bool negate = (pattern[0]=='!'); + vector parts = split(pattern.substr(negate), "-"); for(vector::const_iterator i=parts.begin(); i!=parts.end(); ++i) { string part = resolve_alias(*i); - if(part!=type && part!=cpu && part!=system) - return false; + if((part=="32" && bits==32) || (part=="64" && bits==64)) + ; + else if(part!=type && part!=cpu && part!=system) + return negate; } - return true; + return !negate; } string Architecture::resolve_alias(const string &part) const @@ -189,7 +159,7 @@ void Architecture::parse_specification(const string &spec) if(part==types[j]) { if(!type.empty() && part!=type) - throw InvalidParameterValue("Conflicting type specification"); + throw invalid_argument("Conflicting type specification"); type = part; ok = true; } @@ -200,7 +170,7 @@ void Architecture::parse_specification(const string &spec) if(type.empty()) type = cpus[j+1]; else if(cpus[j+1]!=type) - throw InvalidParameterValue("Conflicting CPU specification"); + throw invalid_argument("Conflicting CPU specification"); cpu = part; ok = true; } @@ -219,19 +189,13 @@ void Architecture::parse_specification(const string &spec) } if(!ok) - throw InvalidParameterValue("Unrecognized part in arch specification: "+*i); + throw invalid_argument("Unrecognized part in arch specification: "+*i); } } Architecture::Loader::Loader(Architecture &a): - arch(a) + DataFile::ObjectLoader(a) { add("prefix", &Architecture::cross_prefix); - add("tool", &Loader::tool); -} - -void Architecture::Loader::tool(const string &t, const string &p) -{ - arch.tools[t] = p; }