From 4218bfe7668d55e36814d6bdcec2da40454025c1 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Fri, 20 May 2016 23:25:45 +0200 Subject: Initial VC++ support (static libraries only) --- build2/cxx/utility.cxx | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) (limited to 'build2/cxx/utility.cxx') diff --git a/build2/cxx/utility.cxx b/build2/cxx/utility.cxx index 15980d4..0f4eb08 100644 --- a/build2/cxx/utility.cxx +++ b/build2/cxx/utility.cxx @@ -12,6 +12,66 @@ namespace build2 { namespace cxx { + // Return true if there is an option (stored in s). + // + bool + translate_std (scope& rs, const string& cid, const value& val, string& s) + { + const string& v (cast (val)); + + if (cid == "msvc") + { + // C++ standard-wise, with VC++ you get what you get. The question is + // whether we should verify that the requested standard is provided by + // this VC++ version. And if so, from which version should we say VC++ + // supports 11, 14, and 17? We should probably be as loose as possible + // here since the author will always be able to tighten (but not + // loosen) this in the buildfile (i.e., detect unsupported versions). + // + // For now we are not going to bother doing this for C++03. + // + if (v != "98" && v != "03") + { + uint64_t cver (cast (rs["cxx.version.major"])); + + // @@ Is mapping for 14 and 17 correct? Maybe Update 2 for 14? + // + if ((v == "11" && cver <= 16) || // C++11 since VS2010/10.0. + (v == "14" && cver <= 19) || // C++14 since VS2015/14.0. + (v == "17" && cver <= 20)) // C++17 since VS20??/15.0. + { + fail << "C++" << v << " is not supported by " + << cast (rs["cxx.signature"]) << + info << "required by " << rs.out_path (); + } + } + + return false; + } + else + { + // Translate 11 to 0x, 14 to 1y, and 17 to 1z for compatibility with + // older versions of the compilers. + // + s = "-std="; + + if (v == "98") + s += "c++98"; + else if (v == "03") + s += "c++03"; + else if (v == "11") + s += "c++0x"; + else if (v == "14") + s += "c++1y"; + else if (v == "17") + s += "c++1z"; + else + s += v; // In case the user specifies something like 'gnu++17'. + + return true; + } + } + void append_lib_options (cstrings& args, target& l, const char* var) { -- cgit v1.1