001 /*
002 Copyright (c) 2009 Olivier Chafik, All Rights Reserved
003
004 This file is part of JNAerator (http://jnaerator.googlecode.com/).
005
006 JNAerator is free software: you can redistribute it and/or modify
007 it under the terms of the GNU General Public License as published by
008 the Free Software Foundation, either version 3 of the License, or
009 (at your option) any later version.
010
011 JNAerator is distributed in the hope that it will be useful,
012 but WITHOUT ANY WARRANTY; without even the implied warranty of
013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
014 GNU General Public License for more details.
015
016 You should have received a copy of the GNU General Public License
017 along with JNAerator. If not, see <http://www.gnu.org/licenses/>.
018 */
019 package com.ochafik.admin.visualstudio;
020
021 import java.io.File;
022 import java.util.Arrays;
023 import java.util.List;
024 import java.util.logging.Level;
025 import java.util.logging.Logger;
026 import java.util.regex.Pattern;
027
028 import com.ochafik.util.listenable.Adapter;
029 import com.ochafik.util.string.RegexUtils;
030
031 public class VisualStudioUtils {
032 private static Logger logger = Logger.getLogger(VisualStudioUtils.class.getName());
033
034 public static List<String> getMicrosoftIncludes() {
035 return Arrays.asList(getProp("VISUAL_STUDIO_INCLUDES",
036 getMicrosoftVisualStudioHome() + "\\VC\\include" + ";" + getMicrosoftWindowsSDKHome() + "\\Include",
037 true
038 ).split(";"));
039 }
040 public static String getMicrosoftWindowsSDKHome() {
041 return getProp("WINDOWS_SDK_HOME", "C:\\Program Files\\Microsoft SDKs\\Windows\\v6.0A", true);
042 }
043 private static String getMicrosoftVisualStudioHome() {
044 return getProp("VISUAL_STUDIO_HOME", "C:\\Program Files\\Microsoft Visual Studio 9.0", true);
045 }
046 static String getProp(String name, String defVal) {
047 return getProp(name, defVal, false);
048 }
049
050 static String getProp(String name, String defVal, boolean remember) {
051 String v = System.getenv(name);
052 v = v == null ? System.getProperty(name, defVal) : v;
053 logger.log(Level.INFO, "[environment] " + name + "=" + v);
054 return v;
055 }
056
057 static final Pattern variablePattern = Pattern.compile("$\\(([^)]+)\\)");
058 enum VarType {
059 SolutionName,
060 SolutionDir,
061 ProjectName,
062 ConfigurationName,
063 TargetDir,
064 TargetPath
065 }
066 public static String resolveVariables(String string, final Solution solution, final Project project, final Configuration configuration) {
067 String res = RegexUtils.regexReplace(variablePattern, string, new Adapter<String[], String>() {
068 public String adapt(String[] value) {
069 String match = value[0];
070 String variableName = value[1];
071 VarType type = VarType.valueOf(variableName);
072 String name;
073 if (type != null) {
074 switch (type) {
075 case ProjectName:
076 return project.name == null ? match : project.name;
077 case TargetPath:
078 return configuration.outputFile == null ? match : configuration.outputFile;
079 case SolutionName:
080 name = solution.getName();
081 return name == null ? match : name;
082 case SolutionDir:
083 return solution.solutionFile == null ? match : solution.solutionFile.getParent();
084 case ConfigurationName:
085 return configuration.name;
086 case TargetDir:
087 if (configuration.outputFile == null)
088 return match;
089
090 return new File(configuration.outputFile).getParent();
091 default:
092 return match;
093 }
094 }
095 String v = System.getenv().get(variableName);
096 return v == null ? match : v;
097 }
098 });
099 //System.err.println("resolved \"" + string + "\" as :\n\t\"" + res + "\"");
100 return res;
101 }
102 }