+++ /dev/null
-/*\r
- * \r
- * Copyright 2002-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.File;\r
-import java.util.Hashtable;\r
-import java.util.Vector;\r
-\r
-import net.sf.antcontrib.cpptasks.compiler.LinkerConfiguration;\r
-import net.sf.antcontrib.cpptasks.compiler.ProcessorConfiguration;\r
-\r
-import org.apache.tools.ant.BuildException;\r
-/**\r
- * This class matches each visited file with an appropriate compiler\r
- * \r
- * @author Curt Arnold\r
- */\r
-public final class TargetMatcher implements FileVisitor {\r
- private LinkerConfiguration linker;\r
- private Vector objectFiles;\r
- private File outputDir;\r
- private ProcessorConfiguration[] processors;\r
- private final File sourceFiles[] = new File[1];\r
- private Hashtable targets;\r
- private CCTask task;\r
- public TargetMatcher(CCTask task, File outputDir,\r
- ProcessorConfiguration[] processors, LinkerConfiguration linker,\r
- Vector objectFiles, Hashtable targets) {\r
- this.task = task;\r
- this.outputDir = outputDir;\r
- this.processors = processors;\r
- this.targets = targets;\r
- this.linker = linker;\r
- this.objectFiles = objectFiles;\r
- }\r
- public void visit(File parentDir, String filename) throws BuildException {\r
- //\r
- // see if any processor wants to bid\r
- // on this one\r
- ProcessorConfiguration selectedCompiler = null;\r
- int bid = 0;\r
- if (processors != null) {\r
- for (int k = 0; k < processors.length; k++) {\r
- int newBid = processors[k].bid(filename);\r
- if (newBid > bid) {\r
- bid = newBid;\r
- selectedCompiler = processors[k];\r
- }\r
- }\r
- }\r
- //\r
- // no processor interested in file\r
- // log diagnostic message\r
- if (bid <= 0) {\r
- if (linker != null) {\r
- int linkerbid = linker.bid(filename);\r
- if (linkerbid > 0) {\r
- File objFile = new File(parentDir, filename);\r
- objectFiles.addElement(objFile);\r
- if (linkerbid == 1) {\r
- task.log("Unrecognized file type " + objFile.toString()\r
- + " will be passed to linker");\r
- }\r
- }\r
- }\r
- } else {\r
- //\r
- // get output file name\r
- //\r
- String outputFileName = selectedCompiler\r
- .getOutputFileName(filename);\r
- //\r
- // if there is some output for this task\r
- // (that is a source file and not an header file)\r
- //\r
- if (outputFileName != null) {\r
- sourceFiles[0] = new File(parentDir, filename);\r
- //\r
- // see if the same output file has already been registered\r
- //\r
- TargetInfo previousTarget = (TargetInfo) targets\r
- .get(outputFileName);\r
- if (previousTarget == null) {\r
- targets.put(outputFileName, new TargetInfo(\r
- selectedCompiler, sourceFiles, null, new File(\r
- outputDir, outputFileName),\r
- selectedCompiler.getRebuild()));\r
- } else {\r
- if (!previousTarget.getSources()[0].equals(sourceFiles[0])) {\r
- StringBuffer builder = new StringBuffer(\r
- "Output filename conflict: ");\r
- builder.append(outputFileName);\r
- builder.append(" would be produced from ");\r
- builder.append(previousTarget.getSources()[0]\r
- .toString());\r
- builder.append(" and ");\r
- builder.append(filename);\r
- throw new BuildException(builder.toString());\r
- }\r
- }\r
- }\r
- }\r
- }\r
-}\r