scons: Enable build on OSX
authorAndreas Hansson <andreas.hansson@arm.com>
Wed, 4 Sep 2013 17:22:54 +0000 (13:22 -0400)
committerAndreas Hansson <andreas.hansson@arm.com>
Wed, 4 Sep 2013 17:22:54 +0000 (13:22 -0400)
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.

SConstruct
src/base/hashmap.hh

index 12819adcd4c300c17809fd1b9eb6b6375e8aa1f5..a2ccac05fa56433d778fae2199ecdfd25ebe8203 100755 (executable)
@@ -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,
index fa9379ec4b806937dfe0bd3fcdfd106560643d8f..b838f1e2c4b63ad25b398e1372f298be5b928766 100644 (file)
 #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(<unordered_map>))
-#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 <unordered_map>
 #include <unordered_set>
 #define __hash_namespace std
 #define __hash_namespace_begin namespace std {
 #define __hash_namespace_end }
-#else
-// clang with libstdc++
-#include <tr1/unordered_map>
-#include <tr1/unordered_set>
-#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;