8156018: Hotspot visual studio project generation broken

Reviewed-by: mgronlun, ctornqvi
This commit is contained in:
Magnus Ihse Bursie 2016-05-09 13:22:39 +02:00 committed by Erik Joelsson
parent c16b4b7673
commit 01fcb7adcf
8 changed files with 92 additions and 46 deletions

View file

@ -0,0 +1,87 @@
/*
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package build.tools.projectcreator;
class ArgIterator {
String[] args;
int i;
ArgIterator(String[] args) {
this.args = args;
this.i = 0;
}
String get() { return args[i]; }
boolean hasMore() { return args != null && i < args.length; }
boolean next() { return ++i < args.length; }
}
abstract class ArgHandler {
public abstract void handle(ArgIterator it);
}
class ArgRule {
String arg;
ArgHandler handler;
ArgRule(String arg, ArgHandler handler) {
this.arg = arg;
this.handler = handler;
}
boolean process(ArgIterator it) {
if (match(it.get(), arg)) {
handler.handle(it);
return true;
}
return false;
}
boolean match(String rule_pattern, String arg) {
return arg.equals(rule_pattern);
}
}
class ArgsParser {
ArgsParser(String[] args,
ArgRule[] rules,
ArgHandler defaulter) {
ArgIterator ai = new ArgIterator(args);
while (ai.hasMore()) {
boolean processed = false;
for (int i=0; i<rules.length; i++) {
processed |= rules[i].process(ai);
if (processed) {
break;
}
}
if (!processed) {
if (defaulter != null) {
defaulter.handle(ai);
} else {
System.err.println("ERROR: unparsed \""+ai.get()+"\"");
ai.next();
}
}
}
}
}

View file

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

View file

@ -0,0 +1,102 @@
/*
* Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package build.tools.projectcreator;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.util.HashSet;
import java.util.Stack;
import java.util.Vector;
public class FileTreeCreator extends SimpleFileVisitor<Path>
{
Path vcProjLocation;
Path startDir;
final int startDirLength;
Stack<DirAttributes> attributes = new Stack<DirAttributes>();
Vector<BuildConfig> allConfigs;
WinGammaPlatform wg;
WinGammaPlatformVC10 wg10;
public FileTreeCreator(Path startDir, Vector<BuildConfig> allConfigs, WinGammaPlatform wg) {
super();
this.wg = wg;
if (wg instanceof WinGammaPlatformVC10) {
wg10 = (WinGammaPlatformVC10)wg;
}
this.allConfigs = allConfigs;
this.startDir = startDir;
startDirLength = startDir.toAbsolutePath().toString().length();
vcProjLocation = FileSystems.getDefault().getPath(allConfigs.firstElement().get("BuildSpace"));
attributes.push(new DirAttributes());
}
public class DirAttributes {
private HashSet<BuildConfig> ignores;
private HashSet<BuildConfig> disablePch;
public DirAttributes() {
ignores = new HashSet<BuildConfig>();
disablePch = new HashSet<BuildConfig>();
}
public DirAttributes(HashSet<BuildConfig> excludes2, HashSet<BuildConfig> disablePch2) {
ignores = excludes2;
disablePch = disablePch2;
}
@SuppressWarnings("unchecked")
public DirAttributes clone() {
return new DirAttributes((HashSet<BuildConfig>)this.ignores.clone(), (HashSet<BuildConfig>)this.disablePch.clone());
}
public void setIgnore(BuildConfig conf) {
ignores.add(conf);
}
public boolean hasIgnore(BuildConfig cfg) {
return ignores.contains(cfg);
}
public void removeFromIgnored(BuildConfig cfg) {
ignores.remove(cfg);
}
public void setDisablePch(BuildConfig conf) {
disablePch.add(conf);
}
public boolean hasDisablePch(BuildConfig cfg) {
return disablePch.contains(cfg);
}
public void removeFromDisablePch(BuildConfig cfg) {
disablePch.remove(cfg);
}
}
}

View file

@ -0,0 +1,192 @@
/*
* Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package build.tools.projectcreator;
import static java.nio.file.FileVisitResult.CONTINUE;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Stack;
import java.util.Vector;
public class FileTreeCreatorVC10 extends FileTreeCreator {
public FileTreeCreatorVC10(Path startDir, Vector<BuildConfig> allConfigs, WinGammaPlatformVC10 wg) {
super(startDir, allConfigs, wg);
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attr) {
DirAttributes currentFileAttr = attributes.peek().clone();
boolean usePch = false;
boolean disablePch = false;
boolean useIgnore = false;
boolean isAltSrc = false; // only needed as a debugging crumb
boolean isReplacedByAltSrc = false;
String fileName = file.getFileName().toString();
// TODO hideFile
// usePch applies to all configs for a file.
if (fileName.equals(BuildConfig.getFieldString(null, "UseToGeneratePch"))) {
usePch = true;
}
String fileLoc = vcProjLocation.relativize(file).toString();
// isAltSrc and isReplacedByAltSrc applies to all configs for a file
if (BuildConfig.matchesRelativeAltSrcInclude(
file.toAbsolutePath().toString())) {
// current file is an alternate source file so track it
isAltSrc = true;
BuildConfig.trackRelativeAltSrcFile(
file.toAbsolutePath().toString());
} else if (BuildConfig.matchesRelativeAltSrcFile(
file.toAbsolutePath().toString())) {
// current file is a regular file that matches an alternate
// source file so yack about replacing the regular file
isReplacedByAltSrc = true;
System.out.println("INFO: alternate source file '" +
BuildConfig.getMatchingRelativeAltSrcFile(
file.toAbsolutePath().toString()) +
"' replaces '" + fileLoc + "'");
}
for (BuildConfig cfg : allConfigs) {
if (cfg.lookupHashFieldInContext("IgnoreFile", fileName) != null) {
useIgnore = true;
currentFileAttr.setIgnore(cfg);
} else if (cfg.matchesIgnoredPath(file.toAbsolutePath().toString())) {
useIgnore = true;
currentFileAttr.setIgnore(cfg);
}
if (cfg.lookupHashFieldInContext("DisablePch", fileName) != null) {
disablePch = true;
currentFileAttr.setDisablePch(cfg);
}
Vector<String> rv = new Vector<String>();
cfg.collectRelevantVectors(rv, "AdditionalFile");
for(String addFile : rv) {
if (addFile.equals(fileName)) {
// supress any ignore
// TODO - may need some adjustments
if (file.toAbsolutePath().toString().contains(cfg.get("Flavour"))) {
currentFileAttr.removeFromIgnored(cfg);
}
}
}
}
String tagName = wg10.getFileTagFromSuffix(fileName);
if (!useIgnore && !disablePch && !usePch && !isReplacedByAltSrc) {
wg.tag(tagName, new String[] { "Include", fileLoc});
} else {
wg.startTag(
tagName,
new String[] { "Include", fileLoc});
for (BuildConfig cfg : allConfigs) {
boolean ignore = currentFileAttr.hasIgnore(cfg);
if (ignore) {
wg.tagData("ExcludedFromBuild", "true", "Condition", "'$(Configuration)|$(Platform)'=='" + cfg.get("Name") + "'");
}
if (usePch) {
wg.tagData("PrecompiledHeader", "Create", "Condition", "'$(Configuration)|$(Platform)'=='" + cfg.get("Name") + "'");
}
if (disablePch) {
wg.tag("PrecompiledHeader", "Condition", "'$(Configuration)|$(Platform)'=='" + cfg.get("Name") + "'");
}
if (isReplacedByAltSrc) {
wg.tagData("ExcludedFromBuild", "true", "Condition",
"'$(Configuration)|$(Platform)'=='" +
cfg.get("Name") + "'");
}
}
wg.endTag();
}
String filter = startDir.relativize(file.getParent().toAbsolutePath()).toString();
wg10.addFilterDependency(fileLoc, filter);
return CONTINUE;
}
@Override
public FileVisitResult preVisitDirectory(Path path, BasicFileAttributes attrs)
throws IOException {
Boolean hide = false;
// TODO remove attrs, if path is matched in this dir, then it is too in every subdir.
// And we will check anyway
DirAttributes newAttr = attributes.peek().clone();
// check per config ignorePaths!
for (BuildConfig cfg : allConfigs) {
if (cfg.matchesIgnoredPath(path.toAbsolutePath().toString())) {
newAttr.setIgnore(cfg);
}
// Hide is always on all configs. And additional files are never hiddden
if (cfg.matchesHidePath(path.toAbsolutePath().toString())) {
hide = true;
break;
}
}
if (!hide) {
String name = startDir.relativize(path.toAbsolutePath()).toString();
if (!"".equals(name)) {
wg10.addFilter(name);
}
attributes.push(newAttr);
return super.preVisitDirectory(path, attrs);
} else {
return FileVisitResult.SKIP_SUBTREE;
}
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
//end matching attributes set by ignorepath
attributes.pop();
return CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) {
return CONTINUE;
}
public void writeFileTree() throws IOException {
Files.walkFileTree(this.startDir, this);
}
}

View file

@ -0,0 +1,106 @@
/*
* Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package build.tools.projectcreator;
public class ProjectCreator {
public static void usage() {
System.out.println("ProjectCreator options:");
System.err.println("WinGammaPlatform platform-specific options:");
System.err.println(" -sourceBase <path to directory (workspace) "
+ "containing source files; no trailing slash>");
System.err.println(" -dspFileName <full pathname to which .dsp file "
+ "will be written; all parent directories must "
+ "already exist>");
System.err.println(" -envVar <environment variable to be inserted "
+ "into .dsp file, substituting for path given in "
+ "-sourceBase. Example: HotSpotWorkSpace>");
System.err.println(" -dllLoc <path to directory in which to put "
+ "jvm.dll; no trailing slash>");
System.err.println(" If any of the above are specified, "
+ "they must all be.");
System.err.println(" Note: if '-altRelativeInclude' option below is "
+ "used, then the '-relativeAltSrcInclude' option must be used "
+ "to specify the alternate source dir, e.g., 'src\\closed'");
System.err.println(" Additional, optional arguments, which can be "
+ "specified multiple times:");
System.err.println(" -absoluteInclude <string containing absolute "
+ "path to include directory>");
System.err.println(" -altRelativeInclude <string containing "
+ "alternate include directory relative to -envVar>");
System.err.println(" -relativeInclude <string containing include "
+ "directory relative to -envVar>");
System.err.println(" -define <preprocessor flag to be #defined "
+ "(note: doesn't yet support " + "#define (flag) (value))>");
System.err.println(" -perFileLine <file> <line>");
System.err.println(" -conditionalPerFileLine <file> <line for "
+ "release build> <line for debug build>");
System.err.println(" (NOTE: To work around a bug in nmake, where "
+ "you can't have a '#' character in a quoted "
+ "string, all of the lines outputted have \"#\"" + "prepended)");
System.err.println(" -startAt <subdir of sourceBase>");
System.err.println(" -ignoreFile <file which won't be able to be "
+ "found in the sourceBase because it's generated " + "later>");
System.err.println(" -additionalFile <file not in database but "
+ "which should show up in .dsp file>");
System.err
.println(" -additionalGeneratedFile <environment variable of "
+ "generated file's location> <relative path to "
+ "directory containing file; no trailing slash> "
+ "<name of file generated later in the build process>");
System.err.println(" -prelink <build> <desc> <cmds>:");
System.err
.println(" Generate a set of prelink commands for the given BUILD");
System.err
.println(" (\"Debug\" or \"Release\"). The prelink description and commands");
System.err.println(" are both quoted strings.");
System.err.println(" Default includes: \".\"");
System.err
.println(" Default defines: WIN32, _WINDOWS, \"HOTSPOT_BUILD_USER=$(USERNAME)\"");
}
public static void main(String[] args) {
try {
if (args.length < 3) {
usage();
System.exit(1);
}
String platformName = args[0];
Class platformClass = Class.forName(platformName);
WinGammaPlatform platform = (WinGammaPlatform) platformClass
.newInstance();
String[] platformArgs = new String[args.length - 1];
System.arraycopy(args, 1, platformArgs, 0, platformArgs.length);
// Allow the platform to write platform-specific files
platform.createVcproj(platformArgs);
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
}
}

View file

@ -0,0 +1,86 @@
/*
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package build.tools.projectcreator;
import java.util.*;
import java.io.File;
public class Util {
static String join(String padder, Vector<String> v) {
return join(padder, v, false);
}
static String join(String padder, Vector<String> v, boolean quoted) {
StringBuffer sb = new StringBuffer();
for (Iterator<String> iter = v.iterator(); iter.hasNext(); ) {
if (quoted) {
sb.append('"');
}
sb.append(iter.next());
if (quoted) {
sb.append('"');
}
if (iter.hasNext()) sb.append(padder);
}
return sb.toString();
}
static String prefixed_join(String padder, Vector<String> v, boolean quoted) {
StringBuffer sb = new StringBuffer();
for (Iterator<String> iter = v.iterator(); iter.hasNext(); ) {
sb.append(padder);
if (quoted) {
sb.append('"');
}
sb.append((String)iter.next());
if (quoted) {
sb.append('"');
}
}
return sb.toString();
}
static String normalize(String file) {
file = file.replace('\\', '/');
if (file.length() > 2) {
if (file.charAt(1) == ':' && file.charAt(2) == '/') {
// convert drive letter to uppercase
String drive = file.substring(0, 1).toUpperCase();
return drive + file.substring(1);
}
}
return file;
}
static String sep = File.separator;
}

View file

@ -0,0 +1,685 @@
/*
* Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package build.tools.projectcreator;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Stack;
import java.util.Vector;
abstract class HsArgHandler extends ArgHandler {
static final int STRING = 1;
static final int VECTOR = 2;
static final int HASH = 3;
boolean nextNotKey(ArgIterator it) {
if (it.next()) {
String s = it.get();
return (s.length() == 0) || (s.charAt(0) != '-');
} else {
return false;
}
}
void empty(String key, String message) {
if (key != null) {
System.err.println("** Error: empty " + key);
}
if (message != null) {
System.err.println(message);
}
WinGammaPlatform.usage();
}
static String getCfg(String val) {
int under = val.indexOf('_');
int len = val.length();
if (under != -1 && under < len - 1) {
return val.substring(under+1, len);
} else {
return null;
}
}
}
class ArgRuleSpecific extends ArgRule {
ArgRuleSpecific(String arg, ArgHandler handler) {
super(arg, handler);
}
boolean match(String rulePattern, String arg) {
return rulePattern.startsWith(arg);
}
}
class SpecificHsArgHandler extends HsArgHandler {
String message, argKey, valKey;
int type;
public void handle(ArgIterator it) {
String cfg = getCfg(it.get());
if (nextNotKey(it)) {
String val = it.get();
switch (type) {
case VECTOR:
BuildConfig.addFieldVector(cfg, valKey, val);
break;
case HASH:
BuildConfig.putFieldHash(cfg, valKey, val, "1");
break;
case STRING:
BuildConfig.putField(cfg, valKey, val);
break;
default:
empty(valKey, "Unknown type: "+type);
}
it.next();
} else {
empty(argKey, message);
}
}
SpecificHsArgHandler(String argKey, String valKey, String message, int type) {
this.argKey = argKey;
this.valKey = valKey;
this.message = message;
this.type = type;
}
}
class HsArgRule extends ArgRuleSpecific {
HsArgRule(String argKey, String valKey, String message, int type) {
super(argKey, new SpecificHsArgHandler(argKey, valKey, message, type));
}
}
public abstract class WinGammaPlatform {
public boolean fileNameStringEquality(String s1, String s2) {
return s1.equalsIgnoreCase(s2);
}
static void usage() throws IllegalArgumentException {
System.err.println("WinGammaPlatform platform-specific options:");
System.err.println(" -sourceBase <path to directory (workspace) " +
"containing source files; no trailing slash>");
System.err.println(" -projectFileName <full pathname to which project file " +
"will be written; all parent directories must " +
"already exist>");
System.err.println(" If any of the above are specified, "+
"they must all be.");
System.err.println(" Note: if '-altRelativeInclude' option below " +
"is used, then the '-relativeAltSrcInclude' " +
"option must be used to specify the alternate " +
"source dir, e.g., 'src\\closed'");
System.err.println(" Additional, optional arguments, which can be " +
"specified multiple times:");
System.err.println(" -absoluteInclude <string containing absolute " +
"path to include directory>");
System.err.println(" -altRelativeInclude <string containing " +
"alternate include directory relative to " +
"-sourceBase>");
System.err.println(" -relativeInclude <string containing include " +
"directory relative to -sourceBase>");
System.err.println(" -define <preprocessor flag to be #defined " +
"(note: doesn't yet support " +
"#define (flag) (value))>");
System.err.println(" -startAt <subdir of sourceBase>");
System.err.println(" -additionalFile <file not in database but " +
"which should show up in project file>");
System.err.println(" -additionalGeneratedFile <absolute path to " +
"directory containing file; no trailing slash> " +
"<name of file generated later in the build process>");
throw new IllegalArgumentException();
}
public void addPerFileLine(Hashtable table,
String fileName,
String line) {
Vector v = (Vector) table.get(fileName);
if (v != null) {
v.add(line);
} else {
v = new Vector();
v.add(line);
table.put(fileName, v);
}
}
protected static class PerFileCondData {
public String releaseString;
public String debugString;
}
protected void addConditionalPerFileLine(Hashtable table,
String fileName,
String releaseLine,
String debugLine) {
PerFileCondData data = new PerFileCondData();
data.releaseString = releaseLine;
data.debugString = debugLine;
Vector v = (Vector) table.get(fileName);
if (v != null) {
v.add(data);
} else {
v = new Vector();
v.add(data);
table.put(fileName, v);
}
}
protected static class PrelinkCommandData {
String description;
String commands;
}
protected void addPrelinkCommand(Hashtable table,
String build,
String description,
String commands) {
PrelinkCommandData data = new PrelinkCommandData();
data.description = description;
data.commands = commands;
table.put(build, data);
}
public boolean findString(Vector v, String s) {
for (Iterator iter = v.iterator(); iter.hasNext(); ) {
if (((String) iter.next()).equals(s)) {
return true;
}
}
return false;
}
String getProjectName(String fullPath, String extension)
throws IllegalArgumentException, IOException {
File file = new File(fullPath).getCanonicalFile();
fullPath = file.getCanonicalPath();
String parent = file.getParent();
if (!fullPath.endsWith(extension)) {
throw new IllegalArgumentException("project file name \"" +
fullPath +
"\" does not end in "+extension);
}
if ((parent != null) &&
(!fullPath.startsWith(parent))) {
throw new RuntimeException(
"Internal error: parent of file name \"" + parent +
"\" does not match file name \"" + fullPath + "\""
);
}
int len = parent.length();
if (!parent.endsWith(Util.sep)) {
len += Util.sep.length();
}
int end = fullPath.length() - extension.length();
if (len == end) {
throw new RuntimeException(
"Internal error: file name was empty"
);
}
return fullPath.substring(len, end);
}
protected abstract String getProjectExt();
public void createVcproj(String[] args)
throws IllegalArgumentException, IOException {
parseArguments(args);
String projectFileName = BuildConfig.getFieldString(null, "ProjectFileName");
String ext = getProjectExt();
String projectName = getProjectName(projectFileName, ext);
writeProjectFile(projectFileName, projectName, createAllConfigs(BuildConfig.getFieldString(null, "PlatformName")));
}
protected void writePrologue(String[] args) {
System.err.println("WinGammaPlatform platform-specific arguments:");
for (int i = 0; i < args.length; i++) {
System.err.print(args[i] + " ");
}
System.err.println();
}
void parseArguments(String[] args) {
new ArgsParser(args,
new ArgRule[]
{
new ArgRule("-sourceBase",
new HsArgHandler() {
public void handle(ArgIterator it) {
String cfg = getCfg(it.get());
if (nextNotKey(it)) {
String sb = (String) it.get();
if (sb.endsWith(Util.sep)) {
sb = sb.substring(0, sb.length() - 1);
}
BuildConfig.putField(cfg, "SourceBase", sb);
it.next();
} else {
empty("-sourceBase", null);
}
}
}
),
new HsArgRule("-buildBase",
"BuildBase",
" (Did you set the HotSpotBuildSpace environment variable?)",
HsArgHandler.STRING
),
new HsArgRule("-buildSpace",
"BuildSpace",
null,
HsArgHandler.STRING
),
new HsArgRule("-makeBinary",
"MakeBinary",
null,
HsArgHandler.STRING
),
new HsArgRule("-makeOutput",
"MakeOutput",
null,
HsArgHandler.STRING
),
new HsArgRule("-platformName",
"PlatformName",
null,
HsArgHandler.STRING
),
new HsArgRule("-projectFileName",
"ProjectFileName",
null,
HsArgHandler.STRING
),
new HsArgRule("-jdkTargetRoot",
"JdkTargetRoot",
" (Did you set the HotSpotJDKDist environment variable?)",
HsArgHandler.STRING
),
new HsArgRule("-compiler",
"CompilerVersion",
" (Did you set the VcVersion correctly?)",
HsArgHandler.STRING
),
new HsArgRule("-absoluteInclude",
"AbsoluteInclude",
null,
HsArgHandler.VECTOR
),
new HsArgRule("-altRelativeInclude",
"AltRelativeInclude",
null,
HsArgHandler.VECTOR
),
new HsArgRule("-relativeInclude",
"RelativeInclude",
null,
HsArgHandler.VECTOR
),
new HsArgRule("-absoluteSrcInclude",
"AbsoluteSrcInclude",
null,
HsArgHandler.VECTOR
),
new HsArgRule("-relativeAltSrcInclude",
"RelativeAltSrcInclude",
null,
HsArgHandler.STRING
),
new HsArgRule("-relativeSrcInclude",
"RelativeSrcInclude",
null,
HsArgHandler.VECTOR
),
new HsArgRule("-define",
"Define",
null,
HsArgHandler.VECTOR
),
new HsArgRule("-useToGeneratePch",
"UseToGeneratePch",
null,
HsArgHandler.STRING
),
new ArgRuleSpecific("-perFileLine",
new HsArgHandler() {
public void handle(ArgIterator it) {
String cfg = getCfg(it.get());
if (nextNotKey(it)) {
String fileName = it.get();
if (nextNotKey(it)) {
String line = it.get();
BuildConfig.putFieldHash(cfg, "PerFileLine", fileName, line);
it.next();
return;
}
}
empty(null, "** Error: wrong number of args to -perFileLine");
}
}
),
new ArgRuleSpecific("-conditionalPerFileLine",
new HsArgHandler() {
public void handle(ArgIterator it) {
String cfg = getCfg(it.get());
if (nextNotKey(it)) {
String fileName = it.get();
if (nextNotKey(it)) {
String productLine = it.get();
if (nextNotKey(it)) {
String debugLine = it.get();
BuildConfig.putFieldHash(cfg+"_debug", "CondPerFileLine",
fileName, debugLine);
BuildConfig.putFieldHash(cfg+"_product", "CondPerFileLine",
fileName, productLine);
it.next();
return;
}
}
}
empty(null, "** Error: wrong number of args to -conditionalPerFileLine");
}
}
),
new HsArgRule("-disablePch",
"DisablePch",
null,
HsArgHandler.HASH
),
new ArgRule("-startAt",
new HsArgHandler() {
public void handle(ArgIterator it) {
if (BuildConfig.getField(null, "StartAt") != null) {
empty(null, "** Error: multiple -startAt");
}
if (nextNotKey(it)) {
BuildConfig.putField(null, "StartAt", it.get());
it.next();
} else {
empty("-startAt", null);
}
}
}
),
new HsArgRule("-ignoreFile",
"IgnoreFile",
null,
HsArgHandler.HASH
),
new HsArgRule("-ignorePath",
"IgnorePath",
null,
HsArgHandler.VECTOR
),
new HsArgRule("-hidePath",
"HidePath",
null,
HsArgHandler.VECTOR
),
new HsArgRule("-additionalFile",
"AdditionalFile",
null,
HsArgHandler.VECTOR
),
new ArgRuleSpecific("-additionalGeneratedFile",
new HsArgHandler() {
public void handle(ArgIterator it) {
String cfg = getCfg(it.get());
if (nextNotKey(it)) {
String dir = it.get();
if (nextNotKey(it)) {
String fileName = it.get();
BuildConfig.putFieldHash(cfg, "AdditionalGeneratedFile",
Util.normalize(dir + Util.sep + fileName),
fileName);
it.next();
return;
}
}
empty(null, "** Error: wrong number of args to -additionalGeneratedFile");
}
}
),
new ArgRule("-prelink",
new HsArgHandler() {
public void handle(ArgIterator it) {
if (nextNotKey(it)) {
if (nextNotKey(it)) {
String description = it.get();
if (nextNotKey(it)) {
String command = it.get();
BuildConfig.putField(null, "PrelinkDescription", description);
BuildConfig.putField(null, "PrelinkCommand", command);
it.next();
return;
}
}
}
empty(null, "** Error: wrong number of args to -prelink");
}
}
),
new ArgRule("-postbuild",
new HsArgHandler() {
public void handle(ArgIterator it) {
if (nextNotKey(it)) {
if (nextNotKey(it)) {
String description = it.get();
if (nextNotKey(it)) {
String command = it.get();
BuildConfig.putField(null, "PostbuildDescription", description);
BuildConfig.putField(null, "PostbuildCommand", command);
it.next();
return;
}
}
}
empty(null, "** Error: wrong number of args to -postbuild");
}
}
),
},
new ArgHandler() {
public void handle(ArgIterator it) {
throw new RuntimeException("Arg Parser: unrecognized option "+it.get());
}
}
);
if (BuildConfig.getField(null, "SourceBase") == null ||
BuildConfig.getField(null, "BuildBase") == null ||
BuildConfig.getField(null, "ProjectFileName") == null ||
BuildConfig.getField(null, "CompilerVersion") == null) {
usage();
}
BuildConfig.putField(null, "PlatformObject", this);
}
Vector createAllConfigs(String platform) {
Vector allConfigs = new Vector();
allConfigs.add(new C1DebugConfig());
allConfigs.add(new C1FastDebugConfig());
allConfigs.add(new C1ProductConfig());
allConfigs.add(new TieredDebugConfig());
allConfigs.add(new TieredFastDebugConfig());
allConfigs.add(new TieredProductConfig());
return allConfigs;
}
PrintWriter printWriter;
public void writeProjectFile(String projectFileName, String projectName,
Vector<BuildConfig> allConfigs) throws IOException {
throw new RuntimeException("use compiler version specific version");
}
int indent;
private Stack<String> tagStack = new Stack<String>();
private void startTagPrim(String name, String[] attrs, boolean close) {
startTagPrim(name, attrs, close, true);
}
private void startTagPrim(String name, String[] attrs, boolean close,
boolean newline) {
doIndent();
printWriter.print("<" + name);
indent++;
if (attrs != null && attrs.length > 0) {
for (int i = 0; i < attrs.length; i += 2) {
printWriter.print(" " + attrs[i] + "=\"" + attrs[i + 1] + "\"");
if (i < attrs.length - 2) {
}
}
}
if (close) {
indent--;
printWriter.print(" />");
} else {
// TODO push tag name, and change endTag to pop and print.
tagStack.push(name);
printWriter.print(">");
}
if (newline) {
printWriter.println();
}
}
void startTag(String name, String... attrs) {
startTagPrim(name, attrs, false);
}
void startTagV(String name, Vector attrs) {
String s[] = new String[attrs.size()];
for (int i = 0; i < attrs.size(); i++) {
s[i] = (String) attrs.elementAt(i);
}
startTagPrim(name, s, false);
}
void endTag() {
String name = tagStack.pop();
indent--;
doIndent();
printWriter.println("</" + name + ">");
}
private void endTagNoIndent() {
String name = tagStack.pop();
indent--;
printWriter.println("</" + name + ">");
}
void tag(String name, String... attrs) {
startTagPrim(name, attrs, true);
}
void tagData(String name, String data) {
startTagPrim(name, null, false, false);
printWriter.print(data);
endTagNoIndent();
}
void tagData(String name, String data, String... attrs) {
startTagPrim(name, attrs, false, false);
printWriter.print(data);
endTagNoIndent();
}
void tagV(String name, Vector attrs) {
String s[] = new String[attrs.size()];
for (int i = 0; i < attrs.size(); i++) {
s[i] = (String) attrs.elementAt(i);
}
startTagPrim(name, s, true);
}
void doIndent() {
for (int i = 0; i < indent; i++) {
printWriter.print(" ");
}
}
}

View file

@ -0,0 +1,471 @@
/*
* Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package build.tools.projectcreator;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.nio.file.FileSystems;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.UUID;
import java.util.Vector;
public class WinGammaPlatformVC10 extends WinGammaPlatform {
LinkedList <String>filters = new LinkedList<String>();
LinkedList <String[]>filterDeps = new LinkedList<String[]>();
@Override
protected String getProjectExt() {
return ".vcxproj";
}
@Override
public void writeProjectFile(String projectFileName, String projectName,
Vector<BuildConfig> allConfigs) throws IOException {
System.out.println();
System.out.println(" Writing .vcxproj file: " + projectFileName);
String projDir = Util.normalize(new File(projectFileName).getParent());
printWriter = new PrintWriter(projectFileName, "UTF-8");
printWriter.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
startTag("Project",
"DefaultTargets", "Build",
"ToolsVersion", "4.0",
"xmlns", "http://schemas.microsoft.com/developer/msbuild/2003");
startTag("ItemGroup",
"Label", "ProjectConfigurations");
for (BuildConfig cfg : allConfigs) {
startTag("ProjectConfiguration",
"Include", cfg.get("Name"));
tagData("Configuration", cfg.get("Id"));
tagData("Platform", cfg.get("PlatformName"));
endTag();
}
endTag();
startTag("PropertyGroup", "Label", "Globals");
tagData("ProjectGuid", "{8822CB5C-1C41-41C2-8493-9F6E1994338B}");
tagData("Keyword", "MakeFileProj");
tag("SccProjectName");
tag("SccLocalPath");
endTag();
tag("Import", "Project", "$(VCTargetsPath)\\Microsoft.Cpp.Default.props");
for (BuildConfig cfg : allConfigs) {
startTag(cfg, "PropertyGroup", "Label", "Configuration");
tagData("ConfigurationType", "Makefile");
tagData("UseDebugLibraries", "true");
endTag();
}
tag("Import", "Project", "$(VCTargetsPath)\\Microsoft.Cpp.props");
startTag("ImportGroup", "Label", "ExtensionSettings");
endTag();
for (BuildConfig cfg : allConfigs) {
startTag(cfg, "ImportGroup", "Label", "PropertySheets");
tag("Import",
"Project", "$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props",
"Condition", "exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')",
"Label", "LocalAppDataPlatform");
endTag();
}
tag("PropertyGroup", "Label", "UserMacros");
startTag("PropertyGroup");
tagData("_ProjectFileVersion", "10.0.30319.1");
for (BuildConfig cfg : allConfigs) {
tagData(cfg, "OutDir", cfg.get("OutputDir") + Util.sep);
tagData(cfg, "IntDir", cfg.get("OutputDir") + Util.sep);
tagData(cfg, "LinkIncremental", "false");
}
for (BuildConfig cfg : allConfigs) {
tagData(cfg, "CodeAnalysisRuleSet", "AllRules.ruleset");
tag(cfg, "CodeAnalysisRules");
tag(cfg, "CodeAnalysisRuleAssemblies");
}
for (BuildConfig cfg : allConfigs) {
tagData(cfg, "NMakeBuildCommandLine", cfg.get("MakeBinary") + " -f ../../Makefile import-hotspot LOG=info");
tagData(cfg, "NMakeReBuildCommandLine", cfg.get("MakeBinary") + " -f ../../Makefile clean-hotspot import-hotspot LOG=info");
tagData(cfg, "NMakeCleanCommandLine", cfg.get("MakeBinary") + " -f ../../Makefile clean-hotspot LOG=info");
tagData(cfg, "NMakeOutput", cfg.get("MakeOutput") + Util.sep + "jvm.dll");
tagData(cfg, "NMakePreprocessorDefinitions", Util.join(";", cfg.getDefines()));
tagData(cfg, "NMakeIncludeSearchPath", Util.join(";", cfg.getIncludes()));
}
endTag();
for (BuildConfig cfg : allConfigs) {
startTag(cfg, "ItemDefinitionGroup");
startTag("ClCompile");
tagV(cfg.getV("CompilerFlags"));
endTag();
startTag("Link");
tagV(cfg.getV("LinkerFlags"));
endTag();
endTag();
}
writeFiles(allConfigs, projDir);
tag("Import", "Project", "$(VCTargetsPath)\\Microsoft.Cpp.targets");
startTag("ImportGroup", "Label", "ExtensionTargets");
endTag();
endTag();
printWriter.close();
System.out.println(" Done writing .vcxproj file.");
writeFilterFile(projectFileName, projectName, allConfigs, projDir);
writeUserFile(projectFileName, allConfigs);
}
private void writeUserFile(String projectFileName, Vector<BuildConfig> allConfigs) throws FileNotFoundException, UnsupportedEncodingException {
String userFileName = projectFileName + ".user";
if (new File(userFileName).exists()) {
return;
}
System.out.print(" Writing .vcxproj.user file: " + userFileName);
printWriter = new PrintWriter(userFileName, "UTF-8");
printWriter.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
startTag("Project",
"ToolsVersion", "4.0",
"xmlns", "http://schemas.microsoft.com/developer/msbuild/2003");
for (BuildConfig cfg : allConfigs) {
startTag(cfg, "PropertyGroup");
tagData("LocalDebuggerCommand", cfg.get("JdkTargetRoot") + "\\bin\\java.exe");
// Since we run "make hotspot-import", we get the correct jvm.dll by java.exe.
// The '-XX:+PauseAtExit' option
// causes the VM to wait for key press before exiting; this
// allows any stdout or stderr messages to be seen before
// the cmdtool exits.
tagData("LocalDebuggerCommandArguments",
"-XX:+UnlockDiagnosticVMOptions -XX:+PauseAtExit");
tagData("LocalDebuggerEnvironment", "JAVA_HOME=" + cfg.get("JdkTargetRoot"));
endTag();
}
endTag();
printWriter.close();
System.out.println(" Done.");
}
public void addFilter(String rPath) {
filters.add(rPath);
}
public void addFilterDependency(String fileLoc, String filter) {
filterDeps.add(new String[] {fileLoc, filter});
}
private void writeFilterFile(String projectFileName, String projectName,
Vector<BuildConfig> allConfigs, String base) throws FileNotFoundException, UnsupportedEncodingException {
String filterFileName = projectFileName + ".filters";
System.out.print(" Writing .vcxproj.filters file: " + filterFileName);
printWriter = new PrintWriter(filterFileName, "UTF-8");
printWriter.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
startTag("Project",
"ToolsVersion", "4.0",
"xmlns", "http://schemas.microsoft.com/developer/msbuild/2003");
startTag("ItemGroup");
for (String filter : filters) {
startTag("Filter", "Include",filter);
UUID uuid = UUID.randomUUID();
tagData("UniqueIdentifier", "{" + uuid.toString() + "}");
endTag();
}
endTag();
//TODO - do I need to split cpp and hpp files?
// then all files
startTag("ItemGroup");
for (String[] dep : filterDeps) {
String tagName = getFileTagFromSuffix(dep[0]);
startTag(tagName, "Include", dep[0]);
tagData("Filter", dep[1]);
endTag();
}
endTag();
endTag();
printWriter.close();
System.out.println(" Done.");
}
public String getFileTagFromSuffix(String fileName) {
if (fileName.endsWith(".cpp")) {
return"ClCompile";
} else if (fileName.endsWith(".c")) {
return "ClCompile";
} else if (fileName.endsWith(".hpp")) {
return"ClInclude";
} else if (fileName.endsWith(".h")) {
return "ClInclude";
} else {
return"None";
}
}
void writeFiles(Vector<BuildConfig> allConfigs, String projDir) {
// This code assummes there are no config specific includes.
startTag("ItemGroup");
String sourceBase = BuildConfig.getFieldString(null, "SourceBase");
// Use first config for all global absolute includes.
BuildConfig baseConfig = allConfigs.firstElement();
Vector<String> rv = new Vector<String>();
// Then use first config for all relative includes
Vector<String> ri = new Vector<String>();
baseConfig.collectRelevantVectors(ri, "RelativeSrcInclude");
for (String f : ri) {
rv.add(sourceBase + Util.sep + f);
}
baseConfig.collectRelevantVectors(rv, "AbsoluteSrcInclude");
handleIncludes(rv, allConfigs);
endTag();
}
// Will visit file tree for each include
private void handleIncludes(Vector<String> includes, Vector<BuildConfig> allConfigs) {
for (String path : includes) {
FileTreeCreatorVC10 ftc = new FileTreeCreatorVC10(FileSystems.getDefault().getPath(path) , allConfigs, this);
try {
ftc.writeFileTree();
} catch (IOException e) {
e.printStackTrace();
}
}
}
String buildCond(BuildConfig cfg) {
return "'$(Configuration)|$(Platform)'=='"+cfg.get("Name")+"'";
}
void tagV(Vector<String> v) {
Iterator<String> i = v.iterator();
while(i.hasNext()) {
String name = i.next();
String data = i.next();
tagData(name, data);
}
}
void tagData(BuildConfig cfg, String name, String data) {
tagData(name, data, "Condition", buildCond(cfg));
}
void tag(BuildConfig cfg, String name, String... attrs) {
String[] ss = new String[attrs.length + 2];
ss[0] = "Condition";
ss[1] = buildCond(cfg);
System.arraycopy(attrs, 0, ss, 2, attrs.length);
tag(name, ss);
}
void startTag(BuildConfig cfg, String name, String... attrs) {
String[] ss = new String[attrs.length + 2];
ss[0] = "Condition";
ss[1] = buildCond(cfg);
System.arraycopy(attrs, 0, ss, 2, attrs.length);
startTag(name, ss);
}
}
class CompilerInterfaceVC10 extends CompilerInterface {
@Override
Vector getBaseCompilerFlags(Vector defines, Vector includes, String outDir) {
Vector rv = new Vector();
addAttr(rv, "AdditionalIncludeDirectories", Util.join(";", includes));
addAttr(rv, "PreprocessorDefinitions",
Util.join(";", defines).replace("\\\"", "\""));
addAttr(rv, "PrecompiledHeaderFile", "precompiled.hpp");
addAttr(rv, "PrecompiledHeaderOutputFile", outDir+Util.sep+"vm.pch");
addAttr(rv, "AssemblerListingLocation", outDir);
addAttr(rv, "ObjectFileName", outDir+Util.sep);
addAttr(rv, "ProgramDataBaseFileName", outDir+Util.sep+"jvm.pdb");
// Set /nologo option
addAttr(rv, "SuppressStartupBanner", "true");
// Surpass the default /Tc or /Tp.
addAttr(rv, "CompileAs", "Default");
// Set /W3 option.
addAttr(rv, "WarningLevel", "Level3");
// Set /WX option,
addAttr(rv, "TreatWarningAsError", "true");
// Set /GS option
addAttr(rv, "BufferSecurityCheck", "false");
// Set /Zi option.
addAttr(rv, "DebugInformationFormat", "ProgramDatabase");
// Set /Yu option.
addAttr(rv, "PrecompiledHeader", "Use");
// Set /EHsc- option
addAttr(rv, "ExceptionHandling", "");
addAttr(rv, "MultiProcessorCompilation", "true");
return rv;
}
@Override
Vector getDebugCompilerFlags(String opt, String platformName) {
Vector rv = new Vector();
// Set /On option
addAttr(rv, "Optimization", opt);
// Set /MD option.
addAttr(rv, "RuntimeLibrary", "MultiThreadedDLL");
// Set /Oy- option
addAttr(rv, "OmitFramePointers", "false");
// Set /homeparams for x64 debug builds
if(platformName.equals("x64")) {
addAttr(rv, "AdditionalOptions", "/homeparams");
}
return rv;
}
@Override
Vector getProductCompilerFlags() {
Vector rv = new Vector();
// Set /O2 option.
addAttr(rv, "Optimization", "MaxSpeed");
// Set /Oy- option
addAttr(rv, "OmitFramePointers", "false");
// Set /Ob option. 1 is expandOnlyInline
addAttr(rv, "InlineFunctionExpansion", "OnlyExplicitInline");
// Set /GF option.
addAttr(rv, "StringPooling", "true");
// Set /MD option. 2 is rtMultiThreadedDLL
addAttr(rv, "RuntimeLibrary", "MultiThreadedDLL");
// Set /Gy option
addAttr(rv, "FunctionLevelLinking", "true");
return rv;
}
@Override
Vector getBaseLinkerFlags(String outDir, String outDll, String platformName) {
Vector rv = new Vector();
if(platformName.equals("Win32")) {
addAttr(rv, "AdditionalOptions",
"/export:JNI_GetDefaultJavaVMInitArgs " +
"/export:JNI_CreateJavaVM " +
"/export:JVM_FindClassFromBootLoader "+
"/export:JNI_GetCreatedJavaVMs "+
"/export:jio_snprintf /export:jio_printf "+
"/export:jio_fprintf /export:jio_vfprintf "+
"/export:jio_vsnprintf "+
"/export:JVM_GetVersionInfo "+
"/export:JVM_InitAgentProperties");
}
addAttr(rv, "AdditionalDependencies", "kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;Wsock32.lib;winmm.lib;psapi.lib;version.lib");
addAttr(rv, "OutputFile", outDll);
addAttr(rv, "SuppressStartupBanner", "true");
addAttr(rv, "ModuleDefinitionFile", outDir+Util.sep+"vm.def");
addAttr(rv, "ProgramDatabaseFile", outDir+Util.sep+"jvm.pdb");
addAttr(rv, "SubSystem", "Windows");
addAttr(rv, "BaseAddress", "0x8000000");
addAttr(rv, "ImportLibrary", outDir+Util.sep+"jvm.lib");
if(platformName.equals("Win32")) {
addAttr(rv, "TargetMachine", "MachineX86");
} else {
addAttr(rv, "TargetMachine", "MachineX64");
}
// We always want the /DEBUG option to get full symbol information in the pdb files
addAttr(rv, "GenerateDebugInformation", "true");
return rv;
}
@Override
Vector getDebugLinkerFlags() {
Vector rv = new Vector();
// Empty now that /DEBUG option is used by all configs
return rv;
}
@Override
Vector getProductLinkerFlags() {
Vector rv = new Vector();
// Set /OPT:REF option.
addAttr(rv, "OptimizeReferences", "true");
// Set /OPT:ICF option.
addAttr(rv, "EnableCOMDATFolding", "true");
return rv;
}
@Override
void getAdditionalNonKernelLinkerFlags(Vector rv) {
extAttr(rv, "AdditionalOptions", " /export:AsyncGetCallTrace");
}
@Override
String getOptFlag() {
return "MaxSpeed";
}
@Override
String getNoOptFlag() {
return "Disabled";
}
@Override
String makeCfgName(String flavourBuild, String platform) {
return flavourBuild + "|" + platform;
}
}