View Javadoc
1   package org.codehaus.mojo.natives.msvc;
2   
3   import java.io.File;
4   import java.io.IOException;
5   import java.util.Map;
6   
7   import org.codehaus.mojo.natives.AbstractEnvFactory;
8   import org.codehaus.mojo.natives.NativeBuildException;
9   import org.codehaus.mojo.natives.util.EnvUtil;
10  import org.codehaus.plexus.util.FileUtils;
11  import org.codehaus.plexus.util.cli.CommandLineUtils;
12  import org.codehaus.plexus.util.cli.Commandline;
13  import org.codehaus.plexus.util.cli.DefaultConsumer;
14  import org.codehaus.plexus.util.cli.StreamConsumer;
15  
16  public abstract class AbstractMSVCEnvFactory
17      extends AbstractEnvFactory
18  {
19  
20      protected static String getProgramFiles()
21      {
22          return EnvUtil.getEnv( "ProgramFiles", "ProgramFiles", "C:\\Program Files" );
23      }
24  
25      protected static String getProgramFilesX86()
26      {
27          return EnvUtil.getEnv( "ProgramFiles(x86)", "ProgramFiles", getProgramFiles() );
28      }
29  
30      protected static String getSystemRoot()
31      {
32          return EnvUtil.getEnv( "SystemRoot", "SystemRoot", "C:\\WINDOWS" );
33      }
34  
35      protected Map createEnvs( String commonToolEnvKey, String platform )
36          throws NativeBuildException
37      {
38  
39          File tmpEnvExecFile = null;
40          try
41          {
42              File vsCommonToolDir = this.getCommonToolDirectory( commonToolEnvKey );
43  
44              File vsInstallDir = this.getVisualStudioInstallDirectory( vsCommonToolDir );
45  
46              if ( !vsInstallDir.isDirectory() )
47              {
48                  throw new NativeBuildException( vsInstallDir.getPath() + " is not a directory." );
49              }
50  
51              tmpEnvExecFile = this.createEnvWrapperFile( vsInstallDir, platform );
52  
53              Commandline cl = new Commandline();
54              cl.setExecutable( tmpEnvExecFile.getAbsolutePath() );
55  
56              EnvStreamConsumer stdout = new EnvStreamConsumer();
57              StreamConsumer stderr = new DefaultConsumer();
58  
59              CommandLineUtils.executeCommandLine( cl, stdout, stderr );
60  
61              return stdout.getParsedEnv();
62          }
63          catch ( Exception e )
64          {
65              throw new NativeBuildException( "Unable to retrieve env", e );
66          }
67          finally
68          {
69              if ( tmpEnvExecFile != null )
70              {
71                  tmpEnvExecFile.delete();
72              }
73          }
74  
75      }
76  
77      private File getCommonToolDirectory( String commonToolEnvKey )
78          throws NativeBuildException
79      {
80          String envValue = System.getenv( commonToolEnvKey );
81          if ( envValue == null )
82          {
83              throw new NativeBuildException( "Environment variable: " + commonToolEnvKey + " not available." );
84          }
85  
86          return new File( envValue );
87      }
88  
89      private File getVisualStudioInstallDirectory( File commonToolDir )
90          throws NativeBuildException
91      {
92          try
93          {
94              return new File( commonToolDir, "../.." ).getCanonicalFile();
95          }
96          catch ( IOException e )
97          {
98              throw new NativeBuildException( "Unable to contruct Visual Studio install directory using: "
99                  + commonToolDir, e );
100         }
101     }
102 
103     private File createEnvWrapperFile( File vsInstallDir, String platform )
104         throws IOException
105     {
106 
107         File tmpFile = File.createTempFile( "msenv", ".bat" );
108 
109         StringBuffer buffer = new StringBuffer();
110         buffer.append( "@echo off\r\n" );
111         buffer.append( "call \"" ).append( vsInstallDir ).append( "\"" ).append( "\\VC\\vcvarsall.bat " + platform
112                                                                                      + "\n\r" );
113         buffer.append( "echo " + EnvStreamConsumer.START_PARSING_INDICATOR ).append( "\r\n" );
114         buffer.append( "set\n\r" );
115 
116         FileUtils.fileWrite( tmpFile.getAbsolutePath(), buffer.toString() );
117 
118         return tmpFile;
119     }
120 
121 }