blob: 637d3c778b2c4f3aca2107b0f9f0c49cd27b72c9 [file] [log] [blame]
/*
* Copyright 1999-2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jk.ant.compilers;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import org.apache.jk.ant.Def;
import org.apache.jk.ant.SoTask;
import org.apache.jk.ant.Source;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.types.Commandline;
import org.apache.tools.ant.util.GlobPatternMapper;
/**
* Compile using Microsoft Visual C++ v6.0
*
* @author Costin Manolache
* @author Ignacio J. Ortega
* @author Mike Anderson
* @author Larry Isaacs
*/
public class MsvcCompiler extends CompilerAdapter {
GlobPatternMapper co_mapperS=new GlobPatternMapper();
public MsvcCompiler() {
super();
co_mapperS.setFrom("*.c");
co_mapperS.setTo("*.obj");
}
public String[] getTargetFiles( Source src ) {
File srcFile = src.getFile();
String name=srcFile.getName();
return co_mapperS.mapFileName( name );
}
public void setSoTask(SoTask so ) {
this.so=so;
so.setExtension(".dll");
so.duplicateTo( this );
project.setProperty("win32", "true");
if (optG)
project.setProperty("win32.debug", "true");
else
project.setProperty("win32.release", "true");
}
/** Compile using msvc
*/
public void compileSingleFile(Source sourceObj) throws BuildException {
File f=sourceObj.getFile();
String source=f.toString();
String [] includeList = ( includes==null ) ?
new String[] {} : includes.getIncludePatterns(project);
Commandline cmd = new Commandline();
String cc=project.getProperty("build.compiler.cc");
if(cc==null) cc="cl";
cmd.setExecutable( cc );
addCCArgs( cmd, source, includeList );
int result=execute( cmd );
if( result!=0 ) {
log("Compile failed " + result + " " + source );
log("Output:" );
if( outputstream!=null )
log( outputstream.toString());
log("StdErr:" );
if( errorstream!=null )
log( errorstream.toString());
throw new BuildException("Compile failed " + source);
}
File ccOpt = new File(buildDir, "cc.opt");
ccOpt.delete();
closeStreamHandler();
}
/** common compiler args
*/
private void addCCArgs(Commandline cmd, String source, String includeList[]) {
String extra_cflags=project.getProperty("build.native.extra_cflags");
String localCflags=cflags;
File ccOpt = new File(buildDir, "cc.opt");
if( localCflags==null ) {
localCflags=new String("-nologo -W3 -GX -O2 -c");
if( extra_cflags!=null ) {
localCflags+=" " + extra_cflags;
}
}
if (optG)
localCflags += " -MTd -Zi";
else
localCflags += " -MT";
// create a cc.opt file
PrintWriter ccpw = null;
try
{
ccpw = new PrintWriter(new FileWriter(ccOpt));
// write the compilation flags out
ccpw.println(localCflags);
for( int i=0; i<includeList.length; i++ ) {
ccpw.print("-I");
if (!includeList[i].startsWith("\"")) {
ccpw.print("\"");
}
ccpw.print(includeList[i] );
if (!includeList[i].endsWith("\"")) {
ccpw.print("\"");
}
ccpw.println();
}
if( defines.size() > 0 ) {
Enumeration defs=defines.elements();
while( defs.hasMoreElements() ) {
Def d=(Def)defs.nextElement();
String name=d.getName();
String val=d.getValue();
if( name==null ) continue;
String arg="-D" + name;
if( val!=null )
arg+= "=" + val;
ccpw.println(arg);
}
}
}
catch (IOException ioe)
{
System.out.println("Caught IOException");
}
finally
{
if (ccpw != null)
{
ccpw.close();
}
}
project.log( "Compiling " + source);
cmd.createArgument().setValue( source );
cmd.createArgument().setValue( "@cc.opt" );
}
}