duke@435: /* sla@5237: * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. duke@435: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. duke@435: * duke@435: * This code is free software; you can redistribute it and/or modify it duke@435: * under the terms of the GNU General Public License version 2 only, as duke@435: * published by the Free Software Foundation. duke@435: * duke@435: * This code is distributed in the hope that it will be useful, but WITHOUT duke@435: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or duke@435: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License duke@435: * version 2 for more details (a copy is included in the LICENSE file that duke@435: * accompanied this code). duke@435: * duke@435: * You should have received a copy of the GNU General Public License version duke@435: * 2 along with this work; if not, write to the Free Software Foundation, duke@435: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. duke@435: * trims@1907: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA trims@1907: * or visit www.oracle.com if you need additional information or have any trims@1907: * questions. duke@435: * duke@435: */ duke@435: sla@2369: import java.util.Enumeration; sla@2369: import java.util.Hashtable; sla@2369: import java.util.Vector; duke@435: duke@435: class BuildConfig { neliasso@4112: @SuppressWarnings("rawtypes") duke@435: Hashtable vars; neliasso@4112: Vector basicNames, basicPaths; duke@435: String[] context; duke@435: duke@435: static CompilerInterface ci; duke@435: static CompilerInterface getCI() { duke@435: if (ci == null) { duke@435: String comp = (String)getField(null, "CompilerVersion"); duke@435: try { duke@435: ci = (CompilerInterface)Class.forName("CompilerInterface" + comp).newInstance(); duke@435: } catch (Exception cnfe) { duke@435: System.err.println("Cannot find support for compiler " + comp); duke@435: throw new RuntimeException(cnfe.toString()); duke@435: } duke@435: } duke@435: return ci; duke@435: } duke@435: neliasso@4112: @SuppressWarnings("rawtypes") duke@435: protected void initNames(String flavour, String build, String outDll) { duke@435: if (vars == null) vars = new Hashtable(); duke@435: duke@435: String flavourBuild = flavour + "_" + build; sla@2540: String platformName = getFieldString(null, "PlatformName"); stefank@2314: System.out.println(); stefank@2314: System.out.println(flavourBuild); stefank@2314: sla@2540: put("Name", getCI().makeCfgName(flavourBuild, platformName)); duke@435: put("Flavour", flavour); duke@435: put("Build", build); sla@2540: put("PlatformName", platformName); duke@435: duke@435: // ones mentioned above were needed to expand format duke@435: String buildBase = expandFormat(getFieldString(null, "BuildBase")); duke@435: String sourceBase = getFieldString(null, "SourceBase"); neliasso@4112: String buildSpace = getFieldString(null, "BuildSpace"); duke@435: String outDir = buildBase; twisti@5109: String jdkTargetRoot = getFieldString(null, "JdkTargetRoot"); duke@435: duke@435: put("Id", flavourBuild); duke@435: put("OutputDir", outDir); duke@435: put("SourceBase", sourceBase); duke@435: put("BuildBase", buildBase); neliasso@4112: put("BuildSpace", buildSpace); sla@2369: put("OutputDll", outDir + Util.sep + outDll); twisti@5109: put("JdkTargetRoot", jdkTargetRoot); duke@435: duke@435: context = new String [] {flavourBuild, flavour, build, null}; duke@435: } duke@435: neliasso@4112: protected void init(Vector includes, Vector defines) { duke@435: initDefaultDefines(defines); duke@435: initDefaultCompilerFlags(includes); duke@435: initDefaultLinkerFlags(); neliasso@4112: //handleDB(); duke@435: } duke@435: duke@435: neliasso@4112: protected void initDefaultCompilerFlags(Vector includes) { duke@435: Vector compilerFlags = new Vector(); duke@435: duke@435: compilerFlags.addAll(getCI().getBaseCompilerFlags(getV("Define"), duke@435: includes, duke@435: get("OutputDir"))); duke@435: duke@435: put("CompilerFlags", compilerFlags); duke@435: } duke@435: duke@435: protected void initDefaultLinkerFlags() { duke@435: Vector linkerFlags = new Vector(); duke@435: sla@2540: linkerFlags.addAll(getCI().getBaseLinkerFlags( get("OutputDir"), get("OutputDll"), get("PlatformName"))); duke@435: duke@435: put("LinkerFlags", linkerFlags); duke@435: } duke@435: neliasso@4112: public boolean matchesIgnoredPath(String path) { neliasso@4112: Vector rv = new Vector(); stefank@2314: collectRelevantVectors(rv, "IgnorePath"); neliasso@4112: for (String pathPart : rv) { neliasso@4112: if (path.contains(pathPart)) { stefank@2314: return true; stefank@2314: } stefank@2314: } stefank@2314: return false; stefank@2314: } stefank@2314: neliasso@4112: public boolean matchesHidePath(String path) { neliasso@4112: Vector rv = new Vector(); neliasso@4112: collectRelevantVectors(rv, "HidePath"); neliasso@4112: for (String pathPart : rv) { neliasso@4112: if (path.contains(Util.normalize(pathPart))) { neliasso@4112: return true; neliasso@4112: } neliasso@4112: } neliasso@4112: return false; neliasso@4112: } neliasso@4112: neliasso@4112: public Vector matchesAdditionalGeneratedPath(String fullPath) { neliasso@4112: Vector rv = new Vector(); neliasso@4112: Hashtable v = (Hashtable)BuildConfig.getField(this.toString(), "AdditionalGeneratedFile"); neliasso@4112: if (v != null) { neliasso@4112: for (Enumeration e=v.keys(); e.hasMoreElements(); ) { neliasso@4112: String key = e.nextElement(); neliasso@4112: String val = v.get(key); neliasso@4112: neliasso@4112: if (fullPath.endsWith(expandFormat(key))) { neliasso@4112: rv.add(expandFormat(val)); duke@435: } duke@435: } duke@435: } neliasso@4112: return rv; duke@435: } duke@435: dcubed@5500: // Returns true if the specified path refers to a relative alternate dcubed@5500: // source file. RelativeAltSrcInclude is usually "src\closed". dcubed@5500: public static boolean matchesRelativeAltSrcInclude(String path) { dcubed@5500: String relativeAltSrcInclude = dcubed@5500: getFieldString(null, "RelativeAltSrcInclude"); dcubed@5500: Vector v = getFieldVector(null, "AltRelativeInclude"); dcubed@5500: for (String pathPart : v) { dcubed@5500: if (path.contains(relativeAltSrcInclude + Util.sep + pathPart)) { dcubed@5500: return true; dcubed@5500: } dcubed@5500: } dcubed@5500: return false; dcubed@5500: } dcubed@5500: dcubed@5500: // Returns the relative alternate source file for the specified path. dcubed@5500: // Null is returned if the specified path does not have a matching dcubed@5500: // alternate source file. dcubed@5500: public static String getMatchingRelativeAltSrcFile(String path) { dcubed@5500: Vector v = getFieldVector(null, "RelativeAltSrcFileList"); dcubed@5500: if (v == null) { dcubed@5500: return null; dcubed@5500: } dcubed@5500: for (String pathPart : v) { dcubed@5500: if (path.endsWith(pathPart)) { dcubed@5500: String relativeAltSrcInclude = dcubed@5500: getFieldString(null, "RelativeAltSrcInclude"); dcubed@5500: return relativeAltSrcInclude + Util.sep + pathPart; dcubed@5500: } dcubed@5500: } dcubed@5500: return null; dcubed@5500: } dcubed@5500: dcubed@5500: // Returns true if the specified path has a matching alternate dcubed@5500: // source file. dcubed@5500: public static boolean matchesRelativeAltSrcFile(String path) { dcubed@5500: return getMatchingRelativeAltSrcFile(path) != null; dcubed@5500: } dcubed@5500: dcubed@5500: // Track the specified alternate source file. The source file is dcubed@5500: // tracked without the leading .* dcubed@5500: // part to make matching regular source files easier. dcubed@5500: public static void trackRelativeAltSrcFile(String path) { dcubed@5500: String pattern = getFieldString(null, "RelativeAltSrcInclude") + dcubed@5500: Util.sep; dcubed@5500: int altSrcInd = path.indexOf(pattern); dcubed@5500: if (altSrcInd == -1) { dcubed@5500: // not an AltSrc path dcubed@5500: return; dcubed@5500: } dcubed@5500: dcubed@5500: altSrcInd += pattern.length(); dcubed@5500: if (altSrcInd >= path.length()) { dcubed@5500: // not a valid AltSrc path dcubed@5500: return; dcubed@5500: } dcubed@5500: dcubed@5500: String altSrcFile = path.substring(altSrcInd); dcubed@5500: Vector v = getFieldVector(null, "RelativeAltSrcFileList"); dcubed@5500: if (v == null || !v.contains(altSrcFile)) { dcubed@5500: addFieldVector(null, "RelativeAltSrcFileList", altSrcFile); dcubed@5500: } dcubed@5500: } dcubed@5500: duke@435: void addTo(Hashtable ht, String key, String value) { duke@435: ht.put(expandFormat(key), expandFormat(value)); duke@435: } duke@435: duke@435: void initDefaultDefines(Vector defines) { duke@435: Vector sysDefines = new Vector(); duke@435: sysDefines.add("WIN32"); duke@435: sysDefines.add("_WINDOWS"); sla@2540: sysDefines.add("HOTSPOT_BUILD_USER=\\\""+System.getProperty("user.name")+"\\\""); duke@435: sysDefines.add("HOTSPOT_BUILD_TARGET=\\\""+get("Build")+"\\\""); sla@5237: sysDefines.add("INCLUDE_TRACE=1"); duke@435: sysDefines.add("_JNI_IMPLEMENTATION_"); sla@2540: if (vars.get("PlatformName").equals("Win32")) { sla@2540: sysDefines.add("HOTSPOT_LIB_ARCH=\\\"i386\\\""); sla@2540: } else { sla@2540: sysDefines.add("HOTSPOT_LIB_ARCH=\\\"amd64\\\""); sla@2540: } duke@435: duke@435: sysDefines.addAll(defines); duke@435: duke@435: put("Define", sysDefines); duke@435: } duke@435: duke@435: String get(String key) { duke@435: return (String)vars.get(key); duke@435: } duke@435: duke@435: Vector getV(String key) { duke@435: return (Vector)vars.get(key); duke@435: } duke@435: duke@435: Object getO(String key) { duke@435: return vars.get(key); duke@435: } duke@435: duke@435: Hashtable getH(String key) { duke@435: return (Hashtable)vars.get(key); duke@435: } duke@435: duke@435: Object getFieldInContext(String field) { duke@435: for (int i=0; i v = getFieldVector(ctx, field); duke@435: if (v != null) { neliasso@4112: for (String val : v) { neliasso@4112: rv.add(expandFormat(val).replace('/', '\\')); duke@435: } duke@435: } duke@435: } duke@435: } duke@435: duke@435: void collectRelevantHashes(Hashtable rv, String field) { neliasso@4112: for (String ctx : context) { neliasso@4112: Hashtable v = (Hashtable)getField(ctx, field); duke@435: if (v != null) { duke@435: for (Enumeration e=v.keys(); e.hasMoreElements(); ) { duke@435: String key = (String)e.nextElement(); duke@435: String val = (String)v.get(key); duke@435: addTo(rv, key, val); duke@435: } duke@435: } duke@435: } duke@435: } duke@435: duke@435: duke@435: Vector getDefines() { duke@435: Vector rv = new Vector(); duke@435: collectRelevantVectors(rv, "Define"); duke@435: return rv; duke@435: } duke@435: duke@435: Vector getIncludes() { duke@435: Vector rv = new Vector(); duke@435: collectRelevantVectors(rv, "AbsoluteInclude"); stefank@2314: rv.addAll(getSourceIncludes()); stefank@2314: return rv; stefank@2314: } stefank@2314: stefank@2314: private Vector getSourceIncludes() { neliasso@4112: Vector rv = new Vector(); dcubed@5500: String sourceBase = getFieldString(null, "SourceBase"); dcubed@5500: dcubed@5500: // add relative alternate source include values: dcubed@5500: String relativeAltSrcInclude = dcubed@5500: getFieldString(null, "RelativeAltSrcInclude"); dcubed@5500: Vector asri = new Vector(); dcubed@5500: collectRelevantVectors(asri, "AltRelativeInclude"); dcubed@5500: for (String f : asri) { dcubed@5500: rv.add(sourceBase + Util.sep + relativeAltSrcInclude + dcubed@5500: Util.sep + f); dcubed@5500: } dcubed@5500: neliasso@4112: Vector ri = new Vector(); duke@435: collectRelevantVectors(ri, "RelativeInclude"); neliasso@4112: for (String f : ri) { duke@435: rv.add(sourceBase + Util.sep + f); duke@435: } duke@435: return rv; duke@435: } duke@435: duke@435: static Hashtable cfgData = new Hashtable(); duke@435: static Hashtable globalData = new Hashtable(); duke@435: duke@435: static boolean appliesToTieredBuild(String cfg) { duke@435: return (cfg != null && duke@435: (cfg.startsWith("compiler1") || duke@435: cfg.startsWith("compiler2"))); duke@435: } duke@435: stefank@2314: // Filters out the IgnoreFile and IgnorePaths since they are stefank@2314: // handled specially for tiered builds. duke@435: static boolean appliesToTieredBuild(String cfg, String key) { stefank@2314: return (appliesToTieredBuild(cfg))&& (key != null && !key.startsWith("Ignore")); duke@435: } duke@435: duke@435: static String getTieredBuildCfg(String cfg) { duke@435: assert appliesToTieredBuild(cfg) : "illegal configuration " + cfg; duke@435: return "tiered" + cfg.substring(9); duke@435: } duke@435: duke@435: static Object getField(String cfg, String field) { duke@435: if (cfg == null) { duke@435: return globalData.get(field); duke@435: } duke@435: duke@435: Hashtable ht = (Hashtable)cfgData.get(cfg); duke@435: return ht == null ? null : ht.get(field); duke@435: } duke@435: duke@435: static String getFieldString(String cfg, String field) { duke@435: return (String)getField(cfg, field); duke@435: } duke@435: duke@435: static Vector getFieldVector(String cfg, String field) { duke@435: return (Vector)getField(cfg, field); duke@435: } duke@435: duke@435: static void putField(String cfg, String field, Object value) { duke@435: putFieldImpl(cfg, field, value); duke@435: if (appliesToTieredBuild(cfg, field)) { duke@435: putFieldImpl(getTieredBuildCfg(cfg), field, value); duke@435: } duke@435: } duke@435: duke@435: private static void putFieldImpl(String cfg, String field, Object value) { duke@435: if (cfg == null) { duke@435: globalData.put(field, value); duke@435: return; duke@435: } duke@435: duke@435: Hashtable ht = (Hashtable)cfgData.get(cfg); duke@435: if (ht == null) { duke@435: ht = new Hashtable(); duke@435: cfgData.put(cfg, ht); duke@435: } duke@435: duke@435: ht.put(field, value); duke@435: } duke@435: duke@435: static Object getFieldHash(String cfg, String field, String name) { duke@435: Hashtable ht = (Hashtable)getField(cfg, field); duke@435: duke@435: return ht == null ? null : ht.get(name); duke@435: } duke@435: duke@435: static void putFieldHash(String cfg, String field, String name, Object val) { duke@435: putFieldHashImpl(cfg, field, name, val); stefank@2314: if (appliesToTieredBuild(cfg, field)) { duke@435: putFieldHashImpl(getTieredBuildCfg(cfg), field, name, val); duke@435: } duke@435: } duke@435: duke@435: private static void putFieldHashImpl(String cfg, String field, String name, Object val) { duke@435: Hashtable ht = (Hashtable)getField(cfg, field); duke@435: duke@435: if (ht == null) { duke@435: ht = new Hashtable(); duke@435: putFieldImpl(cfg, field, ht); duke@435: } duke@435: duke@435: ht.put(name, val); duke@435: } duke@435: duke@435: static void addFieldVector(String cfg, String field, String element) { duke@435: addFieldVectorImpl(cfg, field, element); stefank@2314: if (appliesToTieredBuild(cfg, field)) { duke@435: addFieldVectorImpl(getTieredBuildCfg(cfg), field, element); duke@435: } duke@435: } duke@435: duke@435: private static void addFieldVectorImpl(String cfg, String field, String element) { duke@435: Vector v = (Vector)getField(cfg, field); duke@435: duke@435: if (v == null) { duke@435: v = new Vector(); duke@435: putFieldImpl(cfg, field, v); duke@435: } duke@435: duke@435: v.add(element); duke@435: } duke@435: duke@435: String expandFormat(String format) { duke@435: if (format == null) { duke@435: return null; duke@435: } duke@435: duke@435: if (format.indexOf('%') == -1) { duke@435: return format; duke@435: } duke@435: duke@435: StringBuffer sb = new StringBuffer(); duke@435: int len = format.length(); duke@435: for (int i=0; i