/*
* #%L
* Native ARchive plugin for Maven
* %%
* Copyright (C) 2002 - 2014 NAR Maven Plugin developers.
* %%
* 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.
* #L%
*/
package com.github.maven_nar.cpptasks.compaq;
import java.io.File;
import java.util.Vector;
import org.apache.tools.ant.types.Environment;
import com.github.maven_nar.cpptasks.CUtil;
import com.github.maven_nar.cpptasks.OptimizationEnum;
import com.github.maven_nar.cpptasks.compiler.CommandLineFortranCompiler;
import com.github.maven_nar.cpptasks.compiler.LinkType;
import com.github.maven_nar.cpptasks.compiler.Linker;
import com.github.maven_nar.cpptasks.compiler.Processor;
/**
* Adapter for the Compaq(r) Visual Fortran compiler.
*
* @author Curt Arnold
*/
public class CompaqVisualFortranCompiler extends CommandLineFortranCompiler {
private static final CompaqVisualFortranCompiler[] instance = new CompaqVisualFortranCompiler[] {
new CompaqVisualFortranCompiler(false, null)
};
public static CompaqVisualFortranCompiler getInstance() {
return instance[0];
}
private CompaqVisualFortranCompiler(final boolean newEnvironment, final Environment env) {
super("DF", null, new String[] {
".f90", ".for", ".f"
}, new String[] {
".i", ".i90", ".fpp", ".inc", ".bak", ".exe"
}, ".obj", false, null, newEnvironment, env);
}
@Override
protected void addImpliedArgs(final Vector<String> args, final boolean debug, final boolean multithreaded,
final boolean exceptions, final LinkType linkType, final Boolean rtti, final OptimizationEnum optimization) {
args.addElement("/nologo");
args.addElement("/compile_only");
if (debug) {
args.addElement("/debug:full");
args.addElement("/define:_DEBUG");
} else {
args.addElement("/debug:none");
args.addElement("/define:NDEBUG");
}
if (multithreaded) {
args.addElement("/threads");
args.addElement("/define:_MT");
} else {
args.addElement("/nothreads");
}
final boolean staticRuntime = linkType.isStaticRuntime();
if (staticRuntime) {
args.addElement("/libs:static");
} else {
args.addElement("/libs:dll");
}
if (linkType.isSharedLibrary()) {
args.addElement("/dll");
args.addElement("/define:_DLL");
}
}
@Override
public void addWarningSwitch(final Vector<String> args, final int level) {
switch (level) {
case 0:
args.addElement("/nowarn");
break;
case 1:
break;
case 2:
break;
case 3:
args.addElement("/warn:usage");
break;
case 4:
args.addElement("/warn:all");
break;
case 5:
args.addElement("/warn:errors");
break;
}
}
@Override
public Processor changeEnvironment(final boolean newEnvironment, final Environment env) {
if (newEnvironment || env != null) {
return new CompaqVisualFortranCompiler(newEnvironment, env);
}
return this;
}
@Override
protected void getDefineSwitch(final StringBuffer buf, final String define, final String value) {
buf.append("/define:");
buf.append(define);
if (value != null && value.length() > 0) {
buf.append('=');
buf.append(value);
}
}
@Override
protected File[] getEnvironmentIncludePath() {
return CUtil.getPathFromEnvironment("INCLUDE", ";");
}
@Override
protected String getIncludeDirSwitch(final String includeDir) {
// BEGINFREEHEP quotes seem to confuse the compiler
// if (includeDir.indexOf(' ') >= 0) {
// buf.append('"');
// buf.append(includeDir);
// buf.append('"');
// } else {
// }
// ENDFREEHEP
return "/include:" + includeDir;
}
@Override
public Linker getLinker(final LinkType type) {
return CompaqVisualFortranLinker.getInstance().getLinker(type);
}
@Override
public int getMaximumCommandLength() {
return 1024;
}
@Override
protected void getUndefineSwitch(final StringBuffer buf, final String define) {
buf.append("/undefine:");
buf.append(define);
}
}