aboutsummaryrefslogtreecommitdiff
path: root/libstd-modules
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2017-11-23 11:43:02 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2017-11-23 11:43:02 +0200
commit290ea7840c979e38a2108030a99e7e9c61f40a8c (patch)
tree041eb38e45d39e032d203fb1c48f8ff07609db3e /libstd-modules
parentd657b1d00d41bf448a94f6a7c49cacd41c5fac0e (diff)
Restructure and install std-detect.hxx
We have to install this header since it needs to be included'able during module sidebuilds.
Diffstat (limited to 'libstd-modules')
-rw-r--r--libstd-modules/buildfile97
-rw-r--r--libstd-modules/dummy.cxx5
-rw-r--r--libstd-modules/std-core.mxx127
-rw-r--r--libstd-modules/std-detect.hxx15
-rw-r--r--libstd-modules/std-io.mxx28
-rw-r--r--libstd-modules/std-regex.mxx57
-rw-r--r--libstd-modules/std-threading.mxx60
7 files changed, 389 insertions, 0 deletions
diff --git a/libstd-modules/buildfile b/libstd-modules/buildfile
new file mode 100644
index 0000000..a04d103
--- /dev/null
+++ b/libstd-modules/buildfile
@@ -0,0 +1,97 @@
+# file : libstd-modules/buildfile
+# copyright : Copyright (c) 2014-2017 Code Synthesis Ltd
+# license : MIT; see accompanying LICENSE file
+
+if! $cxx.features.modules
+{
+ # List sources as files so that we can prepare a distribution with any
+ # compiler.
+ #
+ ./: {hxx mxx cxx}{*}
+}
+else
+{
+ # We only do the static library since this is what we would have gotten
+ # should we have used headers (i.e., whatever object code generated from
+ # those headers would have ended up in each executable/library).
+ #
+ ./: liba{std-modules}
+
+ # Building of the modules gets rather compiler-specific.
+ #
+ if ($cxx.id.type == 'clang')
+ {
+ # Use the naming scheme expected by -fprebuilt-module-path=. Can also be
+ # specified with -fmodule-file=.
+ #
+ core = std.core.pcm
+ io = std.io.pcm
+ regex = std.regex.pcm
+ threading = std.threading.pcm
+
+ liba{std-modules}: bmia{$core $io $regex $threading}
+
+ export_target = $out_base/liba{std-modules}
+ }
+ elif ($cxx.id.type == 'msvc')
+ {
+ # Use the naming scheme expected by /module:stdIfcDir. Note that IFCPATH
+ # would require an extra directory (x64 or x86; e.g., x64/Release/).
+ #
+ # @@ Currently VC looks in Release regardless of /MD or /MDd.
+ #
+ dir = release/
+ core = $dir/std.core.ifc
+ io = $dir/std.io.ifc
+ regex = $dir/std.regex.ifc
+ threading = $dir/std.threading.ifc
+
+ bmia{$core $io $regex $threading}: fsdir{$dir}
+
+ # VC expects to find std.lib next to the .ifc's. Make it the real one
+ # while std-modules -- a dummy.
+ #
+ ./: $dir/liba{std}
+ $dir/liba{std}: bmia{$core $io $regex $threading}
+ liba{std-modules}: cxx{dummy.cxx}
+
+ # @@ Doesn't work if installed so we don't bother installing it. But we
+ # still install dummy std-modules; the idea is to link a dummy and
+ # (try) to use Microsoft-shipped .ifc's.
+ #
+ $dir/liba{std}: install = false
+
+ # Include std-modules to trigger install.
+ #
+ export_target = $out_base/$dir/liba{std} $out_base/liba{std-modules}
+ }
+
+ liba{std-modules}: hxx{*}
+
+ # @@ TMP: use utility library instead?
+ #
+ if ($cxx.target.class == 'linux' || $cxx.target.class == 'bsd')
+ cxx.coptions += -fPIC
+
+ # Clang with libc++ (sometimes) needs it -- go figure.
+ #
+ if ($cxx.target.class != "windows")
+ cxx.libs += -lpthread
+
+ bmia{$core}: mxx{std-core}
+ bmia{$io}: mxx{std-io} bmia{$core}
+ bmia{$regex}: mxx{std-regex} bmia{$core} bmia{$io}
+ bmia{$threading}: mxx{std-threading} bmia{$core}
+
+ mxx{std-core}@./: cc.module_name = std.core
+ mxx{std-io}@./: cc.module_name = std.io
+ mxx{std-regex}@./: cc.module_name = std.regex
+ mxx{std-threading}@./: cc.module_name = std.threading
+
+ cxx.poptions =+ "-I$out_root" "-I$src_root"
+ liba{std-modules}: cxx.export.poptions = "-I$out_root" "-I$src_root"
+
+ # Install into the libstd-modules/ subdirectory of, say, /usr/include/.
+ #
+ {hxx mxx}{*}: install = include/$project/
+}
diff --git a/libstd-modules/dummy.cxx b/libstd-modules/dummy.cxx
new file mode 100644
index 0000000..68ebd58
--- /dev/null
+++ b/libstd-modules/dummy.cxx
@@ -0,0 +1,5 @@
+// file : libstd-modules/dummy.cxx -*- C++ -*-
+// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+// Dummy translation unit used to create dummy std.lib for VC.
diff --git a/libstd-modules/std-core.mxx b/libstd-modules/std-core.mxx
new file mode 100644
index 0000000..c3f3566
--- /dev/null
+++ b/libstd-modules/std-core.mxx
@@ -0,0 +1,127 @@
+// file : libstd-modules/std-core.mxx -*- C++ -*-
+// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+// For some standard library implementations we need to pre-include certain
+// headers to prevent their exporting.
+
+#include <libstd-modules/std-detect.hxx>
+
+#if defined(_MSC_VER)
+/*
+# include <io.h>
+# include <time.h>
+# include <stdlib.h>
+# include <string.h>
+# include <locale.h> // struct tm;
+*/
+#elif defined(__GLIBCXX__)
+# include <time.h>
+# include <errno.h>
+# include <wchar.h> // struct tm forward declaration.
+# include <stdio.h>
+# include <stdlib.h>
+# include <string.h>
+# include <strings.h>
+# include <sys/types.h>
+# include <ext/atomicity.h> // Names with internal linkage.
+#elif defined(_LIBCPP_VERSION)
+#endif
+
+export module std.core;
+
+export
+{
+ // These are defined in <bits/c++config.h> which we have pre-included.
+ //
+#ifdef __GLIBCXX__
+ namespace std
+ {
+ typedef __SIZE_TYPE__ size_t;
+ typedef __PTRDIFF_TYPE__ ptrdiff_t;
+ typedef decltype(nullptr) nullptr_t;
+ }
+#endif
+
+#include <cstddef>
+#include <cstdint>
+#include <cstdlib>
+
+#include <utility>
+#include <type_traits>
+
+#include <exception>
+#include <stdexcept>
+#include <system_error>
+
+#include <new>
+#include <memory>
+
+#include <limits>
+#include <ctime>
+#include <atomic>
+#include <chrono>
+#include <bitset>
+}
+
+export
+{
+#include <iterator>
+#include <algorithm>
+#include <functional>
+
+#include <string>
+#include <cstring> // @@ Not in the proposal.
+
+#include <array>
+#include <vector>
+#include <set>
+#include <map>
+#include <unordered_set>
+#include <unordered_map>
+#include <stack>
+}
+
+#if defined(_MSC_VER) || defined(__clang__)
+export
+{
+#include <cctype>
+#include <locale>
+#include <clocale>
+
+#include <iosfwd>
+#include <iomanip>
+#include <istream>
+#include <ostream>
+#include <sstream>
+#include <fstream>
+
+#ifndef __GLIBCXX__
+# include <iostream>
+#else
+// Contents of <iostream> without static __ioinit.
+//
+namespace std _GLIBCXX_VISIBILITY(default)
+{
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+ extern istream cin;
+ extern ostream cout;
+ extern ostream cerr;
+ extern ostream clog;
+
+ //static ios_base::Init __ioinit;
+_GLIBCXX_END_NAMESPACE_VERSION
+}
+#endif
+}
+#endif
+
+// std.threading
+//
+export
+{
+#include <mutex>
+#include <shared_mutex>
+#include <condition_variable>
+#include <thread>
+}
diff --git a/libstd-modules/std-detect.hxx b/libstd-modules/std-detect.hxx
new file mode 100644
index 0000000..b2998b5
--- /dev/null
+++ b/libstd-modules/std-detect.hxx
@@ -0,0 +1,15 @@
+// To detect the standard library we need to include a certain header first.
+//
+#if defined(__clang__)
+# if __has_include(<__config>) // libc++ _LIBCPP_VERSION
+# include <__config>
+# elif __has_include(<bits/c++config.h>) // libstdc++ __GLIBCXX__
+# include <bits/c++config.h>
+# endif
+#elif defined(__GNUC__)
+# include <bits/c++config.h> // libstdc++ __GLIBCXX__
+#endif
+
+#if !defined(_MSC_VER) && !defined(__GLIBCXX__) && !defined(_LIBCPP_VERSION)
+# error unknown standard library implementation
+#endif
diff --git a/libstd-modules/std-io.mxx b/libstd-modules/std-io.mxx
new file mode 100644
index 0000000..701e1b9
--- /dev/null
+++ b/libstd-modules/std-io.mxx
@@ -0,0 +1,28 @@
+// file : libstd-modules/std-io.mxx -*- C++ -*-
+// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+export module std.io;
+
+#ifdef _MSC_VER
+
+export import std.core;
+
+#elif defined(__clang__)
+// Empty: can't handle the below and doesn't suppor re-export.
+#else
+
+import std.core;
+
+export
+{
+#include <cctype>
+#include <iosfwd>
+#include <istream>
+#include <ostream>
+#include <iostream>
+#include <sstream>
+#include <fstream>
+}
+
+#endif
diff --git a/libstd-modules/std-regex.mxx b/libstd-modules/std-regex.mxx
new file mode 100644
index 0000000..427642c
--- /dev/null
+++ b/libstd-modules/std-regex.mxx
@@ -0,0 +1,57 @@
+// file : libstd-modules/std-regex.mxx -*- C++ -*-
+// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+// Pre-includes.
+//
+#include <libstd-modules/std-detect.hxx>
+
+#if defined(_MSC_VER)
+# include <algorithm>
+# include <iterator>
+# include <locale>
+# include <stdexcept>
+# include <string>
+# include <utility>
+# include <vector>
+
+# include <wchar.h>
+# include <limits.h>
+# include <stdlib.h>
+# include <string.h>
+#elif defined(__GLIBCXX__)
+# define _GLIBCXX_ALGORITHM
+# define _GLIBCXX_BITSET
+# define _GLIBCXX_IOSFWD
+# define _GLIBCXX_ITERATOR
+# define _GLIBCXX_LOCALE
+# define _GLIBCXX_MEMORY
+# define _GLIBCXX_SSTREAM
+# define _GLIBCXX_STACK
+# define _GLIBCXX_STDEXCEPT
+# define _GLIBCXX_STRING
+# define _GLIBCXX_UTILITY
+# define _GLIBCXX_VECTOR
+# define _GLIBCXX_MAP
+# define _GLIBCXX_CSTRING
+
+# define _GLIBCXX_STD_FUNCTION_H // <bits/std_function.h>
+# define _ALIGNED_BUFFER_H // <ext/aligned_buffer.h>
+
+# include <string.h>
+
+# include <debug/assertions.h> // Missing include.
+#elif defined(_LIBCPP_VERSION)
+#endif
+
+export module std.regex;
+
+#ifdef __GLIBCXX__
+import std.core;
+import std.io;
+#endif
+
+export
+{
+#include <regex>
+}
diff --git a/libstd-modules/std-threading.mxx b/libstd-modules/std-threading.mxx
new file mode 100644
index 0000000..b03f55f
--- /dev/null
+++ b/libstd-modules/std-threading.mxx
@@ -0,0 +1,60 @@
+// file : libstd-modules/std-threading.mxx -*- C++ -*-
+// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+export module std.threading; // Dummy.
+
+#if 0
+// Pre-includes.
+//
+#include <libstd-modules/std-detect.hxx>
+
+#if defined(_MSC_VER)
+#error TODO
+#elif defined(__GLIBCXX__)
+
+// <mutex>
+# define _GLIBCXX_TUPLE
+# define _GLIBCXX_CHRONO
+# define __EXCEPTION__ // <exception>
+# define _GLIBCXX_TYPE_TRAITS
+# define _GLIBCXX_SYSTEM_ERROR
+# define _GLIBCXX_STD_FUNCTION_H // <bits/std_function.h>
+# define _FUNCTEXCEPT_H
+# define _MOVE_H
+
+// <shared_mutex>
+# include <cerrno> // Missing include.
+
+// <condition_variable>
+# define _CONCURRENCE_H // <ext/concurrence.h>
+# define _ALLOC_TRAITS_H // <bits/alloc_traits.h>
+# define _ALLOCATOR_H // <bits/allocator.h>
+# define _UNIQUE_PTR_H // <bits/unique_ptr.h>
+# define _SHARED_PTR_H // <bits/shared_ptr.h>
+# define _CXXABI_FORCED_H // <bits/cxxabi_forced.h>
+# include <bits/exception_defines.h> // Missing include.
+
+// <thread>
+# define _GLIBCXX_MEMORY
+# define _FUNCTIONAL_HASH_H // <bits/functional_hash.h>
+# define _GLIBCXX_INVOKE_H // <bits/invoke.h>
+
+# include <bits/gthr.h>
+#elif defined(_LIBCPP_VERSION)
+#endif
+
+export module std.threading;
+
+#ifdef __GLIBCXX__
+import std.core;
+#endif
+
+export
+{
+#include <mutex>
+#include <shared_mutex>
+#include <condition_variable>
+#include <thread>
+}
+#endif