+++ /dev/null
-/*\r
- * \r
- * Copyright 2001-2004 The Ant-Contrib project\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-package net.sf.antcontrib.cpptasks;\r
-import java.io.BufferedReader;\r
-import java.io.File;\r
-import java.io.FileReader;\r
-import java.util.Enumeration;\r
-import java.util.Vector;\r
-\r
-import net.sf.antcontrib.cpptasks.compiler.CommandLineCompiler;\r
-import net.sf.antcontrib.cpptasks.compiler.Compiler;\r
-import net.sf.antcontrib.cpptasks.compiler.Processor;\r
-import net.sf.antcontrib.cpptasks.gcc.GccCCompiler;\r
-import net.sf.antcontrib.cpptasks.types.CompilerArgument;\r
-import net.sf.antcontrib.cpptasks.types.ConditionalPath;\r
-import net.sf.antcontrib.cpptasks.types.DefineSet;\r
-import net.sf.antcontrib.cpptasks.types.IncludePath;\r
-import net.sf.antcontrib.cpptasks.types.SystemIncludePath;\r
-import net.sf.antcontrib.cpptasks.types.UndefineArgument;\r
-\r
-import org.apache.tools.ant.BuildException;\r
-import org.apache.tools.ant.types.EnumeratedAttribute;\r
-import org.apache.tools.ant.*;\r
-/**\r
- * A compiler definition. compiler elements may be placed either as children of\r
- * a cc element or the project element. A compiler element with an id attribute\r
- * may be referenced from compiler elements with refid or extends attributes.\r
- * \r
- * @author Adam Murdoch\r
- */\r
-public final class CompilerDef extends ProcessorDef {\r
- /**\r
- * Enumerated attribute with the values "none", "severe", "default",\r
- * "production", "diagnostic", and "failtask".\r
- */\r
- public static class WarningLevel extends EnumeratedAttribute {\r
- public String[] getValues() {\r
- return new String[]{"none", "severe", "default", "production",\r
- "diagnostic", "aserror"};\r
- }\r
- }\r
- /** The source file sets. */\r
- private final Vector defineSets = new Vector();\r
- private Boolean exceptions;\r
- private Boolean rtti;\r
- private final Vector includePaths = new Vector();\r
- private Boolean multithreaded;\r
- private final Vector precompileDefs = new Vector();\r
- private final Vector sysIncludePaths = new Vector();\r
- private OptimizationEnum optimization;\r
- private int warnings = -1;\r
- private Boolean defaultflag = new Boolean(true);\r
- public CompilerDef() {\r
- }\r
- /**\r
- * Adds a compiler command-line arg.\r
- */\r
- public void addConfiguredCompilerArg(CompilerArgument arg) {\r
- if (isReference()) {\r
- throw noChildrenAllowed();\r
- }\r
- addConfiguredProcessorArg(arg);\r
- }\r
- /**\r
- * Adds a compiler command-line arg.\r
- */\r
- public void addConfiguredCompilerParam(CompilerParam param) {\r
- if (isReference()) {\r
- throw noChildrenAllowed();\r
- }\r
- addConfiguredProcessorParam(param);\r
- }\r
- /**\r
- * Adds a defineset.\r
- */\r
- public void addConfiguredDefineset(DefineSet defs) {\r
- if (defs == null) {\r
- throw new NullPointerException("defs");\r
- }\r
- if (isReference()) {\r
- throw noChildrenAllowed();\r
- }\r
- defineSets.addElement(defs);\r
- }\r
- /**\r
- * Creates an include path.\r
- */\r
- public IncludePath createIncludePath() {\r
- Project p = getProject();\r
- if (p == null) {\r
- throw new java.lang.IllegalStateException("project must be set");\r
- }\r
- if (isReference()) {\r
- throw noChildrenAllowed();\r
- }\r
- IncludePath path = new IncludePath(p);\r
- includePaths.addElement(path);\r
- return path;\r
- }\r
- /**\r
- * Add a <includepath>or <sysincludepath> if specify the file \r
- * attribute\r
- * \r
- * @throws BuildException\r
- * if the specify file not exist\r
- */\r
- protected void loadFile(Vector activePath,File file) throws BuildException {\r
- FileReader fileReader;\r
- BufferedReader in;\r
- String str;\r
- if (! file.exists()){\r
- throw new BuildException("The file " + file + " is not existed");\r
- }\r
- try {\r
- fileReader = new FileReader(file);\r
- in = new BufferedReader(fileReader);\r
- while ( (str = in.readLine()) != null ){ \r
- if(str.trim() == ""){\r
- continue ;\r
- }\r
- str = getProject().replaceProperties(str);\r
- activePath.addElement(str.trim());\r
- }\r
- }\r
- catch(Exception e){\r
- throw new BuildException(e.getMessage());\r
- }\r
- }\r
- \r
- /**\r
- * Specifies precompilation prototype file and exclusions.\r
- * \r
- */\r
- public PrecompileDef createPrecompile() throws BuildException {\r
- Project p = getProject();\r
- if (isReference()) {\r
- throw noChildrenAllowed();\r
- }\r
- PrecompileDef precomp = new PrecompileDef();\r
- precomp.setProject(p);\r
- precompileDefs.addElement(precomp);\r
- return precomp;\r
- }\r
- /**\r
- * Creates a system include path. Locations and timestamps of files located\r
- * using the system include paths are not used in dependency analysis.\r
- * \r
- * \r
- * Standard include locations should not be specified. The compiler\r
- * adapters should recognized the settings from the appropriate environment\r
- * variables or configuration files.\r
- */\r
- public SystemIncludePath createSysIncludePath() {\r
- Project p = getProject();\r
- if (p == null) {\r
- throw new java.lang.IllegalStateException("project must be set");\r
- }\r
- if (isReference()) {\r
- throw noChildrenAllowed();\r
- }\r
- SystemIncludePath path = new SystemIncludePath(p);\r
- sysIncludePaths.addElement(path);\r
- return path;\r
- }\r
- public void execute() throws org.apache.tools.ant.BuildException {\r
- throw new org.apache.tools.ant.BuildException(\r
- "Not an actual task, but looks like one for documentation purposes");\r
- }\r
- public UndefineArgument[] getActiveDefines() {\r
- Project p = getProject();\r
- if (p == null) {\r
- throw new java.lang.IllegalStateException(\r
- "project must be set before this call");\r
- }\r
- if (isReference()) {\r
- return ((CompilerDef) getCheckedRef(CompilerDef.class,\r
- "CompilerDef")).getActiveDefines();\r
- }\r
- Vector actives = new Vector();\r
- for (int i = 0; i < defineSets.size(); i++) {\r
- DefineSet currentSet = (DefineSet) defineSets.elementAt(i);\r
- UndefineArgument[] defines = currentSet.getDefines();\r
- for (int j = 0; j < defines.length; j++) {\r
- if (defines[j].isActive(p)) {\r
- actives.addElement(defines[j]);\r
- }\r
- }\r
- }\r
- UndefineArgument[] retval = new UndefineArgument[actives.size()];\r
- actives.copyInto(retval);\r
- return retval;\r
- }\r
- /**\r
- * Returns the compiler-specific include path.\r
- */\r
- public String[] getActiveIncludePaths() {\r
- if (isReference()) {\r
- return ((CompilerDef) getCheckedRef(CompilerDef.class,\r
- "CompilerDef")).getActiveIncludePaths();\r
- }\r
- return getActivePaths(includePaths);\r
- }\r
- private String[] getActivePaths(Vector paths) {\r
- Project p = getProject();\r
- if (p == null) {\r
- throw new java.lang.IllegalStateException("project not set");\r
- }\r
- Vector activePaths = new Vector(paths.size());\r
- for (int i = 0; i < paths.size(); i++) {\r
- ConditionalPath path = (ConditionalPath) paths.elementAt(i);\r
- if (path.isActive(p)) {\r
- if (path.getFile() == null) {\r
- String[] pathEntries = path.list();\r
- for (int j = 0; j < pathEntries.length; j++) {\r
- activePaths.addElement(pathEntries[j]);\r
- }\r
- }\r
- else {\r
- loadFile(activePaths, path.getFile());\r
- }\r
- }\r
- }\r
- String[] pathNames = new String[activePaths.size()];\r
- activePaths.copyInto(pathNames);\r
- return pathNames;\r
- }\r
- public PrecompileDef getActivePrecompile(CompilerDef ccElement) {\r
- if (isReference()) {\r
- return ((CompilerDef) getCheckedRef(CompilerDef.class,\r
- "CompilerDef")).getActivePrecompile(ccElement);\r
- }\r
- PrecompileDef current = null;\r
- Enumeration enumPrecompilerDef = precompileDefs.elements();\r
- while (enumPrecompilerDef.hasMoreElements()) {\r
- current = (PrecompileDef) enumPrecompilerDef.nextElement();\r
- if (current.isActive()) {\r
- return current;\r
- }\r
- }\r
- CompilerDef extendedDef = (CompilerDef) getExtends();\r
- if (extendedDef != null) {\r
- current = extendedDef.getActivePrecompile(null);\r
- if (current != null) {\r
- return current;\r
- }\r
- }\r
- if (ccElement != null && getInherit()) {\r
- return ccElement.getActivePrecompile(null);\r
- }\r
- return null;\r
- }\r
- public String[] getActiveSysIncludePaths() {\r
- if (isReference()) {\r
- return ((CompilerDef) getCheckedRef(CompilerDef.class,\r
- "CompilerDef")).getActiveSysIncludePaths();\r
- }\r
- return getActivePaths(sysIncludePaths);\r
- }\r
- public final boolean getExceptions(CompilerDef[] defaultProviders, int index) {\r
- if (isReference()) {\r
- return ((CompilerDef) getCheckedRef(CompilerDef.class,\r
- "CompilerDef")).getExceptions(defaultProviders, index);\r
- }\r
- if (exceptions != null) {\r
- return exceptions.booleanValue();\r
- } else {\r
- if (defaultProviders != null && index < defaultProviders.length) {\r
- return defaultProviders[index].getExceptions(defaultProviders,\r
- index + 1);\r
- }\r
- }\r
- return false;\r
- }\r
- public final Boolean getRtti(CompilerDef[] defaultProviders, int index) {\r
- if (isReference()) {\r
- return ((CompilerDef) getCheckedRef(CompilerDef.class,\r
- "CompilerDef")).getRtti(defaultProviders, index);\r
- }\r
- if (rtti != null) {\r
- return rtti;\r
- } else {\r
- if (defaultProviders != null && index < defaultProviders.length) {\r
- return defaultProviders[index].getRtti(defaultProviders,\r
- index + 1);\r
- }\r
- }\r
- return null;\r
- }\r
- public final Boolean getDefaultflag(CompilerDef[] defaultProviders, int index) {\r
- if (isReference()) {\r
- return ((CompilerDef) getCheckedRef(CompilerDef.class,\r
- "CompilerDef")).getDefaultflag(defaultProviders, index);\r
- }\r
- return defaultflag;\r
- }\r
- public final OptimizationEnum getOptimization(CompilerDef[] defaultProviders, int index) {\r
- if (isReference()) {\r
- return ((CompilerDef) getCheckedRef(CompilerDef.class,\r
- "CompilerDef")).getOptimization(defaultProviders, index);\r
- }\r
- if (optimization != null) {\r
- return optimization;\r
- } else {\r
- if (defaultProviders != null && index < defaultProviders.length) {\r
- return defaultProviders[index].getOptimization(defaultProviders,\r
- index + 1);\r
- }\r
- }\r
- return null;\r
- }\r
- \r
- public boolean getMultithreaded(CompilerDef[] defaultProviders, int index) {\r
- if (isReference()) {\r
- return ((CompilerDef) getCheckedRef(CompilerDef.class,\r
- "CompilerDef")).getMultithreaded(defaultProviders, index);\r
- }\r
- if (multithreaded != null) {\r
- return multithreaded.booleanValue();\r
- } else {\r
- if (defaultProviders != null && index < defaultProviders.length) {\r
- return defaultProviders[index].getMultithreaded(\r
- defaultProviders, index + 1);\r
- }\r
- }\r
- return true;\r
- }\r
- public Processor getProcessor() {\r
- Processor processor = super.getProcessor();\r
- if (processor == null) {\r
- processor = GccCCompiler.getInstance();\r
- }\r
- if (getLibtool() && processor instanceof CommandLineCompiler) {\r
- CommandLineCompiler compiler = (CommandLineCompiler) processor;\r
- processor = compiler.getLibtoolCompiler();\r
- }\r
- return processor;\r
- }\r
- public int getWarnings(CompilerDef[] defaultProviders, int index) {\r
- if (isReference()) {\r
- return ((CompilerDef) getCheckedRef(CompilerDef.class,\r
- "CompilerDef")).getWarnings(defaultProviders, index);\r
- }\r
- if (warnings == -1) {\r
- if (defaultProviders != null && index < defaultProviders.length) {\r
- return defaultProviders[index].getWarnings(defaultProviders,\r
- index + 1);\r
- }\r
- }\r
- return warnings;\r
- }\r
- /**\r
- * Sets the default compiler adapter. Use the "name" attribute when the\r
- * compiler is a supported compiler.\r
- * \r
- * @param classname\r
- * fully qualified classname which implements CompilerAdapter\r
- */\r
- public void setClassname(String classname) throws BuildException {\r
- if (isReference()) {\r
- throw tooManyAttributes();\r
- }\r
- super.setClassname(classname);\r
- Processor proc = getProcessor();\r
- if (!(proc instanceof Compiler)) {\r
- throw new BuildException(classname + " does not implement Compiler");\r
- }\r
- }\r
- /**\r
- * Enables or disables exception support.\r
- * \r
- * @param exceptions\r
- * if true, exceptions are supported.\r
- * \r
- */\r
- public void setExceptions(boolean exceptions) {\r
- if (isReference()) {\r
- throw tooManyAttributes();\r
- }\r
- this.exceptions = booleanValueOf(exceptions);\r
- }\r
-\r
- /**\r
- * Enables or disables run-time type information.\r
- * \r
- * @param rtti\r
- * if true, run-time type information is supported.\r
- * \r
- */\r
- public void setRtti(boolean rtti) {\r
- if (isReference()) {\r
- throw tooManyAttributes();\r
- }\r
- this.rtti = booleanValueOf(rtti);\r
- }\r
- \r
- /**\r
- * Enables or disables generation of multithreaded code. Unless specified,\r
- * multithreaded code generation is enabled.\r
- * \r
- * @param multi\r
- * If true, generated code may be multithreaded.\r
- */\r
- public void setMultithreaded(boolean multithreaded) {\r
- if (isReference()) {\r
- throw tooManyAttributes();\r
- }\r
- this.multithreaded = booleanValueOf(multithreaded);\r
- }\r
- /**\r
- * Sets compiler type.\r
- * \r
- * \r
- * <table width="100%" border="1"> <thead>Supported compilers </thead>\r
- * <tr>\r
- * <td>gcc (default)</td>\r
- * <td>GCC C++ compiler</td>\r
- * </tr>\r
- * <tr>\r
- * <td>g++</td>\r
- * <td>GCC C++ compiler</td>\r
- * </tr>\r
- * <tr>\r
- * <td>c++</td>\r
- * <td>GCC C++ compiler</td>\r
- * </tr>\r
- * <tr>\r
- * <td>g77</td>\r
- * <td>GNU Fortran compiler</td>\r
- * </tr>\r
- * <tr>\r
- * <td>msvc</td>\r
- * <td>Microsoft Visual C++</td>\r
- * </tr>\r
- * <tr>\r
- * <td>bcc</td>\r
- * <td>Borland C++ Compiler</td>\r
- * </tr>\r
- * <tr>\r
- * <td>msrc</td>\r
- * <td>Microsoft Resource Compiler</td>\r
- * </tr>\r
- * <tr>\r
- * <td>brc</td>\r
- * <td>Borland Resource Compiler</td>\r
- * </tr>\r
- * <tr>\r
- * <td>df</td>\r
- * <td>Compaq Visual Fortran Compiler</td>\r
- * </tr>\r
- * <tr>\r
- * <td>midl</td>\r
- * <td>Microsoft MIDL Compiler</td>\r
- * </tr>\r
- * <tr>\r
- * <td>icl</td>\r
- * <td>Intel C++ compiler for Windows (IA-32)</td>\r
- * </tr>\r
- * <tr>\r
- * <td>ecl</td>\r
- * <td>Intel C++ compiler for Windows (IA-64)</td>\r
- * </tr>\r
- * <tr>\r
- * <td>icc</td>\r
- * <td>Intel C++ compiler for Linux (IA-32)</td>\r
- * </tr>\r
- * <tr>\r
- * <td>ecc</td>\r
- * <td>Intel C++ compiler for Linux (IA-64)</td>\r
- * </tr>\r
- * <tr>\r
- * <td>CC</td>\r
- * <td>Sun ONE C++ compiler</td>\r
- * </tr>\r
- * <tr>\r
- * <td>aCC</td>\r
- * <td>HP aC++ C++ Compiler</td>\r
- * </tr>\r
- * <tr>\r
- * <td>os390</td>\r
- * <td>OS390 C Compiler</td>\r
- * </tr>\r
- * <tr>\r
- * <td>os400</td>\r
- * <td>Icc Compiler</td>\r
- * </tr>\r
- * <tr>\r
- * <td>sunc89</td>\r
- * <td>Sun C89 C Compiler</td>\r
- * </tr>\r
- * <tr>\r
- * <td>xlC</td>\r
- * <td>VisualAge C Compiler</td>\r
- * </tr>\r
- * </table>\r
- * \r
- */\r
- public void setName(CompilerEnum name) throws BuildException {\r
- if (isReference()) {\r
- throw tooManyAttributes();\r
- }\r
- Compiler compiler = name.getCompiler();\r
- setProcessor(compiler);\r
- }\r
- protected void setProcessor(Processor proc) throws BuildException {\r
- try {\r
- super.setProcessor((Compiler) proc);\r
- } catch (ClassCastException ex) {\r
- throw new BuildException(ex);\r
- }\r
- }\r
- /**\r
- * Enumerated attribute with the values "none", "severe", "default",\r
- * "production", "diagnostic", and "failtask".\r
- */\r
- public void setWarnings(CompilerDef.WarningLevel level) {\r
- warnings = level.getIndex();\r
- }\r
- /**\r
- * Sets optimization level.\r
- * \r
- * @param value optimization level\r
- */\r
- public void setOptimize(OptimizationEnum value) {\r
- if (isReference()) {\r
- throw tooManyAttributes();\r
- }\r
- this.optimization = value;\r
- }\r
- /**\r
- * Enables or disables default flags.\r
- * \r
- * @param defaultflag\r
- * if true, default flags will add to command line.\r
- * \r
- */\r
- public void setDefaultflag(boolean defaultflag) {\r
- if (isReference()) {\r
- throw tooManyAttributes();\r
- }\r
- this.defaultflag = booleanValueOf(defaultflag);\r
- }\r
-}\r