1(*
2    Title:      Standard Basis Library: Commands to build the library
3    Copyright   David C.J. Matthews 2000, 2005, 2015-16, 2018-21
4
5    This library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License version 2.1 as published by the Free Software Foundation.
8
9    This library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13
14    You should have received a copy of the GNU Lesser General Public
15    License along with this library; if not, write to the Free Software
16    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17*)
18
19(* Thread, Weak and Signal are Poly/ML extensions. *)
20
21val () = Bootstrap.use "basis/InitialBasis.ML";
22val () = Bootstrap.use "basis/Universal.ML";
23val () = Bootstrap.use "basis/General.sml";
24val () = Bootstrap.use "basis/LibrarySupport.sml";
25val () = Bootstrap.use "basis/PolyMLException.sml";
26val () = Bootstrap.use "basis/Option.sml";
27val () = Bootstrap.use "basis/ListSignature.sml";
28val () = Bootstrap.use "basis/List.sml";
29val () = Bootstrap.use "basis/VectorOperations.sml";
30val () = Bootstrap.use "basis/PolyVectorOperations.sml";
31val () = Bootstrap.use "basis/VectorSliceOperations.sml";
32val () = Bootstrap.use "basis/MONO_VECTOR.sml";
33val () = Bootstrap.use "basis/MONO_VECTOR_SLICE.sml";
34val () = Bootstrap.use "basis/MONO_ARRAY.sml";
35val () = Bootstrap.use "basis/MONO_ARRAY_SLICE.sml";
36val () = Bootstrap.use "basis/StringSignatures.sml";
37val () = Bootstrap.use "basis/String.sml";
38
39structure Int = struct type int = int end;
40val () = Bootstrap.use "basis/INTEGER.sml";
41val () = Bootstrap.use "basis/Int.sml";
42val () = Bootstrap.use (if Bootstrap.intIsArbitraryPrecision then "basis/IntAsLargeInt.sml" else "basis/IntAsFixedInt.sml");
43val () =
44    case FixedInt.precision of SOME 31 => Bootstrap.use "basis/Int31.sml" | SOME 63 => Bootstrap.use "basis/Int63.sml" | _ => ();
45val () = Bootstrap.use "basis/WordSignature.sml";
46val () = Bootstrap.use "basis/LargeWord.sml";
47val () = Bootstrap.use "basis/VectorSignature.sml";
48val () = Bootstrap.use "basis/VectorSliceSignature.sml";
49val () = Bootstrap.use "basis/Vector.sml";
50val () = Bootstrap.use "basis/ArraySignature.sml";
51val () = Bootstrap.use "basis/ArraySliceSignature.sml"; (* Depends on VectorSlice. *)
52val () = Bootstrap.use "basis/Array.sml";
53
54val () = Bootstrap.use "basis/Text.sml"; (* Declares Char, String, CharArray, CharVector *)
55val () = Bootstrap.use "basis/Bool.sml";
56val () = Bootstrap.use "basis/ListPair.sml";
57
58(* Declare the appropriate additional structures. *)
59(* The version of Word32 we use depends on whether this is
60   32-bit or 64-bit. *)
61val () =
62    if LargeWord.wordSize = 32
63    then Bootstrap.use "basis/Word32.sml"
64    else if Word.wordSize >= 32
65    then Bootstrap.use "basis/Word32In64.sml"
66    else if LargeWord.wordSize = 64
67    then Bootstrap.use "basis/Word32InLargeWord64.sml"
68    else ();
69
70val () = Bootstrap.use "basis/Word16.sml";
71val () = Bootstrap.use "basis/Word8.sml";
72val () = Bootstrap.use "basis/IntInf.sml";
73val () = Bootstrap.use "basis/Int32.sml";
74val () = Bootstrap.use "basis/Word8Array.sml";
75val () = Bootstrap.use "basis/Byte.sml";
76val () = Bootstrap.use "basis/BoolArray.sml";
77val () = Bootstrap.use "basis/IntArray.sml";
78val () = Bootstrap.use "basis/RealArray.sml";
79val () = Bootstrap.use "basis/IEEE_REAL.sml";
80val () = Bootstrap.use "basis/IEEEReal.sml";
81val () = Bootstrap.use "basis/MATH.sml";
82val () = Bootstrap.use "basis/MATH.sml";
83structure LargeReal = struct type real = real end;
84val () = Bootstrap.use "basis/RealSignature.sml";
85val () = Bootstrap.use "basis/Real.sml";
86val () = Bootstrap.use "basis/Real32.sml";
87val () = Bootstrap.use "basis/Time.sml";
88val () = Bootstrap.use "basis/DATE.sig";
89val () = Bootstrap.use "basis/Date.sml";
90val () = Bootstrap.use "basis/Thread.sml"; (* Non-standard. *)
91val () = Bootstrap.use "basis/ThreadLib.sml"; (* Non-standard. *)
92val () = Bootstrap.use "basis/Timer.sml";
93val () = Bootstrap.use "basis/CommandLine.sml";
94val () = Bootstrap.use "basis/ExnPrinter.sml";
95val () = Bootstrap.use "basis/ForeignConstants.sml";
96val () = Bootstrap.use "basis/ForeignMemory.sml";
97val () = Bootstrap.useWithParms [Bootstrap.Universal.tagInject Bootstrap.maxInlineSizeTag 1000] "basis/Foreign.sml";
98val () = Bootstrap.use "basis/IO.sml";
99val () = Bootstrap.use "basis/OS.sml";
100val () = Bootstrap.use "basis/PRIM_IO.sml";
101val () = Bootstrap.use "basis/PrimIO.sml";
102val () = Bootstrap.use "basis/LibraryIOSupport.sml";
103val () = Bootstrap.use "basis/STREAM_IO.sml";
104val () = Bootstrap.use "basis/BasicStreamIO.sml";
105val () = Bootstrap.use "basis/IMPERATIVE_IO.sml";
106val () = Bootstrap.use "basis/ImperativeIO.sml";
107val () = Bootstrap.use "basis/TextIO.sml";
108val () = Bootstrap.use "basis/BinIO.sml";
109val () = Bootstrap.use "basis/Socket.sml";
110val () = Bootstrap.use "basis/NetProtDB.sml";
111val () = Bootstrap.use "basis/NetServDB.sml";
112val () = Bootstrap.use "basis/GenericSock.sml";
113val () = Bootstrap.use "basis/INetSock.sml";
114val () = Bootstrap.use "basis/INet6Sock.sml";
115val () = Bootstrap.use "basis/PackReal.sml";
116val () =
117    if Word.wordSize = 31
118    then Bootstrap.use "basis/PackReal32Boxed.sml"
119    else Bootstrap.use "basis/PackReal32Tagged.sml";
120
121val () = Bootstrap.use "basis/PackWord.sml";
122val () = Bootstrap.use "basis/Array2Signature.sml";
123val () = Bootstrap.use "basis/Array2.sml";
124val () = Bootstrap.use "basis/IntArray2.sml";
125val () = Bootstrap.use "basis/SML90.sml";
126val () = Bootstrap.use "basis/Weak.sml";
127val () = Bootstrap.use "basis/Signal.sml";
128val () = Bootstrap.use "basis/BIT_FLAGS.sml";
129val () = Bootstrap.use "basis/SingleAssignment.sml";
130
131
132(* Build Windows or Unix structure as appropriate. *)
133local
134    val getOS: int = LibrarySupport.getOSType()
135in
136    val () =
137    if getOS = 0
138    then
139    (
140        Bootstrap.use "basis/Posix.sml";
141        Bootstrap.use "basis/Unix.sml";
142        Bootstrap.use "basis/UnixSock.sml"
143    )
144    else if getOS = 1 then (Bootstrap.use "basis/Windows.sml")
145    else ()
146end;
147
148val () = Bootstrap.use "basis/HashArray.ML";
149val () = Bootstrap.use "basis/UniversalArray.ML";
150val () = Bootstrap.use "basis/PrettyPrinter.sml"; (* Add PrettyPrinter to PolyML structure. *)
151val () = Bootstrap.use "basis/ASN1.sml";
152val () = Bootstrap.use "basis/Statistics.ML"; (* Add Statistics to PolyML structure. *)
153val () = Bootstrap.use "basis/InitialPolyML.ML"; (* Relies on OS. *)
154val () = Bootstrap.use "basis/FinalPolyML.sml";
155val () = Bootstrap.use "basis/TopLevelPolyML.sml"; (* Add rootFunction to Poly/ML. *)
156
157val use = PolyML.use;
158
159(* Copy everything out of the original name space. *)
160(* Do this AFTER we've finished compiling PolyML and after adding "use". *)
161local
162    val values =
163       ["!", "*", "+", "-", "/", "::", ":=", "<", "<=", "<>", "=", ">", ">=",
164        "@", "Bind", "Chr", "Div", "Domain", "EQUAL", "Empty", "Fail", "GREATER",
165        "LESS", "Match", "NONE", "Option", "Overflow", "SOME", "Size", "Span",
166        "Subscript", "^", "abs", "app", "before", "ceil", "chr", "concat", "div",
167        "exnMessage", "exnName", "explode", "false", "floor", "foldl", "foldr",
168        "getOpt", "hd", "ignore", "implode", "isSome", "length", "map",
169        "mod", "nil", "not", "null", "o", "ord", "print", "quickSort", "real",
170        "ref", "rev", "round", "size", "sort", "str", "substring", "tl", "true",
171        "trunc", "use", "valOf", "vector", "~"]
172
173    val fixes =
174       ["*", "+", "-", "/", "::", ":=", "<", "<=", "<>", "=", ">", ">=", "@",
175         "^", "before", "div", "mod", "o"]
176
177    val sigs =
178       ["ARRAY", "ARRAY2", "ARRAY_SLICE", "BIN_IO", "BIT_FLAGS", "BOOL", "BYTE",
179        "CHAR", "COMMAND_LINE", "DATE", "GENERAL", "GENERIC_SOCK", "IEEE_REAL",
180        "IMPERATIVE_IO", "INET6_SOCK", "INET_SOCK", "INTEGER", "INT_INF", "IO",
181        "LIST", "LIST_PAIR", "MATH", "MONO_ARRAY", "MONO_ARRAY2",
182        "MONO_ARRAY_SLICE", "MONO_VECTOR", "MONO_VECTOR_SLICE", "NET_HOST_DB",
183        "NET_PROT_DB", "NET_SERV_DB", "OPTION", "OS", "OS_FILE_SYS", "OS_IO",
184        "OS_PATH", "OS_PROCESS", "PACK_REAL", "PACK_WORD", "POSIX",
185        "POSIX_ERROR", "POSIX_FILE_SYS", "POSIX_IO", "POSIX_PROCESS",
186        "POSIX_PROC_ENV", "POSIX_SIGNAL", "POSIX_SYS_DB", "POSIX_TTY", "PRIM_IO",
187        "REAL", "SIGNAL", "SML90", "SOCKET", "STREAM_IO", "STRING", "STRING_CVT",
188        "SUBSTRING", "TEXT", "TEXT_IO", "TEXT_STREAM_IO", "THREAD", "TIME",
189        "TIMER", "UNIX", "UNIX_SOCK", "VECTOR", "VECTOR_SLICE", "WEAK", "WINDOWS", "WORD"]
190
191    val types =
192       ["array", "bool", "char", "exn", "int", "list", "option", "order", "real",
193        "ref", "string", "substring", "unit", "vector", "word"]
194
195    val functs = ["ImperativeIO", "PrimIO", "StreamIO"]
196
197    val structs =
198       ["Array", "Array2", "ArraySlice", "Asn1", "BinIO", "BinPrimIO", "Bool",
199        "BoolArray", "BoolArray2", "BoolVector", "Byte", "Char", "CharArray",
200        "CharArray2", "CharArraySlice", "CharVector", "CharVectorSlice",
201        "CommandLine", "Date", "FixedInt", "Foreign", "General", "GenericSock",
202        "HashArray", "IEEEReal", "INet6Sock", "INetSock", "IO", "Int", "Int32",
203        "Int63", "IntArray", "IntArray2", "IntArraySlice", "IntInf", "IntVector",
204        "IntVectorSlice", "LargeInt", "LargeReal", "LargeWord", "List",
205        "ListPair", "Math", "Net6HostDB", "NetHostDB", "NetProtDB", "NetServDB",
206        "OS", "Option", "PackRealBig", "PackRealLittle", "PackReal32Big",
207        "PackReal32Little", "PackWord16Big",
208        "PackWord16Little", "PackWord32Big", "PackWord32Little", "PackWord8Big",
209        "PackWord8Little", "PolyML", "Position", "Posix", "Real", "Real32",
210        "RealArray", "RealArray2", "RealArraySlice", "RealVector",
211        "RealVectorSlice", "RunCall", "SML90", "Signal", "SingleAssignment",
212        "Socket", "String", "StringCvt", "Substring", "SysWord", "Text",
213        "TextIO", "TextPrimIO", "Thread", "ThreadLib", "Time", "Timer",
214        "Universal", "UniversalArray", "Unix", "UnixSock", "Vector",
215        "VectorSlice", "Weak", "Windows", "Word", "Word16", "Word32", "Word64",
216        "Word8", "Word8Array", "Word8Array2", "Word8ArraySlice", "Word8Vector",
217        "Word8VectorSlice"]
218
219    fun copyOver (enter, lookup) =
220    let
221        (* Copy over everything in the list if possible.  Some items e.g. the Posix
222           structure, may not be present. *)
223        fun copy s =
224            enter PolyML.globalNameSpace (s, valOf(lookup Bootstrap.globalSpace s))
225                handle Option => ()
226    in
227        List.app copy
228    end
229in
230    val () = copyOver(#enterVal, #lookupVal) values
231    val () = copyOver(#enterFix, #lookupFix) fixes
232    val () = copyOver(#enterType, #lookupType) types
233    val () = copyOver(#enterSig, #lookupSig) sigs
234    val () = copyOver(#enterStruct, #lookupStruct) structs
235    val () = copyOver(#enterFunct, #lookupFunct) functs
236end;
237
238(* Now we've created the new name space we must use PolyML.make/use. N.B. Unlike Bootstrap.use
239   these don't automatically look at the -I option. *)
240
241
242
243