Path: blob/master/sourcetools/com.ibm.uma/com/ibm/j9/uma/Main.java
6004 views
/*******************************************************************************1* Copyright (c) 2001, 2018 IBM Corp. and others2*3* This program and the accompanying materials are made available under4* the terms of the Eclipse Public License 2.0 which accompanies this5* distribution and is available at https://www.eclipse.org/legal/epl-2.0/6* or the Apache License, Version 2.0 which accompanies this distribution and7* is available at https://www.apache.org/licenses/LICENSE-2.0.8*9* This Source Code may also be made available under the following10* Secondary Licenses when the conditions for such availability set11* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU12* General Public License, version 2 with the GNU Classpath13* Exception [1] and GNU General Public License, version 2 with the14* OpenJDK Assembly Exception [2].15*16* [1] https://www.gnu.org/software/classpath/license.html17* [2] http://openjdk.java.net/legal/assembly-exception.html18*19* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception20*******************************************************************************/21package com.ibm.j9.uma;2223import com.ibm.j9.uma.configuration.ConfigurationImpl;24import com.ibm.j9tools.om.Flag;25import com.ibm.uma.UMA;26import com.ibm.uma.UMAException;27import com.ibm.uma.util.Logger;28import java.io.File;29import java.util.HashMap;3031public class Main {32static String applicationVersion = "2.5.1";33static String applicationNameLong = "Universal Makefile Adapter - for J9";34static String applicationNameShort = "$(J9UMA)";3536static String option_quiet = "-quiet";37static String option_quiet_short = "-q";38static String option_verbose = "-verbose";39static String option_verbose_short = "-v";40static String option_help = "-help";41static String option_help_short = "-h";42static String option_rootDir = "-rootDir";43static String option_rootDir_short = "-r";44static String option_configDir = "-configDir";45static String option_configDir_short = "-c";46static String option_buildSpecId = "-buildSpecId";47static String option_buildSpecId_short = "-b";48static String option_buildId = "-buildId";49static String option_buildId_short = "-bid";50static String option_buildDate = "-buildDate";51static String option_buildDate_short = "-bd";52static String option_buildTag = "-buildTag";53static String option_buildTag_short = "-bt";54static String option_jitVersionFile = "-jitVersionFile";55static String option_jitVersionFile_short = "-jvf";56static String option_excludeArtifacts = "-excludeArtifacts";57static String option_excludeArtifacts_short = "-ea";58static String option_define = "-D";59static String option_undefine = "-U";60static String option_macro = "-M";6162static boolean splashed = false;63static boolean quiet = false;64static boolean verbose = false;65static String buildSpecId = null;66static String configDirectory = null;67static String rootDir = ".";68static String buildId = "0";69static String buildDate = "12150101";70static String buildTag = "dev_12150101_0000_B0";71static String jitVersionFile = "";72static String excludeArtifacts = "";73static HashMap<String, Boolean> overrideFlags = new HashMap<String,Boolean>();74static HashMap<String, String> extraMacros = new HashMap<String, String>();75static Logger logger;7677static void dumpSplash() {78if (splashed||quiet) {79return;80}81System.out.println( applicationNameLong + ", version " + applicationVersion );82System.out.println( "" );83splashed = true;84}8586static void dumpHelp() {87dumpSplash();88System.err.println(applicationNameShort + " [options] " + option_rootDir + " <directory> " + option_configDir + " <directory> " + option_buildSpecId + " <specId>" );89System.err.println("options:");90System.err.println("\t-quiet");91System.err.println("\t-verbose");92System.err.println("\t-help");93System.err.println("\t" +"{" + option_define + "|" + option_undefine + "} <flagName>");94System.err.println("\t" + option_rootDir + " <directory>");95System.err.println("\t" + option_configDir + " <directory>");96System.err.println("\t" + option_buildSpecId + " <specId>");97System.err.println("\t" + option_buildId + " <buildId>");98System.err.println("\t" + option_buildDate + " <buildDate>");99System.err.println("\t" + option_buildTag + " <buildTag>");100System.err.println("\t" + option_macro + " <name>=<value>");101System.err.println("");102}103104static boolean parseOptions(String[] args) {105106for (int i=0; i<args.length; i++) {107String arg = args[i];108if (!arg.startsWith("-")) {109System.err.println("Badly formatted command line.\n");110return false;111}112if (arg.equalsIgnoreCase(option_quiet)||arg.equalsIgnoreCase(option_quiet_short)) {113quiet = true;114continue;115} else if (arg.equalsIgnoreCase(option_verbose)||arg.equalsIgnoreCase(option_verbose_short)) {116verbose = true;117continue;118} else if (arg.equalsIgnoreCase(option_help) || arg.equalsIgnoreCase(option_help_short)) {119return false;120} else if (arg.equalsIgnoreCase(option_rootDir) || arg.equalsIgnoreCase(option_rootDir_short)) {121if ( i+1 >= args.length ) {122System.err.println("Must provide an argument for option " + arg + "\n");123return false;124}125rootDir = args[++i];126rootDir = rootDir.trim();127continue;128} else if (arg.equalsIgnoreCase(option_configDir) || arg.equalsIgnoreCase(option_configDir_short)) {129if ( i+1 >= args.length ) {130System.err.println("Must provide an argument for option " + arg + "\n");131return false;132}133configDirectory = args[++i];134configDirectory = configDirectory.trim();135continue;136} else if (arg.equalsIgnoreCase(option_buildSpecId) || arg.equalsIgnoreCase(option_buildSpecId_short)) {137if ( i+1 >= args.length ) {138System.err.println("Must provide an argument for option " + arg + "\n");139return false;140}141buildSpecId = args[++i];142buildSpecId = buildSpecId.trim();143continue;144} else if (arg.equalsIgnoreCase(option_buildDate) || arg.equalsIgnoreCase(option_buildDate_short)) {145if ( i+1 >= args.length ) {146System.err.println("Must provide an argument for option " + arg + "\n");147return false;148}149buildDate = args[++i];150buildDate = buildDate.trim();151continue;152} else if (arg.equalsIgnoreCase(option_buildId) || arg.equalsIgnoreCase(option_buildId_short)) {153if ( i+1 >= args.length ) {154System.err.println("Must provide an argument for option " + arg + "\n");155return false;156}157buildId = args[++i];158buildId = buildId.trim();159continue;160} else if (arg.equalsIgnoreCase(option_buildTag) || arg.equalsIgnoreCase(option_buildTag_short)) {161if ( i+1 >= args.length ) {162System.err.println("Must provide an argument for option " + arg + "\n");163return false;164}165buildTag = args[++i];166buildTag = buildTag.trim();167continue;168} else if (arg.equalsIgnoreCase(option_jitVersionFile) || arg.equalsIgnoreCase(option_jitVersionFile_short)) {169if ( i+1 >= args.length ) {170System.err.println("Must provide an argument for option " + arg + "\n");171return false;172}173jitVersionFile = args[++i];174jitVersionFile = jitVersionFile.trim();175continue;176} else if (arg.equalsIgnoreCase(option_excludeArtifacts) || arg.equalsIgnoreCase(option_excludeArtifacts_short)) {177if ( i+1 >= args.length ) {178System.err.println("Must provide an argument for option " + arg + "\n");179return false;180}181excludeArtifacts = args[++i];182excludeArtifacts = excludeArtifacts.trim();183continue;184} else if (arg.equalsIgnoreCase(option_define) ) {185if ( i+1 >= args.length ) {186System.err.println("Must provide an argument for option " + arg + "\n");187return false;188}189overrideFlags.put(args[++i], true);190continue;191} else if (arg.equalsIgnoreCase(option_undefine) ) {192if ( i+1 >= args.length ) {193System.err.println("Must provide an argument for option " + arg + "\n");194return false;195}196overrideFlags.put(args[++i], false);197continue;198} else if (arg.equalsIgnoreCase(option_macro)) {199i += 1;200if (i >= args.length) {201System.err.println("Must provide an argument for option " + arg + "\n");202return false;203}204String value = args[i].trim();205int eqIndex = value.indexOf('=');206if (eqIndex <= 0) {207System.err.println("Argument for option " + arg + " must be of the form 'name=value'\n");208return false;209}210extraMacros.put(value.substring(0, eqIndex), value.substring(eqIndex + 1));211continue;212} else {213System.err.println("Unknown command line option " + arg + "\n");214return false;215}216}217218if ( rootDir == null || buildSpecId == null || configDirectory == null ) {219System.err.println("Missing a required command line option.\n");220return false;221}222223return true;224}225226public static void main(String[] args) {227228if ( !parseOptions(args) ) {229System.out.print(applicationNameShort + " ");230for ( String arg : args ) {231System.out.print(" " + arg );232}233System.out.println();234dumpHelp();235System.exit(-1);236}237238logger = Logger.initLogger(verbose?Logger.InformationL2Log:Logger.InformationL1Log);239240dumpSplash();241242if ( jitVersionFile.equals("") ) {243File tempJitVersionFile = new File(rootDir + "/compiler/build/version.h");244if(tempJitVersionFile.exists() && !tempJitVersionFile.isDirectory()) {245jitVersionFile = rootDir + "/compiler/build/version.h";246System.out.print("Using version.h as the jitVersionFile\n");247} else {248tempJitVersionFile = new File(rootDir + "/jit.version");249if(tempJitVersionFile.exists() && !tempJitVersionFile.isDirectory()) {250jitVersionFile = rootDir + "/jit.version";251System.out.print("Using jit.version as the jitVersionFile\n");252}253}254}255256try {257ConfigurationImpl configuration = new ConfigurationImpl(configDirectory, buildSpecId, buildId, buildDate, buildTag, jitVersionFile, excludeArtifacts);258for(String flagString: overrideFlags.keySet()){259if(!configuration.isFlagValid(flagString)){260throw new UMAException("Invalid flag override: " + flagString);261}262Flag flag = configuration.getBuildSpec().getFlag(flagString);263flag.setState(overrideFlags.get(flagString));264}265266for (java.util.Map.Entry<String, String> entry : extraMacros.entrySet()) {267String name = entry.getKey();268String value = entry.getValue();269270configuration.defineMacro(name, value);271}272273// Since we may have changed some flags, we need to re-verify them274configuration.verify();275276new UMA(configuration, configuration, rootDir).generate();277} catch (NullPointerException e) {278logger.println(Logger.ErrorLog, "Internal error: null pointer exception");279e.printStackTrace();280System.exit(-1);281} catch (UMAException e) {282logger.println(Logger.ErrorLog, e.getMessage());283System.exit(-1);284}285}286}287288289