From: Andreas Hansson Date: Wed, 4 Sep 2013 17:22:54 +0000 (-0400) Subject: scons: Enable build on OSX X-Git-Tag: stable_2014_02_15~157 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=fdf6f6c4b61cadd79d910ccb225ebf9fba6191c2;p=gem5.git scons: Enable build on OSX This patch changes the SConscript to build gem5 with libc++ on OSX as the conventional libstdc++ does not have the C++11 constructs that the current code base makes use of (e.g. std::forward). Since this was the last use of the transitional TR1, the unordered map and set header can now be simplified as well. --- diff --git a/SConstruct b/SConstruct index 12819adcd..a2ccac05f 100755 --- a/SConstruct +++ b/SConstruct @@ -630,15 +630,10 @@ elif main['CLANG']: main.Append(TCMALLOC_CCFLAGS=['-fno-builtin']) # On Mac OS X/Darwin we need to also use libc++ (part of XCode) as - # opposed to libstdc++ to make the transition from TR1 to - # C++11. See http://libcxx.llvm.org. However, clang has chosen a - # strict implementation of the C++11 standard, and does not allow - # incomplete types in template arguments (besides unique_ptr and - # shared_ptr), and the libc++ STL containers create problems in - # combination with the current gem5 code. For now, we stick with - # libstdc++ and use the TR1 namespace. - # if sys.platform == "darwin": - # main.Append(CXXFLAGS=['-stdlib=libc++']) + # opposed to libstdc++, as the later is dated. + if sys.platform == "darwin": + main.Append(CXXFLAGS=['-stdlib=libc++']) + main.Append(LIBS=['c++']) else: print termcap.Yellow + termcap.Bold + 'Error' + termcap.Normal, diff --git a/src/base/hashmap.hh b/src/base/hashmap.hh index fa9379ec4..b838f1e2c 100644 --- a/src/base/hashmap.hh +++ b/src/base/hashmap.hh @@ -44,42 +44,21 @@ #ifndef __HASHMAP_HH__ #define __HASHMAP_HH__ -#if defined(__clang__) -// check if the header is present, which requires -stdlib=libc++, and -// that in turn causes problems with incomplete template parameters -#if (__has_include()) -#define HAVE_STD_UNORDERED_MAP 1 -#endif -#else -// we only support gcc >= 4.4 as the other option -#define HAVE_STD_UNORDERED_MAP 1 -#endif - -// set a default value of 0 clang with the header in the tr1 namespace -#ifndef HAVE_STD_UNORDERED_MAP -#define HAVE_STD_UNORDERED_MAP 0 -#endif - +// we stick with defines here until gcc >= 4.7 and clang >= 3.2 is +// adopted as these are the minimum versions to support variadic +// templates and template aliasing #define hash_map unordered_map #define hash_multimap unordered_multimap #define hash_set unordered_set #define hash_multiset unordered_multiset -#if HAVE_STD_UNORDERED_MAP -// gcc or clang with libc++ +// gcc >= 4.4 or clang with libc++ no longer rely on the transitional +// tr1 namespace #include #include #define __hash_namespace std #define __hash_namespace_begin namespace std { #define __hash_namespace_end } -#else -// clang with libstdc++ -#include -#include -#define __hash_namespace std::tr1 -#define __hash_namespace_begin namespace std { namespace tr1 { -#define __hash_namespace_end } } -#endif namespace m5 { using ::__hash_namespace::hash_multimap;