/**
* This file is part of Erjang - A JVM-based Erlang VM
*
* Copyright (c) 2009 by Trifork
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**/
package erjang;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import erjang.boot.CommandLineParser;
import sun.misc.Signal;
import sun.misc.SignalHandler;
import erjang.driver.efile.EFile;
public class Main {
public static final String SYSTEM_ARCHITECTURE = "java";
public static final String DRIVER_VERSION = "1.5";
/**
* @param args
* @throws IOException
* @throws IllegalAccessException
* @throws InstantiationException
* @throws ClassNotFoundException
*/
public static void main(String[] args) throws Exception {
// enforce Kilim to optimize for code size before anything else
System.setProperty("kilim.optimize_codesize", "true");
ErjangConfig.init();
ArrayList<String> regular_args = new ArrayList<>();
ArrayList<String> extra_args = new ArrayList<>();
CommandLineParser.parseArgumentList(args, regular_args, extra_args);
RuntimeInfo runtimeInfo = determineRuntimeInfo(args, regular_args);
if (runtimeInfo == null) {
System.err.println("Erjang cannot find its BEAM files.");
System.err.println("- You can set OTPROOT, pass -root /path/to/erlang, or put 'erl' in your PATH.");
System.exit(1);
}
try {
// verify we have a working configuration
runtimeInfo.verify();
}
catch (RuntimeException e) {
String reason = e.getMessage();
ERT.log.severe(reason);
System.err.println(reason);
return;
}
if (! regular_args.contains("-root")) {
String root = runtimeInfo.erl_rootdir;
regular_args.add(0,"-root");
regular_args.add(1, root);
}
if (! regular_args.contains("-home")) {
regular_args.add(0, "-home");
regular_args.add(1, System.getProperty("user.home"));
}
ERT.setRuntimeInfo(runtimeInfo);
if (!(new File(runtimeInfo.erl_bootstrap_ebindir)).exists() && !runtimeInfo.erl_bootstrap_ebindir.startsWith(EFile.RESOURCE_PREFIX)) {
ERT.log.severe("No bootstrap classes at: "+runtimeInfo.erl_bootstrap_ebindir);
throw new IllegalArgumentException("No bootstrap classes at: "+runtimeInfo.erl_bootstrap_ebindir);
}
@SuppressWarnings({})
SignalHandler handler = new SignalHandler() {
@Override
public void handle(Signal arg0) {
ERT.print_all_stack_traces();
}
};
sun.misc.Signal.handle(new Signal("HUP"), handler);
ArrayList<String> actual_args = new ArrayList<>(regular_args);
if (! extra_args.isEmpty()) {
actual_args.add("-extra");
actual_args.addAll(extra_args);
}
OTPMain.main(regular_args.toArray(new String[regular_args.size()]));
}
private static RuntimeInfo determineRuntimeInfo(String[] args, ArrayList<String> regular_args) {
String cmd_line_root = null;
String otp_version = (ErjangConfig.hasString("erjang.otp.version") ? ErjangConfig.getString("erjang.otp.version", null) : null);
String erts_version = (ErjangConfig.hasString("erjang.erts.version") ? "erts-"+ErjangConfig.getString("erjang.erts.version", null) : null);
String ertsVersionFromCommandLine = System.getProperty("erjang.beam.option.e");
if (ertsVersionFromCommandLine != null) {
erts_version = ertsVersionFromCommandLine;
}
for (int i = 0; i < regular_args.size(); i++) {
String arg = regular_args.get(i);
if ("-root".equals(arg) && i < args.length) {
cmd_line_root = regular_args.get(i+1);
i +=1;
} else if ("-env".equals(arg) && (i+1) < args.length) {
ErjangConfig.setenv(regular_args.get(i+1), regular_args.get(i+2));
i += 2;
}/* else if ("+e".equals(arg) && i < args.length) {
// TODO: Handle both "+eVVV" and "+e VVV". Alternatively, getProperty("erjang.beam.option.e") to avoid duplication.
erts_version = regular_args.get(i+1);
i += 1;
}*/
}
return RuntimeInfo.setup(erts_version, otp_version, cmd_line_root);
}
}