-
Notifications
You must be signed in to change notification settings - Fork 1.5k
Expand file tree
/
Copy pathCompile.java
More file actions
86 lines (73 loc) · 2.92 KB
/
Compile.java
File metadata and controls
86 lines (73 loc) · 2.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/**
* Copyright (c) Rich Hickey. All rights reserved.
* The use and distribution terms for this software are covered by the
* Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
* which can be found in the file epl-v10.html at the root of this distribution.
* By using this software in any fashion, you are agreeing to be bound by
* the terms of this license.
* You must not remove this notice, or any other, from this software.
**/
package clojure.lang;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.IOException;
// Compiles libs and generates class files stored within the directory
// named by the Java System property "clojure.compile.path". Arguments are
// strings naming the libs to be compiled. The libs and compile-path must
// all be within CLASSPATH.
public class Compile{
private static final String PATH_PROP = "clojure.compile.path";
private static final String REFLECTION_WARNING_PROP = "clojure.compile.warn-on-reflection";
private static final String UNCHECKED_MATH_PROP = "clojure.compile.unchecked-math";
private static final Var compile_path = RT.var("clojure.core", "*compile-path*");
private static final Var compile = RT.var("clojure.core", "compile");
private static final Var warn_on_reflection = RT.var("clojure.core", "*warn-on-reflection*");
private static final Var unchecked_math = RT.var("clojure.core", "*unchecked-math*");
public static void main(String[] args) throws IOException, ClassNotFoundException{
RT.init();
OutputStreamWriter out = (OutputStreamWriter) RT.OUT.deref();
PrintWriter err = RT.errPrintWriter();
String path = System.getProperty(PATH_PROP);
int count = args.length;
if(path == null)
{
err.println("ERROR: Must set system property " + PATH_PROP +
"\nto the location for compiled .class files." +
"\nThis directory must also be on your CLASSPATH.");
System.exit(1);
}
boolean warnOnReflection = System.getProperty(REFLECTION_WARNING_PROP, "false").equals("true");
String uncheckedMathProp = System.getProperty(UNCHECKED_MATH_PROP);
Object uncheckedMath = Boolean.FALSE;
if("true".equals(uncheckedMathProp))
uncheckedMath = Boolean.TRUE;
else if("warn-on-boxed".equals(uncheckedMathProp))
uncheckedMath = Keyword.intern("warn-on-boxed");
// force load to avoid transitive compilation during lazy load
RT.load("clojure/core/specs/alpha");
try
{
Var.pushThreadBindings(RT.map(compile_path, path,
warn_on_reflection, warnOnReflection,
unchecked_math, uncheckedMath));
for(String lib : args)
{
out.write("Compiling " + lib + " to " + path + "\n");
out.flush();
compile.invoke(Symbol.intern(lib));
}
}
finally
{
Var.popThreadBindings();
try
{
out.flush();
}
catch(IOException e)
{
e.printStackTrace(err);
}
}
}
}