duke@435: /* sla@2540: * Copyright (c) 2005, 2011, 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: duke@435: import java.io.File; sla@2369: import java.util.Enumeration; sla@2369: import java.util.Hashtable; sla@2369: import java.util.Iterator; sla@2369: import java.util.Vector; duke@435: duke@435: class BuildConfig { duke@435: Hashtable vars; duke@435: 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: 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"); duke@435: String outDir = buildBase; duke@435: duke@435: put("Id", flavourBuild); duke@435: put("OutputDir", outDir); duke@435: put("SourceBase", sourceBase); duke@435: put("BuildBase", buildBase); sla@2369: put("OutputDll", outDir + Util.sep + outDll); duke@435: duke@435: context = new String [] {flavourBuild, flavour, build, null}; duke@435: } duke@435: duke@435: protected void init(Vector includes, Vector defines) { duke@435: initDefaultDefines(defines); duke@435: initDefaultCompilerFlags(includes); duke@435: initDefaultLinkerFlags(); stefank@2314: handleDB(); duke@435: } duke@435: duke@435: duke@435: 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: duke@435: DirectoryTree getSourceTree(String sourceBase, String startAt) { duke@435: DirectoryTree tree = new DirectoryTree(); duke@435: duke@435: tree.addSubdirToIgnore("Codemgr_wsdata"); duke@435: tree.addSubdirToIgnore("deleted_files"); duke@435: tree.addSubdirToIgnore("SCCS"); duke@435: tree.setVerbose(true); duke@435: if (startAt != null) { duke@435: tree.readDirectory(sourceBase + File.separator + startAt); duke@435: } else { duke@435: tree.readDirectory(sourceBase); duke@435: } duke@435: duke@435: return tree; duke@435: } duke@435: duke@435: sla@2540: Vector getPreferredPaths() { duke@435: Vector preferredPaths = new Vector(); sla@2540: duke@435: // In the case of multiple files with the same name in sla@2540: // different subdirectories, prefer these versions sla@2540: preferredPaths.add("windows"); sla@2540: preferredPaths.add("x86"); sla@2540: preferredPaths.add("closed"); sla@2540: duke@435: // Also prefer "opto" over "adlc" for adlcVMDeps.hpp duke@435: preferredPaths.add("opto"); duke@435: duke@435: return preferredPaths; duke@435: } duke@435: duke@435: stefank@2314: void handleDB() { duke@435: WinGammaPlatform platform = (WinGammaPlatform)getField(null, "PlatformObject"); duke@435: sla@2540: putSpecificField("AllFilesHash", computeAllFiles(platform)); duke@435: } duke@435: duke@435: stefank@2314: private boolean matchesIgnoredPath(String prefixedName) { stefank@2314: Vector rv = new Vector(); stefank@2314: collectRelevantVectors(rv, "IgnorePath"); stefank@2314: for (Iterator i = rv.iterator(); i.hasNext(); ) { stefank@2314: String pathPart = (String) i.next(); stefank@2314: if (prefixedName.contains(Util.normalize(pathPart))) { stefank@2314: return true; stefank@2314: } stefank@2314: } stefank@2314: return false; stefank@2314: } stefank@2314: duke@435: void addAll(Iterator i, Hashtable hash, duke@435: WinGammaPlatform platform, DirectoryTree tree, duke@435: Vector preferredPaths, Vector filesNotFound, Vector filesDuplicate) { duke@435: for (; i.hasNext(); ) { duke@435: String fileName = (String) i.next(); duke@435: if (lookupHashFieldInContext("IgnoreFile", fileName) == null) { duke@435: String prefixedName = platform.envVarPrefixedFileName(fileName, duke@435: 0, /* ignored */ duke@435: tree, duke@435: preferredPaths, duke@435: filesNotFound, duke@435: filesDuplicate); duke@435: if (prefixedName != null) { stefank@2314: prefixedName = Util.normalize(prefixedName); stefank@2314: if (!matchesIgnoredPath(prefixedName)) { stefank@2314: addTo(hash, prefixedName, fileName); stefank@2314: } duke@435: } duke@435: } duke@435: } duke@435: } duke@435: duke@435: void addTo(Hashtable ht, String key, String value) { duke@435: ht.put(expandFormat(key), expandFormat(value)); duke@435: } duke@435: sla@2540: Hashtable computeAllFiles(WinGammaPlatform platform) { duke@435: Hashtable rv = new Hashtable(); duke@435: DirectoryTree tree = getSourceTree(get("SourceBase"), getFieldString(null, "StartAt")); sla@2540: Vector preferredPaths = getPreferredPaths(); duke@435: duke@435: // Hold errors until end duke@435: Vector filesNotFound = new Vector(); duke@435: Vector filesDuplicate = new Vector(); duke@435: stefank@2314: Vector includedFiles = new Vector(); duke@435: duke@435: // find all files stefank@2314: Vector dirs = getSourceIncludes(); stefank@2314: for (Iterator i = dirs.iterator(); i.hasNext(); ) { stefank@2314: String dir = (String)i.next(); stefank@2314: DirectoryTree subtree = getSourceTree(dir, null); stefank@2314: for (Iterator fi = subtree.getFileIterator(); fi.hasNext(); ) { stefank@2314: String name = ((File)fi.next()).getName(); stefank@2314: includedFiles.add(name); stefank@2314: } duke@435: } stefank@2314: addAll(includedFiles.iterator(), rv, duke@435: platform, tree, duke@435: preferredPaths, filesNotFound, filesDuplicate); duke@435: duke@435: Vector addFiles = new Vector(); duke@435: collectRelevantVectors(addFiles, "AdditionalFile"); duke@435: addAll(addFiles.iterator(), rv, duke@435: platform, tree, duke@435: preferredPaths, filesNotFound, filesDuplicate); duke@435: duke@435: collectRelevantHashes(rv, "AdditionalGeneratedFile"); duke@435: duke@435: if ((filesNotFound.size() != 0) || duke@435: (filesDuplicate.size() != 0)) { duke@435: System.err.println("Error: some files were not found or " + duke@435: "appeared in multiple subdirectories of " + duke@435: "directory " + get("SourceBase") + " and could not " + sla@2540: "be resolved with os_family and arch."); duke@435: if (filesNotFound.size() != 0) { duke@435: System.err.println("Files not found:"); duke@435: for (Iterator iter = filesNotFound.iterator(); duke@435: iter.hasNext(); ) { duke@435: System.err.println(" " + (String) iter.next()); duke@435: } duke@435: } duke@435: if (filesDuplicate.size() != 0) { duke@435: System.err.println("Duplicate files:"); duke@435: for (Iterator iter = filesDuplicate.iterator(); duke@435: iter.hasNext(); ) { duke@435: System.err.println(" " + (String) iter.next()); duke@435: } duke@435: } duke@435: throw new RuntimeException(); duke@435: } duke@435: duke@435: return rv; 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")+"\\\""); 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