summaryrefslogtreecommitdiff
path: root/Tools/Source/Cpptasks
diff options
context:
space:
mode:
authorbbahnsen <bbahnsen@6f19259b-4bc3-4df7-8a09-765794883524>2006-04-21 22:54:32 +0000
committerbbahnsen <bbahnsen@6f19259b-4bc3-4df7-8a09-765794883524>2006-04-21 22:54:32 +0000
commit878ddf1fc3540a715f63594ed22b6929e881afb4 (patch)
treec56c44dac138137b510e1fba7c3efe5e4d84bea2 /Tools/Source/Cpptasks
downloadedk2-878ddf1fc3540a715f63594ed22b6929e881afb4.zip
edk2-878ddf1fc3540a715f63594ed22b6929e881afb4.tar.gz
edk2-878ddf1fc3540a715f63594ed22b6929e881afb4.tar.bz2
Initial import.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@3 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'Tools/Source/Cpptasks')
-rw-r--r--Tools/Source/Cpptasks/build.xml55
-rw-r--r--Tools/Source/Cpptasks/cpptasks.mf7
-rw-r--r--Tools/Source/Cpptasks/cpptasks.tasks1
-rw-r--r--Tools/Source/Cpptasks/cpptasks.types9
-rw-r--r--Tools/Source/Cpptasks/javadoc.xml30
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/AboutCCTask.java49
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ArchEnum.java72
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/AslcompilerDef.java118
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/AslcompilerEnum.java54
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/AssemblerDef.java237
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/AssemblerEnum.java53
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CCTask.java1749
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CCTaskProgressMonitor.java56
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CPUEnum.java71
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CUtil.java461
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CompilerDef.java556
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CompilerEnum.java221
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CompilerParam.java33
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/DependencyInfo.java86
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/DependencyTable.java609
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/DistributerDef.java243
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/DistributerMap.java218
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/DistributerProtocolEnum.java50
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/FileVisitor.java27
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/LinkerDef.java549
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/LinkerEnum.java106
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/LinkerParam.java33
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/OSFamilyEnum.java59
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ObjectFileCollector.java42
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/OptimizationEnum.java82
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/OutputTypeEnum.java48
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/PrecompileDef.java215
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/PrecompileExceptDef.java80
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ProcessorDef.java714
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ProcessorEnumValue.java47
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ProcessorParam.java100
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/RuntimeType.java26
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/SourceHistory.java51
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/SubsystemEnum.java34
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/TargetDef.java228
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/TargetHistory.java58
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/TargetHistoryTable.java426
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/TargetInfo.java127
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/TargetMatcher.java117
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/VersionInfo.java550
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/arm/ADSCCompiler.java215
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/arm/ADSLibrarian.java160
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/arm/ADSLinker.java166
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/BorlandCCompiler.java135
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/BorlandCfgParser.java70
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/BorlandLibrarian.java200
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/BorlandLinker.java264
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/BorlandProcessor.java219
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/BorlandResourceCompiler.java130
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/CfgFilenameState.java46
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/ConsumeToSpaceOrNewLine.java30
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/QuoteBranchState.java35
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compaq/CompaqVisualFortranCompiler.java138
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compaq/CompaqVisualFortranLibrarian.java82
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compaq/CompaqVisualFortranLinker.java77
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AbstractAslcompiler.java75
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AbstractAssembler.java72
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AbstractCompiler.java205
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AbstractLinker.java85
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AbstractProcessor.java129
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/Aslcompiler.java23
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AslcompilerConfiguration.java29
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/Assembler.java23
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AssemblerConfiguration.java29
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CaptureStreamHandler.java122
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineAslcompiler.java226
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineAslcompilerConfiguration.java93
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineAssembler.java326
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineAssemblerConfiguration.java123
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineCCompiler.java42
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineCompiler.java435
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineCompilerConfiguration.java216
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineFortranCompiler.java42
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineLinker.java404
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineLinkerConfiguration.java119
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/Compiler.java24
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CompilerConfiguration.java64
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/LinkType.java134
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/Linker.java57
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/LinkerConfiguration.java31
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/PrecompilingCommandLineCCompiler.java43
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/PrecompilingCommandLineCompiler.java104
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/PrecompilingCompiler.java49
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/Processor.java73
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/ProcessorConfiguration.java52
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/ProgressMonitor.java31
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioAslcompiler.java70
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioAssembler.java84
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioCCompiler.java50
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioCompatibleCCompiler.java136
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioCompatibleLibrarian.java86
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioCompatibleLinker.java127
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioLibrarian.java36
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioLinker.java44
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioMIDLCompiler.java113
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioProcessor.java90
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioResourceCompiler.java117
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/AbstractArLibrarian.java106
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/AbstractLdLinker.java323
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GccAssembler.java76
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GccCCompiler.java243
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GccCompatibleCCompiler.java152
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GccLibrarian.java41
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GccLinker.java210
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GccProcessor.java299
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GppLinker.java203
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/LdLinker.java57
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/GccCCompiler.java273
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/GccLibrarian.java69
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/GccLinker.java234
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/GccProcessor.java288
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/GppLinker.java228
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/LdLinker.java83
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/sparc_sun_solaris2/GccCCompiler.java245
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/sparc_sun_solaris2/GccLibrarian.java43
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/sparc_sun_solaris2/GccLinker.java215
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/sparc_sun_solaris2/GccProcessor.java305
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/sparc_sun_solaris2/GppLinker.java210
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/sparc_sun_solaris2/LdLinker.java60
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/hp/aCCCompiler.java104
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/hp/aCCLinker.java100
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ibm/VisualAgeCCompiler.java111
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ibm/VisualAgeLinker.java75
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelLinux32CCompiler.java58
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelLinux32Linker.java55
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelLinux64CCompiler.java58
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelLinux64Linker.java55
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelProcessor.java51
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelWin32Aslcompiler.java66
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelWin32CCompiler.java53
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelWin32Librarian.java38
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelWin32Linker.java46
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelWin64CCompiler.java53
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/os390/OS390CCompiler.java157
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/os390/OS390Linker.java201
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/os390/OS390Processor.java71
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/os400/IccCompiler.java124
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/os400/IccLinker.java202
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/os400/IccProcessor.java71
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/AbstractParser.java67
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/AbstractParserState.java41
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/BranchState.java46
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/CParser.java78
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/CaseInsensitiveLetterState.java87
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/FilenameState.java41
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/FortranParser.java106
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/LetterState.java80
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/Parser.java28
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/PostE.java41
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/WhitespaceOrCaseInsensitiveLetterState.java83
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/WhitespaceOrLetterState.java75
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/sun/C89CCompiler.java109
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/sun/C89Linker.java125
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/sun/C89Processor.java116
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/sun/ForteCCCompiler.java119
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/sun/ForteCCLinker.java100
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ti/ClxxCCompiler.java192
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ti/ClxxLibrarian.java162
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ti/ClxxLinker.java181
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/AslcompilerArgument.java30
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/AssemblerArgument.java30
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/CommandLineArgument.java122
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/CompilerArgument.java28
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/ConditionalFileSet.java84
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/ConditionalPath.java92
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/DefineArgument.java38
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/DefineSet.java199
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/FlexLong.java59
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/IncludePath.java38
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/LibrarySet.java290
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/LibraryTypeEnum.java48
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/LinkerArgument.java28
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/SystemIncludePath.java45
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/SystemLibrarySet.java37
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/UndefineArgument.java153
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/userdefine/CommandLineUserDefine.java389
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/userdefine/UserDefineArgument.java31
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/userdefine/UserDefineCompiler.java219
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/userdefine/UserDefineDef.java497
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/userdefine/UserDefineElement.java23
-rw-r--r--Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/userdefine/UserDefineMapping.java186
186 files changed, 25412 insertions, 0 deletions
diff --git a/Tools/Source/Cpptasks/build.xml b/Tools/Source/Cpptasks/build.xml
new file mode 100644
index 0000000..cfed13b
--- /dev/null
+++ b/Tools/Source/Cpptasks/build.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0"?>
+<!--
+Copyright (c) 2006, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+-->
+<project name="CppTasks" default="all" basedir=".">
+ <taskdef resource="net/sf/antcontrib/antlib.xml"/>
+ <property environment="env"/>
+ <property name="workspace" value="${env.WORKSPACE}"/>
+ <property name="buildDir" value="build"/>
+ <property name="installLocation" value="${workspace}/Tools/Jars"/>
+ <target name="all" depends="install"/>
+ <target name="init">
+ <uptodate property="jar.newer" targetfile="${installLocation}/cpptasks.jar">
+ <srcfiles dir="net" includes="**"/>
+ </uptodate>
+ </target>
+ <target name="source" depends="init" unless="jar.newer">
+ <mkdir dir="${buildDir}"/>
+ <javac srcdir="net" destdir="${buildDir}">
+ <classpath>
+ <fileset dir="${workspace}/Tools/Jars">
+ <include name="*.jar"/>
+ </fileset>
+ </classpath>
+ </javac>
+ </target>
+ <target name="clean">
+ <delete dir="${buildDir}"/>
+ </target>
+ <target name="cleanall">
+ <delete dir="${buildDir}"/>
+ <if>
+ <available file="${installLocation}/cpptasks.jar"/>
+ <then>
+ <echo message="You must manually remove the file: ${installLocation}/cpptasks.jar"/>
+ <echo message="Java has already loaded the file, and cannot remove it within ANT!"/>
+ </then>
+ </if>
+ </target>
+ <target name="install" depends="source" unless="jar.newer">
+ <copy file="cpptasks.tasks" toDir="${buildDir}"/>
+ <copy file="cpptasks.types" toDir="${buildDir}"/>
+ <jar destfile="${installLocation}/cpptasks.jar"
+ basedir="${buildDir}"
+ includes="**"
+ />
+ </target>
+</project>
diff --git a/Tools/Source/Cpptasks/cpptasks.mf b/Tools/Source/Cpptasks/cpptasks.mf
new file mode 100644
index 0000000..a2bf638
--- /dev/null
+++ b/Tools/Source/Cpptasks/cpptasks.mf
@@ -0,0 +1,7 @@
+Manifest-Version: 2.0
+Main-Class: net.sf.antcontrib.cpptasks.AboutCCTask
+
+Name: CCTask
+Implementation-Vendor: Ant-Contrib project
+Implementation-Version: 1.0
+Implementation-Title: Compile and link tasks for Apache Ant
diff --git a/Tools/Source/Cpptasks/cpptasks.tasks b/Tools/Source/Cpptasks/cpptasks.tasks
new file mode 100644
index 0000000..f344583
--- /dev/null
+++ b/Tools/Source/Cpptasks/cpptasks.tasks
@@ -0,0 +1 @@
+cc=net.sf.antcontrib.cpptasks.CCTask
diff --git a/Tools/Source/Cpptasks/cpptasks.types b/Tools/Source/Cpptasks/cpptasks.types
new file mode 100644
index 0000000..65af6e6
--- /dev/null
+++ b/Tools/Source/Cpptasks/cpptasks.types
@@ -0,0 +1,9 @@
+defineset=net.sf.antcontrib.cpptasks.types.DefineSet
+compiler=net.sf.antcontrib.cpptasks.CompilerDef
+linker=net.sf.antcontrib.cpptasks.LinkerDef
+assembler=net.sf.antcontrib.cpptasks.AssemblerDef
+aslcompiler=net.sf.antcontrib.cpptasks.AslcompilerDef
+targetplatform=net.sf.antcontrib.cpptasks.TargetDef
+versioninfo=net.sf.antcontrib.cpptasks.VersionInfo
+distributer=net.sf.antcontrib.cpptasks.DistributerDef
+command=net.sf.antcontrib.cpptasks.userdefine.UserDefineDef \ No newline at end of file
diff --git a/Tools/Source/Cpptasks/javadoc.xml b/Tools/Source/Cpptasks/javadoc.xml
new file mode 100644
index 0000000..f0ca964
--- /dev/null
+++ b/Tools/Source/Cpptasks/javadoc.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (c) 2006, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+-->
+<project default="javadoc">
+<target name="javadoc">
+
+ <javadoc packagenames="net.sf.antcontrib.*"
+ useexternalfile="yes"
+ sourcepath="."
+ destdir="doc"
+ author="true"
+ version="true"
+ source="1.3"
+ locale="en_US"
+ windowtitle="cpptasks API"
+ doctitle="cpptasks">
+ <group title="CCTasks" packages="net.sf.antcontrib.cpptasks" />
+
+ <bottom>Copyright @2001-2005 Ant-Contrib project. All Rights Reserved.</bottom>
+</javadoc>
+</target>
+</project>
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/AboutCCTask.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/AboutCCTask.java
new file mode 100644
index 0000000..67757bb
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/AboutCCTask.java
@@ -0,0 +1,49 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+
+/**
+ * The equivalent of a Help About
+ * run "java -jar cpptasks.jar" to read
+ *
+ * @author Curt Arnold
+ */
+public class AboutCCTask {
+ /**
+ * display identification message and exit
+ *
+ * @param args ignored
+ */
+ public static void main(String args[]) {
+ System.out.println("CCTask: Compile and link task for Apache Ant 1.5 or later\n");
+ System.out.println("Copyright (c) 2002-2004, The Ant-Contrib project.\n");
+ System.out.println("http://sf.net/projects/ant-contrib\n");
+ System.out.println("Licensed under the Apache Software License 2.0");
+ System.out.println("available at http://www.apache.org/licenses/LICENSE-2.0\n");
+ System.out.println("This software is not a product of the");
+ System.out.println("of the Apache Software Foundation and no");
+ System.out.println("endorsement or promotion is implied.\n");
+ System.out.println("THIS SOFTWARE IS PROVIDED 'AS-IS', See");
+ System.out.println("http://www.apache.org/LICENSE for additional");
+ System.out.println("disclaimers.\n");
+ System.out.println("To use:");
+ System.out.println("\tPlace cpptasks.jar into lib directory of Ant 1.5 or later.");
+ System.out.println("\tAdd <taskdef resource=\"cpptasks.tasks\"/> and");
+ System.out.println("\t\t<typedef resource=\"cpptasks.types\"/> to build.xml");
+ System.out.println("Add <cc/>, <compiler/>, <linker/>, <assembler/> and <aslcompiler> elements.");
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ArchEnum.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ArchEnum.java
new file mode 100644
index 0000000..e219ad6
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ArchEnum.java
@@ -0,0 +1,72 @@
+/*
+ *
+ * Copyright 2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+
+import org.apache.tools.ant.types.EnumeratedAttribute;
+
+/**
+ * Enumeration of cpu architecture types.
+ *
+ * @author Curt Arnold
+ *
+ */
+public final class ArchEnum
+ extends EnumeratedAttribute {
+ /**
+ * Constructor.
+ *
+ * Set by default to "pentium3"
+ *
+ * @see java.lang.Object#Object()
+ */
+ public ArchEnum() {
+ setValue("pentium3");
+ }
+
+ /**
+ * Gets list of acceptable values.
+ *
+ * @see org.apache.tools.ant.types.EnumeratedAttribute#getValues()
+ */
+ public String[] getValues() {
+ /**
+ * Class initializer.
+ */
+ return new String[] {
+ "i386",
+ "i486",
+ "i586",
+ "i686",
+ "pentium",
+ "pentium-mmx",
+ "pentiumpro",
+ "pentium2",
+ "pentium3",
+ "pentium4",
+ "k6",
+ "k6-2",
+ "k6-3",
+ "athlon",
+ "athlon-tbird",
+ "athlon-4",
+ "athlon-xp",
+ "athlon-mp",
+ "winchip-c6",
+ "winchip2",
+ "c3"};
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/AslcompilerDef.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/AslcompilerDef.java
new file mode 100644
index 0000000..f69d3fd
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/AslcompilerDef.java
@@ -0,0 +1,118 @@
+/*
+ *
+ * Copyright 2001-2005 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+
+import net.sf.antcontrib.cpptasks.compiler.Aslcompiler;
+import net.sf.antcontrib.cpptasks.compiler.Processor;
+import net.sf.antcontrib.cpptasks.intel.IntelWin32Aslcompiler;
+import net.sf.antcontrib.cpptasks.types.AslcompilerArgument;
+
+import org.apache.tools.ant.BuildException;
+
+/**
+ * A asl compiler definition. asl compiler elements may be placed either as
+ * children of a cc element or the project element. A asl compiler element with
+ * an id attribute may be referenced from asl compiler elements with refid or
+ * extends attributes.
+ *
+ */
+public final class AslcompilerDef extends ProcessorDef {
+
+ private Boolean defaultflag = new Boolean(true);
+
+ public AslcompilerDef () {
+ }
+
+ /**
+ * Adds a asl compiler command-line arg.
+ */
+ public void addConfiguredAslcompilerArg(AslcompilerArgument arg) {
+ if (isReference()) {
+ throw noChildrenAllowed();
+ }
+ addConfiguredProcessorArg(arg);
+ }
+
+ public void execute() throws org.apache.tools.ant.BuildException {
+ throw new org.apache.tools.ant.BuildException(
+ "Not an actual task, but looks like one for documentation purposes");
+ }
+
+ public final Boolean getDefaultflag(AslcompilerDef[] defaultProviders,
+ int index) {
+ if (isReference()) {
+ return ((AslcompilerDef) getCheckedRef(AslcompilerDef.class,
+ "AslcompilerDef")).getDefaultflag(defaultProviders,
+ index);
+ }
+ return defaultflag;
+ }
+
+ public Processor getProcessor() {
+ Processor processor = super.getProcessor();
+ if (processor == null) {
+ processor = IntelWin32Aslcompiler.getInstance();
+ }
+ return processor;
+ }
+
+ /**
+ * Sets r type.
+ *
+ * <table width="100%" border="1"> <thead>Supported ASL Compilers</thead>
+ * <tr>
+ * <td>iasl (default)</td>
+ * <td>Intel ACPI Source Language</td>
+ * </tr>
+ * <tr>
+ * <td>asl</td>
+ * <td>Microsoft ACPI Source Language</td>
+ * </tr>
+ * </table>
+ *
+ */
+ public void setName(AslcompilerEnum name) throws BuildException {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ Aslcompiler aslcompiler = name.getAslcompiler();
+ setProcessor(aslcompiler);
+ }
+
+ protected void setProcessor(Processor proc) throws BuildException {
+ try {
+ super.setProcessor((Aslcompiler) proc);
+ } catch (ClassCastException ex) {
+ throw new BuildException(ex);
+ }
+ }
+
+ /**
+ * Enables or disables default flags.
+ *
+ * @param defaultflag
+ * if true, default flags will add to command line.
+ *
+ */
+ public void setDefaultflag(boolean defaultflag) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ this.defaultflag = booleanValueOf(defaultflag);
+ }
+
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/AslcompilerEnum.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/AslcompilerEnum.java
new file mode 100644
index 0000000..fa98069
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/AslcompilerEnum.java
@@ -0,0 +1,54 @@
+/*
+ *
+ * Copyright 2001-2005 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+
+import net.sf.antcontrib.cpptasks.compiler.Aslcompiler;
+import net.sf.antcontrib.cpptasks.devstudio.DevStudioAslcompiler;
+import net.sf.antcontrib.cpptasks.intel.IntelWin32Aslcompiler;
+
+import org.apache.tools.ant.types.EnumeratedAttribute;
+
+/**
+ * Enumeration of supported ASL Compilers
+ *
+ * <table width="100%" border="1"> <thead>Supported ASL Compilers </thead>
+ * <tr>
+ * <td>iasl (default)</td>
+ * <td>Intel ACPI Source Language</td>
+ * </tr>
+ * <tr>
+ * <td>asl</td>
+ * <td>Microsoft ACPI Source Language</td>
+ * </tr>
+ * </table>
+ *
+ */
+public class AslcompilerEnum extends EnumeratedAttribute {
+ private final static ProcessorEnumValue[] aslcompiler = new ProcessorEnumValue[] {
+ new ProcessorEnumValue("iasl", IntelWin32Aslcompiler
+ .getInstance()),
+ new ProcessorEnumValue("asl", DevStudioAslcompiler
+ .getInstance()), };
+
+ public Aslcompiler getAslcompiler() {
+ return (Aslcompiler) aslcompiler[getIndex()].getProcessor();
+ }
+
+ public String[] getValues() {
+ return ProcessorEnumValue.getValues(aslcompiler);
+ }
+} \ No newline at end of file
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/AssemblerDef.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/AssemblerDef.java
new file mode 100644
index 0000000..aeae215
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/AssemblerDef.java
@@ -0,0 +1,237 @@
+/*
+ *
+ * Copyright 2001-2005 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.compiler.Assembler;
+import net.sf.antcontrib.cpptasks.compiler.Processor;
+import net.sf.antcontrib.cpptasks.gcc.GccAssembler;
+import net.sf.antcontrib.cpptasks.types.AssemblerArgument;
+import net.sf.antcontrib.cpptasks.types.ConditionalPath;
+import net.sf.antcontrib.cpptasks.types.IncludePath;
+import net.sf.antcontrib.cpptasks.types.SystemIncludePath;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+
+/**
+ * A assembler definition. Assembler elements may be placed either as children
+ * of a cc element or the project element. A assembler element with an id
+ * attribute may be referenced from assembler elements with refid or extends
+ * attributes.
+ *
+ */
+public final class AssemblerDef extends ProcessorDef {
+
+ private final Vector includePaths = new Vector();
+
+ private final Vector sysIncludePaths = new Vector();
+
+ private Boolean defaultflag = new Boolean(true);
+
+ public AssemblerDef () {
+ }
+
+ /**
+ * Adds a assembler command-line arg.
+ */
+ public void addConfiguredAssemblerArg(AssemblerArgument arg) {
+ if (isReference()) {
+ throw noChildrenAllowed();
+ }
+ addConfiguredProcessorArg(arg);
+ }
+
+ /**
+ * Creates an include path.
+ */
+ public IncludePath createIncludePath() {
+ Project p = getProject();
+ if (p == null) {
+ throw new java.lang.IllegalStateException("project must be set");
+ }
+ if (isReference()) {
+ throw noChildrenAllowed();
+ }
+ IncludePath path = new IncludePath(p);
+ includePaths.addElement(path);
+ return path;
+ }
+
+ /**
+ * Creates an include path.
+ */
+ public SystemIncludePath createSysIncludePath() {
+ Project p = getProject();
+ if (p == null) {
+ throw new java.lang.IllegalStateException("project must be set");
+ }
+ if (isReference()) {
+ throw noChildrenAllowed();
+ }
+ SystemIncludePath path = new SystemIncludePath(p);
+ sysIncludePaths.addElement(path);
+ return path;
+ }
+
+ /**
+ * Add a <includepath>or <sysincludepath> if specify the file attribute
+ *
+ * @throws BuildException
+ * if the specify file not exist
+ */
+ protected void loadFile(Vector activePath, File file) throws BuildException {
+ FileReader fileReader;
+ BufferedReader in;
+ String str;
+ if (!file.exists()) {
+ throw new BuildException("The file " + file + " is not existed");
+ }
+ try {
+ fileReader = new FileReader(file);
+ in = new BufferedReader(fileReader);
+ while ((str = in.readLine()) != null) {
+ if (str.trim() == "") {
+ continue;
+ }
+ str = getProject().replaceProperties(str);
+ activePath.addElement(str.trim());
+ }
+ } catch (Exception e) {
+ throw new BuildException(e.getMessage());
+ }
+ }
+
+ public void execute() throws org.apache.tools.ant.BuildException {
+ throw new org.apache.tools.ant.BuildException(
+ "Not an actual task, but looks like one for documentation purposes");
+ }
+
+ /**
+ * Returns the assembler-specific include path.
+ */
+ public String[] getActiveIncludePaths() {
+ if (isReference()) {
+ return ((AssemblerDef) getCheckedRef(AssemblerDef.class,
+ "AssemblerDef")).getActiveIncludePaths();
+ }
+ return getActivePaths(includePaths);
+ }
+
+ /**
+ * Returns the assembler-specific sysinclude path.
+ */
+ public String[] getActiveSysIncludePaths() {
+ if (isReference()) {
+ return ((AssemblerDef) getCheckedRef(AssemblerDef.class,
+ "AssemblerDef")).getActiveSysIncludePaths();
+ }
+ return getActivePaths(sysIncludePaths);
+ }
+
+ private String[] getActivePaths(Vector paths) {
+ Project p = getProject();
+ if (p == null) {
+ throw new java.lang.IllegalStateException("project not set");
+ }
+ Vector activePaths = new Vector(paths.size());
+ for (int i = 0; i < paths.size(); i++) {
+ ConditionalPath path = (ConditionalPath) paths.elementAt(i);
+ if (path.isActive(p)) {
+ if (path.getFile() == null) {
+ String[] pathEntries = path.list();
+ for (int j = 0; j < pathEntries.length; j++) {
+ activePaths.addElement(pathEntries[j]);
+ }
+ } else {
+ loadFile(activePaths, path.getFile());
+ }
+ }
+ }
+ String[] pathNames = new String[activePaths.size()];
+ activePaths.copyInto(pathNames);
+ return pathNames;
+ }
+
+ public final Boolean getDefaultflag(AssemblerDef[] defaultProviders,
+ int index) {
+ if (isReference()) {
+ return ((AssemblerDef) getCheckedRef(AssemblerDef.class,
+ "AssemblerDef")).getDefaultflag(defaultProviders,
+ index);
+ }
+ return defaultflag;
+ }
+
+ public Processor getProcessor() {
+ Processor processor = super.getProcessor();
+ if (processor == null) {
+ processor = GccAssembler.getInstance();
+ }
+ return processor;
+ }
+
+ /**
+ * Sets r type.
+ *
+ * <table width="100%" border="1"> <thead>Supported assemblers</thead>
+ * <tr>
+ * <td>gcc (default)</td>
+ * <td>GAS assembler</td>
+ * </tr>
+ * <tr>
+ * <td>masm</td>
+ * <td>MASM assembler</td>
+ * </tr>
+ * </table>
+ *
+ */
+ public void setName(AssemblerEnum name) throws BuildException {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ Assembler assembler = name.getAssembler();
+ setProcessor(assembler);
+ }
+
+ protected void setProcessor(Processor proc) throws BuildException {
+ try {
+ super.setProcessor((Assembler) proc);
+ } catch (ClassCastException ex) {
+ throw new BuildException(ex);
+ }
+ }
+
+ /**
+ * Enables or disables default flags.
+ *
+ * @param defaultflag
+ * if true, default flags will add to command line.
+ *
+ */
+ public void setDefaultflag(boolean defaultflag) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ this.defaultflag = booleanValueOf(defaultflag);
+ }
+
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/AssemblerEnum.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/AssemblerEnum.java
new file mode 100644
index 0000000..9abf9f4
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/AssemblerEnum.java
@@ -0,0 +1,53 @@
+/*
+ *
+ * Copyright 2001-2005 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+
+import net.sf.antcontrib.cpptasks.compiler.Assembler;
+import net.sf.antcontrib.cpptasks.devstudio.DevStudioAssembler;
+import net.sf.antcontrib.cpptasks.gcc.GccAssembler;
+
+import org.apache.tools.ant.types.EnumeratedAttribute;
+
+/**
+ * Enumeration of supported assemblers
+ *
+ * <table width="100%" border="1"> <thead>Supported assemblers </thead>
+ * <tr>
+ * <td>gas (default)</td>
+ * <td>GAS assembler</td>
+ * </tr>
+ * <tr>
+ * <td>masm</td>
+ * <td>MASM assembler</td>
+ * </tr>
+ * </table>
+ *
+ */
+public class AssemblerEnum extends EnumeratedAttribute {
+ private final static ProcessorEnumValue[] assemblers = new ProcessorEnumValue[] {
+ new ProcessorEnumValue("gas", GccAssembler.getInstance()),
+ new ProcessorEnumValue("masm", DevStudioAssembler
+ .getInstance()), };
+
+ public Assembler getAssembler() {
+ return (Assembler) assemblers[getIndex()].getProcessor();
+ }
+
+ public String[] getValues() {
+ return ProcessorEnumValue.getValues(assemblers);
+ }
+} \ No newline at end of file
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CCTask.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CCTask.java
new file mode 100644
index 0000000..d044df1
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CCTask.java
@@ -0,0 +1,1749 @@
+/*
+ *
+ * Copyright 2001-2005 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.compiler.AslcompilerConfiguration;
+import net.sf.antcontrib.cpptasks.compiler.AssemblerConfiguration;
+import net.sf.antcontrib.cpptasks.compiler.CompilerConfiguration;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.compiler.LinkerConfiguration;
+import net.sf.antcontrib.cpptasks.compiler.Processor;
+import net.sf.antcontrib.cpptasks.compiler.ProcessorConfiguration;
+import net.sf.antcontrib.cpptasks.types.AslcompilerArgument;
+import net.sf.antcontrib.cpptasks.types.AssemblerArgument;
+import net.sf.antcontrib.cpptasks.types.CompilerArgument;
+import net.sf.antcontrib.cpptasks.types.ConditionalFileSet;
+import net.sf.antcontrib.cpptasks.types.DefineSet;
+import net.sf.antcontrib.cpptasks.types.IncludePath;
+import net.sf.antcontrib.cpptasks.types.LibrarySet;
+import net.sf.antcontrib.cpptasks.types.LinkerArgument;
+import net.sf.antcontrib.cpptasks.types.SystemIncludePath;
+import net.sf.antcontrib.cpptasks.types.SystemLibrarySet;
+import net.sf.antcontrib.cpptasks.userdefine.UserDefineCompiler;
+import net.sf.antcontrib.cpptasks.userdefine.UserDefineDef;
+import net.sf.antcontrib.cpptasks.VersionInfo;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.types.Environment;
+
+/**
+ * Compile, link, assembler and asl compile task.
+ *
+ * <p>
+ * This task can compile various source languages and produce executables,
+ * shared libraries (aka DLL's) and static libraries. Compiler adaptors are
+ * currently available for several C/C++ compilers, FORTRAN, MIDL and Windows
+ * Resource files. Assembler adaptors are currently available for MASM and GAS.
+ * And aslcompiler support to ASL and IASL command.
+ * </p>
+ *
+ *
+ * <p>
+ * Copyright (c) 2001-2005, The Ant-Contrib project.
+ * </p>
+ *
+ * <p>
+ * Licensed under the Apache Software License 2.0,
+ * http://www.apache.org/licenses/LICENSE-2.0.
+ * </p>
+ *
+ * <p>
+ * For use with Apache Ant 1.5 or later. This software is not a product of the
+ * of the Apache Software Foundation and no endorsement is implied.
+ * </p>
+ *
+ * <p>
+ * THIS SOFTWARE IS PROVIDED 'AS-IS', See
+ * http://www.apache.org/licenses/LICENSE-2.0 for additional disclaimers.
+ * </p>
+ *
+ * To use:
+ * <ol>
+ * <li>Place cpptasks.jar into the lib directory of Ant 1.5 or later.</li>
+ * <li>Add &lt;taskdef resource="cpptasks.tasks"/&gt; and &lt;typedef
+ * resource="cpptasks.types"/&gt; to build.xml.</li>
+ * <li>Add &lt;cc/&gt;, &lt;compiler/&gt; &lt;linker/&gt; &lt;assembler/&gt;
+ * and &lt;aslcompiler/&gt elements to project.</li>
+ * <li>Set path and environment variables to be able to run compiler from
+ * command line.</li>
+ * <li>Build project.</li>
+ * </ol>
+ *
+ * @author Adam Murdoch
+ * @author Curt Arnold
+ */
+public class CCTask extends Task {
+ private class SystemLibraryCollector implements FileVisitor {
+ private Hashtable libraries;
+
+ private Linker linker;
+
+ public SystemLibraryCollector (Linker linker, Hashtable libraries) {
+ this.linker = linker;
+ this.libraries = libraries;
+ }
+
+ public void visit(File basedir, String filename) {
+ if (linker.bid(filename) > 0) {
+ File libfile = new File(basedir, filename);
+ String key = linker.getLibraryKey(libfile);
+ libraries.put(key, libfile);
+ }
+ }
+ }
+
+ private static final ProcessorConfiguration[] EMPTY_CONFIG_ARRAY = new ProcessorConfiguration[0];
+
+ /**
+ * Builds a Hashtable to targets needing to be rebuilt keyed by compiler
+ * configuration
+ */
+ public static Hashtable getTargetsToBuildByConfiguration(Hashtable targets) {
+ Hashtable targetsByConfig = new Hashtable();
+ Enumeration targetEnum = targets.elements();
+ while (targetEnum.hasMoreElements()) {
+ TargetInfo target = (TargetInfo) targetEnum.nextElement();
+ if (target.getRebuild()) {
+ Vector targetsForSameConfig = (Vector) targetsByConfig
+ .get(target.getConfiguration());
+ if (targetsForSameConfig != null) {
+ targetsForSameConfig.addElement(target);
+ } else {
+ targetsForSameConfig = new Vector();
+ targetsForSameConfig.addElement(target);
+ targetsByConfig.put(target.getConfiguration(),
+ targetsForSameConfig);
+ }
+ }
+ }
+ return targetsByConfig;
+ }
+
+ /** The userdefine definitions. */
+ private Vector _userdefines = new Vector();
+
+ /** The compiler definitions. */
+ private Vector _compilers = new Vector();
+
+ /** The output file type. */
+ // private LinkType _linkType = LinkType.EXECUTABLE;
+ /** The library sets. */
+ private Vector _libsets = new Vector();
+
+ /** The aslcompiler definitions. */
+ private Vector _aslcompiler = new Vector();
+
+ /** The assembler definitions. */
+ private Vector _assemblers = new Vector();
+
+ /** The linker definitions. */
+ private Vector _linkers = new Vector();
+
+ /** The object directory. */
+ private File _objDir;
+
+ /** The output file. */
+ private File _outfile;
+
+ private boolean userdefine = false;
+ private String arch;
+ private String os;
+ private String vendor;
+
+ /** the flag for assembler */
+ private boolean assembler = true;
+
+ /** the flag for aslcompiler */
+ private boolean aslcompiler = true;
+
+ /** The linker definitions. */
+ private final Vector targetPlatforms = new Vector();
+
+ /** The distributer definitions. */
+ private Vector distributers = new Vector();
+
+ /**
+ * If true, stop build on compile failure.
+ */
+ protected boolean failOnError = true;
+
+ /**
+ * Content that appears in <cc>and also in <compiler>are maintained by a
+ * captive CompilerDef instance
+ */
+ private final CompilerDef compilerDef = new CompilerDef();
+
+ /**
+ * Content that appears in <cc>and also in <aslcompiler>are maintained by a
+ * captive AslcompilerDef instance
+ */
+ private final AslcompilerDef aslcompilerDef = new AslcompilerDef();
+
+ /** The OS390 dataset to build to object to */
+ private String dataset;
+
+ /**
+ *
+ * Depth of dependency checking
+ *
+ * Values < 0 indicate full dependency checking Values >= 0 indicate partial
+ * dependency checking and for superficial compilation checks. Will throw
+ * BuildException before attempting link
+ */
+ private int dependencyDepth = -1;
+
+ /**
+ * Content that appears in <cc>and also in <assembler>are maintained by a
+ * captive AssemblerDef instance
+ */
+ private final AssemblerDef assemblerDef = new AssemblerDef();
+
+ /**
+ * Content that appears in <cc>and also in <linker>are maintained by a
+ * captive CompilerDef instance
+ */
+ private final LinkerDef linkerDef = new LinkerDef();
+
+ /**
+ * contains the subsystem, output type and
+ *
+ */
+ private final LinkType linkType = new LinkType();
+
+ /**
+ * The property name which will be set with the physical filename of the
+ * file that is generated by the linker
+ */
+ private String outputFileProperty;
+
+ /**
+ * if relentless = true, compilations should attempt to compile as many
+ * files as possible before throwing a BuildException
+ */
+ private boolean relentless;
+
+ public CCTask () {
+ }
+
+
+ public void addConfiguredCommand(UserDefineDef userdefineDef) {
+ if (userdefineDef == null) {
+ throw new NullPointerException("UserDefineDef");
+ }
+ userdefineDef.setProject(getProject());
+ _userdefines.addElement(userdefineDef);
+ }
+ /**
+ * Adds a asl compiler definition or reference.
+ *
+ * @param Aslcompiler
+ * aslcompiler
+ * @throws NullPointerException
+ * if aslcompiler is null
+ */
+ public void addConfiguredAslcompiler(AslcompilerDef aslcompier) {
+ if (aslcompier == null) {
+ throw new NullPointerException("aslcompier");
+ }
+ aslcompier.setProject(getProject());
+ _aslcompiler.addElement(aslcompier);
+ }
+
+ /**
+ * Adds a asl command-line arg. Argument will be inherited by all nested
+ * aslcompiler elements that do not have inherit="false".
+ *
+ */
+ public void addConfiguredAslcompilerArg(AslcompilerArgument arg) {
+ aslcompilerDef.addConfiguredAslcompilerArg(arg);
+ }
+
+ /**
+ * Adds a assembler definition or reference.
+ *
+ * @param assembler
+ * assemblera
+ * @throws NullPointerException
+ * if assembler is null
+ */
+ public void addConfiguredAssembler(AssemblerDef assembler) {
+ if (assembler == null) {
+ throw new NullPointerException("assembler");
+ }
+ assembler.setProject(getProject());
+ _assemblers.addElement(assembler);
+ }
+
+ /**
+ * Adds a assembler command-line arg. Argument will be inherited by all
+ * nested assembler elements that do not have inherit="false".
+ *
+ */
+ public void addConfiguredAssemblerArg(AssemblerArgument arg) {
+ assemblerDef.addConfiguredAssemblerArg(arg);
+ }
+
+ /**
+ * Adds a compiler definition or reference.
+ *
+ * @param compiler
+ * compiler
+ * @throws NullPointerException
+ * if compiler is null
+ */
+ public void addConfiguredCompiler(CompilerDef compiler) {
+ if (compiler == null) {
+ throw new NullPointerException("compiler");
+ }
+ compiler.setProject(getProject());
+ _compilers.addElement(compiler);
+ }
+
+ /**
+ * Adds a compiler command-line arg. Argument will be inherited by all
+ * nested compiler elements that do not have inherit="false".
+ *
+ */
+ public void addConfiguredCompilerArg(CompilerArgument arg) {
+ compilerDef.addConfiguredCompilerArg(arg);
+ }
+
+ /**
+ * Adds a defineset. Will be inherited by all compiler elements that do not
+ * have inherit="false".
+ *
+ * @param defs
+ * Define set
+ */
+ public void addConfiguredDefineset(DefineSet defs) {
+ compilerDef.addConfiguredDefineset(defs);
+ }
+
+ /**
+ * Adds a linker definition. The first linker that is not disqualified by
+ * its "if" and "unless" attributes will perform the link. If no child
+ * linker element is active, the linker implied by the cc elements name or
+ * classname attribute will be used.
+ *
+ * @param linker
+ * linker
+ * @throws NullPointerException
+ * if linker is null
+ */
+ public void addConfiguredLinker(LinkerDef linker) {
+ if (linker == null) {
+ throw new NullPointerException("linker");
+ }
+ linker.setProject(getProject());
+ _linkers.addElement(linker);
+ }
+
+ /**
+ * Adds a linker command-line arg. Argument will be inherited by all nested
+ * linker elements that do not have inherit="false".
+ */
+ public void addConfiguredLinkerArg(LinkerArgument arg) {
+ linkerDef.addConfiguredLinkerArg(arg);
+ }
+
+ /**
+ * Add an environment variable to the launched process.
+ */
+ public void addEnv(Environment.Variable var) {
+ compilerDef.addEnv(var);
+ linkerDef.addEnv(var);
+ assemblerDef.addEnv(var);
+ aslcompilerDef.addEnv(var);
+ }
+
+ /**
+ * Adds a source file set.
+ *
+ * Files in these filesets will be auctioned to the available compiler
+ * configurations, with the default compiler implied by the cc element
+ * bidding last. If no compiler is interested in the file, it will be passed
+ * to the linker.
+ *
+ * To have a file be processed by a particular compiler configuration, add a
+ * fileset to the corresponding compiler element.
+ */
+ public void addFileset(ConditionalFileSet srcSet) {
+ compilerDef.addFileset(srcSet);
+ }
+
+ /**
+ * Adds a library set.
+ *
+ * Library sets will be inherited by all linker elements that do not have
+ * inherit="false".
+ *
+ * @param libset
+ * library set
+ * @throws NullPointerException
+ * if libset is null.
+ */
+ public void addLibset(LibrarySet libset) {
+ if (libset == null) {
+ throw new NullPointerException("libset");
+ }
+ linkerDef.addLibset(libset);
+ }
+
+ /**
+ * Adds a system library set. Timestamps and locations of system library
+ * sets are not used in dependency analysis.
+ *
+ * Essential libraries (such as C Runtime libraries) should not be specified
+ * since the task will attempt to identify the correct libraries based on
+ * the multithread, debug and runtime attributes.
+ *
+ * System library sets will be inherited by all linker elements that do not
+ * have inherit="false".
+ *
+ * @param libset
+ * library set
+ * @throws NullPointerException
+ * if libset is null.
+ */
+ public void addSyslibset(SystemLibrarySet libset) {
+ if (libset == null) {
+ throw new NullPointerException("libset");
+ }
+ linkerDef.addSyslibset(libset);
+ }
+
+ /**
+ * Checks all targets that are not forced to be rebuilt or are missing
+ * object files to be checked for modified include files
+ *
+ * @returns total number of targets to be rebuilt
+ *
+ */
+ protected int checkForChangedIncludeFiles(Hashtable targets) {
+ int potentialTargets = 0;
+ int definiteTargets = 0;
+ Enumeration targetEnum = targets.elements();
+ while (targetEnum.hasMoreElements()) {
+ TargetInfo target = (TargetInfo) targetEnum.nextElement();
+ if (!target.getRebuild()) {
+ potentialTargets++;
+ } else {
+ definiteTargets++;
+ }
+ }
+ //
+ // If there were remaining targets that
+ // might be out of date
+ //
+ if (potentialTargets > 0) {
+ log("Starting dependency analysis for "
+ + Integer.toString(potentialTargets) + " files.");
+ DependencyTable dependencyTable = new DependencyTable(_objDir);
+ try {
+ dependencyTable.load();
+ } catch (Exception ex) {
+ log("Problem reading dependencies.xml: " + ex.toString());
+ }
+ targetEnum = targets.elements();
+ while (targetEnum.hasMoreElements()) {
+ TargetInfo target = (TargetInfo) targetEnum.nextElement();
+ if (!target.getRebuild()) {
+ if (dependencyTable.needsRebuild(this, target,
+ dependencyDepth)) {
+ target.mustRebuild();
+ }
+ }
+ }
+ dependencyTable.commit(this);
+ }
+ //
+ // count files being rebuilt now
+ //
+ int currentTargets = 0;
+ targetEnum = targets.elements();
+ while (targetEnum.hasMoreElements()) {
+ TargetInfo target = (TargetInfo) targetEnum.nextElement();
+ if (target.getRebuild()) {
+ currentTargets++;
+ }
+ }
+ if (potentialTargets > 0) {
+ log(Integer.toString(potentialTargets - currentTargets
+ + definiteTargets)
+ + " files are up to date.");
+ log(Integer.toString(currentTargets - definiteTargets)
+ + " files to be recompiled from dependency analysis.");
+ }
+ log(Integer.toString(currentTargets) + " total files to be compiled.");
+ return currentTargets;
+ }
+
+ protected LinkerConfiguration collectExplicitObjectFiles(
+ Vector objectFiles, Vector sysObjectFiles) {
+ //
+ // find the first eligible linker
+ //
+ //
+ ProcessorConfiguration linkerConfig = null;
+ LinkerDef selectedLinkerDef = null;
+ Linker selectedLinker = null;
+ Hashtable sysLibraries = new Hashtable();
+ TargetDef targetPlatform = getTargetPlatform();
+ FileVisitor objCollector = null;
+ FileVisitor sysLibraryCollector = null;
+ for (int i = 0; i < _linkers.size(); i++) {
+ LinkerDef currentLinkerDef = (LinkerDef) _linkers.elementAt(i);
+ if (currentLinkerDef.isActive()) {
+ selectedLinkerDef = currentLinkerDef;
+ selectedLinker = currentLinkerDef.getProcessor().getLinker(
+ linkType);
+ //
+ // skip the linker if it doesn't know how to
+ // produce the specified link type
+ if (selectedLinker != null) {
+ linkerConfig = currentLinkerDef.createConfiguration(this,
+ linkType, linkerDef, targetPlatform);
+ if (linkerConfig != null) {
+ //
+ // create collectors for object files
+ // and system libraries
+ objCollector = new ObjectFileCollector(selectedLinker,
+ objectFiles);
+ sysLibraryCollector = new SystemLibraryCollector(
+ selectedLinker, sysLibraries);
+ //
+ // if the <linker> has embedded <fileset>'s
+ // (such as linker specific libraries)
+ // add them as object files.
+ //
+ if (currentLinkerDef.hasFileSets()) {
+ currentLinkerDef.visitFiles(objCollector);
+ }
+ //
+ // user libraries are just a specialized form
+ // of an object fileset
+ selectedLinkerDef.visitUserLibraries(selectedLinker,
+ objCollector);
+ }
+ break;
+ }
+ }
+ }
+ if (linkerConfig == null) {
+ linkerConfig = linkerDef.createConfiguration(this, linkType, null,
+ targetPlatform);
+ selectedLinker = (Linker) linkerDef.getProcessor().getLinker(
+ linkType);
+ objCollector = new ObjectFileCollector(selectedLinker, objectFiles);
+ sysLibraryCollector = new SystemLibraryCollector(selectedLinker,
+ sysLibraries);
+ }
+ //
+ // unless there was a <linker> element that
+ // explicitly did not inherit files from
+ // containing <cc> element
+ if (selectedLinkerDef == null || selectedLinkerDef.getInherit()) {
+ linkerDef.visitUserLibraries(selectedLinker, objCollector);
+ linkerDef.visitSystemLibraries(selectedLinker, sysLibraryCollector);
+ }
+ //
+ // if there was a <syslibset> in a nested <linker>
+ // evaluate it last so it takes priority over
+ // identically named libs from <cc> element
+ //
+ if (selectedLinkerDef != null) {
+ //
+ // add any system libraries to the hashtable
+ // done in reverse order so the earliest
+ // on the classpath takes priority
+ selectedLinkerDef.visitSystemLibraries(selectedLinker,
+ sysLibraryCollector);
+ }
+ //
+ // copy over any system libraries to the
+ // object files vector
+ //
+ Enumeration sysLibEnum = sysLibraries.elements();
+ while (sysLibEnum.hasMoreElements()) {
+ sysObjectFiles.addElement(sysLibEnum.nextElement());
+ }
+ return (LinkerConfiguration) linkerConfig;
+ }
+
+ /**
+ * Adds an include path.
+ *
+ * Include paths will be inherited by nested compiler elements that do not
+ * have inherit="false".
+ */
+ public IncludePath createIncludePath() {
+ return compilerDef.createIncludePath();
+ }
+
+ /**
+ * Specifies precompilation prototype file and exclusions. Inherited by all
+ * compilers that do not have inherit="false".
+ *
+ */
+ public PrecompileDef createPrecompile() throws BuildException {
+ return compilerDef.createPrecompile();
+ }
+
+ /**
+ * Adds a system include path. Locations and timestamps of files located
+ * using the system include paths are not used in dependency analysis.
+ *
+ *
+ * Standard include locations should not be specified. The compiler adapters
+ * should recognized the settings from the appropriate environment variables
+ * or configuration files.
+ *
+ * System include paths will be inherited by nested compiler elements that
+ * do not have inherit="false".
+ */
+ public SystemIncludePath createSysIncludePath() {
+ return compilerDef.createSysIncludePath();
+ }
+
+ /**
+ * Executes the task. Compiles the given files.
+ *
+ * @throws BuildException
+ * if someting goes wrong with the build
+ */
+ public void execute() throws BuildException {
+ //
+ // if link type allowed objdir to be defaulted
+ // provide it from outfile
+ if (_objDir == null) {
+ if (_outfile != null) {
+ _objDir = new File(_outfile.getParent());
+ } else {
+ _objDir = new File(".");
+ }
+ }
+
+ //
+ // if the object directory does not exist
+ //
+ if (!_objDir.exists()) {
+ throw new BuildException("Object directory does not exist");
+ }
+
+ //
+ // if userdefine is true, then run all user defined command
+ //
+ if (userdefine) {
+ Iterator iter = _userdefines.iterator();
+ while( iter.hasNext()) {
+ UserDefineDef userdefineDef = (UserDefineDef)iter.next();
+ UserDefineCompiler userdefineCompiler = new UserDefineCompiler(this, userdefineDef);
+ userdefineCompiler.command(this, userdefineDef);
+ }
+ return ;
+ }
+
+ TargetHistoryTable objHistory = new TargetHistoryTable(this, _objDir);
+ //
+ // determine the eventual linker configuration
+ // (may be null) and collect any explicit
+ // object files or libraries
+ Vector objectFiles = new Vector();
+ Vector sysObjectFiles = new Vector();
+ LinkerConfiguration linkerConfig = collectExplicitObjectFiles(
+ objectFiles, sysObjectFiles);
+ //
+ // Assembler hashtable of all files
+ // that we know how to compile (keyed by output file name)
+ //
+ Hashtable targets = getTargets(linkerConfig, objectFiles);
+ Hashtable acpiTarget = new Hashtable();
+ if (aslcompiler) {
+ acpiTarget = getAcpiTargets(linkerConfig, new Vector());
+ }
+ Hashtable assemblerTarget = new Hashtable();
+ if (assembler) {
+ assemblerTarget = getAssemblerTargets(linkerConfig, objectFiles);
+ }
+ TargetInfo linkTarget = null;
+ //
+ // if output file is not specified,
+ // then skip link step
+ //
+ if (_outfile != null) {
+ linkTarget = getLinkTarget(linkerConfig, objectFiles,
+ sysObjectFiles, targets, assemblerTarget);
+ }
+ //
+ // If specify the aslcompiler, then call asl compiler
+ //
+ if (aslcompiler) {
+ BuildException acpiException = null;
+ Hashtable targetsByConfig = getTargetsToBuildByConfiguration(acpiTarget);
+ Enumeration acpiTargetEnum = targetsByConfig.elements();
+ Vector[] targetVectors = new Vector[targetsByConfig.size()];
+ int index = 0;
+ while (acpiTargetEnum.hasMoreElements()) {
+ Vector targetsForConfig = (Vector) acpiTargetEnum.nextElement();
+ targetVectors[index++] = targetsForConfig;
+ }
+ for (int i = 0; i < targetVectors.length; i++) {
+ //
+ // get the targets for this configuration
+ //
+ Vector targetsForConfig = targetVectors[i];
+ //
+ // get the configuration from the first entry
+ //
+ AslcompilerConfiguration config = (AslcompilerConfiguration) ((TargetInfo) targetsForConfig
+ .elementAt(0)).getConfiguration();
+ //
+ // prepare the list of source files
+ //
+ String[] sourceFiles = new String[targetsForConfig.size()];
+ Enumeration targetsEnum = targetsForConfig.elements();
+ index = 0;
+ while (targetsEnum.hasMoreElements()) {
+ TargetInfo targetInfo = ((TargetInfo) targetsEnum
+ .nextElement());
+ sourceFiles[index++] = targetInfo.getSources()[0]
+ .toString();
+ }
+ try {
+ config.aslcompiler(this, _objDir, sourceFiles);
+ log(sourceFiles.length
+ + " total ACPI source files to be compiled.");
+ } catch (BuildException ex) {
+ if (acpiException == null) {
+ acpiException = ex;
+ }
+ if (!relentless)
+ break;
+ }
+ }
+ }
+ //
+ // If specify the assembler, then call assembler
+ //
+ if (assembler) {
+ BuildException assemblerException = null;
+ Hashtable targetsByConfig = getTargetsToBuildByConfiguration(assemblerTarget);
+ Enumeration assembleTargetEnum = targetsByConfig.elements();
+ Vector[] targetVectors = new Vector[targetsByConfig.size()];
+ int index = 0;
+ while (assembleTargetEnum.hasMoreElements()) {
+ Vector targetsForConfig = (Vector) assembleTargetEnum
+ .nextElement();
+ targetVectors[index++] = targetsForConfig;
+ }
+ for (int i = 0; i < targetVectors.length; i++) {
+ //
+ // get the targets for this configuration
+ //
+ Vector targetsForConfig = targetVectors[i];
+ //
+ // get the configuration from the first entry
+ //
+ AssemblerConfiguration config = (AssemblerConfiguration) ((TargetInfo) targetsForConfig
+ .elementAt(0)).getConfiguration();
+ //
+ // prepare the list of source files
+ //
+ String[] sourceFiles = new String[targetsForConfig.size()];
+ Enumeration targetsEnum = targetsForConfig.elements();
+ index = 0;
+ while (targetsEnum.hasMoreElements()) {
+ TargetInfo targetInfo = ((TargetInfo) targetsEnum
+ .nextElement());
+ sourceFiles[index++] = targetInfo.getSources()[0]
+ .toString();
+ }
+ try {
+ config.assembler(this, _objDir, sourceFiles);
+ log(sourceFiles.length + " total files to be assembled.");
+ } catch (BuildException ex) {
+ if (assemblerException == null) {
+ assemblerException = ex;
+ }
+ if (!relentless)
+ break;
+ }
+ }
+ //
+ // if we threw a assembler exception and
+ // didn't throw it at the time because
+ // we were relentless then
+ // save the history and
+ // throw the exception
+ //
+ if (assemblerException != null) {
+ if (failOnError) {
+ throw assemblerException;
+ } else {
+ log(assemblerException.getMessage(), Project.MSG_ERR);
+ return;
+ }
+ }
+ }
+
+ //
+ // mark targets that don't have a history record or
+ // whose source last modification time is not
+ // the same as the history to be rebuilt
+ //
+ objHistory.markForRebuild(targets);
+ CCTaskProgressMonitor monitor = new CCTaskProgressMonitor(objHistory);
+ //
+ // check for changed include files
+ //
+ int rebuildCount = checkForChangedIncludeFiles(targets);
+ if (rebuildCount > 0) {
+ BuildException compileException = null;
+ //
+ // compile all targets with getRebuild() == true
+ //
+ Hashtable targetsByConfig = getTargetsToBuildByConfiguration(targets);
+ //
+ // build array containing Vectors with precompiled generation
+ // steps going first
+ //
+ Vector[] targetVectors = new Vector[targetsByConfig.size()];
+ int index = 0;
+ Enumeration targetVectorEnum = targetsByConfig.elements();
+ while (targetVectorEnum.hasMoreElements()) {
+ Vector targetsForConfig = (Vector) targetVectorEnum
+ .nextElement();
+ //
+ // get the configuration from the first entry
+ //
+ CompilerConfiguration config = (CompilerConfiguration) ((TargetInfo) targetsForConfig
+ .elementAt(0)).getConfiguration();
+ if (config.isPrecompileGeneration()) {
+ targetVectors[index++] = targetsForConfig;
+ }
+ }
+ targetVectorEnum = targetsByConfig.elements();
+ while (targetVectorEnum.hasMoreElements()) {
+ Vector targetsForConfig = (Vector) targetVectorEnum
+ .nextElement();
+ for (int i = 0; i < targetVectors.length; i++) {
+ if (targetVectors[i] == targetsForConfig) {
+ break;
+ }
+ if (targetVectors[i] == null) {
+ targetVectors[i] = targetsForConfig;
+ break;
+ }
+ }
+ }
+ for (int i = 0; i < targetVectors.length; i++) {
+ //
+ // get the targets for this configuration
+ //
+ Vector targetsForConfig = targetVectors[i];
+ //
+ // get the configuration from the first entry
+ //
+ CompilerConfiguration config = (CompilerConfiguration) ((TargetInfo) targetsForConfig
+ .elementAt(0)).getConfiguration();
+ //
+ // prepare the list of source files
+ //
+ String[] sourceFiles = new String[targetsForConfig.size()];
+ Enumeration targetsEnum = targetsForConfig.elements();
+ index = 0;
+ while (targetsEnum.hasMoreElements()) {
+ TargetInfo targetInfo = ((TargetInfo) targetsEnum
+ .nextElement());
+ sourceFiles[index++] = targetInfo.getSources()[0]
+ .toString();
+ }
+ try {
+ config.compile(this, _objDir, sourceFiles, relentless,
+ monitor);
+ } catch (BuildException ex) {
+ if (compileException == null) {
+ compileException = ex;
+ }
+ if (!relentless)
+ break;
+ }
+ }
+ //
+ // save the details of the object file compilation
+ // settings to disk for dependency analysis
+ //
+ try {
+ objHistory.commit();
+ } catch (IOException ex) {
+ this.log("Error writing history.xml: " + ex.toString());
+ }
+ //
+ // if we threw a compile exception and
+ // didn't throw it at the time because
+ // we were relentless then
+ // save the history and
+ // throw the exception
+ //
+ if (compileException != null) {
+ if (failOnError) {
+ throw compileException;
+ } else {
+ log(compileException.getMessage(), Project.MSG_ERR);
+ return;
+ }
+ }
+ }
+ //
+ // if the dependency tree was not fully
+ // evaluated, then throw an exception
+ // since we really didn't do what we
+ // should have done
+ //
+ //
+ if (dependencyDepth >= 0) {
+ throw new BuildException(
+ "All files at depth "
+ + Integer.toString(dependencyDepth)
+ + " from changes successfully compiled.\n"
+ + "Remove or change dependencyDepth to -1 to perform full compilation.");
+ }
+ //
+ // if no link target then
+ // commit the history for the object files
+ // and leave the task
+ if (linkTarget != null) {
+ //
+ // get the history for the link target (may be the same
+ // as the object history)
+ TargetHistoryTable linkHistory = getLinkHistory(objHistory);
+ //
+ // see if it needs to be rebuilt
+ //
+ linkHistory.markForRebuild(linkTarget);
+ //
+ // if it needs to be rebuilt, rebuild it
+ //
+ File output = linkTarget.getOutput();
+ if (linkTarget.getRebuild()) {
+ log("Starting link");
+ LinkerConfiguration linkConfig = (LinkerConfiguration) linkTarget
+ .getConfiguration();
+ if (failOnError) {
+ linkConfig.link(this, linkTarget);
+ } else {
+ try {
+ linkConfig.link(this, linkTarget);
+ } catch (BuildException ex) {
+ log(ex.getMessage(), Project.MSG_ERR);
+ return;
+ }
+ }
+ if (outputFileProperty != null)
+ getProject().setProperty(outputFileProperty,
+ output.getAbsolutePath());
+ linkHistory.update(linkTarget);
+ try {
+ linkHistory.commit();
+ } catch (IOException ex) {
+ log("Error writing link history.xml: " + ex.toString());
+ }
+ } else {
+ if (outputFileProperty != null)
+ getProject().setProperty(outputFileProperty,
+ output.getAbsolutePath());
+ }
+ }
+ }
+
+ /**
+ * Gets the dataset.
+ *
+ * @return Returns a String
+ */
+ public String getDataset() {
+ return dataset;
+ }
+
+ protected TargetHistoryTable getLinkHistory(TargetHistoryTable objHistory) {
+ File outputFileDir = new File(_outfile.getParent());
+ //
+ // if the output file is being produced in the link
+ // directory, then we can use the same history file
+ //
+ if (_objDir.equals(outputFileDir)) {
+ return objHistory;
+ }
+ return new TargetHistoryTable(this, outputFileDir);
+ }
+
+ protected TargetInfo getLinkTarget(LinkerConfiguration linkerConfig,
+ Vector objectFiles, Vector sysObjectFiles,
+ Hashtable compileTargets, Hashtable assemblerTargets) {
+ //
+ // walk the compile phase targets and
+ // add those sources that have already been
+ // assigned to the linker or
+ // our output files the linker knows how to consume
+ // files the linker knows how to consume
+ //
+ Enumeration compileTargetsEnum = compileTargets.elements();
+ while (compileTargetsEnum.hasMoreElements()) {
+ TargetInfo compileTarget = (TargetInfo) compileTargetsEnum
+ .nextElement();
+ //
+ // output of compile tasks
+ //
+ int bid = linkerConfig.bid(compileTarget.getOutput().toString());
+ if (bid > 0) {
+ objectFiles.addElement(compileTarget.getOutput());
+ }
+ }
+ //
+ // walk the assembler phase targets and
+ // add those sources that have already been
+ // assigned to the linker or
+ // our output files the linker knows how to consume
+ // files the linker knows how to consume
+ //
+ Enumeration assembleTargetsEnum = assemblerTargets.elements();
+ while (assembleTargetsEnum.hasMoreElements()) {
+ TargetInfo assemblerTarget = (TargetInfo) assembleTargetsEnum
+ .nextElement();
+ //
+ // output of assemble tasks
+ //
+ int bid = linkerConfig.bid(assemblerTarget.getOutput().toString());
+ if (bid > 0) {
+ objectFiles.addElement(assemblerTarget.getOutput());
+ }
+ }
+ File[] objectFileArray = new File[objectFiles.size()];
+ objectFiles.copyInto(objectFileArray);
+ File[] sysObjectFileArray = new File[sysObjectFiles.size()];
+ sysObjectFiles.copyInto(sysObjectFileArray);
+ String baseName = _outfile.getName();
+ String fullName = linkerConfig.getOutputFileName(baseName);
+ File outputFile = new File(_outfile.getParent(), fullName);
+ return new TargetInfo(linkerConfig, objectFileArray,
+ sysObjectFileArray, outputFile, linkerConfig
+ .getRebuild());
+ }
+
+ public File getObjdir() {
+ return _objDir;
+ }
+
+ public File getOutfile() {
+ return _outfile;
+ }
+
+ public TargetDef getTargetPlatform() {
+ return null;
+ }
+
+ /**
+ * This method collects a Hashtable, keyed by output file name, of
+ * TargetInfo's for every source file that is specified in the filesets of
+ * the <aslcompiler> elements. The TargetInfo's contain the appropriate ACPI
+ * configurations for their possible acpi
+ *
+ */
+ private Hashtable getAcpiTargets(LinkerConfiguration linkerConfig,
+ Vector objectFiles) {
+ Hashtable targets = new Hashtable(1000);
+ TargetDef targetPlatform = getTargetPlatform();
+ Vector biddingProcessors = new Vector(_aslcompiler.size());
+ for (int i = 0; i < _aslcompiler.size(); i++) {
+ AslcompilerDef currentAslDef = (AslcompilerDef) _aslcompiler
+ .elementAt(i);
+ if (currentAslDef.isActive()) {
+ ProcessorConfiguration config = currentAslDef
+ .createConfiguration(this, linkType,
+ aslcompilerDef, targetPlatform);
+ //
+ // if the aslcompiler has a fileset
+ // then allow it to add its files to
+ // the set of potential targets
+ //
+ ProcessorConfiguration[] localConfigs = new ProcessorConfiguration[] { config };
+ if (currentAslDef.hasFileSets()) {
+ TargetMatcher matcher = new TargetMatcher(this, _objDir,
+ localConfigs, linkerConfig, objectFiles,
+ targets);
+ currentAslDef.visitFiles(matcher);
+ }
+ biddingProcessors.addElement(config);
+ }
+ }
+ //
+ // add fallback compiler at the end
+ //
+ ProcessorConfiguration config = aslcompilerDef.createConfiguration(
+ this, linkType, null, targetPlatform);
+ biddingProcessors.addElement(config);
+ ProcessorConfiguration[] bidders = new ProcessorConfiguration[biddingProcessors
+ .size()];
+ biddingProcessors.copyInto(bidders);
+ TargetMatcher matcher = new TargetMatcher(this, _objDir, bidders,
+ linkerConfig, objectFiles, targets);
+ aslcompilerDef.visitFiles(matcher);
+ return targets;
+ }
+
+ /**
+ * This method collects a Hashtable, keyed by output file name, of
+ * TargetInfo's for every source file that is specified in the filesets of
+ * the <assembler> elements. The TargetInfo's contain the appropriate
+ * assembler configurations for their possible assembly
+ *
+ */
+ private Hashtable getAssemblerTargets(LinkerConfiguration linkerConfig,
+ Vector objectFiles) {
+ Hashtable targets = new Hashtable(1000);
+ TargetDef targetPlatform = getTargetPlatform();
+ Vector biddingProcessors = new Vector(_assemblers.size());
+ for (int i = 0; i < _assemblers.size(); i++) {
+ AssemblerDef currentAssemblerDef = (AssemblerDef) _assemblers
+ .elementAt(i);
+ if (currentAssemblerDef.isActive()) {
+ ProcessorConfiguration config = currentAssemblerDef
+ .createConfiguration(this, linkType,
+ assemblerDef, targetPlatform);
+ //
+ // if the assembler has a fileset
+ // then allow it to add its files to
+ // the set of potential targets
+ //
+ ProcessorConfiguration[] localConfigs = new ProcessorConfiguration[] { config };
+ if (currentAssemblerDef.hasFileSets()) {
+ TargetMatcher matcher = new TargetMatcher(this, _objDir,
+ localConfigs, linkerConfig, objectFiles,
+ targets);
+ currentAssemblerDef.visitFiles(matcher);
+ }
+ biddingProcessors.addElement(config);
+ }
+ }
+ //
+ // add fallback assembler at the end
+ //
+ ProcessorConfiguration config = assemblerDef.createConfiguration(this,
+ linkType, null, targetPlatform);
+ biddingProcessors.addElement(config);
+ ProcessorConfiguration[] bidders = new ProcessorConfiguration[biddingProcessors
+ .size()];
+ biddingProcessors.copyInto(bidders);
+ TargetMatcher matcher = new TargetMatcher(this, _objDir, bidders,
+ linkerConfig, objectFiles, targets);
+ assemblerDef.visitFiles(matcher);
+ return targets;
+ }
+
+ /**
+ * This method collects a Hashtable, keyed by output file name, of
+ * TargetInfo's for every source file that is specified in the filesets of
+ * the <cc>and nested <compiler>elements. The TargetInfo's contain the
+ * appropriate compiler configurations for their possible compilation
+ *
+ */
+ private Hashtable getTargets(LinkerConfiguration linkerConfig,
+ Vector objectFiles) {
+ Hashtable targets = new Hashtable(1000);
+ TargetDef targetPlatform = getTargetPlatform();
+ //
+ // find active (specialized) compilers
+ //
+ Vector biddingProcessors = new Vector(_compilers.size());
+ for (int i = 0; i < _compilers.size(); i++) {
+ CompilerDef currentCompilerDef = (CompilerDef) _compilers
+ .elementAt(i);
+ if (currentCompilerDef.isActive()) {
+ ProcessorConfiguration config = currentCompilerDef
+ .createConfiguration(this, linkType,
+ compilerDef, targetPlatform);
+ //
+ // see if this processor had a precompile child element
+ //
+ PrecompileDef precompileDef = currentCompilerDef
+ .getActivePrecompile(compilerDef);
+ ProcessorConfiguration[] localConfigs = new ProcessorConfiguration[] { config };
+ //
+ // if it does then
+ //
+ if (precompileDef != null) {
+ File prototype = precompileDef.getPrototype();
+ //
+ // will throw exceptions if prototype doesn't exist, etc
+ //
+ if (!prototype.exists()) {
+ throw new BuildException("prototype ("
+ + prototype.toString()
+ + ") does not exist.");
+ }
+ if (prototype.isDirectory()) {
+ throw new BuildException("prototype ("
+ + prototype.toString()
+ + ") is a directory.");
+ }
+ String[] exceptFiles = precompileDef.getExceptFiles();
+ //
+ // create a precompile building and precompile using
+ // variants of the configuration
+ // or return null if compiler doesn't support
+ // precompilation
+ CompilerConfiguration[] configs = ((CompilerConfiguration) config)
+ .createPrecompileConfigurations(prototype,
+ exceptFiles);
+ if (configs != null && configs.length == 2) {
+ //
+ // visit the precompiled file to add it into the
+ // targets list (just like any other file if
+ // compiler doesn't support precompilation)
+ TargetMatcher matcher = new TargetMatcher(
+ this,
+ _objDir,
+ new ProcessorConfiguration[] { configs[0] },
+ linkerConfig, objectFiles, targets);
+ matcher.visit(new File(prototype.getParent()),
+ prototype.getName());
+ //
+ // only the configuration that uses the
+ // precompiled header gets added to the bidding list
+ biddingProcessors.addElement(configs[1]);
+ localConfigs = new ProcessorConfiguration[2];
+ localConfigs[0] = configs[1];
+ localConfigs[1] = config;
+ }
+ }
+ //
+ // if the compiler has a fileset
+ // then allow it to add its files
+ // to the set of potential targets
+ if (currentCompilerDef.hasFileSets()) {
+ TargetMatcher matcher = new TargetMatcher(this, _objDir,
+ localConfigs, linkerConfig, objectFiles,
+ targets);
+ currentCompilerDef.visitFiles(matcher);
+ }
+ biddingProcessors.addElement(config);
+ }
+ }
+ //
+ // add fallback compiler at the end
+ //
+ ProcessorConfiguration config = compilerDef.createConfiguration(this,
+ linkType, null, targetPlatform);
+ biddingProcessors.addElement(config);
+ ProcessorConfiguration[] bidders = new ProcessorConfiguration[biddingProcessors
+ .size()];
+ biddingProcessors.copyInto(bidders);
+ //
+ // bid out the <fileset>'s in the cctask
+ //
+ TargetMatcher matcher = new TargetMatcher(this, _objDir, bidders,
+ linkerConfig, objectFiles, targets);
+ compilerDef.visitFiles(matcher);
+ return targets;
+ }
+
+ /**
+ * Sets the default compiler adapter. Use the "name" attribute when the
+ * compiler is a supported compiler.
+ *
+ * @param classname
+ * fully qualified classname which implements CompilerAdapter
+ */
+ public void setClassname(String classname) {
+ compilerDef.setClassname(classname);
+ linkerDef.setClassname(classname);
+ assemblerDef.setClassname(classname);
+ aslcompilerDef.setClassname(classname);
+ }
+
+ /**
+ * Sets the dataset for OS/390 builds.
+ *
+ * @param dataset
+ * The dataset to set
+ */
+ public void setDataset(String dataset) {
+ this.dataset = dataset;
+ }
+
+ /**
+ * Enables or disables generation of debug info.
+ */
+ public void setDebug(boolean debug) {
+ compilerDef.setDebug(debug);
+ linkerDef.setDebug(debug);
+ assemblerDef.setDebug(debug);
+ aslcompilerDef.setDebug(debug);
+ }
+
+ /**
+ * Deprecated.
+ *
+ * Controls the depth of the dependency evaluation. Used to do a quick check
+ * of changes before a full build.
+ *
+ * Any negative value which will perform full dependency checking. Positive
+ * values will truncate dependency checking. A value of 0 will cause only
+ * those files that changed to be recompiled, a value of 1 which cause files
+ * that changed or that explicitly include a file that changed to be
+ * recompiled.
+ *
+ * Any non-negative value will cause a BuildException to be thrown before
+ * attempting a link or completing the task.
+ *
+ */
+ public void setDependencyDepth(int depth) {
+ dependencyDepth = depth;
+ }
+
+ /**
+ * Enables generation of exception handling code
+ */
+ public void setExceptions(boolean exceptions) {
+ compilerDef.setExceptions(exceptions);
+ }
+
+ /**
+ * Enables run-time type information.
+ */
+ public void setRtti(boolean rtti) {
+ compilerDef.setRtti(rtti);
+ }
+
+ // public LinkType getLinkType() {
+ // return linkType;
+ // }
+ /**
+ * Enables or disables incremental linking.
+ *
+ * @param incremental
+ * new state
+ */
+ public void setIncremental(boolean incremental) {
+ linkerDef.setIncremental(incremental);
+ }
+
+ /**
+ * Set use of libtool.
+ *
+ * If set to true, the "libtool " will be prepended to the command line for
+ * compatible processors
+ *
+ * @param libtool
+ * If true, use libtool.
+ */
+ public void setLibtool(boolean libtool) {
+ compilerDef.setLibtool(libtool);
+ linkerDef.setLibtool(libtool);
+ assemblerDef.setLibtool(libtool);
+ aslcompilerDef.setLibtool(libtool);
+ }
+
+ /**
+ * Sets the output file type. Supported values "executable", "shared", and
+ * "static". Deprecated, specify outtype instead.
+ *
+ * @deprecated
+ */
+ public void setLink(OutputTypeEnum outputType) {
+ linkType.setOutputType(outputType);
+ }
+
+ /**
+ * Enables or disables generation of multithreaded code
+ *
+ * @param multi
+ * If true, generated code may be multithreaded.
+ */
+ public void setMultithreaded(boolean multi) {
+ compilerDef.setMultithreaded(multi);
+ }
+
+ //
+ // keep near duplicate comment at CompilerDef.setName in sync
+ //
+ /**
+ * Sets type of the default compiler and linker.
+ *
+ * <table width="100%" border="1"> <thead>Supported compilers </thead>
+ * <tr>
+ * <td>gcc (default)</td>
+ * <td>GCC C++ compiler</td>
+ * </tr>
+ * <tr>
+ * <td>g++</td>
+ * <td>GCC C++ compiler</td>
+ * </tr>
+ * <tr>
+ * <td>c++</td>
+ * <td>GCC C++ compiler</td>
+ * </tr>
+ * <tr>
+ * <td>g77</td>
+ * <td>GNU FORTRAN compiler</td>
+ * </tr>
+ * <tr>
+ * <td>msvc</td>
+ * <td>Microsoft Visual C++</td>
+ * </tr>
+ * <tr>
+ * <td>bcc</td>
+ * <td>Borland C++ Compiler</td>
+ * </tr>
+ * <tr>
+ * <td>msrc</td>
+ * <td>Microsoft Resource Compiler</td>
+ * </tr>
+ * <tr>
+ * <td>brc</td>
+ * <td>Borland Resource Compiler</td>
+ * </tr>
+ * <tr>
+ * <td>df</td>
+ * <td>Compaq Visual Fortran Compiler</td>
+ * </tr>
+ * <tr>
+ * <td>midl</td>
+ * <td>Microsoft MIDL Compiler</td>
+ * </tr>
+ * <tr>
+ * <td>icl</td>
+ * <td>Intel C++ compiler for Windows (IA-32)</td>
+ * </tr>
+ * <tr>
+ * <td>ecl</td>
+ * <td>Intel C++ compiler for Windows (IA-64)</td>
+ * </tr>
+ * <tr>
+ * <td>icc</td>
+ * <td>Intel C++ compiler for Linux (IA-32)</td>
+ * </tr>
+ * <tr>
+ * <td>ecc</td>
+ * <td>Intel C++ compiler for Linux (IA-64)</td>
+ * </tr>
+ * <tr>
+ * <td>CC</td>
+ * <td>Sun ONE C++ compiler</td>
+ * </tr>
+ * <tr>
+ * <td>aCC</td>
+ * <td>HP aC++ C++ Compiler</td>
+ * </tr>
+ * <tr>
+ * <td>os390</td>
+ * <td>OS390 C Compiler</td>
+ * </tr>
+ * <tr>
+ * <td>os400</td>
+ * <td>Icc Compiler</td>
+ * </tr>
+ * <tr>
+ * <td>sunc89</td>
+ * <td>Sun C89 C Compiler</td>
+ * </tr>
+ * <tr>
+ * <td>xlC</td>
+ * <td>VisualAge C Compiler</td>
+ * </tr>
+ * </table>
+ *
+ */
+ public void setName(CompilerEnum name) {
+ compilerDef.setName(name);
+ Processor compiler = compilerDef.getProcessor();
+ Linker linker = compiler.getLinker(linkType);
+ linkerDef.setProcessor(linker);
+ }
+
+ /**
+ * Do not propagate old environment when new environment variables are
+ * specified.
+ */
+ public void setNewenvironment(boolean newenv) {
+ compilerDef.setNewenvironment(newenv);
+ linkerDef.setNewenvironment(newenv);
+ assemblerDef.setNewenvironment(newenv);
+ aslcompilerDef.setNewenvironment(newenv);
+ }
+
+ /**
+ * Sets the destination directory for object files.
+ *
+ * Generally this should be a property expression that evaluates to distinct
+ * debug and release object file directories.
+ *
+ * @param dir
+ * object directory
+ */
+ public void setObjdir(File dir) {
+ if (dir == null) {
+ throw new NullPointerException("dir");
+ }
+ _objDir = dir;
+ }
+
+ /**
+ * Sets the output file name. If not specified, the task will only compile
+ * files and not attempt to link. If an extension is not specified, the task
+ * may use a system appropriate extension and prefix, for example,
+ * outfile="example" may result in "libexample.so" being created.
+ *
+ * @param outfile
+ * output file name
+ */
+ public void setOutfile(File outfile) {
+ //
+ // if file name was empty, skip link step
+ //
+ if (outfile == null || outfile.toString().length() > 0) {
+ _outfile = outfile;
+ }
+ }
+
+ /**
+ * Specifies the name of a property to set with the physical filename that
+ * is produced by the linker
+ */
+ public void setOutputFileProperty(String outputFileProperty) {
+ this.outputFileProperty = outputFileProperty;
+ }
+
+ /**
+ * Sets the output file type. Supported values "executable", "shared", and
+ * "static".
+ */
+ public void setOuttype(OutputTypeEnum outputType) {
+ linkType.setOutputType(outputType);
+ }
+
+ /**
+ * Sets the project.
+ */
+ public void setProject(Project project) {
+ super.setProject(project);
+ compilerDef.setProject(project);
+ linkerDef.setProject(project);
+ assemblerDef.setProject(project);
+ aslcompilerDef.setProject(project);
+ }
+
+ /**
+ * If set to true, all files will be rebuilt.
+ *
+ * @paran rebuildAll If true, all files will be rebuilt. If false, up to
+ * date files will not be rebuilt.
+ */
+ public void setRebuild(boolean rebuildAll) {
+ compilerDef.setRebuild(rebuildAll);
+ linkerDef.setRebuild(rebuildAll);
+ assemblerDef.setRebuild(rebuildAll);
+ aslcompilerDef.setRebuild(rebuildAll);
+ }
+
+ /**
+ * If set to true, compilation errors will not stop the task until all files
+ * have been attempted.
+ *
+ * @param relentless
+ * If true, don't stop on the first compilation error
+ *
+ */
+ public void setRelentless(boolean relentless) {
+ this.relentless = relentless;
+ }
+
+ /**
+ * Sets the type of runtime library, possible values "dynamic", "static".
+ */
+ public void setRuntime(RuntimeType rtlType) {
+ linkType.setStaticRuntime((rtlType.getIndex() == 1));
+ }
+
+ /**
+ * Sets the nature of the subsystem under which that the program will
+ * execute.
+ *
+ * <table width="100%" border="1"> <thead>Supported subsystems </thead>
+ * <tr>
+ * <td>gui</td>
+ * <td>Graphical User Interface</td>
+ * </tr>
+ * <tr>
+ * <td>console</td>
+ * <td>Command Line Console</td>
+ * </tr>
+ * <tr>
+ * <td>other</td>
+ * <td>Other</td>
+ * </tr>
+ * </table>
+ *
+ * @param subsystem
+ * subsystem
+ * @throws NullPointerException
+ * if subsystem is null
+ */
+ public void setSubsystem(SubsystemEnum subsystem) {
+ if (subsystem == null) {
+ throw new NullPointerException("subsystem");
+ }
+ linkType.setSubsystem(subsystem);
+ }
+
+ /**
+ * Enumerated attribute with the values "none", "severe", "default",
+ * "production", "diagnostic", and "failtask".
+ */
+ public void setWarnings(CompilerDef.WarningLevel level) {
+ compilerDef.setWarnings(level);
+ }
+
+ /**
+ * Indicates whether the build will continue even if there are compilation
+ * errors; defaults to true.
+ *
+ * @param fail
+ * if true halt the build on failure
+ */
+ public void setFailonerror(boolean fail) {
+ failOnError = fail;
+ }
+
+ /**
+ * Gets the failonerror flag.
+ *
+ * @return the failonerror flag
+ */
+ public boolean getFailonerror() {
+ return failOnError;
+ }
+
+ /**
+ * Adds descriptive version information to be included in the generated
+ * file. The first active version info block will be used. (Non-functional
+ * prototype)
+ */
+ public void addConfiguredVersioninfo(VersionInfo info) {
+ linkerDef.addConfiguredVersioninfo(info);
+ }
+
+ /**
+ * Adds a target definition or reference (Non-functional prototype).
+ *
+ * @param target
+ * target
+ * @throws NullPointerException
+ * if compiler is null
+ */
+ public void addConfiguredTarget(TargetDef target) {
+ if (target == null) {
+ throw new NullPointerException("target");
+ }
+ target.setProject(getProject());
+ targetPlatforms.addElement(target);
+ }
+
+ /**
+ * Adds a distributer definition or reference (Non-functional prototype).
+ *
+ * @param distributer
+ * distributer
+ * @throws NullPointerException
+ * if compiler is null
+ */
+ public void addConfiguredDistributer(DistributerDef distributer) {
+ if (distributer == null) {
+ throw new NullPointerException("distributer");
+ }
+ distributer.setProject(getProject());
+ distributers.addElement(distributer);
+ }
+
+ /**
+ * Sets optimization.
+ * @param optimization
+ */
+ public void setOptimize(OptimizationEnum optimization) {
+ compilerDef.setOptimize(optimization);
+ }
+
+ public boolean isAssembler() {
+ return assembler;
+ }
+
+ public void setAssembler(boolean assembler) {
+ this.assembler = assembler;
+ }
+
+ public boolean isAslcompiler() {
+ return aslcompiler;
+ }
+
+ public void setAslcompiler(boolean aslcompiler) {
+ this.aslcompiler = aslcompiler;
+ }
+
+ public boolean isUserdefine() {
+ return userdefine;
+ }
+
+ public void setUserdefine(boolean userdefine) {
+ this.userdefine = userdefine;
+ }
+
+ public String getArch() {
+ return arch;
+ }
+
+ public void setArch(String arch) {
+ this.arch = arch;
+ }
+
+ public String getOs() {
+ return os;
+ }
+
+ public void setOs(String os) {
+ this.os = os;
+ }
+
+ public String getVendor() {
+ return vendor;
+ }
+
+ public void setVendor(String vendor) {
+ this.vendor = vendor;
+ }
+
+
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CCTaskProgressMonitor.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CCTaskProgressMonitor.java
new file mode 100644
index 0000000..78192a5
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CCTaskProgressMonitor.java
@@ -0,0 +1,56 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+import java.io.IOException;
+
+import net.sf.antcontrib.cpptasks.compiler.ProcessorConfiguration;
+import net.sf.antcontrib.cpptasks.compiler.ProgressMonitor;
+public class CCTaskProgressMonitor implements ProgressMonitor {
+ private ProcessorConfiguration config;
+ private TargetHistoryTable history;
+ private long lastCommit = -1;
+ public CCTaskProgressMonitor(TargetHistoryTable history) {
+ this.history = history;
+ }
+ public void finish(ProcessorConfiguration config, boolean normal) {
+ long current = System.currentTimeMillis();
+ if ((current - lastCommit) > 120000) {
+ try {
+ history.commit();
+ lastCommit = System.currentTimeMillis();
+ } catch (IOException ex) {
+ }
+ }
+ }
+ public void progress(String[] sources) {
+ history.update(config, sources);
+ long current = System.currentTimeMillis();
+ if ((current - lastCommit) > 120000) {
+ try {
+ history.commit();
+ lastCommit = current;
+ } catch (IOException ex) {
+ }
+ }
+ }
+ public void start(ProcessorConfiguration config) {
+ if (lastCommit < 0) {
+ lastCommit = System.currentTimeMillis();
+ }
+ this.config = config;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CPUEnum.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CPUEnum.java
new file mode 100644
index 0000000..ba73902
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CPUEnum.java
@@ -0,0 +1,71 @@
+/*
+ *
+ * Copyright 2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+
+import org.apache.tools.ant.types.EnumeratedAttribute;
+
+/**
+ * Enumeration of cpu types.
+ *
+ * @author Curt Arnold
+ *
+ */
+public final class CPUEnum
+ extends EnumeratedAttribute {
+
+ /**
+ * Constructor.
+ *
+ * Set by default to "pentium3"
+ *
+ * @see java.lang.Object#Object()
+ */
+ public CPUEnum() {
+ setValue("pentium3");
+ }
+
+ /**
+ * Gets list of acceptable values.
+ *
+ * @see org.apache.tools.ant.types.EnumeratedAttribute#getValues()
+ */
+ public String[] getValues() {
+ return new String[] {
+ "i386",
+ "i486",
+ "i586",
+ "i686",
+ "pentium",
+ "pentium-mmx",
+ "pentiumpro",
+ "pentium2",
+ "pentium3",
+ "pentium4",
+ "k6",
+ "k6-2",
+ "k6-3",
+ "athlon",
+ "athlon-tbird",
+ "athlon-4",
+ "athlon-xp",
+ "athlon-mp",
+ "winchip-c6",
+ "winchip2",
+ "c3" };
+ }
+
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CUtil.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CUtil.java
new file mode 100644
index 0000000..074e8b4
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CUtil.java
@@ -0,0 +1,461 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+import java.io.File;
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.StringTokenizer;
+import java.util.Vector;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.taskdefs.Execute;
+import org.apache.tools.ant.taskdefs.LogStreamHandler;
+import org.apache.tools.ant.types.Commandline;
+import org.apache.tools.ant.types.Environment;
+/**
+ * Some utilities used by the CC and Link tasks.
+ *
+ * @author Adam Murdoch
+ */
+public class CUtil {
+ /**
+ * A class that splits a white-space, comma-separated list into a String
+ * array. Used for task attributes.
+ */
+ public static final class StringArrayBuilder {
+ private String[] _value;
+ public StringArrayBuilder(String value) {
+ // Split the defines up
+ StringTokenizer tokens = new StringTokenizer(value, ", ");
+ Vector vallist = new Vector();
+ while (tokens.hasMoreTokens()) {
+ String val = tokens.nextToken().trim();
+ if (val.length() == 0) {
+ continue;
+ }
+ vallist.addElement(val);
+ }
+ _value = new String[vallist.size()];
+ vallist.copyInto(_value);
+ }
+ public String[] getValue() {
+ return _value;
+ }
+ }
+ /**
+ * Adds the elements of the array to the given vector
+ */
+ public static void addAll(Vector dest, Object[] src) {
+ if (src == null) {
+ return;
+ }
+ for (int i = 0; i < src.length; i++) {
+ dest.addElement(src[i]);
+ }
+ }
+ /**
+ * Checks a array of names for non existent or non directory entries and
+ * nulls them out.
+ *
+ * @return Count of non-null elements
+ */
+ public static int checkDirectoryArray(String[] names) {
+ int count = 0;
+ for (int i = 0; i < names.length; i++) {
+ if (names[i] != null) {
+ File dir = new File(names[i]);
+ if (dir.exists() && dir.isDirectory()) {
+ count++;
+ } else {
+ names[i] = null;
+ }
+ }
+ }
+ return count;
+ }
+ /**
+ * Extracts the basename of a file, removing the extension, if present
+ */
+ public static String getBasename(File file) {
+ String path = file.getPath();
+ // Remove the extension
+ String basename = file.getName();
+ int pos = basename.lastIndexOf('.');
+ if (pos != -1) {
+ basename = basename.substring(0, pos);
+ }
+ return basename;
+ }
+ /**
+ * Gets the parent directory for the executable file name using the current
+ * directory and system executable path
+ *
+ * @param exeName
+ * Name of executable such as "cl.exe"
+ * @return parent directory or null if not located
+ */
+ public static File getExecutableLocation(String exeName) {
+ //
+ // must add current working directory to the
+ // from of the path from the "path" environment variable
+ File currentDir = new File(System.getProperty("user.dir"));
+ if (new File(currentDir, exeName).exists()) {
+ return currentDir;
+ }
+ File[] envPath = CUtil.getPathFromEnvironment("PATH",
+ File.pathSeparator);
+ for (int i = 0; i < envPath.length; i++) {
+ if (new File(envPath[i], exeName).exists()) {
+ return envPath[i];
+ }
+ }
+ return null;
+ }
+ /**
+ * Extracts the parent of a file
+ */
+ public static String getParentPath(String path) {
+ int pos = path.lastIndexOf(File.separator);
+ if (pos <= 0) {
+ return null;
+ }
+ return path.substring(0, pos);
+ }
+ /**
+ * Returns an array of File for each existing directory in the specified
+ * environment variable
+ *
+ * @param envVariable
+ * environment variable name such as "LIB" or "INCLUDE"
+ * @param delim
+ * delimitor used to separate parts of the path, typically ";"
+ * or ":"
+ * @return array of File's for each part that is an existing directory
+ */
+ public static File[] getPathFromEnvironment(String envVariable, String delim) {
+ // OS/4000 does not support the env command.
+ if (System.getProperty("os.name").equals("OS/400"))
+ return new File[]{};
+ Vector osEnv = Execute.getProcEnvironment();
+ String match = envVariable.concat("=");
+ for (Enumeration e = osEnv.elements(); e.hasMoreElements();) {
+ String entry = ((String) e.nextElement()).trim();
+ if (entry.length() > match.length()) {
+ String entryFrag = entry.substring(0, match.length());
+ if (entryFrag.equalsIgnoreCase(match)) {
+ String path = entry.substring(match.length());
+ return parsePath(path, delim);
+ }
+ }
+ }
+ File[] noPath = new File[0];
+ return noPath;
+ }
+ /**
+ * Returns a relative path for the targetFile relative to the base
+ * directory.
+ *
+ * @param canonicalBase
+ * base directory as returned by File.getCanonicalPath()
+ * @param targetFile
+ * target file
+ * @return relative path of target file. Returns targetFile if there were
+ * no commonalities between the base and the target
+ *
+ * @author Curt Arnold
+ */
+ public static String getRelativePath(String base, File targetFile) {
+ try {
+ //
+ // remove trailing file separator
+ //
+ String canonicalBase = base;
+ if (base.charAt(base.length() - 1) == File.separatorChar) {
+ canonicalBase = base.substring(0, base.length() - 1);
+ }
+ //
+ // get canonical name of target and remove trailing separator
+ //
+ String canonicalTarget;
+ if (System.getProperty("os.name").equals("OS/400"))
+ canonicalTarget = targetFile.getPath();
+ else
+ canonicalTarget = targetFile.getCanonicalPath();
+ if (canonicalTarget.charAt(canonicalTarget.length() - 1) == File.separatorChar) {
+ canonicalTarget = canonicalTarget.substring(0, canonicalTarget
+ .length() - 1);
+ }
+ if (canonicalTarget.equals(canonicalBase)) {
+ return ".";
+ }
+ //
+ // see if the prefixes are the same
+ //
+ if (canonicalBase.substring(0, 2).equals("\\\\")) {
+ //
+ // UNC file name, if target file doesn't also start with same
+ // server name, don't go there
+ int endPrefix = canonicalBase.indexOf('\\', 2);
+ String prefix1 = canonicalBase.substring(0, endPrefix);
+ String prefix2 = canonicalTarget.substring(0, endPrefix);
+ if (!prefix1.equals(prefix2)) {
+ return canonicalTarget;
+ }
+ } else {
+ if (canonicalBase.substring(1, 3).equals(":\\")) {
+ int endPrefix = 2;
+ String prefix1 = canonicalBase.substring(0, endPrefix);
+ String prefix2 = canonicalTarget.substring(0, endPrefix);
+ if (!prefix1.equals(prefix2)) {
+ return canonicalTarget;
+ }
+ } else {
+ if (canonicalBase.charAt(0) == '/') {
+ if (canonicalTarget.charAt(0) != '/') {
+ return canonicalTarget;
+ }
+ }
+ }
+ }
+ char separator = File.separatorChar;
+ int lastSeparator = -1;
+ int minLength = canonicalBase.length();
+ if (canonicalTarget.length() < minLength) {
+ minLength = canonicalTarget.length();
+ }
+ int firstDifference = minLength + 1;
+ //
+ // walk to the shorter of the two paths
+ // finding the last separator they have in common
+ for (int i = 0; i < minLength; i++) {
+ if (canonicalTarget.charAt(i) == canonicalBase.charAt(i)) {
+ if (canonicalTarget.charAt(i) == separator) {
+ lastSeparator = i;
+ }
+ } else {
+ firstDifference = lastSeparator + 1;
+ break;
+ }
+ }
+ StringBuffer relativePath = new StringBuffer(50);
+ //
+ // walk from the first difference to the end of the base
+ // adding "../" for each separator encountered
+ //
+ if (canonicalBase.length() > firstDifference) {
+ relativePath.append("..");
+ for (int i = firstDifference; i < canonicalBase.length(); i++) {
+ if (canonicalBase.charAt(i) == separator) {
+ relativePath.append(separator);
+ relativePath.append("..");
+ }
+ }
+ }
+ if (canonicalTarget.length() > firstDifference) {
+ //
+ // append the rest of the target
+ //
+ //
+ if (relativePath.length() > 0) {
+ relativePath.append(separator);
+ }
+ relativePath.append(canonicalTarget.substring(firstDifference));
+ }
+ return relativePath.toString();
+ } catch (IOException ex) {
+ }
+ return targetFile.toString();
+ }
+ public static boolean isActive(Project p, String ifCond, String unlessCond)
+ throws BuildException {
+ if (ifCond != null) {
+ String ifValue = p.getProperty(ifCond);
+ if (ifValue == null) {
+ return false;
+ } else {
+ if (ifValue.equals("false") || ifValue.equals("no")) {
+ throw new BuildException("if condition \"" + ifCond
+ + "\" has suspicious value \"" + ifValue);
+ }
+ }
+ }
+ if (unlessCond != null) {
+ String unlessValue = p.getProperty(unlessCond);
+ if (unlessValue != null) {
+ if (unlessValue.equals("false") || unlessValue.equals("no")) {
+ throw new BuildException("unless condition \"" + unlessCond
+ + "\" has suspicious value \"" + unlessValue);
+ }
+ return false;
+ }
+ }
+ return true;
+ }
+ /**
+ * Parse a string containing directories into an File[]
+ *
+ * @param path
+ * path string, for example ".;c:\something\include"
+ * @param delim
+ * delimiter, typically ; or :
+ */
+ public static File[] parsePath(String path, String delim) {
+ Vector libpaths = new Vector();
+ int delimPos = 0;
+ for (int startPos = 0; startPos < path.length(); startPos = delimPos
+ + delim.length()) {
+ delimPos = path.indexOf(delim, startPos);
+ if (delimPos < 0) {
+ delimPos = path.length();
+ }
+ //
+ // don't add an entry for zero-length paths
+ //
+ if (delimPos > startPos) {
+ String dirName = path.substring(startPos, delimPos);
+ File dir = new File(dirName);
+ if (dir.exists() && dir.isDirectory()) {
+ libpaths.addElement(dir);
+ }
+ }
+ }
+ File[] paths = new File[libpaths.size()];
+ libpaths.copyInto(paths);
+ return paths;
+ }
+ /**
+ * This method is exposed so test classes can overload and test the
+ * arguments without actually spawning the compiler
+ */
+ public static int runCommand(CCTask task, File workingDir,
+ String[] cmdline, boolean newEnvironment, Environment env)
+ throws BuildException {
+ try {
+ task.log(Commandline.toString(cmdline), Project.MSG_VERBOSE);
+ Execute exe = new Execute(new LogStreamHandler(task,
+ Project.MSG_INFO, Project.MSG_ERR));
+ if (System.getProperty("os.name").equals("OS/390"))
+ exe.setVMLauncher(false);
+ exe.setAntRun(task.getProject());
+ exe.setCommandline(cmdline);
+ exe.setWorkingDirectory(workingDir);
+ if (env != null) {
+ String[] environment = env.getVariables();
+ if (environment != null) {
+ for (int i = 0; i < environment.length; i++) {
+ task.log("Setting environment variable: "
+ + environment[i], Project.MSG_VERBOSE);
+ }
+ }
+ exe.setEnvironment(environment);
+ }
+ exe.setNewenvironment(newEnvironment);
+ return exe.execute();
+ } catch (java.io.IOException exc) {
+ throw new BuildException("Could not launch " + cmdline[0] + ": "
+ + exc, task.getLocation());
+ }
+ }
+ /**
+ * Compares the contents of 2 arrays for equaliy.
+ */
+ public static boolean sameList(Object[] a, Object[] b) {
+ if (a == null || b == null || a.length != b.length) {
+ return false;
+ }
+ for (int i = 0; i < a.length; i++) {
+ if (!a[i].equals(b[i])) {
+ return false;
+ }
+ }
+ return true;
+ }
+ /**
+ * Compares the contents of an array and a Vector for equality.
+ */
+ public static boolean sameList(Vector v, Object[] a) {
+ if (v == null || a == null || v.size() != a.length) {
+ return false;
+ }
+ for (int i = 0; i < a.length; i++) {
+ Object o = a[i];
+ if (!o.equals(v.elementAt(i))) {
+ return false;
+ }
+ }
+ return true;
+ }
+ /**
+ * Compares the contents of an array and a Vector for set equality. Assumes
+ * input array and vector are sets (i.e. no duplicate entries)
+ */
+ public static boolean sameSet(Object[] a, Vector b) {
+ if (a == null || b == null || a.length != b.size()) {
+ return false;
+ }
+ if (a.length == 0) {
+ return true;
+ }
+ // Convert the array into a set
+ Hashtable t = new Hashtable();
+ for (int i = 0; i < a.length; i++) {
+ t.put(a[i], a[i]);
+ }
+ for (int i = 0; i < b.size(); i++) {
+ Object o = b.elementAt(i);
+ if (t.remove(o) == null) {
+ return false;
+ }
+ }
+ return (t.size() == 0);
+ }
+ /**
+ * Converts a vector to a string array.
+ */
+ public static String[] toArray(Vector src) {
+ String[] retval = new String[src.size()];
+ src.copyInto(retval);
+ return retval;
+ }
+ /**
+ * Replaces any embedded quotes in the string so that the value can be
+ * placed in an attribute in an XML file
+ *
+ * @param attrValue
+ * value to be expressed
+ * @return equivalent attribute literal
+ *
+ */
+ public static String xmlAttribEncode(String attrValue) {
+ int quotePos = attrValue.indexOf('\"');
+ if (quotePos < 0) {
+ return attrValue;
+ }
+ int startPos = 0;
+ StringBuffer buf = new StringBuffer(attrValue.length() + 20);
+ while (quotePos >= 0) {
+ buf.append(attrValue.substring(startPos, quotePos));
+ buf.append("&quot;");
+ startPos = quotePos + 1;
+ quotePos = attrValue.indexOf('\"', startPos);
+ }
+ buf.append(attrValue.substring(startPos));
+ return buf.toString();
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CompilerDef.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CompilerDef.java
new file mode 100644
index 0000000..0a92a51
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CompilerDef.java
@@ -0,0 +1,556 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.util.Enumeration;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.compiler.CommandLineCompiler;
+import net.sf.antcontrib.cpptasks.compiler.Compiler;
+import net.sf.antcontrib.cpptasks.compiler.Processor;
+import net.sf.antcontrib.cpptasks.gcc.GccCCompiler;
+import net.sf.antcontrib.cpptasks.types.CompilerArgument;
+import net.sf.antcontrib.cpptasks.types.ConditionalPath;
+import net.sf.antcontrib.cpptasks.types.DefineSet;
+import net.sf.antcontrib.cpptasks.types.IncludePath;
+import net.sf.antcontrib.cpptasks.types.SystemIncludePath;
+import net.sf.antcontrib.cpptasks.types.UndefineArgument;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.types.EnumeratedAttribute;
+import org.apache.tools.ant.*;
+/**
+ * A compiler definition. compiler elements may be placed either as children of
+ * a cc element or the project element. A compiler element with an id attribute
+ * may be referenced from compiler elements with refid or extends attributes.
+ *
+ * @author Adam Murdoch
+ */
+public final class CompilerDef extends ProcessorDef {
+ /**
+ * Enumerated attribute with the values "none", "severe", "default",
+ * "production", "diagnostic", and "failtask".
+ */
+ public static class WarningLevel extends EnumeratedAttribute {
+ public String[] getValues() {
+ return new String[]{"none", "severe", "default", "production",
+ "diagnostic", "aserror"};
+ }
+ }
+ /** The source file sets. */
+ private final Vector defineSets = new Vector();
+ private Boolean exceptions;
+ private Boolean rtti;
+ private final Vector includePaths = new Vector();
+ private Boolean multithreaded;
+ private final Vector precompileDefs = new Vector();
+ private final Vector sysIncludePaths = new Vector();
+ private OptimizationEnum optimization;
+ private int warnings = -1;
+ private Boolean defaultflag = new Boolean(true);
+ public CompilerDef() {
+ }
+ /**
+ * Adds a compiler command-line arg.
+ */
+ public void addConfiguredCompilerArg(CompilerArgument arg) {
+ if (isReference()) {
+ throw noChildrenAllowed();
+ }
+ addConfiguredProcessorArg(arg);
+ }
+ /**
+ * Adds a compiler command-line arg.
+ */
+ public void addConfiguredCompilerParam(CompilerParam param) {
+ if (isReference()) {
+ throw noChildrenAllowed();
+ }
+ addConfiguredProcessorParam(param);
+ }
+ /**
+ * Adds a defineset.
+ */
+ public void addConfiguredDefineset(DefineSet defs) {
+ if (defs == null) {
+ throw new NullPointerException("defs");
+ }
+ if (isReference()) {
+ throw noChildrenAllowed();
+ }
+ defineSets.addElement(defs);
+ }
+ /**
+ * Creates an include path.
+ */
+ public IncludePath createIncludePath() {
+ Project p = getProject();
+ if (p == null) {
+ throw new java.lang.IllegalStateException("project must be set");
+ }
+ if (isReference()) {
+ throw noChildrenAllowed();
+ }
+ IncludePath path = new IncludePath(p);
+ includePaths.addElement(path);
+ return path;
+ }
+ /**
+ * Add a <includepath>or <sysincludepath> if specify the file
+ * attribute
+ *
+ * @throws BuildException
+ * if the specify file not exist
+ */
+ protected void loadFile(Vector activePath,File file) throws BuildException {
+ FileReader fileReader;
+ BufferedReader in;
+ String str;
+ if (! file.exists()){
+ throw new BuildException("The file " + file + " is not existed");
+ }
+ try {
+ fileReader = new FileReader(file);
+ in = new BufferedReader(fileReader);
+ while ( (str = in.readLine()) != null ){
+ if(str.trim() == ""){
+ continue ;
+ }
+ str = getProject().replaceProperties(str);
+ activePath.addElement(str.trim());
+ }
+ }
+ catch(Exception e){
+ throw new BuildException(e.getMessage());
+ }
+ }
+
+ /**
+ * Specifies precompilation prototype file and exclusions.
+ *
+ */
+ public PrecompileDef createPrecompile() throws BuildException {
+ Project p = getProject();
+ if (isReference()) {
+ throw noChildrenAllowed();
+ }
+ PrecompileDef precomp = new PrecompileDef();
+ precomp.setProject(p);
+ precompileDefs.addElement(precomp);
+ return precomp;
+ }
+ /**
+ * Creates a system include path. Locations and timestamps of files located
+ * using the system include paths are not used in dependency analysis.
+ *
+ *
+ * Standard include locations should not be specified. The compiler
+ * adapters should recognized the settings from the appropriate environment
+ * variables or configuration files.
+ */
+ public SystemIncludePath createSysIncludePath() {
+ Project p = getProject();
+ if (p == null) {
+ throw new java.lang.IllegalStateException("project must be set");
+ }
+ if (isReference()) {
+ throw noChildrenAllowed();
+ }
+ SystemIncludePath path = new SystemIncludePath(p);
+ sysIncludePaths.addElement(path);
+ return path;
+ }
+ public void execute() throws org.apache.tools.ant.BuildException {
+ throw new org.apache.tools.ant.BuildException(
+ "Not an actual task, but looks like one for documentation purposes");
+ }
+ public UndefineArgument[] getActiveDefines() {
+ Project p = getProject();
+ if (p == null) {
+ throw new java.lang.IllegalStateException(
+ "project must be set before this call");
+ }
+ if (isReference()) {
+ return ((CompilerDef) getCheckedRef(CompilerDef.class,
+ "CompilerDef")).getActiveDefines();
+ }
+ Vector actives = new Vector();
+ for (int i = 0; i < defineSets.size(); i++) {
+ DefineSet currentSet = (DefineSet) defineSets.elementAt(i);
+ UndefineArgument[] defines = currentSet.getDefines();
+ for (int j = 0; j < defines.length; j++) {
+ if (defines[j].isActive(p)) {
+ actives.addElement(defines[j]);
+ }
+ }
+ }
+ UndefineArgument[] retval = new UndefineArgument[actives.size()];
+ actives.copyInto(retval);
+ return retval;
+ }
+ /**
+ * Returns the compiler-specific include path.
+ */
+ public String[] getActiveIncludePaths() {
+ if (isReference()) {
+ return ((CompilerDef) getCheckedRef(CompilerDef.class,
+ "CompilerDef")).getActiveIncludePaths();
+ }
+ return getActivePaths(includePaths);
+ }
+ private String[] getActivePaths(Vector paths) {
+ Project p = getProject();
+ if (p == null) {
+ throw new java.lang.IllegalStateException("project not set");
+ }
+ Vector activePaths = new Vector(paths.size());
+ for (int i = 0; i < paths.size(); i++) {
+ ConditionalPath path = (ConditionalPath) paths.elementAt(i);
+ if (path.isActive(p)) {
+ if (path.getFile() == null) {
+ String[] pathEntries = path.list();
+ for (int j = 0; j < pathEntries.length; j++) {
+ activePaths.addElement(pathEntries[j]);
+ }
+ }
+ else {
+ loadFile(activePaths, path.getFile());
+ }
+ }
+ }
+ String[] pathNames = new String[activePaths.size()];
+ activePaths.copyInto(pathNames);
+ return pathNames;
+ }
+ public PrecompileDef getActivePrecompile(CompilerDef ccElement) {
+ if (isReference()) {
+ return ((CompilerDef) getCheckedRef(CompilerDef.class,
+ "CompilerDef")).getActivePrecompile(ccElement);
+ }
+ PrecompileDef current = null;
+ Enumeration enumPrecompilerDef = precompileDefs.elements();
+ while (enumPrecompilerDef.hasMoreElements()) {
+ current = (PrecompileDef) enumPrecompilerDef.nextElement();
+ if (current.isActive()) {
+ return current;
+ }
+ }
+ CompilerDef extendedDef = (CompilerDef) getExtends();
+ if (extendedDef != null) {
+ current = extendedDef.getActivePrecompile(null);
+ if (current != null) {
+ return current;
+ }
+ }
+ if (ccElement != null && getInherit()) {
+ return ccElement.getActivePrecompile(null);
+ }
+ return null;
+ }
+ public String[] getActiveSysIncludePaths() {
+ if (isReference()) {
+ return ((CompilerDef) getCheckedRef(CompilerDef.class,
+ "CompilerDef")).getActiveSysIncludePaths();
+ }
+ return getActivePaths(sysIncludePaths);
+ }
+ public final boolean getExceptions(CompilerDef[] defaultProviders, int index) {
+ if (isReference()) {
+ return ((CompilerDef) getCheckedRef(CompilerDef.class,
+ "CompilerDef")).getExceptions(defaultProviders, index);
+ }
+ if (exceptions != null) {
+ return exceptions.booleanValue();
+ } else {
+ if (defaultProviders != null && index < defaultProviders.length) {
+ return defaultProviders[index].getExceptions(defaultProviders,
+ index + 1);
+ }
+ }
+ return false;
+ }
+ public final Boolean getRtti(CompilerDef[] defaultProviders, int index) {
+ if (isReference()) {
+ return ((CompilerDef) getCheckedRef(CompilerDef.class,
+ "CompilerDef")).getRtti(defaultProviders, index);
+ }
+ if (rtti != null) {
+ return rtti;
+ } else {
+ if (defaultProviders != null && index < defaultProviders.length) {
+ return defaultProviders[index].getRtti(defaultProviders,
+ index + 1);
+ }
+ }
+ return null;
+ }
+ public final Boolean getDefaultflag(CompilerDef[] defaultProviders, int index) {
+ if (isReference()) {
+ return ((CompilerDef) getCheckedRef(CompilerDef.class,
+ "CompilerDef")).getDefaultflag(defaultProviders, index);
+ }
+ return defaultflag;
+ }
+ public final OptimizationEnum getOptimization(CompilerDef[] defaultProviders, int index) {
+ if (isReference()) {
+ return ((CompilerDef) getCheckedRef(CompilerDef.class,
+ "CompilerDef")).getOptimization(defaultProviders, index);
+ }
+ if (optimization != null) {
+ return optimization;
+ } else {
+ if (defaultProviders != null && index < defaultProviders.length) {
+ return defaultProviders[index].getOptimization(defaultProviders,
+ index + 1);
+ }
+ }
+ return null;
+ }
+
+ public boolean getMultithreaded(CompilerDef[] defaultProviders, int index) {
+ if (isReference()) {
+ return ((CompilerDef) getCheckedRef(CompilerDef.class,
+ "CompilerDef")).getMultithreaded(defaultProviders, index);
+ }
+ if (multithreaded != null) {
+ return multithreaded.booleanValue();
+ } else {
+ if (defaultProviders != null && index < defaultProviders.length) {
+ return defaultProviders[index].getMultithreaded(
+ defaultProviders, index + 1);
+ }
+ }
+ return true;
+ }
+ public Processor getProcessor() {
+ Processor processor = super.getProcessor();
+ if (processor == null) {
+ processor = GccCCompiler.getInstance();
+ }
+ if (getLibtool() && processor instanceof CommandLineCompiler) {
+ CommandLineCompiler compiler = (CommandLineCompiler) processor;
+ processor = compiler.getLibtoolCompiler();
+ }
+ return processor;
+ }
+ public int getWarnings(CompilerDef[] defaultProviders, int index) {
+ if (isReference()) {
+ return ((CompilerDef) getCheckedRef(CompilerDef.class,
+ "CompilerDef")).getWarnings(defaultProviders, index);
+ }
+ if (warnings == -1) {
+ if (defaultProviders != null && index < defaultProviders.length) {
+ return defaultProviders[index].getWarnings(defaultProviders,
+ index + 1);
+ }
+ }
+ return warnings;
+ }
+ /**
+ * Sets the default compiler adapter. Use the "name" attribute when the
+ * compiler is a supported compiler.
+ *
+ * @param classname
+ * fully qualified classname which implements CompilerAdapter
+ */
+ public void setClassname(String classname) throws BuildException {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ super.setClassname(classname);
+ Processor proc = getProcessor();
+ if (!(proc instanceof Compiler)) {
+ throw new BuildException(classname + " does not implement Compiler");
+ }
+ }
+ /**
+ * Enables or disables exception support.
+ *
+ * @param exceptions
+ * if true, exceptions are supported.
+ *
+ */
+ public void setExceptions(boolean exceptions) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ this.exceptions = booleanValueOf(exceptions);
+ }
+
+ /**
+ * Enables or disables run-time type information.
+ *
+ * @param rtti
+ * if true, run-time type information is supported.
+ *
+ */
+ public void setRtti(boolean rtti) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ this.rtti = booleanValueOf(rtti);
+ }
+
+ /**
+ * Enables or disables generation of multithreaded code. Unless specified,
+ * multithreaded code generation is enabled.
+ *
+ * @param multi
+ * If true, generated code may be multithreaded.
+ */
+ public void setMultithreaded(boolean multithreaded) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ this.multithreaded = booleanValueOf(multithreaded);
+ }
+ /**
+ * Sets compiler type.
+ *
+ *
+ * <table width="100%" border="1"> <thead>Supported compilers </thead>
+ * <tr>
+ * <td>gcc (default)</td>
+ * <td>GCC C++ compiler</td>
+ * </tr>
+ * <tr>
+ * <td>g++</td>
+ * <td>GCC C++ compiler</td>
+ * </tr>
+ * <tr>
+ * <td>c++</td>
+ * <td>GCC C++ compiler</td>
+ * </tr>
+ * <tr>
+ * <td>g77</td>
+ * <td>GNU Fortran compiler</td>
+ * </tr>
+ * <tr>
+ * <td>msvc</td>
+ * <td>Microsoft Visual C++</td>
+ * </tr>
+ * <tr>
+ * <td>bcc</td>
+ * <td>Borland C++ Compiler</td>
+ * </tr>
+ * <tr>
+ * <td>msrc</td>
+ * <td>Microsoft Resource Compiler</td>
+ * </tr>
+ * <tr>
+ * <td>brc</td>
+ * <td>Borland Resource Compiler</td>
+ * </tr>
+ * <tr>
+ * <td>df</td>
+ * <td>Compaq Visual Fortran Compiler</td>
+ * </tr>
+ * <tr>
+ * <td>midl</td>
+ * <td>Microsoft MIDL Compiler</td>
+ * </tr>
+ * <tr>
+ * <td>icl</td>
+ * <td>Intel C++ compiler for Windows (IA-32)</td>
+ * </tr>
+ * <tr>
+ * <td>ecl</td>
+ * <td>Intel C++ compiler for Windows (IA-64)</td>
+ * </tr>
+ * <tr>
+ * <td>icc</td>
+ * <td>Intel C++ compiler for Linux (IA-32)</td>
+ * </tr>
+ * <tr>
+ * <td>ecc</td>
+ * <td>Intel C++ compiler for Linux (IA-64)</td>
+ * </tr>
+ * <tr>
+ * <td>CC</td>
+ * <td>Sun ONE C++ compiler</td>
+ * </tr>
+ * <tr>
+ * <td>aCC</td>
+ * <td>HP aC++ C++ Compiler</td>
+ * </tr>
+ * <tr>
+ * <td>os390</td>
+ * <td>OS390 C Compiler</td>
+ * </tr>
+ * <tr>
+ * <td>os400</td>
+ * <td>Icc Compiler</td>
+ * </tr>
+ * <tr>
+ * <td>sunc89</td>
+ * <td>Sun C89 C Compiler</td>
+ * </tr>
+ * <tr>
+ * <td>xlC</td>
+ * <td>VisualAge C Compiler</td>
+ * </tr>
+ * </table>
+ *
+ */
+ public void setName(CompilerEnum name) throws BuildException {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ Compiler compiler = name.getCompiler();
+ setProcessor(compiler);
+ }
+ protected void setProcessor(Processor proc) throws BuildException {
+ try {
+ super.setProcessor((Compiler) proc);
+ } catch (ClassCastException ex) {
+ throw new BuildException(ex);
+ }
+ }
+ /**
+ * Enumerated attribute with the values "none", "severe", "default",
+ * "production", "diagnostic", and "failtask".
+ */
+ public void setWarnings(CompilerDef.WarningLevel level) {
+ warnings = level.getIndex();
+ }
+ /**
+ * Sets optimization level.
+ *
+ * @param value optimization level
+ */
+ public void setOptimize(OptimizationEnum value) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ this.optimization = value;
+ }
+ /**
+ * Enables or disables default flags.
+ *
+ * @param defaultflag
+ * if true, default flags will add to command line.
+ *
+ */
+ public void setDefaultflag(boolean defaultflag) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ this.defaultflag = booleanValueOf(defaultflag);
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CompilerEnum.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CompilerEnum.java
new file mode 100644
index 0000000..a017243
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CompilerEnum.java
@@ -0,0 +1,221 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+import net.sf.antcontrib.cpptasks.arm.ADSCCompiler;
+import net.sf.antcontrib.cpptasks.borland.BorlandCCompiler;
+import net.sf.antcontrib.cpptasks.borland.BorlandResourceCompiler;
+import net.sf.antcontrib.cpptasks.compaq.CompaqVisualFortranCompiler;
+import net.sf.antcontrib.cpptasks.compiler.Compiler;
+import net.sf.antcontrib.cpptasks.devstudio.DevStudioCCompiler;
+import net.sf.antcontrib.cpptasks.devstudio.DevStudioMIDLCompiler;
+import net.sf.antcontrib.cpptasks.devstudio.DevStudioResourceCompiler;
+import net.sf.antcontrib.cpptasks.gcc.GccCCompiler;
+import net.sf.antcontrib.cpptasks.hp.aCCCompiler;
+import net.sf.antcontrib.cpptasks.ibm.VisualAgeCCompiler;
+import net.sf.antcontrib.cpptasks.intel.IntelLinux32CCompiler;
+import net.sf.antcontrib.cpptasks.intel.IntelLinux64CCompiler;
+import net.sf.antcontrib.cpptasks.intel.IntelWin32CCompiler;
+import net.sf.antcontrib.cpptasks.intel.IntelWin64CCompiler;
+import net.sf.antcontrib.cpptasks.os390.OS390CCompiler;
+import net.sf.antcontrib.cpptasks.os400.IccCompiler;
+import net.sf.antcontrib.cpptasks.sun.C89CCompiler;
+import net.sf.antcontrib.cpptasks.sun.ForteCCCompiler;
+import net.sf.antcontrib.cpptasks.ti.ClxxCCompiler;
+
+import org.apache.tools.ant.types.EnumeratedAttribute;
+/**
+ * Enumeration of supported compilers
+ *
+ * <table width="100%" border="1"> <thead>Supported compilers </thead>
+ * <tr>
+ * <td>gcc (default)</td>
+ * <td>GCC C++ compiler</td>
+ * </tr>
+ * <tr>
+ * <td>g++</td>
+ * <td>GCC C++ compiler</td>
+ * </tr>
+ * <tr>
+ * <td>c++</td>
+ * <td>GCC C++ compiler</td>
+ * </tr>
+ * <tr>
+ * <td>g77</td>
+ * <td>GNU FORTRAN compiler</td>
+ * </tr>
+ * <tr>
+ * <td>msvc</td>
+ * <td>Microsoft Visual C++</td>
+ * </tr>
+ * <tr>
+ * <td>bcc</td>
+ * <td>Borland C++ Compiler</td>
+ * </tr>
+ * <tr>
+ * <td>msrc</td>
+ * <td>Microsoft Resource Compiler</td>
+ * </tr>
+ * <tr>
+ * <td>brc</td>
+ * <td>Borland Resource Compiler</td>
+ * </tr>
+ * <tr>
+ * <td>df</td>
+ * <td>Compaq Visual Fortran Compiler</td>
+ * </tr>
+ * <tr>
+ * <td>midl</td>
+ * <td>Microsoft MIDL Compiler</td>
+ * </tr>
+ * <tr>
+ * <td>icl</td>
+ * <td>Intel C++ compiler for Windows (IA-32)</td>
+ * </tr>
+ * <tr>
+ * <td>ecl</td>
+ * <td>Intel C++ compiler for Windows (IA-64)</td>
+ * </tr>
+ * <tr>
+ * <td>icc</td>
+ * <td>Intel C++ compiler for Linux (IA-32)</td>
+ * </tr>
+ * <tr>
+ * <td>ecc</td>
+ * <td>Intel C++ compiler for Linux (IA-64)</td>
+ * </tr>
+ * <tr>
+ * <td>CC</td>
+ * <td>Sun ONE C++ compiler</td>
+ * </tr>
+ * <tr>
+ * <td>aCC</td>
+ * <td>HP aC++ C++ Compiler</td>
+ * </tr>
+ * <tr>
+ * <td>os390</td>
+ * <td>OS390 C Compiler</td>
+ * </tr>
+ * <tr>
+ * <td>os400</td>
+ * <td>Icc Compiler</td>
+ * </tr>
+ * <tr>
+ * <td>sunc89</td>
+ * <td>Sun C89 C Compiler</td>
+ * </tr>
+ * <tr>
+ * <td>xlC</td>
+ * <td>VisualAge C Compiler</td>
+ * </tr>
+ * <tr>
+ * <td>cl6x</td>
+ * <td>TI TMS320C6000 Optimizing Compiler</td>
+ * </tr>
+ * <tr>
+ * <td>cl55</td>
+ * <td>TI TMS320C55x Optimizing C/C++ Compiler</td>
+ * </tr>
+ * <tr>
+ * <td>armcpp</td>
+ * <td>ARM 32-bit C++ compiler</td>
+ * </tr>
+ * <tr>
+ * <td>armcc</td>
+ * <td>ARM 32-bit C compiler</td>
+ * </tr>
+ * <tr>
+ * <td>tcpp</td>
+ * <td>ARM 16-bit C++ compiler</td>
+ * </tr>
+ * <tr>
+ * <td>tcc</td>
+ * <td>ARM 16-bit C compiler</td>
+ * </tr>
+ * </table>
+ *
+ * @author Curt Arnold
+ *
+ */
+public class CompilerEnum extends EnumeratedAttribute {
+ private final static ProcessorEnumValue[] compilers = new ProcessorEnumValue[]{
+ new ProcessorEnumValue("gcc", GccCCompiler.getInstance()),
+ new ProcessorEnumValue("g++", GccCCompiler.getGppInstance()),
+ new ProcessorEnumValue("c++", GccCCompiler.getCppInstance()),
+ new ProcessorEnumValue("g77", GccCCompiler.getG77Instance()),
+ new ProcessorEnumValue("msvc", DevStudioCCompiler.getInstance()),
+ new ProcessorEnumValue("bcc", BorlandCCompiler.getInstance()),
+ new ProcessorEnumValue("msrc", DevStudioResourceCompiler
+ .getInstance()),
+ new ProcessorEnumValue("brc", BorlandResourceCompiler.getInstance()),
+ new ProcessorEnumValue("df", CompaqVisualFortranCompiler
+ .getInstance()),
+ new ProcessorEnumValue("midl", DevStudioMIDLCompiler.getInstance()),
+ new ProcessorEnumValue("icl", IntelWin32CCompiler.getInstance()),
+ new ProcessorEnumValue("ecl", IntelWin64CCompiler.getInstance()),
+ new ProcessorEnumValue("icc", IntelLinux32CCompiler.getInstance()),
+ new ProcessorEnumValue("ecc", IntelLinux64CCompiler.getInstance()),
+ new ProcessorEnumValue("CC", ForteCCCompiler.getInstance()),
+ new ProcessorEnumValue("aCC", aCCCompiler.getInstance()),
+ new ProcessorEnumValue("os390", OS390CCompiler.getInstance()),
+ new ProcessorEnumValue("os400", IccCompiler.getInstance()),
+ new ProcessorEnumValue("sunc89", C89CCompiler.getInstance()),
+ new ProcessorEnumValue("xlC", VisualAgeCCompiler.getInstance()),
+ new ProcessorEnumValue("cl6x", ClxxCCompiler.getCl6xInstance()),
+ new ProcessorEnumValue("cl55", ClxxCCompiler.getCl55Instance()),
+ new ProcessorEnumValue("armcc", ADSCCompiler.getArmCC()),
+ new ProcessorEnumValue("armcpp", ADSCCompiler.getArmCpp()),
+ new ProcessorEnumValue("tcc", ADSCCompiler.getThumbCC()),
+ new ProcessorEnumValue("tcpp", ADSCCompiler.getThumbCpp()),
+ // userdefined
+ //new ProcessorEnumValue("userdefine", UserdefineCompiler.getInstance()),
+ // GCC Cross Compilers
+ new ProcessorEnumValue(
+ "sparc-sun-solaris2-gcc",
+ net.sf.antcontrib.cpptasks.gcc.cross.sparc_sun_solaris2.GccCCompiler
+ .getInstance()),
+ new ProcessorEnumValue(
+ "sparc-sun-solaris2-g++",
+ net.sf.antcontrib.cpptasks.gcc.cross.sparc_sun_solaris2.GccCCompiler
+ .getGppInstance()),
+ new ProcessorEnumValue(
+ "sparc-sun-solaris2-c++",
+ net.sf.antcontrib.cpptasks.gcc.cross.sparc_sun_solaris2.GccCCompiler
+ .getCppInstance()),
+ new ProcessorEnumValue(
+ "sparc-sun-solaris2-g77",
+ net.sf.antcontrib.cpptasks.gcc.cross.sparc_sun_solaris2.GccCCompiler
+ .getG77Instance()),
+ // GCC Cross Compilers
+ new ProcessorEnumValue("gcc-cross",
+ net.sf.antcontrib.cpptasks.gcc.cross.GccCCompiler
+ .getInstance()),
+ new ProcessorEnumValue("g++-cross",
+ net.sf.antcontrib.cpptasks.gcc.cross.GccCCompiler
+ .getGppInstance()),
+ new ProcessorEnumValue("c++-cross",
+ net.sf.antcontrib.cpptasks.gcc.cross.GccCCompiler
+ .getCppInstance()),
+ new ProcessorEnumValue("g77-cross",
+ net.sf.antcontrib.cpptasks.gcc.cross.GccCCompiler
+ .getG77Instance()),};
+ public Compiler getCompiler() {
+ return (Compiler) compilers[getIndex()].getProcessor();
+ }
+ public String[] getValues() {
+ return ProcessorEnumValue.getValues(compilers);
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CompilerParam.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CompilerParam.java
new file mode 100644
index 0000000..82eb6ee
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CompilerParam.java
@@ -0,0 +1,33 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+/*******************************************************************************
+ * Place class description here.
+ *
+ * @author inger
+ * @author <additional author>
+ *
+ * @since
+ ******************************************************************************/
+public class CompilerParam extends ProcessorParam {
+ public CompilerParam() {
+ }
+ public void execute() throws org.apache.tools.ant.BuildException {
+ throw new org.apache.tools.ant.BuildException(
+ "Not an actual task, but looks like one for documentation purposes");
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/DependencyInfo.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/DependencyInfo.java
new file mode 100644
index 0000000..429d2b0
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/DependencyInfo.java
@@ -0,0 +1,86 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+import java.util.Vector;
+/**
+ * @author Curt Arnold
+ */
+public final class DependencyInfo {
+ /**
+ * Last modified time of this file or anything that it depends on.
+ *
+ * Not persisted since almost any change could invalidate it. Initialized
+ * to long.MIN_VALUE on construction.
+ */
+ private long compositeLastModified;
+ private/* final */String includePathIdentifier;
+ private/* final */String[] includes;
+ private/* final */String source;
+ private/* final */long sourceLastModified;
+ private/* final */String[] sysIncludes;
+ public DependencyInfo(String includePathIdentifier, String source,
+ long sourceLastModified, Vector includes, Vector sysIncludes) {
+ if (source == null) {
+ throw new NullPointerException("source");
+ }
+ if (includePathIdentifier == null) {
+ throw new NullPointerException("includePathIdentifier");
+ }
+ this.source = source;
+ this.sourceLastModified = sourceLastModified;
+ this.includePathIdentifier = includePathIdentifier;
+ this.includes = new String[includes.size()];
+ if (includes.size() == 0) {
+ compositeLastModified = sourceLastModified;
+ } else {
+ includes.copyInto(this.includes);
+ compositeLastModified = Long.MIN_VALUE;
+ }
+ this.sysIncludes = new String[sysIncludes.size()];
+ sysIncludes.copyInto(this.sysIncludes);
+ }
+ /**
+ * Returns the latest modification date of the source or anything that it
+ * depends on.
+ *
+ * @returns the composite lastModified time, returns Long.MIN_VALUE if not
+ * set
+ */
+ public long getCompositeLastModified() {
+ return compositeLastModified;
+ }
+ public String getIncludePathIdentifier() {
+ return includePathIdentifier;
+ }
+ public String[] getIncludes() {
+ String[] includesClone = (String[]) includes.clone();
+ return includesClone;
+ }
+ public String getSource() {
+ return source;
+ }
+ public long getSourceLastModified() {
+ return sourceLastModified;
+ }
+ public String[] getSysIncludes() {
+ String[] sysIncludesClone = (String[]) sysIncludes.clone();
+ return sysIncludesClone;
+ }
+ public void setCompositeLastModified(long lastMod) {
+ compositeLastModified = lastMod;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/DependencyTable.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/DependencyTable.java
new file mode 100644
index 0000000..3cbee7a
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/DependencyTable.java
@@ -0,0 +1,609 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Vector;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import net.sf.antcontrib.cpptasks.compiler.CompilerConfiguration;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+/**
+ * @author Curt Arnold
+ */
+public final class DependencyTable {
+ /**
+ * This class handles populates the TargetHistory hashtable in response to
+ * SAX parse events
+ */
+ private class DependencyTableHandler extends DefaultHandler {
+ private File baseDir;
+ private final DependencyTable dependencyTable;
+ private String includePath;
+ private Vector includes;
+ private String source;
+ private long sourceLastModified;
+ private Vector sysIncludes;
+ /**
+ * Constructor
+ *
+ * @param history
+ * hashtable of TargetHistory keyed by output name
+ * @param outputFiles
+ * existing files in output directory
+ */
+ private DependencyTableHandler(DependencyTable dependencyTable,
+ File baseDir) {
+ this.dependencyTable = dependencyTable;
+ this.baseDir = baseDir;
+ includes = new Vector();
+ sysIncludes = new Vector();
+ source = null;
+ }
+ public void endElement(String namespaceURI, String localName,
+ String qName) throws SAXException {
+ //
+ // if </source> then
+ // create Dependency object and add to hashtable
+ // if corresponding source file exists and
+ // has the same timestamp
+ //
+ if (qName.equals("source")) {
+ if (source != null && includePath != null) {
+ File existingFile = new File(baseDir, source);
+ //
+ // if the file exists and the time stamp is right
+ // preserve the dependency info
+ if (existingFile.exists()) {
+ //
+ // would have expected exact matches
+ // but was seeing some unexpected difference by
+ // a few tens of milliseconds, as long
+ // as the times are within a second
+ long existingLastModified = existingFile.lastModified();
+ long diff = existingLastModified - sourceLastModified;
+ if (diff >= -500 && diff <= 500) {
+ DependencyInfo dependInfo = new DependencyInfo(
+ includePath, source, sourceLastModified,
+ includes, sysIncludes);
+ dependencyTable.putDependencyInfo(source,
+ dependInfo);
+ }
+ }
+ source = null;
+ includes.setSize(0);
+ }
+ } else {
+ //
+ // this causes any <source> elements outside the
+ // scope of an <includePath> to be discarded
+ //
+ if (qName.equals("includePath")) {
+ includePath = null;
+ }
+ }
+ }
+ /**
+ * startElement handler
+ */
+ public void startElement(String namespaceURI, String localName,
+ String qName, Attributes atts) throws SAXException {
+ //
+ // if includes, then add relative file name to vector
+ //
+ if (qName.equals("include")) {
+ includes.addElement(atts.getValue("file"));
+ } else {
+ if (qName.equals("sysinclude")) {
+ sysIncludes.addElement(atts.getValue("file"));
+ } else {
+ //
+ // if source then
+ // capture source file name,
+ // modification time and reset includes vector
+ //
+ if (qName.equals("source")) {
+ source = atts.getValue("file");
+ sourceLastModified = Long.parseLong(atts
+ .getValue("lastModified"), 16);
+ includes.setSize(0);
+ sysIncludes.setSize(0);
+ } else {
+ if (qName.equals("includePath")) {
+ includePath = atts.getValue("signature");
+ }
+ }
+ }
+ }
+ }
+ }
+ public abstract class DependencyVisitor {
+ /**
+ * Previews all the children of this source file.
+ *
+ * May be called multiple times as DependencyInfo's for children are
+ * filled in.
+ *
+ * @return true to continue towards recursion into included files
+ */
+ public abstract boolean preview(DependencyInfo parent,
+ DependencyInfo[] children);
+ /**
+ * Called if the dependency depth exhausted the stack.
+ */
+ public abstract void stackExhausted();
+ /**
+ * Visits the dependency info.
+ *
+ * @returns true to continue towards recursion into included files
+ */
+ public abstract boolean visit(DependencyInfo dependInfo);
+ }
+ public class TimestampChecker extends DependencyVisitor {
+ private boolean noNeedToRebuild;
+ private long outputLastModified;
+ private boolean rebuildOnStackExhaustion;
+ public TimestampChecker(final long outputLastModified,
+ boolean rebuildOnStackExhaustion) {
+ this.outputLastModified = outputLastModified;
+ noNeedToRebuild = true;
+ this.rebuildOnStackExhaustion = rebuildOnStackExhaustion;
+ }
+ public boolean getMustRebuild() {
+ return !noNeedToRebuild;
+ }
+ public boolean preview(DependencyInfo parent, DependencyInfo[] children) {
+ int withCompositeTimes = 0;
+ long parentCompositeLastModified = parent.getSourceLastModified();
+ for (int i = 0; i < children.length; i++) {
+ if (children[i] != null) {
+ //
+ // expedient way to determine if a child forces us to
+ // rebuild
+ //
+ visit(children[i]);
+ long childCompositeLastModified = children[i]
+ .getCompositeLastModified();
+ if (childCompositeLastModified != Long.MIN_VALUE) {
+ withCompositeTimes++;
+ if (childCompositeLastModified > parentCompositeLastModified) {
+ parentCompositeLastModified = childCompositeLastModified;
+ }
+ }
+ }
+ }
+ if (withCompositeTimes == children.length) {
+ parent.setCompositeLastModified(parentCompositeLastModified);
+ }
+ //
+ // may have been changed by an earlier call to visit()
+ //
+ return noNeedToRebuild;
+ }
+ public void stackExhausted() {
+ if (rebuildOnStackExhaustion) {
+ noNeedToRebuild = false;
+ }
+ }
+ public boolean visit(DependencyInfo dependInfo) {
+ if (noNeedToRebuild) {
+ if (dependInfo.getSourceLastModified() > outputLastModified
+ || dependInfo.getCompositeLastModified() > outputLastModified) {
+ noNeedToRebuild = false;
+ }
+ }
+ //
+ // only need to process the children if
+ // it has not yet been determined whether
+ // we need to rebuild and the composite modified time
+ // has not been determined for this file
+ return noNeedToRebuild
+ && dependInfo.getCompositeLastModified() == Long.MIN_VALUE;
+ }
+ }
+ private/* final */File baseDir;
+ private String baseDirPath;
+ /**
+ * a hashtable of DependencyInfo[] keyed by output file name
+ */
+ private final Hashtable dependencies = new Hashtable();
+ /** The file the cache was loaded from. */
+ private/* final */File dependenciesFile;
+ /** Flag indicating whether the cache should be written back to file. */
+ private boolean dirty;
+ /**
+ * Creates a target history table from dependencies.xml in the prject
+ * directory, if it exists. Otherwise, initializes the dependencies empty.
+ *
+ * @param task
+ * task used for logging history load errors
+ * @param baseDir
+ * output directory for task
+ */
+ public DependencyTable(File baseDir) {
+ if (baseDir == null) {
+ throw new NullPointerException("baseDir");
+ }
+ this.baseDir = baseDir;
+ try {
+ baseDirPath = baseDir.getCanonicalPath();
+ } catch (IOException ex) {
+ baseDirPath = baseDir.toString();
+ }
+ dirty = false;
+ //
+ // load any existing dependencies from file
+ dependenciesFile = new File(baseDir, "dependencies.xml");
+ }
+ public void commit(CCTask task) {
+ //
+ // if not dirty, no need to update file
+ //
+ if (dirty) {
+ //
+ // walk through dependencies to get vector of include paths
+ // identifiers
+ //
+ Vector includePaths = getIncludePaths();
+ //
+ //
+ // write dependency file
+ //
+ try {
+ FileOutputStream outStream = new FileOutputStream(
+ dependenciesFile);
+ OutputStreamWriter streamWriter;
+ //
+ // Early VM's may not have UTF-8 support
+ // fallback to default code page which
+ // "should" be okay unless there are
+ // non ASCII file names
+ String encodingName = "UTF-8";
+ try {
+ streamWriter = new OutputStreamWriter(outStream, "UTF-8");
+ } catch (UnsupportedEncodingException ex) {
+ streamWriter = new OutputStreamWriter(outStream);
+ encodingName = streamWriter.getEncoding();
+ }
+ BufferedWriter writer = new BufferedWriter(streamWriter);
+ writer.write("<?xml version='1.0' encoding='");
+ writer.write(encodingName);
+ writer.write("'?>\n");
+ writer.write("<dependencies>\n");
+ StringBuffer buf = new StringBuffer();
+ Enumeration includePathEnum = includePaths.elements();
+ while (includePathEnum.hasMoreElements()) {
+ writeIncludePathDependencies((String) includePathEnum
+ .nextElement(), writer, buf);
+ }
+ writer.write("</dependencies>\n");
+ writer.close();
+ dirty = false;
+ } catch (IOException ex) {
+ task.log("Error writing " + dependenciesFile.toString() + ":"
+ + ex.toString());
+ }
+ }
+ }
+ /**
+ * Returns an enumerator of DependencyInfo's
+ */
+ public Enumeration elements() {
+ return dependencies.elements();
+ }
+ /**
+ * This method returns a DependencyInfo for the specific source file and
+ * include path identifier
+ *
+ */
+ public DependencyInfo getDependencyInfo(String sourceRelativeName,
+ String includePathIdentifier) {
+ DependencyInfo dependInfo = null;
+ DependencyInfo[] dependInfos = (DependencyInfo[]) dependencies
+ .get(sourceRelativeName);
+ if (dependInfos != null) {
+ for (int i = 0; i < dependInfos.length; i++) {
+ dependInfo = dependInfos[i];
+ if (dependInfo.getIncludePathIdentifier().equals(
+ includePathIdentifier)) {
+ return dependInfo;
+ }
+ }
+ }
+ return null;
+ }
+ private Vector getIncludePaths() {
+ Vector includePaths = new Vector();
+ DependencyInfo[] dependInfos;
+ Enumeration dependenciesEnum = dependencies.elements();
+ while (dependenciesEnum.hasMoreElements()) {
+ dependInfos = (DependencyInfo[]) dependenciesEnum.nextElement();
+ for (int i = 0; i < dependInfos.length; i++) {
+ DependencyInfo dependInfo = dependInfos[i];
+ boolean matchesExisting = false;
+ final String dependIncludePath = dependInfo
+ .getIncludePathIdentifier();
+ Enumeration includePathEnum = includePaths.elements();
+ while (includePathEnum.hasMoreElements()) {
+ if (dependIncludePath.equals(includePathEnum.nextElement())) {
+ matchesExisting = true;
+ break;
+ }
+ }
+ if (!matchesExisting) {
+ includePaths.addElement(dependIncludePath);
+ }
+ }
+ }
+ return includePaths;
+ }
+ public void load() throws IOException, ParserConfigurationException,
+ SAXException {
+ dependencies.clear();
+ if (dependenciesFile.exists()) {
+ SAXParserFactory factory = SAXParserFactory.newInstance();
+ factory.setValidating(false);
+ SAXParser parser = factory.newSAXParser();
+ parser.parse(dependenciesFile, new DependencyTableHandler(this,
+ baseDir));
+ dirty = false;
+ }
+ }
+ /**
+ * Determines if the specified target needs to be rebuilt.
+ *
+ * This task may result in substantial IO as files are parsed to determine
+ * their dependencies
+ */
+ public boolean needsRebuild(CCTask task, TargetInfo target,
+ int dependencyDepth) {
+ // look at any files where the compositeLastModified
+ // is not known, but the includes are known
+ //
+ boolean mustRebuild = false;
+ CompilerConfiguration compiler = (CompilerConfiguration) target
+ .getConfiguration();
+ String includePathIdentifier = compiler.getIncludePathIdentifier();
+ File[] sources = target.getSources();
+ DependencyInfo[] dependInfos = new DependencyInfo[sources.length];
+ long outputLastModified = target.getOutput().lastModified();
+ //
+ // try to solve problem using existing dependency info
+ // (not parsing any new files)
+ //
+ DependencyInfo[] stack = new DependencyInfo[50];
+ boolean rebuildOnStackExhaustion = true;
+ if (dependencyDepth >= 0) {
+ if (dependencyDepth < 50) {
+ stack = new DependencyInfo[dependencyDepth];
+ }
+ rebuildOnStackExhaustion = false;
+ }
+ TimestampChecker checker = new TimestampChecker(outputLastModified,
+ rebuildOnStackExhaustion);
+ for (int i = 0; i < sources.length && !mustRebuild; i++) {
+ File source = sources[i];
+ String relative = CUtil.getRelativePath(baseDirPath, source);
+ DependencyInfo dependInfo = getDependencyInfo(relative,
+ includePathIdentifier);
+ if (dependInfo == null) {
+ task.log("Parsing " + relative, Project.MSG_VERBOSE);
+ dependInfo = parseIncludes(task, compiler, source);
+ }
+ walkDependencies(task, dependInfo, compiler, stack, checker);
+ mustRebuild = checker.getMustRebuild();
+ }
+ return mustRebuild;
+ }
+ public DependencyInfo parseIncludes(CCTask task,
+ CompilerConfiguration compiler, File source) {
+ DependencyInfo dependInfo = compiler.parseIncludes(task, baseDir,
+ source);
+ String relativeSource = CUtil.getRelativePath(baseDirPath, source);
+ putDependencyInfo(relativeSource, dependInfo);
+ return dependInfo;
+ }
+ private void putDependencyInfo(String key, DependencyInfo dependInfo) {
+ //
+ // optimistic, add new value
+ //
+ DependencyInfo[] old = (DependencyInfo[]) dependencies.put(key,
+ new DependencyInfo[]{dependInfo});
+ dirty = true;
+ //
+ // something was already there
+ //
+ if (old != null) {
+ //
+ // see if the include path matches a previous entry
+ // if so replace it
+ String includePathIdentifier = dependInfo
+ .getIncludePathIdentifier();
+ for (int i = 0; i < old.length; i++) {
+ DependencyInfo oldDepend = old[i];
+ if (oldDepend.getIncludePathIdentifier().equals(
+ includePathIdentifier)) {
+ old[i] = dependInfo;
+ dependencies.put(key, old);
+ return;
+ }
+ }
+ //
+ // no match prepend the new entry to the array
+ // of dependencies for the file
+ DependencyInfo[] combined = new DependencyInfo[old.length + 1];
+ combined[0] = dependInfo;
+ for (int i = 0; i < old.length; i++) {
+ combined[i + 1] = old[i];
+ }
+ dependencies.put(key, combined);
+ }
+ return;
+ }
+ public void walkDependencies(CCTask task, DependencyInfo dependInfo,
+ CompilerConfiguration compiler, DependencyInfo[] stack,
+ DependencyVisitor visitor) throws BuildException {
+ //
+ // visit this node
+ // if visit returns true then
+ // visit the referenced include and sysInclude dependencies
+ //
+ if (visitor.visit(dependInfo)) {
+ //
+ // find first null entry on stack
+ //
+ int stackPosition = -1;
+ for (int i = 0; i < stack.length; i++) {
+ if (stack[i] == null) {
+ stackPosition = i;
+ stack[i] = dependInfo;
+ break;
+ } else {
+ //
+ // if we have appeared early in the calling history
+ // then we didn't exceed the criteria
+ if (stack[i] == dependInfo) {
+ return;
+ }
+ }
+ }
+ if (stackPosition == -1) {
+ visitor.stackExhausted();
+ return;
+ }
+ //
+ // locate dependency infos
+ //
+ String[] includes = dependInfo.getIncludes();
+ String includePathIdentifier = compiler.getIncludePathIdentifier();
+ DependencyInfo[] includeInfos = new DependencyInfo[includes.length];
+ for (int i = 0; i < includes.length; i++) {
+ DependencyInfo includeInfo = getDependencyInfo(includes[i],
+ includePathIdentifier);
+ includeInfos[i] = includeInfo;
+ }
+ //
+ // preview with only the already available dependency infos
+ //
+ if (visitor.preview(dependInfo, includeInfos)) {
+ //
+ // now need to fill in the missing DependencyInfos
+ //
+ int missingCount = 0;
+ for (int i = 0; i < includes.length; i++) {
+ if (includeInfos[i] == null) {
+ missingCount++;
+ task.log("Parsing " + includes[i], Project.MSG_VERBOSE);
+ // If the include is part of a UNC don't go building a
+ // relative file name.
+ File src = includes[i].startsWith("\\\\") ? new File(
+ includes[i]) : new File(baseDir, includes[i]);
+ DependencyInfo includeInfo = parseIncludes(task,
+ compiler, src);
+ includeInfos[i] = includeInfo;
+ }
+ }
+ //
+ // if it passes a review the second time
+ // then recurse into all the children
+ if (missingCount == 0
+ || visitor.preview(dependInfo, includeInfos)) {
+ //
+ // recurse into
+ //
+ for (int i = 0; i < includeInfos.length; i++) {
+ DependencyInfo includeInfo = includeInfos[i];
+ walkDependencies(task, includeInfo, compiler, stack,
+ visitor);
+ }
+ }
+ }
+ stack[stackPosition] = null;
+ }
+ }
+ private void writeDependencyInfo(BufferedWriter writer, StringBuffer buf,
+ DependencyInfo dependInfo) throws IOException {
+ String[] includes = dependInfo.getIncludes();
+ String[] sysIncludes = dependInfo.getSysIncludes();
+ //
+ // if the includes have not been evaluted then
+ // it is not worth our time saving it
+ // and trying to distiguish between files with
+ // no dependencies and those with undetermined dependencies
+ buf.setLength(0);
+ buf.append(" <source file=\"");
+ buf.append(CUtil.xmlAttribEncode(dependInfo.getSource()));
+ buf.append("\" lastModified=\"");
+ buf.append(Long.toHexString(dependInfo.getSourceLastModified()));
+ buf.append("\">\n");
+ writer.write(buf.toString());
+ for (int i = 0; i < includes.length; i++) {
+ buf.setLength(0);
+ buf.append(" <include file=\"");
+ buf.append(CUtil.xmlAttribEncode(includes[i]));
+ buf.append("\"/>\n");
+ writer.write(buf.toString());
+ }
+ for (int i = 0; i < sysIncludes.length; i++) {
+ buf.setLength(0);
+ buf.append(" <sysinclude file=\"");
+ buf.append(CUtil.xmlAttribEncode(sysIncludes[i]));
+ buf.append("\"/>\n");
+ writer.write(buf.toString());
+ }
+ writer.write(" </source>\n");
+ return;
+ }
+ private void writeIncludePathDependencies(String includePathIdentifier,
+ BufferedWriter writer, StringBuffer buf) throws IOException {
+ //
+ // include path element
+ //
+ buf.setLength(0);
+ buf.append(" <includePath signature=\"");
+ buf.append(CUtil.xmlAttribEncode(includePathIdentifier));
+ buf.append("\">\n");
+ writer.write(buf.toString());
+ Enumeration dependenciesEnum = dependencies.elements();
+ while (dependenciesEnum.hasMoreElements()) {
+ DependencyInfo[] dependInfos = (DependencyInfo[]) dependenciesEnum
+ .nextElement();
+ for (int i = 0; i < dependInfos.length; i++) {
+ DependencyInfo dependInfo = dependInfos[i];
+ //
+ // if this is for the same include path
+ // then output the info
+ if (dependInfo.getIncludePathIdentifier().equals(
+ includePathIdentifier)) {
+ writeDependencyInfo(writer, buf, dependInfo);
+ }
+ }
+ }
+ writer.write(" </includePath>\n");
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/DistributerDef.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/DistributerDef.java
new file mode 100644
index 0000000..ee4f656
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/DistributerDef.java
@@ -0,0 +1,243 @@
+/*
+ *
+ * Copyright 2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+
+
+import org.apache.tools.ant.types.DataType;
+import org.apache.tools.ant.types.Reference;
+import java.util.Vector;
+
+/**
+ * Distributed build information (Non-functional prototype).
+ *
+ */
+public final class DistributerDef
+ extends DataType {
+ /**
+ * if property.
+ */
+ private String ifCond;
+
+ /**
+ * unless property.
+ */
+ private String unlessCond;
+
+ /**
+ * hosts.
+ *
+ */
+ private String hosts;
+
+ /**
+ * Protocol.
+ *
+ */
+ private DistributerProtocolEnum protocol;
+
+ /**
+ * Not sure what this is.
+ */
+ private int tcpCork;
+
+ /**
+ * user name.
+ */
+ private String user;
+
+ /**
+ * local to remote file name maps.
+ */
+ private final Vector maps = new Vector();
+
+ /**
+ * Constructor.
+ *
+ */
+ public DistributerDef() {
+ }
+
+ /**
+ * Required by documentation generator.
+ */
+ public void execute() {
+ throw new org.apache.tools.ant.BuildException(
+ "Not an actual task, but looks like one for documentation purposes");
+ }
+
+ /**
+ * Returns true if the if and unless conditions (if any) are
+ * satisfied.
+ * @return true if definition is active.
+ */
+ public boolean isActive() {
+ return CUtil.isActive(getProject(), ifCond, unlessCond);
+ }
+
+ /**
+ * Sets an id that can be used to reference this element.
+ *
+ * @param id
+ * id
+ */
+ public void setId(final String id) {
+ //
+ // this is actually accomplished by a different
+ // mechanism, but we can document it
+ //
+ }
+
+ /**
+ * Sets the property name for the 'if' condition.
+ *
+ * The define will be ignored unless the property is defined.
+ *
+ * The value of the property is insignificant, but values that would imply
+ * misinterpretation ("false", "no") will throw an exception when
+ * evaluated.
+ *
+ * @param propName
+ * property name
+ */
+ public void setIf(final String propName) {
+ ifCond = propName;
+ }
+
+ /**
+ * Specifies that this element should behave as if the content of the
+ * element with the matching id attribute was inserted at this location. If
+ * specified, no other attributes should be specified.
+ * @param r reference name
+ */
+ public void setRefid(final Reference r) {
+ super.setRefid(r);
+ }
+
+ /**
+ * Set the property name for the 'unless' condition.
+ *
+ * If named property is set, the define will be ignored.
+ *
+ * The value of the property is insignificant, but values that would imply
+ * misinterpretation ("false", "no") of the behavior will throw an
+ * exception when evaluated.
+ *
+ * @param propName
+ * name of property
+ */
+ public void setUnless(final String propName) {
+ unlessCond = propName;
+ }
+
+ /**
+ * Gets hosts.
+ * @return hosts, may be null.
+ *
+ */
+ public String getHosts() {
+ if (isReference()) {
+ DistributerDef refDistributer = (DistributerDef)
+ getCheckedRef(DistributerDef.class,
+ "DistributerDef");
+ return refDistributer.getHosts();
+ }
+ return hosts;
+ }
+
+ /**
+ * Gets tcp cork.
+ * @return TCP_CORK value.
+ *
+ */
+ public int getTcpcork() {
+ if (isReference()) {
+ DistributerDef refDistributer = (DistributerDef)
+ getCheckedRef(DistributerDef.class,
+ "DistributerDef");
+ return refDistributer.getTcpcork();
+ }
+ return tcpCork;
+ }
+
+ /**
+ * Gets protocol.
+ * @return protocol, may be null.
+ *
+ */
+ public DistributerProtocolEnum getProtocol() {
+ if (isReference()) {
+ DistributerDef refDistributer = (DistributerDef)
+ getCheckedRef(DistributerDef.class,
+ "DistributerDef");
+ return refDistributer.getProtocol();
+ }
+ return protocol;
+ }
+
+ /**
+ * Sets hosts.
+ * @param value new value
+ */
+ public void setHosts(final String value) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ hosts = value;
+ }
+
+ /**
+ * Sets TCP_CORK value.
+ * @param value new value
+ */
+ public void setTcpcork(final int value) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ tcpCork = value;
+ }
+
+ /**
+ * Sets protocol.
+ * @param value new value
+ */
+ public void setProtocol(final DistributerProtocolEnum value) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ protocol = value;
+ }
+
+ /**
+ * Local to remote filename maps.
+ * @return new map
+ */
+ public DistributerMap createMap() {
+ DistributerMap map = new DistributerMap();
+ map.setProject(getProject());
+ maps.addElement(map);
+ return map;
+ }
+
+ /**
+ * Sets remote user name.
+ * @param value user name
+ */
+ public void setUser(final String value) {
+ user = value;
+ }
+
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/DistributerMap.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/DistributerMap.java
new file mode 100644
index 0000000..aeacf55
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/DistributerMap.java
@@ -0,0 +1,218 @@
+/*
+ *
+ * Copyright 2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.types.DataType;
+
+/**
+ * Local to remote filename mapping (Experimental).
+ *
+ */
+public final class DistributerMap
+ extends DataType {
+ /**
+ * if property.
+ */
+ private String ifCond;
+
+ /**
+ * unless property.
+ */
+ private String unlessCond;
+
+ /**
+ * local directory name.
+ *
+ */
+ private File localName;
+
+ /**
+ * Canonical local file name.
+ */
+ private String canonicalPath;
+
+ /**
+ * remote name.
+ *
+ */
+ private String remoteName;
+
+ /**
+ * Separator (/ or \) character on remote system.
+ */
+ private char remoteSeparator = File.separatorChar;
+
+ /**
+ * hosts that for which this map is valid.
+ *
+ */
+ private String hosts;
+
+ /**
+ * Constructor.
+ *
+ */
+ public DistributerMap() {
+ }
+
+ /**
+ * Required by documentation generator.
+ */
+ public void execute() {
+ throw new org.apache.tools.ant.BuildException(
+ "Not an actual task, but looks like one for documentation purposes");
+ }
+
+ /**
+ * Returns true if the if and unless conditions (if any) are
+ * satisfied.
+ *
+ * @return true if this object is active.
+ */
+ public boolean isActive() {
+ return CUtil.isActive(getProject(), ifCond, unlessCond);
+ }
+
+ /**
+ * Sets the property name for the 'if' condition.
+ *
+ * This object will be ignored unless the property is defined.
+ *
+ * The value of the property is insignificant, but values that would imply
+ * misinterpretation ("false", "no") will throw an exception when
+ * evaluated.
+ *
+ * @param propName
+ * property name
+ */
+ public void setIf(final String propName) {
+ ifCond = propName;
+ }
+
+ /**
+ * Set the property name for the 'unless' condition.
+ *
+ * If named property is set, the define will be ignored.
+ *
+ * The value of the property is insignificant, but values that would imply
+ * misinterpretation ("false", "no") of the behavior will throw an
+ * exception when evaluated.
+ *
+ * @param propName
+ * name of property
+ */
+ public void setUnless(final String propName) {
+ unlessCond = propName;
+ }
+
+ /**
+ * Gets local directory.
+ * @return local directory, may be null.
+ *
+ */
+ public File getLocal() {
+ return localName;
+ }
+
+ /**
+ * Gets remote name for directory.
+ * @return remote name, may be null.
+ *
+ */
+ public String getRemote() {
+ return remoteName;
+ }
+
+ /**
+ * Converts the local file name to the remote name for the same file.
+ *
+ * @param host host
+ * @param localFile local file
+ * @return remote name for local file, null if unknown.
+ */
+ public String toRemote(final String host, final File localFile) {
+ if (remoteName != null
+ && (hosts == null || hosts.indexOf(host) >= 0)) {
+ try {
+ String canonical = localFile.getCanonicalPath();
+ if (canonical.startsWith(canonicalPath)) {
+ if (isActive()) {
+ return remoteName
+ + canonical.substring(canonicalPath.length()).replace(File.
+ separatorChar, remoteSeparator);
+ }
+ }
+ } catch (IOException ex) {
+ return null;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Sets local directory for base of mapping.
+ *
+ * @param value value
+ */
+ public void setLocal(final File value) {
+ if (value == null) {
+ throw new NullPointerException("value");
+ }
+ if (value.exists() && !value.isDirectory()) {
+ throw new BuildException("local should be a directory");
+ }
+ localName = value;
+ try {
+ canonicalPath = localName.getCanonicalPath();
+ } catch (IOException ex) {
+ throw new BuildException(ex);
+ }
+ }
+
+ /**
+ * Sets remote name for directory.
+ * @param value remote name for directory
+ */
+ public void setRemote(final String value) {
+ remoteName = value;
+ }
+
+ /**
+ * Sets the separator character (/ or \) for the remote system.
+ * @param value separator character
+ */
+ public void setRemoteSeparator(final String value) {
+ if (value != null && value.length() != 1) {
+ throw new BuildException("remote separator must be a single character");
+ }
+ remoteSeparator = value.charAt(0);
+ }
+
+ /**
+ * Sets hosts for which this mapping is valid.
+ *
+ * @param value hosts
+ */
+ public void setHosts(final String value) {
+ hosts = value;
+ }
+
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/DistributerProtocolEnum.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/DistributerProtocolEnum.java
new file mode 100644
index 0000000..5606d47
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/DistributerProtocolEnum.java
@@ -0,0 +1,50 @@
+/*
+ *
+ * Copyright 2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+
+import org.apache.tools.ant.types.EnumeratedAttribute;
+
+/**
+ * Distributer prococol names (experimental).
+ *
+ * @author Curt Arnold
+ *
+ */
+public final class DistributerProtocolEnum
+ extends EnumeratedAttribute {
+ /**
+ * Constructor.
+ *
+ * Set by default to "distcc"
+ *
+ * @see java.lang.Object#Object()
+ */
+ public DistributerProtocolEnum() {
+ setValue("distcc");
+ }
+
+ /**
+ * Gets list of acceptable values.
+ *
+ * @see org.apache.tools.ant.types.EnumeratedAttribute#getValues()
+ */
+ public String[] getValues() {
+ return new String[] {
+ "distcc",
+ "ssh"};
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/FileVisitor.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/FileVisitor.java
new file mode 100644
index 0000000..24aef25
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/FileVisitor.java
@@ -0,0 +1,27 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+import java.io.File;
+
+import org.apache.tools.ant.BuildException;
+/**
+ * An abstract class implemented to walk over the fileset members of a
+ * ProcessorDef
+ */
+public interface FileVisitor {
+ abstract void visit(File parentDir, String filename) throws BuildException;
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/LinkerDef.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/LinkerDef.java
new file mode 100644
index 0000000..d997b2f
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/LinkerDef.java
@@ -0,0 +1,549 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+import java.io.File;
+import java.util.Enumeration;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.compiler.CommandLineLinker;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.compiler.Processor;
+import net.sf.antcontrib.cpptasks.compiler.ProcessorConfiguration;
+import net.sf.antcontrib.cpptasks.gcc.GccLinker;
+import net.sf.antcontrib.cpptasks.types.FlexLong;
+import net.sf.antcontrib.cpptasks.types.LibrarySet;
+import net.sf.antcontrib.cpptasks.types.LinkerArgument;
+import net.sf.antcontrib.cpptasks.types.SystemLibrarySet;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.FlexInteger;
+/**
+ * A linker definition. linker elements may be placed either as children of a
+ * cc element or the project element. A linker element with an id attribute may
+ * be referenced by linker elements with refid or extends attributes.
+ *
+ * @author Adam Murdoch
+ * @author Curt Arnold
+ */
+public class LinkerDef extends ProcessorDef {
+ private long base;
+ private String entry;
+ private Boolean fixed;
+ private Boolean incremental;
+ private final Vector librarySets = new Vector();
+ private Boolean map;
+ private int stack;
+ private final Vector sysLibrarySets = new Vector();
+ private final Vector versionInfos = new Vector();
+ private Boolean defaultflag = new Boolean(true);
+ /**
+ * Default constructor
+ *
+ * @see java.lang.Object#Object()
+ */
+ public LinkerDef() {
+ base = -1;
+ stack = -1;
+ }
+ private void addActiveLibrarySet(Project project, Vector libsets,
+ Vector srcSets) {
+ Enumeration srcenum = srcSets.elements();
+ while (srcenum.hasMoreElements()) {
+ LibrarySet set = (LibrarySet) srcenum.nextElement();
+ if (set.isActive(project)) {
+ libsets.addElement(set);
+ }
+ }
+ }
+ private void addActiveSystemLibrarySets(Project project, Vector libsets) {
+ addActiveLibrarySet(project, libsets, sysLibrarySets);
+ }
+ private void addActiveUserLibrarySets(Project project, Vector libsets) {
+ addActiveLibrarySet(project, libsets, librarySets);
+ }
+ /**
+ * Adds a linker command-line arg.
+ */
+ public void addConfiguredLinkerArg(LinkerArgument arg) {
+ addConfiguredProcessorArg(arg);
+ }
+ /**
+ * Adds a compiler command-line arg.
+ */
+ public void addConfiguredLinkerParam(LinkerParam param) {
+ if (isReference()) {
+ throw noChildrenAllowed();
+ }
+ addConfiguredProcessorParam(param);
+ }
+ /**
+ * Adds a system library set.
+ */
+ public void addLibset(LibrarySet libset) {
+ if (isReference()) {
+ throw super.noChildrenAllowed();
+ }
+ if (libset == null) {
+ throw new NullPointerException("libset");
+ }
+ librarySets.addElement(libset);
+ }
+ /**
+ * Adds a system library set.
+ */
+ public void addSyslibset(SystemLibrarySet libset) {
+ if (isReference()) {
+ throw super.noChildrenAllowed();
+ }
+ if (libset == null) {
+ throw new NullPointerException("libset");
+ }
+ sysLibrarySets.addElement(libset);
+ }
+
+ /**
+ * Adds desriptive version information to be included in the
+ * generated file. The first active version info block will
+ * be used.
+ */
+ public void addConfiguredVersioninfo(VersionInfo newVersionInfo) {
+ if (isReference()) {
+ throw noChildrenAllowed();
+ }
+ newVersionInfo.setProject(this.getProject());
+ versionInfos.addElement(newVersionInfo);
+ }
+
+ public ProcessorConfiguration createConfiguration(CCTask task,
+ LinkType linkType, ProcessorDef baseDef, TargetDef targetPlatform) {
+ //
+ // must combine some local context (the linkType)
+ // with the referenced element
+ //
+ // get a pointer to the definition (either local or referenced)
+ ProcessorDef thisDef = this;
+ if (isReference()) {
+ thisDef = ((ProcessorDef) getCheckedRef(ProcessorDef.class,
+ "ProcessorDef"));
+ }
+ //
+ // find the appropriate processor (combines local linkType
+ // with possibly remote linker name)
+ Processor proc = getProcessor();
+ proc = proc.getLinker(linkType);
+ ProcessorDef[] defaultProviders = getDefaultProviders(baseDef);
+ return proc.createConfiguration(task, linkType, defaultProviders,
+ thisDef, targetPlatform);
+ }
+ public void execute() throws org.apache.tools.ant.BuildException {
+ throw new org.apache.tools.ant.BuildException(
+ "Not an actual task, but looks like one for documentation purposes");
+ }
+ /**
+ * Returns an array of active library sets for this linker definition.
+ */
+ public LibrarySet[] getActiveLibrarySets(LinkerDef[] defaultProviders,
+ int index) {
+ if (isReference()) {
+ return ((LinkerDef) getCheckedRef(LinkerDef.class, "LinkerDef"))
+ .getActiveUserLibrarySets(defaultProviders, index);
+ }
+ Project p = getProject();
+ Vector libsets = new Vector();
+ for (int i = index; i < defaultProviders.length; i++) {
+ defaultProviders[i].addActiveUserLibrarySets(p, libsets);
+ defaultProviders[i].addActiveSystemLibrarySets(p, libsets);
+ }
+ addActiveUserLibrarySets(p, libsets);
+ addActiveSystemLibrarySets(p, libsets);
+ LibrarySet[] sets = new LibrarySet[libsets.size()];
+ libsets.copyInto(sets);
+ return sets;
+ }
+ /**
+ * Returns an array of active library sets for this linker definition.
+ */
+ public LibrarySet[] getActiveSystemLibrarySets(
+ LinkerDef[] defaultProviders, int index) {
+ if (isReference()) {
+ return ((LinkerDef) getCheckedRef(LinkerDef.class, "LinkerDef"))
+ .getActiveUserLibrarySets(defaultProviders, index);
+ }
+ Project p = getProject();
+ Vector libsets = new Vector();
+ for (int i = index; i < defaultProviders.length; i++) {
+ defaultProviders[i].addActiveSystemLibrarySets(p, libsets);
+ }
+ addActiveSystemLibrarySets(p, libsets);
+ LibrarySet[] sets = new LibrarySet[libsets.size()];
+ libsets.copyInto(sets);
+ return sets;
+ }
+ /**
+ * Returns an array of active library sets for this linker definition.
+ */
+ public LibrarySet[] getActiveUserLibrarySets(LinkerDef[] defaultProviders,
+ int index) {
+ if (isReference()) {
+ return ((LinkerDef) getCheckedRef(LinkerDef.class, "LinkerDef"))
+ .getActiveUserLibrarySets(defaultProviders, index);
+ }
+ Project p = getProject();
+ Vector libsets = new Vector();
+ for (int i = index; i < defaultProviders.length; i++) {
+ defaultProviders[i].addActiveUserLibrarySets(p, libsets);
+ }
+ addActiveUserLibrarySets(p, libsets);
+ LibrarySet[] sets = new LibrarySet[libsets.size()];
+ libsets.copyInto(sets);
+ return sets;
+ }
+ public long getBase(LinkerDef[] defaultProviders, int index) {
+ if (isReference()) {
+ return ((LinkerDef) getCheckedRef(LinkerDef.class, "LinkerDef"))
+ .getBase(defaultProviders, index);
+ }
+ if (base <= 0) {
+ if (defaultProviders != null && index < defaultProviders.length) {
+ return defaultProviders[index].getBase(defaultProviders,
+ index + 1);
+ }
+ }
+ return base;
+ }
+ public Boolean getFixed(LinkerDef[] defaultProviders, int index) {
+ if (isReference()) {
+ return ((LinkerDef) getCheckedRef(LinkerDef.class, "LinkerDef"))
+ .getFixed(defaultProviders, index);
+ }
+ if (fixed == null) {
+ if (defaultProviders != null && index < defaultProviders.length) {
+ return defaultProviders[index].getFixed(defaultProviders,
+ index + 1);
+ }
+ }
+ return fixed;
+ }
+ public boolean getIncremental(LinkerDef[] defaultProviders, int index) {
+ if (isReference()) {
+ return ((LinkerDef) getCheckedRef(LinkerDef.class, "LinkerDef"))
+ .getIncremental(defaultProviders, index);
+ }
+ if (incremental != null) {
+ return incremental.booleanValue();
+ }
+ if (defaultProviders != null && index < defaultProviders.length) {
+ return defaultProviders[index].getIncremental(defaultProviders, index + 1);
+ }
+ return false;
+ }
+ public boolean getMap(LinkerDef[] defaultProviders, int index) {
+ if (isReference()) {
+ return ((LinkerDef) getCheckedRef(LinkerDef.class, "LinkerDef"))
+ .getMap(defaultProviders, index);
+ }
+ if (map != null) {
+ return map.booleanValue();
+ }
+ if (defaultProviders != null && index < defaultProviders.length) {
+ return defaultProviders[index].getMap(defaultProviders, index + 1);
+ }
+ return false;
+ }
+ public final Boolean getDefaultflag(LinkerDef[] defaultProviders, int index) {
+ if (isReference()) {
+ return ((LinkerDef) getCheckedRef(LinkerDef.class,
+ "LinkerDef")).getDefaultflag(defaultProviders, index);
+ }
+ return defaultflag;
+ }
+ public String getEntry(LinkerDef[] defaultProviders, int index) {
+ if (isReference()) {
+ return ((LinkerDef) getCheckedRef(LinkerDef.class, "LinkerDef"))
+ .getEntry(defaultProviders, index);
+ }
+ if (entry != null) {
+ return entry;
+ }
+ if (defaultProviders != null && index < defaultProviders.length) {
+ return defaultProviders[index].getEntry(defaultProviders, index + 1);
+ }
+ return null;
+ }
+
+ public Processor getProcessor() {
+ Linker linker = (Linker) super.getProcessor();
+ if (linker == null) {
+ linker = GccLinker.getInstance();
+ }
+ if (getLibtool() && linker instanceof CommandLineLinker) {
+ CommandLineLinker cmdLineLinker = (CommandLineLinker) linker;
+ linker = cmdLineLinker.getLibtoolLinker();
+ }
+ return linker;
+ }
+ public int getStack(LinkerDef[] defaultProviders, int index) {
+ if (isReference()) {
+ return ((LinkerDef) getCheckedRef(LinkerDef.class, "LinkerDef"))
+ .getStack(defaultProviders, index);
+ }
+ if (stack < 0) {
+ if (defaultProviders != null && index < defaultProviders.length) {
+ return defaultProviders[index].getStack(defaultProviders,
+ index + 1);
+ }
+ }
+ return stack;
+ }
+ /**
+ * Sets the base address. May be specified in either decimal or hex.
+ *
+ * @param base
+ * base address
+ *
+ */
+ public void setBase(FlexLong base) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ this.base = base.longValue();
+ }
+ /**
+ * Sets the starting address.
+ *
+ * @param name
+ * function name
+ */
+ public void setEntry(String entry) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ this.entry = entry;
+ }
+ /**
+ * If true, marks the file to be loaded only at its preferred address.
+ */
+ public void setFixed(boolean fixed) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ this.fixed = booleanValueOf(fixed);
+ }
+ /**
+ * If true, allows incremental linking.
+ *
+ */
+ public void setIncremental(boolean incremental) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ this.incremental = booleanValueOf(incremental);
+ }
+ /**
+ * If set to true, a map file will be produced.
+ */
+ public void setMap(boolean map) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ this.map = booleanValueOf(map);
+ }
+ /**
+ * Sets linker type.
+ *
+ *
+ * <table width="100%" border="1"> <thead>Supported linkers </thead>
+ * <tr>
+ * <td>gcc</td>
+ * <td>Gcc Linker</td>
+ * </tr>
+ * <tr>
+ * <td>g++</td>
+ * <td>G++ Linker</td>
+ * </tr>
+ * <tr>
+ * <td>ld</td>
+ * <td>Ld Linker</td>
+ * </tr>
+ * <tr>
+ * <td>ar</td>
+ * <td>Gcc Librarian</td>
+ * </tr>
+ * <tr>
+ * <td>msvc</td>
+ * <td>Microsoft Linker</td>
+ * </tr>
+ * <tr>
+ * <td>bcc</td>
+ * <td>Borland Linker</td>
+ * </tr>
+ * <tr>
+ * <td>df</td>
+ * <td>Compaq Visual Fortran Linker</td>
+ * </tr>
+ * <tr>
+ * <td>icl</td>
+ * <td>Intel Linker for Windows (IA-32)</td>
+ * </tr>
+ * <tr>
+ * <td>ecl</td>
+ * <td>Intel Linker for Windows (IA-64)</td>
+ * </tr>
+ * <tr>
+ * <td>icc</td>
+ * <td>Intel Linker for Linux (IA-32)</td>
+ * </tr>
+ * <tr>
+ * <td>ecc</td>
+ * <td>Intel Linker for Linux (IA-64)</td>
+ * </tr>
+ * <tr>
+ * <td>CC</td>
+ * <td>Sun ONE Linker</td>
+ * </tr>
+ * <tr>
+ * <td>aCC</td>
+ * <td>HP aC++ Linker</td>
+ * </tr>
+ * <tr>
+ * <td>os390</td>
+ * <td>OS390 Linker</td>
+ * </tr>
+ * <tr>
+ * <td>os390batch</td>
+ * <td>OS390 Linker</td>
+ * </tr>
+ * <tr>
+ * <td>os400</td>
+ * <td>IccLinker</td>
+ * </tr>
+ * <tr>
+ * <td>sunc89</td>
+ * <td>C89 Linker</td>
+ * </tr>
+ * <tr>
+ * <td>xlC</td>
+ * <td>VisualAge Linker</td>
+ * </tr>
+ * </table>
+ *
+ */
+ public void setName(LinkerEnum name) throws BuildException {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ Linker linker = name.getLinker();
+ super.setProcessor(linker);
+ }
+ protected void setProcessor(Processor proc) throws BuildException {
+ Linker linker = null;
+ if (proc instanceof Linker) {
+ linker = (Linker) proc;
+ } else {
+ LinkType linkType = new LinkType();
+ linker = proc.getLinker(linkType);
+ }
+ super.setProcessor(linker);
+ }
+ /**
+ * Sets stack size in bytes.
+ */
+ public void setStack(FlexInteger stack) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ this.stack = stack.intValue();
+ }
+ public void visitSystemLibraries(Linker linker, FileVisitor libraryVisitor) {
+ Project p = getProject();
+ if (p == null) {
+ throw new java.lang.IllegalStateException("project must be set");
+ }
+ if (isReference()) {
+ LinkerDef master = ((LinkerDef) getCheckedRef(LinkerDef.class,
+ "Linker"));
+ master.visitSystemLibraries(linker, libraryVisitor);
+ } else {
+ //
+ // if this linker extends another,
+ // visit its libraries first
+ //
+ LinkerDef extendsDef = (LinkerDef) getExtends();
+ if (extendsDef != null) {
+ extendsDef.visitSystemLibraries(linker, libraryVisitor);
+ }
+ if (sysLibrarySets.size() > 0) {
+ File[] libpath = linker.getLibraryPath();
+ for (int i = 0; i < sysLibrarySets.size(); i++) {
+ LibrarySet set = (LibrarySet) sysLibrarySets.elementAt(i);
+ if (set.isActive(p)) {
+ set.visitLibraries(p, linker, libpath,
+ libraryVisitor);
+ }
+ }
+ }
+ }
+ }
+ public void visitUserLibraries(Linker linker, FileVisitor libraryVisitor) {
+ Project p = getProject();
+ if (p == null) {
+ throw new java.lang.IllegalStateException("project must be set");
+ }
+ if (isReference()) {
+ LinkerDef master = ((LinkerDef) getCheckedRef(LinkerDef.class,
+ "Linker"));
+ master.visitUserLibraries(linker, libraryVisitor);
+ } else {
+ //
+ // if this linker extends another,
+ // visit its libraries first
+ //
+ LinkerDef extendsDef = (LinkerDef) getExtends();
+ if (extendsDef != null) {
+ extendsDef.visitUserLibraries(linker, libraryVisitor);
+ }
+ //
+ // visit the user libraries
+ //
+ if (librarySets.size() > 0) {
+ File[] libpath = linker.getLibraryPath();
+ for (int i = 0; i < librarySets.size(); i++) {
+ LibrarySet set = (LibrarySet) librarySets.elementAt(i);
+ if (set.isActive(p)) {
+ set.visitLibraries(p, linker, libpath,
+ libraryVisitor);
+ }
+ }
+ }
+ }
+ }
+ /**
+ * Enables or disables default flags.
+ *
+ * @param defaultflag
+ * if true, default flags will add to command line.
+ *
+ */
+ public void setDefaultflag(boolean defaultflag) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ this.defaultflag = booleanValueOf(defaultflag);
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/LinkerEnum.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/LinkerEnum.java
new file mode 100644
index 0000000..cfe8984
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/LinkerEnum.java
@@ -0,0 +1,106 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+import net.sf.antcontrib.cpptasks.arm.ADSLinker;
+import net.sf.antcontrib.cpptasks.borland.BorlandLinker;
+import net.sf.antcontrib.cpptasks.compaq.CompaqVisualFortranLinker;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.devstudio.DevStudioLinker;
+import net.sf.antcontrib.cpptasks.gcc.GccLibrarian;
+import net.sf.antcontrib.cpptasks.gcc.GccLinker;
+import net.sf.antcontrib.cpptasks.gcc.GppLinker;
+import net.sf.antcontrib.cpptasks.gcc.LdLinker;
+import net.sf.antcontrib.cpptasks.hp.aCCLinker;
+import net.sf.antcontrib.cpptasks.ibm.VisualAgeLinker;
+import net.sf.antcontrib.cpptasks.intel.IntelLinux32Linker;
+import net.sf.antcontrib.cpptasks.intel.IntelLinux64Linker;
+import net.sf.antcontrib.cpptasks.intel.IntelWin32Linker;
+import net.sf.antcontrib.cpptasks.os390.OS390Linker;
+import net.sf.antcontrib.cpptasks.os400.IccLinker;
+import net.sf.antcontrib.cpptasks.sun.C89Linker;
+import net.sf.antcontrib.cpptasks.sun.ForteCCLinker;
+import net.sf.antcontrib.cpptasks.ti.ClxxLinker;
+import org.apache.tools.ant.types.EnumeratedAttribute;
+/**
+ * Enumeration of supported linkers
+ *
+ * @author Curt Arnold
+ *
+ */
+public class LinkerEnum extends EnumeratedAttribute {
+ private final static ProcessorEnumValue[] linkers = new ProcessorEnumValue[]{
+ new ProcessorEnumValue("gcc", GccLinker.getInstance()),
+ new ProcessorEnumValue("g++", GppLinker.getInstance()),
+ new ProcessorEnumValue("ld", LdLinker.getInstance()),
+ new ProcessorEnumValue("ar", GccLibrarian.getInstance()),
+ new ProcessorEnumValue("msvc", DevStudioLinker.getInstance()),
+ new ProcessorEnumValue("bcc", BorlandLinker.getInstance()),
+ new ProcessorEnumValue("df", CompaqVisualFortranLinker
+ .getInstance()),
+ new ProcessorEnumValue("icl", IntelWin32Linker.getInstance()),
+ new ProcessorEnumValue("ecl", IntelWin32Linker.getInstance()),
+ new ProcessorEnumValue("icc", IntelLinux32Linker.getInstance()),
+ new ProcessorEnumValue("ecc", IntelLinux64Linker.getInstance()),
+ new ProcessorEnumValue("CC", ForteCCLinker.getInstance()),
+ new ProcessorEnumValue("aCC", aCCLinker.getInstance()),
+ new ProcessorEnumValue("os390", OS390Linker.getInstance()),
+ new ProcessorEnumValue("os390batch", OS390Linker
+ .getDataSetInstance()),
+ new ProcessorEnumValue("os400", IccLinker.getInstance()),
+ new ProcessorEnumValue("sunc89", C89Linker.getInstance()),
+ new ProcessorEnumValue("xlC", VisualAgeLinker.getInstance()),
+ new ProcessorEnumValue("cl6x", ClxxLinker.getCl6xInstance()),
+ new ProcessorEnumValue("cl55", ClxxLinker.getCl55Instance()),
+ new ProcessorEnumValue("armcc", ADSLinker.getInstance()),
+ new ProcessorEnumValue("armcpp", ADSLinker.getInstance()),
+ new ProcessorEnumValue("tcc", ADSLinker.getInstance()),
+ new ProcessorEnumValue("tcpp", ADSLinker.getInstance()),
+ // gcc cross compilers
+ new ProcessorEnumValue(
+ "sparc-sun-solaris2-gcc",
+ net.sf.antcontrib.cpptasks.gcc.cross.sparc_sun_solaris2.GccLinker
+ .getInstance()),
+ new ProcessorEnumValue(
+ "sparc-sun-solaris2-g++",
+ net.sf.antcontrib.cpptasks.gcc.cross.sparc_sun_solaris2.GppLinker
+ .getInstance()),
+ new ProcessorEnumValue(
+ "sparc-sun-solaris2-ld",
+ net.sf.antcontrib.cpptasks.gcc.cross.sparc_sun_solaris2.LdLinker
+ .getInstance()),
+ new ProcessorEnumValue(
+ "sparc-sun-solaris2-ar",
+ net.sf.antcontrib.cpptasks.gcc.cross.sparc_sun_solaris2.GccLibrarian
+ .getInstance()),
+ new ProcessorEnumValue("gcc-cross",
+ net.sf.antcontrib.cpptasks.gcc.cross.GccLinker
+ .getInstance()),
+ new ProcessorEnumValue("g++-cross",
+ net.sf.antcontrib.cpptasks.gcc.cross.GppLinker
+ .getInstance()),
+ new ProcessorEnumValue("ld-cross",
+ net.sf.antcontrib.cpptasks.gcc.cross.LdLinker.getInstance()),
+ new ProcessorEnumValue("ar-cross",
+ net.sf.antcontrib.cpptasks.gcc.cross.GccLibrarian
+ .getInstance()),};
+ public Linker getLinker() {
+ return (Linker) linkers[getIndex()].getProcessor();
+ }
+ public String[] getValues() {
+ return ProcessorEnumValue.getValues(linkers);
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/LinkerParam.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/LinkerParam.java
new file mode 100644
index 0000000..383bae5
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/LinkerParam.java
@@ -0,0 +1,33 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+/*******************************************************************************
+ * Place class description here.
+ *
+ * @author inger
+ * @author <additional author>
+ *
+ * @since
+ ******************************************************************************/
+public class LinkerParam extends ProcessorParam {
+ public LinkerParam() {
+ }
+ public void execute() throws org.apache.tools.ant.BuildException {
+ throw new org.apache.tools.ant.BuildException(
+ "Not an actual task, but looks like one for documentation purposes");
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/OSFamilyEnum.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/OSFamilyEnum.java
new file mode 100644
index 0000000..536d992
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/OSFamilyEnum.java
@@ -0,0 +1,59 @@
+/*
+ *
+ * Copyright 2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+
+import org.apache.tools.ant.types.EnumeratedAttribute;
+
+/**
+ * Enumeration of cpu types.
+ *
+ * @author Curt Arnold
+ *
+ */
+public final class OSFamilyEnum
+ extends EnumeratedAttribute {
+ /**
+ * Constructor.
+ *
+ * Set by default to "pentium3"
+ *
+ * @see java.lang.Object#Object()
+ */
+ public OSFamilyEnum() {
+ setValue("windows");
+ }
+
+ /**
+ * Gets list of acceptable values.
+ *
+ * @see org.apache.tools.ant.types.EnumeratedAttribute#getValues()
+ */
+ public String[] getValues() {
+ return new String[] {
+ "windows",
+ "dos",
+ "mac",
+ "unix",
+ "netware",
+ "os/2",
+ "tandem",
+ "win9x",
+ "z/os",
+ "os/400",
+ "openvms"};
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ObjectFileCollector.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ObjectFileCollector.java
new file mode 100644
index 0000000..3e97fa4
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ObjectFileCollector.java
@@ -0,0 +1,42 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+import java.io.File;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+
+import org.apache.tools.ant.BuildException;
+/**
+ * Collects object files for the link step.
+ *
+ *
+ */
+public final class ObjectFileCollector implements FileVisitor {
+ private final Vector files;
+ private final Linker linker;
+ public ObjectFileCollector(Linker linker, Vector files) {
+ this.linker = linker;
+ this.files = files;
+ }
+ public void visit(File parentDir, String filename) throws BuildException {
+ int bid = linker.bid(filename);
+ if (bid >= 1) {
+ files.addElement(new File(parentDir, filename));
+ }
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/OptimizationEnum.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/OptimizationEnum.java
new file mode 100644
index 0000000..4a0d179
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/OptimizationEnum.java
@@ -0,0 +1,82 @@
+/*
+ *
+ * Copyright 2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+
+import org.apache.tools.ant.types.EnumeratedAttribute;
+
+/**
+ * Enumeration of optimization levels (experimental).
+ *
+ * @author Curt Arnold
+ *
+ */
+public final class OptimizationEnum
+ extends EnumeratedAttribute {
+ /**
+ * Constructor.
+ *
+ * Set by default to "speed"
+ *
+ * @see java.lang.Object#Object()
+ */
+ public OptimizationEnum() {
+ setValue("speed");
+ }
+
+ /**
+ * Gets list of acceptable values.
+ *
+ * @see org.apache.tools.ant.types.EnumeratedAttribute#getValues()
+ */
+ public String[] getValues() {
+ return new String[] {
+ "none",
+ "size",
+ "minimal",
+ "speed",
+ "full",
+ "aggressive",
+ "extreme",
+ "unsafe"
+ };
+ }
+
+ /**
+ * Is size optimized.
+ * @return boolean true if size is optimized.
+ */
+ public boolean isSize() {
+ return "speed".equals(getValue());
+ }
+
+ /**
+ * Is speed optimized.
+ * @return boolean true if speed is optimized.
+ */
+ public boolean isSpeed() {
+ return !isSize() && !isNoOptimization();
+ }
+
+ /**
+ * Is no optimization performed.
+ * @return boolean true if no optimization is performed.
+ */
+ public boolean isNoOptimization() {
+ return "none".equals(getValue());
+ }
+
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/OutputTypeEnum.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/OutputTypeEnum.java
new file mode 100644
index 0000000..fb37843
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/OutputTypeEnum.java
@@ -0,0 +1,48 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+import org.apache.tools.ant.types.EnumeratedAttribute;
+/**
+ * Enumeration of supported subsystems
+ *
+ * @author Curt Arnold
+ *
+ */
+public class OutputTypeEnum extends EnumeratedAttribute {
+ /**
+ * Constructor
+ *
+ * Set by default to "executable"
+ *
+ * @see java.lang.Object#Object()
+ */
+ public OutputTypeEnum() {
+ setValue("executable");
+ }
+ /**
+ * Gets list of acceptable values
+ *
+ * @see org.apache.tools.ant.types.EnumeratedAttribute#getValues()
+ */
+ public String[] getValues() {
+ return new String[]{"executable", // executable program
+ "plugin", // plugin module
+ "shared", // dynamically linkable module
+ "static" // convenience library
+ };
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/PrecompileDef.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/PrecompileDef.java
new file mode 100644
index 0000000..828e2c2
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/PrecompileDef.java
@@ -0,0 +1,215 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+import java.io.File;
+import java.util.Enumeration;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.types.ConditionalFileSet;
+
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.DirectoryScanner;
+import org.apache.tools.ant.types.DataType;
+/**
+ * An element that specifies a prototype file and rules for source files that
+ * should not use precompiled headers
+ *
+ * @author Curt Arnold
+ */
+public final class PrecompileDef extends DataType {
+ private final Vector exceptSets = new Vector();
+ private String ifCond;
+ /**
+ * Directory of prototype file
+ */
+ private File prototype = new File("stdafx.cpp");
+ private String unlessCond;
+ /**
+ * Constructor
+ *
+ */
+ public PrecompileDef() {
+ }
+ /**
+ * Method used by PrecompileExceptDef to add exception set to
+ * PrecompileDef.
+ */
+ public void appendExceptFileSet(ConditionalFileSet exceptSet) {
+ exceptSet.setProject(getProject());
+ exceptSets.addElement(exceptSet);
+ }
+ /**
+ * Adds filesets that specify files that should not be processed with
+ * precompiled headers enabled.
+ *
+ * @param exceptSet
+ * FileSet specify files that should not be processed with
+ * precompiled headers enabled.
+ */
+ public PrecompileExceptDef createExcept() {
+ return new PrecompileExceptDef(this);
+ }
+ public void execute() throws org.apache.tools.ant.BuildException {
+ throw new org.apache.tools.ant.BuildException(
+ "Not an actual task, but looks like one for documentation purposes");
+ }
+ public String[] getExceptFiles() {
+ PrecompileDef ref = getRef();
+ if (ref != null) {
+ return ref.getExceptFiles();
+ }
+ if (exceptSets.size() == 0) {
+ return new String[0];
+ }
+ Project p = getProject();
+ String[] exceptFiles = null;
+ Enumeration setEnum = exceptSets.elements();
+ while (setEnum.hasMoreElements()) {
+ ConditionalFileSet exceptSet = (ConditionalFileSet) setEnum
+ .nextElement();
+ if (exceptSet.isActive()) {
+ DirectoryScanner scanner = exceptSet
+ .getDirectoryScanner(p);
+ String[] scannerFiles = scanner.getIncludedFiles();
+ if (exceptFiles == null) {
+ exceptFiles = scannerFiles;
+ } else {
+ if (scannerFiles.length > 0) {
+ String[] newFiles = new String[exceptFiles.length
+ + scannerFiles.length];
+ for (int i = 0; i < exceptFiles.length; i++) {
+ newFiles[i] = exceptFiles[i];
+ }
+ int index = exceptFiles.length;
+ for (int i = 0; i < scannerFiles.length; i++) {
+ newFiles[index++] = scannerFiles[i];
+ }
+ exceptFiles = newFiles;
+ }
+ }
+ }
+ }
+ if (exceptFiles == null) {
+ exceptFiles = new String[0];
+ }
+ return exceptFiles;
+ }
+ /**
+ * Gets prototype source file
+ *
+ */
+ public File getPrototype() {
+ PrecompileDef ref = getRef();
+ if (ref != null) {
+ return ref.getPrototype();
+ }
+ return prototype;
+ }
+ private PrecompileDef getRef() {
+ if (isReference()) {
+ return ((PrecompileDef) getCheckedRef(PrecompileDef.class,
+ "PrecompileDef"));
+ }
+ return null;
+ }
+ public boolean isActive() {
+ boolean isActive = CUtil.isActive(getProject(), ifCond, unlessCond);
+ if (!isActive) {
+ PrecompileDef ref = getRef();
+ if (ref != null) {
+ return ref.isActive();
+ }
+ }
+ return isActive;
+ }
+ /**
+ * Sets a description of the current data type.
+ */
+ public void setDescription(String desc) {
+ super.setDescription(desc);
+ }
+ /**
+ * Sets an id that can be used to reference this element.
+ *
+ * @param id
+ * id
+ */
+ public void setId(String id) {
+ //
+ // this is actually accomplished by a different
+ // mechanism, but we can document it
+ //
+ }
+ /**
+ * Set the 'if' condition.
+ *
+ * The processor will be ignored unless the property is defined.
+ *
+ * The value of property is insignificant, but values that would imply
+ * misinterpretation ("false", "no") will throw an exception when
+ * isActive() is evaluated.
+ *
+ * @param propName
+ * name of property
+ */
+ public void setIf(String propName) {
+ ifCond = propName;
+ }
+ /**
+ * Sets file to precompile.
+ *
+ * Should be a source file that includes only one unguarded header file.
+ * Default value is "stdafx.cpp".
+ *
+ * @param prototype
+ * file path for prototype source file
+ */
+ public void setPrototype(File prototype) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ if (prototype == null) {
+ throw new NullPointerException("prototype");
+ }
+ this.prototype = prototype;
+ }
+ /**
+ * Specifies that this element should behave as if the content of the
+ * element with the matching id attribute was inserted at this location.
+ *
+ * @param ref
+ * Reference to other element
+ *
+ */
+ public void setRefid(org.apache.tools.ant.types.Reference ref) {
+ super.setRefid(ref);
+ }
+ /**
+ * Set the 'unless' condition. If named property exists at execution time,
+ * the processor will be ignored.
+ *
+ * Value of property is insignificant, but values that would imply
+ * misinterpretation ("false", "no") of the behavior will throw an
+ * exception when isActive is called.
+ *
+ * @param propName
+ * name of property
+ */
+ public void setUnless(String propName) {
+ unlessCond = propName;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/PrecompileExceptDef.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/PrecompileExceptDef.java
new file mode 100644
index 0000000..d6cdd60
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/PrecompileExceptDef.java
@@ -0,0 +1,80 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+import java.io.File;
+
+import net.sf.antcontrib.cpptasks.types.ConditionalFileSet;
+
+import org.apache.tools.ant.BuildException;
+/**
+ * Specifies files that should not be compiled using precompiled headers.
+ *
+ * @author Curt Arnold
+ */
+public final class PrecompileExceptDef {
+ private ConditionalFileSet localSet = null;
+ /**
+ * Collection of <fileset>contained by definition
+ */
+ private PrecompileDef owner;
+ /**
+ * Constructor
+ *
+ */
+ public PrecompileExceptDef(PrecompileDef owner) {
+ this.owner = owner;
+ }
+ /**
+ * Adds filesets that specify files that should not be processed using
+ * precompiled headers.
+ *
+ * @param exceptSet
+ * FileSet specify files that should not be processed with
+ * precompiled headers enabled.
+ */
+ public void addFileset(ConditionalFileSet exceptSet) {
+ owner.appendExceptFileSet(exceptSet);
+ }
+ public void execute() throws org.apache.tools.ant.BuildException {
+ throw new org.apache.tools.ant.BuildException(
+ "Not an actual task, but looks like one for documentation purposes");
+ }
+ /**
+ * Sets the base-directory
+ */
+ public void setDir(File dir) throws BuildException {
+ if (localSet == null) {
+ localSet = new ConditionalFileSet();
+ owner.appendExceptFileSet(localSet);
+ }
+ localSet.setDir(dir);
+ }
+ /**
+ * Comma or space separated list of file patterns that should not be
+ * compiled using precompiled headers.
+ *
+ * @param includes
+ * the string containing the include patterns
+ */
+ public void setIncludes(String includes) {
+ if (localSet == null) {
+ localSet = new ConditionalFileSet();
+ owner.appendExceptFileSet(localSet);
+ }
+ localSet.setIncludes(includes);
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ProcessorDef.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ProcessorDef.java
new file mode 100644
index 0000000..38faf42
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ProcessorDef.java
@@ -0,0 +1,714 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.util.Vector;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Processor;
+import net.sf.antcontrib.cpptasks.compiler.ProcessorConfiguration;
+import net.sf.antcontrib.cpptasks.types.CommandLineArgument;
+import net.sf.antcontrib.cpptasks.types.ConditionalFileSet;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.DirectoryScanner;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.DataType;
+import org.apache.tools.ant.types.Environment;
+import org.apache.tools.ant.types.Reference;
+/**
+ * An abstract compiler/linker definition.
+ *
+ * @author Curt Arnold
+ */
+public abstract class ProcessorDef extends DataType {
+ /**
+ * Returns the equivalent Boolean object for the specified value
+ *
+ * Equivalent to Boolean.valueOf in JDK 1.4
+ *
+ * @param val
+ * boolean value
+ * @return Boolean.TRUE or Boolean.FALSE
+ */
+ protected static Boolean booleanValueOf(boolean val) {
+ if (val) {
+ return Boolean.TRUE;
+ }
+ return Boolean.FALSE;
+ }
+ /**
+ * if true, targets will be built for debugging
+ */
+ private Boolean debug;
+ private Environment env = null;
+ /**
+ * Reference for "extends" processor definition
+ */
+ private Reference extendsRef = null;
+ /**
+ * Name of property that must be present or definition will be ignored. May
+ * be null.
+ */
+ private String ifProp;
+ /**
+ * if true, processor definition inherits values from containing <cc>
+ * element
+ */
+ private boolean inherit;
+ private Boolean libtool = null;
+ protected boolean newEnvironment = false;
+ /**
+ * Processor.
+ */
+ private Processor processor;
+ /**
+ * Collection of <compilerarg>or <linkerarg>contained by definition
+ */
+ private final Vector processorArgs = new Vector();
+ /**
+ * Collection of <compilerparam>or <linkerparam>contained by definition
+ */
+ private final Vector processorParams = new Vector();
+ /**
+ * if true, all targets will be unconditionally rebuilt
+ */
+ private Boolean rebuild;
+ /**
+ * Collection of <fileset>contained by definition
+ */
+ private final Vector srcSets = new Vector();
+ /**
+ * Name of property that if present will cause definition to be ignored.
+ * May be null.
+ */
+ private String unlessProp;
+ /**
+ * Constructor
+ *
+ */
+ protected ProcessorDef() throws NullPointerException {
+ inherit = true;
+ }
+ /**
+ * Adds a <compilerarg>or <linkerarg>
+ *
+ * @param arg
+ * command line argument, must not be null
+ * @throws NullPointerException
+ * if arg is null
+ * @throws BuildException
+ * if this definition is a reference
+ */
+ protected void addConfiguredProcessorArg(CommandLineArgument arg)
+ throws NullPointerException, BuildException {
+ if (arg == null) {
+ throw new NullPointerException("arg");
+ }
+ if (isReference()) {
+ throw noChildrenAllowed();
+ }
+ if(arg.getFile() == null ) {
+ processorArgs.addElement(arg);
+ }
+ else {
+ loadFile(arg.getFile());
+ }
+ }
+ /**
+ * Add a <compilerarg>or <linkerarg> if specify the file attribute
+ *
+ * @param arg
+ * command line argument, must not be null
+ * @throws BuildException
+ * if the specify file not exist
+ */
+ protected void loadFile(File file)
+ throws BuildException {
+ FileReader fileReader;
+ BufferedReader in;
+ String str;
+ if (! file.exists()){
+ throw new BuildException("The file " + file + " is not existed");
+ }
+ try {
+ fileReader = new FileReader(file);
+ in = new BufferedReader(fileReader);
+ while ( (str = in.readLine()) != null ){
+ if(str.trim() == ""){
+ continue ;
+ }
+ str = getProject().replaceProperties(str);
+ CommandLineArgument newarg = new CommandLineArgument();
+ newarg.setValue(str.trim());
+ processorArgs.addElement(newarg);
+ }
+ }
+ catch(Exception e){
+ throw new BuildException(e.getMessage());
+ }
+ }
+ /**
+ * Adds a <compilerarg>or <linkerarg>
+ *
+ * @param arg
+ * command line argument, must not be null
+ * @throws NullPointerException
+ * if arg is null
+ * @throws BuildException
+ * if this definition is a reference
+ */
+ protected void addConfiguredProcessorParam(ProcessorParam param)
+ throws NullPointerException, BuildException {
+ if (param == null) {
+ throw new NullPointerException("param");
+ }
+ if (isReference()) {
+ throw noChildrenAllowed();
+ }
+ processorParams.addElement(param);
+ }
+ /**
+ * Add an environment variable to the launched process.
+ */
+ public void addEnv(Environment.Variable var) {
+ if (env == null) {
+ env = new Environment();
+ }
+ env.addVariable(var);
+ }
+ /**
+ * Adds a source file set.
+ *
+ * Files in these set will be processed by this configuration and will not
+ * participate in the auction.
+ *
+ * @param srcSet
+ * Fileset identifying files that should be processed by this
+ * processor
+ * @throws BuildException
+ * if processor definition is a reference
+ */
+ public void addFileset(ConditionalFileSet srcSet) throws BuildException {
+ if (isReference()) {
+ throw noChildrenAllowed();
+ }
+ srcSet.setProject(getProject());
+ srcSets.addElement(srcSet);
+ }
+ /**
+ * Creates a configuration
+ *
+ * @param baseDef
+ * reference to def from containing <cc>element, may be null
+ * @return configuration
+ *
+ */
+ public ProcessorConfiguration createConfiguration(CCTask task,
+ LinkType linkType, ProcessorDef baseDef, TargetDef targetPlatform) {
+ if (isReference()) {
+ return ((ProcessorDef) getCheckedRef(ProcessorDef.class,
+ "ProcessorDef")).createConfiguration(task, linkType,
+ baseDef, targetPlatform);
+ }
+ ProcessorDef[] defaultProviders = getDefaultProviders(baseDef);
+ Processor proc = getProcessor();
+ return proc.createConfiguration(task, linkType, defaultProviders, this, targetPlatform);
+ }
+ /**
+ * Prepares list of processor arguments ( <compilerarg>, <linkerarg>) that
+ * are active for the current project settings.
+ *
+ * @return active compiler arguments
+ */
+ public CommandLineArgument[] getActiveProcessorArgs() {
+ Project p = getProject();
+ if (p == null) {
+ throw new java.lang.IllegalStateException("project must be set");
+ }
+ if (isReference()) {
+ return ((ProcessorDef) getCheckedRef(ProcessorDef.class,
+ "ProcessorDef")).getActiveProcessorArgs();
+ }
+ Vector activeArgs = new Vector(processorArgs.size());
+ for (int i = 0; i < processorArgs.size(); i++) {
+ CommandLineArgument arg = (CommandLineArgument) processorArgs
+ .elementAt(i);
+ if (arg.isActive(p)) {
+ activeArgs.addElement(arg);
+ }
+ }
+ CommandLineArgument[] array = new CommandLineArgument[activeArgs.size()];
+ activeArgs.copyInto(array);
+ return array;
+ }
+ /**
+ * Prepares list of processor arguments ( <compilerarg>, <linkerarg>) that
+ * are active for the current project settings.
+ *
+ * @return active compiler arguments
+ */
+ public ProcessorParam[] getActiveProcessorParams() {
+ Project p = getProject();
+ if (p == null) {
+ throw new java.lang.IllegalStateException("project must be set");
+ }
+ if (isReference()) {
+ return ((ProcessorDef) getCheckedRef(ProcessorDef.class,
+ "ProcessorDef")).getActiveProcessorParams();
+ }
+ Vector activeParams = new Vector(processorParams.size());
+ for (int i = 0; i < processorParams.size(); i++) {
+ ProcessorParam param = (ProcessorParam) processorParams
+ .elementAt(i);
+ if (param.isActive(p)) {
+ activeParams.addElement(param);
+ }
+ }
+ ProcessorParam[] array = new ProcessorParam[activeParams.size()];
+ activeParams.copyInto(array);
+ return array;
+ }
+ /**
+ * Gets boolean indicating debug build
+ *
+ * @param defaultProviders
+ * array of ProcessorDef's in descending priority
+ * @param index
+ * index to first element in array that should be considered
+ * @return if true, built targets for debugging
+ */
+ public boolean getDebug(ProcessorDef[] defaultProviders, int index) {
+ if (isReference()) {
+ return ((ProcessorDef) getCheckedRef(ProcessorDef.class,
+ "ProcessorDef")).getDebug(defaultProviders, index);
+ }
+ if (debug != null) {
+ return debug.booleanValue();
+ } else {
+ if (defaultProviders != null && index < defaultProviders.length) {
+ return defaultProviders[index].getDebug(defaultProviders,
+ index + 1);
+ }
+ }
+ return false;
+ }
+ /**
+ * Creates an chain of objects which provide default values in descending
+ * order of significance.
+ *
+ * @param baseDef
+ * corresponding ProcessorDef from CCTask, will be last element
+ * in array unless inherit = false
+ * @return default provider array
+ *
+ */
+ protected final ProcessorDef[] getDefaultProviders(ProcessorDef baseDef) {
+ ProcessorDef extendsDef = getExtends();
+ Vector chain = new Vector();
+ while (extendsDef != null && !chain.contains(extendsDef)) {
+ chain.addElement(extendsDef);
+ extendsDef = extendsDef.getExtends();
+ }
+ if (baseDef != null && getInherit()) {
+ chain.addElement(baseDef);
+ }
+ ProcessorDef[] defaultProviders = new ProcessorDef[chain.size()];
+ chain.copyInto(defaultProviders);
+ return defaultProviders;
+ }
+ /**
+ * Gets the ProcessorDef specified by the extends attribute
+ *
+ * @return Base ProcessorDef, null if extends is not specified
+ * @throws BuildException
+ * if reference is not same type object
+ */
+ public ProcessorDef getExtends() throws BuildException {
+ if (extendsRef != null) {
+ Object obj = extendsRef.getReferencedObject(getProject());
+ if (!getClass().isInstance(obj)) {
+ throw new BuildException("Referenced object "
+ + extendsRef.getRefId() + " not correct type, is "
+ + obj.getClass().getName() + " should be "
+ + getClass().getName());
+ }
+ return (ProcessorDef) obj;
+ }
+ return null;
+ }
+ /**
+ * Gets the inherit attribute. If the inherit value is true, this processor
+ * definition will inherit default values from the containing <cc>element.
+ *
+ * @return if true then properties from the containing <cc>element are
+ * used.
+ */
+ public final boolean getInherit() {
+ return inherit;
+ }
+ public boolean getLibtool() {
+ if (libtool != null) {
+ return libtool.booleanValue();
+ }
+ if (isReference()) {
+ return ((ProcessorDef) getCheckedRef(ProcessorDef.class,
+ "ProcessorDef")).getLibtool();
+ }
+ ProcessorDef extendsDef = getExtends();
+ if (extendsDef != null) {
+ return extendsDef.getLibtool();
+ }
+ return false;
+ }
+ /**
+ * Obtains the appropriate processor (compiler, linker)
+ *
+ * @return processor
+ */
+ protected Processor getProcessor() {
+ if (isReference()) {
+ return ((ProcessorDef) getCheckedRef(ProcessorDef.class,
+ "ProcessorDef")).getProcessor();
+ }
+ //
+ // if a processor has not been explicitly set
+ // then may be set by an extended definition
+ if (processor == null) {
+ ProcessorDef extendsDef = getExtends();
+ if (extendsDef != null) {
+ return extendsDef.getProcessor();
+ }
+ }
+ return processor;
+ }
+ /**
+ * Gets a boolean value indicating whether all targets must be rebuilt
+ * regardless of dependency analysis.
+ *
+ * @param defaultProviders
+ * array of ProcessorDef's in descending priority
+ * @param index
+ * index to first element in array that should be considered
+ * @return true if all targets should be rebuilt.
+ */
+ public boolean getRebuild(ProcessorDef[] defaultProviders, int index) {
+ if (isReference()) {
+ return ((ProcessorDef) getCheckedRef(ProcessorDef.class,
+ "ProcessorDef")).getRebuild(defaultProviders, index);
+ }
+ if (rebuild != null) {
+ return rebuild.booleanValue();
+ } else {
+ if (defaultProviders != null && index < defaultProviders.length) {
+ return defaultProviders[index].getRebuild(defaultProviders,
+ index + 1);
+ }
+ }
+ return false;
+ }
+ /**
+ * Returns true if the processor definition contains embedded file set
+ * definitions
+ *
+ * @return true if processor definition contains embedded filesets
+ */
+ public boolean hasFileSets() {
+ if (isReference()) {
+ return ((ProcessorDef) getCheckedRef(ProcessorDef.class,
+ "ProcessorDef")).hasFileSets();
+ }
+ return srcSets.size() > 0;
+ }
+ /**
+ * Determine if this def should be used.
+ *
+ * Definition will be active if the "if" variable (if specified) is set and
+ * the "unless" variable (if specified) is not set and that all reference
+ * or extended definitions are active
+ *
+ * @return true if processor is active
+ * @throws IllegalStateException
+ * if not properly initialized
+ * @throws BuildException
+ * if "if" or "unless" variable contains suspicious values
+ * "false" or "no" which indicates possible confusion
+ */
+ public boolean isActive() throws BuildException, IllegalStateException {
+ Project project = getProject();
+ if (!CUtil.isActive(project, ifProp, unlessProp)) {
+ return false;
+ }
+ if (isReference()) {
+ if (!((ProcessorDef) getCheckedRef(ProcessorDef.class,
+ "ProcessorDef")).isActive()) {
+ return false;
+ }
+ }
+ //
+ // walk through any extended definitions
+ //
+ ProcessorDef[] defaultProviders = getDefaultProviders(null);
+ for (int i = 0; i < defaultProviders.length; i++) {
+ if (!defaultProviders[i].isActive()) {
+ return false;
+ }
+ }
+ return true;
+ }
+ /**
+ * Sets the class name for the adapter. Use the "name" attribute when the
+ * tool is supported.
+ *
+ * @param className
+ * full class name
+ *
+ */
+ public void setClassname(String className) throws BuildException {
+ Object proc = null;
+ try {
+ Class implClass = ProcessorDef.class.getClassLoader().loadClass(
+ className);
+ try {
+ Method getInstance = implClass.getMethod("getInstance",
+ new Class[0]);
+ proc = getInstance.invoke(null, new Object[0]);
+ } catch (Exception ex) {
+ proc = implClass.newInstance();
+ }
+ } catch (Exception ex) {
+ throw new BuildException(ex);
+ }
+ setProcessor((Processor) proc);
+ }
+ /**
+ * If set true, all targets will be built for debugging.
+ *
+ * @param debug
+ * true if targets should be built for debugging
+ * @throws BuildException
+ * if processor definition is a reference
+ */
+ public void setDebug(boolean debug) throws BuildException {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ this.debug = booleanValueOf(debug);
+ }
+ /**
+ * Sets a description of the current data type.
+ */
+ public void setDescription(String desc) {
+ super.setDescription(desc);
+ }
+ /**
+ * Specifies that this element extends the element with id attribute with a
+ * matching value. The configuration will be constructed from the settings
+ * of this element, element referenced by extends, and the containing cc
+ * element.
+ *
+ * @param extendsRef
+ * Reference to the extended processor definition.
+ * @throws BuildException
+ * if this processor definition is a reference
+ */
+ public void setExtends(Reference extendsRef) throws BuildException {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ this.extendsRef = extendsRef;
+ }
+ /**
+ * Sets an id that can be used to reference this element.
+ *
+ * @param id
+ * id
+ */
+ public void setId(String id) {
+ //
+ // this is actually accomplished by a different
+ // mechanism, but we can document it
+ //
+ }
+ /**
+ * Sets the property name for the 'if' condition.
+ *
+ * The configuration will be ignored unless the property is defined.
+ *
+ * The value of the property is insignificant, but values that would imply
+ * misinterpretation ("false", "no") will throw an exception when
+ * evaluated.
+ *
+ * @param propName
+ * name of property
+ */
+ public void setIf(String propName) {
+ ifProp = propName;
+ }
+ /**
+ * If inherit has the default value of true, defines, includes and other
+ * settings from the containing <cc>element will be inherited.
+ *
+ * @param inherit
+ * new value
+ * @throws BuildException
+ * if processor definition is a reference
+ */
+ public void setInherit(boolean inherit) throws BuildException {
+ if (isReference()) {
+ throw super.tooManyAttributes();
+ }
+ this.inherit = inherit;
+ }
+ /**
+ * Set use of libtool.
+ *
+ * If set to true, the "libtool " will be prepended to the command line
+ *
+ * @param libtool
+ * If true, use libtool.
+ */
+ public void setLibtool(boolean libtool) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ this.libtool = booleanValueOf(libtool);
+ }
+ /**
+ * Do not propagate old environment when new environment variables are
+ * specified.
+ */
+ public void setNewenvironment(boolean newenv) {
+ newEnvironment = newenv;
+ }
+ /**
+ * Sets the processor
+ *
+ * @param processor
+ * processor, may not be null.
+ * @throws BuildException
+ * if ProcessorDef is a reference
+ * @throws NullPointerException
+ * if processor is null
+ */
+ protected void setProcessor(Processor processor) throws BuildException,
+ NullPointerException {
+ if (processor == null) {
+ throw new NullPointerException("processor");
+ }
+ if (isReference()) {
+ throw super.tooManyAttributes();
+ }
+ if (env == null && !newEnvironment) {
+ this.processor = processor;
+ } else {
+ this.processor = processor.changeEnvironment(newEnvironment, env);
+ }
+ }
+ /**
+ * If set true, all targets will be unconditionally rebuilt.
+ *
+ * @param rebuild
+ * if true, rebuild all targets.
+ * @throws BuildException
+ * if processor definition is a reference
+ */
+ public void setRebuild(boolean rebuild) throws BuildException {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ this.rebuild = booleanValueOf(rebuild);
+ }
+ /**
+ * Specifies that this element should behave as if the content of the
+ * element with the matching id attribute was inserted at this location. If
+ * specified, no other attributes or child content should be specified,
+ * other than "if", "unless" and "description".
+ *
+ * @param ref
+ * Reference to other element
+ *
+ */
+ public void setRefid(org.apache.tools.ant.types.Reference ref) {
+ super.setRefid(ref);
+ }
+ /**
+ * Set the property name for the 'unless' condition.
+ *
+ * If named property is set, the configuration will be ignored.
+ *
+ * The value of the property is insignificant, but values that would imply
+ * misinterpretation ("false", "no") of the behavior will throw an
+ * exception when evaluated.
+ *
+ * @param propName
+ * name of property
+ */
+ public void setUnless(String propName) {
+ unlessProp = propName;
+ }
+ /**
+ * This method calls the FileVistor's visit function for every file in the
+ * processors definition
+ *
+ * @param visitor
+ * object whose visit method is called for every file
+ */
+ public void visitFiles(FileVisitor visitor) {
+ Project p = getProject();
+ if (p == null) {
+ throw new java.lang.IllegalStateException(
+ "project must be set before this call");
+ }
+ if (isReference()) {
+ ((ProcessorDef) getCheckedRef(ProcessorDef.class, "ProcessorDef"))
+ .visitFiles(visitor);
+ }
+ //
+ // if this processor extends another,
+ // visit its files first
+ //
+ ProcessorDef extendsDef = getExtends();
+ if (extendsDef != null) {
+ extendsDef.visitFiles(visitor);
+ }
+ for (int i = 0; i < srcSets.size(); i++) {
+ ConditionalFileSet srcSet = (ConditionalFileSet) srcSets
+ .elementAt(i);
+ if (srcSet.isActive()) {
+ // Find matching source files
+ DirectoryScanner scanner = srcSet.getDirectoryScanner(p);
+ // Check each source file - see if it needs compilation
+ String[] fileNames = scanner.getIncludedFiles();
+ File parentDir = scanner.getBasedir();
+ for (int j = 0; j < fileNames.length; j++) {
+ String currentFile = fileNames[j];
+ visitor.visit(parentDir, currentFile);
+ }
+ }
+ }
+ }
+ public Vector getSrcSets() {
+ if (isReference()) {
+ return ((ProcessorDef) getCheckedRef(ProcessorDef.class,
+ "ProcessorDef")).getSrcSets();
+ }
+ return srcSets;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ProcessorEnumValue.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ProcessorEnumValue.java
new file mode 100644
index 0000000..d028052
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ProcessorEnumValue.java
@@ -0,0 +1,47 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+import net.sf.antcontrib.cpptasks.compiler.Processor;
+/**
+ * One entry in the arrays used by the CompilerEnum and LinkerEnum classes.
+ *
+ * @author Curt Arnold
+ * @see CompilerEnum
+ * @see LinkerEnum
+ *
+ */
+public class ProcessorEnumValue {
+ public static String[] getValues(ProcessorEnumValue[] processors) {
+ String[] values = new String[processors.length];
+ for (int i = 0; i < processors.length; i++) {
+ values[i] = processors[i].getName();
+ }
+ return values;
+ }
+ private String name;
+ private Processor processor;
+ public ProcessorEnumValue(String name, Processor processor) {
+ this.name = name;
+ this.processor = processor;
+ }
+ public String getName() {
+ return name;
+ }
+ public Processor getProcessor() {
+ return processor;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ProcessorParam.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ProcessorParam.java
new file mode 100644
index 0000000..b2d4796
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ProcessorParam.java
@@ -0,0 +1,100 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+/*******************************************************************************
+ * Place class description here.
+ *
+ * @author inger
+ * @author <additional author>
+ *
+ * @since
+ ******************************************************************************/
+public class ProcessorParam {
+ private String ifCond;
+ private String name;
+ private String unlessCond;
+ private String value;
+ public ProcessorParam() {
+ }
+ public String getName() {
+ return name;
+ }
+ public String getValue() {
+ return value;
+ }
+ /**
+ * Returns true if the define's if and unless conditions (if any) are
+ * satisfied.
+ */
+ public boolean isActive(org.apache.tools.ant.Project p) {
+ if (value == null) {
+ return false;
+ }
+ if (ifCond != null && p.getProperty(ifCond) == null) {
+ return false;
+ } else if (unlessCond != null && p.getProperty(unlessCond) != null) {
+ return false;
+ }
+ return true;
+ }
+ /**
+ * Sets the property name for the 'if' condition.
+ *
+ * The argument will be ignored unless the property is defined.
+ *
+ * The value of the property is insignificant, but values that would imply
+ * misinterpretation ("false", "no") will throw an exception when
+ * evaluated.
+ */
+ public void setIf(String propName) {
+ ifCond = propName;
+ }
+ /**
+ * Specifies relative location of argument on command line. "start" will
+ * place argument at start of command line, "mid" will place argument after
+ * all "start" arguments but before filenames, "end" will place argument
+ * after filenames.
+ *
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+ /**
+ * Set the property name for the 'unless' condition.
+ *
+ * If named property is set, the argument will be ignored.
+ *
+ * The value of the property is insignificant, but values that would imply
+ * misinterpretation ("false", "no") of the behavior will throw an
+ * exception when evaluated.
+ *
+ * @param propName
+ * name of property
+ */
+ public void setUnless(String propName) {
+ unlessCond = propName;
+ }
+ /**
+ * Specifies the string that should appear on the command line. The
+ * argument will be quoted if it contains embedded blanks. Use multiple
+ * arguments to avoid quoting.
+ *
+ */
+ public void setValue(String value) {
+ this.value = value;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/RuntimeType.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/RuntimeType.java
new file mode 100644
index 0000000..02da661
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/RuntimeType.java
@@ -0,0 +1,26 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+import org.apache.tools.ant.types.EnumeratedAttribute;
+/**
+ * Enumerated attribute with the values "dynamic" and "static",
+ */
+public class RuntimeType extends EnumeratedAttribute {
+ public String[] getValues() {
+ return new String[]{"dynamic", "static"};
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/SourceHistory.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/SourceHistory.java
new file mode 100644
index 0000000..0c608b4
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/SourceHistory.java
@@ -0,0 +1,51 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+import java.io.File;
+import java.io.IOException;
+/**
+ * The history of a source file used to build a target
+ *
+ * @author Curt Arnold
+ */
+public final class SourceHistory {
+ private/* final */long lastModified;
+ private/* final */String relativePath;
+ /**
+ * Constructor
+ */
+ public SourceHistory(String relativePath, long lastModified) {
+ if (relativePath == null) {
+ throw new NullPointerException("relativePath");
+ }
+ this.relativePath = relativePath;
+ this.lastModified = lastModified;
+ }
+ public String getAbsolutePath(File baseDir) {
+ try {
+ return new File(baseDir, relativePath).getCanonicalPath();
+ } catch (IOException ex) {
+ }
+ return relativePath;
+ }
+ public long getLastModified() {
+ return lastModified;
+ }
+ public String getRelativePath() {
+ return relativePath;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/SubsystemEnum.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/SubsystemEnum.java
new file mode 100644
index 0000000..3dc342a
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/SubsystemEnum.java
@@ -0,0 +1,34 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+import org.apache.tools.ant.types.EnumeratedAttribute;
+/**
+ * Enumeration of supported subsystems
+ *
+ * @author Curt Arnold
+ *
+ */
+public final class SubsystemEnum extends EnumeratedAttribute {
+ private final static String[] values = new String[]{"gui", "console",
+ "other"};
+ public SubsystemEnum() {
+ setValue("gui");
+ }
+ public String[] getValues() {
+ return (String[]) values.clone();
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/TargetDef.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/TargetDef.java
new file mode 100644
index 0000000..8e46cb7
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/TargetDef.java
@@ -0,0 +1,228 @@
+/*
+ *
+ * Copyright 2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+
+import org.apache.tools.ant.types.DataType;
+import org.apache.tools.ant.types.Reference;
+
+/**
+ * Information on the execution platforms for the generated code.
+ * (Non-functional prototype)
+ *
+ */
+public final class TargetDef
+ extends DataType {
+ /**
+ * if property.
+ */
+ private String ifCond;
+
+ /**
+ * unless property.
+ */
+ private String unlessCond;
+
+ /**
+ * cpu.
+ *
+ */
+ private CPUEnum cpu;
+
+ /**
+ * architecture.
+ *
+ */
+ private ArchEnum arch;
+
+ /**
+ * OS Family.
+ *
+ */
+ private OSFamilyEnum osFamily;
+
+ /**
+ * Constructor.
+ *
+ */
+ public TargetDef() {
+ }
+
+ /**
+ * Bogus method required for documentation generation.
+ */
+ public void execute() {
+ throw new org.apache.tools.ant.BuildException(
+ "Not an actual task, but looks like one for documentation purposes");
+ }
+
+ /**
+ * Returns true if the define's if and unless conditions (if any) are
+ * satisfied.
+ * @return true if active
+ */
+ public boolean isActive() {
+ return CUtil.isActive(getProject(), ifCond, unlessCond);
+ }
+
+ /**
+ * Sets a description of the current data type.
+ * @param desc description
+ */
+ public void setDescription(final String desc) {
+ super.setDescription(desc);
+ }
+
+ /**
+ * Sets an id that can be used to reference this element.
+ *
+ * @param id
+ * id
+ */
+ public void setId(final String id) {
+ //
+ // this is actually accomplished by a different
+ // mechanism, but we can document it
+ //
+ }
+
+ /**
+ * Sets the property name for the 'if' condition.
+ *
+ * The define will be ignored unless the property is defined.
+ *
+ * The value of the property is insignificant, but values that would imply
+ * misinterpretation ("false", "no") will throw an exception when
+ * evaluated.
+ *
+ * @param propName
+ * property name
+ */
+ public void setIf(final String propName) {
+ ifCond = propName;
+ }
+
+ /**
+ * Specifies that this element should behave as if the content of the
+ * element with the matching id attribute was inserted at this location. If
+ * specified, no other attributes should be specified.
+ * @param r id of referenced target
+ */
+ public void setRefid(final Reference r) {
+ super.setRefid(r);
+ }
+
+ /**
+ * Set the property name for the 'unless' condition.
+ *
+ * If named property is set, the define will be ignored.
+ *
+ * The value of the property is insignificant, but values that would imply
+ * misinterpretation ("false", "no") of the behavior will throw an
+ * exception when evaluated.
+ *
+ * @param propName
+ * name of property
+ */
+ public void setUnless(final String propName) {
+ unlessCond = propName;
+ }
+
+ /**
+ * Gets cpu.
+ * @return cpu, may be null.
+ *
+ */
+ public CPUEnum getCpu() {
+ if (isReference()) {
+ TargetDef refPlatform = (TargetDef)
+ getCheckedRef(TargetDef.class,
+ "TargetDef");
+ return refPlatform.getCpu();
+ }
+ return cpu;
+ }
+
+ /**
+ * Gets arch.
+ * @return arch, may be null.
+ *
+ */
+ public ArchEnum getArch() {
+ if (isReference()) {
+ TargetDef refPlatform = (TargetDef)
+ getCheckedRef(TargetDef.class,
+ "TargetDef");
+ return refPlatform.getArch();
+ }
+ return arch;
+ }
+
+ /**
+ * Gets operating system family.
+ * @return os family, may be null.
+ *
+ */
+ public OSFamilyEnum getOsfamily() {
+ if (isReference()) {
+ TargetDef refPlatform = (TargetDef)
+ getCheckedRef(TargetDef.class,
+ "TargetDef");
+ return refPlatform.getOsfamily();
+ }
+ return osFamily;
+ }
+
+ /**
+ * Sets preferred cpu, but does not use cpu specific instructions.
+ * @param value new value
+ */
+ public void setCpu(final CPUEnum value) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ cpu = value;
+ }
+
+ /**
+ * Sets cpu architecture, compiler may use cpu specific instructions.
+ * @param value new value
+ */
+ public void setArch(final ArchEnum value) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ if (cpu != null) {
+ throw tooManyAttributes();
+ }
+ arch = value;
+ }
+
+ /**
+ * Sets operating system family.
+ * @param value new value
+ */
+ public void setOsfamily(final OSFamilyEnum value) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ if (cpu != null) {
+ throw tooManyAttributes();
+ }
+ osFamily = value;
+ }
+
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/TargetHistory.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/TargetHistory.java
new file mode 100644
index 0000000..0094c8e
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/TargetHistory.java
@@ -0,0 +1,58 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+/**
+ * A description of a file built or to be built
+ */
+public final class TargetHistory {
+ private/* final */String config;
+ private/* final */String output;
+ private/* final */long outputLastModified;
+ private/* final */SourceHistory[] sources;
+ /**
+ * Constructor from build step
+ */
+ public TargetHistory(String config, String output, long outputLastModified,
+ SourceHistory[] sources) {
+ if (config == null) {
+ throw new NullPointerException("config");
+ }
+ if (sources == null) {
+ throw new NullPointerException("source");
+ }
+ if (output == null) {
+ throw new NullPointerException("output");
+ }
+ this.config = config;
+ this.output = output;
+ this.outputLastModified = outputLastModified;
+ this.sources = (SourceHistory[]) sources.clone();
+ }
+ public String getOutput() {
+ return output;
+ }
+ public long getOutputLastModified() {
+ return outputLastModified;
+ }
+ public String getProcessorConfiguration() {
+ return config;
+ }
+ public SourceHistory[] getSources() {
+ SourceHistory[] clone = (SourceHistory[]) sources.clone();
+ return clone;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/TargetHistoryTable.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/TargetHistoryTable.java
new file mode 100644
index 0000000..9fb0a7b
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/TargetHistoryTable.java
@@ -0,0 +1,426 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Vector;
+
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import net.sf.antcontrib.cpptasks.compiler.ProcessorConfiguration;
+
+import org.apache.tools.ant.BuildException;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+/**
+ * A history of the compiler and linker settings used to build the files in the
+ * same directory as the history.
+ *
+ * @author Curt Arnold
+ */
+public final class TargetHistoryTable {
+ /**
+ * This class handles populates the TargetHistory hashtable in response to
+ * SAX parse events
+ */
+ private class TargetHistoryTableHandler extends DefaultHandler {
+ private final File baseDir;
+ private String config;
+ private final Hashtable history;
+ private String output;
+ private long outputLastModified;
+ private final Vector sources = new Vector();
+ /**
+ * Constructor
+ *
+ * @param history
+ * hashtable of TargetHistory keyed by output name
+ * @param outputFiles
+ * existing files in output directory
+ */
+ private TargetHistoryTableHandler(Hashtable history, File baseDir) {
+ this.history = history;
+ config = null;
+ output = null;
+ this.baseDir = baseDir;
+ }
+ public void endElement(String namespaceURI, String localName,
+ String qName) throws SAXException {
+ //
+ // if </target> then
+ // create TargetHistory object and add to hashtable
+ // if corresponding output file exists and
+ // has the same timestamp
+ //
+ if (qName.equals("target")) {
+ if (config != null && output != null) {
+ File existingFile = new File(baseDir, output);
+ //
+ // if the corresponding files doesn't exist or has a
+ // different
+ // modification time, then discard this record
+ if (existingFile.exists()) {
+ long existingLastModified = existingFile.lastModified();
+ //
+ // would have expected exact time stamps
+ // but have observed slight differences
+ // in return value for multiple evaluations of
+ // lastModified(). Check if times are within
+ // a second
+ long diff = outputLastModified - existingLastModified;
+ if (diff >= -500 && diff <= 500) {
+ SourceHistory[] sourcesArray = new SourceHistory[sources
+ .size()];
+ sources.copyInto(sourcesArray);
+ TargetHistory targetHistory = new TargetHistory(
+ config, output, outputLastModified,
+ sourcesArray);
+ history.put(output, targetHistory);
+ }
+ }
+ }
+ output = null;
+ sources.setSize(0);
+ } else {
+ //
+ // reset config so targets not within a processor element
+ // don't pick up a previous processors signature
+ //
+ if (qName.equals("processor")) {
+ config = null;
+ }
+ }
+ }
+ /**
+ * startElement handler
+ */
+ public void startElement(String namespaceURI, String localName,
+ String qName, Attributes atts) throws SAXException {
+ //
+ // if sourceElement
+ //
+ if (qName.equals("source")) {
+ String sourceFile = atts.getValue("file");
+ long sourceLastModified = Long.parseLong(atts
+ .getValue("lastModified"), 16);
+ sources.addElement(new SourceHistory(sourceFile,
+ sourceLastModified));
+ } else {
+ //
+ // if <target> element,
+ // grab file name and lastModified values
+ // TargetHistory object will be created in endElement
+ //
+ if (qName.equals("target")) {
+ sources.setSize(0);
+ output = atts.getValue("file");
+ outputLastModified = Long.parseLong(atts
+ .getValue("lastModified"), 16);
+ } else {
+ //
+ // if <processor> element,
+ // grab signature attribute
+ //
+ if (qName.equals("processor")) {
+ config = atts.getValue("signature");
+ }
+ }
+ }
+ }
+ }
+ /** Flag indicating whether the cache should be written back to file. */
+ private boolean dirty;
+ /**
+ * a hashtable of TargetHistory's keyed by output file name
+ */
+ private final Hashtable history = new Hashtable();
+ /** The file the cache was loaded from. */
+ private/* final */File historyFile;
+ private/* final */File outputDir;
+ private String outputDirPath;
+ /**
+ * Creates a target history table from history.xml in the output directory,
+ * if it exists. Otherwise, initializes the history table empty.
+ *
+ * @param task
+ * task used for logging history load errors
+ * @param outputDir
+ * output directory for task
+ */
+ public TargetHistoryTable(CCTask task, File outputDir)
+ throws BuildException {
+ if (outputDir == null) {
+ throw new NullPointerException("outputDir");
+ }
+ if (!outputDir.isDirectory()) {
+ throw new BuildException("Output directory is not a directory");
+ }
+ if (!outputDir.exists()) {
+ throw new BuildException("Output directory does not exist");
+ }
+ this.outputDir = outputDir;
+ try {
+ outputDirPath = outputDir.getCanonicalPath();
+ } catch (IOException ex) {
+ outputDirPath = outputDir.toString();
+ }
+ //
+ // load any existing history from file
+ // suppressing any records whose corresponding
+ // file does not exist, is zero-length or
+ // last modified dates differ
+ historyFile = new File(outputDir, "history.xml");
+ if (historyFile.exists()) {
+ SAXParserFactory factory = SAXParserFactory.newInstance();
+ factory.setValidating(false);
+ try {
+ SAXParser parser = factory.newSAXParser();
+ parser.parse(historyFile, new TargetHistoryTableHandler(
+ history, outputDir));
+ } catch (Exception ex) {
+ //
+ // a failure on loading this history is not critical
+ // but should be logged
+ task.log("Error reading history.xml: " + ex.toString());
+ }
+ } else {
+ //
+ // create empty history file for identifying new files by last
+ // modified
+ // timestamp comperation (to compare with
+ // System.currentTimeMillis() don't work on Unix, because it
+ // maesure timestamps only in seconds).
+ //
+ try {
+ FileOutputStream outputStream = new FileOutputStream(
+ historyFile);
+ byte[] historyElement = new byte[]{0x3C, 0x68, 0x69, 0x73,
+ 0x74, 0x6F, 0x72, 0x79, 0x2F, 0x3E};
+ outputStream.write(historyElement);
+ outputStream.close();
+ } catch (IOException ex) {
+ throw new BuildException("Can't create history file", ex);
+ }
+ }
+ }
+ public void commit() throws IOException {
+ //
+ // if not dirty, no need to update file
+ //
+ if (dirty) {
+ //
+ // build (small) hashtable of config id's in history
+ //
+ Hashtable configs = new Hashtable(20);
+ Enumeration elements = history.elements();
+ while (elements.hasMoreElements()) {
+ TargetHistory targetHistory = (TargetHistory) elements
+ .nextElement();
+ String configId = targetHistory.getProcessorConfiguration();
+ if (configs.get(configId) == null) {
+ configs.put(configId, configId);
+ }
+ }
+ FileOutputStream outStream = new FileOutputStream(historyFile);
+ OutputStreamWriter outWriter;
+ //
+ // early VM's don't support UTF-8 encoding
+ // try and fallback to the default encoding
+ // otherwise
+ String encodingName = "UTF-8";
+ try {
+ outWriter = new OutputStreamWriter(outStream, "UTF-8");
+ } catch (UnsupportedEncodingException ex) {
+ outWriter = new OutputStreamWriter(outStream);
+ encodingName = outWriter.getEncoding();
+ }
+ BufferedWriter writer = new BufferedWriter(outWriter);
+ writer.write("<?xml version='1.0' encoding='");
+ writer.write(encodingName);
+ writer.write("'?>\n");
+ writer.write("<history>\n");
+ StringBuffer buf = new StringBuffer(200);
+ Enumeration configEnum = configs.elements();
+ while (configEnum.hasMoreElements()) {
+ String configId = (String) configEnum.nextElement();
+ buf.setLength(0);
+ buf.append(" <processor signature=\"");
+ buf.append(CUtil.xmlAttribEncode(configId));
+ buf.append("\">\n");
+ writer.write(buf.toString());
+ elements = history.elements();
+ while (elements.hasMoreElements()) {
+ TargetHistory targetHistory = (TargetHistory) elements
+ .nextElement();
+ if (targetHistory.getProcessorConfiguration().equals(
+ configId)) {
+ buf.setLength(0);
+ buf.append(" <target file=\"");
+ buf.append(CUtil.xmlAttribEncode(targetHistory
+ .getOutput()));
+ buf.append("\" lastModified=\"");
+ buf.append(Long.toHexString(targetHistory
+ .getOutputLastModified()));
+ buf.append("\">\n");
+ writer.write(buf.toString());
+ SourceHistory[] sourceHistories = targetHistory
+ .getSources();
+ for (int i = 0; i < sourceHistories.length; i++) {
+ buf.setLength(0);
+ buf.append(" <source file=\"");
+ buf.append(CUtil.xmlAttribEncode(sourceHistories[i]
+ .getRelativePath()));
+ buf.append("\" lastModified=\"");
+ buf.append(Long.toHexString(sourceHistories[i]
+ .getLastModified()));
+ buf.append("\"/>\n");
+ writer.write(buf.toString());
+ }
+ writer.write(" </target>\n");
+ }
+ }
+ writer.write(" </processor>\n");
+ }
+ writer.write("</history>\n");
+ writer.close();
+ dirty = false;
+ }
+ }
+ public TargetHistory get(String configId, String outputName) {
+ TargetHistory targetHistory = (TargetHistory) history.get(outputName);
+ if (targetHistory != null) {
+ if (!targetHistory.getProcessorConfiguration().equals(configId)) {
+ targetHistory = null;
+ }
+ }
+ return targetHistory;
+ }
+ public void markForRebuild(Hashtable targetInfos) {
+ Enumeration targetInfoEnum = targetInfos.elements();
+ while (targetInfoEnum.hasMoreElements()) {
+ markForRebuild((TargetInfo) targetInfoEnum.nextElement());
+ }
+ }
+ public void markForRebuild(TargetInfo targetInfo) {
+ //
+ // if it must already be rebuilt, no need to check further
+ //
+ if (!targetInfo.getRebuild()) {
+ TargetHistory history = get(targetInfo.getConfiguration()
+ .toString(), targetInfo.getOutput().getName());
+ if (history == null) {
+ targetInfo.mustRebuild();
+ } else {
+ SourceHistory[] sourceHistories = history.getSources();
+ File[] sources = targetInfo.getSources();
+ if (sourceHistories.length != sources.length) {
+ targetInfo.mustRebuild();
+ } else {
+ for (int i = 0; i < sourceHistories.length
+ && !targetInfo.getRebuild(); i++) {
+ //
+ // relative file name, must absolutize it on output
+ // directory
+ //
+ boolean foundMatch = false;
+ String historySourcePath = sourceHistories[i]
+ .getAbsolutePath(outputDir);
+ for (int j = 0; j < sources.length; j++) {
+ File targetSource = sources[j];
+ String targetSourcePath = targetSource
+ .getAbsolutePath();
+ if (targetSourcePath.equals(historySourcePath)) {
+ foundMatch = true;
+ if (targetSource.lastModified() != sourceHistories[i]
+ .getLastModified()) {
+ targetInfo.mustRebuild();
+ break;
+ }
+ }
+ }
+ if (!foundMatch) {
+ targetInfo.mustRebuild();
+ }
+ }
+ }
+ }
+ }
+ }
+ public void update(ProcessorConfiguration config, String[] sources) {
+ String configId = config.getIdentifier();
+ String[] onesource = new String[1];
+ String outputName;
+ for (int i = 0; i < sources.length; i++) {
+ onesource[0] = sources[i];
+ outputName = config.getOutputFileName(sources[i]);
+ update(configId, outputName, onesource);
+ }
+ }
+ private void update(String configId, String outputName, String[] sources) {
+ File outputFile = new File(outputDir, outputName);
+ //
+ // if output file doesn't exist or predates the start of the
+ // compile step (most likely a compilation error) then
+ // do not write add a history entry
+ //
+ if (outputFile.exists()
+ && outputFile.lastModified() >= historyFile.lastModified()) {
+ dirty = true;
+ history.remove(outputName);
+ SourceHistory[] sourceHistories = new SourceHistory[sources.length];
+ for (int i = 0; i < sources.length; i++) {
+ File sourceFile = new File(sources[i]);
+ long lastModified = sourceFile.lastModified();
+ String relativePath = CUtil.getRelativePath(outputDirPath,
+ sourceFile);
+ sourceHistories[i] = new SourceHistory(relativePath,
+ lastModified);
+ }
+ TargetHistory newHistory = new TargetHistory(configId, outputName,
+ outputFile.lastModified(), sourceHistories);
+ history.put(outputName, newHistory);
+ }
+ }
+ public void update(TargetInfo linkTarget) {
+ File outputFile = linkTarget.getOutput();
+ String outputName = outputFile.getName();
+ //
+ // if output file doesn't exist or predates the start of the
+ // compile or link step (most likely a compilation error) then
+ // do not write add a history entry
+ //
+ if (outputFile.exists()
+ && outputFile.lastModified() >= historyFile.lastModified()) {
+ dirty = true;
+ history.remove(outputName);
+ SourceHistory[] sourceHistories = linkTarget
+ .getSourceHistories(outputDirPath);
+ TargetHistory newHistory = new TargetHistory(linkTarget
+ .getConfiguration().getIdentifier(), outputName, outputFile
+ .lastModified(), sourceHistories);
+ history.put(outputName, newHistory);
+ }
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/TargetInfo.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/TargetInfo.java
new file mode 100644
index 0000000..3a9dd14
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/TargetInfo.java
@@ -0,0 +1,127 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+import java.io.File;
+
+import net.sf.antcontrib.cpptasks.compiler.ProcessorConfiguration;
+/**
+ * A description of a file built or to be built
+ */
+public final class TargetInfo {
+ private static final File[] emptyFileArray = new File[0];
+ private/* final */ProcessorConfiguration config;
+ private/* final */File output;
+ private boolean rebuild;
+ private/* final */File[] sources;
+ private File[] sysSources;
+ public TargetInfo(ProcessorConfiguration config, File[] sources,
+ File[] sysSources, File output, boolean rebuild) {
+ if (config == null) {
+ throw new NullPointerException("config");
+ }
+ if (sources == null) {
+ throw new NullPointerException("sources");
+ }
+ if (output == null) {
+ throw new NullPointerException("output");
+ }
+ this.config = config;
+ this.sources = (File[]) sources.clone();
+ if (sysSources == null) {
+ this.sysSources = emptyFileArray;
+ } else {
+ this.sysSources = (File[]) sysSources.clone();
+ }
+ this.output = output;
+ this.rebuild = rebuild;
+ //
+ // if the output doesn't exist, must rebuild it
+ //
+ if (!output.exists()) {
+ rebuild = true;
+ }
+ }
+ public String[] getAllSourcePaths() {
+ String[] paths = new String[sysSources.length + sources.length];
+ for (int i = 0; i < sysSources.length; i++) {
+ paths[i] = sysSources[i].toString();
+ }
+ int offset = sysSources.length;
+ for (int i = 0; i < sources.length; i++) {
+ paths[offset + i] = sources[i].toString();
+ }
+ return paths;
+ }
+ public File[] getAllSources() {
+ File[] allSources = new File[sources.length + sysSources.length];
+ for (int i = 0; i < sysSources.length; i++) {
+ allSources[i] = sysSources[i];
+ }
+ int offset = sysSources.length;
+ for (int i = 0; i < sources.length; i++) {
+ allSources[i + offset] = sources[i];
+ }
+ return allSources;
+ }
+ public ProcessorConfiguration getConfiguration() {
+ return config;
+ }
+ public File getOutput() {
+ return output;
+ }
+ public boolean getRebuild() {
+ return rebuild;
+ }
+ /**
+ * Returns an array of SourceHistory objects (contains relative path and
+ * last modified time) for the source[s] of this target
+ */
+ public SourceHistory[] getSourceHistories(String basePath) {
+ SourceHistory[] histories = new SourceHistory[sources.length];
+ for (int i = 0; i < sources.length; i++) {
+ String relativeName = CUtil.getRelativePath(basePath, sources[i]);
+ long lastModified = sources[i].lastModified();
+ histories[i] = new SourceHistory(relativeName, lastModified);
+ }
+ return histories;
+ }
+ public String[] getSourcePaths() {
+ String[] paths = new String[sources.length];
+ for (int i = 0; i < sources.length; i++) {
+ paths[i] = sources[i].toString();
+ }
+ return paths;
+ }
+ public File[] getSources() {
+ File[] clone = (File[]) sources.clone();
+ return clone;
+ }
+ public String[] getSysSourcePaths() {
+ String[] paths = new String[sysSources.length];
+ for (int i = 0; i < sysSources.length; i++) {
+ paths[i] = sysSources[i].toString();
+ }
+ return paths;
+ }
+ public File[] getSysSources() {
+ File[] clone = (File[]) sysSources.clone();
+ return clone;
+ }
+ public void mustRebuild() {
+ this.rebuild = true;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/TargetMatcher.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/TargetMatcher.java
new file mode 100644
index 0000000..2574e15
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/TargetMatcher.java
@@ -0,0 +1,117 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+import java.io.File;
+import java.util.Hashtable;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.compiler.LinkerConfiguration;
+import net.sf.antcontrib.cpptasks.compiler.ProcessorConfiguration;
+
+import org.apache.tools.ant.BuildException;
+/**
+ * This class matches each visited file with an appropriate compiler
+ *
+ * @author Curt Arnold
+ */
+public final class TargetMatcher implements FileVisitor {
+ private LinkerConfiguration linker;
+ private Vector objectFiles;
+ private File outputDir;
+ private ProcessorConfiguration[] processors;
+ private final File sourceFiles[] = new File[1];
+ private Hashtable targets;
+ private CCTask task;
+ public TargetMatcher(CCTask task, File outputDir,
+ ProcessorConfiguration[] processors, LinkerConfiguration linker,
+ Vector objectFiles, Hashtable targets) {
+ this.task = task;
+ this.outputDir = outputDir;
+ this.processors = processors;
+ this.targets = targets;
+ this.linker = linker;
+ this.objectFiles = objectFiles;
+ }
+ public void visit(File parentDir, String filename) throws BuildException {
+ //
+ // see if any processor wants to bid
+ // on this one
+ ProcessorConfiguration selectedCompiler = null;
+ int bid = 0;
+ if (processors != null) {
+ for (int k = 0; k < processors.length; k++) {
+ int newBid = processors[k].bid(filename);
+ if (newBid > bid) {
+ bid = newBid;
+ selectedCompiler = processors[k];
+ }
+ }
+ }
+ //
+ // no processor interested in file
+ // log diagnostic message
+ if (bid <= 0) {
+ if (linker != null) {
+ int linkerbid = linker.bid(filename);
+ if (linkerbid > 0) {
+ File objFile = new File(parentDir, filename);
+ objectFiles.addElement(objFile);
+ if (linkerbid == 1) {
+ task.log("Unrecognized file type " + objFile.toString()
+ + " will be passed to linker");
+ }
+ }
+ }
+ } else {
+ //
+ // get output file name
+ //
+ String outputFileName = selectedCompiler
+ .getOutputFileName(filename);
+ //
+ // if there is some output for this task
+ // (that is a source file and not an header file)
+ //
+ if (outputFileName != null) {
+ sourceFiles[0] = new File(parentDir, filename);
+ //
+ // see if the same output file has already been registered
+ //
+ TargetInfo previousTarget = (TargetInfo) targets
+ .get(outputFileName);
+ if (previousTarget == null) {
+ targets.put(outputFileName, new TargetInfo(
+ selectedCompiler, sourceFiles, null, new File(
+ outputDir, outputFileName),
+ selectedCompiler.getRebuild()));
+ } else {
+ if (!previousTarget.getSources()[0].equals(sourceFiles[0])) {
+ StringBuffer builder = new StringBuffer(
+ "Output filename conflict: ");
+ builder.append(outputFileName);
+ builder.append(" would be produced from ");
+ builder.append(previousTarget.getSources()[0]
+ .toString());
+ builder.append(" and ");
+ builder.append(filename);
+ throw new BuildException(builder.toString());
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/VersionInfo.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/VersionInfo.java
new file mode 100644
index 0000000..f55b976
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/VersionInfo.java
@@ -0,0 +1,550 @@
+/*
+ *
+ * Copyright 2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks;
+
+import java.io.IOException;
+import java.io.Writer;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.DataType;
+import org.apache.tools.ant.types.Reference;
+
+/**
+ * Version Information. (Non-functional prototype)
+ *
+ */
+public class VersionInfo extends DataType {
+ /**
+ * if property.
+ */
+ private String ifCond;
+ /**
+ * unless property.
+ */
+ private String unlessCond;
+
+ /**
+ * extends property.
+ */
+ private String extendsId;
+
+ /**
+ * file version.
+ *
+ */
+ private String fileVersion;
+ /**
+ * Product version.
+ *
+ */
+ private String productVersion;
+ /**
+ * file language.
+ *
+ */
+ private String language;
+
+ /**
+ * comments.
+ *
+ */
+ private String fileComments;
+ /**
+ * Company name.
+ *
+ */
+ private String companyName;
+ /**
+ * Description.
+ *
+ */
+ private String description;
+ /**
+ * internal name.
+ */
+ private String internalName;
+ /**
+ * legal copyright.
+ *
+ */
+ private String legalCopyright;
+ /**
+ * legal trademark.
+ *
+ */
+ private String legalTrademark;
+ /**
+ * original filename.
+ *
+ */
+ private String originalFilename;
+ /**
+ * private build.
+ *
+ */
+ private String privateBuild;
+ /**
+ * product name.
+ *
+ */
+ private String productName;
+ /**
+ * Special build
+ */
+ private String specialBuild;
+ /**
+ * compatibility version
+ *
+ */
+ private String compatibilityVersion;
+
+
+ /**
+ * Constructor.
+ *
+ */
+ public VersionInfo() {
+ }
+ public void execute() throws org.apache.tools.ant.BuildException {
+ throw new org.apache.tools.ant.BuildException(
+ "Not an actual task, but looks like one for documentation purposes");
+ }
+ /**
+ * Returns true if the define's if and unless conditions (if any) are
+ * satisfied.
+ *
+ * @exception BuildException
+ * throws build exception if name is not set
+ */
+ public final boolean isActive() throws BuildException {
+ return CUtil.isActive(getProject(), ifCond, unlessCond);
+ }
+ /**
+ * Sets an id that can be used to reference this element.
+ *
+ * @param id
+ * id
+ */
+ public void setId(String id) {
+ //
+ // this is actually accomplished by a different
+ // mechanism, but we can document it
+ //
+ }
+ /**
+ * Sets the name of a version info that this info extends.
+ *
+ * @param id
+ * id
+ */
+ public void setExtends(String id) {
+ extendsId = id;
+ }
+
+
+ /**
+ * Sets the property name for the 'if' condition.
+ *
+ * The define will be ignored unless the property is defined.
+ *
+ * The value of the property is insignificant, but values that would imply
+ * misinterpretation ("false", "no") will throw an exception when
+ * evaluated.
+ *
+ * @param propName
+ * property name
+ */
+ public final void setIf(String propName) {
+ ifCond = propName;
+ }
+ /**
+ * Specifies that this element should behave as if the content of the
+ * element with the matching id attribute was inserted at this location. If
+ * specified, no other attributes should be specified.
+ *
+ */
+ public void setRefid(Reference r) throws BuildException {
+ super.setRefid(r);
+ }
+ /**
+ * Set the property name for the 'unless' condition.
+ *
+ * If named property is set, the define will be ignored.
+ *
+ * The value of the property is insignificant, but values that would imply
+ * misinterpretation ("false", "no") of the behavior will throw an
+ * exception when evaluated.
+ *
+ * @param propName
+ * name of property
+ */
+ public final void setUnless(String propName) {
+ unlessCond = propName;
+ }
+ /**
+ * Gets file version.
+ * @return file version, may be null.
+ *
+ */
+ public String getFileversion() {
+ if (isReference()) {
+ VersionInfo refVersion = (VersionInfo)
+ getCheckedRef(VersionInfo.class,
+ "VersionInfo");
+ return refVersion.getFileversion();
+ }
+ return fileVersion;
+ }
+ /**
+ * Gets Product version.
+ * @return product version, may be null
+ */
+ public String getProductversion() {
+ if (isReference()) {
+ VersionInfo refVersion = (VersionInfo)
+ getCheckedRef(VersionInfo.class,
+ "VersionInfo");
+ return refVersion.getProductversion();
+ }
+ return productVersion;
+ }
+ /**
+ * Gets compatibility version.
+ * @return compatibility version, may be null
+ */
+ public String getCompatibilityversion() {
+ if (isReference()) {
+ VersionInfo refVersion = (VersionInfo)
+ getCheckedRef(VersionInfo.class,
+ "VersionInfo");
+ return refVersion.getCompatibilityversion();
+ }
+ return compatibilityVersion;
+ }
+ /**
+ * Gets file language, should be an IETF RFC 3066 identifier, for example, en-US.
+ * @return language, may be null.
+ */
+ public String getLanguage() {
+ if (isReference()) {
+ VersionInfo refVersion = (VersionInfo)
+ getCheckedRef(VersionInfo.class,
+ "VersionInfo");
+ return refVersion.getLanguage();
+ }
+ return language;
+ }
+
+ /**
+ * Gets comments.
+ * @return comments, may be null.
+ */
+ public String getFilecomments() {
+ if (isReference()) {
+ VersionInfo refVersion = (VersionInfo)
+ getCheckedRef(VersionInfo.class,
+ "VersionInfo");
+ return refVersion.getFilecomments();
+ }
+ return fileComments;
+ }
+ /**
+ * Gets Company name.
+ * @return company name, may be null.
+ */
+ public String getCompanyname() {
+ if (isReference()) {
+ VersionInfo refVersion = (VersionInfo)
+ getCheckedRef(VersionInfo.class,
+ "VersionInfo");
+ return refVersion.getCompanyname();
+ }
+ return companyName;
+ }
+ /**
+ * Gets Description.
+ * @return description, may be null.
+ */
+ public String getDescription() {
+ if (isReference()) {
+ VersionInfo refVersion = (VersionInfo)
+ getCheckedRef(VersionInfo.class,
+ "VersionInfo");
+ return refVersion.getDescription();
+ }
+ return description;
+ }
+ /**
+ * Gets internal name.
+ * @return internal name, may be null.
+ */
+ public String getInternalname() {
+ if (isReference()) {
+ VersionInfo refVersion = (VersionInfo)
+ getCheckedRef(VersionInfo.class,
+ "VersionInfo");
+ return refVersion.getInternalname();
+ }
+ return internalName;
+ }
+ /**
+ * Gets legal copyright.
+ * @return legal copyright, may be null.
+ */
+ public String getLegalcopyright() {
+ if (isReference()) {
+ VersionInfo refVersion = (VersionInfo)
+ getCheckedRef(VersionInfo.class,
+ "VersionInfo");
+ return refVersion.getLegalcopyright();
+ }
+ return legalCopyright;
+ }
+ /**
+ * Gets legal trademark.
+ * @return legal trademark, may be null;
+ */
+ public String getLegaltrademark() {
+ if (isReference()) {
+ VersionInfo refVersion = (VersionInfo)
+ getCheckedRef(VersionInfo.class,
+ "VersionInfo");
+ return refVersion.getLegaltrademark();
+ }
+ return legalTrademark;
+ }
+ /**
+ * Gets original filename.
+ * @return original filename, may be null.
+ */
+ public String getOriginalfilename() {
+ if (isReference()) {
+ VersionInfo refVersion = (VersionInfo)
+ getCheckedRef(VersionInfo.class,
+ "VersionInfo");
+ return refVersion.getOriginalfilename();
+ }
+ return originalFilename;
+ }
+ /**
+ * Gets private build.
+ * @return private build, may be null.
+ */
+ public String getPrivatebuild() {
+ if (isReference()) {
+ VersionInfo refVersion = (VersionInfo)
+ getCheckedRef(VersionInfo.class,
+ "VersionInfo");
+ return refVersion.getPrivatebuild();
+ }
+ return privateBuild;
+ }
+ /**
+ * Gets product name.
+ * @return product name, may be null.
+ */
+ public String getProductname() {
+ if (isReference()) {
+ VersionInfo refVersion = (VersionInfo)
+ getCheckedRef(VersionInfo.class,
+ "VersionInfo");
+ return refVersion.getProductname();
+ }
+ return productName;
+ }
+ /**
+ * Special build
+ * @return special build, may be null.
+ */
+ public String getSpecialbuild() {
+ if (isReference()) {
+ VersionInfo refVersion = (VersionInfo)
+ getCheckedRef(VersionInfo.class,
+ "VersionInfo");
+ return refVersion.getSpecialbuild();
+ }
+ return specialBuild;
+ }
+
+ /**
+ * Sets file version.
+ * @param value new value
+ * @throws BuildException if specified with refid
+ */
+ public void setFileversion(String value) throws BuildException {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ fileVersion = value;
+ }
+ /**
+ * Sets product version.
+ * @param value new value
+ * @throws BuildException if specified with refid
+ */
+ public void setProductversion(String value) throws BuildException {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ productVersion = value;
+ }
+ /**
+ * Sets compatibility version.
+ * @param value new value
+ * @throws BuildException if specified with refid
+ */
+ public void setCompatibilityversion(String value) throws BuildException {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ compatibilityVersion = value;
+ }
+ /**
+ * Sets language.
+ * @param value new value, should be an IETF RFC 3066 language identifier.
+ * @throws BuildException if specified with refid
+ */
+ public void setLanguage(String value) throws BuildException {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ language = value;
+ }
+ /**
+ * Sets comments.
+ * @param value new value
+ * @throws BuildException if specified with refid
+ */
+ public void setFilecomments(String value) throws BuildException {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ fileComments = value;
+ }
+
+ /**
+ * Sets company name.
+ * @param value new value
+ * @throws BuildException if specified with refid
+ */
+ public void setCompanyname(String value) throws BuildException {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ companyName = value;
+ }
+
+
+ /**
+ * Sets internal name. Internal name will automatically be
+ * specified from build step, only set this value if
+ * intentionally overriding that value.
+ *
+ * @param value new value
+ * @throws BuildException if specified with refid
+ */
+ public void setInternalname(String value) throws BuildException {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ internalName = value;
+ }
+
+ /**
+ * Sets legal copyright.
+ * @param value new value
+ * @throws BuildException if specified with refid
+ */
+ public void setLegalcopyright(String value) throws BuildException {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ legalCopyright = value;
+ }
+ /**
+ * Sets legal trademark.
+ * @param value new value
+ * @throws BuildException if specified with refid
+ */
+ public void setLegaltrademark(String value) throws BuildException {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ legalTrademark = value;
+ }
+ /**
+ * Sets original name. Only set this value if
+ * intentionally overriding the value from the build set.
+ *
+ * @param value new value
+ * @throws BuildException if specified with refid
+ */
+ public void setOriginalfilename(String value) throws BuildException {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ originalFilename = value;
+ }
+ /**
+ * Sets private build.
+ * @param value new value
+ * @throws BuildException if specified with refid
+ */
+ public void setPrivatebuild(String value) throws BuildException {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ privateBuild = value;
+ }
+ /**
+ * Sets product name.
+ * @param value new value
+ * @throws BuildException if specified with refid
+ */
+ public void setProductname(String value) throws BuildException {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ productName= value;
+ }
+ /**
+ * Sets private build.
+ * @param value new value
+ * @throws BuildException if specified with refid
+ */
+ public void setSpecialbuild(String value) throws BuildException {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ specialBuild = value;
+ }
+
+ /**
+ * Writes windows resource
+ * @param writer writer, may not be null.
+ * @param project project, may not be null
+ * @param executableName name of executable
+ */
+ public void writeResource(final Writer writer,
+ final Project p,
+ final String executableName) throws IOException {
+ // TODO:
+
+ }
+
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/arm/ADSCCompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/arm/ADSCCompiler.java
new file mode 100644
index 0000000..78489b8
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/arm/ADSCCompiler.java
@@ -0,0 +1,215 @@
+/*
+ *
+ * Copyright 2003-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.arm;
+import java.io.File;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.OptimizationEnum;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineCCompiler;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+
+import org.apache.tools.ant.types.Environment;
+/**
+ * Adapter for the ARM C Compilers
+ *
+ * See Doc No: ARM DUI 0151A, Issued: Nov 2001 at
+ * http://www.arm.com/arm/User_Guides?OpenDocument
+ *
+ * @author Curt Arnold
+ *
+ */
+public class ADSCCompiler extends CommandLineCCompiler {
+ /**
+ * Header file extensions
+ */
+ private static final String[] headerExtensions = new String[]{".h", ".hpp",
+ ".inl"};
+ /**
+ * Source file extensions
+ */
+ private static final String[] sourceExtensions = new String[]{".c", ".cc",
+ ".cpp", ".cxx", ".c++"};
+ /**
+ * Singleton for ARM 32-bit C compiler
+ */
+ private static final ADSCCompiler armcc = new ADSCCompiler("armcc", false,
+ null);
+ /**
+ * Singleton for ARM 32-bit C++ compiler
+ */
+ private static final ADSCCompiler armcpp = new ADSCCompiler("armcpp",
+ false, null);
+ /**
+ * Singleton for ARM 16-bit C compiler
+ */
+ private static final ADSCCompiler tcc = new ADSCCompiler("tcc", false, null);
+ /**
+ * Singleton for ARM 16-bit C++ compiler
+ */
+ private static final ADSCCompiler tcpp = new ADSCCompiler("tcpp", false,
+ null);
+ /**
+ * Singleton for ARM 32-bit C compiler
+ */
+ public static ADSCCompiler getArmCC() {
+ return armcc;
+ }
+ /**
+ * Singleton for ARM 32-bit C++ compiler
+ */
+ public static ADSCCompiler getArmCpp() {
+ return armcpp;
+ }
+ /**
+ * Singleton for ARM 16-bit C compiler
+ */
+ public static ADSCCompiler getThumbCC() {
+ return tcpp;
+ }
+ /**
+ * Singleton for ARM 16-bit C++ compiler
+ */
+ public static ADSCCompiler getThumbCpp() {
+ return tcpp;
+ }
+ private static void quoteFile(StringBuffer buf, String outPath) {
+ if (outPath.indexOf(' ') >= 0) {
+ buf.append('\"');
+ buf.append(outPath);
+ buf.append('\"');
+ } else {
+ buf.append(outPath);
+ }
+ }
+ /**
+ * Private constructor
+ *
+ * @param command
+ * executable name
+ * @param newEnvironment
+ * Change environment
+ * @param env
+ * New environment
+ */
+ private ADSCCompiler(String command, boolean newEnvironment, Environment env) {
+ super(command, "-vsn", sourceExtensions, headerExtensions, ".o", false,
+ null, newEnvironment, env);
+ }
+ /**
+ * Adds command switches for generic configuration options
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineCompiler#addImpliedArgs(java.util.Vector,
+ * boolean, boolean, boolean,
+ * net.sf.antcontrib.cpptasks.compiler.LinkType)
+ */
+ protected void addImpliedArgs(Vector args,
+ final boolean debug,
+ final boolean multithreaded,
+ final boolean exceptions,
+ final LinkType linkType,
+ final Boolean rtti,
+ final OptimizationEnum optimization,
+ final Boolean defaultflag) {
+ if (debug) {
+ args.addElement("-g");
+ }
+ //
+ // didn't see anything about producing
+ // anything other than executables in the docs
+ if (linkType.isExecutable()) {
+ } else if (linkType.isSharedLibrary()) {
+ }
+ }
+ /**
+ * Adds flags that customize the warnings reported
+ *
+ * Compiler does not appear to have warning levels but ability to turn off
+ * specific errors by explicit switches, could fabricate levels by
+ * prioritizing errors.
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineCompiler#addWarningSwitch(java.util.Vector,
+ * int)
+ */
+ protected void addWarningSwitch(Vector args, int warnings) {
+ }
+ /**
+ * Add command line options for preprocessor macro
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineCompiler#getDefineSwitch(java.lang.StringBuffer,
+ * java.lang.String, java.lang.String)
+ */
+ protected void getDefineSwitch(StringBuffer buffer, String define,
+ String value) {
+ buffer.append("-D");
+ buffer.append(define);
+ if (value != null) {
+ buffer.append('=');
+ buffer.append(value);
+ }
+ }
+ /**
+ * ARMINC environment variable contains the default include path
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineCompiler#getEnvironmentIncludePath()
+ */
+ protected File[] getEnvironmentIncludePath() {
+ return CUtil.getPathFromEnvironment("ARMINC", ";");
+ }
+ /**
+ * Returns command line option to specify include directory
+ *
+ */
+ protected String getIncludeDirSwitch(String source) {
+ StringBuffer buf = new StringBuffer("-I");
+ quoteFile(buf, source);
+ return buf.toString();
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.Processor#getLinker(net.sf.antcontrib.cpptasks.compiler.LinkType)
+ */
+ public Linker getLinker(LinkType type) {
+ if (type.isStaticLibrary()) {
+ return ADSLibrarian.getInstance();
+ }
+ if (type.isSharedLibrary()) {
+ return ADSLinker.getDllInstance();
+ }
+ return ADSLinker.getInstance();
+ }
+ /**
+ * Maximum command line length
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineCompiler#getMaximumCommandLength()
+ */
+ public int getMaximumCommandLength() {
+ return 1000;
+ }
+ /*
+ * Adds command to undefine preprocessor macro
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineCompiler#getUndefineSwitch(java.lang.StringBuffer,
+ * java.lang.String)
+ */
+ protected void getUndefineSwitch(StringBuffer buffer, String define) {
+ buffer.append("-U");
+ buffer.append(define);
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/arm/ADSLibrarian.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/arm/ADSLibrarian.java
new file mode 100644
index 0000000..0ff53d3
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/arm/ADSLibrarian.java
@@ -0,0 +1,160 @@
+/*
+ *
+ * Copyright 2003-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.arm;
+
+import java.io.File;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.compiler.CommandLineLinker;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.types.LibraryTypeEnum;
+
+/**
+ * Adapter for ARM Librarian
+ *
+ * @author Curt Arnold
+ */
+public class ADSLibrarian extends CommandLineLinker {
+
+ private static final ADSLibrarian instance = new ADSLibrarian();
+
+ public static ADSLibrarian getInstance() {
+ return instance;
+ }
+
+ private ADSLibrarian()
+ {
+ super("armar",null,
+ new String[] { ".o" }, new String[0], ".lib", false, null);
+ }
+
+ /* (non-Javadoc)
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addBase(long, java.util.Vector)
+ */
+ protected void addBase(long base, Vector args) {
+ // TODO Auto-generated method stub
+
+ }
+
+ /* (non-Javadoc)
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addFixed(java.lang.Boolean, java.util.Vector)
+ */
+ protected void addFixed(Boolean fixed, Vector args) {
+ // TODO Auto-generated method stub
+
+ }
+
+ /* (non-Javadoc)
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addImpliedArgs(boolean, net.sf.antcontrib.cpptasks.compiler.LinkType, java.util.Vector)
+ */
+ protected void addImpliedArgs(
+ boolean debug,
+ LinkType linkType,
+ Vector args,
+ Boolean defaultflag) {
+ // TODO Auto-generated method stub
+
+ }
+
+ /* (non-Javadoc)
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addIncremental(boolean, java.util.Vector)
+ */
+ protected void addIncremental(boolean incremental, Vector args) {
+ // TODO Auto-generated method stub
+
+ }
+
+ /* (non-Javadoc)
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addMap(boolean, java.util.Vector)
+ */
+ protected void addMap(boolean map, Vector args) {
+ // TODO Auto-generated method stub
+
+ }
+
+ /* (non-Javadoc)
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addStack(int, java.util.Vector)
+ */
+ protected void addStack(int stack, Vector args) {
+ // TODO Auto-generated method stub
+
+ }
+ /* (non-Javadoc)
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addEntry(int, java.util.Vector)
+ */
+ protected void addEntry(String entry, Vector args) {
+ // TODO Auto-generated method stub
+
+ }
+
+ /* (non-Javadoc)
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#getCommandFileSwitch(java.lang.String)
+ */
+ protected String getCommandFileSwitch(String commandFile) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see net.sf.antcontrib.cpptasks.compiler.Linker#getLibraryPath()
+ */
+ public File[] getLibraryPath() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see net.sf.antcontrib.cpptasks.compiler.Linker#getLibraryPatterns(java.lang.String[])
+ */
+ public String[] getLibraryPatterns(String[] libnames, LibraryTypeEnum libType) {
+ return new String[0];
+ }
+
+ /* (non-Javadoc)
+ * @see net.sf.antcontrib.cpptasks.compiler.Processor#getLinker(net.sf.antcontrib.cpptasks.compiler.LinkType)
+ */
+ public Linker getLinker(LinkType linkType) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#getMaximumCommandLength()
+ */
+ protected int getMaximumCommandLength() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ /* (non-Javadoc)
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#getOutputFileSwitch(java.lang.String)
+ */
+ protected String[] getOutputFileSwitch(String outputFile) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see net.sf.antcontrib.cpptasks.compiler.Linker#isCaseSensitive()
+ */
+ public boolean isCaseSensitive() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/arm/ADSLinker.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/arm/ADSLinker.java
new file mode 100644
index 0000000..042eb21
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/arm/ADSLinker.java
@@ -0,0 +1,166 @@
+/*
+ *
+ * Copyright 2003-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.arm;
+import java.io.File;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineLinker;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.types.LibraryTypeEnum;
+
+/**
+ * Adapter for the ARM Linker
+ *
+ * @author CurtA
+ */
+public class ADSLinker extends CommandLineLinker {
+ private static final ADSLinker dllInstance = new ADSLinker(".o");
+ private static final ADSLinker instance = new ADSLinker(".axf");
+ public static ADSLinker getDllInstance() {
+ return dllInstance;
+ }
+ public static ADSLinker getInstance() {
+ return instance;
+ }
+ private ADSLinker(String outputSuffix) {
+ super("armlink", "-vsn", new String[]{".o", ".lib", ".res"},
+ new String[]{".map", ".pdb", ".lnk"}, outputSuffix, false, null);
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addBase(long,
+ * java.util.Vector)
+ */
+ protected void addBase(long base, Vector args) {
+ // TODO Auto-generated method stub
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addFixed(java.lang.Boolean,
+ * java.util.Vector)
+ */
+ protected void addFixed(Boolean fixed, Vector args) {
+ // TODO Auto-generated method stub
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addImpliedArgs(boolean,
+ * net.sf.antcontrib.cpptasks.compiler.LinkType, java.util.Vector)
+ */
+ protected void addImpliedArgs(boolean debug, LinkType linkType, Vector args, Boolean defaultflag) {
+ if (debug) {
+ args.addElement("-debug");
+ }
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addIncremental(boolean,
+ * java.util.Vector)
+ */
+ protected void addIncremental(boolean incremental, Vector args) {
+ // TODO Auto-generated method stub
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addMap(boolean,
+ * java.util.Vector)
+ */
+ protected void addMap(boolean map, Vector args) {
+ // TODO Auto-generated method stub
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addStack(int,
+ * java.util.Vector)
+ */
+ protected void addStack(int stack, Vector args) {
+ // TODO Auto-generated method stub
+ }
+ /* (non-Javadoc)
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addEntry(int, java.util.Vector)
+ */
+ protected void addEntry(String entry, Vector args) {
+ // TODO Auto-generated method stub
+
+ }
+
+ /**
+ * May have to make this String array return
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#getCommandFileSwitch(java.lang.String)
+ */
+ protected String getCommandFileSwitch(String commandFile) {
+ return "-via" + commandFile;
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.Linker#getLibraryPath()
+ */
+ public File[] getLibraryPath() {
+ return CUtil.getPathFromEnvironment("ARMLIB", ";");
+ }
+ /*
+ * @see net.sf.antcontrib.cpptasks.compiler.Linker#getLibraryPatterns(java.lang.String[])
+ */
+ public String[] getLibraryPatterns(String[] libnames, LibraryTypeEnum libType) {
+ //
+ // TODO: looks like bad extension
+ //
+ return new String[]{".o"};
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.Processor#getLinker(net.sf.antcontrib.cpptasks.compiler.LinkType)
+ */
+ public Linker getLinker(LinkType linkType) {
+ return this;
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#getMaximumCommandLength()
+ */
+ protected int getMaximumCommandLength() {
+ return 1024;
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#getOutputFileSwitch(java.lang.String)
+ */
+ protected String[] getOutputFileSwitch(String outputFile) {
+ return new String[]{"-output", outputFile};
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.Linker#isCaseSensitive()
+ */
+ public boolean isCaseSensitive() {
+ return false;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/BorlandCCompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/BorlandCCompiler.java
new file mode 100644
index 0000000..3304c9a
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/BorlandCCompiler.java
@@ -0,0 +1,135 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.borland;
+import java.io.File;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.compiler.CommandLineCompilerConfiguration;
+import net.sf.antcontrib.cpptasks.compiler.CompilerConfiguration;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.compiler.PrecompilingCommandLineCCompiler;
+import net.sf.antcontrib.cpptasks.compiler.Processor;
+import net.sf.antcontrib.cpptasks.OptimizationEnum;
+
+import org.apache.tools.ant.types.Environment;
+/**
+ * Adapter for the Borland(r) C/C++ compiler.
+ *
+ * @author Curt Arnold
+ */
+public class BorlandCCompiler extends PrecompilingCommandLineCCompiler {
+ private static final String[] headerExtensions = new String[]{".h", ".hpp",
+ ".inl"};
+ private static final String[] sourceExtensions = new String[]{".c", ".cc",
+ ".cpp", ".cxx", ".c++"};
+ private static final BorlandCCompiler instance = new BorlandCCompiler(
+ false, null);
+ public static BorlandCCompiler getInstance() {
+ return instance;
+ }
+ private BorlandCCompiler(boolean newEnvironment, Environment env) {
+ super("bcc32", "--version", sourceExtensions, headerExtensions, ".obj", false,
+ null, newEnvironment, env);
+ }
+ protected void addImpliedArgs(final Vector args,
+ final boolean debug,
+ final boolean multithreaded,
+ final boolean exceptions,
+ final LinkType linkType,
+ final Boolean rtti,
+ final OptimizationEnum optimization,
+ final Boolean defaultflag) {
+ args.addElement("-c");
+ //
+ // turn off compiler autodependency since
+ // we do it ourselves
+ args.addElement("-X");
+ if (exceptions) {
+ args.addElement("-x");
+ } else {
+ args.addElement("-x-");
+ }
+ if (multithreaded) {
+ args.addElement("-tWM");
+ }
+ if (debug) {
+ args.addElement("-Od");
+ args.addElement("-v");
+ } else {
+ if (optimization != null) {
+ if (optimization.isSpeed()) {
+ args.addElement("-O1");
+ } else {
+ if (optimization.isSpeed()) {
+ args.addElement("-O2");
+ } else {
+ if (optimization.isNoOptimization()) {
+ args.addElement("-Od");
+ }
+ }
+ }
+ }
+ }
+ if (rtti != null && !rtti.booleanValue()) {
+ args.addElement("-RT-");
+ }
+ }
+ protected void addWarningSwitch(Vector args, int level) {
+ BorlandProcessor.addWarningSwitch(args, level);
+ }
+ public Processor changeEnvironment(boolean newEnvironment, Environment env) {
+ if (newEnvironment || env != null) {
+ return new BorlandCCompiler(newEnvironment, env);
+ }
+ return this;
+ }
+ protected CompilerConfiguration createPrecompileGeneratingConfig(
+ CommandLineCompilerConfiguration baseConfig, File prototype,
+ String lastInclude) {
+ String[] additionalArgs = new String[]{"-H=" + lastInclude, "-Hc"};
+ return new CommandLineCompilerConfiguration(baseConfig, additionalArgs,
+ null, true);
+ }
+ protected CompilerConfiguration createPrecompileUsingConfig(
+ CommandLineCompilerConfiguration baseConfig, File prototype,
+ String lastInclude, String[] exceptFiles) {
+ String[] additionalArgs = new String[]{"-Hu"};
+ return new CommandLineCompilerConfiguration(baseConfig, additionalArgs,
+ exceptFiles, false);
+ }
+ protected void getDefineSwitch(StringBuffer buffer, String define,
+ String value) {
+ BorlandProcessor.getDefineSwitch(buffer, define, value);
+ }
+ protected File[] getEnvironmentIncludePath() {
+ return BorlandProcessor.getEnvironmentPath("bcc32", 'I',
+ new String[]{"..\\include"});
+ }
+ protected String getIncludeDirSwitch(String includeDir) {
+ return BorlandProcessor.getIncludeDirSwitch("-I", includeDir);
+ }
+ public Linker getLinker(LinkType type) {
+ return BorlandLinker.getInstance().getLinker(type);
+ }
+ public int getMaximumCommandLength() {
+ return 1024;
+ }
+ protected void getUndefineSwitch(StringBuffer buffer, String define) {
+ BorlandProcessor.getUndefineSwitch(buffer, define);
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/BorlandCfgParser.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/BorlandCfgParser.java
new file mode 100644
index 0000000..19daedd
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/BorlandCfgParser.java
@@ -0,0 +1,70 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.borland;
+import java.io.IOException;
+import java.io.Reader;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.parser.AbstractParser;
+import net.sf.antcontrib.cpptasks.parser.AbstractParserState;
+import net.sf.antcontrib.cpptasks.parser.LetterState;
+import net.sf.antcontrib.cpptasks.parser.WhitespaceOrLetterState;
+/**
+ * A parser that paths from a borland cfg file
+ *
+ * @author Curt Arnold
+ */
+public final class BorlandCfgParser extends AbstractParser {
+ private AbstractParserState newLineState;
+ private final Vector path = new Vector();
+ /**
+ *
+ *
+ */
+ public BorlandCfgParser(char switchChar) {
+ //
+ // a quoted path (-I"some path")
+ // doesn't end till a close quote and will be abandoned
+ // if a new line is encountered first
+ //
+ AbstractParserState quote = new CfgFilenameState(this, new char[]{'"'});
+ //
+ // an unquoted path (-Ic:\borland\include)
+ // ends at the first space or new line
+ AbstractParserState unquote = new CfgFilenameState(this, new char[]{
+ ' ', '\n', '\r'});
+ AbstractParserState quoteBranch = new QuoteBranchState(this, quote,
+ unquote);
+ AbstractParserState toNextSwitch = new ConsumeToSpaceOrNewLine(this);
+ AbstractParserState switchState = new LetterState(this, switchChar,
+ quoteBranch, toNextSwitch);
+ newLineState = new WhitespaceOrLetterState(this, '-', switchState);
+ }
+ public void addFilename(String include) {
+ path.addElement(include);
+ }
+ public AbstractParserState getNewLineState() {
+ return newLineState;
+ }
+ public String[] parsePath(Reader reader) throws IOException {
+ path.setSize(0);
+ super.parse(reader);
+ String[] retval = new String[path.size()];
+ path.copyInto(retval);
+ return retval;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/BorlandLibrarian.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/BorlandLibrarian.java
new file mode 100644
index 0000000..5fb3eb0
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/BorlandLibrarian.java
@@ -0,0 +1,200 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.borland;
+import java.io.File;
+import java.io.IOException;
+import java.util.Vector;
+import org.apache.tools.ant.BuildException;
+
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineLinker;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.CCTask;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineLinkerConfiguration;
+import net.sf.antcontrib.cpptasks.types.LibraryTypeEnum;
+
+/**
+ * Adapter for the Borland(r) tlib Librarian
+ *
+ * @author Curt Arnold
+ */
+public class BorlandLibrarian extends CommandLineLinker {
+ private static final BorlandLibrarian instance = new BorlandLibrarian();
+ public static BorlandLibrarian getInstance() {
+ return instance;
+ }
+ private BorlandLibrarian() {
+ super("tlib", "--version", new String[]{".obj"}, new String[0], ".lib", false,
+ null);
+ }
+ protected void addBase(long base, Vector args) {
+ }
+ protected void addFixed(Boolean fixed, Vector args) {
+ }
+ protected void addImpliedArgs(boolean debug, LinkType linkType, Vector args, Boolean defaultflag) {
+ }
+ protected void addIncremental(boolean incremental, Vector args) {
+ }
+ protected void addMap(boolean map, Vector args) {
+ }
+ protected void addStack(int stack, Vector args) {
+ }
+ /* (non-Javadoc)
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addEntry(int, java.util.Vector)
+ */
+ protected void addEntry(String entry, Vector args) {
+ }
+
+ protected String getCommandFileSwitch(String cmdFile) {
+ return BorlandProcessor.getCommandFileSwitch(cmdFile);
+ }
+ public File[] getLibraryPath() {
+ return CUtil.getPathFromEnvironment("LIB", ";");
+ }
+ public String[] getLibraryPatterns(String[] libnames, LibraryTypeEnum libType) {
+ return BorlandProcessor.getLibraryPatterns(libnames, libType);
+ }
+ public Linker getLinker(LinkType type) {
+ return BorlandLinker.getInstance().getLinker(type);
+ }
+ public int getMaximumCommandLength() {
+ return 1024;
+ }
+ public String[] getOutputFileSwitch(String outFile) {
+ return BorlandProcessor.getOutputFileSwitch(outFile);
+ }
+ public boolean isCaseSensitive() {
+ return BorlandProcessor.isCaseSensitive();
+ }
+ /**
+ * Gets identifier for the linker.
+ *
+ * TLIB will lockup when attempting to get version
+ * information. Since the Librarian version isn't critical
+ * just return a stock response.
+ */
+ public String getIdentifier() {
+ return "TLIB 4.5 Copyright (c) 1987, 1999 Inprise Corporation";
+ }
+
+ /**
+ * Prepares argument list for exec command.
+ *
+ * @param outputFile
+ * linker output file
+ * @param sourceFiles
+ * linker input files (.obj, .o, .res)
+ * @param args
+ * linker arguments
+ * @return arguments for runTask
+ */
+ protected String[] prepareArguments(
+ CCTask task,
+ String outputDir,
+ String outputName,
+ String[] sourceFiles,
+ CommandLineLinkerConfiguration config) {
+ String[] preargs = config.getPreArguments();
+ String[] endargs = config.getEndArguments();
+ StringBuffer buf = new StringBuffer();
+ Vector execArgs = new Vector(preargs.length + endargs.length + 10
+ + sourceFiles.length);
+
+ execArgs.addElement(this.getCommand());
+ String outputFileName = new File(outputDir, outputName).toString();
+ execArgs.addElement(quoteFilename(buf, outputFileName));
+
+ for (int i = 0; i < preargs.length; i++) {
+ execArgs.addElement(preargs[i]);
+ }
+
+ //
+ // add a place-holder for page size
+ //
+ int pageSizeIndex = execArgs.size();
+ execArgs.addElement(null);
+
+ int objBytes = 0;
+
+ for (int i = 0; i < sourceFiles.length; i++) {
+ String last4 = sourceFiles[i]
+ .substring(sourceFiles[i].length() - 4).toLowerCase();
+ if (last4.equals(".def")) {
+ } else {
+ if (last4.equals(".res")) {
+ } else {
+ if (last4.equals(".lib")) {
+ } else {
+ execArgs.addElement("+" + quoteFilename(buf, sourceFiles[i]));
+ objBytes += new File(sourceFiles[i]).length();
+ }
+ }
+ }
+ }
+
+ for (int i = 0; i < endargs.length; i++) {
+ execArgs.addElement(endargs[i]);
+ }
+
+ String[] execArguments = new String[execArgs.size()];
+ execArgs.copyInto(execArguments);
+
+ int minPageSize = objBytes >> 16;
+ int pageSize = 0;
+ for(int i = 4; i <= 15; i++) {
+ pageSize = 1 << i;
+ if (pageSize > minPageSize) break;
+ }
+ execArguments[pageSizeIndex] = "/P" + Integer.toString(pageSize);
+
+ return execArguments;
+ }
+
+ /**
+ * Prepares argument list to execute the linker using a response file.
+ *
+ * @param outputFile
+ * linker output file
+ * @param args
+ * output of prepareArguments
+ * @return arguments for runTask
+ */
+ protected String[] prepareResponseFile(File outputFile, String[] args)
+ throws IOException {
+ return BorlandProcessor.prepareResponseFile(outputFile, args, " & \n");
+ }
+
+ /**
+ * Builds a library
+ *
+ */
+ public void link(CCTask task,
+ File outputFile,
+ String[] sourceFiles,
+ CommandLineLinkerConfiguration config)
+ throws BuildException
+ {
+ //
+ // delete any existing library
+ outputFile.delete();
+ //
+ // build a new library
+ super.link(task, outputFile, sourceFiles, config);
+ }
+
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/BorlandLinker.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/BorlandLinker.java
new file mode 100644
index 0000000..f425c52
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/BorlandLinker.java
@@ -0,0 +1,264 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.borland;
+import java.io.File;
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CCTask;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineLinker;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineLinkerConfiguration;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.types.LibraryTypeEnum;
+
+/**
+ * Adapter for the Borland(r) ilink32 linker
+ *
+ * @author Curt Arnold
+ */
+public final class BorlandLinker extends CommandLineLinker {
+ private static final BorlandLinker dllLinker = new BorlandLinker(".dll");
+ private static final BorlandLinker instance = new BorlandLinker(".exe");
+ public static BorlandLinker getInstance() {
+ return instance;
+ }
+ private BorlandLinker(String outputSuffix) {
+ super("ilink32", "-r", new String[]{".obj", ".lib", ".res"},
+ new String[]{".map", ".pdb", ".lnk"}, outputSuffix, false, null);
+ }
+ protected void addBase(long base, Vector args) {
+ if (base >= 0) {
+ String baseAddr = Long.toHexString(base);
+ args.addElement("-b:" + baseAddr);
+ }
+ }
+ protected void addFixed(Boolean fixed, Vector args) {
+ }
+ protected void addImpliedArgs(boolean debug, LinkType linkType, Vector args, Boolean defaultflag) {
+ if (linkType.isExecutable()) {
+ if (linkType.isSubsystemConsole()) {
+ args.addElement("/ap");
+ } else {
+ if (linkType.isSubsystemGUI()) {
+ args.addElement("/Tpe");
+ }
+ }
+ }
+ if (linkType.isSharedLibrary()) {
+ args.addElement("/Tpd");
+ args.addElement("/Gi");
+ }
+ }
+ protected void addIncremental(boolean incremental, Vector args) {
+ }
+ protected void addMap(boolean map, Vector args) {
+ if (!map) {
+ args.addElement("-x");
+ }
+ }
+ protected void addStack(int stack, Vector args) {
+ if (stack >= 0) {
+ String stackStr = Integer.toHexString(stack);
+ args.addElement("-S:" + stackStr);
+ }
+ }
+ /* (non-Javadoc)
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addEntry(int, java.util.Vector)
+ */
+ protected void addEntry(String entry, Vector args) {
+ }
+
+ public String getCommandFileSwitch(String commandFile) {
+ return "@" + commandFile;
+ }
+ public String getIdentifier() {
+ return "Borland Linker";
+ }
+ public File[] getLibraryPath() {
+ return BorlandProcessor.getEnvironmentPath("ilink32", 'L',
+ new String[]{"..\\lib"});
+ }
+ public String[] getLibraryPatterns(String[] libnames, LibraryTypeEnum libType) {
+ return BorlandProcessor.getLibraryPatterns(libnames, libType);
+ }
+ public Linker getLinker(LinkType type) {
+ if (type.isStaticLibrary()) {
+ return BorlandLibrarian.getInstance();
+ }
+ if (type.isSharedLibrary()) {
+ return dllLinker;
+ }
+ return instance;
+ }
+ public int getMaximumCommandLength() {
+ return 1024;
+ }
+ public String[] getOutputFileSwitch(String outFile) {
+ return BorlandProcessor.getOutputFileSwitch(outFile);
+ }
+ protected String getStartupObject(LinkType linkType) {
+ if (linkType.isSharedLibrary()) {
+ return "c0d32.obj";
+ }
+ if (linkType.isSubsystemGUI()) {
+ return "c0w32.obj";
+ }
+ if (linkType.isSubsystemConsole()) {
+ return "c0x32.obj";
+ }
+ return null;
+ }
+ public boolean isCaseSensitive() {
+ return BorlandProcessor.isCaseSensitive();
+ }
+ /**
+ * Prepares argument list for exec command.
+ *
+ * @param outputFile
+ * linker output file
+ * @param sourceFiles
+ * linker input files (.obj, .o, .res)
+ * @param args
+ * linker arguments
+ * @return arguments for runTask
+ */
+ protected String[] prepareArguments(
+ CCTask task,
+ String outputDir,
+ String outputName,
+ String[] sourceFiles,
+ CommandLineLinkerConfiguration config) {
+ String[] preargs = config.getPreArguments();
+ String[] endargs = config.getEndArguments();
+ Vector execArgs = new Vector(preargs.length + endargs.length + 10
+ + sourceFiles.length);
+ execArgs.addElement(this.getCommand());
+ for (int i = 0; i < preargs.length; i++) {
+ execArgs.addElement(preargs[i]);
+ }
+ for (int i = 0; i < endargs.length; i++) {
+ execArgs.addElement(endargs[i]);
+ }
+ //
+ // see if the input files have any known startup obj files
+ //
+ String startup = null;
+ for (int i = 0; i < sourceFiles.length; i++) {
+ String filename = new File(sourceFiles[i]).getName().toLowerCase();
+ if (startup != null && filename.substring(0, 2).equals("c0")
+ && filename.substring(3, 5).equals("32")
+ && filename.substring(filename.length() - 4).equals(".obj")) {
+ startup = sourceFiles[i];
+ }
+ }
+ //
+ // c0w32.obj, c0x32.obj or c0d32.obj depending on
+ // link type
+ if (startup == null) {
+ startup = config.getStartupObject();
+ }
+ execArgs.addElement(startup);
+ Vector resFiles = new Vector();
+ Vector libFiles = new Vector();
+ String defFile = null;
+ StringBuffer buf = new StringBuffer();
+ for (int i = 0; i < sourceFiles.length; i++) {
+ String last4 = sourceFiles[i]
+ .substring(sourceFiles[i].length() - 4).toLowerCase();
+ if (last4.equals(".def")) {
+ defFile = quoteFilename(buf, sourceFiles[i]);
+ } else {
+ if (last4.equals(".res")) {
+ resFiles.addElement(quoteFilename(buf, sourceFiles[i]));
+ } else {
+ if (last4.equals(".lib")) {
+ libFiles.addElement(quoteFilename(buf, sourceFiles[i]));
+ } else {
+ execArgs.addElement(quoteFilename(buf, sourceFiles[i]));
+ }
+ }
+ }
+ }
+ //
+ // output file name
+ //
+ String outputFileName = new File(outputDir, outputName).toString();
+ execArgs.addElement("," + quoteFilename(buf, outputFileName));
+ if (config.getMap()) {
+ int lastPeriod = outputFileName.lastIndexOf('.');
+ String mapName;
+ if (lastPeriod < outputFileName.length() - 4) {
+ mapName = outputFileName + ".map";
+ } else {
+ mapName = outputFileName.substring(0, lastPeriod) + ".map";
+ }
+ execArgs.addElement("," + quoteFilename(buf, mapName) + ",");
+ } else {
+ execArgs.addElement(",,");
+ }
+ //
+ // add all the libraries
+ //
+ Enumeration libEnum = libFiles.elements();
+ boolean hasImport32 = false;
+ boolean hasCw32 = false;
+ while (libEnum.hasMoreElements()) {
+ String libName = (String) libEnum.nextElement();
+ if (libName.equalsIgnoreCase("import32.lib")) {
+ hasImport32 = true;
+ }
+ if (libName.equalsIgnoreCase("cw32.lib")) {
+ hasImport32 = true;
+ }
+ execArgs.addElement(quoteFilename(buf, libName));
+ }
+ if (!hasCw32) {
+ execArgs.addElement(quoteFilename(buf, "cw32.lib"));
+ }
+ if (!hasImport32) {
+ execArgs.addElement(quoteFilename(buf, "import32.lib"));
+ }
+ if (defFile == null) {
+ execArgs.addElement(",,");
+ } else {
+ execArgs.addElement("," + quoteFilename(buf, defFile) + ",");
+ }
+ Enumeration resEnum = resFiles.elements();
+ while (resEnum.hasMoreElements()) {
+ String resName = (String) resEnum.nextElement();
+ execArgs.addElement(quoteFilename(buf, resName));
+ }
+ String[] execArguments = new String[execArgs.size()];
+ execArgs.copyInto(execArguments);
+ return execArguments;
+ }
+ /**
+ * Prepares argument list to execute the linker using a response file.
+ *
+ * @param outputFile
+ * linker output file
+ * @param args
+ * output of prepareArguments
+ * @return arguments for runTask
+ */
+ protected String[] prepareResponseFile(File outputFile, String[] args)
+ throws IOException {
+ return BorlandProcessor.prepareResponseFile(outputFile, args, " + \n");
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/BorlandProcessor.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/BorlandProcessor.java
new file mode 100644
index 0000000..d53f00c
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/BorlandProcessor.java
@@ -0,0 +1,219 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.borland;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.Reader;
+import java.util.Vector;
+import java.io.FileWriter;
+
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.types.LibraryTypeEnum;
+/**
+ * A add-in class for Borland(r) processor adapters
+ *
+ *
+ */
+public final class BorlandProcessor {
+ public static void addWarningSwitch(Vector args, int level) {
+ switch (level) {
+ case 0 :
+ args.addElement("-w-");
+ break;
+ case 5 :
+ args.addElement("-w!");
+ break;
+ default :
+ args.addElement("-w");
+ break;
+ }
+ }
+ public static String getCommandFileSwitch(String cmdFile) {
+ StringBuffer buf = new StringBuffer("@");
+ quoteFile(buf, cmdFile);
+ return buf.toString();
+ }
+ public static void getDefineSwitch(StringBuffer buffer, String define,
+ String value) {
+ buffer.append("-D");
+ buffer.append(define);
+ if (value != null && value.length() > 0) {
+ buffer.append('=');
+ buffer.append(value);
+ }
+ }
+ /**
+ * This method extracts path information from the appropriate .cfg file in
+ * the install directory.
+ *
+ * @param toolName
+ * Tool name, for example, "bcc32", "brc32", "ilink32"
+ * @param switchChar
+ * Command line switch character, for example "L" for libraries
+ * @param defaultRelativePaths
+ * default paths relative to executable directory
+ * @return path
+ */
+ public static File[] getEnvironmentPath(String toolName, char switchChar,
+ String[] defaultRelativePath) {
+ if (toolName == null) {
+ throw new NullPointerException("toolName");
+ }
+ if (defaultRelativePath == null) {
+ throw new NullPointerException("defaultRelativePath");
+ }
+ String[] path = defaultRelativePath;
+ File exeDir = CUtil.getExecutableLocation(toolName + ".exe");
+ if (exeDir != null) {
+ File cfgFile = new File(exeDir, toolName + ".cfg");
+ if (cfgFile.exists()) {
+ try {
+ Reader reader = new BufferedReader(new FileReader(cfgFile));
+ BorlandCfgParser cfgParser = new BorlandCfgParser(
+ switchChar);
+ path = cfgParser.parsePath(reader);
+ reader.close();
+ } catch (IOException ex) {
+ //
+ // could be logged
+ //
+ }
+ }
+ } else {
+ //
+ // if can't find the executable,
+ // assume current directory to resolve relative paths
+ //
+ exeDir = new File(System.getProperty("user.dir"));
+ }
+ int nonExistant = 0;
+ File[] resourcePath = new File[path.length];
+ for (int i = 0; i < path.length; i++) {
+ resourcePath[i] = new File(path[i]);
+ if (!resourcePath[i].isAbsolute()) {
+ resourcePath[i] = new File(exeDir, path[i]);
+ }
+ //
+ // if any of the entries do not exist or are
+ // not directories, null them out
+ if (!(resourcePath[i].exists() && resourcePath[i].isDirectory())) {
+ resourcePath[i] = null;
+ nonExistant++;
+ }
+ }
+ //
+ // if there were some non-existant or non-directory
+ // entries in the configuration file then
+ // create a shorter array
+ if (nonExistant > 0) {
+ File[] culled = new File[resourcePath.length - nonExistant];
+ int index = 0;
+ for (int i = 0; i < resourcePath.length; i++) {
+ if (resourcePath[i] != null) {
+ culled[index++] = resourcePath[i];
+ }
+ }
+ resourcePath = culled;
+ }
+ return resourcePath;
+ }
+ public static String getIncludeDirSwitch(String includeOption,
+ String includeDir) {
+ StringBuffer buf = new StringBuffer(includeOption);
+ quoteFile(buf, includeDir);
+ return buf.toString();
+ }
+ public static String[] getLibraryPatterns(String[] libnames, LibraryTypeEnum libType) {
+ StringBuffer buf = new StringBuffer();
+ String[] patterns = new String[libnames.length];
+ for (int i = 0; i < libnames.length; i++) {
+ buf.setLength(0);
+ buf.append(libnames[i]);
+ buf.append(".lib");
+ patterns[i] = buf.toString();
+ }
+ return patterns;
+ }
+ public static String[] getOutputFileSwitch(String outFile) {
+ return new String[0];
+ }
+ public static void getUndefineSwitch(StringBuffer buffer, String define) {
+ buffer.append("-U");
+ buffer.append(define);
+ }
+ public static boolean isCaseSensitive() {
+ return false;
+ }
+ private static void quoteFile(StringBuffer buf, String outPath) {
+ if (outPath.indexOf(' ') >= 0) {
+ buf.append('\"');
+ buf.append(outPath);
+ buf.append('\"');
+ } else {
+ buf.append(outPath);
+ }
+ }
+
+ /**
+ * Prepares argument list to execute the linker using a response file.
+ *
+ * @param outputFile
+ * linker output file
+ * @param args
+ * output of prepareArguments
+ * @return arguments for runTask
+ */
+ public static String[] prepareResponseFile(File outputFile,
+ String[] args,
+ String continuation)
+ throws IOException {
+ String baseName = outputFile.getName();
+ File commandFile = new File(outputFile.getParent(), baseName + ".lnk");
+ FileWriter writer = new FileWriter(commandFile);
+ for (int i = 1; i < args.length - 1; i++) {
+ writer.write(args[i]);
+ //
+ // if either the current argument ends with
+ // or next argument starts with a comma then
+ // don't split the line
+ if (args[i].endsWith(",") || args[i + 1].startsWith(",")) {
+ writer.write(' ');
+ } else {
+ //
+ // split the line to make it more readable
+ //
+ writer.write(continuation);
+ }
+ }
+ //
+ // write the last argument
+ //
+ if (args.length > 1) {
+ writer.write(args[args.length - 1]);
+ }
+ writer.close();
+ String[] execArgs = new String[2];
+ execArgs[0] = args[0];
+ execArgs[1] = getCommandFileSwitch(commandFile.toString());
+ return execArgs;
+ }
+
+ private BorlandProcessor() {
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/BorlandResourceCompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/BorlandResourceCompiler.java
new file mode 100644
index 0000000..5e86097
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/BorlandResourceCompiler.java
@@ -0,0 +1,130 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.borland;
+import java.io.File;
+import java.util.Vector;
+import net.sf.antcontrib.cpptasks.CCTask;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineCompiler;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineCompilerConfiguration;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.compiler.Processor;
+import net.sf.antcontrib.cpptasks.compiler.ProgressMonitor;
+import net.sf.antcontrib.cpptasks.parser.CParser;
+import net.sf.antcontrib.cpptasks.parser.Parser;
+import net.sf.antcontrib.cpptasks.OptimizationEnum;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.types.Environment;
+/**
+ * Adapter for the Borland(r) brc32 Resource compiler.
+ *
+ * @author Curt Arnold
+ */
+public class BorlandResourceCompiler extends CommandLineCompiler {
+ private static final BorlandResourceCompiler instance = new BorlandResourceCompiler(
+ false, null);
+ public static BorlandResourceCompiler getInstance() {
+ return instance;
+ }
+ private BorlandResourceCompiler(boolean newEnvironment, Environment env) {
+ super("brc32", "c:\\__bogus\\__bogus.rc", new String[]{".rc"},
+ new String[]{".h", ".hpp", ".inl"}, ".res", false, null,
+ newEnvironment, env);
+ }
+ protected void addImpliedArgs(final Vector args,
+ final boolean debug,
+ final boolean multithreaded,
+ final boolean exceptions,
+ final LinkType linkType,
+ final Boolean rtti,
+ final OptimizationEnum optimization,
+ final Boolean defaultflag) {
+ //
+ // compile only
+ //
+ args.addElement("-r");
+ }
+ protected void addWarningSwitch(Vector args, int level) {
+ }
+ public Processor changeEnvironment(boolean newEnvironment, Environment env) {
+ if (newEnvironment || env != null) {
+ return new BorlandResourceCompiler(newEnvironment, env);
+ }
+ return this;
+ }
+ public void compile(CCTask task, File outputDir, String[] sourceFiles,
+ String[] args, String[] endArgs, boolean relentless,
+ CommandLineCompilerConfiguration config, ProgressMonitor monitor)
+ throws BuildException {
+ super.compile(task, outputDir, sourceFiles, args, endArgs, relentless,
+ config, monitor);
+ }
+ /**
+ * The include parser for C will work just fine, but we didn't want to
+ * inherit from CommandLineCCompiler
+ */
+ protected Parser createParser(File source) {
+ return new CParser();
+ }
+ protected int getArgumentCountPerInputFile() {
+ return 2;
+ }
+ protected void getDefineSwitch(StringBuffer buffer, String define,
+ String value) {
+ buffer.append("-d");
+ buffer.append(define);
+ if (value != null && value.length() > 0) {
+ buffer.append('=');
+ buffer.append(value);
+ }
+ }
+ protected File[] getEnvironmentIncludePath() {
+ return BorlandProcessor.getEnvironmentPath("brc32", 'i',
+ new String[]{"..\\include"});
+ }
+ protected String getIncludeDirSwitch(String includeDir) {
+ return BorlandProcessor.getIncludeDirSwitch("-i", includeDir);
+ }
+ protected String getInputFileArgument(File outputDir, String filename,
+ int index) {
+ if (index == 0) {
+ String outputFileName = getOutputFileName(filename);
+ String fullOutputName = new File(outputDir, outputFileName)
+ .toString();
+ return "-fo" + fullOutputName;
+ }
+ return filename;
+ }
+ public Linker getLinker(LinkType type) {
+ return BorlandLinker.getInstance().getLinker(type);
+ }
+ public int getMaximumCommandLength() {
+ return 1024;
+ }
+ protected int getMaximumInputFilesPerCommand() {
+ return 1;
+ }
+ protected int getTotalArgumentLengthForInputFile(File outputDir,
+ String inputFile) {
+ String arg1 = getInputFileArgument(outputDir, inputFile, 0);
+ String arg2 = getInputFileArgument(outputDir, inputFile, 1);
+ return arg1.length() + arg2.length() + 2;
+ }
+ protected void getUndefineSwitch(StringBuffer buffer, String define) {
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/CfgFilenameState.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/CfgFilenameState.java
new file mode 100644
index 0000000..a3651d3
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/CfgFilenameState.java
@@ -0,0 +1,46 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.borland;
+import net.sf.antcontrib.cpptasks.parser.AbstractParser;
+import net.sf.antcontrib.cpptasks.parser.AbstractParserState;
+import net.sf.antcontrib.cpptasks.parser.FilenameState;
+public class CfgFilenameState extends FilenameState {
+ private char terminator;
+ public CfgFilenameState(AbstractParser parser, char[] terminators) {
+ super(parser, terminators);
+ terminator = terminators[0];
+ }
+ public AbstractParserState consume(char ch) {
+ //
+ // if a ';' is encountered then
+ // close the previous filename by sending a
+ // recognized terminator to our super class
+ // and stay in this state for more filenamese
+ if (ch == ';') {
+ super.consume(terminator);
+ return this;
+ }
+ AbstractParserState newState = super.consume(ch);
+ //
+ // change null (consume to end of line)
+ // to look for next switch character
+ if (newState == null) {
+ newState = getParser().getNewLineState();
+ }
+ return newState;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/ConsumeToSpaceOrNewLine.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/ConsumeToSpaceOrNewLine.java
new file mode 100644
index 0000000..d1dd072
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/ConsumeToSpaceOrNewLine.java
@@ -0,0 +1,30 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.borland;
+import net.sf.antcontrib.cpptasks.parser.AbstractParser;
+import net.sf.antcontrib.cpptasks.parser.AbstractParserState;
+public class ConsumeToSpaceOrNewLine extends AbstractParserState {
+ public ConsumeToSpaceOrNewLine(AbstractParser parser) {
+ super(parser);
+ }
+ public AbstractParserState consume(char ch) {
+ if (ch == ' ' || ch == '\t' || ch == '\n') {
+ return getParser().getNewLineState();
+ }
+ return this;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/QuoteBranchState.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/QuoteBranchState.java
new file mode 100644
index 0000000..89724b2
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/QuoteBranchState.java
@@ -0,0 +1,35 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.borland;
+import net.sf.antcontrib.cpptasks.parser.AbstractParser;
+import net.sf.antcontrib.cpptasks.parser.AbstractParserState;
+public class QuoteBranchState extends AbstractParserState {
+ private AbstractParserState quote;
+ private AbstractParserState unquote;
+ public QuoteBranchState(AbstractParser parser, AbstractParserState quote,
+ AbstractParserState unquote) {
+ super(parser);
+ this.quote = quote;
+ this.unquote = unquote;
+ }
+ public AbstractParserState consume(char ch) {
+ if (ch == '"') {
+ return quote;
+ }
+ return unquote.consume(ch);
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compaq/CompaqVisualFortranCompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compaq/CompaqVisualFortranCompiler.java
new file mode 100644
index 0000000..e1d3deb
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compaq/CompaqVisualFortranCompiler.java
@@ -0,0 +1,138 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compaq;
+import java.io.File;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineFortranCompiler;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.compiler.Processor;
+import net.sf.antcontrib.cpptasks.OptimizationEnum;
+
+
+import org.apache.tools.ant.types.Environment;
+/**
+ * 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(boolean newEnvironment, Environment env) {
+ super("DF", null, new String[]{".f90", ".for", ".f"}, new String[]{
+ ".i", ".i90", ".fpp", ".inc", ".bak", ".exe"}, ".obj", false,
+ null, newEnvironment, env);
+ }
+ protected void addImpliedArgs(final Vector args,
+ final boolean debug,
+ final boolean multithreaded,
+ final boolean exceptions,
+ final LinkType linkType,
+ final Boolean rtti,
+ final OptimizationEnum optimization,
+ final Boolean defaultflag) {
+ 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");
+ }
+ 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");
+ }
+ }
+ public void addWarningSwitch(Vector args, 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;
+ }
+ }
+ public Processor changeEnvironment(boolean newEnvironment, Environment env) {
+ if (newEnvironment || env != null) {
+ return new CompaqVisualFortranCompiler(newEnvironment, env);
+ }
+ return this;
+ }
+ protected void getDefineSwitch(StringBuffer buf, String define, String value) {
+ buf.append("/define:");
+ buf.append(define);
+ if (value != null && value.length() > 0) {
+ buf.append('=');
+ buf.append(value);
+ }
+ }
+ protected File[] getEnvironmentIncludePath() {
+ return CUtil.getPathFromEnvironment("INCLUDE", ";");
+ }
+ protected String getIncludeDirSwitch(String includeDir) {
+ StringBuffer buf = new StringBuffer("/include:");
+ if (includeDir.indexOf(' ') >= 0) {
+ buf.append('"');
+ buf.append(includeDir);
+ buf.append('"');
+ } else {
+ buf.append(includeDir);
+ }
+ return buf.toString();
+ }
+ public Linker getLinker(LinkType type) {
+ return CompaqVisualFortranLinker.getInstance().getLinker(type);
+ }
+ public int getMaximumCommandLength() {
+ return 1024;
+ }
+ protected void getUndefineSwitch(StringBuffer buf, String define) {
+ buf.append("/undefine:");
+ buf.append(define);
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compaq/CompaqVisualFortranLibrarian.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compaq/CompaqVisualFortranLibrarian.java
new file mode 100644
index 0000000..eb4a407
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compaq/CompaqVisualFortranLibrarian.java
@@ -0,0 +1,82 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compaq;
+import java.io.File;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.compiler.CommandLineLinker;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.devstudio.DevStudioLibrarian;
+import net.sf.antcontrib.cpptasks.devstudio.DevStudioProcessor;
+import net.sf.antcontrib.cpptasks.types.LibraryTypeEnum;
+
+/**
+ * Adapter for the Compaq(r) Visual Fortran Librarian
+ *
+ * @author Curt Arnold
+ */
+public class CompaqVisualFortranLibrarian extends CommandLineLinker {
+ private static final CompaqVisualFortranLibrarian instance = new CompaqVisualFortranLibrarian();
+ public static CompaqVisualFortranLibrarian getInstance() {
+ return instance;
+ }
+ private CompaqVisualFortranLibrarian() {
+ super("lib", "/bogus", new String[]{".obj"}, new String[0], ".lib",
+ false, null);
+ }
+ protected void addBase(long base, Vector args) {
+ }
+ protected void addFixed(Boolean fixed, Vector args) {
+ }
+ protected void addImpliedArgs(boolean debug, LinkType linkType, Vector args, Boolean defaultflag) {
+ args.addElement("/nologo");
+ }
+ protected void addIncremental(boolean incremental, Vector args) {
+ }
+ protected void addMap(boolean map, Vector args) {
+ }
+ protected void addStack(int stack, Vector args) {
+ }
+ /* (non-Javadoc)
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addEntry(int, java.util.Vector)
+ */
+ protected void addEntry(String entry, Vector args) {
+ }
+
+ protected String getCommandFileSwitch(String commandFile) {
+ return DevStudioProcessor.getCommandFileSwitch(commandFile);
+ }
+ public File[] getLibraryPath() {
+ return new File[0];
+ }
+ public String[] getLibraryPatterns(String[] libnames, LibraryTypeEnum libType) {
+ return new String[0];
+ }
+ public Linker getLinker(LinkType type) {
+ return CompaqVisualFortranLinker.getInstance().getLinker(type);
+ }
+ protected int getMaximumCommandLength() {
+ return DevStudioLibrarian.getInstance().getMaximumCommandLength();
+ }
+ protected String[] getOutputFileSwitch(String outputFile) {
+ return DevStudioLibrarian.getInstance().getOutputFileSwitch(outputFile);
+ }
+ public boolean isCaseSensitive() {
+ return false;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compaq/CompaqVisualFortranLinker.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compaq/CompaqVisualFortranLinker.java
new file mode 100644
index 0000000..d83e3b2
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compaq/CompaqVisualFortranLinker.java
@@ -0,0 +1,77 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compaq;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.devstudio.DevStudioCompatibleLinker;
+/**
+ * Adapter for the Compaq(r) Visual Fortran linker.
+ *
+ * @author Curt Arnold
+ */
+public final class CompaqVisualFortranLinker extends DevStudioCompatibleLinker {
+ private static final CompaqVisualFortranLinker dllLinker = new CompaqVisualFortranLinker(
+ ".dll");
+ private static final CompaqVisualFortranLinker instance = new CompaqVisualFortranLinker(
+ ".exe");
+ public static CompaqVisualFortranLinker getInstance() {
+ return instance;
+ }
+ private CompaqVisualFortranLinker(String outputSuffix) {
+ super("DF", "__bogus__.xxx", outputSuffix);
+ }
+ protected void addImpliedArgs(boolean debug, LinkType linkType, Vector args) {
+ args.addElement("/NOLOGO");
+ boolean staticRuntime = linkType.isStaticRuntime();
+ if (staticRuntime) {
+ args.addElement("/libs:static");
+ } else {
+ args.addElement("/libs:dll");
+ }
+ if (debug) {
+ args.addElement("/debug");
+ } else {
+ }
+ if (linkType.isSharedLibrary()) {
+ args.addElement("/dll");
+ } else {
+ args.addElement("/exe");
+ }
+ }
+ public Linker getLinker(LinkType type) {
+ if (type.isStaticLibrary()) {
+ return CompaqVisualFortranLibrarian.getInstance();
+ }
+ if (type.isSharedLibrary()) {
+ return dllLinker;
+ }
+ return instance;
+ }
+ public String[] getOutputFileSwitch(String outputFile) {
+ StringBuffer buf = new StringBuffer("/OUT:");
+ if (outputFile.indexOf(' ') >= 0) {
+ buf.append('"');
+ buf.append(outputFile);
+ buf.append('"');
+ } else {
+ buf.append(outputFile);
+ }
+ return new String[]{buf.toString()};
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AbstractAslcompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AbstractAslcompiler.java
new file mode 100644
index 0000000..90c539c
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AbstractAslcompiler.java
@@ -0,0 +1,75 @@
+/*
+ *
+ * Copyright 2001-2005 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compiler;
+
+import java.io.File;
+
+import net.sf.antcontrib.cpptasks.AslcompilerDef;
+import net.sf.antcontrib.cpptasks.CCTask;
+import net.sf.antcontrib.cpptasks.ProcessorDef;
+import net.sf.antcontrib.cpptasks.TargetDef;
+
+/**
+ * An abstract asl compiler implementation.
+ *
+ */
+public abstract class AbstractAslcompiler extends AbstractProcessor
+implements Aslcompiler {
+ private String outputSuffix;
+ protected AbstractAslcompiler(String[] sourceExtensions,
+ String[] headerExtensions, String outputSuffix) {
+ super(sourceExtensions, headerExtensions);
+ this.outputSuffix = outputSuffix;
+ }
+ abstract protected AslcompilerConfiguration createConfiguration(CCTask task,
+ LinkType linkType, ProcessorDef[] baseConfigs,
+ AslcompilerDef specificConfig, TargetDef targetPlatform);
+
+ public ProcessorConfiguration createConfiguration(CCTask task,
+ LinkType linkType, ProcessorDef[] baseConfigs,
+ ProcessorDef specificConfig, TargetDef targetPlatform) {
+ if (specificConfig == null) {
+ throw new NullPointerException("specificConfig");
+ }
+ return createConfiguration(task, linkType, baseConfigs,
+ (AslcompilerDef) specificConfig, targetPlatform);
+ }
+
+ public String getOutputFileName(String inputFile) {
+ if (bid(inputFile) > 1) {
+ String baseName = getBaseOutputName(inputFile);
+ return baseName + outputSuffix;
+ }
+ return null;
+ }
+ protected String getBaseOutputName(String inputFile) {
+ int lastSlash = inputFile.lastIndexOf('/');
+ int lastReverse = inputFile.lastIndexOf('\\');
+ int lastSep = inputFile.lastIndexOf(File.separatorChar);
+ if (lastReverse > lastSlash) {
+ lastSlash = lastReverse;
+ }
+ if (lastSep > lastSlash) {
+ lastSlash = lastSep;
+ }
+ int lastPeriod = inputFile.lastIndexOf('.');
+ if (lastPeriod < 0) {
+ lastPeriod = inputFile.length();
+ }
+ return inputFile.substring(lastSlash + 1, lastPeriod);
+ }
+} \ No newline at end of file
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AbstractAssembler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AbstractAssembler.java
new file mode 100644
index 0000000..1d49232
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AbstractAssembler.java
@@ -0,0 +1,72 @@
+/*
+ *
+ * Copyright 2001-2005 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compiler;
+
+import java.io.File;
+
+import net.sf.antcontrib.cpptasks.AssemblerDef;
+import net.sf.antcontrib.cpptasks.CCTask;
+import net.sf.antcontrib.cpptasks.ProcessorDef;
+import net.sf.antcontrib.cpptasks.TargetDef;
+/**
+ * An abstract assembler implementation.
+ *
+ */
+public abstract class AbstractAssembler extends AbstractProcessor
+implements Assembler {
+ private String outputSuffix;
+ protected AbstractAssembler(String[] sourceExtensions,
+ String[] headerExtensions, String outputSuffix) {
+ super(sourceExtensions, headerExtensions);
+ this.outputSuffix = outputSuffix;
+ }
+ abstract protected AssemblerConfiguration createConfiguration(CCTask task,
+ LinkType linkType, ProcessorDef[] baseConfigs,
+ AssemblerDef specificConfig, TargetDef targetPlatform);
+ public ProcessorConfiguration createConfiguration(CCTask task,
+ LinkType linkType, ProcessorDef[] baseConfigs,
+ ProcessorDef specificConfig, TargetDef targetPlatform) {
+ if (specificConfig == null) {
+ throw new NullPointerException("specificConfig");
+ }
+ return createConfiguration(task, linkType, baseConfigs,
+ (AssemblerDef) specificConfig, targetPlatform);
+ }
+ public String getOutputFileName(String inputFile) {
+ if (bid(inputFile) > 1) {
+ String baseName = getBaseOutputName(inputFile);
+ return baseName + outputSuffix;
+ }
+ return null;
+ }
+ protected String getBaseOutputName(String inputFile) {
+ int lastSlash = inputFile.lastIndexOf('/');
+ int lastReverse = inputFile.lastIndexOf('\\');
+ int lastSep = inputFile.lastIndexOf(File.separatorChar);
+ if (lastReverse > lastSlash) {
+ lastSlash = lastReverse;
+ }
+ if (lastSep > lastSlash) {
+ lastSlash = lastSep;
+ }
+ int lastPeriod = inputFile.lastIndexOf('.');
+ if (lastPeriod < 0) {
+ lastPeriod = inputFile.length();
+ }
+ return inputFile.substring(lastSlash + 1, lastPeriod);
+ }
+} \ No newline at end of file
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AbstractCompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AbstractCompiler.java
new file mode 100644
index 0000000..f16ec6c
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AbstractCompiler.java
@@ -0,0 +1,205 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compiler;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.Reader;
+import java.util.Vector;
+import net.sf.antcontrib.cpptasks.CCTask;
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.CompilerDef;
+import net.sf.antcontrib.cpptasks.DependencyInfo;
+import net.sf.antcontrib.cpptasks.ProcessorDef;
+import net.sf.antcontrib.cpptasks.parser.Parser;
+import net.sf.antcontrib.cpptasks.TargetDef;
+
+/**
+ * An abstract compiler implementation.
+ *
+ * @author Adam Murdoch
+ * @author Curt Arnold
+ */
+public abstract class AbstractCompiler extends AbstractProcessor
+ implements
+ Compiler {
+ private static final String[] emptyIncludeArray = new String[0];
+ private String outputSuffix;
+ protected AbstractCompiler(String[] sourceExtensions,
+ String[] headerExtensions, String outputSuffix) {
+ super(sourceExtensions, headerExtensions);
+ this.outputSuffix = outputSuffix;
+ }
+ /**
+ * Checks file name to see if parse should be attempted
+ *
+ * Default implementation returns false for files with extensions '.dll',
+ * 'tlb', '.res'
+ *
+ */
+ protected boolean canParse(File sourceFile) {
+ String sourceName = sourceFile.toString();
+ int lastPeriod = sourceName.lastIndexOf('.');
+ if (lastPeriod >= 0 && lastPeriod == sourceName.length() - 4) {
+ String ext = sourceName.substring(lastPeriod).toUpperCase();
+ if (ext.equals(".DLL") || ext.equals(".TLB") || ext.equals(".RES")) {
+ return false;
+ }
+ }
+ return true;
+ }
+ abstract protected CompilerConfiguration createConfiguration(CCTask task,
+ LinkType linkType, ProcessorDef[] baseConfigs,
+ CompilerDef specificConfig, TargetDef targetPlatform);
+ public ProcessorConfiguration createConfiguration(CCTask task,
+ LinkType linkType, ProcessorDef[] baseConfigs,
+ ProcessorDef specificConfig, TargetDef targetPlatform) {
+ if (specificConfig == null) {
+ throw new NullPointerException("specificConfig");
+ }
+ return createConfiguration(task, linkType, baseConfigs,
+ (CompilerDef) specificConfig, targetPlatform);
+ }
+ abstract protected Parser createParser(File sourceFile);
+ protected String getBaseOutputName(String inputFile) {
+ int lastSlash = inputFile.lastIndexOf('/');
+ int lastReverse = inputFile.lastIndexOf('\\');
+ int lastSep = inputFile.lastIndexOf(File.separatorChar);
+ if (lastReverse > lastSlash) {
+ lastSlash = lastReverse;
+ }
+ if (lastSep > lastSlash) {
+ lastSlash = lastSep;
+ }
+ int lastPeriod = inputFile.lastIndexOf('.');
+ if (lastPeriod < 0) {
+ lastPeriod = inputFile.length();
+ }
+ return inputFile.substring(lastSlash + 1, lastPeriod);
+ }
+ public String getOutputFileName(String inputFile) {
+ //
+ // if a recognized input file
+ //
+ if (bid(inputFile) > 1) {
+ String baseName = getBaseOutputName(inputFile);
+ return baseName + outputSuffix;
+ }
+ return null;
+ }
+ /**
+ * Returns dependency info for the specified source file
+ *
+ * @param task
+ * task for any diagnostic output
+ * @param source
+ * file to be parsed
+ * @param includePath
+ * include path to be used to resolve included files
+ *
+ * @param sysIncludePath
+ * sysinclude path from build file, files resolved using
+ * sysInclude path will not participate in dependency analysis
+ *
+ * @param envIncludePath
+ * include path from environment variable, files resolved with
+ * envIncludePath will not participate in dependency analysis
+ *
+ * @param baseDir
+ * used to produce relative paths in DependencyInfo
+ * @param includePathIdentifier
+ * used to distinguish DependencyInfo's from different include
+ * path settings
+ *
+ * @author Curt Arnold
+ */
+ public final DependencyInfo parseIncludes(CCTask task, File source,
+ File[] includePath, File[] sysIncludePath, File[] envIncludePath,
+ File baseDir, String includePathIdentifier) {
+ //
+ // if any of the include files can not be identified
+ // change the sourceLastModified to Long.MAX_VALUE to
+ // force recompilation of anything that depends on it
+ long sourceLastModified = source.lastModified();
+ File[] sourcePath = new File[1];
+ sourcePath[0] = new File(source.getParent());
+ Vector onIncludePath = new Vector();
+ Vector onSysIncludePath = new Vector();
+ String baseDirPath;
+ try {
+ baseDirPath = baseDir.getCanonicalPath();
+ } catch (IOException ex) {
+ baseDirPath = baseDir.toString();
+ }
+ String relativeSource = CUtil.getRelativePath(baseDirPath, source);
+ String[] includes = emptyIncludeArray;
+ if (canParse(source)) {
+ Parser parser = createParser(source);
+ try {
+ Reader reader = new BufferedReader(new FileReader(source));
+ parser.parse(reader);
+ includes = parser.getIncludes();
+ } catch (IOException ex) {
+ task.log("Error parsing " + source.toString() + ":"
+ + ex.toString());
+ includes = new String[0];
+ }
+ }
+ for (int i = 0; i < includes.length; i++) {
+ String includeName = includes[i];
+ if (!resolveInclude(includeName, sourcePath, onIncludePath)) {
+ if (!resolveInclude(includeName, includePath, onIncludePath)) {
+ if (!resolveInclude(includeName, sysIncludePath,
+ onSysIncludePath)) {
+ if (!resolveInclude(includeName, envIncludePath,
+ onSysIncludePath)) {
+ //
+ // this should be enough to require us to reparse
+ // the file with the missing include for dependency
+ // information without forcing a rebuild
+ sourceLastModified++;
+ }
+ }
+ }
+ }
+ }
+ for (int i = 0; i < onIncludePath.size(); i++) {
+ String relativeInclude = CUtil.getRelativePath(baseDirPath,
+ (File) onIncludePath.elementAt(i));
+ onIncludePath.setElementAt(relativeInclude, i);
+ }
+ for (int i = 0; i < onSysIncludePath.size(); i++) {
+ String relativeInclude = CUtil.getRelativePath(baseDirPath,
+ (File) onSysIncludePath.elementAt(i));
+ onSysIncludePath.setElementAt(relativeInclude, i);
+ }
+ return new DependencyInfo(includePathIdentifier, relativeSource,
+ sourceLastModified, onIncludePath, onSysIncludePath);
+ }
+ protected boolean resolveInclude(String includeName, File[] includePath,
+ Vector onThisPath) {
+ for (int i = 0; i < includePath.length; i++) {
+ File includeFile = new File(includePath[i], includeName);
+ if (includeFile.exists()) {
+ onThisPath.addElement(includeFile);
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AbstractLinker.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AbstractLinker.java
new file mode 100644
index 0000000..20580e5
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AbstractLinker.java
@@ -0,0 +1,85 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compiler;
+import java.io.File;
+
+import net.sf.antcontrib.cpptasks.CCTask;
+import net.sf.antcontrib.cpptasks.LinkerDef;
+import net.sf.antcontrib.cpptasks.ProcessorDef;
+import net.sf.antcontrib.cpptasks.TargetDef;
+
+
+import org.apache.tools.ant.types.Environment;
+/**
+ * An abstract Linker implementation.
+ *
+ * @author Adam Murdoch
+ */
+public abstract class AbstractLinker extends AbstractProcessor
+ implements
+ Linker {
+ public AbstractLinker(String[] objExtensions, String[] ignoredExtensions) {
+ super(objExtensions, ignoredExtensions);
+ }
+ /**
+ * Returns the bid of the processor for the file.
+ *
+ * A linker will bid 1 on any unrecognized file type.
+ *
+ * @param inputFile
+ * filename of input file
+ * @return bid for the file, 0 indicates no interest, 1 indicates that the
+ * processor recognizes the file but doesn't process it (header
+ * files, for example), 100 indicates strong interest
+ */
+ public int bid(String inputFile) {
+ int bid = super.bid(inputFile);
+ switch (bid) {
+ //
+ // unrecognized extension, take the file
+ //
+ case 0 :
+ return 1;
+ //
+ // discard the ignored extensions
+ //
+ case 1 :
+ return 0;
+ }
+ return bid;
+ }
+ public Processor changeEnvironment(boolean newEnvironment, Environment env) {
+ return this;
+ }
+ abstract protected LinkerConfiguration createConfiguration(CCTask task,
+ LinkType linkType, ProcessorDef[] baseConfigs,
+ LinkerDef specificConfig, TargetDef targetPlatform);
+ public ProcessorConfiguration createConfiguration(CCTask task,
+ LinkType linkType, ProcessorDef[] baseConfigs,
+ ProcessorDef specificConfig,
+ TargetDef targetPlatform) {
+ if (specificConfig == null) {
+ throw new NullPointerException("specificConfig");
+ }
+ return createConfiguration(task, linkType, baseConfigs,
+ (LinkerDef) specificConfig, targetPlatform);
+ }
+ public String getLibraryKey(File libfile) {
+ return libfile.getName();
+ }
+ public abstract String getOutputFileName(String fileName);
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AbstractProcessor.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AbstractProcessor.java
new file mode 100644
index 0000000..b6456d5
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AbstractProcessor.java
@@ -0,0 +1,129 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compiler;
+import org.apache.tools.ant.types.Environment;
+/**
+ * An abstract processor (compiler/linker) implementation.
+ *
+ * @author Curt Arnold
+ */
+public abstract class AbstractProcessor implements Processor, Cloneable {
+ /**
+ * default bid for a file name that the processor recognizes but does not
+ * process and does not want to fall through to the linker
+ */
+ public final static int DEFAULT_DISCARD_BID = 1;
+ /**
+ * default bid for a file name that the processor desires to process
+ */
+ public final static int DEFAULT_PROCESS_BID = 100;
+ /**
+ * Determines the identification of a command line processor by capture the
+ * first line of its output for a specific command.
+ *
+ * @param command
+ * array of command line arguments starting with executable
+ * name. For example, { "cl" }
+ * @param fallback
+ * start of identifier if there is an error in executing the
+ * command
+ * @return identifier for the processor
+ */
+ protected static String getIdentifier(String[] command, String fallback) {
+ String identifier = fallback;
+ try {
+ String[] cmdout = CaptureStreamHandler.run(command);
+ if (cmdout.length > 0) {
+ identifier = cmdout[0];
+ }
+ } catch (Throwable ex) {
+ identifier = fallback + ":" + ex.toString();
+ }
+ return identifier;
+ }
+ private final String[] headerExtensions;
+ private final String[] sourceExtensions;
+ protected AbstractProcessor(String[] sourceExtensions,
+ String[] headerExtensions) {
+ this.sourceExtensions = (String[]) sourceExtensions.clone();
+ this.headerExtensions = (String[]) headerExtensions.clone();
+ }
+ /**
+ * Returns the bid of the processor for the file.
+ *
+ * @param inputFile
+ * filename of input file
+ * @return bid for the file, 0 indicates no interest, 1 indicates that the
+ * processor recognizes the file but doesn't process it (header
+ * files, for example), 100 indicates strong interest
+ */
+ public int bid(String inputFile) {
+ String lower = inputFile.toLowerCase();
+ for (int i = 0; i < sourceExtensions.length; i++) {
+ if (lower.endsWith(sourceExtensions[i])) {
+ return DEFAULT_PROCESS_BID;
+ }
+ }
+ for (int i = 0; i < headerExtensions.length; i++) {
+ if (lower.endsWith(headerExtensions[i])) {
+ return DEFAULT_DISCARD_BID;
+ }
+ }
+ return 0;
+ }
+ public Processor changeEnvironment(boolean newEnvironment, Environment env) {
+ return this;
+ }
+ protected Object clone() throws CloneNotSupportedException {
+ return super.clone();
+ }
+ public String[] getHeaderExtensions() {
+ return (String[]) this.headerExtensions.clone();
+ }
+ abstract public String getIdentifier();
+ /**
+ * Gets the target operating system architecture
+ *
+ * @return String target operating system architecture
+ */
+ protected String getOSArch() {
+ return System.getProperty("os.arch");
+ }
+ /**
+ * Gets the target operating system name
+ *
+ * @return String target operating system name
+ */
+ protected String getOSName() {
+ return System.getProperty("os.name");
+ }
+ public String[] getSourceExtensions() {
+ return (String[]) this.sourceExtensions.clone();
+ }
+ /**
+ * Returns true if the target operating system is Mac OS X or Darwin.
+ *
+ * @return boolean
+ */
+ protected boolean isDarwin() {
+ String osName = getOSName();
+ return "Mac OS X".equals(osName);
+ }
+ public final String toString() {
+ return getIdentifier();
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/Aslcompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/Aslcompiler.java
new file mode 100644
index 0000000..a210e1c
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/Aslcompiler.java
@@ -0,0 +1,23 @@
+/*
+ *
+ * Copyright 2001-2005 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compiler;
+/**
+ * A asl compiler.
+ *
+ */
+public interface Aslcompiler extends Processor {
+} \ No newline at end of file
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AslcompilerConfiguration.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AslcompilerConfiguration.java
new file mode 100644
index 0000000..62ac276
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AslcompilerConfiguration.java
@@ -0,0 +1,29 @@
+/*
+ *
+ * Copyright 2001-2005 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compiler;
+
+import java.io.File;
+
+import net.sf.antcontrib.cpptasks.CCTask;
+import org.apache.tools.ant.BuildException;
+/**
+ * A configuration for an ASL compiler
+ *
+ */
+public interface AslcompilerConfiguration extends ProcessorConfiguration {
+ void aslcompiler(CCTask task, File outputDir, String[] sourceFiles) throws BuildException;
+} \ No newline at end of file
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/Assembler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/Assembler.java
new file mode 100644
index 0000000..1b6d7b5
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/Assembler.java
@@ -0,0 +1,23 @@
+/*
+ *
+ * Copyright 2001-2005 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compiler;
+/**
+ * A assembler.
+ *
+ */
+public interface Assembler extends Processor {
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AssemblerConfiguration.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AssemblerConfiguration.java
new file mode 100644
index 0000000..9411551
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AssemblerConfiguration.java
@@ -0,0 +1,29 @@
+/*
+ *
+ * Copyright 2001-2005 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compiler;
+
+import java.io.File;
+
+import net.sf.antcontrib.cpptasks.CCTask;
+import org.apache.tools.ant.BuildException;
+/**
+ * A configuration for an assembler
+ *
+ */
+public interface AssemblerConfiguration extends ProcessorConfiguration {
+ void assembler(CCTask task, File outputDir, String[] sourceFiles) throws BuildException;
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CaptureStreamHandler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CaptureStreamHandler.java
new file mode 100644
index 0000000..1b89a70
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CaptureStreamHandler.java
@@ -0,0 +1,122 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compiler;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.util.Vector;
+
+import org.apache.tools.ant.taskdefs.Execute;
+import org.apache.tools.ant.taskdefs.ExecuteStreamHandler;
+/**
+ * Implements ExecuteStreamHandler to capture the output of a Execute to an
+ * array of strings
+ *
+ * @author Curt Arnold
+ */
+public class CaptureStreamHandler implements ExecuteStreamHandler {
+ /**
+ * Runs an executable and captures the output in a String array
+ *
+ * @param cmdline
+ * command line arguments
+ * @return output of process
+ */
+ public static String[] run(String[] cmdline) {
+ CaptureStreamHandler handler = new CaptureStreamHandler();
+ Execute exec = new Execute(handler);
+ exec.setCommandline(cmdline);
+ try {
+ int status = exec.execute();
+ } catch (IOException ex) {
+ }
+ return handler.getOutput();
+ }
+ private InputStream errorStream;
+ private InputStream fromProcess;
+ public CaptureStreamHandler() {
+ }
+ public String[] getOutput() {
+ String[] output;
+ if (fromProcess != null) {
+ Vector lines = new Vector(10);
+ try {
+ BufferedReader reader = new BufferedReader(
+ new InputStreamReader(errorStream));
+ for (int i = 0; i < 2; i++) {
+ for (int j = 0; j < 100; j++) {
+ String line = reader.readLine();
+ if (line == null) {
+ reader = new BufferedReader(new InputStreamReader(
+ fromProcess));
+ break;
+ }
+ lines.addElement(line);
+ }
+ }
+ } catch (IOException ex) {
+ }
+ output = new String[lines.size()];
+ lines.copyInto(output);
+ return output;
+ }
+ output = new String[0];
+ return output;
+ }
+ /**
+ * Install a handler for the error stream of the subprocess.
+ *
+ * @param is
+ * input stream to read from the error stream from the
+ * subprocess
+ */
+ public void setProcessErrorStream(InputStream is) throws IOException {
+ errorStream = is;
+ }
+ /**
+ * Install a handler for the input stream of the subprocess.
+ *
+ * @param os
+ * output stream to write to the standard input stream of the
+ * subprocess
+ */
+ public void setProcessInputStream(OutputStream os) throws IOException {
+ os.close();
+ }
+ /**
+ * Install a handler for the output stream of the subprocess.
+ *
+ * @param is
+ * input stream to read from the error stream from the
+ * subprocess
+ */
+ public void setProcessOutputStream(InputStream is) throws IOException {
+ fromProcess = is;
+ }
+ /**
+ * Start handling of the streams.
+ */
+ public void start() throws IOException {
+ }
+ /**
+ * Stop handling of the streams - will not be restarted.
+ */
+ public void stop() {
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineAslcompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineAslcompiler.java
new file mode 100644
index 0000000..88dda57
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineAslcompiler.java
@@ -0,0 +1,226 @@
+/*
+ *
+ * Copyright 2001-2005 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compiler;
+
+import java.io.File;
+import java.util.Enumeration;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.AslcompilerDef;
+import net.sf.antcontrib.cpptasks.CCTask;
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.ProcessorDef;
+import net.sf.antcontrib.cpptasks.TargetDef;
+import net.sf.antcontrib.cpptasks.types.CommandLineArgument;
+
+import org.apache.tools.ant.BuildException;
+/**
+ * An abstract ASL Compiler implementation which uses an external program to
+ * perform the ASL compile.
+ *
+ */
+public abstract class CommandLineAslcompiler extends AbstractAslcompiler{
+
+ private String command;
+ private String identifier;
+ private String identifierArg;
+
+ protected CommandLineAslcompiler(String command, String identifierArg,
+ String[] sourceExtensions, String[] headerExtensions,
+ String outputSuffix) {
+ super(sourceExtensions, headerExtensions, outputSuffix);
+ this.command = command;
+ this.identifierArg = identifierArg;
+ }
+
+ abstract protected void addImpliedArgs(Vector args, boolean debug,
+ Boolean defaultflag);
+
+ /**
+ * Compile a ACPI source file
+ *
+ */
+ public void aslcompiler(CCTask task, File outputDir, String[] sourceFiles,
+ String[] args, String[] endArgs) throws BuildException{
+ String command = getCommand();
+ int baseLength = command.length() + args.length + endArgs.length;
+ for (int i = 0; i < args.length; i++) {
+ baseLength += args[i].length();
+ }
+ for (int i = 0; i < endArgs.length; i++) {
+ baseLength += endArgs[i].length();
+ }
+ if (baseLength > getMaximumCommandLength()) {
+ throw new BuildException(
+ "Command line is over maximum length without sepcifying source file");
+ }
+ int maxInputFilesPerCommand = getMaximumInputFilesPerCommand();
+ int argumentCountPerInputFile = getArgumentCountPerInputFIle();
+ for (int sourceIndex = 0; sourceIndex < sourceFiles.length;) {
+ int cmdLength = baseLength;
+ int firstFileNextExec;
+ for (firstFileNextExec = sourceIndex; firstFileNextExec < sourceFiles.length
+ && (firstFileNextExec - sourceIndex) < maxInputFilesPerCommand; firstFileNextExec++) {
+ cmdLength += getTotalArgumentLengthForInputFile(outputDir,
+ sourceFiles[firstFileNextExec]);
+ if (cmdLength >= getMaximumCommandLength())
+ break;
+ }
+ if (firstFileNextExec == sourceIndex) {
+ throw new BuildException(
+ "Extremely long file name, can't fit on command line");
+ }
+ int argCount = args.length + 1 + endArgs.length
+ + (firstFileNextExec - sourceIndex)
+ * argumentCountPerInputFile;
+ String[] commandline = new String[argCount];
+ int index = 0;
+ commandline[index++] = command;
+ for (int j = 0; j < args.length; j++) {
+ commandline[index++] = args[j];
+ }
+ for (int j = sourceIndex; j < firstFileNextExec; j++) {
+ for (int k = 0; k < argumentCountPerInputFile; k++) {
+ commandline[index++] = getInputFileArgument(outputDir,
+ sourceFiles[j], k);
+ }
+ }
+ for (int j = 0; j < endArgs.length; j++) {
+ commandline[index++] = endArgs[j];
+ }
+ int retval = runCommand(task, outputDir, commandline);
+ // if with monitor, add more code
+ if (retval != 0) {
+ throw new BuildException(this.getCommand()
+ + " failed with return code " + retval,
+ task.getLocation());
+ }
+ sourceIndex = firstFileNextExec;
+ }
+ }
+
+ protected AslcompilerConfiguration createConfiguration(final CCTask task,
+ final LinkType linkType,
+ final ProcessorDef[] baseDefs,
+ final AslcompilerDef specificDef,
+ final TargetDef targetPlatform) {
+ Vector args = new Vector();
+ AslcompilerDef[] defaultProviders = new AslcompilerDef[baseDefs.length +1];
+ for (int i = 0; i < baseDefs.length; i++) {
+ defaultProviders[i + 1] = (AslcompilerDef) baseDefs[i];
+ }
+ defaultProviders[0] = specificDef;
+ Vector cmdArgs = new Vector();
+ //
+ // add command line arguments inherited from <cc> element
+ // any "extends" and finally and specific AslcompilerDef
+ //
+ CommandLineArgument[] commandArgs;
+ for (int i = defaultProviders.length - 1; i >=0; i--){
+ commandArgs = defaultProviders[i].getActiveProcessorArgs();
+ for (int j = 0; j < commandArgs.length; j++) {
+ if (commandArgs[j].getLocation() == 0) {
+ args.addElement(commandArgs[j].getValue());
+ }
+ else {
+ cmdArgs.addElement(commandArgs[j]);
+ }
+ }
+ }
+ // omit param
+ boolean debug = specificDef.getDebug(baseDefs, 0);
+ Boolean defaultflag = specificDef.getDefaultflag(defaultProviders, 1);
+ this.addImpliedArgs(args, debug, defaultflag);
+ Enumeration argEnum = cmdArgs.elements();
+ int endCount = 0;
+ while( argEnum.hasMoreElements()) {
+ CommandLineArgument arg = (CommandLineArgument) argEnum.nextElement();
+ switch (arg.getLocation()) {
+ case 1 :
+ args.addElement(arg.getValue());
+ break;
+ case 2 :
+ endCount++;
+ break;
+ }
+ }
+ String[] endArgs = new String[endCount];
+ argEnum = cmdArgs.elements();
+ int index = 0;
+ while (argEnum.hasMoreElements()) {
+ CommandLineArgument arg = (CommandLineArgument) argEnum.nextElement();
+ if (arg.getLocation() == 2) {
+ endArgs[index++] = arg.getValue();
+ }
+ }
+ String[] argArray = new String[args.size()];
+ args.copyInto(argArray);
+ return new CommandLineAslcompilerConfiguration(this, argArray, true, endArgs);
+ }
+
+ protected int getArgumentCountPerInputFile() {
+ return 1;
+ }
+
+ public String getIdentifier() {
+ if (identifier == null) {
+ if (identifierArg == null) {
+ identifier = getIdentifier(new String[]{command}, command);
+ }
+ else {
+ identifier = getIdentifier(
+ new String[]{command, identifierArg}, command);
+ }
+ }
+ return identifier;
+ }
+
+ public final String getCommand() {
+ return command;
+ }
+ abstract public int getMaximumCommandLength();
+ public void setCommand(String command) {
+ this.command = command;
+ }
+ protected int getTotalArgumentLengthForInputFile(File outputDir,
+ String inputFile) {
+ return inputFile.length() + 1;
+ }
+ protected int runCommand(CCTask task, File workingDir, String[] cmdline)
+ throws BuildException {
+ return CUtil.runCommand(task, workingDir, cmdline, false, null);
+
+ }
+ protected int getMaximumInputFilesPerCommand(){
+ return 1;
+ }
+ protected int getArgumentCountPerInputFIle(){
+ return 1;
+ }
+ protected String getInputFileArgument(File outputDir, String filename, int index) {
+ //
+ // if there is an embedded space,
+ // must enclose in quotes
+ if (filename.indexOf(' ') >= 0) {
+ StringBuffer buf = new StringBuffer("\"");
+ buf.append(filename);
+ buf.append("\"");
+ return buf.toString();
+ }
+ return filename;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineAslcompilerConfiguration.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineAslcompilerConfiguration.java
new file mode 100644
index 0000000..9a3457d
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineAslcompilerConfiguration.java
@@ -0,0 +1,93 @@
+/*
+ *
+ * Copyright 2001-2005 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compiler;
+
+import java.io.File;
+
+import org.apache.tools.ant.BuildException;
+
+import net.sf.antcontrib.cpptasks.CCTask;
+import net.sf.antcontrib.cpptasks.ProcessorParam;
+
+/**
+ * A configuration for an ASL compiler
+ *
+ */
+public final class CommandLineAslcompilerConfiguration implements
+ AslcompilerConfiguration {
+
+ private String[] args;
+
+ private CommandLineAslcompiler acpi;
+
+ private String[] endArgs;
+
+ private boolean rebuild;
+
+ public CommandLineAslcompilerConfiguration (CommandLineAslcompiler acpi,
+ String[] args, boolean rebuild, String[] endArgs) {
+ if (acpi == null) {
+ throw new NullPointerException("acpi");
+ }
+ if (args == null) {
+ this.args = new String[0];
+ } else {
+ this.args = (String[]) args.clone();
+ }
+ this.acpi = acpi;
+ this.rebuild = rebuild;
+ this.endArgs = (String[]) endArgs.clone();
+ }
+
+ public int bid (String inputFile) {
+ int acpiBid = acpi.bid(inputFile);
+ return acpiBid;
+ }
+
+ public void aslcompiler (CCTask task, File outputDir, String[] sourceFiles)
+ throws BuildException {
+ try {
+ acpi.aslcompiler(task, outputDir, sourceFiles, args, endArgs);
+ } catch (BuildException ex) {
+ throw ex;
+ }
+ }
+
+ public String getIdentifier () {
+ return acpi.getCommand();
+ }
+
+ public ProcessorParam[] getParams () {
+ return new ProcessorParam[0];
+ }
+
+ public boolean getRebuild () {
+ return rebuild;
+ }
+
+ public String[] getPreArguments () {
+ return (String[]) args.clone();
+ }
+
+ public String[] getEndArguments () {
+ return (String[]) endArgs.clone();
+ }
+
+ public String getOutputFileName (String inputFile) {
+ return acpi.getOutputFileName(inputFile);
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineAssembler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineAssembler.java
new file mode 100644
index 0000000..f01fc5e
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineAssembler.java
@@ -0,0 +1,326 @@
+/*
+ *
+ * Copyright 2001-2005 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compiler;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.AssemblerDef;
+import net.sf.antcontrib.cpptasks.CCTask;
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.ProcessorDef;
+import net.sf.antcontrib.cpptasks.TargetDef;
+import net.sf.antcontrib.cpptasks.types.CommandLineArgument;
+
+import org.apache.tools.ant.BuildException;
+
+/**
+ * An abstract Assembler implementation which uses an external program to
+ * perform the assemble.
+ *
+ */
+public abstract class CommandLineAssembler extends AbstractAssembler {
+
+ private String command;
+
+ private String identifier;
+
+ private String identifierArg;
+
+ protected CommandLineAssembler (String command, String identifierArg,
+ String[] sourceExtensions, String[] headerExtensions,
+ String outputSuffix) {
+ super(sourceExtensions, headerExtensions, outputSuffix);
+ this.command = command;
+ this.identifierArg = identifierArg;
+ }
+
+ abstract protected void addImpliedArgs(Vector args, boolean debug,
+ Boolean defaultflag);
+
+ /**
+ * Adds command-line arguments for include directories.
+ *
+ * If relativeArgs is not null will add corresponding relative paths include
+ * switches to that vector (for use in building a configuration identifier
+ * that is consistent between machines).
+ *
+ * @param baseDirPaths
+ * A vector containing the parts of the working directory,
+ * produced by CUtil.DecomposeFile.
+ * @param includeDirs
+ * Array of include directory paths
+ * @param args
+ * Vector of command line arguments used to execute the task
+ * @param relativeArgs
+ * Vector of command line arguments used to build the
+ * configuration identifier
+ */
+ protected void addIncludes(String baseDirPath, File[] includeDirs,
+ Vector args, Vector relativeArgs, StringBuffer includePathId) {
+ for (int i = 0; i < includeDirs.length; i++) {
+ args.addElement(getIncludeDirSwitch(includeDirs[i]
+ .getAbsolutePath()));
+ if (relativeArgs != null) {
+ String relative = CUtil.getRelativePath(baseDirPath,
+ includeDirs[i]);
+ relativeArgs.addElement(getIncludeDirSwitch(relative));
+ if (includePathId != null) {
+ if (includePathId.length() == 0) {
+ includePathId.append("/I");
+ } else {
+ includePathId.append(" /I");
+ }
+ includePathId.append(relative);
+ }
+ }
+ }
+ }
+
+ abstract protected String getIncludeDirSwitch(String source);
+
+ /**
+ * Assembles a source file
+ *
+ */
+ public void assembler(CCTask task, File outputDir, String[] sourceFiles,
+ String[] args, String[] endArgs) throws BuildException {
+ String command = getCommand();
+ int baseLength = command.length() + args.length + endArgs.length;
+ for (int i = 0; i < args.length; i++) {
+ baseLength += args[i].length();
+ }
+ for (int i = 0; i < endArgs.length; i++) {
+ baseLength += endArgs[i].length();
+ }
+ if (baseLength > getMaximumCommandLength()) {
+ throw new BuildException(
+ "Command line is over maximum length without sepcifying source file");
+ }
+ int maxInputFilesPerCommand = getMaximumInputFilesPerCommand();
+ int argumentCountPerInputFile = getArgumentCountPerInputFIle();
+ for (int sourceIndex = 0; sourceIndex < sourceFiles.length;) {
+ int cmdLength = baseLength;
+ int firstFileNextExec;
+ for (firstFileNextExec = sourceIndex; firstFileNextExec < sourceFiles.length
+ && (firstFileNextExec - sourceIndex) < maxInputFilesPerCommand; firstFileNextExec++) {
+ cmdLength += getTotalArgumentLengthForInputFile(outputDir,
+ sourceFiles[firstFileNextExec]);
+ if (cmdLength >= getMaximumCommandLength())
+ break;
+ }
+ if (firstFileNextExec == sourceIndex) {
+ throw new BuildException(
+ "Extremely long file name, can't fit on command line");
+ }
+ int argCount = args.length + 1 + endArgs.length
+ + (firstFileNextExec - sourceIndex)
+ * argumentCountPerInputFile;
+ String[] commandline = new String[argCount];
+ int index = 0;
+ commandline[index++] = command;
+ for (int j = 0; j < args.length; j++) {
+ commandline[index++] = args[j];
+ }
+ for (int j = sourceIndex; j < firstFileNextExec; j++) {
+ for (int k = 0; k < argumentCountPerInputFile; k++) {
+ commandline[index++] = getInputFileArgument(outputDir,
+ sourceFiles[j], k);
+ }
+ }
+ for (int j = 0; j < endArgs.length; j++) {
+ commandline[index++] = endArgs[j];
+ }
+ int retval = runCommand(task, outputDir, commandline);
+ // if with monitor, add more code
+ if (retval != 0) {
+ throw new BuildException(this.getCommand()
+ + " failed with return code " + retval, task
+ .getLocation());
+ }
+ sourceIndex = firstFileNextExec;
+ }
+ }
+
+ protected AssemblerConfiguration createConfiguration(final CCTask task,
+ final LinkType linkType, final ProcessorDef[] baseDefs,
+ final AssemblerDef specificDef,
+ final TargetDef targetPlatform) {
+ Vector args = new Vector();
+ AssemblerDef[] defaultProviders = new AssemblerDef[baseDefs.length + 1];
+ for (int i = 0; i < baseDefs.length; i++) {
+ defaultProviders[i + 1] = (AssemblerDef) baseDefs[i];
+ }
+ defaultProviders[0] = specificDef;
+ Vector cmdArgs = new Vector();
+ //
+ // add command line arguments inherited from <cc> element
+ // any "extends" and finally and specific AssemblerDef
+ //
+ CommandLineArgument[] commandArgs;
+ for (int i = defaultProviders.length - 1; i >= 0; i--) {
+ commandArgs = defaultProviders[i].getActiveProcessorArgs();
+ for (int j = 0; j < commandArgs.length; j++) {
+ if (commandArgs[j].getLocation() == 0) {
+ args.addElement(commandArgs[j].getValue());
+ } else {
+ cmdArgs.addElement(commandArgs[j]);
+ }
+ }
+ }
+ // omit param
+ boolean debug = specificDef.getDebug(baseDefs, 0);
+ Boolean defaultflag = specificDef.getDefaultflag(defaultProviders, 1);
+ this.addImpliedArgs(args, debug, defaultflag);
+ //
+ // Want to have distinct set of arguments with relative
+ // path names for includes that are used to build
+ // the configuration identifier
+ //
+ Vector relativeArgs = (Vector) args.clone();
+ //
+ // add all active include an
+ //
+ StringBuffer includePathIdentifier = new StringBuffer();
+ File baseDir = specificDef.getProject().getBaseDir();
+ String baseDirPath;
+ try {
+ baseDirPath = baseDir.getCanonicalPath();
+ } catch (IOException ex) {
+ baseDirPath = baseDir.toString();
+ }
+ Vector includePath = new Vector();
+ Vector sysIncludePath = new Vector();
+ for (int i = defaultProviders.length - 1; i >= 0; i--) {
+ String[] incPath = defaultProviders[i].getActiveIncludePaths();
+ for (int j = 0; j < incPath.length; j++) {
+ includePath.addElement(incPath[j]);
+ }
+ incPath = defaultProviders[i].getActiveSysIncludePaths();
+ for (int j = 0; j < incPath.length; j++) {
+ sysIncludePath.addElement(incPath[j]);
+ }
+ }
+ File[] incPath = new File[includePath.size()];
+ for (int i = 0; i < includePath.size(); i++) {
+ incPath[i] = new File((String) includePath.elementAt(i));
+ }
+ File[] sysIncPath = new File[sysIncludePath.size()];
+ for (int i = 0; i < sysIncludePath.size(); i++) {
+ sysIncPath[i] = new File((String) sysIncludePath.elementAt(i));
+ }
+ addIncludes(baseDirPath, incPath, args, relativeArgs,
+ includePathIdentifier);
+ addIncludes(baseDirPath, sysIncPath, args, null, null);
+ StringBuffer buf = new StringBuffer(getIdentifier());
+ for (int i = 0; i < relativeArgs.size(); i++) {
+ buf.append(relativeArgs.elementAt(i));
+ buf.append(' ');
+ }
+ buf.setLength(buf.length() - 1);
+ Enumeration argEnum = cmdArgs.elements();
+ int endCount = 0;
+ while (argEnum.hasMoreElements()) {
+ CommandLineArgument arg = (CommandLineArgument) argEnum
+ .nextElement();
+ switch (arg.getLocation()) {
+ case 1:
+ args.addElement(arg.getValue());
+ break;
+ case 2:
+ endCount++;
+ break;
+ }
+ }
+ String[] endArgs = new String[endCount];
+ argEnum = cmdArgs.elements();
+ int index = 0;
+ while (argEnum.hasMoreElements()) {
+ CommandLineArgument arg = (CommandLineArgument) argEnum
+ .nextElement();
+ if (arg.getLocation() == 2) {
+ endArgs[index++] = arg.getValue();
+ }
+ }
+ String[] argArray = new String[args.size()];
+ args.copyInto(argArray);
+ return new CommandLineAssemblerConfiguration(this, incPath, sysIncPath,
+ new File[0], argArray, true, endArgs, new String[0]);
+ }
+
+ protected int getArgumentCountPerInputFile() {
+ return 1;
+ }
+
+ protected abstract File[] getEnvironmentIncludePath();
+
+ public String getIdentifier() {
+ if (identifier == null) {
+ if (identifierArg == null) {
+ identifier = getIdentifier(new String[] { command }, command);
+ } else {
+ identifier = getIdentifier(new String[] { command,
+ identifierArg }, command);
+ }
+ }
+ return identifier;
+ }
+
+ public final String getCommand() {
+ return command;
+ }
+
+ abstract public int getMaximumCommandLength();
+
+ public void setCommand(String command) {
+ this.command = command;
+ }
+
+ protected int getTotalArgumentLengthForInputFile(File outputDir,
+ String inputFile) {
+ return inputFile.length() + 1;
+ }
+
+ protected int runCommand(CCTask task, File workingDir, String[] cmdline)
+ throws BuildException {
+ return CUtil.runCommand(task, workingDir, cmdline, false, null);
+ }
+
+ protected int getMaximumInputFilesPerCommand() {
+ return Integer.MAX_VALUE;
+ }
+
+ protected int getArgumentCountPerInputFIle() {
+ return 1;
+ }
+
+ protected String getInputFileArgument(File outputDir, String filename,
+ int index) {
+ //
+ // if there is an embedded space,
+ // must enclose in quotes
+ if (filename.indexOf(' ') >= 0) {
+ StringBuffer buf = new StringBuffer("\"");
+ buf.append(filename);
+ buf.append("\"");
+ return buf.toString();
+ }
+ return filename;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineAssemblerConfiguration.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineAssemblerConfiguration.java
new file mode 100644
index 0000000..542d441
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineAssemblerConfiguration.java
@@ -0,0 +1,123 @@
+/*
+ *
+ * Copyright 2001-2005 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compiler;
+
+import java.io.File;
+
+import org.apache.tools.ant.BuildException;
+
+import net.sf.antcontrib.cpptasks.CCTask;
+import net.sf.antcontrib.cpptasks.ProcessorParam;
+
+/**
+ * A configuration for an assember
+ *
+ */
+public final class CommandLineAssemblerConfiguration implements
+ AssemblerConfiguration {
+
+ private String[] args;
+
+ private CommandLineAssembler assembler;
+
+ private String[] endArgs;
+
+ //
+ // include path from environment variable
+ // not explicitly stated in Ant script
+ //
+ private File[] envIncludePath;
+
+ private String[] exceptFiles;
+
+ private File[] includePath;
+
+ private boolean rebuild;
+
+ private File[] sysIncludePath;
+
+ public CommandLineAssemblerConfiguration (CommandLineAssembler assembler,
+ File[] includePath, File[] sysIncludePath,
+ File[] envIncludePath, String[] args, boolean rebuild,
+ String[] endArgs, String[] exceptFiles) {
+ if (assembler == null) {
+ throw new NullPointerException("assembler");
+ }
+ if (args == null) {
+ this.args = new String[0];
+ } else {
+ this.args = (String[]) args.clone();
+ }
+ if (includePath == null) {
+ this.includePath = new File[0];
+ } else {
+ this.includePath = (File[]) includePath.clone();
+ }
+ if (sysIncludePath == null) {
+ this.sysIncludePath = new File[0];
+ } else {
+ this.sysIncludePath = (File[]) sysIncludePath.clone();
+ }
+ if (envIncludePath == null) {
+ this.envIncludePath = new File[0];
+ } else {
+ this.envIncludePath = (File[]) envIncludePath.clone();
+ }
+ this.assembler = assembler;
+ this.rebuild = rebuild;
+ this.endArgs = (String[]) endArgs.clone();
+ this.exceptFiles = (String[]) exceptFiles.clone();
+ }
+
+ public int bid(String inputFile) {
+ int assembleBid = assembler.bid(inputFile);
+ return assembleBid;
+ }
+
+ public void assembler(CCTask task, File outputDir, String[] sourceFiles)
+ throws BuildException {
+ try {
+ assembler.assembler(task, outputDir, sourceFiles, args, endArgs);
+ } catch (BuildException ex) {
+ throw ex;
+ }
+ }
+
+ public String getOutputFileName(String inputFile) {
+ return assembler.getOutputFileName(inputFile);
+ }
+
+ public String getIdentifier() {
+ return assembler.getCommand();
+ }
+
+ public ProcessorParam[] getParams() {
+ return new ProcessorParam[0];
+ }
+
+ public boolean getRebuild() {
+ return rebuild;
+ }
+
+ public String[] getPreArguments() {
+ return (String[]) args.clone();
+ }
+
+ public String[] getEndArguments() {
+ return (String[]) endArgs.clone();
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineCCompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineCCompiler.java
new file mode 100644
index 0000000..442d6b8
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineCCompiler.java
@@ -0,0 +1,42 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compiler;
+import java.io.File;
+
+import net.sf.antcontrib.cpptasks.parser.CParser;
+import net.sf.antcontrib.cpptasks.parser.Parser;
+
+import org.apache.tools.ant.types.Environment;
+/**
+ * An abstract Compiler implementation which uses an external program to
+ * perform the compile.
+ *
+ * @author Adam Murdoch
+ */
+public abstract class CommandLineCCompiler extends CommandLineCompiler {
+ protected CommandLineCCompiler(String command, String identifierArg,
+ String[] sourceExtensions, String[] headerExtensions,
+ String outputSuffix, boolean libtool,
+ CommandLineCCompiler libtoolCompiler, boolean newEnvironment,
+ Environment env) {
+ super(command, identifierArg, sourceExtensions, headerExtensions,
+ outputSuffix, libtool, libtoolCompiler, newEnvironment, env);
+ }
+ protected Parser createParser(File source) {
+ return new CParser();
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineCompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineCompiler.java
new file mode 100644
index 0000000..3f45ce5
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineCompiler.java
@@ -0,0 +1,435 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compiler;
+import java.io.File;
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.Vector;
+import net.sf.antcontrib.cpptasks.CCTask;
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.CompilerDef;
+import net.sf.antcontrib.cpptasks.ProcessorDef;
+import net.sf.antcontrib.cpptasks.ProcessorParam;
+import net.sf.antcontrib.cpptasks.types.CommandLineArgument;
+import net.sf.antcontrib.cpptasks.types.UndefineArgument;
+import net.sf.antcontrib.cpptasks.TargetDef;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.types.Environment;
+import net.sf.antcontrib.cpptasks.OptimizationEnum;;
+/**
+ * An abstract Compiler implementation which uses an external program to
+ * perform the compile.
+ *
+ * @author Adam Murdoch
+ */
+public abstract class CommandLineCompiler extends AbstractCompiler {
+ private String command;
+ private final Environment env;
+ private String identifier;
+ private String identifierArg;
+ private boolean libtool;
+ private CommandLineCompiler libtoolCompiler;
+ private final boolean newEnvironment;
+ protected CommandLineCompiler(String command, String identifierArg,
+ String[] sourceExtensions, String[] headerExtensions,
+ String outputSuffix, boolean libtool,
+ CommandLineCompiler libtoolCompiler, boolean newEnvironment,
+ Environment env) {
+ super(sourceExtensions, headerExtensions, outputSuffix);
+ this.command = command;
+ if (libtool && libtoolCompiler != null) {
+ throw new java.lang.IllegalArgumentException(
+ "libtoolCompiler should be null when libtool is true");
+ }
+ this.libtool = libtool;
+ this.libtoolCompiler = libtoolCompiler;
+ this.identifierArg = identifierArg;
+ this.newEnvironment = newEnvironment;
+ this.env = env;
+ }
+ abstract protected void addImpliedArgs(Vector args, boolean debug,
+ boolean multithreaded, boolean exceptions, LinkType linkType,
+ Boolean rtti, OptimizationEnum optimization, Boolean defaultflag);
+ /**
+ * Adds command-line arguments for include directories.
+ *
+ * If relativeArgs is not null will add corresponding relative paths
+ * include switches to that vector (for use in building a configuration
+ * identifier that is consistent between machines).
+ *
+ * @param baseDirPaths
+ * A vector containing the parts of the working directory,
+ * produced by CUtil.DecomposeFile.
+ * @param includeDirs
+ * Array of include directory paths
+ * @param args
+ * Vector of command line arguments used to execute the task
+ * @param relativeArgs
+ * Vector of command line arguments used to build the
+ * configuration identifier
+ */
+ protected void addIncludes(String baseDirPath, File[] includeDirs,
+ Vector args, Vector relativeArgs, StringBuffer includePathId) {
+ for (int i = 0; i < includeDirs.length; i++) {
+ args.addElement(getIncludeDirSwitch(includeDirs[i]
+ .getAbsolutePath()));
+ if (relativeArgs != null) {
+ String relative = CUtil.getRelativePath(baseDirPath,
+ includeDirs[i]);
+ relativeArgs.addElement(getIncludeDirSwitch(relative));
+ if (includePathId != null) {
+ if (includePathId.length() == 0) {
+ includePathId.append("/I");
+ } else {
+ includePathId.append(" /I");
+ }
+ includePathId.append(relative);
+ }
+ }
+ }
+ }
+ abstract protected void addWarningSwitch(Vector args, int warnings);
+ protected void buildDefineArguments(CompilerDef[] defs, Vector args) {
+ //
+ // assume that we aren't inheriting defines from containing <cc>
+ //
+ UndefineArgument[] merged = defs[0].getActiveDefines();
+ for (int i = 1; i < defs.length; i++) {
+ //
+ // if we are inheriting, merge the specific defines with the
+ // containing defines
+ merged = UndefineArgument.merge(defs[i].getActiveDefines(), merged);
+ }
+ StringBuffer buf = new StringBuffer(30);
+ for (int i = 0; i < merged.length; i++) {
+ buf.setLength(0);
+ UndefineArgument current = merged[i];
+ if (current.isDefine()) {
+ getDefineSwitch(buf, current.getName(), current.getValue());
+ } else {
+ getUndefineSwitch(buf, current.getName());
+ }
+ args.addElement(buf.toString());
+ }
+ }
+ /**
+ * Compiles a source file.
+ *
+ * @author Curt Arnold
+ */
+ public void compile(CCTask task, File outputDir, String[] sourceFiles,
+ String[] args, String[] endArgs, boolean relentless,
+ CommandLineCompilerConfiguration config, ProgressMonitor monitor)
+ throws BuildException {
+ BuildException exc = null;
+ //
+ // determine length of executable name and args
+ //
+ String command = getCommand();
+ int baseLength = command.length() + args.length + endArgs.length;
+ if (libtool) {
+ baseLength += 8;
+ }
+ for (int i = 0; i < args.length; i++) {
+ baseLength += args[i].length();
+ }
+ for (int i = 0; i < endArgs.length; i++) {
+ baseLength += endArgs[i].length();
+ }
+ if (baseLength > getMaximumCommandLength()) {
+ throw new BuildException(
+ "Command line is over maximum length without specifying source file");
+ }
+ //
+ // typically either 1 or Integer.MAX_VALUE
+ //
+ int maxInputFilesPerCommand = getMaximumInputFilesPerCommand();
+ int argumentCountPerInputFile = getArgumentCountPerInputFile();
+ for (int sourceIndex = 0; sourceIndex < sourceFiles.length;) {
+ int cmdLength = baseLength;
+ int firstFileNextExec;
+ for (firstFileNextExec = sourceIndex; firstFileNextExec < sourceFiles.length
+ && (firstFileNextExec - sourceIndex) < maxInputFilesPerCommand; firstFileNextExec++) {
+ cmdLength += getTotalArgumentLengthForInputFile(outputDir,
+ sourceFiles[firstFileNextExec]);
+ if (cmdLength >= getMaximumCommandLength())
+ break;
+ }
+ if (firstFileNextExec == sourceIndex) {
+ throw new BuildException(
+ "Extremely long file name, can't fit on command line");
+ }
+ int argCount = args.length + 1 + endArgs.length
+ + (firstFileNextExec - sourceIndex)
+ * argumentCountPerInputFile;
+ if (libtool) {
+ argCount++;
+ }
+ String[] commandline = new String[argCount];
+ int index = 0;
+ if (libtool) {
+ commandline[index++] = "libtool";
+ }
+ commandline[index++] = command;
+ for (int j = 0; j < args.length; j++) {
+ commandline[index++] = args[j];
+ }
+ for (int j = sourceIndex; j < firstFileNextExec; j++) {
+ for (int k = 0; k < argumentCountPerInputFile; k++) {
+ commandline[index++] = getInputFileArgument(outputDir,
+ sourceFiles[j], k);
+ }
+ }
+ for (int j = 0; j < endArgs.length; j++) {
+ commandline[index++] = endArgs[j];
+ }
+ int retval = runCommand(task, outputDir, commandline);
+ if (monitor != null) {
+ String[] fileNames = new String[firstFileNextExec - sourceIndex];
+ for (int j = 0; j < fileNames.length; j++) {
+ fileNames[j] = sourceFiles[sourceIndex + j];
+ }
+ monitor.progress(fileNames);
+ }
+ //
+ // if the process returned a failure code and
+ // we aren't holding an exception from an earlier
+ // interation
+ if (retval != 0 && exc == null) {
+ //
+ // construct the exception
+ //
+ exc = new BuildException(this.getCommand()
+ + " failed with return code " + retval, task
+ .getLocation());
+ //
+ // and throw it now unless we are relentless
+ //
+ if (!relentless) {
+ throw exc;
+ }
+ }
+ sourceIndex = firstFileNextExec;
+ }
+ //
+ // if the compiler returned a failure value earlier
+ // then throw an exception
+ if (exc != null) {
+ throw exc;
+ }
+ }
+ protected CompilerConfiguration createConfiguration(final CCTask task,
+ final LinkType linkType,
+ final ProcessorDef[] baseDefs,
+ final CompilerDef specificDef,
+ final TargetDef targetPlatform) {
+ Vector args = new Vector();
+ CompilerDef[] defaultProviders = new CompilerDef[baseDefs.length + 1];
+ for (int i = 0; i < baseDefs.length; i++) {
+ defaultProviders[i + 1] = (CompilerDef) baseDefs[i];
+ }
+ defaultProviders[0] = specificDef;
+ Vector cmdArgs = new Vector();
+ //
+ // add command line arguments inherited from <cc> element
+ // any "extends" and finally the specific CompilerDef
+ CommandLineArgument[] commandArgs;
+ for (int i = defaultProviders.length - 1; i >= 0; i--) {
+ commandArgs = defaultProviders[i].getActiveProcessorArgs();
+ for (int j = 0; j < commandArgs.length; j++) {
+ if (commandArgs[j].getLocation() == 0) {
+ args.addElement(commandArgs[j].getValue());
+ } else {
+ cmdArgs.addElement(commandArgs[j]);
+ }
+ }
+ }
+ Vector params = new Vector();
+ //
+ // add command line arguments inherited from <cc> element
+ // any "extends" and finally the specific CompilerDef
+ ProcessorParam[] paramArray;
+ for (int i = defaultProviders.length - 1; i >= 0; i--) {
+ paramArray = defaultProviders[i].getActiveProcessorParams();
+ for (int j = 0; j < paramArray.length; j++) {
+ params.add(paramArray[j]);
+ }
+ }
+ paramArray = (ProcessorParam[]) (params
+ .toArray(new ProcessorParam[params.size()]));
+ boolean multithreaded = specificDef.getMultithreaded(defaultProviders,
+ 1);
+ boolean debug = specificDef.getDebug(baseDefs, 0);
+ boolean exceptions = specificDef.getExceptions(defaultProviders, 1);
+ Boolean rtti = specificDef.getRtti(defaultProviders, 1);
+ Boolean defaultflag = specificDef.getDefaultflag(defaultProviders, 1);
+ OptimizationEnum optimization = specificDef.getOptimization(defaultProviders, 1);
+ this.addImpliedArgs(args, debug, multithreaded, exceptions, linkType, rtti, optimization, defaultflag);
+ //
+ // add all appropriate defines and undefines
+ //
+ buildDefineArguments(defaultProviders, args);
+ //
+ // Want to have distinct set of arguments with relative
+ // path names for includes that are used to build
+ // the configuration identifier
+ //
+ Vector relativeArgs = (Vector) args.clone();
+ //
+ // add all active include and sysincludes
+ //
+ StringBuffer includePathIdentifier = new StringBuffer();
+ File baseDir = specificDef.getProject().getBaseDir();
+ String baseDirPath;
+ try {
+ baseDirPath = baseDir.getCanonicalPath();
+ } catch (IOException ex) {
+ baseDirPath = baseDir.toString();
+ }
+ Vector includePath = new Vector();
+ Vector sysIncludePath = new Vector();
+ for (int i = defaultProviders.length - 1; i >= 0; i--) {
+ String[] incPath = defaultProviders[i].getActiveIncludePaths();
+ for (int j = 0; j < incPath.length; j++) {
+ includePath.addElement(incPath[j]);
+ }
+ incPath = defaultProviders[i].getActiveSysIncludePaths();
+ for (int j = 0; j < incPath.length; j++) {
+ sysIncludePath.addElement(incPath[j]);
+ }
+ }
+ File[] incPath = new File[includePath.size()];
+ for (int i = 0; i < includePath.size(); i++) {
+ incPath[i] = new File((String) includePath.elementAt(i));
+ }
+ File[] sysIncPath = new File[sysIncludePath.size()];
+ for (int i = 0; i < sysIncludePath.size(); i++) {
+ sysIncPath[i] = new File((String) sysIncludePath.elementAt(i));
+ }
+ addIncludes(baseDirPath, incPath, args, relativeArgs,
+ includePathIdentifier);
+ addIncludes(baseDirPath, sysIncPath, args, null, null);
+ StringBuffer buf = new StringBuffer(getIdentifier());
+ for (int i = 0; i < relativeArgs.size(); i++) {
+ buf.append(relativeArgs.elementAt(i));
+ buf.append(' ');
+ }
+ buf.setLength(buf.length() - 1);
+ String configId = buf.toString();
+ int warnings = specificDef.getWarnings(defaultProviders, 0);
+ addWarningSwitch(args, warnings);
+ Enumeration argEnum = cmdArgs.elements();
+ int endCount = 0;
+ while (argEnum.hasMoreElements()) {
+ CommandLineArgument arg = (CommandLineArgument) argEnum
+ .nextElement();
+ switch (arg.getLocation()) {
+ case 1 :
+ args.addElement(arg.getValue());
+ break;
+ case 2 :
+ endCount++;
+ break;
+ }
+ }
+ String[] endArgs = new String[endCount];
+ argEnum = cmdArgs.elements();
+ int index = 0;
+ while (argEnum.hasMoreElements()) {
+ CommandLineArgument arg = (CommandLineArgument) argEnum
+ .nextElement();
+ if (arg.getLocation() == 2) {
+ endArgs[index++] = arg.getValue();
+ }
+ }
+ String[] argArray = new String[args.size()];
+ args.copyInto(argArray);
+ boolean rebuild = specificDef.getRebuild(baseDefs, 0);
+ File[] envIncludePath = getEnvironmentIncludePath();
+ return new CommandLineCompilerConfiguration(this, configId, incPath,
+ sysIncPath, envIncludePath, includePathIdentifier.toString(),
+ argArray, paramArray, rebuild, endArgs);
+ }
+ protected int getArgumentCountPerInputFile() {
+ return 1;
+ }
+ protected final String getCommand() {
+ return command;
+ }
+ abstract protected void getDefineSwitch(StringBuffer buffer, String define,
+ String value);
+ protected abstract File[] getEnvironmentIncludePath();
+ public String getIdentifier() {
+ if (identifier == null) {
+ if (identifierArg == null) {
+ identifier = getIdentifier(new String[]{command}, command);
+ } else {
+ identifier = getIdentifier(
+ new String[]{command, identifierArg}, command);
+ }
+ }
+ return identifier;
+ }
+ abstract protected String getIncludeDirSwitch(String source);
+ protected String getInputFileArgument(File outputDir, String filename,
+ int index) {
+ //
+ // if there is an embedded space,
+ // must enclose in quotes
+ if (filename.indexOf(' ') >= 0) {
+ StringBuffer buf = new StringBuffer("\"");
+ buf.append(filename);
+ buf.append("\"");
+ return buf.toString();
+ }
+ return filename;
+ }
+ protected final boolean getLibtool() {
+ return libtool;
+ }
+ /**
+ * Obtains the same compiler, but with libtool set
+ *
+ * Default behavior is to ignore libtool
+ */
+ public final CommandLineCompiler getLibtoolCompiler() {
+ if (libtoolCompiler != null) {
+ return libtoolCompiler;
+ }
+ return this;
+ }
+ abstract public int getMaximumCommandLength();
+ protected int getMaximumInputFilesPerCommand() {
+ return Integer.MAX_VALUE;
+ }
+ protected int getTotalArgumentLengthForInputFile(File outputDir,
+ String inputFile) {
+ return inputFile.length() + 1;
+ }
+ abstract protected void getUndefineSwitch(StringBuffer buffer, String define);
+ /**
+ * This method is exposed so test classes can overload and test the
+ * arguments without actually spawning the compiler
+ */
+ protected int runCommand(CCTask task, File workingDir, String[] cmdline)
+ throws BuildException {
+ return CUtil.runCommand(task, workingDir, cmdline, newEnvironment, env);
+ }
+ protected final void setCommand(String command) {
+ this.command = command;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineCompilerConfiguration.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineCompilerConfiguration.java
new file mode 100644
index 0000000..4c53df1
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineCompilerConfiguration.java
@@ -0,0 +1,216 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compiler;
+import java.io.File;
+
+import net.sf.antcontrib.cpptasks.CCTask;
+import net.sf.antcontrib.cpptasks.CompilerParam;
+import net.sf.antcontrib.cpptasks.DependencyInfo;
+import net.sf.antcontrib.cpptasks.ProcessorParam;
+
+import org.apache.tools.ant.BuildException;
+/**
+ * A configuration for a C++ compiler
+ *
+ * @author Curt Arnold
+ */
+public final class CommandLineCompilerConfiguration
+ implements
+ CompilerConfiguration {
+ private/* final */String[] args;
+ private/* final */CommandLineCompiler compiler;
+ private String[] endArgs;
+ //
+ // include path from environment variable not
+ // explicitly stated in Ant script
+ private/* final */File[] envIncludePath;
+ private String[] exceptFiles;
+ private/* final */String identifier;
+ private/* final */File[] includePath;
+ private/* final */String includePathIdentifier;
+ private boolean isPrecompiledHeaderGeneration;
+ private/* final */ProcessorParam[] params;
+ private/* final */boolean rebuild;
+ private/* final */File[] sysIncludePath;
+ public CommandLineCompilerConfiguration(CommandLineCompiler compiler,
+ String identifier, File[] includePath, File[] sysIncludePath,
+ File[] envIncludePath, String includePathIdentifier, String[] args,
+ ProcessorParam[] params, boolean rebuild, String[] endArgs) {
+ if (compiler == null) {
+ throw new NullPointerException("compiler");
+ }
+ if (identifier == null) {
+ throw new NullPointerException("identifier");
+ }
+ if (includePathIdentifier == null) {
+ throw new NullPointerException("includePathIdentifier");
+ }
+ if (args == null) {
+ this.args = new String[0];
+ } else {
+ this.args = (String[]) args.clone();
+ }
+ if (includePath == null) {
+ this.includePath = new File[0];
+ } else {
+ this.includePath = (File[]) includePath.clone();
+ }
+ if (sysIncludePath == null) {
+ this.sysIncludePath = new File[0];
+ } else {
+ this.sysIncludePath = (File[]) sysIncludePath.clone();
+ }
+ if (envIncludePath == null) {
+ this.envIncludePath = new File[0];
+ } else {
+ this.envIncludePath = (File[]) envIncludePath.clone();
+ }
+ this.compiler = compiler;
+ this.params = (ProcessorParam[]) params.clone();
+ this.rebuild = rebuild;
+ this.identifier = identifier;
+ this.includePathIdentifier = includePathIdentifier;
+ this.endArgs = (String[]) endArgs.clone();
+ exceptFiles = null;
+ isPrecompiledHeaderGeneration = false;
+ }
+ public CommandLineCompilerConfiguration(
+ CommandLineCompilerConfiguration base, String[] additionalArgs,
+ String[] exceptFiles, boolean isPrecompileHeaderGeneration) {
+ compiler = base.compiler;
+ identifier = base.identifier;
+ rebuild = base.rebuild;
+ includePath = (File[]) base.includePath.clone();
+ sysIncludePath = (File[]) base.sysIncludePath.clone();
+ endArgs = (String[]) base.endArgs.clone();
+ envIncludePath = (File[]) base.envIncludePath.clone();
+ includePathIdentifier = base.includePathIdentifier;
+ if (exceptFiles != null) {
+ this.exceptFiles = (String[]) exceptFiles.clone();
+ }
+ this.isPrecompiledHeaderGeneration = isPrecompileHeaderGeneration;
+ args = new String[base.args.length + additionalArgs.length];
+ for (int i = 0; i < base.args.length; i++) {
+ args[i] = base.args[i];
+ }
+ int index = base.args.length;
+ for (int i = 0; i < additionalArgs.length; i++) {
+ args[index++] = additionalArgs[i];
+ }
+ }
+ public int bid(String inputFile) {
+ int compilerBid = compiler.bid(inputFile);
+ if (compilerBid > 0 && exceptFiles != null) {
+ for (int i = 0; i < exceptFiles.length; i++) {
+ if (inputFile.equals(exceptFiles[i])) {
+ return 0;
+ }
+ }
+ }
+ return compilerBid;
+ }
+ public void compile(CCTask task, File outputDir, String[] sourceFiles,
+ boolean relentless, ProgressMonitor monitor) throws BuildException {
+ if (monitor != null) {
+ monitor.start(this);
+ }
+ try {
+ compiler.compile(task, outputDir, sourceFiles, args, endArgs,
+ relentless, this, monitor);
+ if (monitor != null) {
+ monitor.finish(this, true);
+ }
+ } catch (BuildException ex) {
+ if (monitor != null) {
+ monitor.finish(this, false);
+ }
+ throw ex;
+ }
+ }
+ /**
+ *
+ * This method may be used to get two distinct compiler configurations, one
+ * for compiling the specified file and producing a precompiled header
+ * file, and a second for compiling other files using the precompiled
+ * header file.
+ *
+ * The last (preferrably only) include directive in the prototype file will
+ * be used to mark the boundary between pre-compiled and normally compiled
+ * headers.
+ *
+ * @param prototype
+ * A source file (for example, stdafx.cpp) that is used to build
+ * the precompiled header file. @returns null if precompiled
+ * headers are not supported or a two element array containing
+ * the precompiled header generation configuration and the
+ * consuming configuration
+ *
+ */
+ public CompilerConfiguration[] createPrecompileConfigurations(
+ File prototype, String[] nonPrecompiledFiles) {
+ if (compiler instanceof PrecompilingCompiler) {
+ return ((PrecompilingCompiler) compiler)
+ .createPrecompileConfigurations(this, prototype,
+ nonPrecompiledFiles);
+ }
+ return null;
+ }
+ /**
+ * Returns a string representation of this configuration. Should be
+ * canonical so that equivalent configurations will have equivalent string
+ * representations
+ */
+ public String getIdentifier() {
+ return identifier;
+ }
+ public String getIncludePathIdentifier() {
+ return includePathIdentifier;
+ }
+ public String getOutputFileName(String inputFile) {
+ return compiler.getOutputFileName(inputFile);
+ }
+ public CompilerParam getParam(String name) {
+ for (int i = 0; i < params.length; i++) {
+ if (name.equals(params[i].getName()))
+ return (CompilerParam) params[i];
+ }
+ return null;
+ }
+ public ProcessorParam[] getParams() {
+ return params;
+ }
+ public boolean getRebuild() {
+ return rebuild;
+ }
+ public boolean isPrecompileGeneration() {
+ return isPrecompiledHeaderGeneration;
+ }
+ public DependencyInfo parseIncludes(CCTask task, File baseDir, File source) {
+ return compiler.parseIncludes(task, source, includePath,
+ sysIncludePath, envIncludePath, baseDir,
+ getIncludePathIdentifier());
+ }
+ public String toString() {
+ return identifier;
+ }
+ public String[] getPreArguments() {
+ return (String[]) args.clone();
+ }
+ public String[] getEndArguments() {
+ return (String[]) endArgs.clone();
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineFortranCompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineFortranCompiler.java
new file mode 100644
index 0000000..d01cb9e
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineFortranCompiler.java
@@ -0,0 +1,42 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compiler;
+import java.io.File;
+
+import net.sf.antcontrib.cpptasks.parser.FortranParser;
+import net.sf.antcontrib.cpptasks.parser.Parser;
+
+import org.apache.tools.ant.types.Environment;
+/**
+ * An abstract Compiler implementation which uses an external program to
+ * perform the compile.
+ *
+ * @author Curt Arnold
+ */
+public abstract class CommandLineFortranCompiler extends CommandLineCompiler {
+ protected CommandLineFortranCompiler(String command, String identifierArg,
+ String[] sourceExtensions, String[] headerExtensions,
+ String outputSuffix, boolean libtool,
+ CommandLineFortranCompiler libtoolCompiler, boolean newEnvironment,
+ Environment env) {
+ super(command, identifierArg, sourceExtensions, headerExtensions,
+ outputSuffix, libtool, libtoolCompiler, newEnvironment, env);
+ }
+ protected Parser createParser(File source) {
+ return new FortranParser();
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineLinker.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineLinker.java
new file mode 100644
index 0000000..4161469
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineLinker.java
@@ -0,0 +1,404 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compiler;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CCTask;
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.LinkerDef;
+import net.sf.antcontrib.cpptasks.ProcessorDef;
+import net.sf.antcontrib.cpptasks.ProcessorParam;
+import net.sf.antcontrib.cpptasks.types.CommandLineArgument;
+import net.sf.antcontrib.cpptasks.types.LibrarySet;
+import net.sf.antcontrib.cpptasks.TargetDef;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.types.Environment;
+
+
+/**
+ * An abstract Linker implementation that performs the link via an external
+ * command.
+ *
+ * @author Adam Murdoch
+ */
+public abstract class CommandLineLinker extends AbstractLinker
+{
+ private String command;
+ private Environment env = null;
+ private String identifier;
+ private String identifierArg;
+ private boolean isLibtool;
+ private String[] librarySets;
+ private CommandLineLinker libtoolLinker;
+ private boolean newEnvironment = false;
+ private String outputSuffix;
+
+
+ /** Creates a comand line linker invocation */
+ public CommandLineLinker(String command,
+ String identifierArg,
+ String[] extensions,
+ String[] ignoredExtensions, String outputSuffix,
+ boolean isLibtool, CommandLineLinker libtoolLinker)
+ {
+ super(extensions, ignoredExtensions);
+ this.command = command;
+ this.identifierArg = identifierArg;
+ this.outputSuffix = outputSuffix;
+ this.isLibtool = isLibtool;
+ this.libtoolLinker = libtoolLinker;
+ }
+ protected abstract void addBase(long base, Vector args);
+
+ protected abstract void addFixed(Boolean fixed, Vector args);
+
+ abstract protected void addImpliedArgs(boolean debug,
+ LinkType linkType, Vector args, Boolean defaultflag);
+ protected abstract void addIncremental(boolean incremental, Vector args);
+
+ //
+ // Windows processors handle these through file list
+ //
+ protected String[] addLibrarySets(CCTask task, LibrarySet[] libsets, Vector preargs,
+ Vector midargs, Vector endargs) {
+ return null;
+ }
+ protected abstract void addMap(boolean map, Vector args);
+ protected abstract void addStack(int stack, Vector args);
+ protected abstract void addEntry(String entry, Vector args);
+
+ protected LinkerConfiguration createConfiguration(
+ CCTask task,
+ LinkType linkType,
+ ProcessorDef[] baseDefs, LinkerDef specificDef, TargetDef targetPlatform) {
+
+ Vector preargs = new Vector();
+ Vector midargs = new Vector();
+ Vector endargs = new Vector();
+ Vector[] args = new Vector[] { preargs, midargs, endargs };
+
+ LinkerDef[] defaultProviders = new LinkerDef[baseDefs.length+1];
+ defaultProviders[0] = specificDef;
+ for(int i = 0; i < baseDefs.length; i++) {
+ defaultProviders[i+1] = (LinkerDef) baseDefs[i];
+ }
+ //
+ // add command line arguments inherited from <cc> element
+ // any "extends" and finally the specific CompilerDef
+ CommandLineArgument[] commandArgs;
+ for(int i = defaultProviders.length-1; i >= 0; i--) {
+ commandArgs = defaultProviders[i].getActiveProcessorArgs();
+ for(int j = 0; j < commandArgs.length; j++) {
+ args[commandArgs[j].getLocation()].
+ addElement(commandArgs[j].getValue());
+ }
+ }
+
+ Vector params = new Vector();
+ //
+ // add command line arguments inherited from <cc> element
+ // any "extends" and finally the specific CompilerDef
+ ProcessorParam[] paramArray;
+ for (int i = defaultProviders.length - 1; i >= 0; i--) {
+ paramArray = defaultProviders[i].getActiveProcessorParams();
+ for (int j = 0; j < paramArray.length; j++) {
+ params.add(paramArray[j]);
+ }
+ }
+
+ paramArray = (ProcessorParam[])(params.toArray(new ProcessorParam[params.size()]));
+
+ boolean debug = specificDef.getDebug(baseDefs,0);
+
+
+ String startupObject = getStartupObject(linkType);
+ Boolean defaultflag = specificDef.getDefaultflag(defaultProviders, 1);
+ addImpliedArgs(debug, linkType, preargs, defaultflag);
+ addIncremental(specificDef.getIncremental(defaultProviders,1), preargs);
+ addFixed(specificDef.getFixed(defaultProviders,1), preargs);
+ addMap(specificDef.getMap(defaultProviders,1), preargs);
+ addBase(specificDef.getBase(defaultProviders,1), preargs);
+ addStack(specificDef.getStack(defaultProviders,1), preargs);
+ addEntry(specificDef.getEntry(defaultProviders, 1), preargs);
+
+ String[] libnames = null;
+ LibrarySet[] libsets = specificDef.getActiveLibrarySets(defaultProviders,1);
+ if (libsets.length > 0) {
+ libnames = addLibrarySets(task, libsets, preargs, midargs, endargs);
+ }
+
+ StringBuffer buf = new StringBuffer(getIdentifier());
+ for (int i = 0; i < 3; i++) {
+ Enumeration argenum = args[i].elements();
+ while (argenum.hasMoreElements()) {
+ buf.append(' ');
+ buf.append(argenum.nextElement().toString());
+ }
+ }
+ String configId = buf.toString();
+
+ String[][] options = new String[][] {
+ new String[args[0].size() + args[1].size()],
+ new String[args[2].size()] };
+ args[0].copyInto(options[0]);
+ int offset = args[0].size();
+ for (int i = 0; i < args[1].size(); i++) {
+ options[0][i+offset] = (String) args[1].elementAt(i);
+ }
+ args[2].copyInto(options[1]);
+
+
+ boolean rebuild = specificDef.getRebuild(baseDefs,0);
+ boolean map = specificDef.getMap(defaultProviders,1);
+
+ //task.log("libnames:"+libnames.length, Project.MSG_VERBOSE);
+ return new CommandLineLinkerConfiguration(this,configId,options,
+ paramArray,
+ rebuild,map,libnames, startupObject);
+ }
+
+ /**
+ * Allows drived linker to decorate linker option.
+ * Override by GccLinker to prepend a "-Wl," to
+ * pass option to through gcc to linker.
+ *
+ * @param buf buffer that may be used and abused in the decoration process,
+ * must not be null.
+ * @param arg linker argument
+ */
+ protected String decorateLinkerOption(StringBuffer buf, String arg) {
+ return arg;
+ }
+
+ protected final String getCommand() {
+ return command;
+ }
+ protected abstract String getCommandFileSwitch(String commandFile);
+
+
+ public String getIdentifier() {
+ if(identifier == null) {
+ if (identifierArg == null) {
+ identifier = getIdentifier(new String[] { command }, command);
+ } else {
+ identifier = getIdentifier(new String[] { command, identifierArg },
+ command);
+ }
+ }
+ return identifier;
+ }
+ public final CommandLineLinker getLibtoolLinker() {
+ if (libtoolLinker != null) {
+ return libtoolLinker;
+ }
+ return this;
+ }
+ protected abstract int getMaximumCommandLength();
+
+ public String getOutputFileName(String baseName) {
+ return baseName + outputSuffix;
+ }
+
+ protected String[] getOutputFileSwitch(CCTask task, String outputFile) {
+ return getOutputFileSwitch(outputFile);
+ }
+ protected abstract String[] getOutputFileSwitch(String outputFile);
+ protected String getStartupObject(LinkType linkType) {
+ return null;
+ }
+
+ /**
+ * Performs a link using a command line linker
+ *
+ */
+ public void link(CCTask task,
+ File outputFile,
+ String[] sourceFiles,
+ CommandLineLinkerConfiguration config)
+ throws BuildException
+ {
+ File parentDir = new File(outputFile.getParent());
+ String parentPath;
+ try {
+ parentPath = parentDir.getCanonicalPath();
+ } catch(IOException ex) {
+ parentPath = parentDir.getAbsolutePath();
+ }
+ String[] execArgs = prepareArguments(task, parentPath,outputFile.getName(),
+ sourceFiles, config);
+ int commandLength = 0;
+ for(int i = 0; i < execArgs.length; i++) {
+ commandLength += execArgs[i].length() + 1;
+ }
+
+ //
+ // if command length exceeds maximum
+ // (1024 for Windows) then create a temporary
+ // file containing everything but the command name
+ if(commandLength >= this.getMaximumCommandLength()) {
+ try {
+ execArgs = prepareResponseFile(outputFile,execArgs);
+ }
+ catch(IOException ex) {
+ throw new BuildException(ex);
+ }
+ }
+
+ int retval = runCommand(task,parentDir,execArgs);
+ //
+ // if the process returned a failure code then
+ // throw an BuildException
+ //
+ if(retval != 0) {
+ //
+ // construct the exception
+ //
+ throw new BuildException(this.getCommand() + " failed with return code " + retval, task.getLocation());
+ }
+
+ }
+
+
+ /**
+ * Prepares argument list for exec command. Will return null
+ * if command line would exceed allowable command line buffer.
+ *
+ * @param outputFile linker output file
+ * @param sourceFiles linker input files (.obj, .o, .res)
+ * @param args linker arguments
+ * @return arguments for runTask
+ */
+ protected String[] prepareArguments(
+ CCTask task,
+ String outputDir,
+ String outputFile,
+ String[] sourceFiles,
+ CommandLineLinkerConfiguration config) {
+
+ String[] preargs = config.getPreArguments();
+ String[] endargs = config.getEndArguments();
+ String outputSwitch[] = getOutputFileSwitch(task, outputFile);
+ int allArgsCount = preargs.length + 1 + outputSwitch.length +
+ sourceFiles.length + endargs.length;
+ if (isLibtool) {
+ allArgsCount++;
+ }
+ String[] allArgs = new String[allArgsCount];
+ int index = 0;
+ if (isLibtool) {
+ allArgs[index++] = "libtool";
+ }
+ allArgs[index++] = this.getCommand();
+ StringBuffer buf = new StringBuffer();
+ for (int i = 0; i < preargs.length; i++) {
+ allArgs[index++] = decorateLinkerOption(buf, preargs[i]);
+ }
+ for (int i = 0; i < outputSwitch.length; i++) {
+ allArgs[index++] = outputSwitch[i];
+ }
+ for (int i = 0; i < sourceFiles.length; i++) {
+ allArgs[index++] = prepareFilename(buf,outputDir,sourceFiles[i]);
+ }
+ for (int i = 0; i < endargs.length; i++) {
+ allArgs[index++] = decorateLinkerOption(buf, endargs[i]);
+ }
+ return allArgs;
+ }
+
+ /**
+ * Processes filename into argument form
+ *
+ */
+ protected String prepareFilename(StringBuffer buf,
+ String outputDir, String sourceFile) {
+ String relativePath = CUtil.getRelativePath(outputDir,
+ new File(sourceFile));
+ return quoteFilename(buf,relativePath);
+ }
+
+ /**
+ * Prepares argument list to execute the linker using a
+ * response file.
+ *
+ * @param outputFile linker output file
+ * @param args output of prepareArguments
+ * @return arguments for runTask
+ */
+ protected String[] prepareResponseFile(File outputFile,String[] args) throws IOException
+ {
+ String baseName = outputFile.getName();
+ File commandFile = new File(outputFile.getParent(),baseName + ".rsp");
+ FileWriter writer = new FileWriter(commandFile);
+ int execArgCount = 1;
+ if (isLibtool) {
+ execArgCount++;
+ }
+ String[] execArgs = new String[execArgCount+1];
+ for (int i = 0; i < execArgCount; i++) {
+ execArgs[i] = args[i];
+ }
+ execArgs[execArgCount] = getCommandFileSwitch(commandFile.toString());
+ for(int i = execArgCount; i < args.length; i++) {
+ //
+ // if embedded space and not quoted then
+ // quote argument
+ if (args[i].indexOf(" ") >= 0 && args[i].charAt(0) != '\"') {
+ writer.write('\"');
+ writer.write(args[i]);
+ writer.write("\"\n");
+ } else {
+ writer.write(args[i]);
+ writer.write('\n');
+ }
+ }
+ writer.close();
+ return execArgs;
+ }
+
+
+ protected String quoteFilename(StringBuffer buf,String filename) {
+ if(filename.indexOf(' ') >= 0) {
+ buf.setLength(0);
+ buf.append('\"');
+ buf.append(filename);
+ buf.append('\"');
+ return buf.toString();
+ }
+ return filename;
+ }
+
+ /**
+ * This method is exposed so test classes can overload
+ * and test the arguments without actually spawning the
+ * compiler
+ */
+ protected int runCommand(CCTask task, File workingDir,String[] cmdline)
+ throws BuildException {
+ return CUtil.runCommand(task,workingDir,cmdline, newEnvironment, env);
+ }
+
+ protected final void setCommand(String command) {
+ this.command = command;
+ }
+
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineLinkerConfiguration.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineLinkerConfiguration.java
new file mode 100644
index 0000000..b3a7290
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineLinkerConfiguration.java
@@ -0,0 +1,119 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compiler;
+import net.sf.antcontrib.cpptasks.CCTask;
+import net.sf.antcontrib.cpptasks.LinkerParam;
+import net.sf.antcontrib.cpptasks.ProcessorParam;
+import net.sf.antcontrib.cpptasks.TargetInfo;
+
+import org.apache.tools.ant.BuildException;
+/**
+ * A configuration for a command line linker
+ *
+ * @author Curt Arnold
+ */
+public final class CommandLineLinkerConfiguration
+ implements
+ LinkerConfiguration {
+ private/* final */String[][] args;
+ private/* final */String identifier;
+ private String[] libraryNames;
+ private/* final */CommandLineLinker linker;
+ private/* final */boolean map;
+ private/* final */ProcessorParam[] params;
+ private/* final */boolean rebuild;
+ private String startupObject;
+ public CommandLineLinkerConfiguration(CommandLineLinker linker,
+ String identifier, String[][] args, ProcessorParam[] params,
+ boolean rebuild, boolean map, String[] libraryNames,
+ String startupObject) {
+ if (linker == null) {
+ throw new NullPointerException("linker");
+ }
+ if (args == null) {
+ throw new NullPointerException("args");
+ } else {
+ this.args = (String[][]) args.clone();
+ }
+ this.linker = linker;
+ this.params = (ProcessorParam[]) params.clone();
+ this.rebuild = rebuild;
+ this.identifier = identifier;
+ this.map = map;
+ if (libraryNames == null) {
+ this.libraryNames = new String[0];
+ } else {
+ this.libraryNames = (String[]) libraryNames.clone();
+ }
+ this.startupObject = startupObject;
+ }
+ public int bid(String filename) {
+ return linker.bid(filename);
+ }
+ public String[] getEndArguments() {
+ String[] clone = (String[]) args[1].clone();
+ return clone;
+ }
+ /**
+ * Returns a string representation of this configuration. Should be
+ * canonical so that equivalent configurations will have equivalent string
+ * representations
+ */
+ public String getIdentifier() {
+ return identifier;
+ }
+ public String[] getLibraryNames() {
+ String[] clone = (String[]) libraryNames.clone();
+ return clone;
+ }
+ public boolean getMap() {
+ return map;
+ }
+ public String getOutputFileName(String inputFile) {
+ return linker.getOutputFileName(inputFile);
+ }
+ public LinkerParam getParam(String name) {
+ for (int i = 0; i < params.length; i++) {
+ if (name.equals(params[i].getName()))
+ return (LinkerParam) params[i];
+ }
+ return null;
+ }
+ public ProcessorParam[] getParams() {
+ return params;
+ }
+ public String[] getPreArguments() {
+ String[] clone = (String[]) args[0].clone();
+ return clone;
+ }
+ public boolean getRebuild() {
+ return rebuild;
+ }
+ public String getStartupObject() {
+ return startupObject;
+ }
+ public void link(CCTask task, TargetInfo linkTarget) throws BuildException {
+ //
+ // AllSourcePath's include any syslibsets
+ //
+ String[] sourcePaths = linkTarget.getAllSourcePaths();
+ linker.link(task, linkTarget.getOutput(), sourcePaths, this);
+ }
+ public String toString() {
+ return identifier;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/Compiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/Compiler.java
new file mode 100644
index 0000000..bbb6c99
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/Compiler.java
@@ -0,0 +1,24 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compiler;
+/**
+ * A compiler.
+ *
+ * @author Adam Murdoch
+ */
+public interface Compiler extends Processor {
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CompilerConfiguration.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CompilerConfiguration.java
new file mode 100644
index 0000000..72abb8b
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CompilerConfiguration.java
@@ -0,0 +1,64 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compiler;
+import java.io.File;
+
+import net.sf.antcontrib.cpptasks.CCTask;
+import net.sf.antcontrib.cpptasks.CompilerParam;
+import net.sf.antcontrib.cpptasks.DependencyInfo;
+
+import org.apache.tools.ant.BuildException;
+/**
+ * A configuration for a compiler
+ *
+ * @author Curt Arnold
+ */
+public interface CompilerConfiguration extends ProcessorConfiguration {
+ void compile(CCTask task, File outputDir, String[] sourceFiles,
+ boolean relentless, ProgressMonitor monitor) throws BuildException;
+ /**
+ *
+ * This method may be used to get two distinct compiler configurations, one
+ * for compiling the specified file and producing a precompiled header
+ * file, and a second for compiling other files using the precompiled
+ * header file.
+ *
+ * The last (preferrably only) include directive in the prototype file will
+ * be used to mark the boundary between pre-compiled and normally compiled
+ * headers.
+ *
+ * @param prototype
+ * A source file (for example, stdafx.cpp) that is used to build
+ * the precompiled header file. @returns null if precompiled
+ * headers are not supported or a two element array containing
+ * the precompiled header generation configuration and the
+ * consuming configuration
+ *
+ */
+ CompilerConfiguration[] createPrecompileConfigurations(File prototype,
+ String[] nonPrecompiledFiles);
+ /**
+ * Returns an digest for the include path for the configuration.
+ *
+ * This is used to determine if cached dependency information is invalid
+ * because the include paths have changed
+ */
+ String getIncludePathIdentifier();
+ public CompilerParam getParam(String name);
+ boolean isPrecompileGeneration();
+ DependencyInfo parseIncludes(CCTask task, File baseDir, File source);
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/LinkType.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/LinkType.java
new file mode 100644
index 0000000..7d6041f
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/LinkType.java
@@ -0,0 +1,134 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compiler;
+import net.sf.antcontrib.cpptasks.OutputTypeEnum;
+import net.sf.antcontrib.cpptasks.SubsystemEnum;
+/**
+ * This class represents the target platform for the compile and link step. The
+ * name is an anachronism and should be changed.
+ *
+ * @author Curt Arnold
+ */
+public class LinkType {
+ private OutputTypeEnum outputType = new OutputTypeEnum();
+ private boolean staticRuntime = false;
+ private SubsystemEnum subsystem = new SubsystemEnum();
+ /**
+ * Constructor
+ *
+ * By default, an gui executable with a dynamically linked runtime
+ *
+ */
+ public LinkType() {
+ }
+ /**
+ * Gets whether the link should produce an executable
+ *
+ * @return boolean
+ */
+ public boolean isExecutable() {
+ String value = outputType.getValue();
+ return value.equals("executable");
+ }
+ /**
+ * Gets whether the link should produce a plugin module.
+ *
+ * @return boolean
+ */
+ public boolean isPluginModule() {
+ String value = outputType.getValue();
+ return value.equals("plugin");
+ }
+ /**
+ * Gets whether the link should produce a shared library.
+ *
+ * @return boolean
+ */
+ public boolean isSharedLibrary() {
+ String value = outputType.getValue();
+ return value.equals("shared") || value.equals("plugin");
+ }
+ /**
+ * Gets whether the link should produce a static library.
+ *
+ * @return boolean
+ */
+ public boolean isStaticLibrary() {
+ String value = outputType.getValue();
+ return value.equals("static");
+ }
+ /**
+ * Gets whether the module should use a statically linked runtime library.
+ *
+ * @return boolean
+ */
+ public boolean isStaticRuntime() {
+ return staticRuntime;
+ }
+ /**
+ * Gets whether the link should produce a module for a console subsystem.
+ *
+ * @return boolean
+ */
+ public boolean isSubsystemConsole() {
+ String value = subsystem.getValue();
+ return value.equals("console");
+ }
+ /**
+ * Gets whether the link should produce a module for a graphical user
+ * interface subsystem.
+ *
+ * @return boolean
+ */
+ public boolean isSubsystemGUI() {
+ String value = subsystem.getValue();
+ return value.equals("gui");
+ }
+ /**
+ * Sets the output type (execuable, shared, etc).
+ *
+ * @param outputType,
+ * may not be null
+ */
+ public void setOutputType(OutputTypeEnum outputType) {
+ if (outputType == null) {
+ throw new IllegalArgumentException("outputType");
+ }
+ this.outputType = outputType;
+ }
+ /**
+ * Requests use of a static runtime library.
+ *
+ * @param staticRuntime
+ * if true, use static runtime library if possible.
+ */
+ public void setStaticRuntime(boolean staticRuntime) {
+ this.staticRuntime = staticRuntime;
+ }
+ /**
+ * Sets the subsystem (gui, console, etc).
+ *
+ * @param subsystem
+ * subsystem, may not be null
+ */
+ public void setSubsystem(SubsystemEnum subsystem) {
+ if (subsystem == null) {
+ throw new IllegalArgumentException("subsystem");
+ }
+ this.subsystem = subsystem;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/Linker.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/Linker.java
new file mode 100644
index 0000000..776a808
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/Linker.java
@@ -0,0 +1,57 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compiler;
+import java.io.File;
+import net.sf.antcontrib.cpptasks.types.LibraryTypeEnum;
+/**
+ * A linker for executables, and static and dynamic libraries.
+ *
+ * @author Adam Murdoch
+ */
+public interface Linker extends Processor {
+ /**
+ * Extracts the significant part of a library name to ensure there aren't
+ * collisions
+ */
+ String getLibraryKey(File libname);
+ /**
+ * returns the library path for the linker
+ */
+ File[] getLibraryPath();
+ /**
+ * Returns a set of filename patterns corresponding to library names.
+ *
+ * For example, "advapi32" would be expanded to "advapi32.dll" by
+ * DevStudioLinker and to "libadvapi32.a" and "libadvapi32.so" by
+ * GccLinker.
+ *
+ * @param libnames
+ * array of library names
+ */
+ String[] getLibraryPatterns(String[] libnames, LibraryTypeEnum libraryType);
+ /**
+ * Gets the linker for the specified link type.
+ *
+ * @return appropriate linker or null, will return this if this linker can
+ * handle the specified link type
+ */
+ Linker getLinker(LinkType linkType);
+ /**
+ * Returns true if the linker is case-sensitive
+ */
+ boolean isCaseSensitive();
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/LinkerConfiguration.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/LinkerConfiguration.java
new file mode 100644
index 0000000..c2d62c4
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/LinkerConfiguration.java
@@ -0,0 +1,31 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compiler;
+import net.sf.antcontrib.cpptasks.CCTask;
+import net.sf.antcontrib.cpptasks.LinkerParam;
+import net.sf.antcontrib.cpptasks.TargetInfo;
+
+import org.apache.tools.ant.BuildException;
+/**
+ * A configuration for a linker
+ *
+ * @author Curt Arnold
+ */
+public interface LinkerConfiguration extends ProcessorConfiguration {
+ public LinkerParam getParam(String name);
+ void link(CCTask task, TargetInfo linkTarget) throws BuildException;
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/PrecompilingCommandLineCCompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/PrecompilingCommandLineCCompiler.java
new file mode 100644
index 0000000..eb64119
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/PrecompilingCommandLineCCompiler.java
@@ -0,0 +1,43 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compiler;
+import java.io.File;
+
+import net.sf.antcontrib.cpptasks.parser.CParser;
+import net.sf.antcontrib.cpptasks.parser.Parser;
+
+import org.apache.tools.ant.types.Environment;
+/**
+ * A command line C compiler that can utilize precompilation of header files
+ *
+ * @author Curt Arnold
+ */
+public abstract class PrecompilingCommandLineCCompiler
+ extends
+ PrecompilingCommandLineCompiler {
+ protected PrecompilingCommandLineCCompiler(String command,
+ String identifierArg, String[] sourceExtensions,
+ String[] headerExtensions, String outputSuffix, boolean libtool,
+ PrecompilingCommandLineCCompiler libtoolCompiler,
+ boolean newEnvironment, Environment env) {
+ super(command, identifierArg, sourceExtensions, headerExtensions,
+ outputSuffix, libtool, libtoolCompiler, newEnvironment, env);
+ }
+ protected Parser createParser(File source) {
+ return new CParser();
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/PrecompilingCommandLineCompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/PrecompilingCommandLineCompiler.java
new file mode 100644
index 0000000..6e3c145
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/PrecompilingCommandLineCompiler.java
@@ -0,0 +1,104 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compiler;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.Reader;
+
+import net.sf.antcontrib.cpptasks.parser.Parser;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.types.Environment;
+/**
+ * A command line C compiler that can utilize precompilation of header files
+ *
+ * @author Curt Arnold
+ */
+public abstract class PrecompilingCommandLineCompiler
+ extends
+ CommandLineCompiler implements PrecompilingCompiler {
+ protected PrecompilingCommandLineCompiler(String command,
+ String identifierArg, String[] sourceExtensions,
+ String[] headerExtensions, String outputSuffix, boolean libtool,
+ PrecompilingCommandLineCompiler libtoolCompiler,
+ boolean newEnvironment, Environment env) {
+ super(command, identifierArg, sourceExtensions, headerExtensions,
+ outputSuffix, libtool, libtoolCompiler, newEnvironment, env);
+ }
+ /**
+ *
+ * This method may be used to get two distinct compiler configurations, one
+ * for compiling the specified file and producing a precompiled header
+ * file, and a second for compiling other files using the precompiled
+ * header file.
+ *
+ * The last (preferrably only) include directive in the prototype file will
+ * be used to mark the boundary between pre-compiled and normally compiled
+ * headers.
+ *
+ * @param config
+ * base configuration
+ * @param prototype
+ * A source file (for example, stdafx.cpp) that is used to build
+ * the precompiled header file. @returns null if precompiled
+ * headers are not supported or a two element array containing
+ * the precompiled header generation configuration and the
+ * consuming configuration
+ *
+ */
+ public CompilerConfiguration[] createPrecompileConfigurations(
+ CompilerConfiguration config, File prototype, String[] exceptFiles) {
+ //
+ // cast should success or someone is passing us a configuration
+ // that was prepared by another processor
+ //
+ CommandLineCompilerConfiguration cmdLineConfig = (CommandLineCompilerConfiguration) config;
+ //
+ // parse prototype file to determine last header
+ //
+ Parser parser = createParser(prototype);
+ String[] includes;
+ try {
+ Reader reader = new BufferedReader(new FileReader(prototype));
+ parser.parse(reader);
+ includes = parser.getIncludes();
+ } catch (IOException ex) {
+ throw new BuildException(
+ "Error parsing precompiled header protoype: "
+ + prototype.toString() + ":" + ex.toString());
+ }
+ if (includes.length == 0) {
+ throw new BuildException("Precompiled header prototype: "
+ + prototype.toString()
+ + " does not contain any include directives.");
+ }
+ CompilerConfiguration[] configs = new CompilerConfiguration[2];
+ configs[0] = createPrecompileGeneratingConfig(cmdLineConfig, prototype,
+ includes[0]);
+ configs[1] = createPrecompileUsingConfig(cmdLineConfig, prototype,
+ includes[0], exceptFiles);
+ return configs;
+ }
+ abstract protected CompilerConfiguration createPrecompileGeneratingConfig(
+ CommandLineCompilerConfiguration baseConfig, File prototype,
+ String lastInclude);
+ abstract protected CompilerConfiguration createPrecompileUsingConfig(
+ CommandLineCompilerConfiguration baseConfig, File prototype,
+ String lastInclude, String[] exceptFiles);
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/PrecompilingCompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/PrecompilingCompiler.java
new file mode 100644
index 0000000..e60b1da
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/PrecompilingCompiler.java
@@ -0,0 +1,49 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compiler;
+import java.io.File;
+/**
+ * A compiler that can utilize precompilation of header files
+ *
+ * @author Curt Arnold
+ */
+public interface PrecompilingCompiler {
+ /**
+ *
+ * This method may be used to get two distinct compiler configurations, one
+ * for compiling the specified file and producing a precompiled header
+ * file, and a second for compiling other files using the precompiled
+ * header file.
+ *
+ * The last (preferrably only) include directive in the prototype file will
+ * be used to mark the boundary between pre-compiled and normally compiled
+ * headers.
+ *
+ * @param config
+ * base configuration
+ * @param prototype
+ * A source file (for example, stdafx.cpp) that is used to build
+ * the precompiled header file. @returns null if precompiled
+ * headers are not supported or a two element array containing
+ * the precompiled header generation configuration and the
+ * consuming configuration
+ *
+ */
+ CompilerConfiguration[] createPrecompileConfigurations(
+ CompilerConfiguration config, File prototype,
+ String[] nonPrecompiledFiles);
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/Processor.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/Processor.java
new file mode 100644
index 0000000..6fb74e9
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/Processor.java
@@ -0,0 +1,73 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compiler;
+import net.sf.antcontrib.cpptasks.CCTask;
+import net.sf.antcontrib.cpptasks.ProcessorDef;
+import net.sf.antcontrib.cpptasks.TargetDef;
+import org.apache.tools.ant.types.Environment;
+/**
+ * A processor. Base interface for Compiler and Linker
+ *
+ * @author Curt Arnold
+ */
+public interface Processor {
+ /**
+ * Returns a bid indicating the desire of this compiler to process the
+ * file.
+ *
+ * @param inputFile
+ * input file
+ * @return 0 = no interest, 100 = high interest
+ */
+ int bid(String inputFile);
+ Processor changeEnvironment(boolean newEnvironment, Environment env);
+ /**
+ * Returns the compiler configuration for <cc>or <compiler>element.
+ *
+ * @param defaultProviders
+ * When specificConfig corresponds to a <compiler>or linker
+ * element, defaultProvider will be a zero to two element array.
+ * If there is an extends attribute, the first element will be
+ * the referenced ProcessorDef, unless inherit = false, the last
+ * element will be the containing <cc>element
+ * @param specificConfig
+ * A <cc>or <compiler>element.
+ * @return resulting configuration
+ */
+ ProcessorConfiguration createConfiguration(CCTask task, LinkType linkType,
+ ProcessorDef[] defaultProviders, ProcessorDef specificConfig,
+ TargetDef targetPlatform);
+ /**
+ * Retrieve an identifier that identifies the specific version of the
+ * compiler. Compilers with the same identifier should produce the same
+ * output files for the same input files and command line switches.
+ */
+ String getIdentifier();
+ /**
+ * Gets the linker that is associated with this processors
+ */
+ Linker getLinker(LinkType type);
+ /**
+ * Output file name (no path components) corresponding to source file
+ *
+ * @param inputFile
+ * input file
+ * @return output file name or null if no output file or name not
+ * determined by input file
+ */
+ String getOutputFileName(String inputFile);
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/ProcessorConfiguration.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/ProcessorConfiguration.java
new file mode 100644
index 0000000..dd75483
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/ProcessorConfiguration.java
@@ -0,0 +1,52 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compiler;
+import net.sf.antcontrib.cpptasks.ProcessorParam;
+/**
+ * A configuration for a C++ compiler, linker or other processor
+ *
+ * @author Curt Arnold
+ */
+public interface ProcessorConfiguration {
+ /**
+ * An indication of how much this compiler would like to process this file
+ *
+ * @return 0 is no interest to process, 100 is strong interest to process
+ */
+ int bid(String filename);
+ /**
+ * Returns a string representation of this configuration. Should be
+ * canonical so that equivalent configurations will have equivalent string
+ * representations
+ */
+ String getIdentifier();
+ /**
+ * Output file name (no path components) corresponding to source file
+ *
+ * @param inputFile
+ * input file
+ * @return output file name or null if no output file or name not
+ * determined by input file
+ */
+ String getOutputFileName(String inputFile);
+ ProcessorParam[] getParams();
+ /**
+ * If true, all files using this configuration should be rebuilt and any
+ * existing output files should be ignored
+ */
+ boolean getRebuild();
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/ProgressMonitor.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/ProgressMonitor.java
new file mode 100644
index 0000000..2206ed8
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/ProgressMonitor.java
@@ -0,0 +1,31 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.compiler;
+/**
+ * Interface to receive notification of compile progress
+ *
+ * @author Curt Arnold
+ */
+public interface ProgressMonitor {
+ public void finish(ProcessorConfiguration config, boolean normal);
+ /**
+ * Called to notify monitor of progress
+ *
+ */
+ void progress(String[] sources);
+ public void start(ProcessorConfiguration config);
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioAslcompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioAslcompiler.java
new file mode 100644
index 0000000..f0be594
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioAslcompiler.java
@@ -0,0 +1,70 @@
+/*
+ *
+ * Copyright 2001-2005 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.devstudio;
+
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.compiler.CommandLineAslcompiler;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+
+/**
+ * Adaptor for Microsoft ASL compiler.
+ *
+ */
+public final class DevStudioAslcompiler extends CommandLineAslcompiler {
+ private final static String[] sourceExtensions = new String[] { ".asl" };
+
+ private final static String[] headerExtensions = new String[] {};
+
+ private final static String[] defaultflags = new String[] {};
+
+ private static final DevStudioAslcompiler instance = new DevStudioAslcompiler(
+ "asl", sourceExtensions, headerExtensions, false);
+
+ /**
+ * Gets asl adapter
+ */
+ public static DevStudioAslcompiler getInstance() {
+ return instance;
+ }
+
+ /**
+ * Private constructor. Use DevStudioAslcompiler.getInstance() to get
+ * singleton instance of this class.
+ */
+ private DevStudioAslcompiler (String command, String[] sourceExtensions,
+ String[] headerExtensions, boolean isLibtool) {
+ super(command, null, sourceExtensions, headerExtensions, ".aml");
+ }
+
+ public void addImpliedArgs(Vector args, boolean debug, Boolean defaultflag) {
+ if (defaultflag != null && defaultflag.booleanValue()) {
+ for (int i = 0; i < defaultflags.length; i++) {
+ args.addElement(defaultflags[i]);
+ }
+ }
+ }
+
+ public int getMaximumCommandLength() {
+ return Integer.MAX_VALUE;
+ }
+
+ public Linker getLinker(LinkType linkType) {
+ return DevStudioLinker.getInstance().getLinker(linkType);
+ }
+} \ No newline at end of file
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioAssembler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioAssembler.java
new file mode 100644
index 0000000..23d319e
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioAssembler.java
@@ -0,0 +1,84 @@
+/*
+ *
+ * Copyright 2001-2005 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.devstudio;
+
+import java.io.File;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineAssembler;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+
+/**
+ * Adaptor for Microsoft MASM
+ *
+ */
+public final class DevStudioAssembler extends CommandLineAssembler {
+ private final static String[] sourceExtensions = new String[] { ".asm" };
+
+ private final static String[] headerExtensions = new String[] { ".h",
+ ".inc" };
+
+ private final static String[] defaultflags = new String[] { "/nologo", "/c" };
+
+ private static final DevStudioAssembler instance = new DevStudioAssembler(
+ "ml", sourceExtensions, headerExtensions, false);
+
+ /**
+ * Gets masm adapter
+ */
+ public static DevStudioAssembler getInstance() {
+ return instance;
+ }
+
+ /**
+ * Private constructor. Use DevStudioAssembler.getInstance() to get
+ * singleton instance of this class.
+ */
+ private DevStudioAssembler (String command, String[] sourceExtensions,
+ String[] headerExtensions, boolean isLibtool) {
+ super(command, null, sourceExtensions, headerExtensions, ".obj");
+ }
+
+ public void addImpliedArgs(Vector args, boolean debug, Boolean defaultflag) {
+ if (defaultflag != null && defaultflag.booleanValue()) {
+ for (int i = 0; i < defaultflags.length; i++) {
+ args.addElement(defaultflags[i]);
+ }
+ }
+ if (debug) {
+ args.addElement("Zi");
+ }
+ }
+
+ public int getMaximumCommandLength() {
+ return Integer.MAX_VALUE;
+ }
+
+ public Linker getLinker(LinkType linkType) {
+ return DevStudioLinker.getInstance().getLinker(linkType);
+ }
+
+ protected File[] getEnvironmentIncludePath() {
+ return CUtil.getPathFromEnvironment("INCLUDE", ";");
+ }
+
+ protected String getIncludeDirSwitch(String includeDir) {
+ return "/I" + includeDir.replace('/', '\\');
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioCCompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioCCompiler.java
new file mode 100644
index 0000000..3bb5181
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioCCompiler.java
@@ -0,0 +1,50 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.devstudio;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.compiler.Processor;
+
+import org.apache.tools.ant.types.Environment;
+/**
+ * Adapter for the Microsoft(r) C/C++ Optimizing Compiler
+ *
+ * @author Adam Murdoch
+ */
+public final class DevStudioCCompiler extends DevStudioCompatibleCCompiler {
+ private static final DevStudioCCompiler instance = new DevStudioCCompiler(
+ "cl", false, null);
+ public static DevStudioCCompiler getInstance() {
+ return instance;
+ }
+ private DevStudioCCompiler(String command, boolean newEnvironment,
+ Environment env) {
+ super(command, "/bogus", newEnvironment, env);
+ }
+ public Processor changeEnvironment(boolean newEnvironment, Environment env) {
+ if (newEnvironment || env != null) {
+ return new DevStudioCCompiler(getCommand(), newEnvironment, env);
+ }
+ return this;
+ }
+ public Linker getLinker(LinkType type) {
+ return DevStudioLinker.getInstance().getLinker(type);
+ }
+ public int getMaximumCommandLength() {
+ return 4096;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioCompatibleCCompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioCompatibleCCompiler.java
new file mode 100644
index 0000000..5e29a32
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioCompatibleCCompiler.java
@@ -0,0 +1,136 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.devstudio;
+import java.io.File;
+import java.util.Vector;
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineCompilerConfiguration;
+import net.sf.antcontrib.cpptasks.compiler.CompilerConfiguration;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.PrecompilingCommandLineCCompiler;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.types.Environment;
+import net.sf.antcontrib.cpptasks.OptimizationEnum;
+
+/**
+ * An abstract base class for compilers that are basically command line
+ * compatible with Microsoft(r) C/C++ Optimizing Compiler
+ *
+ * @author Curt Arnold
+ */
+public abstract class DevStudioCompatibleCCompiler
+ extends
+ PrecompilingCommandLineCCompiler {
+ private static String[] mflags = new String[]{
+ //
+ // first four are single-threaded
+ // (runtime=static,debug=false), (..,debug=true),
+ // (runtime=dynamic,debug=true), (..,debug=false), (not supported)
+ // next four are multi-threaded, same sequence
+ "/ML", "/MLd", null, null, "/MT", "/MTd", "/MD", "/MDd"};
+ private static String[] defaultflags = new String[]{"/nologo", "/c"};
+ protected DevStudioCompatibleCCompiler(String command,
+ String identifierArg, boolean newEnvironment, Environment env) {
+ super(command, identifierArg, new String[]{".c", ".cc", ".cpp", ".cxx",
+ ".c++"}, new String[]{".h", ".hpp", ".inl"}, ".obj", false,
+ null, newEnvironment, env);
+ }
+ protected void addImpliedArgs(final Vector args,
+ final boolean debug,
+ final boolean multithreaded,
+ final boolean exceptions,
+ final LinkType linkType,
+ final Boolean rtti,
+ final OptimizationEnum optimization,
+ final Boolean defaultflag) {
+ if (defaultflag != null && defaultflag.booleanValue()) {
+ for (int i = 0; i < defaultflags.length; i++) {
+ args.addElement(defaultflags[i]);
+ }
+ }
+ if (exceptions) {
+ args.addElement("/GX");
+ }
+ int mindex = 0;
+ if (multithreaded) {
+ mindex += 4;
+ }
+ boolean staticRuntime = linkType.isStaticRuntime();
+ if (!staticRuntime) {
+ mindex += 2;
+ }
+ if (debug) {
+ mindex += 1;
+ args.addElement("/Zi");
+ args.addElement("/Od");
+ args.addElement("/GZ");
+ args.addElement("/D_DEBUG");
+ } else {
+ if (optimization != null) {
+ if (optimization.isSize()) {
+ args.addElement("/O1");
+ }
+ if (optimization.isSpeed()) {
+ args.addElement("/O2");
+ }
+ }
+ args.addElement("/DNDEBUG");
+ }
+ String mflag = mflags[mindex];
+ if (mflag == null) {
+ throw new BuildException(
+ "multithread='false' and runtime='dynamic' not supported");
+ }
+ args.addElement(mflag);
+ if (rtti != null && rtti.booleanValue()) {
+ args.addElement("/GR");
+ }
+ }
+ protected void addWarningSwitch(Vector args, int level) {
+ DevStudioProcessor.addWarningSwitch(args, level);
+ }
+ protected CompilerConfiguration createPrecompileGeneratingConfig(
+ CommandLineCompilerConfiguration baseConfig, File prototype,
+ String lastInclude) {
+ String[] additionalArgs = new String[]{
+ "/Fp" + CUtil.getBasename(prototype) + ".pch", "/Yc"};
+ return new CommandLineCompilerConfiguration(baseConfig, additionalArgs,
+ null, true);
+ }
+ protected CompilerConfiguration createPrecompileUsingConfig(
+ CommandLineCompilerConfiguration baseConfig, File prototype,
+ String lastInclude, String[] exceptFiles) {
+ String[] additionalArgs = new String[]{
+ "/Fp" + CUtil.getBasename(prototype) + ".pch",
+ "/Yu" + lastInclude};
+ return new CommandLineCompilerConfiguration(baseConfig, additionalArgs,
+ exceptFiles, false);
+ }
+ protected void getDefineSwitch(StringBuffer buffer, String define,
+ String value) {
+ DevStudioProcessor.getDefineSwitch(buffer, define, value);
+ }
+ protected File[] getEnvironmentIncludePath() {
+ return CUtil.getPathFromEnvironment("INCLUDE", ";");
+ }
+ protected String getIncludeDirSwitch(String includeDir) {
+ return DevStudioProcessor.getIncludeDirSwitch(includeDir);
+ }
+ protected void getUndefineSwitch(StringBuffer buffer, String define) {
+ DevStudioProcessor.getUndefineSwitch(buffer, define);
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioCompatibleLibrarian.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioCompatibleLibrarian.java
new file mode 100644
index 0000000..40bef6e
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioCompatibleLibrarian.java
@@ -0,0 +1,86 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.devstudio;
+import java.io.File;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.compiler.CommandLineLinker;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.types.LibraryTypeEnum;
+/**
+ * Abstract base adapter for librarians with command line options compatible
+ * with the Microsoft(r) Library Manager
+ *
+ * @author Curt Arnold
+ */
+public abstract class DevStudioCompatibleLibrarian extends CommandLineLinker {
+ private static String[] defaultflags = new String[]{"/nologo"};
+ public DevStudioCompatibleLibrarian(String command, String identifierArg) {
+ super(command, identifierArg, new String[]{".obj"}, new String[0],
+ ".lib", false, null);
+ }
+ protected void addBase(long base, Vector args) {
+ }
+ protected void addFixed(Boolean fixed, Vector args) {
+ }
+ protected void addImpliedArgs(boolean debug, LinkType linkType,
+ Vector args, Boolean defaultflag) {
+ if(defaultflag != null && defaultflag.booleanValue()){
+ for (int i = 0; i < defaultflags.length; i++) {
+ args.addElement(defaultflags[i]);
+ }
+ }
+ }
+ protected void addIncremental(boolean incremental, Vector args) {
+ }
+ protected void addMap(boolean map, Vector args) {
+ }
+ protected void addStack(int stack, Vector args) {
+ }
+ /* (non-Javadoc)
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addEntry(int, java.util.Vector)
+ */
+ protected void addEntry(String entry, Vector args) {
+ }
+
+ protected String getCommandFileSwitch(String cmdFile) {
+ return "@" + cmdFile;
+ }
+ public File[] getLibraryPath() {
+ return new File[0];
+ }
+ public String[] getLibraryPatterns(String[] libnames, LibraryTypeEnum libType) {
+ return new String[0];
+ }
+ public int getMaximumCommandLength() {
+ return 4096;
+ }
+ public String[] getOutputFileSwitch(String outFile) {
+ StringBuffer buf = new StringBuffer("/OUT:");
+ if (outFile.indexOf(' ') >= 0) {
+ buf.append('"');
+ buf.append(outFile);
+ buf.append('"');
+ } else {
+ buf.append(outFile);
+ }
+ return new String[]{buf.toString()};
+ }
+ public boolean isCaseSensitive() {
+ return false;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioCompatibleLinker.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioCompatibleLinker.java
new file mode 100644
index 0000000..9e156b0
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioCompatibleLinker.java
@@ -0,0 +1,127 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.devstudio;
+import java.io.File;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineLinker;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.types.LibraryTypeEnum;
+/**
+ * Abstract base class for linkers that try to mimic the command line arguments
+ * for the Microsoft (r) Incremental Linker
+ *
+ * @author Curt Arnold
+ */
+public abstract class DevStudioCompatibleLinker extends CommandLineLinker {
+ private static String[] defaultflags = new String[]{"/NOLOGO"};
+ public DevStudioCompatibleLinker(String command, String identifierArg,
+ String outputSuffix) {
+ super(command, identifierArg, new String[]{".obj", ".lib", ".res"},
+ new String[]{".map", ".pdb", ".lnk", ".dll"}, outputSuffix,
+ false, null);
+ }
+ protected void addBase(long base, Vector args) {
+ if (base >= 0) {
+ String baseAddr = Long.toHexString(base);
+ args.addElement("/BASE:0x" + baseAddr);
+ }
+ }
+ protected void addFixed(Boolean fixed, Vector args) {
+ if (fixed != null) {
+ if (fixed.booleanValue()) {
+ args.addElement("/FIXED");
+ } else {
+ args.addElement("/FIXED:NO");
+ }
+ }
+ }
+ protected void addImpliedArgs(boolean debug, LinkType linkType,
+ Vector args, Boolean defaultflag) {
+ if(defaultflag != null && defaultflag.booleanValue()){
+ for (int i = 0; i < defaultflags.length; i++) {
+ args.addElement(defaultflags[i]);
+ }
+ }
+ if (debug) {
+ args.addElement("/DEBUG");
+ }
+ if (linkType.isSharedLibrary()) {
+ args.addElement("/DLL");
+ }
+ /*
+ * if(linkType.isSubsystemGUI()) {
+ * args.addElement("/SUBSYSTEM:WINDOWS"); } else {
+ * if(linkType.isSubsystemConsole()) {
+ * args.addElement("/SUBSYSTEM:CONSOLE"); } }
+ */
+ }
+ protected void addIncremental(boolean incremental, Vector args) {
+ if (incremental) {
+ args.addElement("/INCREMENTAL:YES");
+ } else {
+ args.addElement("/INCREMENTAL:NO");
+ }
+ }
+ protected void addMap(boolean map, Vector args) {
+ if (map) {
+ args.addElement("/MAP");
+ }
+ }
+ protected void addStack(int stack, Vector args) {
+ if (stack >= 0) {
+ String stackStr = Integer.toHexString(stack);
+ args.addElement("/STACK:0x" + stackStr);
+ }
+ }
+ /* (non-Javadoc)
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addEntry(int, java.util.Vector)
+ */
+ protected void addEntry(String entry, Vector args) {
+ if (entry != null) {
+ args.addElement("/ENTRY:" + entry);
+ }
+ }
+
+ public String getCommandFileSwitch(String commandFile) {
+ return "@" + commandFile;
+ }
+ public File[] getLibraryPath() {
+ return CUtil.getPathFromEnvironment("LIB", ";");
+ }
+ public String[] getLibraryPatterns(String[] libnames, LibraryTypeEnum libType) {
+ StringBuffer buf = new StringBuffer();
+ String[] patterns = new String[libnames.length];
+ for (int i = 0; i < libnames.length; i++) {
+ buf.setLength(0);
+ buf.append(libnames[i]);
+ buf.append(".lib");
+ patterns[i] = buf.toString();
+ }
+ return patterns;
+ }
+ public int getMaximumCommandLength() {
+ return 4096;
+ }
+ public String[] getOutputFileSwitch(String outputFile) {
+ return new String[]{"/OUT:" + outputFile};
+ }
+ public boolean isCaseSensitive() {
+ return false;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioLibrarian.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioLibrarian.java
new file mode 100644
index 0000000..06eac71
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioLibrarian.java
@@ -0,0 +1,36 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.devstudio;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+/**
+ * Adapter for the Microsoft (r) Library Manager
+ *
+ * @author Curt Arnold
+ */
+public final class DevStudioLibrarian extends DevStudioCompatibleLibrarian {
+ private static final DevStudioLibrarian instance = new DevStudioLibrarian();
+ public static DevStudioLibrarian getInstance() {
+ return instance;
+ }
+ private DevStudioLibrarian() {
+ super("lib", "/bogus");
+ }
+ public Linker getLinker(LinkType type) {
+ return DevStudioLinker.getInstance().getLinker(type);
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioLinker.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioLinker.java
new file mode 100644
index 0000000..7ae0178
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioLinker.java
@@ -0,0 +1,44 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.devstudio;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+/**
+ * Adapter for the Microsoft (r) Incremental Linker
+ *
+ * @author Adam Murdoch
+ * @author Curt Arnold
+ */
+public final class DevStudioLinker extends DevStudioCompatibleLinker {
+ private static final DevStudioLinker dllLinker = new DevStudioLinker(".dll");
+ private static final DevStudioLinker instance = new DevStudioLinker(".exe");
+ public static DevStudioLinker getInstance() {
+ return instance;
+ }
+ private DevStudioLinker(String outputSuffix) {
+ super("link", "/DLL", outputSuffix);
+ }
+ public Linker getLinker(LinkType type) {
+ if (type.isSharedLibrary()) {
+ return dllLinker;
+ }
+ if (type.isStaticLibrary()) {
+ return DevStudioLibrarian.getInstance();
+ }
+ return instance;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioMIDLCompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioMIDLCompiler.java
new file mode 100644
index 0000000..7df898b
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioMIDLCompiler.java
@@ -0,0 +1,113 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.devstudio;
+import java.io.File;
+import java.util.Vector;
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineCompiler;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.compiler.Processor;
+import net.sf.antcontrib.cpptasks.parser.CParser;
+import net.sf.antcontrib.cpptasks.parser.Parser;
+import org.apache.tools.ant.types.Environment;
+import net.sf.antcontrib.cpptasks.OptimizationEnum;
+
+/**
+ * Adapter for the Microsoft (r) MIDL Compiler
+ *
+ * @author Curt Arnold
+ */
+public final class DevStudioMIDLCompiler extends CommandLineCompiler {
+ private static final DevStudioMIDLCompiler instance = new DevStudioMIDLCompiler(
+ false, null);
+ public static DevStudioMIDLCompiler getInstance() {
+ return instance;
+ }
+ private DevStudioMIDLCompiler(boolean newEnvironment, Environment env) {
+ super("midl", null, new String[]{".idl", ".odl"}, new String[]{},
+ ".tlb", false, null, newEnvironment, env);
+ }
+ protected void addImpliedArgs(final Vector args,
+ final boolean debug,
+ final boolean multithreaded,
+ final boolean exceptions,
+ final LinkType linkType,
+ final Boolean rtti,
+ final OptimizationEnum optimization,
+ final Boolean defaultflag) {
+ }
+ protected void addWarningSwitch(Vector args, int level) {
+ DevStudioProcessor.addWarningSwitch(args, level);
+ }
+ public Processor changeEnvironment(boolean newEnvironment, Environment env) {
+ if (newEnvironment || env != null) {
+ return new DevStudioMIDLCompiler(newEnvironment, env);
+ }
+ return this;
+ }
+ /**
+ * The include parser for C will work just fine, but we didn't want to
+ * inherit from CommandLineCCompiler
+ */
+ protected Parser createParser(File source) {
+ return new CParser();
+ }
+ protected int getArgumentCountPerInputFile() {
+ return 3;
+ }
+ protected void getDefineSwitch(StringBuffer buffer, String define,
+ String value) {
+ DevStudioProcessor.getDefineSwitch(buffer, define, value);
+ }
+ protected File[] getEnvironmentIncludePath() {
+ return CUtil.getPathFromEnvironment("INCLUDE", ";");
+ }
+ protected String getIncludeDirSwitch(String includeDir) {
+ return DevStudioProcessor.getIncludeDirSwitch(includeDir);
+ }
+ protected String getInputFileArgument(File outputDir, String filename,
+ int index) {
+ switch (index) {
+ case 0 :
+ return "/tlb";
+ case 1 :
+ return new File(outputDir, getOutputFileName(filename))
+ .getAbsolutePath();
+ }
+ return filename;
+ }
+ public Linker getLinker(LinkType type) {
+ return DevStudioLinker.getInstance().getLinker(type);
+ }
+ public int getMaximumCommandLength() {
+ return 1024;
+ }
+ protected int getMaximumInputFilesPerCommand() {
+ return 1;
+ }
+ protected int getTotalArgumentLengthForInputFile(File outputDir,
+ String inputFile) {
+ String arg1 = getInputFileArgument(outputDir, inputFile, 0);
+ String arg2 = getInputFileArgument(outputDir, inputFile, 1);
+ String arg3 = getInputFileArgument(outputDir, inputFile, 2);
+ return arg1.length() + arg2.length() + arg3.length() + 3;
+ }
+ protected void getUndefineSwitch(StringBuffer buffer, String define) {
+ DevStudioProcessor.getUndefineSwitch(buffer, define);
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioProcessor.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioProcessor.java
new file mode 100644
index 0000000..6b2af7e
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioProcessor.java
@@ -0,0 +1,90 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.devstudio;
+import java.util.Vector;
+/**
+ * A add-in class for Microsoft Developer Studio processors
+ *
+ *
+ */
+public class DevStudioProcessor {
+ public static void addWarningSwitch(Vector args, int level) {
+ switch (level) {
+ case 0 :
+ args.addElement("/W0");
+ break;
+ case 1 :
+ args.addElement("/W1");
+ break;
+ case 2 :
+ break;
+ case 3 :
+ args.addElement("/W3");
+ break;
+ case 4 :
+ args.addElement("/W4");
+ break;
+ case 5 :
+ args.addElement("/WX");
+ break;
+ }
+ }
+ public static String getCommandFileSwitch(String cmdFile) {
+ StringBuffer buf = new StringBuffer("@");
+ if (cmdFile.indexOf(' ') >= 0) {
+ buf.append('\"');
+ buf.append(cmdFile.replace('/', '\\'));
+ buf.append('\"');
+ } else {
+ buf.append(cmdFile);
+ }
+ return buf.toString();
+ }
+ public static void getDefineSwitch(StringBuffer buffer, String define,
+ String value) {
+ buffer.append("/D");
+ buffer.append(define);
+ if (value != null && value.length() > 0) {
+ buffer.append('=');
+ buffer.append(value);
+ }
+ }
+ public static String getIncludeDirSwitch(String includeDir) {
+ return "/I" + includeDir.replace('/', '\\');
+ }
+ public static String[] getOutputFileSwitch(String outPath) {
+ StringBuffer buf = new StringBuffer("/Fo");
+ if (outPath.indexOf(' ') >= 0) {
+ buf.append('\"');
+ buf.append(outPath);
+ buf.append('\"');
+ } else {
+ buf.append(outPath);
+ }
+ String[] retval = new String[]{buf.toString()};
+ return retval;
+ }
+ public static void getUndefineSwitch(StringBuffer buffer, String define) {
+ buffer.append("/U");
+ buffer.append(define);
+ }
+ public static boolean isCaseSensitive() {
+ return false;
+ }
+ private DevStudioProcessor() {
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioResourceCompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioResourceCompiler.java
new file mode 100644
index 0000000..d6e2fd4
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioResourceCompiler.java
@@ -0,0 +1,117 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.devstudio;
+import java.io.File;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineCompiler;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.compiler.Processor;
+import net.sf.antcontrib.cpptasks.parser.CParser;
+import net.sf.antcontrib.cpptasks.parser.Parser;
+import net.sf.antcontrib.cpptasks.OptimizationEnum;
+
+import org.apache.tools.ant.types.Environment;
+/**
+ * Adapter for the Microsoft (r) Windows 32 Resource Compiler
+ *
+ * @author Curt Arnold
+ */
+public final class DevStudioResourceCompiler extends CommandLineCompiler {
+ private static final DevStudioResourceCompiler instance = new DevStudioResourceCompiler(
+ false, null);
+ public static DevStudioResourceCompiler getInstance() {
+ return instance;
+ }
+ private String identifier;
+ private DevStudioResourceCompiler(boolean newEnvironment, Environment env) {
+ super("rc", null, new String[]{".rc"}, new String[]{".h", ".hpp",
+ ".inl"}, ".res", false, null, newEnvironment, env);
+ }
+ protected void addImpliedArgs(final Vector args,
+ final boolean debug,
+ final boolean multithreaded,
+ final boolean exceptions,
+ final LinkType linkType,
+ final Boolean rtti,
+ final OptimizationEnum optimization,
+ final Boolean defaultflag) {
+ if (debug) {
+ args.addElement("/D_DEBUG");
+ } else {
+ args.addElement("/DNDEBUG");
+ }
+ }
+ protected void addWarningSwitch(Vector args, int level) {
+ }
+ public Processor changeEnvironment(boolean newEnvironment, Environment env) {
+ if (newEnvironment || env != null) {
+ return new DevStudioResourceCompiler(newEnvironment, env);
+ }
+ return this;
+ }
+ /**
+ * The include parser for C will work just fine, but we didn't want to
+ * inherit from CommandLineCCompiler
+ */
+ protected Parser createParser(File source) {
+ return new CParser();
+ }
+ protected int getArgumentCountPerInputFile() {
+ return 2;
+ }
+ protected void getDefineSwitch(StringBuffer buffer, String define,
+ String value) {
+ DevStudioProcessor.getDefineSwitch(buffer, define, value);
+ }
+ protected File[] getEnvironmentIncludePath() {
+ return CUtil.getPathFromEnvironment("INCLUDE", ";");
+ }
+ protected String getIncludeDirSwitch(String includeDir) {
+ return DevStudioProcessor.getIncludeDirSwitch(includeDir);
+ }
+ protected String getInputFileArgument(File outputDir, String filename,
+ int index) {
+ if (index == 0) {
+ String outputFileName = getOutputFileName(filename);
+ String fullOutputName = new File(outputDir, outputFileName)
+ .toString();
+ return "/fo" + fullOutputName;
+ }
+ return filename;
+ }
+ public Linker getLinker(LinkType type) {
+ return DevStudioLinker.getInstance().getLinker(type);
+ }
+ public int getMaximumCommandLength() {
+ return 1024;
+ }
+ protected int getMaximumInputFilesPerCommand() {
+ return 1;
+ }
+ protected int getTotalArgumentLengthForInputFile(File outputDir,
+ String inputFile) {
+ String arg1 = getInputFileArgument(outputDir, inputFile, 0);
+ String arg2 = getInputFileArgument(outputDir, inputFile, 1);
+ return arg1.length() + arg2.length() + 2;
+ }
+ protected void getUndefineSwitch(StringBuffer buffer, String define) {
+ DevStudioProcessor.getUndefineSwitch(buffer, define);
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/AbstractArLibrarian.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/AbstractArLibrarian.java
new file mode 100644
index 0000000..f7bb2ea
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/AbstractArLibrarian.java
@@ -0,0 +1,106 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.gcc;
+import java.io.File;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CCTask;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineLinker;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineLinkerConfiguration;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.types.LibraryTypeEnum;
+
+import org.apache.tools.ant.BuildException;
+/**
+ * Adapter for the "ar" tool
+ *
+ * @author Adam Murdoch
+ * @author Curt Arnold
+ */
+public abstract class AbstractArLibrarian extends CommandLineLinker {
+ private/* final */
+ String outputPrefix;
+ private static String[] defaultflags = new String[]{};
+ protected AbstractArLibrarian(String command, String identificationArg,
+ String[] inputExtensions, String[] ignoredExtensions,
+ String outputPrefix, String outputExtension, boolean isLibtool,
+ AbstractArLibrarian libtoolLibrarian) {
+ super(command, identificationArg, inputExtensions, ignoredExtensions,
+ outputExtension, isLibtool, libtoolLibrarian);
+ this.outputPrefix = outputPrefix;
+ }
+ public void addBase(long base, Vector args) {
+ }
+ public void addFixed(Boolean fixed, Vector args) {
+ }
+ public void addImpliedArgs(boolean debug, LinkType linkType, Vector args, Boolean defaultflag) {
+ if(defaultflag != null && defaultflag.booleanValue()){
+ for (int i = 0; i < defaultflags.length; i++) {
+ args.addElement(defaultflags[i]);
+ }
+ }
+ }
+ public void addIncremental(boolean incremental, Vector args) {
+ }
+ public void addMap(boolean map, Vector args) {
+ }
+ public void addStack(int stack, Vector args) {
+ }
+ /* (non-Javadoc)
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addEntry(int, java.util.Vector)
+ */
+ protected void addEntry(String entry, Vector args) {
+ }
+
+ public String getCommandFileSwitch(String commandFile) {
+ return null;
+ }
+ public File[] getLibraryPath() {
+ return new File[0];
+ }
+ public String[] getLibraryPatterns(String[] libnames, LibraryTypeEnum libType) {
+ return new String[0];
+ }
+ public int getMaximumCommandLength() {
+ return Integer.MAX_VALUE;
+ }
+ public String getOutputFileName(String baseName) {
+ return outputPrefix + super.getOutputFileName(baseName);
+ }
+ public String[] getOutputFileSwitch(String outputFile) {
+ return GccProcessor.getOutputFileSwitch("rvs", outputFile);
+ }
+ public boolean isCaseSensitive() {
+ return true;
+ }
+ public void link(CCTask task, File outputFile, String[] sourceFiles,
+ CommandLineLinkerConfiguration config) throws BuildException {
+ //
+ // if there is an existing library then
+ // we must delete it before executing "ar"
+ if (outputFile.exists()) {
+ if (!outputFile.delete()) {
+ throw new BuildException("Unable to delete "
+ + outputFile.getAbsolutePath());
+ }
+ }
+ //
+ // delegate to CommandLineLinker
+ //
+ super.link(task, outputFile, sourceFiles, config);
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/AbstractLdLinker.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/AbstractLdLinker.java
new file mode 100644
index 0000000..f6e3766
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/AbstractLdLinker.java
@@ -0,0 +1,323 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.gcc;
+import java.io.File;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CCTask;
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineLinker;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineLinkerConfiguration;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.types.LibrarySet;
+import net.sf.antcontrib.cpptasks.types.LibraryTypeEnum;
+
+/**
+ * Abstract adapter for ld-like linkers
+ *
+ * @author Curt Arnold
+ */
+public abstract class AbstractLdLinker extends CommandLineLinker {
+ private String outputPrefix;
+ private static String[] defaultflags = new String[]{};
+ protected AbstractLdLinker(String command, String identifierArg,
+ String[] extensions, String[] ignoredExtensions,
+ String outputPrefix, String outputSuffix, boolean isLibtool,
+ AbstractLdLinker libtoolLinker) {
+ super(command, identifierArg, extensions, ignoredExtensions,
+ outputSuffix, isLibtool, libtoolLinker);
+ this.outputPrefix = outputPrefix;
+ }
+ public void addBase(long base, Vector args) {
+ if (base >= 0) {
+ args.addElement("--image-base");
+ args.addElement(Long.toHexString(base));
+ }
+ }
+ public void addFixed(Boolean fixed, Vector args) {
+ }
+ protected void addImpliedArgs(boolean debug, LinkType linkType, Vector args, Boolean defaultflag) {
+ if(defaultflag != null && defaultflag.booleanValue()){
+ for (int i = 0; i < defaultflags.length; i++) {
+ args.addElement(defaultflags[i]);
+ }
+ }
+ if (debug) {
+ args.addElement("-g");
+ }
+ if (isDarwin()) {
+ if (linkType.isPluginModule()) {
+ args.addElement("-bundle");
+ } else {
+ if (linkType.isSharedLibrary()) {
+ args.addElement("-prebind");
+ args.addElement("-dynamiclib");
+ }
+ }
+ } else {
+ if (linkType.isStaticRuntime()) {
+ args.addElement("-static");
+ }
+ if (linkType.isPluginModule()) {
+ args.addElement("-shared");
+ } else {
+ if (linkType.isSharedLibrary()) {
+ args.addElement("-shared");
+ }
+ }
+ }
+ }
+ public void addIncremental(boolean incremental, Vector args) {
+ if (incremental) {
+ args.addElement("-i");
+ }
+ }
+ protected int addLibraryPatterns(String[] libnames, StringBuffer buf,
+ String prefix, String extension, String[] patterns, int offset) {
+ for (int i = 0; i < libnames.length; i++) {
+ buf.setLength(0);
+ buf.append(prefix);
+ buf.append(libnames[i]);
+ buf.append(extension);
+ patterns[offset + i] = buf.toString();
+ }
+ return offset + libnames.length;
+ }
+ public String[] addLibrarySets(CCTask task, LibrarySet[] libsets,
+ Vector preargs, Vector midargs, Vector endargs) {
+ Vector libnames = new Vector();
+ super.addLibrarySets(task, libsets, preargs, midargs, endargs);
+ LibraryTypeEnum previousLibraryType = null;
+ for (int i = 0; i < libsets.length; i++) {
+ LibrarySet set = libsets[i];
+ File libdir = set.getDir(null);
+ String[] libs = set.getLibs();
+ if (libdir != null) {
+ if (set.getType() != null &&
+ "framework".equals(set.getType().getValue()) &&
+ isDarwin()) {
+ endargs.addElement("-F" + libdir.getAbsolutePath());
+ } else {
+ endargs.addElement("-L" + libdir.getAbsolutePath());
+ }
+ }
+ //
+ // if there has been a change of library type
+ //
+ if (set.getType() != previousLibraryType) {
+ if (set.getType() != null && "static".equals(set.getType().getValue())) {
+ endargs.addElement("-Bstatic");
+ previousLibraryType = set.getType();
+ } else {
+ if (set.getType() == null ||
+ !"framework".equals(set.getType().getValue()) ||
+ !isDarwin()) {
+ endargs.addElement("-Bdynamic");
+ previousLibraryType = set.getType();
+ }
+ }
+ }
+ StringBuffer buf = new StringBuffer("-l");
+ if (set.getType() != null &&
+ "framework".equals(set.getType().getValue()) &&
+ isDarwin()) {
+ buf.setLength(0);
+ buf.append("-framework ");
+ }
+ int initialLength = buf.length();
+ for (int j = 0; j < libs.length; j++) {
+ //
+ // reset the buffer to just "-l"
+ //
+ buf.setLength(initialLength);
+ //
+ // add the library name
+ buf.append(libs[j]);
+ libnames.addElement(libs[j]);
+ //
+ // add the argument to the list
+ endargs.addElement(buf.toString());
+ }
+ }
+ String rc[] = new String[libnames.size()];
+ for (int i = 0; i < libnames.size(); i++) {
+ rc[i] = (String) libnames.elementAt(i);
+ }
+ return rc;
+ }
+ public void addMap(boolean map, Vector args) {
+ if (map) {
+ args.addElement("-M");
+ }
+ }
+ public void addStack(int stack, Vector args) {
+ if (stack > 0) {
+ args.addElement("--stack");
+ args.addElement(Integer.toString(stack));
+ }
+ }
+ /* (non-Javadoc)
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addEntry(int, java.util.Vector)
+ */
+ protected void addEntry(String entry, Vector args) {
+ if (entry != null) {
+ args.addElement("-e");
+ args.addElement(entry);
+ }
+ }
+
+ public String getCommandFileSwitch(String commandFile) {
+ throw new IllegalStateException("ld does not support command files");
+ }
+ /**
+ * Returns library path.
+ *
+ */
+ protected File[] getEnvironmentIncludePath() {
+ return CUtil.getPathFromEnvironment("LIB", ":");
+ }
+ public String getLibraryKey(File libfile) {
+ String libname = libfile.getName();
+ int lastDot = libname.lastIndexOf('.');
+ if (lastDot >= 0) {
+ return libname.substring(0, lastDot);
+ }
+ return libname;
+ }
+ /**
+ * Returns library path.
+ *
+ */
+ public File[] getLibraryPath() {
+ return new File[0];
+ }
+ public String[] getLibraryPatterns(String[] libnames, LibraryTypeEnum libType) {
+ StringBuffer buf = new StringBuffer();
+ int patternCount = libnames.length;
+ if (libType == null) {
+ patternCount *= 2;
+ }
+ String[] patterns = new String[patternCount];
+ int offset = 0;
+ if (libType == null || "static".equals(libType.getValue())) {
+ offset = addLibraryPatterns(libnames, buf, "lib", ".a", patterns, 0);
+ }
+ if (libType != null && "framework".equals(libType.getValue()) && isDarwin()) {
+ for(int i = 0; i < libnames.length; i++) {
+ buf.setLength(0);
+ buf.append(libnames[i]);
+ buf.append(".framework/");
+ buf.append(libnames[i]);
+ patterns[offset++] = buf.toString();
+ }
+ } else {
+ if (libType == null || !"static".equals(libType.getValue())) {
+ if (isHPUX()) {
+ offset = addLibraryPatterns(libnames, buf, "lib", ".sl", patterns,
+ offset);
+ } else {
+ offset = addLibraryPatterns(libnames, buf, "lib", ".so", patterns,
+ offset);
+ }
+ }
+ }
+ return patterns;
+ }
+ public int getMaximumCommandLength() {
+ return Integer.MAX_VALUE;
+ }
+ public String getOutputFileName(String baseName) {
+ return outputPrefix + super.getOutputFileName(baseName);
+ }
+ public String[] getOutputFileSwitch(String outputFile) {
+ return GccProcessor.getOutputFileSwitch("-o", outputFile);
+ }
+ public boolean isCaseSensitive() {
+ return true;
+ }
+ protected boolean isHPUX() {
+ String osname = System.getProperty("os.name").toLowerCase();
+ if (osname.indexOf("hp") >= 0 && osname.indexOf("ux") >= 0) {
+ return true;
+ }
+ return false;
+ }
+ /**
+ * Prepares argument list for exec command. Will return null if command
+ * line would exceed allowable command line buffer.
+ *
+ * @param outputFile
+ * linker output file
+ * @param sourceFiles
+ * linker input files (.obj, .o, .res)
+ * @param args
+ * linker arguments
+ * @return arguments for runTask
+ */
+ public String[] prepareArguments(CCTask task, String outputDir,
+ String outputFile, String[] sourceFiles,
+ CommandLineLinkerConfiguration config) {
+ //
+ // need to suppress sources that correspond to
+ // library set entries since they are already
+ // in the argument list
+ String[] libnames = config.getLibraryNames();
+ if (libnames == null || libnames.length == 0) {
+ return super.prepareArguments(task, outputDir, outputFile,
+ sourceFiles, config);
+ }
+ //
+ //
+ // null out any sources that correspond to library names
+ //
+ String[] localSources = (String[]) sourceFiles.clone();
+ int extra = 0;
+ for (int i = 0; i < libnames.length; i++) {
+ String libname = libnames[i];
+ for (int j = 0; j < localSources.length; j++) {
+ if (localSources[j] != null
+ && localSources[j].indexOf(libname) > 0
+ && localSources[j].indexOf("lib") > 0) {
+ String filename = new File(localSources[j]).getName();
+ if (filename.startsWith("lib")
+ && filename.substring(3).startsWith(libname)) {
+ String extension = filename
+ .substring(libname.length() + 3);
+ if (extension.equals(".a") || extension.equals(".so")
+ || extension.equals(".sl")) {
+ localSources[j] = null;
+ extra++;
+ }
+ }
+ }
+ }
+ }
+ if (extra == 0) {
+ return super.prepareArguments(task, outputDir, outputFile,
+ sourceFiles, config);
+ }
+ String[] finalSources = new String[localSources.length - extra];
+ int index = 0;
+ for (int i = 0; i < localSources.length; i++) {
+ if (localSources[i] != null) {
+ finalSources[index++] = localSources[i];
+ }
+ }
+ return super.prepareArguments(task, outputDir, outputFile,
+ finalSources, config);
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GccAssembler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GccAssembler.java
new file mode 100644
index 0000000..412bffa
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GccAssembler.java
@@ -0,0 +1,76 @@
+/*
+ *
+ * Copyright 2001-2005 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.gcc;
+
+import java.io.File;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineAssembler;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+
+/**
+ * Adapter for gcc assemble
+ *
+ */
+public final class GccAssembler extends CommandLineAssembler {
+ private final static String[] sourceExtensions = new String[] { ".asm" };
+
+ private final static String[] headerExtensions = new String[] { ".h",
+ ".inc" };
+
+ private static final GccAssembler instance = new GccAssembler("gas",
+ sourceExtensions, headerExtensions, false);
+
+ /**
+ * Gets gcc adapter
+ */
+ public static GccAssembler getInstance() {
+ return instance;
+ }
+
+ /**
+ * Private constructor. Use GccAssembler.getInstance() to get singleton
+ * instance of this class.
+ */
+ private GccAssembler (String command, String[] sourceExtensions,
+ String[] headerExtensions, boolean isLibtool) {
+ super(command, null, sourceExtensions, headerExtensions,
+ isLibtool ? ".fo" : ".o");
+ }
+
+ public void addImpliedArgs(Vector args, boolean debug, Boolean defaultflag) {
+
+ }
+
+ public int getMaximumCommandLength() {
+ return Integer.MAX_VALUE;
+ }
+
+ public Linker getLinker(LinkType linkType) {
+ return GccLinker.getInstance().getLinker(linkType);
+ }
+
+ protected File[] getEnvironmentIncludePath() {
+ return CUtil.getPathFromEnvironment("INCLUDE", ":");
+ }
+
+ protected String getIncludeDirSwitch(String includeDir) {
+ return "-I" + includeDir;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GccCCompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GccCCompiler.java
new file mode 100644
index 0000000..af3b26b
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GccCCompiler.java
@@ -0,0 +1,243 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.gcc;
+import java.io.File;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.compiler.Processor;
+import net.sf.antcontrib.cpptasks.parser.CParser;
+import net.sf.antcontrib.cpptasks.parser.FortranParser;
+import net.sf.antcontrib.cpptasks.parser.Parser;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.types.Environment;
+import net.sf.antcontrib.cpptasks.OptimizationEnum;
+
+/**
+ * Adapter for the GCC C/C++ compiler
+ *
+ * @author Adam Murdoch
+ */
+public final class GccCCompiler extends GccCompatibleCCompiler {
+ private final static String[] sourceExtensions = new String[]{".c", /* C */
+ ".cc", /* C++ */
+ ".cpp", /* C++ */
+ ".cxx", /* C++ */
+ ".c++", /* C++ */
+ ".i", /* preprocessed C */
+ ".ii", /* preprocessed C++ */
+ ".f", /* FORTRAN */
+ ".for", /* FORTRAN */
+ ".m", /* Objective-C */
+ ".mm", /* Objected-C++ */
+ ".s" /* Assembly */
+ };
+ private final static String[] headerExtensions = new String[]{".h", ".hpp",
+ ".inl"};
+ private static final GccCCompiler cppInstance = new GccCCompiler("c++",
+ sourceExtensions, headerExtensions, false,
+ new GccCCompiler("c++", sourceExtensions, headerExtensions, true,
+ null, false, null), false, null);
+ private static final GccCCompiler g77Instance = new GccCCompiler("g77",
+ sourceExtensions, headerExtensions, false,
+ new GccCCompiler("g77", sourceExtensions, headerExtensions, true,
+ null, false, null), false, null);
+ private static final GccCCompiler gppInstance = new GccCCompiler("g++",
+ sourceExtensions, headerExtensions, false,
+ new GccCCompiler("g++", sourceExtensions, headerExtensions, true,
+ null, false, null), false, null);
+ private static final GccCCompiler instance = new GccCCompiler("gcc",
+ sourceExtensions, headerExtensions, false,
+ new GccCCompiler("gcc", sourceExtensions, headerExtensions, true,
+ null, false, null), false, null);
+ /**
+ * Gets c++ adapter
+ */
+ public static GccCCompiler getCppInstance() {
+ return cppInstance;
+ }
+ /**
+ * Gets g77 adapter
+ */
+ public static GccCCompiler getG77Instance() {
+ return g77Instance;
+ }
+ /**
+ * Gets gpp adapter
+ */
+ public static GccCCompiler getGppInstance() {
+ return gppInstance;
+ }
+ /**
+ * Gets gcc adapter
+ */
+ public static GccCCompiler getInstance() {
+ return instance;
+ }
+ private String identifier;
+ private File[] includePath;
+ private boolean isPICMeaningful = true;
+ /**
+ * Private constructor. Use GccCCompiler.getInstance() to get singleton
+ * instance of this class.
+ */
+ private GccCCompiler(String command, String[] sourceExtensions,
+ String[] headerExtensions, boolean isLibtool,
+ GccCCompiler libtoolCompiler, boolean newEnvironment,
+ Environment env) {
+ super(command, null, sourceExtensions, headerExtensions, isLibtool,
+ libtoolCompiler, newEnvironment, env);
+ isPICMeaningful = System.getProperty("os.name").indexOf("Windows") < 0;
+ }
+ public void addImpliedArgs(final Vector args,
+ final boolean debug,
+ final boolean multithreaded,
+ final boolean exceptions,
+ final LinkType linkType,
+ final Boolean rtti,
+ final OptimizationEnum optimization,
+ final Boolean defaultflag) {
+ super.addImpliedArgs(args, debug, multithreaded,
+ exceptions, linkType, rtti, optimization, defaultflag);
+ if (isPICMeaningful && linkType.isSharedLibrary()) {
+ args.addElement("-fPIC");
+ }
+ }
+ public Processor changeEnvironment(boolean newEnvironment, Environment env) {
+ if (newEnvironment || env != null) {
+ return new GccCCompiler(getCommand(), this.getSourceExtensions(),
+ this.getHeaderExtensions(), this.getLibtool(),
+ (GccCCompiler) this.getLibtoolCompiler(), newEnvironment,
+ env);
+ }
+ return this;
+ }
+ /**
+ * Create parser to determine dependencies.
+ *
+ * Will create appropriate parser (C++, FORTRAN) based on file extension.
+ *
+ */
+ protected Parser createParser(File source) {
+ if (source != null) {
+ String sourceName = source.getName();
+ int lastDot = sourceName.lastIndexOf('.');
+ if (lastDot >= 0 && lastDot + 1 < sourceName.length()) {
+ char afterDot = sourceName.charAt(lastDot + 1);
+ if (afterDot == 'f' || afterDot == 'F') {
+ return new FortranParser();
+ }
+ }
+ }
+ return new CParser();
+ }
+ public File[] getEnvironmentIncludePath() {
+ if (includePath == null) {
+ //
+ // construct default include path from machine id and version id
+ //
+ String[] defaultInclude = new String[1];
+ StringBuffer buf = new StringBuffer("/lib/");
+ buf.append(GccProcessor.getMachine());
+ buf.append('/');
+ buf.append(GccProcessor.getVersion());
+ buf.append("/include");
+ defaultInclude[0] = buf.toString();
+ //
+ // read specs file and look for -istart and -idirafter
+ //
+ String[] specs = GccProcessor.getSpecs();
+ String[][] optionValues = GccProcessor.parseSpecs(specs, "*cpp:",
+ new String[]{"-isystem ", "-idirafter "});
+ //
+ // if no entries were found, then use a default path
+ //
+ if (optionValues[0].length == 0 && optionValues[1].length == 0) {
+ optionValues[0] = new String[]{"/usr/local/include",
+ "/usr/include", "/usr/include/win32api"};
+ }
+ //
+ // remove mingw entries.
+ // For MinGW compiles this will mean the
+ // location of the sys includes will be
+ // wrong in dependencies.xml
+ // but that should have no significant effect
+ for (int i = 0; i < optionValues.length; i++) {
+ for (int j = 0; j < optionValues[i].length; j++) {
+ if (optionValues[i][j].indexOf("mingw") > 0) {
+ optionValues[i][j] = null;
+ }
+ }
+ }
+ //
+ // if cygwin then
+ // we have to prepend location of gcc32
+ // and .. to start of absolute filenames to
+ // have something that will exist in the
+ // windows filesystem
+ if (GccProcessor.isCygwin()) {
+ GccProcessor.convertCygwinFilenames(optionValues[0]);
+ GccProcessor.convertCygwinFilenames(optionValues[1]);
+ GccProcessor.convertCygwinFilenames(defaultInclude);
+ }
+ int count = CUtil.checkDirectoryArray(optionValues[0]);
+ count += CUtil.checkDirectoryArray(optionValues[1]);
+ count += CUtil.checkDirectoryArray(defaultInclude);
+ includePath = new File[count];
+ int index = 0;
+ for (int i = 0; i < optionValues.length; i++) {
+ for (int j = 0; j < optionValues[i].length; j++) {
+ if (optionValues[i][j] != null) {
+ includePath[index++] = new File(optionValues[i][j]);
+ }
+ }
+ }
+ for (int i = 0; i < defaultInclude.length; i++) {
+ if (defaultInclude[i] != null) {
+ includePath[index++] = new File(defaultInclude[i]);
+ }
+ }
+ }
+ return (File[]) includePath.clone();
+ }
+ public String getIdentifier() throws BuildException {
+ if (identifier == null) {
+ StringBuffer buf;
+ if (getLibtool()) {
+ buf = new StringBuffer("libtool ");
+ } else {
+ buf = new StringBuffer(' ');
+ }
+ buf.append(getCommand());
+ buf.append(' ');
+ buf.append(GccProcessor.getVersion());
+ buf.append(' ');
+ buf.append(GccProcessor.getMachine());
+ identifier = buf.toString();
+ }
+ return identifier;
+ }
+ public Linker getLinker(LinkType linkType) {
+ return GccLinker.getInstance().getLinker(linkType);
+ }
+ public int getMaximumCommandLength() {
+ return Integer.MAX_VALUE;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GccCompatibleCCompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GccCompatibleCCompiler.java
new file mode 100644
index 0000000..98f086e
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GccCompatibleCCompiler.java
@@ -0,0 +1,152 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.gcc;
+import java.io.File;
+import java.util.Vector;
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineCCompiler;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import org.apache.tools.ant.types.Environment;
+import net.sf.antcontrib.cpptasks.OptimizationEnum;
+
+/**
+ * Abstract base class for compilers that attempt to be command line compatible
+ * with GCC
+ *
+ * @author Adam Murdoch
+ * @author Curt Arnold
+ */
+public abstract class GccCompatibleCCompiler extends CommandLineCCompiler {
+ private final static String[] headerExtensions = new String[]{".h", ".hpp",
+ ".inl"};
+ private final static String[] sourceExtensions = new String[]{".c", ".cc",
+ ".cpp", ".cxx", ".c++", ".i", ".f", ".for"};
+ private final static String[] defaultflags = new String[]{"-c"};
+ /**
+ * Private constructor. Use GccCCompiler.getInstance() to get singleton
+ * instance of this class.
+ */
+ protected GccCompatibleCCompiler(String command, String identifierArg,
+ boolean libtool, GccCompatibleCCompiler libtoolCompiler,
+ boolean newEnvironment, Environment env) {
+ super(command, identifierArg, sourceExtensions, headerExtensions,
+ libtool ? ".fo" : ".o", libtool, libtoolCompiler,
+ newEnvironment, env);
+ }
+ /**
+ * Private constructor. Use GccCCompiler.getInstance() to get singleton
+ * instance of this class.
+ */
+ protected GccCompatibleCCompiler(String command, String identifierArg,
+ String[] sourceExtensions, String[] headerExtensions,
+ boolean libtool, GccCompatibleCCompiler libtoolCompiler,
+ boolean newEnvironment, Environment env) {
+ super(command, identifierArg, sourceExtensions, headerExtensions,
+ libtool ? ".fo" : ".o", libtool, libtoolCompiler,
+ newEnvironment, env);
+ }
+ public void addImpliedArgs(final Vector args,
+ final boolean debug,
+ final boolean multithreaded,
+ final boolean exceptions,
+ final LinkType linkType,
+ final Boolean rtti,
+ final OptimizationEnum optimization,
+ final Boolean defaultflag) {
+ //
+ // -fPIC is too much trouble
+ // users have to manually add it for
+ // operating systems that make sense
+ //
+ if (defaultflag != null && defaultflag.booleanValue()) {
+ for (int i = 0; i < defaultflags.length; i++) {
+ args.addElement(defaultflags[i]);
+ }
+ }
+ if (debug) {
+ args.addElement("-g");
+ } else {
+ if (optimization != null) {
+ if (optimization.isSize()) {
+ args.addElement("-Os");
+ } else if (optimization.isSpeed()) {
+ if ("full".equals(optimization.getValue())) {
+ args.addElement("-O2");
+ } else {
+ if ("speed".equals(optimization.getValue())) {
+ args.addElement("-O1");
+ } else {
+ args.addElement("-O3");
+ }
+ }
+ }
+ }
+ }
+ if (getIdentifier().indexOf("mingw") >= 0) {
+ if (linkType.isSubsystemConsole()) {
+ args.addElement("-mconsole");
+ }
+ if (linkType.isSubsystemGUI()) {
+ args.addElement("-mwindows");
+ }
+ }
+ if (rtti != null && !rtti.booleanValue()) {
+ args.addElement("-fno-rtti");
+ }
+
+ }
+ /**
+ * Adds an include path to the command.
+ */
+ public void addIncludePath(String path, Vector cmd) {
+ cmd.addElement("-I" + path);
+ }
+ public void addWarningSwitch(Vector args, int level) {
+ switch (level) {
+ case 0 :
+ args.addElement("-w");
+ break;
+ case 5 :
+ args.addElement("-Werror");
+ /* nobreak */
+ case 4 :
+ args.addElement("-W");
+ /* nobreak */
+ case 3 :
+ args.addElement("-Wall");
+ break;
+ }
+ }
+ public void getDefineSwitch(StringBuffer buffer, String define, String value) {
+ buffer.append("-D");
+ buffer.append(define);
+ if (value != null && value.length() > 0) {
+ buffer.append('=');
+ buffer.append(value);
+ }
+ }
+ protected File[] getEnvironmentIncludePath() {
+ return CUtil.getPathFromEnvironment("INCLUDE", ":");
+ }
+ public String getIncludeDirSwitch(String includeDir) {
+ return "-I" + includeDir;
+ }
+ public void getUndefineSwitch(StringBuffer buffer, String define) {
+ buffer.append("-U");
+ buffer.append(define);
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GccLibrarian.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GccLibrarian.java
new file mode 100644
index 0000000..6250002
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GccLibrarian.java
@@ -0,0 +1,41 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.gcc;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+/**
+ * Adapter for the 'ar' archiver
+ *
+ * @author Adam Murdoch
+ */
+public final class GccLibrarian extends AbstractArLibrarian {
+ private static String[] objFileExtensions = new String[]{".o"};
+ private static GccLibrarian instance = new GccLibrarian("ar",
+ objFileExtensions, false, new GccLibrarian("ar", objFileExtensions,
+ true, null));
+ public static GccLibrarian getInstance() {
+ return instance;
+ }
+ private GccLibrarian(String command, String[] inputExtensions,
+ boolean isLibtool, GccLibrarian libtoolLibrarian) {
+ super(command, "V", inputExtensions, new String[0], "lib", ".a",
+ isLibtool, libtoolLibrarian);
+ }
+ public Linker getLinker(LinkType type) {
+ return GccLinker.getInstance().getLinker(type);
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GccLinker.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GccLinker.java
new file mode 100644
index 0000000..f37f550
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GccLinker.java
@@ -0,0 +1,210 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.gcc;
+import java.io.File;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+/**
+ * Adapter for the GCC linker
+ *
+ * @author Adam Murdoch
+ */
+public class GccLinker extends AbstractLdLinker {
+ private static final String[] discardFiles = new String[0];
+ private static final String[] objFiles = new String[]{".o", ".a", ".lib",
+ ".dll", ".so", ".sl"};
+ private static final String[] libtoolObjFiles = new String[]{".fo", ".a",
+ ".lib", ".dll", ".so", ".sl"};
+ private static String[] linkerOptions = new String[]{"-bundle",
+ "-dynamiclib", "-nostartfiles", "-nostdlib", "-prebind", "-s",
+ "-static", "-shared", "-symbolic", "-Xlinker",
+ "--export-all-symbols", "-static-libgcc",};
+ private static final GccLinker dllLinker = new GccLinker("gcc", objFiles,
+ discardFiles, "lib", ".so", false, new GccLinker("gcc", objFiles,
+ discardFiles, "lib", ".so", true, null));
+ private static final GccLinker instance = new GccLinker("gcc", objFiles,
+ discardFiles, "", "", false, null);
+ private static final GccLinker machBundleLinker = new GccLinker("gcc",
+ objFiles, discardFiles, "lib", ".bundle", false, null);
+ private static final GccLinker machDllLinker = new GccLinker("gcc",
+ objFiles, discardFiles, "lib", ".dylib", false, null);
+ public static GccLinker getInstance() {
+ return instance;
+ }
+ private File[] libDirs;
+ protected GccLinker(String command, String[] extensions,
+ String[] ignoredExtensions, String outputPrefix,
+ String outputSuffix, boolean isLibtool, GccLinker libtoolLinker) {
+ super(command, "-dumpversion", extensions, ignoredExtensions,
+ outputPrefix, outputSuffix, isLibtool, libtoolLinker);
+ }
+ protected void addImpliedArgs(boolean debug, LinkType linkType, Vector args, Boolean defaultflag) {
+ super.addImpliedArgs(debug, linkType, args, defaultflag);
+ if (getIdentifier().indexOf("mingw") >= 0) {
+ if (linkType.isSubsystemConsole()) {
+ args.addElement("-mconsole");
+ }
+ if (linkType.isSubsystemGUI()) {
+ args.addElement("-mwindows");
+ }
+ }
+ }
+ /**
+ * Allows drived linker to decorate linker option. Override by GccLinker to
+ * prepend a "-Wl," to pass option to through gcc to linker.
+ *
+ * @param buf
+ * buffer that may be used and abused in the decoration process,
+ * must not be null.
+ * @param arg
+ * linker argument
+ */
+ public String decorateLinkerOption(StringBuffer buf, String arg) {
+ String decoratedArg = arg;
+ if (arg.length() > 1 && arg.charAt(0) == '-') {
+ switch (arg.charAt(1)) {
+ //
+ // passed automatically by GCC
+ //
+ case 'g' :
+ case 'f' :
+ case 'F' :
+ /* Darwin */
+ case 'm' :
+ case 'O' :
+ case 'W' :
+ case 'l' :
+ case 'L' :
+ case 'u' :
+ case 'v' :
+ break;
+ default :
+ boolean known = false;
+ for (int i = 0; i < linkerOptions.length; i++) {
+ if (linkerOptions[i].equals(arg)) {
+ known = true;
+ break;
+ }
+ }
+ if (!known) {
+ buf.setLength(0);
+ buf.append("-Wl,");
+ buf.append(arg);
+ decoratedArg = buf.toString();
+ }
+ break;
+ }
+ }
+ return decoratedArg;
+ }
+ /**
+ * Returns library path.
+ *
+ */
+ public File[] getLibraryPath() {
+ if (libDirs == null) {
+ //
+ // construct gcc lib path from machine and version
+ //
+ StringBuffer buf = new StringBuffer("/lib/gcc-lib/");
+ buf.append(GccProcessor.getMachine());
+ buf.append('/');
+ buf.append(GccProcessor.getVersion());
+ //
+ // build default path from gcc and system /lib and /lib/w32api
+ //
+ String[] impliedLibPath = new String[]{buf.toString(),
+ "/lib/w32api", "/lib"};
+ //
+ // read gcc specs file for other library paths
+ //
+ String[] specs = GccProcessor.getSpecs();
+ String[][] libpaths = GccProcessor.parseSpecs(specs, "*link:",
+ new String[]{"%q"});
+ String[] libpath;
+ if (libpaths[0].length > 0) {
+ libpath = new String[libpaths[0].length + 3];
+ int i = 0;
+ for (; i < libpaths[0].length; i++) {
+ libpath[i] = libpaths[0][i];
+ }
+ libpath[i++] = buf.toString();
+ libpath[i++] = "/lib/w32api";
+ libpath[i++] = "/lib";
+ } else {
+ //
+ // if a failure to find any matches then
+ // use some default values for lib path entries
+ libpath = new String[]{"/usr/local/lib/mingw",
+ "/usr/local/lib", "/usr/lib/w32api", "/usr/lib/mingw",
+ "/usr/lib", buf.toString(), "/lib/w32api", "/lib"};
+ }
+ for (int i = 0; i < libpath.length; i++) {
+ if (libpath[i].indexOf("mingw") >= 0) {
+ libpath[i] = null;
+ }
+ }
+ //
+ // if cygwin then
+ // we have to prepend location of gcc32
+ // and .. to start of absolute filenames to
+ // have something that will exist in the
+ // windows filesystem
+ if (GccProcessor.isCygwin()) {
+ GccProcessor.convertCygwinFilenames(libpath);
+ }
+ //
+ // check that remaining entries are actual directories
+ //
+ int count = CUtil.checkDirectoryArray(libpath);
+ //
+ // populate return array with remaining entries
+ //
+ libDirs = new File[count];
+ int index = 0;
+ for (int i = 0; i < libpath.length; i++) {
+ if (libpath[i] != null) {
+ libDirs[index++] = new File(libpath[i]);
+ }
+ }
+ }
+ return libDirs;
+ }
+ public Linker getLinker(LinkType type) {
+ if (type.isStaticLibrary()) {
+ return GccLibrarian.getInstance();
+ }
+ if (type.isPluginModule()) {
+ if (isDarwin()) {
+ return machBundleLinker;
+ } else {
+ return dllLinker;
+ }
+ }
+ if (type.isSharedLibrary()) {
+ if (isDarwin()) {
+ return machDllLinker;
+ } else {
+ return dllLinker;
+ }
+ }
+ return instance;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GccProcessor.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GccProcessor.java
new file mode 100644
index 0000000..236969f
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GccProcessor.java
@@ -0,0 +1,299 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.gcc;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.compiler.CaptureStreamHandler;
+/**
+ * A add-in class for Gcc processors
+ *
+ *
+ */
+public class GccProcessor {
+ // the results from gcc -dumpmachine
+ private static String machine;
+ private static String[] specs;
+ // the results from gcc -dumpversion
+ private static String version;
+ private static int addLibraryPatterns(String[] libnames, StringBuffer buf,
+ String prefix, String extension, String[] patterns, int offset) {
+ for (int i = 0; i < libnames.length; i++) {
+ buf.setLength(0);
+ buf.append(prefix);
+ buf.append(libnames[i]);
+ buf.append(extension);
+ patterns[offset + i] = buf.toString();
+ }
+ return offset + libnames.length;
+ }
+ /**
+ * Converts absolute Cygwin file or directory names to the corresponding
+ * Win32 name.
+ *
+ * @param names
+ * array of names, some elements may be null, will be changed in
+ * place.
+ */
+ public static void convertCygwinFilenames(String[] names) {
+ if (names == null) {
+ throw new NullPointerException("names");
+ }
+ File gccDir = CUtil.getExecutableLocation("gcc.exe");
+ if (gccDir != null) {
+ String prefix = gccDir.getAbsolutePath() + "/..";
+ StringBuffer buf = new StringBuffer();
+ for (int i = 0; i < names.length; i++) {
+ String name = names[i];
+ if (name != null && name.length() > 1 && name.charAt(0) == '/') {
+ buf.setLength(0);
+ buf.append(prefix);
+ buf.append(name);
+ names[i] = buf.toString();
+ }
+ }
+ }
+ }
+ public static String[] getLibraryPatterns(String[] libnames) {
+ StringBuffer buf = new StringBuffer();
+ String[] patterns = new String[libnames.length * 2];
+ int offset = addLibraryPatterns(libnames, buf, "lib", ".a", patterns, 0);
+ if (isHPUX()) {
+ offset = addLibraryPatterns(libnames, buf, "lib", ".sl", patterns,
+ offset);
+ } else {
+ offset = addLibraryPatterns(libnames, buf, "lib", ".so", patterns,
+ offset);
+ }
+ return patterns;
+ }
+ public static String getMachine() {
+ if (machine == null) {
+ String[] args = new String[]{"gcc", "-dumpmachine"};
+ String[] cmdout = CaptureStreamHandler.run(args);
+ if (cmdout.length == 0) {
+ machine = "nomachine";
+ } else {
+ machine = cmdout[0];
+ }
+ }
+ return machine;
+ }
+ public static String[] getOutputFileSwitch(String letter, String outputFile) {
+ StringBuffer buf = new StringBuffer();
+ if (outputFile.indexOf(' ') >= 0) {
+ buf.append('"');
+ buf.append(outputFile.replace('\\', '/'));
+ buf.append('"');
+ } else {
+ buf.append(outputFile.replace('\\', '/'));
+ }
+ String[] retval = new String[]{letter, buf.toString()};
+ return retval;
+ }
+ /**
+ * Returns the contents of the gcc specs file.
+ *
+ * The implementation locates gcc.exe in the executable path and then
+ * builds a relative path name from the results of -dumpmachine and
+ * -dumpversion. Attempts to use gcc -dumpspecs to provide this information
+ * resulted in stalling on the Execute.run
+ *
+ * @returns contents of the specs file
+ */
+ public static String[] getSpecs() {
+ if (specs == null) {
+ File gccParent = CUtil.getExecutableLocation("gcc.exe");
+ if (gccParent != null) {
+ //
+ // build a relative path like
+ // ../lib/gcc-lib/i686-pc-cygwin/2.95.3-5/specs
+ //
+ StringBuffer buf = new StringBuffer("../lib/gcc-lib/");
+ buf.append(getMachine());
+ buf.append('/');
+ buf.append(getVersion());
+ buf.append("/specs");
+ //
+ // resolve it relative to the location of gcc.exe
+ //
+ String relativePath = buf.toString();
+ File specsFile = new File(gccParent, relativePath);
+ //
+ // found the specs file
+ //
+ try {
+ //
+ // read the lines in the file
+ //
+ BufferedReader reader = new BufferedReader(new FileReader(
+ specsFile));
+ Vector lines = new Vector(100);
+ String line = reader.readLine();
+ while (line != null) {
+ lines.addElement(line);
+ line = reader.readLine();
+ }
+ specs = new String[lines.size()];
+ lines.copyInto(specs);
+ } catch (IOException ex) {
+ }
+ }
+ }
+ if (specs == null) {
+ specs = new String[0];
+ }
+ return specs;
+ }
+ public static String getVersion() {
+ if (version == null) {
+ String[] args = new String[]{"gcc", "-dumpversion"};
+ String[] cmdout = CaptureStreamHandler.run(args);
+ if (cmdout.length == 0) {
+ version = "noversion";
+ } else {
+ version = cmdout[0];
+ }
+ }
+ return version;
+ }
+ public static boolean isCaseSensitive() {
+ return true;
+ }
+ /**
+ * Determines if task is running with cygwin
+ *
+ * @return true if cygwin was detected
+ */
+ public static boolean isCygwin() {
+ return getMachine().indexOf("cygwin") > 0;
+ }
+ private static boolean isHPUX() {
+ String osname = System.getProperty("os.name").toLowerCase();
+ if (osname.indexOf("hp") >= 0 && osname.indexOf("ux") >= 0) {
+ return true;
+ }
+ return false;
+ }
+ /**
+ *
+ * Parses the results of the specs file for a specific processor and
+ * options
+ *
+ * @param specsContent
+ * Contents of specs file as returned from getSpecs
+ * @param specSectionStart
+ * start of spec section, for example "*cpp:"
+ * @param options
+ * command line switches such as "-istart"
+ */
+ public static String[][] parseSpecs(String[] specsContent,
+ String specSectionStart, String[] options) {
+ if (specsContent == null) {
+ throw new NullPointerException("specsContent");
+ }
+ if (specSectionStart == null) {
+ throw new NullPointerException("specSectionStart");
+ }
+ if (options == null) {
+ throw new NullPointerException("option");
+ }
+ String[][] optionValues = new String[options.length][];
+ StringBuffer optionValue = new StringBuffer(40);
+ for (int i = 0; i < specsContent.length; i++) {
+ String specLine = specsContent[i];
+ //
+ // if start of section then start paying attention
+ //
+ if (specLine.startsWith(specSectionStart)) {
+ Vector[] optionVectors = new Vector[options.length];
+ for (int j = 0; j < options.length; j++) {
+ optionVectors[j] = new Vector(10);
+ }
+ //
+ // go to next line and examine contents
+ // and repeat until end of file
+ //
+ for (i++; i < specsContent.length; i++) {
+ specLine = specsContent[i];
+ for (int j = 0; j < options.length; j++) {
+ int optionStart = specLine.indexOf(options[j]);
+ while (optionStart >= 0) {
+ optionValue.setLength(0);
+ //
+ // walk rest of line looking for first non
+ // whitespace
+ // and then next space
+ boolean hasNonBlank = false;
+ int k = optionStart + options[j].length();
+ for (; k < specLine.length(); k++) {
+ //
+ // either a blank or a "}" (close of
+ // conditional)
+ // section will end the path
+ //
+ if (specLine.charAt(k) == ' '
+ || specLine.charAt(k) == '}') {
+ if (hasNonBlank) {
+ break;
+ }
+ } else {
+ hasNonBlank = true;
+ optionValue.append(specLine.charAt(k));
+ }
+ }
+ //
+ // transition back to whitespace
+ // value is over, add it to vector
+ if (hasNonBlank) {
+ optionVectors[j].addElement(optionValue
+ .toString());
+ }
+ //
+ // find next occurance on line
+ //
+ optionStart = specLine.indexOf(options[j], k);
+ }
+ }
+ }
+ //
+ // copy vectors over to option arrays
+ //
+ for (int j = 0; j < options.length; j++) {
+ optionValues[j] = new String[optionVectors[j].size()];
+ optionVectors[j].copyInto(optionValues[j]);
+ }
+ }
+ }
+ //
+ // fill in any missing option values with
+ // a zero-length string array
+ for (int i = 0; i < optionValues.length; i++) {
+ String[] zeroLenArray = new String[0];
+ if (optionValues[i] == null) {
+ optionValues[i] = zeroLenArray;
+ }
+ }
+ return optionValues;
+ }
+ private GccProcessor() {
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GppLinker.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GppLinker.java
new file mode 100644
index 0000000..e7036ab
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GppLinker.java
@@ -0,0 +1,203 @@
+/*
+ *
+ * Copyright 2003-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.gcc;
+import java.io.File;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CCTask;
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.compiler.CaptureStreamHandler;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.types.LibrarySet;
+/**
+ * Adapter for the g++ variant of the GCC linker
+ *
+ * @author Stephen M. Webb <stephen.webb@bregmasoft.com>
+ */
+public class GppLinker extends AbstractLdLinker {
+ protected static final String[] discardFiles = new String[0];
+ protected static final String[] objFiles = new String[]{".o", ".a", ".lib",
+ ".dll", ".so", ".sl"};
+ private static final GppLinker dllLinker = new GppLinker("gcc", objFiles,
+ discardFiles, "lib", ".so", false, new GppLinker("gcc", objFiles,
+ discardFiles, "lib", ".so", true, null));
+ private final static String libPrefix = "libraries: =";
+ protected static final String[] libtoolObjFiles = new String[]{".fo", ".a",
+ ".lib", ".dll", ".so", ".sl"};
+ private static String[] linkerOptions = new String[]{"-bundle", "-dylib",
+ "-dynamic", "-dynamiclib", "-nostartfiles", "-nostdlib",
+ "-prebind", "-s", "-static", "-shared", "-symbolic", "-Xlinker"};
+ private static final GppLinker instance = new GppLinker("gcc", objFiles,
+ discardFiles, "", "", false, null);
+ private static final GppLinker machDllLinker = new GppLinker("gcc",
+ objFiles, discardFiles, "lib", ".dylib", false, null);
+ private static final GppLinker machPluginLinker = new GppLinker("gcc",
+ objFiles, discardFiles, "lib", ".bundle", false, null);
+ public static GppLinker getInstance() {
+ return instance;
+ }
+ private File[] libDirs;
+ private String runtimeLibrary;
+ protected GppLinker(String command, String[] extensions,
+ String[] ignoredExtensions, String outputPrefix,
+ String outputSuffix, boolean isLibtool, GppLinker libtoolLinker) {
+ super(command, "-dumpversion", extensions, ignoredExtensions,
+ outputPrefix, outputSuffix, isLibtool, libtoolLinker);
+ }
+ protected void addImpliedArgs(boolean debug, LinkType linkType, Vector args, Boolean defaultflag) {
+ super.addImpliedArgs(debug, linkType, args, defaultflag);
+ if (getIdentifier().indexOf("mingw") >= 0) {
+ if (linkType.isSubsystemConsole()) {
+ args.addElement("-mconsole");
+ }
+ if (linkType.isSubsystemGUI()) {
+ args.addElement("-mwindows");
+ }
+ }
+ if (linkType.isStaticRuntime()) {
+ String[] cmdin = new String[]{"g++", "-print-file-name=libstdc++.a"};
+ String[] cmdout = CaptureStreamHandler.run(cmdin);
+ if (cmdout.length > 0) {
+ runtimeLibrary = cmdout[0];
+ } else {
+ runtimeLibrary = null;
+ }
+ } else {
+ runtimeLibrary = "-lstdc++";
+ }
+ }
+ public String[] addLibrarySets(CCTask task, LibrarySet[] libsets,
+ Vector preargs, Vector midargs, Vector endargs) {
+ String[] rs = super.addLibrarySets(task, libsets, preargs, midargs,
+ endargs);
+ if (runtimeLibrary != null) {
+ endargs.addElement(runtimeLibrary);
+ }
+ return rs;
+ }
+ /**
+ * Allows drived linker to decorate linker option. Override by GppLinker to
+ * prepend a "-Wl," to pass option to through gcc to linker.
+ *
+ * @param buf
+ * buffer that may be used and abused in the decoration process,
+ * must not be null.
+ * @param arg
+ * linker argument
+ */
+ public String decorateLinkerOption(StringBuffer buf, String arg) {
+ String decoratedArg = arg;
+ if (arg.length() > 1 && arg.charAt(0) == '-') {
+ switch (arg.charAt(1)) {
+ //
+ // passed automatically by GCC
+ //
+ case 'g' :
+ case 'f' :
+ case 'F' :
+ /* Darwin */
+ case 'm' :
+ case 'O' :
+ case 'W' :
+ case 'l' :
+ case 'L' :
+ case 'u' :
+ break;
+ default :
+ boolean known = false;
+ for (int i = 0; i < linkerOptions.length; i++) {
+ if (linkerOptions[i].equals(arg)) {
+ known = true;
+ break;
+ }
+ }
+ if (!known) {
+ buf.setLength(0);
+ buf.append("-Wl,");
+ buf.append(arg);
+ decoratedArg = buf.toString();
+ }
+ break;
+ }
+ }
+ return decoratedArg;
+ }
+ /**
+ * Returns library path.
+ *
+ */
+ public File[] getLibraryPath() {
+ if (libDirs == null) {
+ Vector dirs = new Vector();
+ // Ask GCC where it will look for its libraries.
+ String[] args = new String[]{"g++", "-print-search-dirs"};
+ String[] cmdout = CaptureStreamHandler.run(args);
+ for (int i = 0; i < cmdout.length; ++i) {
+ int prefixIndex = cmdout[i].indexOf(libPrefix);
+ if (prefixIndex >= 0) {
+ // Special case DOS-type GCCs like MinGW or Cygwin
+ int s = prefixIndex + libPrefix.length();
+ int t = cmdout[i].indexOf(';', s);
+ while (t > 0) {
+ dirs.addElement(cmdout[i].substring(s, t));
+ s = t + 1;
+ t = cmdout[i].indexOf(';', s);
+ }
+ dirs.addElement(cmdout[i].substring(s));
+ ++i;
+ for (; i < cmdout.length; ++i) {
+ dirs.addElement(cmdout[i]);
+ }
+ }
+ }
+ // Eliminate all but actual directories.
+ String[] libpath = new String[dirs.size()];
+ dirs.copyInto(libpath);
+ int count = CUtil.checkDirectoryArray(libpath);
+ // Build return array.
+ libDirs = new File[count];
+ int index = 0;
+ for (int i = 0; i < libpath.length; ++i) {
+ if (libpath[i] != null) {
+ libDirs[index++] = new File(libpath[i]);
+ }
+ }
+ }
+ return libDirs;
+ }
+ public Linker getLinker(LinkType type) {
+ if (type.isStaticLibrary()) {
+ return GccLibrarian.getInstance();
+ }
+ if (type.isPluginModule()) {
+ if (GccProcessor.getMachine().indexOf("darwin") >= 0) {
+ return machPluginLinker;
+ } else {
+ return dllLinker;
+ }
+ }
+ if (type.isSharedLibrary()) {
+ if (GccProcessor.getMachine().indexOf("darwin") >= 0) {
+ return machDllLinker;
+ } else {
+ return dllLinker;
+ }
+ }
+ return instance;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/LdLinker.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/LdLinker.java
new file mode 100644
index 0000000..e05fa5b
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/LdLinker.java
@@ -0,0 +1,57 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.gcc;
+import java.io.File;
+
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+/**
+ * Adapter for the 'ld' linker
+ *
+ * @author Curt Arnold
+ */
+public final class LdLinker extends AbstractLdLinker {
+ private static final String[] discardFiles = new String[0];
+ private static final String[] objFiles = new String[]{".o", ".a", ".lib",
+ ".dll", ".so", ".sl"};
+ private static final LdLinker dllLinker = new LdLinker("ld", objFiles,
+ discardFiles, "lib", ".so", false, new LdLinker("ld", objFiles,
+ discardFiles, "lib", ".so", true, null));
+ private static final LdLinker instance = new LdLinker("ld", objFiles,
+ discardFiles, "", "", false, null);
+ private static final String[] libtoolObjFiles = new String[]{".fo", ".a",
+ ".lib", ".dll", ".so", ".sl"};
+ public static LdLinker getInstance() {
+ return instance;
+ }
+ private File[] libDirs;
+ private LdLinker(String command, String[] extensions,
+ String[] ignoredExtensions, String outputPrefix,
+ String outputSuffix, boolean isLibtool, LdLinker libtoolLinker) {
+ super(command, "-version", extensions, ignoredExtensions, outputPrefix,
+ outputSuffix, isLibtool, libtoolLinker);
+ }
+ public Linker getLinker(LinkType type) {
+ if (type.isStaticLibrary()) {
+ return GccLibrarian.getInstance();
+ }
+ if (type.isSharedLibrary()) {
+ return dllLinker;
+ }
+ return instance;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/GccCCompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/GccCCompiler.java
new file mode 100644
index 0000000..6a5697e
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/GccCCompiler.java
@@ -0,0 +1,273 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.gcc.cross;
+import java.io.File;
+import java.util.Vector;
+import net.sf.antcontrib.cpptasks.CCTask;
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.CompilerParam;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineCompilerConfiguration;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.compiler.Processor;
+import net.sf.antcontrib.cpptasks.compiler.ProgressMonitor;
+import net.sf.antcontrib.cpptasks.gcc.GccCompatibleCCompiler;
+import net.sf.antcontrib.cpptasks.parser.CParser;
+import net.sf.antcontrib.cpptasks.parser.FortranParser;
+import net.sf.antcontrib.cpptasks.parser.Parser;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.types.Environment;
+import net.sf.antcontrib.cpptasks.OptimizationEnum;
+
+/**
+ * Adapter for the GCC C/C++ compiler
+ *
+ * @author Adam Murdoch
+ */
+public final class GccCCompiler extends GccCompatibleCCompiler {
+ private final static String[] headerExtensions = new String[]{".h", ".hpp",
+ ".inl"};
+ private final static String[] sourceExtensions = new String[]{".c", /* C */
+ ".cc", /* C++ */
+ ".cpp", /* C++ */
+ ".cxx", /* C++ */
+ ".c++", /* C++ */
+ ".i", /* preprocessed C */
+ ".ii", /* preprocessed C++ */
+ ".f", /* FORTRAN */
+ ".for", /* FORTRAN */
+ ".m", /* Objective-C */
+ ".mm", /* Objected-C++ */
+ ".s" /* Assembly */
+ };
+ private static final GccCCompiler cppInstance = new GccCCompiler("c++",
+ sourceExtensions, headerExtensions, false,
+ new GccCCompiler("c++", sourceExtensions, headerExtensions, true,
+ null, false, null), false, null);
+ private static final GccCCompiler g77Instance = new GccCCompiler("g77",
+ sourceExtensions, headerExtensions, false,
+ new GccCCompiler("g77", sourceExtensions, headerExtensions, true,
+ null, false, null), false, null);
+ private static final GccCCompiler gppInstance = new GccCCompiler("g++",
+ sourceExtensions, headerExtensions, false,
+ new GccCCompiler("g++", sourceExtensions, headerExtensions, true,
+ null, false, null), false, null);
+ private static final GccCCompiler instance = new GccCCompiler("gcc",
+ sourceExtensions, headerExtensions, false,
+ new GccCCompiler("gcc", sourceExtensions, headerExtensions, true,
+ null, false, null), false, null);
+ /**
+ * Gets c++ adapter
+ */
+ public static GccCCompiler getCppInstance() {
+ return cppInstance;
+ }
+ /**
+ * Gets g77 adapter
+ */
+ public static GccCCompiler getG77Instance() {
+ return g77Instance;
+ }
+ /**
+ * Gets gpp adapter
+ */
+ public static GccCCompiler getGppInstance() {
+ return gppInstance;
+ }
+ /**
+ * Gets gcc adapter
+ */
+ public static GccCCompiler getInstance() {
+ return instance;
+ }
+ private String identifier;
+ private File[] includePath;
+ private boolean isPICMeaningful = true;
+ /**
+ * Private constructor. Use GccCCompiler.getInstance() to get singleton
+ * instance of this class.
+ */
+ private GccCCompiler(String command, String[] sourceExtensions,
+ String[] headerExtensions, boolean isLibtool,
+ GccCCompiler libtoolCompiler, boolean newEnvironment,
+ Environment env) {
+ super(command, null, sourceExtensions, headerExtensions, isLibtool,
+ libtoolCompiler, newEnvironment, env);
+ isPICMeaningful = System.getProperty("os.name").indexOf("Windows") < 0;
+ }
+ public void addImpliedArgs(final Vector args,
+ final boolean debug,
+ final boolean multithreaded,
+ final boolean exceptions,
+ final LinkType linkType,
+ final Boolean rtti,
+ final OptimizationEnum optimization,
+ final Boolean defaultflag) {
+ super.addImpliedArgs(args, debug, multithreaded,
+ exceptions, linkType, rtti, optimization, defaultflag);
+ if (isPICMeaningful && linkType.isSharedLibrary()) {
+ args.addElement("-fPIC");
+ }
+ }
+ public Processor changeEnvironment(boolean newEnvironment, Environment env) {
+ if (newEnvironment || env != null) {
+ return new GccCCompiler(getCommand(), this.getSourceExtensions(),
+ this.getHeaderExtensions(), this.getLibtool(),
+ (GccCCompiler) this.getLibtoolCompiler(), newEnvironment,
+ env);
+ }
+ return this;
+ }
+ protected Object clone() throws CloneNotSupportedException {
+ GccCCompiler clone = (GccCCompiler) super.clone();
+ return clone;
+ }
+ public void compile(CCTask task, File outputDir, String[] sourceFiles,
+ String[] args, String[] endArgs, boolean relentless,
+ CommandLineCompilerConfiguration config, ProgressMonitor monitor)
+ throws BuildException {
+ try {
+ GccCCompiler clone = (GccCCompiler) this.clone();
+ CompilerParam param = config.getParam("target");
+ if (param != null)
+ clone.setCommand(param.getValue() + "-" + this.getCommand());
+ clone.supercompile(task, outputDir, sourceFiles, args, endArgs,
+ relentless, config, monitor);
+ } catch (CloneNotSupportedException e) {
+ supercompile(task, outputDir, sourceFiles, args, endArgs,
+ relentless, config, monitor);
+ }
+ }
+ /**
+ * Create parser to determine dependencies.
+ *
+ * Will create appropriate parser (C++, FORTRAN) based on file extension.
+ *
+ */
+ protected Parser createParser(File source) {
+ if (source != null) {
+ String sourceName = source.getName();
+ int lastDot = sourceName.lastIndexOf('.');
+ if (lastDot >= 0 && lastDot + 1 < sourceName.length()) {
+ char afterDot = sourceName.charAt(lastDot + 1);
+ if (afterDot == 'f' || afterDot == 'F') {
+ return new FortranParser();
+ }
+ }
+ }
+ return new CParser();
+ }
+ public File[] getEnvironmentIncludePath() {
+ if (includePath == null) {
+ //
+ // construct default include path from machine id and version id
+ //
+ String[] defaultInclude = new String[1];
+ StringBuffer buf = new StringBuffer("/lib/");
+ buf.append(GccProcessor.getMachine());
+ buf.append('/');
+ buf.append(GccProcessor.getVersion());
+ buf.append("/include");
+ defaultInclude[0] = buf.toString();
+ //
+ // read specs file and look for -istart and -idirafter
+ //
+ String[] specs = GccProcessor.getSpecs();
+ String[][] optionValues = GccProcessor.parseSpecs(specs, "*cpp:",
+ new String[]{"-isystem ", "-idirafter "});
+ //
+ // if no entries were found, then use a default path
+ //
+ if (optionValues[0].length == 0 && optionValues[1].length == 0) {
+ optionValues[0] = new String[]{"/usr/local/include",
+ "/usr/include", "/usr/include/win32api"};
+ }
+ //
+ // remove mingw entries.
+ // For MinGW compiles this will mean the
+ // location of the sys includes will be
+ // wrong in dependencies.xml
+ // but that should have no significant effect
+ for (int i = 0; i < optionValues.length; i++) {
+ for (int j = 0; j < optionValues[i].length; j++) {
+ if (optionValues[i][j].indexOf("mingw") > 0) {
+ optionValues[i][j] = null;
+ }
+ }
+ }
+ //
+ // if cygwin then
+ // we have to prepend location of gcc32
+ // and .. to start of absolute filenames to
+ // have something that will exist in the
+ // windows filesystem
+ if (GccProcessor.isCygwin()) {
+ GccProcessor.convertCygwinFilenames(optionValues[0]);
+ GccProcessor.convertCygwinFilenames(optionValues[1]);
+ GccProcessor.convertCygwinFilenames(defaultInclude);
+ }
+ int count = CUtil.checkDirectoryArray(optionValues[0]);
+ count += CUtil.checkDirectoryArray(optionValues[1]);
+ count += CUtil.checkDirectoryArray(defaultInclude);
+ includePath = new File[count];
+ int index = 0;
+ for (int i = 0; i < optionValues.length; i++) {
+ for (int j = 0; j < optionValues[i].length; j++) {
+ if (optionValues[i][j] != null) {
+ includePath[index++] = new File(optionValues[i][j]);
+ }
+ }
+ }
+ for (int i = 0; i < defaultInclude.length; i++) {
+ if (defaultInclude[i] != null) {
+ includePath[index++] = new File(defaultInclude[i]);
+ }
+ }
+ }
+ return (File[]) includePath.clone();
+ }
+ public String getIdentifier() throws BuildException {
+ if (identifier == null) {
+ StringBuffer buf;
+ if (getLibtool()) {
+ buf = new StringBuffer("libtool ");
+ } else {
+ buf = new StringBuffer(' ');
+ }
+ buf.append(getCommand());
+ buf.append(' ');
+ buf.append(GccProcessor.getVersion());
+ buf.append(' ');
+ buf.append(GccProcessor.getMachine());
+ identifier = buf.toString();
+ }
+ return identifier;
+ }
+ public Linker getLinker(LinkType linkType) {
+ return GccLinker.getInstance().getLinker(linkType);
+ }
+ public int getMaximumCommandLength() {
+ return Integer.MAX_VALUE;
+ }
+ private void supercompile(CCTask task, File outputDir,
+ String[] sourceFiles, String[] args, String[] endArgs,
+ boolean relentless, CommandLineCompilerConfiguration config,
+ ProgressMonitor monitor) throws BuildException {
+ super.compile(task, outputDir, sourceFiles, args, endArgs, relentless,
+ config, monitor);
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/GccLibrarian.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/GccLibrarian.java
new file mode 100644
index 0000000..ea2278a
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/GccLibrarian.java
@@ -0,0 +1,69 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.gcc.cross;
+import java.io.File;
+
+import net.sf.antcontrib.cpptasks.CCTask;
+import net.sf.antcontrib.cpptasks.LinkerParam;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineLinkerConfiguration;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.gcc.AbstractArLibrarian;
+
+import org.apache.tools.ant.BuildException;
+/**
+ * Adapter for the 'ar' archiver
+ *
+ * @author Adam Murdoch
+ */
+public final class GccLibrarian extends AbstractArLibrarian {
+ private static String[] objFileExtensions = new String[]{".o"};
+ private static GccLibrarian instance = new GccLibrarian("ar",
+ objFileExtensions, false, new GccLibrarian("ar", objFileExtensions,
+ true, null));
+ public static GccLibrarian getInstance() {
+ return instance;
+ }
+ private GccLibrarian(String command, String[] inputExtensions,
+ boolean isLibtool, GccLibrarian libtoolLibrarian) {
+ super(command, "V", inputExtensions, new String[0], "lib", ".a",
+ isLibtool, libtoolLibrarian);
+ }
+ protected Object clone() throws CloneNotSupportedException {
+ GccLibrarian clone = (GccLibrarian) super.clone();
+ return clone;
+ }
+ public Linker getLinker(LinkType type) {
+ return GccLinker.getInstance().getLinker(type);
+ }
+ public void link(CCTask task, File outputFile, String[] sourceFiles,
+ CommandLineLinkerConfiguration config) throws BuildException {
+ try {
+ GccLibrarian clone = (GccLibrarian) this.clone();
+ LinkerParam param = config.getParam("target");
+ if (param != null)
+ clone.setCommand(param.getValue() + "-" + this.getCommand());
+ clone.superlink(task, outputFile, sourceFiles, config);
+ } catch (CloneNotSupportedException e) {
+ superlink(task, outputFile, sourceFiles, config);
+ }
+ }
+ private void superlink(CCTask task, File outputFile, String[] sourceFiles,
+ CommandLineLinkerConfiguration config) throws BuildException {
+ super.link(task, outputFile, sourceFiles, config);
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/GccLinker.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/GccLinker.java
new file mode 100644
index 0000000..3293829
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/GccLinker.java
@@ -0,0 +1,234 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.gcc.cross;
+import java.io.File;
+import java.util.Vector;
+import net.sf.antcontrib.cpptasks.CCTask;
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.LinkerParam;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineLinkerConfiguration;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.gcc.AbstractLdLinker;
+import org.apache.tools.ant.BuildException;
+/**
+ * Adapter for the GCC linker
+ *
+ * @author Adam Murdoch
+ */
+public class GccLinker extends AbstractLdLinker {
+ private static final String[] discardFiles = new String[0];
+ private static final String[] objFiles = new String[]{".o", ".a", ".lib",
+ ".dll", ".so", ".sl"};
+ private static final GccLinker dllLinker = new GccLinker("gcc", objFiles,
+ discardFiles, "lib", ".so", false, new GccLinker("gcc", objFiles,
+ discardFiles, "lib", ".so", true, null));
+ private static final GccLinker instance = new GccLinker("gcc", objFiles,
+ discardFiles, "", "", false, null);
+ private static final String[] libtoolObjFiles = new String[]{".fo", ".a",
+ ".lib", ".dll", ".so", ".sl"};
+ private static String[] linkerOptions = new String[]{"-bundle",
+ "-dynamiclib", "-nostartfiles", "-nostdlib", "-prebind", "-s",
+ "-static", "-shared", "-symbolic", "-Xlinker",
+ "--export-all-symbols", "-static-libgcc",};
+ private static final GccLinker machBundleLinker = new GccLinker("gcc",
+ objFiles, discardFiles, "lib", ".bundle", false, null);
+ private static final GccLinker machDllLinker = new GccLinker("gcc",
+ objFiles, discardFiles, "lib", ".dylib", false, null);
+ public static GccLinker getInstance() {
+ return instance;
+ }
+ private File[] libDirs;
+ protected GccLinker(String command, String[] extensions,
+ String[] ignoredExtensions, String outputPrefix,
+ String outputSuffix, boolean isLibtool, GccLinker libtoolLinker) {
+ super(command, "-dumpversion", extensions, ignoredExtensions,
+ outputPrefix, outputSuffix, isLibtool, libtoolLinker);
+ }
+ protected void addImpliedArgs(boolean debug, LinkType linkType, Vector args, Boolean defaultflag) {
+ super.addImpliedArgs(debug, linkType, args, defaultflag);
+ if (getIdentifier().indexOf("mingw") >= 0) {
+ if (linkType.isSubsystemConsole()) {
+ args.addElement("-mconsole");
+ }
+ if (linkType.isSubsystemGUI()) {
+ args.addElement("-mwindows");
+ }
+ }
+ }
+ protected Object clone() throws CloneNotSupportedException {
+ GccLinker clone = (GccLinker) super.clone();
+ return clone;
+ }
+ /**
+ * Allows drived linker to decorate linker option. Override by GccLinker to
+ * prepend a "-Wl," to pass option to through gcc to linker.
+ *
+ * @param buf
+ * buffer that may be used and abused in the decoration process,
+ * must not be null.
+ * @param arg
+ * linker argument
+ */
+ public String decorateLinkerOption(StringBuffer buf, String arg) {
+ String decoratedArg = arg;
+ if (arg.length() > 1 && arg.charAt(0) == '-') {
+ switch (arg.charAt(1)) {
+ //
+ // passed automatically by GCC
+ //
+ case 'g' :
+ case 'f' :
+ case 'F' :
+ /* Darwin */
+ case 'm' :
+ case 'O' :
+ case 'W' :
+ case 'l' :
+ case 'L' :
+ case 'u' :
+ case 'v' :
+ break;
+ default :
+ boolean known = false;
+ for (int i = 0; i < linkerOptions.length; i++) {
+ if (linkerOptions[i].equals(arg)) {
+ known = true;
+ break;
+ }
+ }
+ if (!known) {
+ buf.setLength(0);
+ buf.append("-Wl,");
+ buf.append(arg);
+ decoratedArg = buf.toString();
+ }
+ break;
+ }
+ }
+ return decoratedArg;
+ }
+ /**
+ * Returns library path.
+ *
+ */
+ public File[] getLibraryPath() {
+ if (libDirs == null) {
+ //
+ // construct gcc lib path from machine and version
+ //
+ StringBuffer buf = new StringBuffer("/lib/gcc-lib/");
+ buf.append(GccProcessor.getMachine());
+ buf.append('/');
+ buf.append(GccProcessor.getVersion());
+ //
+ // build default path from gcc and system /lib and /lib/w32api
+ //
+ String[] impliedLibPath = new String[]{buf.toString(),
+ "/lib/w32api", "/lib"};
+ //
+ // read gcc specs file for other library paths
+ //
+ String[] specs = GccProcessor.getSpecs();
+ String[][] libpaths = GccProcessor.parseSpecs(specs, "*link:",
+ new String[]{"%q"});
+ String[] libpath;
+ if (libpaths[0].length > 0) {
+ libpath = new String[libpaths[0].length + 3];
+ int i = 0;
+ for (; i < libpaths[0].length; i++) {
+ libpath[i] = libpaths[0][i];
+ }
+ libpath[i++] = buf.toString();
+ libpath[i++] = "/lib/w32api";
+ libpath[i++] = "/lib";
+ } else {
+ //
+ // if a failure to find any matches then
+ // use some default values for lib path entries
+ libpath = new String[]{"/usr/local/lib/mingw",
+ "/usr/local/lib", "/usr/lib/w32api", "/usr/lib/mingw",
+ "/usr/lib", buf.toString(), "/lib/w32api", "/lib"};
+ }
+ for (int i = 0; i < libpath.length; i++) {
+ if (libpath[i].indexOf("mingw") >= 0) {
+ libpath[i] = null;
+ }
+ }
+ //
+ // if cygwin then
+ // we have to prepend location of gcc32
+ // and .. to start of absolute filenames to
+ // have something that will exist in the
+ // windows filesystem
+ if (GccProcessor.isCygwin()) {
+ GccProcessor.convertCygwinFilenames(libpath);
+ }
+ //
+ // check that remaining entries are actual directories
+ //
+ int count = CUtil.checkDirectoryArray(libpath);
+ //
+ // populate return array with remaining entries
+ //
+ libDirs = new File[count];
+ int index = 0;
+ for (int i = 0; i < libpath.length; i++) {
+ if (libpath[i] != null) {
+ libDirs[index++] = new File(libpath[i]);
+ }
+ }
+ }
+ return libDirs;
+ }
+ public Linker getLinker(LinkType type) {
+ if (type.isStaticLibrary()) {
+ return GccLibrarian.getInstance();
+ }
+ if (type.isPluginModule()) {
+ if (isDarwin()) {
+ return machBundleLinker;
+ } else {
+ return dllLinker;
+ }
+ }
+ if (type.isSharedLibrary()) {
+ if (isDarwin()) {
+ return machDllLinker;
+ } else {
+ return dllLinker;
+ }
+ }
+ return instance;
+ }
+ public void link(CCTask task, File outputFile, String[] sourceFiles,
+ CommandLineLinkerConfiguration config) throws BuildException {
+ try {
+ GccLinker clone = (GccLinker) this.clone();
+ LinkerParam param = config.getParam("target");
+ if (param != null)
+ clone.setCommand(param.getValue() + "-" + this.getCommand());
+ clone.superlink(task, outputFile, sourceFiles, config);
+ } catch (CloneNotSupportedException e) {
+ superlink(task, outputFile, sourceFiles, config);
+ }
+ }
+ private void superlink(CCTask task, File outputFile, String[] sourceFiles,
+ CommandLineLinkerConfiguration config) throws BuildException {
+ super.link(task, outputFile, sourceFiles, config);
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/GccProcessor.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/GccProcessor.java
new file mode 100644
index 0000000..283df63
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/GccProcessor.java
@@ -0,0 +1,288 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.gcc.cross;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.compiler.CaptureStreamHandler;
+
+/**
+ * A add-in class for Gcc processors
+ *
+ *
+ */
+public class GccProcessor {
+ // the results from gcc -dumpmachine
+ private static String machine;
+ private static String[] specs;
+ // the results from gcc -dumpversion
+ private static String version;
+ private static int addLibraryPatterns(String[] libnames, StringBuffer buf,
+ String prefix, String extension, String[] patterns, int offset) {
+ for (int i = 0; i < libnames.length; i++) {
+ buf.setLength(0);
+ buf.append(prefix);
+ buf.append(libnames[i]);
+ buf.append(extension);
+ patterns[offset + i] = buf.toString();
+ }
+ return offset + libnames.length;
+ }
+ /**
+ * Converts absolute Cygwin file or directory names to the corresponding
+ * Win32 name.
+ *
+ * @param names
+ * array of names, some elements may be null, will be changed in
+ * place.
+ */
+ public static void convertCygwinFilenames(String[] names) {
+ if (names == null) {
+ throw new NullPointerException("names");
+ }
+ File gccDir = CUtil.getExecutableLocation("gcc.exe");
+ if (gccDir != null) {
+ String prefix = gccDir.getAbsolutePath() + "/..";
+ StringBuffer buf = new StringBuffer();
+ for (int i = 0; i < names.length; i++) {
+ String name = names[i];
+ if (name != null && name.length() > 1 && name.charAt(0) == '/') {
+ buf.setLength(0);
+ buf.append(prefix);
+ buf.append(name);
+ names[i] = buf.toString();
+ }
+ }
+ }
+ }
+
+ public static String getMachine() {
+ if (machine == null) {
+ String[] args = new String[]{"gcc", "-dumpmachine"};
+ String[] cmdout = CaptureStreamHandler.run(args);
+ if (cmdout.length == 0) {
+ machine = "nomachine";
+ } else {
+ machine = cmdout[0];
+ }
+ }
+ return machine;
+ }
+ public static String[] getOutputFileSwitch(String letter, String outputFile) {
+ StringBuffer buf = new StringBuffer();
+ if (outputFile.indexOf(' ') >= 0) {
+ buf.append('"');
+ buf.append(outputFile.replace('\\', '/'));
+ buf.append('"');
+ } else {
+ buf.append(outputFile.replace('\\', '/'));
+ }
+ String[] retval = new String[]{letter, buf.toString()};
+ return retval;
+ }
+ /**
+ * Returns the contents of the gcc specs file.
+ *
+ * The implementation locates gcc.exe in the executable path and then
+ * builds a relative path name from the results of -dumpmachine and
+ * -dumpversion. Attempts to use gcc -dumpspecs to provide this information
+ * resulted in stalling on the Execute.run
+ *
+ * @returns contents of the specs file
+ */
+ public static String[] getSpecs() {
+ if (specs == null) {
+ File gccParent = CUtil.getExecutableLocation("gcc.exe");
+ if (gccParent != null) {
+ //
+ // build a relative path like
+ // ../lib/gcc-lib/i686-pc-cygwin/2.95.3-5/specs
+ //
+ StringBuffer buf = new StringBuffer("../lib/gcc-lib/");
+ buf.append(getMachine());
+ buf.append('/');
+ buf.append(getVersion());
+ buf.append("/specs");
+ //
+ // resolve it relative to the location of gcc.exe
+ //
+ String relativePath = buf.toString();
+ File specsFile = new File(gccParent, relativePath);
+ //
+ // found the specs file
+ //
+ try {
+ //
+ // read the lines in the file
+ //
+ BufferedReader reader = new BufferedReader(new FileReader(
+ specsFile));
+ Vector lines = new Vector(100);
+ String line = reader.readLine();
+ while (line != null) {
+ lines.addElement(line);
+ line = reader.readLine();
+ }
+ specs = new String[lines.size()];
+ lines.copyInto(specs);
+ } catch (IOException ex) {
+ }
+ }
+ }
+ if (specs == null) {
+ specs = new String[0];
+ }
+ return specs;
+ }
+ public static String getVersion() {
+ if (version == null) {
+ String[] args = new String[]{"gcc", "-dumpversion"};
+ String[] cmdout = CaptureStreamHandler.run(args);
+ if (cmdout.length == 0) {
+ version = "noversion";
+ } else {
+ version = cmdout[0];
+ }
+ }
+ return version;
+ }
+ public static boolean isCaseSensitive() {
+ return true;
+ }
+ /**
+ * Determines if task is running with cygwin
+ *
+ * @return true if cygwin was detected
+ */
+ public static boolean isCygwin() {
+ return getMachine().indexOf("cygwin") > 0;
+ }
+ private static boolean isHPUX() {
+ String osname = System.getProperty("os.name").toLowerCase();
+ if (osname.indexOf("hp") >= 0 && osname.indexOf("ux") >= 0) {
+ return true;
+ }
+ return false;
+ }
+ /**
+ *
+ * Parses the results of the specs file for a specific processor and
+ * options
+ *
+ * @param specsContent
+ * Contents of specs file as returned from getSpecs
+ * @param specSectionStart
+ * start of spec section, for example "*cpp:"
+ * @param options
+ * command line switches such as "-istart"
+ */
+ public static String[][] parseSpecs(String[] specsContent,
+ String specSectionStart, String[] options) {
+ if (specsContent == null) {
+ throw new NullPointerException("specsContent");
+ }
+ if (specSectionStart == null) {
+ throw new NullPointerException("specSectionStart");
+ }
+ if (options == null) {
+ throw new NullPointerException("option");
+ }
+ String[][] optionValues = new String[options.length][];
+ StringBuffer optionValue = new StringBuffer(40);
+ for (int i = 0; i < specsContent.length; i++) {
+ String specLine = specsContent[i];
+ //
+ // if start of section then start paying attention
+ //
+ if (specLine.startsWith(specSectionStart)) {
+ Vector[] optionVectors = new Vector[options.length];
+ for (int j = 0; j < options.length; j++) {
+ optionVectors[j] = new Vector(10);
+ }
+ //
+ // go to next line and examine contents
+ // and repeat until end of file
+ //
+ for (i++; i < specsContent.length; i++) {
+ specLine = specsContent[i];
+ for (int j = 0; j < options.length; j++) {
+ int optionStart = specLine.indexOf(options[j]);
+ while (optionStart >= 0) {
+ optionValue.setLength(0);
+ //
+ // walk rest of line looking for first non
+ // whitespace
+ // and then next space
+ boolean hasNonBlank = false;
+ int k = optionStart + options[j].length();
+ for (; k < specLine.length(); k++) {
+ //
+ // either a blank or a "}" (close of
+ // conditional)
+ // section will end the path
+ //
+ if (specLine.charAt(k) == ' '
+ || specLine.charAt(k) == '}') {
+ if (hasNonBlank) {
+ break;
+ }
+ } else {
+ hasNonBlank = true;
+ optionValue.append(specLine.charAt(k));
+ }
+ }
+ //
+ // transition back to whitespace
+ // value is over, add it to vector
+ if (hasNonBlank) {
+ optionVectors[j].addElement(optionValue
+ .toString());
+ }
+ //
+ // find next occurance on line
+ //
+ optionStart = specLine.indexOf(options[j], k);
+ }
+ }
+ }
+ //
+ // copy vectors over to option arrays
+ //
+ for (int j = 0; j < options.length; j++) {
+ optionValues[j] = new String[optionVectors[j].size()];
+ optionVectors[j].copyInto(optionValues[j]);
+ }
+ }
+ }
+ //
+ // fill in any missing option values with
+ // a zero-length string array
+ for (int i = 0; i < optionValues.length; i++) {
+ String[] zeroLenArray = new String[0];
+ if (optionValues[i] == null) {
+ optionValues[i] = zeroLenArray;
+ }
+ }
+ return optionValues;
+ }
+ private GccProcessor() {
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/GppLinker.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/GppLinker.java
new file mode 100644
index 0000000..3ba8f06
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/GppLinker.java
@@ -0,0 +1,228 @@
+/*
+ *
+ * Copyright 2003-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.gcc.cross;
+import java.io.File;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CCTask;
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.LinkerParam;
+import net.sf.antcontrib.cpptasks.compiler.CaptureStreamHandler;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineLinkerConfiguration;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.gcc.AbstractLdLinker;
+import net.sf.antcontrib.cpptasks.types.LibrarySet;
+
+import org.apache.tools.ant.BuildException;
+/**
+ * Adapter for the g++ variant of the GCC linker
+ *
+ * @author Stephen M. Webb <stephen.webb@bregmasoft.com>
+ */
+public class GppLinker extends AbstractLdLinker {
+ protected static final String[] discardFiles = new String[0];
+ protected static final String[] objFiles = new String[]{".o", ".a", ".lib",
+ ".dll", ".so", ".sl"};
+ private static final GppLinker dllLinker = new GppLinker("gcc", objFiles,
+ discardFiles, "lib", ".so", false, new GppLinker("gcc", objFiles,
+ discardFiles, "lib", ".so", true, null));
+ private final static String libPrefix = "libraries: =";
+ protected static final String[] libtoolObjFiles = new String[]{".fo", ".a",
+ ".lib", ".dll", ".so", ".sl"};
+ private static String[] linkerOptions = new String[]{"-bundle", "-dylib",
+ "-dynamic", "-dynamiclib", "-nostartfiles", "-nostdlib",
+ "-prebind", "-s", "-static", "-shared", "-symbolic", "-Xlinker"};
+ private static final GppLinker instance = new GppLinker("gcc", objFiles,
+ discardFiles, "", "", false, null);
+ private static final GppLinker machDllLinker = new GppLinker("gcc",
+ objFiles, discardFiles, "lib", ".dylib", false, null);
+ private static final GppLinker machPluginLinker = new GppLinker("gcc",
+ objFiles, discardFiles, "lib", ".bundle", false, null);
+ public static GppLinker getInstance() {
+ return instance;
+ }
+ private File[] libDirs;
+ private String runtimeLibrary;
+ protected GppLinker(String command, String[] extensions,
+ String[] ignoredExtensions, String outputPrefix,
+ String outputSuffix, boolean isLibtool, GppLinker libtoolLinker) {
+ super(command, "-dumpversion", extensions, ignoredExtensions,
+ outputPrefix, outputSuffix, isLibtool, libtoolLinker);
+ }
+ protected void addImpliedArgs(boolean debug, LinkType linkType, Vector args, Boolean defaultflag) {
+ super.addImpliedArgs(debug, linkType, args, defaultflag);
+ if (getIdentifier().indexOf("mingw") >= 0) {
+ if (linkType.isSubsystemConsole()) {
+ args.addElement("-mconsole");
+ }
+ if (linkType.isSubsystemGUI()) {
+ args.addElement("-mwindows");
+ }
+ }
+ if (linkType.isStaticRuntime()) {
+ String[] cmdin = new String[]{"g++", "-print-file-name=libstdc++.a"};
+ String[] cmdout = CaptureStreamHandler.run(cmdin);
+ if (cmdout.length > 0) {
+ runtimeLibrary = cmdout[0];
+ } else {
+ runtimeLibrary = null;
+ }
+ } else {
+ runtimeLibrary = "-lstdc++";
+ }
+ }
+ public String[] addLibrarySets(CCTask task, LibrarySet[] libsets,
+ Vector preargs, Vector midargs, Vector endargs) {
+ String[] rs = super.addLibrarySets(task, libsets, preargs, midargs,
+ endargs);
+ if (runtimeLibrary != null) {
+ endargs.addElement(runtimeLibrary);
+ }
+ return rs;
+ }
+ protected Object clone() throws CloneNotSupportedException {
+ GppLinker clone = (GppLinker) super.clone();
+ return clone;
+ }
+ /**
+ * Allows drived linker to decorate linker option. Override by GppLinker to
+ * prepend a "-Wl," to pass option to through gcc to linker.
+ *
+ * @param buf
+ * buffer that may be used and abused in the decoration process,
+ * must not be null.
+ * @param arg
+ * linker argument
+ */
+ public String decorateLinkerOption(StringBuffer buf, String arg) {
+ String decoratedArg = arg;
+ if (arg.length() > 1 && arg.charAt(0) == '-') {
+ switch (arg.charAt(1)) {
+ //
+ // passed automatically by GCC
+ //
+ case 'g' :
+ case 'f' :
+ case 'F' :
+ /* Darwin */
+ case 'm' :
+ case 'O' :
+ case 'W' :
+ case 'l' :
+ case 'L' :
+ case 'u' :
+ break;
+ default :
+ boolean known = false;
+ for (int i = 0; i < linkerOptions.length; i++) {
+ if (linkerOptions[i].equals(arg)) {
+ known = true;
+ break;
+ }
+ }
+ if (!known) {
+ buf.setLength(0);
+ buf.append("-Wl,");
+ buf.append(arg);
+ decoratedArg = buf.toString();
+ }
+ break;
+ }
+ }
+ return decoratedArg;
+ }
+ /**
+ * Returns library path.
+ *
+ */
+ public File[] getLibraryPath() {
+ if (libDirs == null) {
+ Vector dirs = new Vector();
+ // Ask GCC where it will look for its libraries.
+ String[] args = new String[]{"g++", "-print-search-dirs"};
+ String[] cmdout = CaptureStreamHandler.run(args);
+ for (int i = 0; i < cmdout.length; ++i) {
+ int prefixIndex = cmdout[i].indexOf(libPrefix);
+ if (prefixIndex >= 0) {
+ // Special case DOS-type GCCs like MinGW or Cygwin
+ int s = prefixIndex + libPrefix.length();
+ int t = cmdout[i].indexOf(';', s);
+ while (t > 0) {
+ dirs.addElement(cmdout[i].substring(s, t));
+ s = t + 1;
+ t = cmdout[i].indexOf(';', s);
+ }
+ dirs.addElement(cmdout[i].substring(s));
+ ++i;
+ for (; i < cmdout.length; ++i) {
+ dirs.addElement(cmdout[i]);
+ }
+ }
+ }
+ // Eliminate all but actual directories.
+ String[] libpath = new String[dirs.size()];
+ dirs.copyInto(libpath);
+ int count = CUtil.checkDirectoryArray(libpath);
+ // Build return array.
+ libDirs = new File[count];
+ int index = 0;
+ for (int i = 0; i < libpath.length; ++i) {
+ if (libpath[i] != null) {
+ libDirs[index++] = new File(libpath[i]);
+ }
+ }
+ }
+ return libDirs;
+ }
+ public Linker getLinker(LinkType type) {
+ if (type.isStaticLibrary()) {
+ return GccLibrarian.getInstance();
+ }
+ if (type.isPluginModule()) {
+ if (GccProcessor.getMachine().indexOf("darwin") >= 0) {
+ return machPluginLinker;
+ } else {
+ return dllLinker;
+ }
+ }
+ if (type.isSharedLibrary()) {
+ if (GccProcessor.getMachine().indexOf("darwin") >= 0) {
+ return machDllLinker;
+ } else {
+ return dllLinker;
+ }
+ }
+ return instance;
+ }
+ public void link(CCTask task, File outputFile, String[] sourceFiles,
+ CommandLineLinkerConfiguration config) throws BuildException {
+ try {
+ GppLinker clone = (GppLinker) this.clone();
+ LinkerParam param = config.getParam("target");
+ if (param != null)
+ clone.setCommand(param.getValue() + "-" + this.getCommand());
+ clone.superlink(task, outputFile, sourceFiles, config);
+ } catch (CloneNotSupportedException e) {
+ superlink(task, outputFile, sourceFiles, config);
+ }
+ }
+ private void superlink(CCTask task, File outputFile, String[] sourceFiles,
+ CommandLineLinkerConfiguration config) throws BuildException {
+ super.link(task, outputFile, sourceFiles, config);
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/LdLinker.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/LdLinker.java
new file mode 100644
index 0000000..8ac0cf8
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/LdLinker.java
@@ -0,0 +1,83 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.gcc.cross;
+import java.io.File;
+
+import net.sf.antcontrib.cpptasks.CCTask;
+import net.sf.antcontrib.cpptasks.LinkerParam;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineLinkerConfiguration;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.gcc.AbstractLdLinker;
+
+import org.apache.tools.ant.BuildException;
+/**
+ * Adapter for the 'ld' linker
+ *
+ * @author Curt Arnold
+ */
+public final class LdLinker extends AbstractLdLinker {
+ private static final String[] libtoolObjFiles = new String[]{".fo", ".a",
+ ".lib", ".dll", ".so", ".sl"};
+ private static final String[] objFiles = new String[]{".o", ".a", ".lib",
+ ".dll", ".so", ".sl"};
+ private static final String[] discardFiles = new String[0];
+ private static final LdLinker dllLinker = new LdLinker("ld", objFiles,
+ discardFiles, "lib", ".so", false, new LdLinker("ld", objFiles,
+ discardFiles, "lib", ".so", true, null));
+ private static final LdLinker instance = new LdLinker("ld", objFiles,
+ discardFiles, "", "", false, null);
+ public static LdLinker getInstance() {
+ return instance;
+ }
+ private File[] libDirs;
+ private LdLinker(String command, String[] extensions,
+ String[] ignoredExtensions, String outputPrefix,
+ String outputSuffix, boolean isLibtool, LdLinker libtoolLinker) {
+ super(command, "-version", extensions, ignoredExtensions, outputPrefix,
+ outputSuffix, isLibtool, libtoolLinker);
+ }
+ protected Object clone() throws CloneNotSupportedException {
+ LdLinker clone = (LdLinker) super.clone();
+ return clone;
+ }
+ public Linker getLinker(LinkType type) {
+ if (type.isStaticLibrary()) {
+ return GccLibrarian.getInstance();
+ }
+ if (type.isSharedLibrary()) {
+ return dllLinker;
+ }
+ return instance;
+ }
+ public void link(CCTask task, File outputFile, String[] sourceFiles,
+ CommandLineLinkerConfiguration config) throws BuildException {
+ try {
+ LdLinker clone = (LdLinker) this.clone();
+ LinkerParam param = config.getParam("target");
+ if (param != null)
+ clone.setCommand(param.getValue() + "-" + this.getCommand());
+ clone.superlink(task, outputFile, sourceFiles, config);
+ } catch (CloneNotSupportedException e) {
+ superlink(task, outputFile, sourceFiles, config);
+ }
+ }
+ private void superlink(CCTask task, File outputFile, String[] sourceFiles,
+ CommandLineLinkerConfiguration config) throws BuildException {
+ super.link(task, outputFile, sourceFiles, config);
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/sparc_sun_solaris2/GccCCompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/sparc_sun_solaris2/GccCCompiler.java
new file mode 100644
index 0000000..62d65b9
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/sparc_sun_solaris2/GccCCompiler.java
@@ -0,0 +1,245 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.gcc.cross.sparc_sun_solaris2;
+import java.io.File;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.compiler.Processor;
+import net.sf.antcontrib.cpptasks.gcc.GccCompatibleCCompiler;
+import net.sf.antcontrib.cpptasks.parser.CParser;
+import net.sf.antcontrib.cpptasks.parser.FortranParser;
+import net.sf.antcontrib.cpptasks.parser.Parser;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.types.Environment;
+import net.sf.antcontrib.cpptasks.OptimizationEnum;
+
+/**
+ * Adapter for the GCC C/C++ compiler
+ *
+ * @author Adam Murdoch
+ */
+public final class GccCCompiler extends GccCompatibleCCompiler {
+ private final static String[] sourceExtensions = new String[]{".c", /* C */
+ ".cc", /* C++ */
+ ".cpp", /* C++ */
+ ".cxx", /* C++ */
+ ".c++", /* C++ */
+ ".i", /* preprocessed C */
+ ".ii", /* preprocessed C++ */
+ ".f", /* FORTRAN */
+ ".for", /* FORTRAN */
+ ".m", /* Objective-C */
+ ".mm", /* Objected-C++ */
+ ".s" /* Assembly */
+ };
+ private final static String[] headerExtensions = new String[]{".h", ".hpp",
+ ".inl"};
+ public static final String CMD_PREFIX = "sparc-sun-solaris2-";
+ private static final GccCCompiler cppInstance = new GccCCompiler(CMD_PREFIX
+ + "c++", sourceExtensions, headerExtensions, false,
+ new GccCCompiler(CMD_PREFIX + "c++", sourceExtensions,
+ headerExtensions, true, null, false, null), false, null);
+ private static final GccCCompiler g77Instance = new GccCCompiler(CMD_PREFIX
+ + "g77", sourceExtensions, headerExtensions, false,
+ new GccCCompiler(CMD_PREFIX + "g77", sourceExtensions,
+ headerExtensions, true, null, false, null), false, null);
+ private static final GccCCompiler gppInstance = new GccCCompiler(CMD_PREFIX
+ + "g++", sourceExtensions, headerExtensions, false,
+ new GccCCompiler(CMD_PREFIX + "g++", sourceExtensions,
+ headerExtensions, true, null, false, null), false, null);
+ private static final GccCCompiler instance = new GccCCompiler(CMD_PREFIX
+ + "gcc", sourceExtensions, headerExtensions, false,
+ new GccCCompiler(CMD_PREFIX + "gcc", sourceExtensions,
+ headerExtensions, true, null, false, null), false, null);
+ /**
+ * Gets c++ adapter
+ */
+ public static GccCCompiler getCppInstance() {
+ return cppInstance;
+ }
+ /**
+ * Gets g77 adapter
+ */
+ public static GccCCompiler getG77Instance() {
+ return g77Instance;
+ }
+ /**
+ * Gets gpp adapter
+ */
+ public static GccCCompiler getGppInstance() {
+ return gppInstance;
+ }
+ /**
+ * Gets gcc adapter
+ */
+ public static GccCCompiler getInstance() {
+ return instance;
+ }
+ private String identifier;
+ private File[] includePath;
+ private boolean isPICMeaningful = true;
+ /**
+ * Private constructor. Use GccCCompiler.getInstance() to get singleton
+ * instance of this class.
+ */
+ private GccCCompiler(String command, String[] sourceExtensions,
+ String[] headerExtensions, boolean isLibtool,
+ GccCCompiler libtoolCompiler, boolean newEnvironment,
+ Environment env) {
+ super(command, null, sourceExtensions, headerExtensions, isLibtool,
+ libtoolCompiler, newEnvironment, env);
+ isPICMeaningful = System.getProperty("os.name").indexOf("Windows") < 0;
+ }
+ public void addImpliedArgs(final Vector args,
+ final boolean debug,
+ final boolean multithreaded,
+ final boolean exceptions,
+ final LinkType linkType,
+ final Boolean rtti,
+ final OptimizationEnum optimization,
+ final Boolean defaultflag) {
+ super.addImpliedArgs(args, debug, multithreaded,
+ exceptions, linkType, rtti, optimization, defaultflag);
+ if (isPICMeaningful && linkType.isSharedLibrary()) {
+ args.addElement("-fPIC");
+ }
+ }
+ public Processor changeEnvironment(boolean newEnvironment, Environment env) {
+ if (newEnvironment || env != null) {
+ return new GccCCompiler(getCommand(), this.getSourceExtensions(),
+ this.getHeaderExtensions(), this.getLibtool(),
+ (GccCCompiler) this.getLibtoolCompiler(), newEnvironment,
+ env);
+ }
+ return this;
+ }
+ /**
+ * Create parser to determine dependencies.
+ *
+ * Will create appropriate parser (C++, FORTRAN) based on file extension.
+ *
+ */
+ protected Parser createParser(File source) {
+ if (source != null) {
+ String sourceName = source.getName();
+ int lastDot = sourceName.lastIndexOf('.');
+ if (lastDot >= 0 && lastDot + 1 < sourceName.length()) {
+ char afterDot = sourceName.charAt(lastDot + 1);
+ if (afterDot == 'f' || afterDot == 'F') {
+ return new FortranParser();
+ }
+ }
+ }
+ return new CParser();
+ }
+ public File[] getEnvironmentIncludePath() {
+ if (includePath == null) {
+ //
+ // construct default include path from machine id and version id
+ //
+ String[] defaultInclude = new String[1];
+ StringBuffer buf = new StringBuffer("/lib/");
+ buf.append(GccProcessor.getMachine());
+ buf.append('/');
+ buf.append(GccProcessor.getVersion());
+ buf.append("/include");
+ defaultInclude[0] = buf.toString();
+ //
+ // read specs file and look for -istart and -idirafter
+ //
+ String[] specs = GccProcessor.getSpecs();
+ String[][] optionValues = GccProcessor.parseSpecs(specs, "*cpp:",
+ new String[]{"-isystem ", "-idirafter "});
+ //
+ // if no entries were found, then use a default path
+ //
+ if (optionValues[0].length == 0 && optionValues[1].length == 0) {
+ optionValues[0] = new String[]{"/usr/local/include",
+ "/usr/include", "/usr/include/win32api"};
+ }
+ //
+ // remove mingw entries.
+ // For MinGW compiles this will mean the
+ // location of the sys includes will be
+ // wrong in dependencies.xml
+ // but that should have no significant effect
+ for (int i = 0; i < optionValues.length; i++) {
+ for (int j = 0; j < optionValues[i].length; j++) {
+ if (optionValues[i][j].indexOf("mingw") > 0) {
+ optionValues[i][j] = null;
+ }
+ }
+ }
+ //
+ // if cygwin then
+ // we have to prepend location of gcc32
+ // and .. to start of absolute filenames to
+ // have something that will exist in the
+ // windows filesystem
+ if (GccProcessor.isCygwin()) {
+ GccProcessor.convertCygwinFilenames(optionValues[0]);
+ GccProcessor.convertCygwinFilenames(optionValues[1]);
+ GccProcessor.convertCygwinFilenames(defaultInclude);
+ }
+ int count = CUtil.checkDirectoryArray(optionValues[0]);
+ count += CUtil.checkDirectoryArray(optionValues[1]);
+ count += CUtil.checkDirectoryArray(defaultInclude);
+ includePath = new File[count];
+ int index = 0;
+ for (int i = 0; i < optionValues.length; i++) {
+ for (int j = 0; j < optionValues[i].length; j++) {
+ if (optionValues[i][j] != null) {
+ includePath[index++] = new File(optionValues[i][j]);
+ }
+ }
+ }
+ for (int i = 0; i < defaultInclude.length; i++) {
+ if (defaultInclude[i] != null) {
+ includePath[index++] = new File(defaultInclude[i]);
+ }
+ }
+ }
+ return (File[]) includePath.clone();
+ }
+ public String getIdentifier() throws BuildException {
+ if (identifier == null) {
+ StringBuffer buf;
+ if (getLibtool()) {
+ buf = new StringBuffer("libtool ");
+ } else {
+ buf = new StringBuffer(' ');
+ }
+ buf.append(getCommand());
+ buf.append(' ');
+ buf.append(GccProcessor.getVersion());
+ buf.append(' ');
+ buf.append(GccProcessor.getMachine());
+ identifier = buf.toString();
+ }
+ return identifier;
+ }
+ public Linker getLinker(LinkType linkType) {
+ return GccLinker.getInstance().getLinker(linkType);
+ }
+ public int getMaximumCommandLength() {
+ return Integer.MAX_VALUE;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/sparc_sun_solaris2/GccLibrarian.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/sparc_sun_solaris2/GccLibrarian.java
new file mode 100644
index 0000000..bb24387
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/sparc_sun_solaris2/GccLibrarian.java
@@ -0,0 +1,43 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.gcc.cross.sparc_sun_solaris2;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.gcc.AbstractArLibrarian;
+/**
+ * Adapter for the 'ar' archiver
+ *
+ * @author Adam Murdoch
+ */
+public final class GccLibrarian extends AbstractArLibrarian {
+ private static String[] objFileExtensions = new String[]{".o"};
+ private static GccLibrarian instance = new GccLibrarian(
+ GccCCompiler.CMD_PREFIX + "ar", objFileExtensions, false,
+ new GccLibrarian(GccCCompiler.CMD_PREFIX + "ar", objFileExtensions,
+ true, null));
+ public static GccLibrarian getInstance() {
+ return instance;
+ }
+ private GccLibrarian(String command, String[] inputExtensions,
+ boolean isLibtool, GccLibrarian libtoolLibrarian) {
+ super(command, "V", inputExtensions, new String[0], "lib", ".a",
+ isLibtool, libtoolLibrarian);
+ }
+ public Linker getLinker(LinkType type) {
+ return GccLinker.getInstance().getLinker(type);
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/sparc_sun_solaris2/GccLinker.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/sparc_sun_solaris2/GccLinker.java
new file mode 100644
index 0000000..914da34
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/sparc_sun_solaris2/GccLinker.java
@@ -0,0 +1,215 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.gcc.cross.sparc_sun_solaris2;
+import java.io.File;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.gcc.AbstractLdLinker;
+/**
+ * Adapter for the GCC linker
+ *
+ * @author Adam Murdoch
+ */
+public class GccLinker extends AbstractLdLinker {
+ private static final String[] discardFiles = new String[0];
+ private static final String[] objFiles = new String[]{".o", ".a", ".lib",
+ ".dll", ".so", ".sl"};
+ private static final String[] libtoolObjFiles = new String[]{".fo", ".a",
+ ".lib", ".dll", ".so", ".sl"};
+ private static String[] linkerOptions = new String[]{"-bundle",
+ "-dynamiclib", "-nostartfiles", "-nostdlib", "-prebind", "-s",
+ "-static", "-shared", "-symbolic", "-Xlinker",
+ "--export-all-symbols", "-static-libgcc",};
+ private static final GccLinker dllLinker = new GccLinker(
+ GccCCompiler.CMD_PREFIX + "gcc", objFiles, discardFiles, "lib",
+ ".so", false, new GccLinker(GccCCompiler.CMD_PREFIX + "gcc",
+ objFiles, discardFiles, "lib", ".so", true, null));
+ private static final GccLinker instance = new GccLinker(
+ GccCCompiler.CMD_PREFIX + "gcc", objFiles, discardFiles, "", "",
+ false, null);
+ private static final GccLinker machBundleLinker = new GccLinker(
+ GccCCompiler.CMD_PREFIX + "gcc", objFiles, discardFiles, "lib",
+ ".bundle", false, null);
+ private static final GccLinker machDllLinker = new GccLinker(
+ GccCCompiler.CMD_PREFIX + "gcc", objFiles, discardFiles, "lib",
+ ".dylib", false, null);
+ public static GccLinker getInstance() {
+ return instance;
+ }
+ private File[] libDirs;
+ protected GccLinker(String command, String[] extensions,
+ String[] ignoredExtensions, String outputPrefix,
+ String outputSuffix, boolean isLibtool, GccLinker libtoolLinker) {
+ super(command, "-dumpversion", extensions, ignoredExtensions,
+ outputPrefix, outputSuffix, isLibtool, libtoolLinker);
+ }
+ protected void addImpliedArgs(boolean debug, LinkType linkType, Vector args, Boolean defaultflag) {
+ super.addImpliedArgs(debug, linkType, args, defaultflag);
+ if (getIdentifier().indexOf("mingw") >= 0) {
+ if (linkType.isSubsystemConsole()) {
+ args.addElement("-mconsole");
+ }
+ if (linkType.isSubsystemGUI()) {
+ args.addElement("-mwindows");
+ }
+ }
+ }
+ /**
+ * Allows drived linker to decorate linker option. Override by GccLinker to
+ * prepend a "-Wl," to pass option to through gcc to linker.
+ *
+ * @param buf
+ * buffer that may be used and abused in the decoration process,
+ * must not be null.
+ * @param arg
+ * linker argument
+ */
+ public String decorateLinkerOption(StringBuffer buf, String arg) {
+ String decoratedArg = arg;
+ if (arg.length() > 1 && arg.charAt(0) == '-') {
+ switch (arg.charAt(1)) {
+ //
+ // passed automatically by GCC
+ //
+ case 'g' :
+ case 'f' :
+ case 'F' :
+ /* Darwin */
+ case 'm' :
+ case 'O' :
+ case 'W' :
+ case 'l' :
+ case 'L' :
+ case 'u' :
+ case 'v' :
+ break;
+ default :
+ boolean known = false;
+ for (int i = 0; i < linkerOptions.length; i++) {
+ if (linkerOptions[i].equals(arg)) {
+ known = true;
+ break;
+ }
+ }
+ if (!known) {
+ buf.setLength(0);
+ buf.append("-Wl,");
+ buf.append(arg);
+ decoratedArg = buf.toString();
+ }
+ break;
+ }
+ }
+ return decoratedArg;
+ }
+ /**
+ * Returns library path.
+ *
+ */
+ public File[] getLibraryPath() {
+ if (libDirs == null) {
+ //
+ // construct gcc lib path from machine and version
+ //
+ StringBuffer buf = new StringBuffer("/lib/gcc-lib/");
+ buf.append(GccProcessor.getMachine());
+ buf.append('/');
+ buf.append(GccProcessor.getVersion());
+ //
+ // build default path from gcc and system /lib and /lib/w32api
+ //
+ String[] impliedLibPath = new String[]{buf.toString(),
+ "/lib/w32api", "/lib"};
+ //
+ // read gcc specs file for other library paths
+ //
+ String[] specs = GccProcessor.getSpecs();
+ String[][] libpaths = GccProcessor.parseSpecs(specs, "*link:",
+ new String[]{"%q"});
+ String[] libpath;
+ if (libpaths[0].length > 0) {
+ libpath = new String[libpaths[0].length + 3];
+ int i = 0;
+ for (; i < libpaths[0].length; i++) {
+ libpath[i] = libpaths[0][i];
+ }
+ libpath[i++] = buf.toString();
+ libpath[i++] = "/lib/w32api";
+ libpath[i++] = "/lib";
+ } else {
+ //
+ // if a failure to find any matches then
+ // use some default values for lib path entries
+ libpath = new String[]{"/usr/local/lib/mingw",
+ "/usr/local/lib", "/usr/lib/w32api", "/usr/lib/mingw",
+ "/usr/lib", buf.toString(), "/lib/w32api", "/lib"};
+ }
+ for (int i = 0; i < libpath.length; i++) {
+ if (libpath[i].indexOf("mingw") >= 0) {
+ libpath[i] = null;
+ }
+ }
+ //
+ // if cygwin then
+ // we have to prepend location of gcc32
+ // and .. to start of absolute filenames to
+ // have something that will exist in the
+ // windows filesystem
+ if (GccProcessor.isCygwin()) {
+ GccProcessor.convertCygwinFilenames(libpath);
+ }
+ //
+ // check that remaining entries are actual directories
+ //
+ int count = CUtil.checkDirectoryArray(libpath);
+ //
+ // populate return array with remaining entries
+ //
+ libDirs = new File[count];
+ int index = 0;
+ for (int i = 0; i < libpath.length; i++) {
+ if (libpath[i] != null) {
+ libDirs[index++] = new File(libpath[i]);
+ }
+ }
+ }
+ return libDirs;
+ }
+ public Linker getLinker(LinkType type) {
+ if (type.isStaticLibrary()) {
+ return GccLibrarian.getInstance();
+ }
+ if (type.isPluginModule()) {
+ if (isDarwin()) {
+ return machBundleLinker;
+ } else {
+ return dllLinker;
+ }
+ }
+ if (type.isSharedLibrary()) {
+ if (isDarwin()) {
+ return machDllLinker;
+ } else {
+ return dllLinker;
+ }
+ }
+ return instance;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/sparc_sun_solaris2/GccProcessor.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/sparc_sun_solaris2/GccProcessor.java
new file mode 100644
index 0000000..599d6a8
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/sparc_sun_solaris2/GccProcessor.java
@@ -0,0 +1,305 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.gcc.cross.sparc_sun_solaris2;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.compiler.CaptureStreamHandler;
+import net.sf.antcontrib.cpptasks.types.LibraryTypeEnum;
+
+/**
+ * A add-in class for Gcc processors
+ *
+ *
+ */
+public class GccProcessor {
+ // the results from gcc -dumpmachine
+ private static String machine;
+ private static String[] specs;
+ // the results from gcc -dumpversion
+ private static String version;
+ private static int addLibraryPatterns(String[] libnames, StringBuffer buf,
+ String prefix, String extension, String[] patterns, int offset) {
+ for (int i = 0; i < libnames.length; i++) {
+ buf.setLength(0);
+ buf.append(prefix);
+ buf.append(libnames[i]);
+ buf.append(extension);
+ patterns[offset + i] = buf.toString();
+ }
+ return offset + libnames.length;
+ }
+ /**
+ * Converts absolute Cygwin file or directory names to the corresponding
+ * Win32 name.
+ *
+ * @param names
+ * array of names, some elements may be null, will be changed in
+ * place.
+ */
+ public static void convertCygwinFilenames(String[] names) {
+ if (names == null) {
+ throw new NullPointerException("names");
+ }
+ File gccDir = CUtil.getExecutableLocation(GccCCompiler.CMD_PREFIX
+ + "gcc.exe");
+ if (gccDir != null) {
+ String prefix = gccDir.getAbsolutePath() + "/..";
+ StringBuffer buf = new StringBuffer();
+ for (int i = 0; i < names.length; i++) {
+ String name = names[i];
+ if (name != null && name.length() > 1 && name.charAt(0) == '/') {
+ buf.setLength(0);
+ buf.append(prefix);
+ buf.append(name);
+ names[i] = buf.toString();
+ }
+ }
+ }
+ }
+ public static String[] getLibraryPatterns(String[] libnames, LibraryTypeEnum libType) {
+ StringBuffer buf = new StringBuffer();
+ String[] patterns = new String[libnames.length * 2];
+ int offset = addLibraryPatterns(libnames, buf, "lib", ".a", patterns, 0);
+ if (isHPUX()) {
+ offset = addLibraryPatterns(libnames, buf, "lib", ".sl", patterns,
+ offset);
+ } else {
+ offset = addLibraryPatterns(libnames, buf, "lib", ".so", patterns,
+ offset);
+ }
+ return patterns;
+ }
+ public static String getMachine() {
+ if (machine == null) {
+ String[] args = new String[]{GccCCompiler.CMD_PREFIX + "gcc",
+ "-dumpmachine"};
+ String[] cmdout = CaptureStreamHandler.run(args);
+ if (cmdout.length == 0) {
+ machine = "nomachine";
+ } else {
+ machine = cmdout[0];
+ }
+ }
+ return machine;
+ }
+ public static String[] getOutputFileSwitch(String letter, String outputFile) {
+ StringBuffer buf = new StringBuffer();
+ if (outputFile.indexOf(' ') >= 0) {
+ buf.append('"');
+ buf.append(outputFile.replace('\\', '/'));
+ buf.append('"');
+ } else {
+ buf.append(outputFile.replace('\\', '/'));
+ }
+ String[] retval = new String[]{letter, buf.toString()};
+ return retval;
+ }
+ /**
+ * Returns the contents of the gcc specs file.
+ *
+ * The implementation locates gcc.exe in the executable path and then
+ * builds a relative path name from the results of -dumpmachine and
+ * -dumpversion. Attempts to use gcc -dumpspecs to provide this information
+ * resulted in stalling on the Execute.run
+ *
+ * @returns contents of the specs file
+ */
+ public static String[] getSpecs() {
+ if (specs == null) {
+ File gccParent = CUtil
+ .getExecutableLocation(GccCCompiler.CMD_PREFIX + "gcc.exe");
+ if (gccParent != null) {
+ //
+ // build a relative path like
+ // ../lib/gcc-lib/i686-pc-cygwin/2.95.3-5/specs
+ //
+ StringBuffer buf = new StringBuffer("../lib/gcc-lib/");
+ buf.append(getMachine());
+ buf.append('/');
+ buf.append(getVersion());
+ buf.append("/specs");
+ //
+ // resolve it relative to the location of gcc.exe
+ //
+ String relativePath = buf.toString();
+ File specsFile = new File(gccParent, relativePath);
+ //
+ // found the specs file
+ //
+ try {
+ //
+ // read the lines in the file
+ //
+ BufferedReader reader = new BufferedReader(new FileReader(
+ specsFile));
+ Vector lines = new Vector(100);
+ String line = reader.readLine();
+ while (line != null) {
+ lines.addElement(line);
+ line = reader.readLine();
+ }
+ specs = new String[lines.size()];
+ lines.copyInto(specs);
+ } catch (IOException ex) {
+ }
+ }
+ }
+ if (specs == null) {
+ specs = new String[0];
+ }
+ return specs;
+ }
+ public static String getVersion() {
+ if (version == null) {
+ String[] args = new String[]{GccCCompiler.CMD_PREFIX + "gcc",
+ "-dumpversion"};
+ String[] cmdout = CaptureStreamHandler.run(args);
+ if (cmdout.length == 0) {
+ version = "noversion";
+ } else {
+ version = cmdout[0];
+ }
+ }
+ return version;
+ }
+ public static boolean isCaseSensitive() {
+ return true;
+ }
+ /**
+ * Determines if task is running with cygwin
+ *
+ * @return true if cygwin was detected
+ */
+ public static boolean isCygwin() {
+ return getMachine().indexOf("cygwin") > 0;
+ }
+ private static boolean isHPUX() {
+ String osname = System.getProperty("os.name").toLowerCase();
+ if (osname.indexOf("hp") >= 0 && osname.indexOf("ux") >= 0) {
+ return true;
+ }
+ return false;
+ }
+ /**
+ *
+ * Parses the results of the specs file for a specific processor and
+ * options
+ *
+ * @param specsContent
+ * Contents of specs file as returned from getSpecs
+ * @param specSectionStart
+ * start of spec section, for example "*cpp:"
+ * @param options
+ * command line switches such as "-istart"
+ */
+ public static String[][] parseSpecs(String[] specsContent,
+ String specSectionStart, String[] options) {
+ if (specsContent == null) {
+ throw new NullPointerException("specsContent");
+ }
+ if (specSectionStart == null) {
+ throw new NullPointerException("specSectionStart");
+ }
+ if (options == null) {
+ throw new NullPointerException("option");
+ }
+ String[][] optionValues = new String[options.length][];
+ StringBuffer optionValue = new StringBuffer(40);
+ for (int i = 0; i < specsContent.length; i++) {
+ String specLine = specsContent[i];
+ //
+ // if start of section then start paying attention
+ //
+ if (specLine.startsWith(specSectionStart)) {
+ Vector[] optionVectors = new Vector[options.length];
+ for (int j = 0; j < options.length; j++) {
+ optionVectors[j] = new Vector(10);
+ }
+ //
+ // go to next line and examine contents
+ // and repeat until end of file
+ //
+ for (i++; i < specsContent.length; i++) {
+ specLine = specsContent[i];
+ for (int j = 0; j < options.length; j++) {
+ int optionStart = specLine.indexOf(options[j]);
+ while (optionStart >= 0) {
+ optionValue.setLength(0);
+ //
+ // walk rest of line looking for first non
+ // whitespace
+ // and then next space
+ boolean hasNonBlank = false;
+ int k = optionStart + options[j].length();
+ for (; k < specLine.length(); k++) {
+ //
+ // either a blank or a "}" (close of
+ // conditional)
+ // section will end the path
+ //
+ if (specLine.charAt(k) == ' '
+ || specLine.charAt(k) == '}') {
+ if (hasNonBlank) {
+ break;
+ }
+ } else {
+ hasNonBlank = true;
+ optionValue.append(specLine.charAt(k));
+ }
+ }
+ //
+ // transition back to whitespace
+ // value is over, add it to vector
+ if (hasNonBlank) {
+ optionVectors[j].addElement(optionValue
+ .toString());
+ }
+ //
+ // find next occurance on line
+ //
+ optionStart = specLine.indexOf(options[j], k);
+ }
+ }
+ }
+ //
+ // copy vectors over to option arrays
+ //
+ for (int j = 0; j < options.length; j++) {
+ optionValues[j] = new String[optionVectors[j].size()];
+ optionVectors[j].copyInto(optionValues[j]);
+ }
+ }
+ }
+ //
+ // fill in any missing option values with
+ // a zero-length string array
+ for (int i = 0; i < optionValues.length; i++) {
+ String[] zeroLenArray = new String[0];
+ if (optionValues[i] == null) {
+ optionValues[i] = zeroLenArray;
+ }
+ }
+ return optionValues;
+ }
+ private GccProcessor() {
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/sparc_sun_solaris2/GppLinker.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/sparc_sun_solaris2/GppLinker.java
new file mode 100644
index 0000000..6a4c0ab
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/sparc_sun_solaris2/GppLinker.java
@@ -0,0 +1,210 @@
+/*
+ *
+ * Copyright 2003-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.gcc.cross.sparc_sun_solaris2;
+import java.io.File;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CCTask;
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.compiler.CaptureStreamHandler;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.gcc.AbstractLdLinker;
+import net.sf.antcontrib.cpptasks.types.LibrarySet;
+/**
+ * Adapter for the g++ variant of the GCC linker
+ *
+ * @author Stephen M. Webb <stephen.webb@bregmasoft.com>
+ */
+public class GppLinker extends AbstractLdLinker {
+ protected static final String[] discardFiles = new String[0];
+ protected static final String[] objFiles = new String[]{".o", ".a", ".lib",
+ ".dll", ".so", ".sl"};
+ private final static String libPrefix = "libraries: =";
+ protected static final String[] libtoolObjFiles = new String[]{".fo", ".a",
+ ".lib", ".dll", ".so", ".sl"};
+ private static String[] linkerOptions = new String[]{"-bundle", "-dylib",
+ "-dynamic", "-dynamiclib", "-nostartfiles", "-nostdlib",
+ "-prebind", "-s", "-static", "-shared", "-symbolic", "-Xlinker"};
+ private static final GppLinker dllLinker = new GppLinker(
+ GccCCompiler.CMD_PREFIX + "gcc", objFiles, discardFiles, "lib",
+ ".so", false, new GppLinker(GccCCompiler.CMD_PREFIX + "gcc",
+ objFiles, discardFiles, "lib", ".so", true, null));
+ private static final GppLinker instance = new GppLinker(
+ GccCCompiler.CMD_PREFIX + "gcc", objFiles, discardFiles, "", "",
+ false, null);
+ private static final GppLinker machDllLinker = new GppLinker(
+ GccCCompiler.CMD_PREFIX + "gcc", objFiles, discardFiles, "lib",
+ ".dylib", false, null);
+ private static final GppLinker machPluginLinker = new GppLinker(
+ GccCCompiler.CMD_PREFIX + "gcc", objFiles, discardFiles, "lib",
+ ".bundle", false, null);
+ public static GppLinker getInstance() {
+ return instance;
+ }
+ private File[] libDirs;
+ private String runtimeLibrary;
+ protected GppLinker(String command, String[] extensions,
+ String[] ignoredExtensions, String outputPrefix,
+ String outputSuffix, boolean isLibtool, GppLinker libtoolLinker) {
+ super(command, "-dumpversion", extensions, ignoredExtensions,
+ outputPrefix, outputSuffix, isLibtool, libtoolLinker);
+ }
+ protected void addImpliedArgs(boolean debug, LinkType linkType, Vector args, Boolean defaultflag) {
+ super.addImpliedArgs(debug, linkType, args, defaultflag);
+ if (getIdentifier().indexOf("mingw") >= 0) {
+ if (linkType.isSubsystemConsole()) {
+ args.addElement("-mconsole");
+ }
+ if (linkType.isSubsystemGUI()) {
+ args.addElement("-mwindows");
+ }
+ }
+ if (linkType.isStaticRuntime()) {
+ String[] cmdin = new String[]{GccCCompiler.CMD_PREFIX + "g++",
+ "-print-file-name=libstdc++.a"};
+ String[] cmdout = CaptureStreamHandler.run(cmdin);
+ if (cmdout.length > 0) {
+ runtimeLibrary = cmdout[0];
+ } else {
+ runtimeLibrary = null;
+ }
+ } else {
+ runtimeLibrary = "-lstdc++";
+ }
+ }
+ public String[] addLibrarySets(CCTask task, LibrarySet[] libsets,
+ Vector preargs, Vector midargs, Vector endargs) {
+ String[] rs = super.addLibrarySets(task, libsets, preargs, midargs,
+ endargs);
+ if (runtimeLibrary != null) {
+ endargs.addElement(runtimeLibrary);
+ }
+ return rs;
+ }
+ /**
+ * Allows drived linker to decorate linker option. Override by GppLinker to
+ * prepend a "-Wl," to pass option to through gcc to linker.
+ *
+ * @param buf
+ * buffer that may be used and abused in the decoration process,
+ * must not be null.
+ * @param arg
+ * linker argument
+ */
+ public String decorateLinkerOption(StringBuffer buf, String arg) {
+ String decoratedArg = arg;
+ if (arg.length() > 1 && arg.charAt(0) == '-') {
+ switch (arg.charAt(1)) {
+ //
+ // passed automatically by GCC
+ //
+ case 'g' :
+ case 'f' :
+ case 'F' :
+ /* Darwin */
+ case 'm' :
+ case 'O' :
+ case 'W' :
+ case 'l' :
+ case 'L' :
+ case 'u' :
+ break;
+ default :
+ boolean known = false;
+ for (int i = 0; i < linkerOptions.length; i++) {
+ if (linkerOptions[i].equals(arg)) {
+ known = true;
+ break;
+ }
+ }
+ if (!known) {
+ buf.setLength(0);
+ buf.append("-Wl,");
+ buf.append(arg);
+ decoratedArg = buf.toString();
+ }
+ break;
+ }
+ }
+ return decoratedArg;
+ }
+ /**
+ * Returns library path.
+ *
+ */
+ public File[] getLibraryPath() {
+ if (libDirs == null) {
+ Vector dirs = new Vector();
+ // Ask GCC where it will look for its libraries.
+ String[] args = new String[]{GccCCompiler.CMD_PREFIX + "g++",
+ "-print-search-dirs"};
+ String[] cmdout = CaptureStreamHandler.run(args);
+ for (int i = 0; i < cmdout.length; ++i) {
+ int prefixIndex = cmdout[i].indexOf(libPrefix);
+ if (prefixIndex >= 0) {
+ // Special case DOS-type GCCs like MinGW or Cygwin
+ int s = prefixIndex + libPrefix.length();
+ int t = cmdout[i].indexOf(';', s);
+ while (t > 0) {
+ dirs.addElement(cmdout[i].substring(s, t));
+ s = t + 1;
+ t = cmdout[i].indexOf(';', s);
+ }
+ dirs.addElement(cmdout[i].substring(s));
+ ++i;
+ for (; i < cmdout.length; ++i) {
+ dirs.addElement(cmdout[i]);
+ }
+ }
+ }
+ // Eliminate all but actual directories.
+ String[] libpath = new String[dirs.size()];
+ dirs.copyInto(libpath);
+ int count = CUtil.checkDirectoryArray(libpath);
+ // Build return array.
+ libDirs = new File[count];
+ int index = 0;
+ for (int i = 0; i < libpath.length; ++i) {
+ if (libpath[i] != null) {
+ libDirs[index++] = new File(libpath[i]);
+ }
+ }
+ }
+ return libDirs;
+ }
+ public Linker getLinker(LinkType type) {
+ if (type.isStaticLibrary()) {
+ return GccLibrarian.getInstance();
+ }
+ if (type.isPluginModule()) {
+ if (GccProcessor.getMachine().indexOf("darwin") >= 0) {
+ return machPluginLinker;
+ } else {
+ return dllLinker;
+ }
+ }
+ if (type.isSharedLibrary()) {
+ if (GccProcessor.getMachine().indexOf("darwin") >= 0) {
+ return machDllLinker;
+ } else {
+ return dllLinker;
+ }
+ }
+ return instance;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/sparc_sun_solaris2/LdLinker.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/sparc_sun_solaris2/LdLinker.java
new file mode 100644
index 0000000..fc7761e
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/sparc_sun_solaris2/LdLinker.java
@@ -0,0 +1,60 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.gcc.cross.sparc_sun_solaris2;
+import java.io.File;
+
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.gcc.AbstractLdLinker;
+/**
+ * Adapter for the 'ld' linker
+ *
+ * @author Curt Arnold
+ */
+public final class LdLinker extends AbstractLdLinker {
+ private static final String[] discardFiles = new String[0];
+ private static final String[] libtoolObjFiles = new String[]{".fo", ".a",
+ ".lib", ".dll", ".so", ".sl"};
+ private static final String[] objFiles = new String[]{".o", ".a", ".lib",
+ ".dll", ".so", ".sl"};
+ private static final LdLinker dllLinker = new LdLinker(
+ GccCCompiler.CMD_PREFIX + "ld", objFiles, discardFiles, "lib",
+ ".so", false, new LdLinker(GccCCompiler.CMD_PREFIX + "ld",
+ objFiles, discardFiles, "lib", ".so", true, null));
+ private static final LdLinker instance = new LdLinker(
+ GccCCompiler.CMD_PREFIX + "ld", objFiles, discardFiles, "", "",
+ false, null);
+ public static LdLinker getInstance() {
+ return instance;
+ }
+ private File[] libDirs;
+ private LdLinker(String command, String[] extensions,
+ String[] ignoredExtensions, String outputPrefix,
+ String outputSuffix, boolean isLibtool, LdLinker libtoolLinker) {
+ super(command, "-version", extensions, ignoredExtensions, outputPrefix,
+ outputSuffix, isLibtool, libtoolLinker);
+ }
+ public Linker getLinker(LinkType type) {
+ if (type.isStaticLibrary()) {
+ return GccLibrarian.getInstance();
+ }
+ if (type.isSharedLibrary()) {
+ return dllLinker;
+ }
+ return instance;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/hp/aCCCompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/hp/aCCCompiler.java
new file mode 100644
index 0000000..951bfc1
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/hp/aCCCompiler.java
@@ -0,0 +1,104 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.hp;
+import java.io.File;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.gcc.GccCompatibleCCompiler;
+import net.sf.antcontrib.cpptasks.OptimizationEnum;
+
+import org.apache.tools.ant.types.Environment;
+/**
+ * Adapter for the HP aC++ C++ compiler
+ *
+ * @author Curt Arnold
+ */
+public final class aCCCompiler extends GccCompatibleCCompiler {
+ private static final aCCCompiler instance = new aCCCompiler("aCC", false,
+ null);
+ /**
+ * Gets singleton instance of this class
+ */
+ public static aCCCompiler getInstance() {
+ return instance;
+ }
+ private String identifier;
+ private File[] includePath;
+ /**
+ * Private constructor. Use GccCCompiler.getInstance() to get singleton
+ * instance of this class.
+ */
+ private aCCCompiler(String command, boolean newEnvironment, Environment env) {
+ super(command, "-help", false, null, newEnvironment, env);
+ }
+ public void addImpliedArgs(Vector args, boolean debug,
+ boolean multithreaded, boolean exceptions, LinkType linkType,
+ final Boolean rtti,
+ final OptimizationEnum optimization) {
+ args.addElement("-c");
+ if (debug) {
+ args.addElement("-g");
+ }
+ /*
+ * if (multithreaded) { args.addElement("-mt"); }
+ */
+ if (linkType.isSharedLibrary()) {
+ args.addElement("+z");
+ }
+ }
+ public void addWarningSwitch(Vector args, int level) {
+ switch (level) {
+ case 0 :
+ args.addElement("-w");
+ break;
+ case 1 :
+ case 2 :
+ args.addElement("+w");
+ break;
+ /*
+ * case 3: case 4: case 5: args.addElement("+w2"); break;
+ */
+ }
+ }
+ public File[] getEnvironmentIncludePath() {
+ if (includePath == null) {
+ File ccLoc = CUtil.getExecutableLocation("aCC");
+ if (ccLoc != null) {
+ File compilerIncludeDir = new File(
+ new File(ccLoc, "../include").getAbsolutePath());
+ if (compilerIncludeDir.exists()) {
+ includePath = new File[2];
+ includePath[0] = compilerIncludeDir;
+ }
+ }
+ if (includePath == null) {
+ includePath = new File[1];
+ }
+ includePath[includePath.length - 1] = new File("/usr/include");
+ }
+ return includePath;
+ }
+ public Linker getLinker(LinkType linkType) {
+ return aCCLinker.getInstance().getLinker(linkType);
+ }
+ public int getMaximumCommandLength() {
+ return Integer.MAX_VALUE;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/hp/aCCLinker.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/hp/aCCLinker.java
new file mode 100644
index 0000000..86b22e0
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/hp/aCCLinker.java
@@ -0,0 +1,100 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.hp;
+import java.io.File;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.gcc.AbstractLdLinker;
+/**
+ * Adapter for Sun (r) Forte(tm) C++ Linker
+ *
+ * @author Curt Arnold
+ */
+public final class aCCLinker extends AbstractLdLinker {
+ private static final String[] discardFiles = new String[0];
+ private static final String[] objFiles = new String[]{".o", ".a", ".lib",
+ ".dll", ".so", ".sl"};
+ private static final aCCLinker arLinker = new aCCLinker("aCC", objFiles,
+ discardFiles, "", ".a");
+ private static final aCCLinker dllLinker = new aCCLinker("aCC", objFiles,
+ discardFiles, "lib", ".sl");
+ private static final aCCLinker instance = new aCCLinker("aCC", objFiles,
+ discardFiles, "", "");
+ public static aCCLinker getInstance() {
+ return instance;
+ }
+ private File[] libDirs;
+ private aCCLinker(String command, String[] extensions,
+ String[] ignoredExtensions, String outputPrefix, String outputSuffix) {
+ super(command, "-help", extensions, ignoredExtensions, outputPrefix,
+ outputSuffix, false, null);
+ }
+ public void addImpliedArgs(boolean debug, LinkType linkType, Vector args) {
+ if (debug) {
+ args.addElement("-g");
+ }
+ /*
+ * if(linkType.isStaticRuntime()) { args.addElement("-static"); }
+ */
+ if (linkType.isSharedLibrary()) {
+ args.addElement("-b");
+ }
+ /*
+ * if (linkType.isStaticLibrary()) { args.addElement("-Wl,-noshared"); }
+ */
+ }
+ public void addIncremental(boolean incremental, Vector args) {
+ /*
+ * if (incremental) { args.addElement("-xidlon"); } else {
+ * args.addElement("-xidloff"); }
+ */
+ }
+ /**
+ * Returns library path.
+ *
+ */
+ public File[] getLibraryPath() {
+ if (libDirs == null) {
+ File CCloc = CUtil.getExecutableLocation("aCC");
+ if (CCloc != null) {
+ File compilerLib = new File(new File(CCloc, "../lib")
+ .getAbsolutePath());
+ if (compilerLib.exists()) {
+ libDirs = new File[2];
+ libDirs[0] = compilerLib;
+ }
+ }
+ if (libDirs == null) {
+ libDirs = new File[1];
+ }
+ }
+ libDirs[libDirs.length - 1] = new File("/usr/lib");
+ return libDirs;
+ }
+ public Linker getLinker(LinkType type) {
+ if (type.isStaticLibrary()) {
+ return arLinker;
+ }
+ if (type.isSharedLibrary()) {
+ return dllLinker;
+ }
+ return instance;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ibm/VisualAgeCCompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ibm/VisualAgeCCompiler.java
new file mode 100644
index 0000000..f181c0e
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ibm/VisualAgeCCompiler.java
@@ -0,0 +1,111 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.ibm;
+import java.io.File;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.gcc.GccCompatibleCCompiler;
+import net.sf.antcontrib.cpptasks.OptimizationEnum;
+
+import org.apache.tools.ant.types.Environment;
+/**
+ * Adapter for the IBM(r) Visual Age(tm) C++ compiler for AIX(tm)
+ *
+ * @author Curt Arnold
+ */
+public final class VisualAgeCCompiler extends GccCompatibleCCompiler {
+ private static final VisualAgeCCompiler instance = new VisualAgeCCompiler(
+ "xlC", false, null);
+ /**
+ * Gets singleton instance of this class
+ */
+ public static VisualAgeCCompiler getInstance() {
+ return instance;
+ }
+ private String identifier;
+ private File[] includePath;
+ /**
+ * Private constructor. Use getInstance() to get singleton instance of this
+ * class.
+ */
+ private VisualAgeCCompiler(String command, boolean newEnvironment,
+ Environment env) {
+ super(command, "-help", false, null, newEnvironment, env);
+ }
+ public void addImpliedArgs(final Vector args,
+ final boolean debug,
+ final boolean multithreaded,
+ final boolean exceptions,
+ final LinkType linkType,
+ final Boolean rtti,
+ final OptimizationEnum optimization) {
+ args.addElement("-c");
+ if (debug) {
+ args.addElement("-g");
+ }
+ if (linkType.isSharedLibrary()) {
+ args.addElement("-fpic");
+ }
+ if (rtti != null) {
+ if (rtti.booleanValue()) {
+ args.addElement("-qrtti=all");
+ } else {
+ args.addElement("-qnortti");
+ }
+ }
+ }
+ public void addWarningSwitch(Vector args, int level) {
+ switch (level) {
+ case 0 :
+ args.addElement("-w");
+ break;
+ case 1 :
+ args.addElement("-qflag=s:s");
+ break;
+ case 2 :
+ args.addElement("-qflag=e:e");
+ break;
+ case 3 :
+ args.addElement("-qflag=w:w");
+ break;
+ case 4 :
+ args.addElement("-qflag=i:i");
+ break;
+ case 5 :
+ args.addElement("-qhalt=w:w");
+ break;
+ }
+ }
+ public Linker getLinker(LinkType linkType) {
+ return VisualAgeLinker.getInstance().getLinker(linkType);
+ }
+ public int getMaximumCommandLength() {
+ return Integer.MAX_VALUE;
+ }
+ /**
+ * Gets identifier for the compiler.
+ *
+ * Initial attempt at extracting version information
+ * would lock up. Using a stock response.
+ */
+ public String getIdentifier() {
+ return "VisualAge compiler - unidentified version";
+ }
+
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ibm/VisualAgeLinker.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ibm/VisualAgeLinker.java
new file mode 100644
index 0000000..f0a811b
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ibm/VisualAgeLinker.java
@@ -0,0 +1,75 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.ibm;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.gcc.AbstractLdLinker;
+import net.sf.antcontrib.cpptasks.gcc.GccLibrarian;
+/**
+ * Adapter for IBM(r) Visual Age(tm) Linker for AIX(tm)
+ *
+ * @author Curt Arnold
+ */
+public final class VisualAgeLinker extends AbstractLdLinker {
+ private static final String[] discardFiles = new String[]{};
+ private static final String[] objFiles = new String[]{".o", ".a", ".lib",
+ ".dll", ".so", ".sl"};
+ private static final VisualAgeLinker dllLinker = new VisualAgeLinker(
+ "makeC++SharedLib", objFiles, discardFiles, "lib", ".so");
+ private static final VisualAgeLinker instance = new VisualAgeLinker("xlC",
+ objFiles, discardFiles, "", "");
+ public static VisualAgeLinker getInstance() {
+ return instance;
+ }
+ private VisualAgeLinker(String command, String[] extensions,
+ String[] ignoredExtensions, String outputPrefix, String outputSuffix) {
+ //
+ // just guessing that -? might display something useful
+ //
+ super(command, "-?", extensions, ignoredExtensions, outputPrefix,
+ outputSuffix, false, null);
+ }
+ public void addImpliedArgs(boolean debug, LinkType linkType, Vector args) {
+ if (debug) {
+ //args.addElement("-g");
+ }
+ if (linkType.isSharedLibrary()) {
+ //args.addElement("-G");
+ }
+ }
+ public Linker getLinker(LinkType type) {
+ if (type.isStaticLibrary()) {
+ return GccLibrarian.getInstance();
+ }
+ if (type.isSharedLibrary()) {
+ return dllLinker;
+ }
+ return instance;
+ }
+ /**
+ * Gets identifier for the compiler.
+ *
+ * Initial attempt at extracting version information
+ * would lock up. Using a stock response.
+ */
+ public String getIdentifier() {
+ return "VisualAge linker - unidentified version";
+ }
+
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelLinux32CCompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelLinux32CCompiler.java
new file mode 100644
index 0000000..65402f4
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelLinux32CCompiler.java
@@ -0,0 +1,58 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.intel;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.compiler.Processor;
+import net.sf.antcontrib.cpptasks.gcc.GccCompatibleCCompiler;
+
+import org.apache.tools.ant.types.Environment;
+/**
+ * Adapter for the Intel (r) C/C++ compiler for IA-32 Linux (r)
+ *
+ * The Intel (r) C/C++ compiler for IA32 Linux mimics the command options for
+ * gcc compiler.
+ *
+ * @author Curt Arnold
+ */
+public final class IntelLinux32CCompiler extends GccCompatibleCCompiler {
+ private static final IntelLinux32CCompiler instance = new IntelLinux32CCompiler(
+ false, new IntelLinux32CCompiler(true, null, false, null), false,
+ null);
+ public static IntelLinux32CCompiler getInstance() {
+ return instance;
+ }
+ private IntelLinux32CCompiler(boolean isLibtool,
+ IntelLinux32CCompiler libtoolCompiler, boolean newEnvironment,
+ Environment env) {
+ super("icc", "-V", isLibtool, libtoolCompiler, newEnvironment, env);
+ }
+ public Processor changeEnvironment(boolean newEnvironment, Environment env) {
+ if (newEnvironment || env != null) {
+ return new IntelLinux32CCompiler(getLibtool(),
+ (IntelLinux32CCompiler) getLibtoolCompiler(),
+ newEnvironment, env);
+ }
+ return this;
+ }
+ public Linker getLinker(LinkType type) {
+ return IntelLinux32Linker.getInstance().getLinker(type);
+ }
+ public int getMaximumCommandLength() {
+ return Integer.MAX_VALUE;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelLinux32Linker.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelLinux32Linker.java
new file mode 100644
index 0000000..268f490
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelLinux32Linker.java
@@ -0,0 +1,55 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.intel;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.gcc.AbstractLdLinker;
+import net.sf.antcontrib.cpptasks.gcc.GccLibrarian;
+/**
+ * Adapter for the Intel (r) Linker for Linux (r) for IA-32
+ *
+ * @author Curt Arnold
+ */
+public final class IntelLinux32Linker extends AbstractLdLinker {
+ private static final String[] discardFiles = new String[0];
+ private static final String[] libtoolObjFiles = new String[]{".fo", ".a",
+ ".lib", ".dll", ".so", ".sl"};
+ private static final String[] objFiles = new String[]{".o", ".a", ".lib",
+ ".dll", ".so", ".sl"};
+ private static final IntelLinux32Linker dllLinker = new IntelLinux32Linker(
+ "lib", ".so", false, new IntelLinux32Linker("lib", ".so", true,
+ null));
+ private static final IntelLinux32Linker instance = new IntelLinux32Linker(
+ "", "", false, null);
+ public static IntelLinux32Linker getInstance() {
+ return instance;
+ }
+ private IntelLinux32Linker(String outputPrefix, String outputSuffix,
+ boolean isLibtool, IntelLinux32Linker libtoolLinker) {
+ super("icc", "-V", objFiles, discardFiles, outputPrefix, outputSuffix,
+ isLibtool, libtoolLinker);
+ }
+ public Linker getLinker(LinkType type) {
+ if (type.isStaticLibrary()) {
+ return GccLibrarian.getInstance();
+ }
+ if (type.isSharedLibrary()) {
+ return dllLinker;
+ }
+ return instance;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelLinux64CCompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelLinux64CCompiler.java
new file mode 100644
index 0000000..5a506e0
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelLinux64CCompiler.java
@@ -0,0 +1,58 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.intel;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.compiler.Processor;
+import net.sf.antcontrib.cpptasks.gcc.GccCompatibleCCompiler;
+
+import org.apache.tools.ant.types.Environment;
+/**
+ * Adapter for the Intel (r) C/C++ compiler for IA-64 Linux (r)
+ *
+ * The Intel C/C++ compiler for IA-64 Linux mimics the command options for gcc
+ * compiler.
+ *
+ * @author Curt Arnold
+ */
+public final class IntelLinux64CCompiler extends GccCompatibleCCompiler {
+ private static final IntelLinux64CCompiler instance = new IntelLinux64CCompiler(
+ false, new IntelLinux64CCompiler(true, null, false, null), false,
+ null);
+ public static IntelLinux64CCompiler getInstance() {
+ return instance;
+ }
+ private IntelLinux64CCompiler(boolean isLibtool,
+ IntelLinux64CCompiler libtoolCompiler, boolean newEnvironment,
+ Environment env) {
+ super("ecc", "-V", isLibtool, libtoolCompiler, newEnvironment, env);
+ }
+ public Processor changeEnvironment(boolean newEnvironment, Environment env) {
+ if (newEnvironment || env != null) {
+ return new IntelLinux64CCompiler(getLibtool(),
+ (IntelLinux64CCompiler) this.getLibtoolCompiler(),
+ newEnvironment, env);
+ }
+ return this;
+ }
+ public Linker getLinker(LinkType type) {
+ return IntelLinux64Linker.getInstance().getLinker(type);
+ }
+ public int getMaximumCommandLength() {
+ return Integer.MAX_VALUE;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelLinux64Linker.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelLinux64Linker.java
new file mode 100644
index 0000000..f381403
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelLinux64Linker.java
@@ -0,0 +1,55 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.intel;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.gcc.AbstractLdLinker;
+import net.sf.antcontrib.cpptasks.gcc.GccLibrarian;
+/**
+ * Adapter for the Intel (r) linker for Linux for IA-64
+ *
+ * @author Curt Arnold
+ */
+public final class IntelLinux64Linker extends AbstractLdLinker {
+ private static final String[] discardFiles = new String[0];
+ private static final String[] libtoolObjFiles = new String[]{".fo", ".a",
+ ".lib", ".dll", ".so", ".sl"};
+ private static final String[] objFiles = new String[]{".o", ".a", ".lib",
+ ".dll", ".so", ".sl"};
+ private static final IntelLinux64Linker dllLinker = new IntelLinux64Linker(
+ "lib", ".so", false, new IntelLinux64Linker("lib", ".so", true,
+ null));
+ private static final IntelLinux64Linker instance = new IntelLinux64Linker(
+ "", "", false, null);
+ public static IntelLinux64Linker getInstance() {
+ return instance;
+ }
+ private IntelLinux64Linker(String outputPrefix, String outputSuffix,
+ boolean isLibtool, IntelLinux64Linker libtoolLinker) {
+ super("ecc", "-V", objFiles, discardFiles, outputPrefix, outputSuffix,
+ isLibtool, libtoolLinker);
+ }
+ public Linker getLinker(LinkType type) {
+ if (type.isStaticLibrary()) {
+ return GccLibrarian.getInstance();
+ }
+ if (type.isSharedLibrary()) {
+ return dllLinker;
+ }
+ return instance;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelProcessor.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelProcessor.java
new file mode 100644
index 0000000..d1b4eaf
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelProcessor.java
@@ -0,0 +1,51 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.intel;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.devstudio.DevStudioProcessor;
+/**
+ * A add-in class for Intel (r) compilers and linkers
+ *
+ *
+ */
+public class IntelProcessor {
+ public static void addWarningSwitch(Vector args, int level) {
+ DevStudioProcessor.addWarningSwitch(args, level);
+ }
+ public static String getCommandFileSwitch(String cmdFile) {
+ return DevStudioProcessor.getCommandFileSwitch(cmdFile);
+ }
+ public static void getDefineSwitch(StringBuffer buffer, String define,
+ String value) {
+ DevStudioProcessor.getDefineSwitch(buffer, define, value);
+ }
+ public static String getIncludeDirSwitch(String includeDir) {
+ return DevStudioProcessor.getIncludeDirSwitch(includeDir);
+ }
+ public static String[] getOutputFileSwitch(String outPath) {
+ return DevStudioProcessor.getOutputFileSwitch(outPath);
+ }
+ public static void getUndefineSwitch(StringBuffer buffer, String define) {
+ DevStudioProcessor.getUndefineSwitch(buffer, define);
+ }
+ public static boolean isCaseSensitive() {
+ return false;
+ }
+ private IntelProcessor() {
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelWin32Aslcompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelWin32Aslcompiler.java
new file mode 100644
index 0000000..5255cb9
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelWin32Aslcompiler.java
@@ -0,0 +1,66 @@
+/*
+ *
+ * Copyright 2001-2005 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.intel;
+
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.compiler.CommandLineAslcompiler;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.devstudio.DevStudioLinker;
+/**
+ * Adapter for Intel ASL compiler
+ *
+ */
+public final class IntelWin32Aslcompiler extends CommandLineAslcompiler{
+ private final static String[] sourceExtensions = new String[]{".asl"};
+ private final static String[] headerExtensions = new String[]{};
+ private final static String[] defaultflags = new String[]{};
+ private static final IntelWin32Aslcompiler instance = new IntelWin32Aslcompiler("iasl",
+ sourceExtensions, headerExtensions, false);
+
+ /**
+ * Gets gcc adapter
+ */
+ public static IntelWin32Aslcompiler getInstance() {
+ return instance;
+ }
+
+ /**
+ * Private constructor. Use GccAssembler.getInstance() to get singleton
+ * instance of this class.
+ */
+ private IntelWin32Aslcompiler(String command, String[] sourceExtensions,
+ String[] headerExtensions, boolean isLibtool){
+ super(command, null, sourceExtensions, headerExtensions,
+ ".aml");
+ }
+ public void addImpliedArgs(Vector args, boolean debug,
+ Boolean defaultflag){
+ if (defaultflag != null && defaultflag.booleanValue()) {
+ for (int i = 0; i < defaultflags.length; i++) {
+ args.addElement(defaultflags[i]);
+ }
+ }
+ }
+ public int getMaximumCommandLength() {
+ return Integer.MAX_VALUE;
+ }
+ public Linker getLinker(LinkType linkType) {
+ return DevStudioLinker.getInstance().getLinker(linkType);
+ }
+} \ No newline at end of file
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelWin32CCompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelWin32CCompiler.java
new file mode 100644
index 0000000..7aef799
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelWin32CCompiler.java
@@ -0,0 +1,53 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.intel;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.compiler.Processor;
+import net.sf.antcontrib.cpptasks.devstudio.DevStudioCompatibleCCompiler;
+
+import org.apache.tools.ant.types.Environment;
+/**
+ * Adapter for the Intel (r) C++ compiler for 32-bit applications
+ *
+ * The Intel (r) C++ compiler for IA32 Windows mimics the command options for
+ * the Microsoft (r) C++ compiler.
+ *
+ * @author Curt Arnold
+ */
+public final class IntelWin32CCompiler extends DevStudioCompatibleCCompiler {
+ private static final IntelWin32CCompiler instance = new IntelWin32CCompiler(
+ false, null);
+ public static IntelWin32CCompiler getInstance() {
+ return instance;
+ }
+ private IntelWin32CCompiler(boolean newEnvironment, Environment env) {
+ super("icl", null, newEnvironment, env);
+ }
+ public Processor changeEnvironment(boolean newEnvironment, Environment env) {
+ if (newEnvironment || env != null) {
+ return new IntelWin32CCompiler(newEnvironment, env);
+ }
+ return this;
+ }
+ public Linker getLinker(LinkType type) {
+ return IntelWin32Linker.getInstance().getLinker(type);
+ }
+ public int getMaximumCommandLength() {
+ return 1024;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelWin32Librarian.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelWin32Librarian.java
new file mode 100644
index 0000000..e83da1c
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelWin32Librarian.java
@@ -0,0 +1,38 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.intel;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.devstudio.DevStudioCompatibleLibrarian;
+/**
+ * Adapter for the xilib from the Intel(r) C++ Compiler for IA-32 or IA-64
+ * systems running Microsoft (r) operating systems
+ *
+ * @author Curt Arnold
+ */
+public class IntelWin32Librarian extends DevStudioCompatibleLibrarian {
+ private static final IntelWin32Librarian instance = new IntelWin32Librarian();
+ public static IntelWin32Librarian getInstance() {
+ return instance;
+ }
+ protected IntelWin32Librarian() {
+ super("xilib", "/bogus");
+ }
+ public Linker getLinker(LinkType type) {
+ return IntelWin32Linker.getInstance().getLinker(type);
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelWin32Linker.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelWin32Linker.java
new file mode 100644
index 0000000..51258e2
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelWin32Linker.java
@@ -0,0 +1,46 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.intel;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.devstudio.DevStudioCompatibleLinker;
+/**
+ * Adapter for the Intel (r) linker for 32-bit applications
+ *
+ * @author Curt Arnold
+ */
+public final class IntelWin32Linker extends DevStudioCompatibleLinker {
+ private static final IntelWin32Linker dllLinker = new IntelWin32Linker(
+ ".dll");
+ private static final IntelWin32Linker instance = new IntelWin32Linker(
+ ".exe");
+ public static IntelWin32Linker getInstance() {
+ return instance;
+ }
+ private IntelWin32Linker(String outputSuffix) {
+ super("xilink", "/bogus", outputSuffix);
+ }
+ public Linker getLinker(LinkType type) {
+ if (type.isStaticLibrary()) {
+ return IntelWin32Librarian.getInstance();
+ }
+ if (type.isSharedLibrary()) {
+ return dllLinker;
+ }
+ return instance;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelWin64CCompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelWin64CCompiler.java
new file mode 100644
index 0000000..9b8d2c9
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelWin64CCompiler.java
@@ -0,0 +1,53 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.intel;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.compiler.Processor;
+import net.sf.antcontrib.cpptasks.devstudio.DevStudioCompatibleCCompiler;
+
+import org.apache.tools.ant.types.Environment;
+/**
+ * Adapter for the Intel C++ compiler for Itanium(TM) Applications
+ *
+ * @author Curt Arnold
+ */
+public final class IntelWin64CCompiler extends DevStudioCompatibleCCompiler {
+ private static final IntelWin64CCompiler instance = new IntelWin64CCompiler(
+ false, null);
+ public static IntelWin64CCompiler getInstance() {
+ return instance;
+ }
+ private IntelWin64CCompiler(boolean newEnvironment, Environment env) {
+ super("ecl", null, newEnvironment, env);
+ }
+ public Processor changeEnvironment(boolean newEnvironment, Environment env) {
+ if (newEnvironment || env != null) {
+ return new IntelWin64CCompiler(newEnvironment, env);
+ }
+ return this;
+ }
+ public Linker getLinker(LinkType type) {
+ //
+ // currently the Intel Win32 and Win64 linkers
+ // are command line equivalent
+ return IntelWin32Linker.getInstance().getLinker(type);
+ }
+ public int getMaximumCommandLength() {
+ return 1024;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/os390/OS390CCompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/os390/OS390CCompiler.java
new file mode 100644
index 0000000..633b55e
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/os390/OS390CCompiler.java
@@ -0,0 +1,157 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.os390;
+import java.io.File;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.CompilerDef;
+import net.sf.antcontrib.cpptasks.compiler.AbstractCompiler;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineCCompiler;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.compiler.Processor;
+import net.sf.antcontrib.cpptasks.types.DefineArgument;
+import net.sf.antcontrib.cpptasks.types.UndefineArgument;
+import net.sf.antcontrib.cpptasks.OptimizationEnum;
+
+
+import org.apache.tools.ant.types.Environment;
+/**
+ * Adapter for the IBM (R) OS/390 (tm) C++ Compiler
+ *
+ * @author Hiram Chirino (cojonudo14@hotmail.com)
+ */
+public class OS390CCompiler extends CommandLineCCompiler {
+ private static final AbstractCompiler instance = new OS390CCompiler(false,
+ null);
+ public static AbstractCompiler getInstance() {
+ return instance;
+ }
+ private OS390CCompiler(boolean newEnvironment, Environment env) {
+ super("cxx", null, new String[]{".c", ".cc", ".cpp", ".cxx", ".c++",
+ ".s"}, new String[]{".h", ".hpp"}, ".o", false, null,
+ newEnvironment, env);
+ }
+ protected void addImpliedArgs(final Vector args,
+ final boolean debug,
+ final boolean multithreaded,
+ final boolean exceptions,
+ final LinkType linkType,
+ final Boolean rtti,
+ final OptimizationEnum optimization,
+ final Boolean defaultflag) {
+ // Specifies that only compilations and assemblies be done.
+ // Link-edit is not done
+ args.addElement("-c");
+ args.addElement("-W");
+ args.addElement("c,NOEXPMAC,NOSHOWINC");
+ /*
+ * if (exceptions) { args.addElement("/GX"); }
+ */
+ if (debug) {
+ args.addElement("-g");
+ args.addElement("-D");
+ args.addElement("_DEBUG");
+ /*
+ * if (multithreaded) { args.addElement("/D_MT"); if (staticLink) {
+ * args.addElement("/MTd"); } else { args.addElement("/MDd");
+ * args.addElement("/D_DLL"); } } else { args.addElement("/MLd"); }
+ */
+ } else {
+ args.addElement("-D");
+ args.addElement("NEBUG");
+ /*
+ * if (multithreaded) { args.addElement("/D_MT"); if (staticLink) {
+ * args.addElement("/MT"); } else { args.addElement("/MD");
+ * args.addElement("/D_DLL"); } } else { args.addElement("/ML"); }
+ */
+ }
+ }
+ protected void addWarningSwitch(Vector args, int level) {
+ OS390Processor.addWarningSwitch(args, level);
+ }
+ /**
+ * The buildDefineArguments implementation CommandLineCCompiler is not good
+ * for us because os390 defines are give by -D definex instead of
+ * /Ddefinex, 2 args not 1! since we implement this ourslefs, we do not
+ * have to implement the getDefineSwitch() and the getUndefineSwitch().
+ */
+ protected void buildDefineArguments(CompilerDef[] defs, Vector args) {
+ //
+ // assume that we aren't inheriting defines from containing <cc>
+ //
+ UndefineArgument[] merged = defs[0].getActiveDefines();
+ for (int i = 1; i < defs.length; i++) {
+ //
+ // if we are inheriting, merge the specific defines with the
+ // containing defines
+ merged = DefineArgument.merge(defs[i].getActiveDefines(), merged);
+ }
+ StringBuffer buf = new StringBuffer(30);
+ for (int i = 0; i < merged.length; i++) {
+ buf.setLength(0);
+ UndefineArgument current = merged[i];
+ if (current.isDefine()) {
+ args.addElement("-D");
+ buf.append(current.getName());
+ if (current.getValue() != null
+ && current.getValue().length() > 0) {
+ buf.append('=');
+ buf.append(current.getValue());
+ }
+ args.addElement(buf.toString());
+ } else {
+ args.addElement("-U");
+ args.addElement(current.getName());
+ }
+ }
+ }
+ public Processor changeEnvironment(boolean newEnvironment, Environment env) {
+ if (newEnvironment || env != null) {
+ return new OS390CCompiler(newEnvironment, env);
+ }
+ return this;
+ }
+ /*
+ * @see CommandLineCompiler#getDefineSwitch(StringBuffer, String, String)
+ */
+ protected void getDefineSwitch(StringBuffer buffer, String define,
+ String value) {
+ }
+ protected File[] getEnvironmentIncludePath() {
+ return CUtil.getPathFromEnvironment("INCLUDE", ":");
+ }
+ protected String getIncludeDirSwitch(String includeDir) {
+ return OS390Processor.getIncludeDirSwitch(includeDir);
+ }
+ public Linker getLinker(LinkType type) {
+ return OS390Linker.getInstance().getLinker(type);
+ }
+ public int getMaximumCommandLength() {
+ return Integer.MAX_VALUE;
+ }
+ /* Only compile one file at time for now */
+ protected int getMaximumInputFilesPerCommand() {
+ return Integer.MAX_VALUE;
+ }
+ /*
+ * @see CommandLineCompiler#getUndefineSwitch(StringBuffer, String)
+ */
+ protected void getUndefineSwitch(StringBuffer buffer, String define) {
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/os390/OS390Linker.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/os390/OS390Linker.java
new file mode 100644
index 0000000..f6653b7
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/os390/OS390Linker.java
@@ -0,0 +1,201 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.os390;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CCTask;
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineLinker;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineLinkerConfiguration;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.types.LibrarySet;
+import net.sf.antcontrib.cpptasks.types.LibraryTypeEnum;
+
+import org.apache.tools.ant.BuildException;
+/**
+ * Adapter for the IBM (R) OS/390 (tm) Linker
+ *
+ * @author Hiram Chirino (cojonudo14@hotmail.com)
+ */
+public final class OS390Linker extends CommandLineLinker {
+ private static final OS390Linker datasetLinker = new OS390Linker();
+ private static final OS390Linker dllLinker = new OS390Linker("", ".dll");
+ private static final OS390Linker instance = new OS390Linker("", "");
+ public static OS390Linker getDataSetInstance() {
+ return datasetLinker;
+ }
+ public static OS390Linker getInstance() {
+ return instance;
+ }
+ private boolean isADatasetLinker;
+ File outputFile;
+ private String outputPrefix;
+ CCTask task;
+ private OS390Linker() {
+ super("cxx", "/bogus", new String[]{".o", ".a", ".lib", ".xds"},
+ new String[]{".dll", ".x"}, ".xds", false, null);
+ this.outputPrefix = "";
+ this.isADatasetLinker = true;
+ }
+ private OS390Linker(String outputPrefix, String outputSuffix) {
+ super("cxx", "/bogus", new String[]{".o", ".a", ".lib", ".x"},
+ new String[]{".dll"}, outputSuffix, false, null);
+ this.outputPrefix = outputPrefix;
+ this.isADatasetLinker = false;
+ }
+ protected void addBase(long base, Vector args) {
+ }
+ protected void addFixed(Boolean fixed, Vector args) {
+ }
+ protected void addImpliedArgs(boolean debug, LinkType linkType, Vector args, Boolean defaultflag) {
+ if (linkType.isSharedLibrary()) {
+ args.addElement("-W");
+ args.addElement("l,DLL");
+ }
+ }
+ protected void addIncremental(boolean incremental, Vector args) {
+ }
+ /*
+ * @see CommandLineLinker#addLibrarySets(LibrarySet[], Vector, Vector,
+ * Vector)
+ */
+ protected String[] addLibrarySets(CCTask task, LibrarySet[] libsets,
+ Vector preargs, Vector midargs, Vector endargs) {
+ // If yo want to link against a library sitting in a dataset and
+ // not in the HFS, you can just use the //'dataset' notation
+ // to specify it. e.g:
+ // <libset dir="." libs="//'MQM.V5R2M0.SCSQLOAD'"/>
+ //
+ // We have to have special handling here because the file is not
+ // on the normal filesystem so the task will not noramly include it
+ // as part of the link command.
+ if (libsets != null) {
+ for (int i = 0; i < libsets.length; i++) {
+ String libs[] = libsets[i].getLibs();
+ for (int j = 0; j < libs.length; j++) {
+ if (libs[j].startsWith("//")) {
+ endargs.addElement("-l");
+ endargs.addElement(libs[j]);
+ } else if (libsets[i].getDataset() != null) {
+ String ds = libsets[i].getDataset();
+ endargs.addElement("//'" + ds + "(" + libs[j] + ")'");
+ }
+ }
+ }
+ }
+ return super.addLibrarySets(task, libsets, preargs, midargs, endargs);
+ }
+ protected void addMap(boolean map, Vector args) {
+ }
+ protected void addStack(int stack, Vector args) {
+ }
+ protected void addEntry(String entry, Vector args) {
+ }
+
+ public String getCommandFileSwitch(String commandFile) {
+ return "@" + commandFile;
+ }
+ public File[] getLibraryPath() {
+ return CUtil.getPathFromEnvironment("LIB", ";");
+ }
+
+ public String[] getLibraryPatterns(String[] libnames, LibraryTypeEnum libType) {
+ StringBuffer buf = new StringBuffer();
+ String[] patterns = new String[libnames.length * 3];
+ int offset = addLibraryPatterns(libnames, buf, "lib", ".a", patterns, 0);
+ offset = addLibraryPatterns(libnames, buf, "", ".x", patterns, offset);
+ offset = addLibraryPatterns(libnames, buf, "", ".o", patterns, offset);
+ return patterns;
+ }
+
+ private static int addLibraryPatterns(String[] libnames, StringBuffer buf,
+ String prefix, String extension, String[] patterns, int offset) {
+ for (int i = 0; i < libnames.length; i++) {
+ buf.setLength(0);
+ buf.append(prefix);
+ buf.append(libnames[i]);
+ buf.append(extension);
+ patterns[offset + i] = buf.toString();
+ }
+ return offset + libnames.length;
+ }
+
+ public Linker getLinker(LinkType linkType) {
+ if (this == datasetLinker)
+ return datasetLinker;
+ if (linkType.isSharedLibrary())
+ return dllLinker;
+ return instance;
+ }
+ public int getMaximumCommandLength() {
+ return Integer.MAX_VALUE;
+ }
+ public String getOutputFileName(String baseName) {
+ return outputPrefix + super.getOutputFileName(baseName);
+ }
+ protected String[] getOutputFileSwitch(CCTask task, String outputFile) {
+ if (isADatasetLinker && task.getDataset() != null) {
+ String ds = task.getDataset();
+ outputFile = "//'" + ds + "(" + outputFile + ")'";
+ }
+ return getOutputFileSwitch(outputFile);
+ }
+ public String[] getOutputFileSwitch(String outputFile) {
+ return new String[]{"-o", outputFile};
+ }
+ public boolean isCaseSensitive() {
+ return OS390Processor.isCaseSensitive();
+ }
+ /*
+ * @see CommandLineLinker#link(Task, File, String[],
+ * CommandLineLinkerConfiguration)
+ */
+ public void link(CCTask task, File outputFile, String[] sourceFiles,
+ CommandLineLinkerConfiguration config) throws BuildException {
+ this.task = task;
+ this.outputFile = outputFile;
+ if (isADatasetLinker) {
+ int p = outputFile.getName().indexOf(".");
+ if (p >= 0) {
+ String newname = outputFile.getName().substring(0, p);
+ outputFile = new File(outputFile.getParent(), newname);
+ }
+ }
+ super.link(task, outputFile, sourceFiles, config);
+ }
+ /*
+ * @see CommandLineLinker#runCommand(Task, File, String[])
+ */
+ protected int runCommand(CCTask task, File workingDir, String[] cmdline)
+ throws BuildException {
+ int rc = super.runCommand(task, workingDir, cmdline);
+ // create the .xds file if everything was ok.
+ if (rc == 0) {
+ try {
+ outputFile.delete();
+ new FileOutputStream(outputFile).close();
+ } catch (IOException e) {
+ throw new BuildException(e.getMessage());
+ }
+ }
+ return rc;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/os390/OS390Processor.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/os390/OS390Processor.java
new file mode 100644
index 0000000..2c209dd
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/os390/OS390Processor.java
@@ -0,0 +1,71 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.os390;
+import java.util.Vector;
+/**
+ * A add-in class for IBM (r) OS/390 compilers and linkers
+ *
+ * @author Hiram Chirino (cojonudo14@hotmail.com)
+ */
+public class OS390Processor {
+ public static void addWarningSwitch(Vector args, int level) {
+ switch (level) {
+ /*
+ * case 0: args.addElement("/W0"); break;
+ *
+ * case 1: args.addElement("/W1"); break;
+ *
+ * case 2: break;
+ *
+ * case 3: args.addElement("/W3"); break;
+ *
+ * case 4: args.addElement("/W4"); break;
+ */
+ }
+ }
+ public static String getCommandFileSwitch(String cmdFile) {
+ StringBuffer buf = new StringBuffer("@");
+ if (cmdFile.indexOf(' ') >= 0) {
+ buf.append('\"');
+ buf.append(cmdFile);
+ buf.append('\"');
+ } else {
+ buf.append(cmdFile);
+ }
+ return buf.toString();
+ }
+ public static String getIncludeDirSwitch(String includeDir) {
+ return "-I" + includeDir;
+ }
+ public static String[] getOutputFileSwitch(String outPath) {
+ StringBuffer buf = new StringBuffer("-o ");
+ if (outPath.indexOf(' ') >= 0) {
+ buf.append('\"');
+ buf.append(outPath);
+ buf.append('\"');
+ } else {
+ buf.append(outPath);
+ }
+ String[] retval = new String[]{buf.toString()};
+ return retval;
+ }
+ public static boolean isCaseSensitive() {
+ return true;
+ }
+ private OS390Processor() {
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/os400/IccCompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/os400/IccCompiler.java
new file mode 100644
index 0000000..f40858f
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/os400/IccCompiler.java
@@ -0,0 +1,124 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.os400;
+import java.io.File;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.compiler.AbstractCompiler;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineCCompiler;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.compiler.Processor;
+import net.sf.antcontrib.cpptasks.OptimizationEnum;
+
+
+import org.apache.tools.ant.types.Environment;
+/**
+ * Adapter for the IBM (R) OS/390 (tm) C++ Compiler
+ *
+ * @author Hiram Chirino (cojonudo14@hotmail.com)
+ */
+public class IccCompiler extends CommandLineCCompiler {
+ private static final AbstractCompiler instance = new IccCompiler(false,
+ null);
+ public static AbstractCompiler getInstance() {
+ return instance;
+ }
+ private IccCompiler(boolean newEnvironment, Environment env) {
+ super("icc", null, new String[]{".c", ".cc", ".cpp", ".cxx", ".c++",
+ ".s"}, new String[]{".h", ".hpp"}, ".o", false, null,
+ newEnvironment, env);
+ }
+ protected void addImpliedArgs(final Vector args,
+ final boolean debug,
+ final boolean multithreaded,
+ final boolean exceptions,
+ final LinkType linkType,
+ final Boolean rtti,
+ final OptimizationEnum optimization,
+ final Boolean defaultflag) {
+ // Specifies that only compilations and assemblies be done.
+ // Link-edit is not done
+ args.addElement("-c");
+ /*
+ * if (exceptions) { args.addElement("/GX"); }
+ */
+ if (debug) {
+ args.addElement("-g");
+ /*
+ * args.addElement("-D"); args.addElement("_DEBUG"); if
+ * (multithreaded) { args.addElement("/D_MT"); if (staticLink) {
+ * args.addElement("/MTd"); } else { args.addElement("/MDd");
+ * args.addElement("/D_DLL"); } } else { args.addElement("/MLd"); }
+ */
+ } else {
+ /*
+ * args.addElement("-D"); args.addElement("NEBUG"); if
+ * (multithreaded) { args.addElement("/D_MT"); if (staticLink) {
+ * args.addElement("/MT"); } else { args.addElement("/MD");
+ * args.addElement("/D_DLL"); } } else { args.addElement("/ML"); }
+ */
+ }
+ }
+ protected void addWarningSwitch(Vector args, int level) {
+ IccProcessor.addWarningSwitch(args, level);
+ }
+ public Processor changeEnvironment(boolean newEnvironment, Environment env) {
+ if (newEnvironment || env != null) {
+ return new IccCompiler(newEnvironment, env);
+ }
+ return this;
+ }
+ /*
+ * @see CommandLineCompiler#getDefineSwitch(StringBuffer, String, String)
+ */
+ protected void getDefineSwitch(StringBuffer buffer, String define,
+ String value) {
+ buffer.append("-q");
+ buffer.append(define);
+ if (value != null && value.length() > 0) {
+ buffer.append('=');
+ buffer.append(value);
+ }
+ }
+ protected File[] getEnvironmentIncludePath() {
+ return CUtil.getPathFromEnvironment("INCLUDE", ":");
+ }
+ protected String getIncludeDirSwitch(String includeDir) {
+ return IccProcessor.getIncludeDirSwitch(includeDir);
+ }
+ public Linker getLinker(LinkType type) {
+ return IccLinker.getInstance().getLinker(type);
+ }
+ public int getMaximumCommandLength() {
+ return Integer.MAX_VALUE;
+ }
+ /* Only compile one file at time for now */
+ protected int getMaximumInputFilesPerCommand() {
+ return 1;
+ //return Integer.MAX_VALUE;
+ }
+ /*
+ * @see CommandLineCompiler#getUndefineSwitch(StringBuffer, String)
+ */
+ protected void getUndefineSwitch(StringBuffer buffer, String define) {
+ /*
+ * buffer.addElement("-q"); buf.append(define);
+ */
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/os400/IccLinker.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/os400/IccLinker.java
new file mode 100644
index 0000000..5e4e2f2
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/os400/IccLinker.java
@@ -0,0 +1,202 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.os400;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Vector;
+import net.sf.antcontrib.cpptasks.CCTask;
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineLinker;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineLinkerConfiguration;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.types.LibrarySet;
+import net.sf.antcontrib.cpptasks.types.LibraryTypeEnum;
+import org.apache.tools.ant.BuildException;
+/**
+ * Adapter for the IBM (R) OS/390 (tm) Linker
+ *
+ * @author Hiram Chirino (cojonudo14@hotmail.com)
+ */
+public final class IccLinker extends CommandLineLinker {
+ private static final IccLinker datasetLinker = new IccLinker();
+ private static final IccLinker dllLinker = new IccLinker("", ".dll");
+ private static final IccLinker instance = new IccLinker("", "");
+ public static IccLinker getDataSetInstance() {
+ return datasetLinker;
+ }
+ public static IccLinker getInstance() {
+ return instance;
+ }
+ private boolean isADatasetLinker;
+ File outputFile;
+ private String outputPrefix;
+ CCTask task;
+ private IccLinker() {
+ super("icc", "/bogus", new String[]{".o", ".a", ".lib", ".xds"},
+ new String[]{".dll", ".x"}, ".xds", false, null);
+ this.outputPrefix = "";
+ this.isADatasetLinker = true;
+ }
+ private IccLinker(String outputPrefix, String outputSuffix) {
+ super("icc", "/bogus", new String[]{".o", ".a", ".lib", ".x"},
+ new String[]{".dll"}, outputSuffix, false, null);
+ this.outputPrefix = outputPrefix;
+ this.isADatasetLinker = false;
+ }
+ protected void addBase(long base, Vector args) {
+ }
+ protected void addFixed(Boolean fixed, Vector args) {
+ }
+ protected void addImpliedArgs(boolean debug, LinkType linkType, Vector args, Boolean defaultflag) {
+ if (linkType.isSharedLibrary()) {
+ args.addElement("-W");
+ args.addElement("l,DLL");
+ }
+ }
+ protected void addIncremental(boolean incremental, Vector args) {
+ }
+ /*
+ * @see CommandLineLinker#addLibrarySets(LibrarySet[], Vector, Vector,
+ * Vector)
+ */
+ protected String[] addLibrarySets(CCTask task, LibrarySet[] libsets,
+ Vector preargs, Vector midargs, Vector endargs) {
+ // If yo want to link against a library sitting in a dataset and
+ // not in the HFS, you can just use the //'dataset' notation
+ // to specify it. e.g:
+ // <libset dir="." libs="//'MQM.V5R2M0.SCSQLOAD'"/>
+ //
+ // We have to have special handling here because the file is not
+ // on the normal filesystem so the task will not noramly include it
+ // as part of the link command.
+ if (libsets != null) {
+ for (int i = 0; i < libsets.length; i++) {
+ String libs[] = libsets[i].getLibs();
+ for (int j = 0; j < libs.length; j++) {
+ if (libs[j].startsWith("//")) {
+ endargs.addElement("-l");
+ endargs.addElement(libs[j]);
+ } else if (libsets[i].getDataset() != null) {
+ String ds = libsets[i].getDataset();
+ endargs.addElement("//'" + ds + "(" + libs[j] + ")'");
+ }
+ }
+ }
+ }
+ return super.addLibrarySets(task, libsets, preargs, midargs, endargs);
+ }
+ protected void addMap(boolean map, Vector args) {
+ }
+ protected void addStack(int stack, Vector args) {
+ }
+ /* (non-Javadoc)
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addEntry(int, java.util.Vector)
+ */
+ protected void addEntry(String entry, Vector args) {
+ }
+
+ public String getCommandFileSwitch(String commandFile) {
+ return "@" + commandFile;
+ }
+ public File[] getLibraryPath() {
+ return CUtil.getPathFromEnvironment("LIB", ";");
+ }
+ public String[] getLibraryPatterns(String[] libnames, LibraryTypeEnum libType) {
+ StringBuffer buf = new StringBuffer();
+ String[] patterns = new String[libnames.length * 3];
+ int offset = addLibraryPatterns(libnames, buf, "lib", ".a", patterns, 0);
+ offset = addLibraryPatterns(libnames, buf, "", ".x", patterns, offset);
+ offset = addLibraryPatterns(libnames, buf, "", ".o", patterns, offset);
+ return patterns;
+ }
+
+ private static int addLibraryPatterns(String[] libnames, StringBuffer buf,
+ String prefix, String extension, String[] patterns, int offset) {
+ for (int i = 0; i < libnames.length; i++) {
+ buf.setLength(0);
+ buf.append(prefix);
+ buf.append(libnames[i]);
+ buf.append(extension);
+ patterns[offset + i] = buf.toString();
+ }
+ return offset + libnames.length;
+ }
+
+
+ public Linker getLinker(LinkType linkType) {
+ if (this == datasetLinker)
+ return datasetLinker;
+ if (linkType.isSharedLibrary())
+ return dllLinker;
+ return instance;
+ }
+ public int getMaximumCommandLength() {
+ return Integer.MAX_VALUE;
+ }
+ protected String[] getOutputFileSwitch(CCTask task, String outputFile) {
+ if (isADatasetLinker && task.getDataset() != null) {
+ String ds = task.getDataset();
+ outputFile = "//'" + ds + "(" + outputFile + ")'";
+ }
+ return getOutputFileSwitch(outputFile);
+ }
+ public String[] getOutputFileSwitch(String outputFile) {
+ return new String[]{"-o", outputFile};
+ }
+ public boolean isCaseSensitive() {
+ return IccProcessor.isCaseSensitive();
+ }
+ /*
+ * @see CommandLineLinker#link(Task, File, String[],
+ * CommandLineLinkerConfiguration)
+ */
+ public void link(CCTask task, File outputFile, String[] sourceFiles,
+ CommandLineLinkerConfiguration config) throws BuildException {
+ this.task = task;
+ this.outputFile = outputFile;
+ if (isADatasetLinker) {
+ int p = outputFile.getName().indexOf(".");
+ if (p >= 0) {
+ String newname = outputFile.getName().substring(0, p);
+ outputFile = new File(outputFile.getParent(), newname);
+ }
+ }
+ super.link(task, outputFile, sourceFiles, config);
+ }
+ /*
+ * @see CommandLineLinker#runCommand(Task, File, String[])
+ */
+ protected int runCommand(CCTask task, File workingDir, String[] cmdline)
+ throws BuildException {
+ int rc = super.runCommand(task, workingDir, cmdline);
+ // create the .xds file if everything was ok.
+ if (rc == 0) {
+ try {
+ outputFile.delete();
+ new FileOutputStream(outputFile).close();
+ } catch (IOException e) {
+ throw new BuildException(e.getMessage());
+ }
+ }
+ return rc;
+ }
+ public String xgetOutputFileName(String baseName) {
+ return outputPrefix + super.getOutputFileName(baseName);
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/os400/IccProcessor.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/os400/IccProcessor.java
new file mode 100644
index 0000000..4cc7b36
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/os400/IccProcessor.java
@@ -0,0 +1,71 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.os400;
+import java.util.Vector;
+/**
+ * A add-in class for IBM (r) OS/390 compilers and linkers
+ *
+ * @author Hiram Chirino (cojonudo14@hotmail.com)
+ */
+public class IccProcessor {
+ public static void addWarningSwitch(Vector args, int level) {
+ switch (level) {
+ /*
+ * case 0: args.addElement("/W0"); break;
+ *
+ * case 1: args.addElement("/W1"); break;
+ *
+ * case 2: break;
+ *
+ * case 3: args.addElement("/W3"); break;
+ *
+ * case 4: args.addElement("/W4"); break;
+ */
+ }
+ }
+ public static String getCommandFileSwitch(String cmdFile) {
+ StringBuffer buf = new StringBuffer("@");
+ if (cmdFile.indexOf(' ') >= 0) {
+ buf.append('\"');
+ buf.append(cmdFile);
+ buf.append('\"');
+ } else {
+ buf.append(cmdFile);
+ }
+ return buf.toString();
+ }
+ public static String getIncludeDirSwitch(String includeDir) {
+ return "-I" + includeDir;
+ }
+ public static String[] getOutputFileSwitch(String outPath) {
+ StringBuffer buf = new StringBuffer("-o ");
+ if (outPath.indexOf(' ') >= 0) {
+ buf.append('\"');
+ buf.append(outPath);
+ buf.append('\"');
+ } else {
+ buf.append(outPath);
+ }
+ String[] retval = new String[]{buf.toString()};
+ return retval;
+ }
+ public static boolean isCaseSensitive() {
+ return true;
+ }
+ private IccProcessor() {
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/AbstractParser.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/AbstractParser.java
new file mode 100644
index 0000000..6f0b79c
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/AbstractParser.java
@@ -0,0 +1,67 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.parser;
+import java.io.IOException;
+import java.io.Reader;
+/**
+ * An abstract base class for simple parsers
+ *
+ * @author Curt Arnold
+ */
+public abstract class AbstractParser {
+ /**
+ *
+ *
+ */
+ protected AbstractParser() {
+ }
+ protected abstract void addFilename(String filename);
+ public abstract AbstractParserState getNewLineState();
+ protected void parse(Reader reader) throws IOException {
+ char[] buf = new char[4096];
+ AbstractParserState newLineState = getNewLineState();
+ AbstractParserState state = newLineState;
+ int charsRead = -1;
+ do {
+ charsRead = reader.read(buf, 0, buf.length);
+ if (state == null) {
+ for (int i = 0; i < charsRead; i++) {
+ if (buf[i] == '\n') {
+ state = newLineState;
+ break;
+ }
+ }
+ }
+ if (state != null) {
+ for (int i = 0; i < charsRead; i++) {
+ state = state.consume(buf[i]);
+ //
+ // didn't match a production, skip to a new line
+ //
+ if (state == null) {
+ for (; i < charsRead; i++) {
+ if (buf[i] == '\n') {
+ state = newLineState;
+ break;
+ }
+ }
+ }
+ }
+ }
+ } while (charsRead >= 0);
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/AbstractParserState.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/AbstractParserState.java
new file mode 100644
index 0000000..fe66dbb
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/AbstractParserState.java
@@ -0,0 +1,41 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.parser;
+/**
+ * An base class for objects that represent the state of an AbstractParser.
+ *
+ * @author CurtArnold
+ * @see AbstractParser
+ */
+public abstract class AbstractParserState {
+ private AbstractParser parser;
+ protected AbstractParserState(AbstractParser parser) {
+ if (parser == null) {
+ throw new NullPointerException("parser");
+ }
+ this.parser = parser;
+ }
+ /**
+ * Consume a character
+ *
+ * @return new state, may be null to ignore the rest of the line
+ */
+ public abstract AbstractParserState consume(char ch);
+ protected AbstractParser getParser() {
+ return parser;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/BranchState.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/BranchState.java
new file mode 100644
index 0000000..370c7d5
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/BranchState.java
@@ -0,0 +1,46 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.parser;
+public class BranchState extends AbstractParserState {
+ private char[] branchChars;
+ private AbstractParserState[] branchStates;
+ private AbstractParserState noMatchState;
+ public BranchState(AbstractParser parser, char[] branchChars,
+ AbstractParserState[] branchStates, AbstractParserState noMatchState) {
+ super(parser);
+ this.branchChars = (char[]) branchChars.clone();
+ this.branchStates = (AbstractParserState[]) branchStates.clone();
+ this.noMatchState = noMatchState;
+ }
+ public AbstractParserState consume(char ch) {
+ AbstractParserState state;
+ for (int i = 0; i < branchChars.length; i++) {
+ if (ch == branchChars[i]) {
+ state = branchStates[i];
+ return state.consume(ch);
+ }
+ }
+ state = getNoMatchState();
+ if (state != null) {
+ return state.consume(ch);
+ }
+ return state;
+ }
+ protected AbstractParserState getNoMatchState() {
+ return noMatchState;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/CParser.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/CParser.java
new file mode 100644
index 0000000..07f8eba
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/CParser.java
@@ -0,0 +1,78 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.parser;
+import java.io.IOException;
+import java.io.Reader;
+import java.util.Vector;
+/**
+ * A parser that extracts #include statements from a Reader.
+ *
+ * @author Adam Murdoch
+ * @author Curt Arnold
+ */
+public final class CParser extends AbstractParser implements Parser {
+ private final Vector includes = new Vector();
+ private AbstractParserState newLineState;
+ /**
+ *
+ *
+ */
+ public CParser() {
+ AbstractParserState quote = new FilenameState(this, new char[]{'"'});
+ AbstractParserState bracket = new FilenameState(this, new char[]{'>'});
+ AbstractParserState postE = new PostE(this, bracket, quote);
+ //
+ // nclude
+ //
+ AbstractParserState e = new LetterState(this, 'e', postE, null);
+ AbstractParserState d = new LetterState(this, 'd', e, null);
+ AbstractParserState u = new LetterState(this, 'u', d, null);
+ AbstractParserState l = new LetterState(this, 'l', u, null);
+ AbstractParserState c = new LetterState(this, 'c', l, null);
+ AbstractParserState n = new LetterState(this, 'n', c, null);
+ //
+ // mport is equivalent to nclude
+ //
+ AbstractParserState t = new LetterState(this, 't', postE, null);
+ AbstractParserState r = new LetterState(this, 'r', t, null);
+ AbstractParserState o = new LetterState(this, 'o', r, null);
+ AbstractParserState p = new LetterState(this, 'p', o, null);
+ AbstractParserState m = new LetterState(this, 'm', p, null);
+ //
+ // switch between
+ //
+ AbstractParserState n_m = new BranchState(this, new char[]{'n', 'm'},
+ new AbstractParserState[]{n, m}, null);
+ AbstractParserState i = new WhitespaceOrLetterState(this, 'i', n_m);
+ newLineState = new LetterState(this, '#', i, null);
+ }
+ public void addFilename(String include) {
+ includes.addElement(include);
+ }
+ public String[] getIncludes() {
+ String[] retval = new String[includes.size()];
+ includes.copyInto(retval);
+ return retval;
+ }
+ public AbstractParserState getNewLineState() {
+ return newLineState;
+ }
+ public void parse(Reader reader) throws IOException {
+ includes.setSize(0);
+ super.parse(reader);
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/CaseInsensitiveLetterState.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/CaseInsensitiveLetterState.java
new file mode 100644
index 0000000..a86700f
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/CaseInsensitiveLetterState.java
@@ -0,0 +1,87 @@
+/*
+ *
+ * Copyright 2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.parser;
+
+/**
+ * This parser state checks consumed characters against a specific character
+ * (case insensitive).
+ *
+ * @author Curt Arnold
+ */
+public final class CaseInsensitiveLetterState
+ extends AbstractParserState {
+ /**
+ * Next state if a match is found.
+ */
+ private final AbstractParserState nextState;
+
+ /**
+ * Next state if not match is found.
+ */
+ private final AbstractParserState noMatchState;
+
+ /**
+ * Lower case version of character to match.
+ */
+ private final char lowerLetter;
+
+ /**
+ * Lower case version of character to match.
+ */
+ private final char upperLetter;
+
+ /**
+ * Constructor.
+ *
+ * @param parser
+ * parser
+ * @param matchLetter
+ * letter to match
+ * @param nextStateArg
+ * next state if a match on the letter
+ * @param noMatchStateArg
+ * state if no match on letter
+ */
+ public CaseInsensitiveLetterState(final AbstractParser parser,
+ final char matchLetter,
+ final AbstractParserState nextStateArg,
+ final AbstractParserState noMatchStateArg) {
+ super(parser);
+ this.lowerLetter = Character.toLowerCase(matchLetter);
+ this.upperLetter = Character.toUpperCase(matchLetter);
+ this.nextState = nextStateArg;
+ this.noMatchState = noMatchStateArg;
+ }
+
+ /**
+ * Consumes a character and returns the next state for the parser.
+ *
+ * @param ch
+ * next character
+ * @return the configured nextState if ch is the expected character or the
+ * configure noMatchState otherwise.
+ */
+ public AbstractParserState consume(final char ch) {
+ if (ch == lowerLetter || ch == upperLetter) {
+ return nextState;
+ }
+ if (ch == '\n') {
+ getParser().getNewLineState();
+ }
+ return noMatchState;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/FilenameState.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/FilenameState.java
new file mode 100644
index 0000000..f33940b
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/FilenameState.java
@@ -0,0 +1,41 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.parser;
+public class FilenameState extends AbstractParserState {
+ private final StringBuffer buf = new StringBuffer();
+ private final char[] terminators;
+ public FilenameState(AbstractParser parser, char[] terminators) {
+ super(parser);
+ this.terminators = (char[]) terminators.clone();
+ }
+ public AbstractParserState consume(char ch) {
+ for (int i = 0; i < terminators.length; i++) {
+ if (ch == terminators[i]) {
+ getParser().addFilename(buf.toString());
+ buf.setLength(0);
+ return null;
+ }
+ }
+ if (ch == '\n') {
+ buf.setLength(0);
+ return getParser().getNewLineState();
+ } else {
+ buf.append(ch);
+ }
+ return this;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/FortranParser.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/FortranParser.java
new file mode 100644
index 0000000..261e95a
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/FortranParser.java
@@ -0,0 +1,106 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.parser;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.util.Vector;
+
+/**
+ * A parser that extracts INCLUDE statements from a Reader.
+ *
+ * @author Curt Arnold
+ */
+public final class FortranParser
+ extends AbstractParser
+ implements Parser {
+ /**
+ * List of included filenames.
+ */
+ private final Vector includes = new Vector();
+
+ /**
+ * State that starts consuming content at the beginning of a line.
+ */
+ private final AbstractParserState newLineState;
+
+ /**
+ * Default constructor.
+ *
+ */
+ public FortranParser() {
+ AbstractParserState filename = new FilenameState(this, new char[] {'\'',
+ '/'});
+ AbstractParserState apos = new WhitespaceOrLetterState(this, '\'',
+ filename);
+ AbstractParserState blank = new LetterState(this, ' ', apos, null);
+ AbstractParserState e = new CaseInsensitiveLetterState(this, 'E',
+ blank, null);
+ AbstractParserState d = new CaseInsensitiveLetterState(this, 'D', e,
+ null);
+ AbstractParserState u = new CaseInsensitiveLetterState(this, 'U', d,
+ null);
+ AbstractParserState l = new CaseInsensitiveLetterState(this, 'L', u,
+ null);
+ AbstractParserState c = new CaseInsensitiveLetterState(this, 'C', l,
+ null);
+ AbstractParserState n = new CaseInsensitiveLetterState(this, 'N', c,
+ null);
+ newLineState = new WhitespaceOrCaseInsensitiveLetterState(this, 'I', n);
+ }
+
+ /**
+ * Called by FilenameState at completion of file name production.
+ *
+ * @param include
+ * include file name
+ */
+ public void addFilename(final String include) {
+ includes.addElement(include);
+ }
+
+ /**
+ * Gets collection of include file names encountered in parse.
+ * @return include file names
+ */
+ public String[] getIncludes() {
+ String[] retval = new String[includes.size()];
+ includes.copyInto(retval);
+ return retval;
+ }
+
+ /**
+ * Get the state for the beginning of a new line.
+ * @return start of line state
+ */
+ public AbstractParserState getNewLineState() {
+ return newLineState;
+ }
+
+ /**
+ * Collects all included files from the content of the reader.
+ *
+ * @param reader
+ * character reader containing a FORTRAN source module
+ * @throws IOException
+ * throw if I/O error during parse
+ */
+ public void parse(final Reader reader) throws IOException {
+ includes.setSize(0);
+ super.parse(reader);
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/LetterState.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/LetterState.java
new file mode 100644
index 0000000..945ae91
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/LetterState.java
@@ -0,0 +1,80 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.parser;
+
+/**
+ * This parser state checks consumed characters against a specific character.
+ *
+ * @author Curt Arnold
+ */
+public final class LetterState
+ extends AbstractParserState {
+ /**
+ * Next state if a match is found.
+ */
+ private final AbstractParserState nextState;
+
+ /**
+ * Next state if not match is found.
+ */
+ private final AbstractParserState noMatchState;
+
+ /**
+ * Character to match.
+ */
+ private final char thisLetter;
+
+ /**
+ * Constructor.
+ *
+ * @param parser
+ * parser
+ * @param matchLetter
+ * letter to match
+ * @param nextStateArg
+ * next state if a match on the letter
+ * @param noMatchStateArg
+ * state if no match on letter
+ */
+ public LetterState(final AbstractParser parser,
+ final char matchLetter,
+ final AbstractParserState nextStateArg,
+ final AbstractParserState noMatchStateArg) {
+ super(parser);
+ this.thisLetter = matchLetter;
+ this.nextState = nextStateArg;
+ this.noMatchState = noMatchStateArg;
+ }
+
+ /**
+ * Consumes a character and returns the next state for the parser.
+ *
+ * @param ch
+ * next character
+ * @return the configured nextState if ch is the expected character or the
+ * configure noMatchState otherwise.
+ */
+ public AbstractParserState consume(final char ch) {
+ if (ch == thisLetter) {
+ return nextState;
+ }
+ if (ch == '\n') {
+ getParser().getNewLineState();
+ }
+ return noMatchState;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/Parser.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/Parser.java
new file mode 100644
index 0000000..cf759fc
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/Parser.java
@@ -0,0 +1,28 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.parser;
+import java.io.IOException;
+import java.io.Reader;
+/**
+ * A parser that extracts #include statements from a Reader.
+ *
+ * @author Curt Arnold
+ */
+public interface Parser {
+ String[] getIncludes();
+ void parse(Reader reader) throws IOException;
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/PostE.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/PostE.java
new file mode 100644
index 0000000..fe225fb
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/PostE.java
@@ -0,0 +1,41 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.parser;
+public class PostE extends AbstractParserState {
+ private AbstractParserState bracket;
+ private AbstractParserState quote;
+ public PostE(CParser parser, AbstractParserState bracket,
+ AbstractParserState quote) {
+ super(parser);
+ this.bracket = bracket;
+ this.quote = quote;
+ }
+ public AbstractParserState consume(char ch) {
+ switch (ch) {
+ case ' ' :
+ case '\t' :
+ return this;
+ case '<' :
+ return bracket;
+ case '"' :
+ return quote;
+ case '\n' :
+ return getParser().getNewLineState();
+ }
+ return null;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/WhitespaceOrCaseInsensitiveLetterState.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/WhitespaceOrCaseInsensitiveLetterState.java
new file mode 100644
index 0000000..9d42fee
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/WhitespaceOrCaseInsensitiveLetterState.java
@@ -0,0 +1,83 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.parser;
+
+/**
+ * This parser state checks consumed characters against a specific character
+ * (case insensitive) or whitespace.
+ *
+ * @author Curt Arnold
+ */
+public final class WhitespaceOrCaseInsensitiveLetterState
+ extends
+ AbstractParserState {
+ /**
+ * Next state if the character is found.
+ */
+ private final AbstractParserState nextState;
+
+ /**
+ * Character to match (lower case).
+ */
+ private final char lowerLetter;
+
+ /**
+ * Character to match (upper case).
+ */
+ private final char upperLetter;
+
+ /**
+ * Constructor.
+ *
+ * @param parser
+ * parser
+ * @param matchLetter
+ * letter to match
+ * @param nextStateArg
+ * next state if a match on the letter
+ */
+ public WhitespaceOrCaseInsensitiveLetterState(final AbstractParser parser,
+ final char matchLetter,
+ final AbstractParserState
+ nextStateArg) {
+ super(parser);
+ this.lowerLetter = Character.toLowerCase(matchLetter);
+ this.upperLetter = Character.toUpperCase(matchLetter);
+ this.nextState = nextStateArg;
+ }
+
+ /**
+ * Consumes a character and returns the next state for the parser.
+ *
+ * @param ch
+ * next character
+ * @return the configured nextState if ch is the expected character or the
+ * configure noMatchState otherwise.
+ */
+ public AbstractParserState consume(final char ch) {
+ if (ch == lowerLetter || ch == upperLetter) {
+ return nextState;
+ }
+ if (ch == ' ' || ch == '\t') {
+ return this;
+ }
+ if (ch == '\n') {
+ getParser().getNewLineState();
+ }
+ return null;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/WhitespaceOrLetterState.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/WhitespaceOrLetterState.java
new file mode 100644
index 0000000..824abe6
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/WhitespaceOrLetterState.java
@@ -0,0 +1,75 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.parser;
+
+/**
+ * This parser state checks consumed characters against a specific character or
+ * whitespace.
+ *
+ * @author Curt Arnold
+ */
+public final class WhitespaceOrLetterState
+ extends AbstractParserState {
+ /**
+ * Next state if the character is found.
+ */
+ private final AbstractParserState nextState;
+
+ /**
+ * Character to match.
+ */
+ private final char thisLetter;
+
+ /**
+ * Constructor.
+ *
+ * @param parser
+ * parser
+ * @param matchLetter
+ * letter to match
+ * @param nextStateArg
+ * next state if a match on the letter
+ */
+ public WhitespaceOrLetterState(final AbstractParser parser,
+ final char matchLetter,
+ final AbstractParserState nextStateArg) {
+ super(parser);
+ this.thisLetter = matchLetter;
+ this.nextState = nextStateArg;
+ }
+
+ /**
+ * Consumes a character and returns the next state for the parser.
+ *
+ * @param ch
+ * next character @returns the configured nextState if ch is the
+ * expected character or the configure noMatchState otherwise.
+ * @return next state
+ */
+ public AbstractParserState consume(final char ch) {
+ if (ch == thisLetter) {
+ return nextState;
+ }
+ if (ch == ' ' || ch == '\t') {
+ return this;
+ }
+ if (ch == '\n') {
+ getParser().getNewLineState();
+ }
+ return null;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/sun/C89CCompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/sun/C89CCompiler.java
new file mode 100644
index 0000000..6679c23
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/sun/C89CCompiler.java
@@ -0,0 +1,109 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.sun;
+import java.io.File;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.compiler.AbstractCompiler;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineCCompiler;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.compiler.Processor;
+import net.sf.antcontrib.cpptasks.OptimizationEnum;
+
+
+import org.apache.tools.ant.types.Environment;
+/**
+ * Adapter for the Sun C89 C++ Compiler
+ *
+ * @author Hiram Chirino (cojonudo14@hotmail.com)
+ */
+public class C89CCompiler extends CommandLineCCompiler {
+ private static final AbstractCompiler instance = new C89CCompiler(false,
+ null);
+ public static AbstractCompiler getInstance() {
+ return instance;
+ }
+ private C89CCompiler(boolean newEnvironment, Environment env) {
+ super("c89", null, new String[]{".c", ".cc", ".cpp", ".cxx", ".c++"},
+ new String[]{".h", ".hpp"}, ".o", false, null, newEnvironment,
+ env);
+ }
+ protected void addImpliedArgs(
+ final Vector args,
+ final boolean debug,
+ final boolean multithreaded,
+ final boolean exceptions,
+ final LinkType linkType,
+ final Boolean rtti,
+ final OptimizationEnum optimization,
+ final Boolean defaultflag) {
+ // Specifies that only compilations and assemblies be done.
+ args.addElement("-c");
+ /*
+ * if (exceptions) { args.addElement("/GX"); }
+ */
+ if (debug) {
+ args.addElement("-g");
+ args.addElement("-D_DEBUG");
+ /*
+ * if (multithreaded) { args.addElement("/D_MT"); if (staticLink) {
+ * args.addElement("/MTd"); } else { args.addElement("/MDd");
+ * args.addElement("/D_DLL"); } } else { args.addElement("/MLd"); }
+ */
+ } else {
+ args.addElement("-DNDEBUG");
+ /*
+ * if (multithreaded) { args.addElement("/D_MT"); if (staticLink) {
+ * args.addElement("/MT"); } else { args.addElement("/MD");
+ * args.addElement("/D_DLL"); } } else { args.addElement("/ML"); }
+ */
+ }
+ }
+ protected void addWarningSwitch(Vector args, int level) {
+ C89Processor.addWarningSwitch(args, level);
+ }
+ public Processor changeEnvironment(boolean newEnvironment, Environment env) {
+ if (newEnvironment || env != null) {
+ return new C89CCompiler(newEnvironment, env);
+ }
+ return this;
+ }
+ protected void getDefineSwitch(StringBuffer buf, String define, String value) {
+ C89Processor.getDefineSwitch(buf, define, value);
+ }
+ protected File[] getEnvironmentIncludePath() {
+ return CUtil.getPathFromEnvironment("INCLUDE", ":");
+ }
+ protected String getIncludeDirSwitch(String includeDir) {
+ return C89Processor.getIncludeDirSwitch(includeDir);
+ }
+ public Linker getLinker(LinkType type) {
+ return C89Linker.getInstance().getLinker(type);
+ }
+ public int getMaximumCommandLength() {
+ return Integer.MAX_VALUE;
+ }
+ /* Only compile one file at time for now */
+ protected int getMaximumInputFilesPerCommand() {
+ return 1;
+ }
+ protected void getUndefineSwitch(StringBuffer buf, String define) {
+ C89Processor.getUndefineSwitch(buf, define);
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/sun/C89Linker.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/sun/C89Linker.java
new file mode 100644
index 0000000..37b3950
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/sun/C89Linker.java
@@ -0,0 +1,125 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.sun;
+import java.io.File;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CCTask;
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineLinker;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.types.LibrarySet;
+import net.sf.antcontrib.cpptasks.types.LibraryTypeEnum;
+
+/**
+ * Adapter for the Sun C89 Linker
+ *
+ * @author Hiram Chirino (cojonudo14@hotmail.com)
+ */
+public final class C89Linker extends CommandLineLinker {
+ private static final C89Linker dllLinker = new C89Linker("lib", ".so");
+ private static final C89Linker instance = new C89Linker("", "");
+ public static C89Linker getInstance() {
+ return instance;
+ }
+ private String outputPrefix;
+ private C89Linker(String outputPrefix, String outputSuffix) {
+ super("ld", "/bogus", new String[]{".o", ".a", ".lib", ".x"},
+ new String[]{}, outputSuffix, false, null);
+ this.outputPrefix = outputPrefix;
+ }
+ protected void addBase(long base, Vector args) {
+ }
+ protected void addFixed(Boolean fixed, Vector args) {
+ }
+ protected void addImpliedArgs(boolean debug, LinkType linkType, Vector args, Boolean defaultflag) {
+ if (linkType.isSharedLibrary()) {
+ args.addElement("-G");
+ }
+ }
+ protected void addIncremental(boolean incremental, Vector args) {
+ }
+ public String[] addLibrarySets(CCTask task, LibrarySet[] libsets,
+ Vector preargs, Vector midargs, Vector endargs) {
+ super.addLibrarySets(task, libsets, preargs, midargs, endargs);
+ StringBuffer buf = new StringBuffer("-l");
+ for (int i = 0; i < libsets.length; i++) {
+ LibrarySet set = libsets[i];
+ File libdir = set.getDir(null);
+ String[] libs = set.getLibs();
+ if (libdir != null) {
+ endargs.addElement("-L");
+ endargs.addElement(libdir.getAbsolutePath());
+ }
+ for (int j = 0; j < libs.length; j++) {
+ //
+ // reset the buffer to just "-l"
+ //
+ buf.setLength(2);
+ //
+ // add the library name
+ buf.append(libs[j]);
+ //
+ // add the argument to the list
+ endargs.addElement(buf.toString());
+ }
+ }
+ return null;
+ }
+ protected void addMap(boolean map, Vector args) {
+ }
+ protected void addStack(int stack, Vector args) {
+ }
+ /* (non-Javadoc)
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addEntry(int, java.util.Vector)
+ */
+ protected void addEntry(String entry, Vector args) {
+ }
+
+ public String getCommandFileSwitch(String commandFile) {
+ return "@" + commandFile;
+ }
+ public File[] getLibraryPath() {
+ return CUtil.getPathFromEnvironment("LIB", ";");
+ }
+ public String[] getLibraryPatterns(String[] libnames, LibraryTypeEnum libType) {
+ return C89Processor.getLibraryPatterns(libnames, libType);
+ }
+ public Linker getLinker(LinkType linkType) {
+ if (linkType.isSharedLibrary()) {
+ return dllLinker;
+ }
+ /*
+ * if(linkType.isStaticLibrary()) { return
+ * OS390Librarian.getInstance(); }
+ */
+ return instance;
+ }
+ public int getMaximumCommandLength() {
+ return Integer.MAX_VALUE;
+ }
+ public String getOutputFileName(String baseName) {
+ return outputPrefix + super.getOutputFileName(baseName);
+ }
+ public String[] getOutputFileSwitch(String outputFile) {
+ return new String[]{"-o", outputFile};
+ }
+ public boolean isCaseSensitive() {
+ return C89Processor.isCaseSensitive();
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/sun/C89Processor.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/sun/C89Processor.java
new file mode 100644
index 0000000..c54c866
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/sun/C89Processor.java
@@ -0,0 +1,116 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.sun;
+import java.util.Vector;
+import net.sf.antcontrib.cpptasks.types.LibraryTypeEnum;
+
+/**
+ * A add-in class for Sun C89 compilers and linkers
+ *
+ * @author Hiram Chirino (cojonudo14@hotmail.com)
+ */
+public class C89Processor {
+ private static int addLibraryPatterns(String[] libnames, StringBuffer buf,
+ String prefix, String extension, String[] patterns, int offset) {
+ for (int i = 0; i < libnames.length; i++) {
+ buf.setLength(0);
+ buf.append(prefix);
+ buf.append(libnames[i]);
+ buf.append(extension);
+ patterns[offset + i] = buf.toString();
+ }
+ return offset + libnames.length;
+ }
+ public static void addWarningSwitch(Vector args, int level) {
+ switch (level) {
+ /*
+ * case 0: args.addElement("/W0"); break;
+ *
+ * case 1: args.addElement("/W1"); break;
+ *
+ * case 2: break;
+ *
+ * case 3: args.addElement("/W3"); break;
+ *
+ * case 4: args.addElement("/W4"); break;
+ */
+ }
+ }
+ public static String getCommandFileSwitch(String cmdFile) {
+ StringBuffer buf = new StringBuffer("@");
+ if (cmdFile.indexOf(' ') >= 0) {
+ buf.append('\"');
+ buf.append(cmdFile);
+ buf.append('\"');
+ } else {
+ buf.append(cmdFile);
+ }
+ return buf.toString();
+ }
+ public static void getDefineSwitch(StringBuffer buf, String define,
+ String value) {
+ buf.setLength(0);
+ buf.append("-D");
+ buf.append(define);
+ if (value != null && value.length() > 0) {
+ buf.append('=');
+ buf.append(value);
+ }
+ }
+ public static String getIncludeDirSwitch(String includeDir) {
+ return "-I" + includeDir;
+ }
+ public static String[] getLibraryPatterns(String[] libnames, LibraryTypeEnum libType) {
+ StringBuffer buf = new StringBuffer();
+ int patternCount = libnames.length*2;
+ if (libType != null) {
+ patternCount = libnames.length;
+ }
+ String[] patterns = new String[patternCount];
+ int offset = 0;
+ if (libType == null || "static".equals(libType.getValue())) {
+ offset = addLibraryPatterns(libnames, buf, "lib", ".a", patterns, 0);
+ }
+ if (libType == null || !"static".equals(libType.getValue())) {
+ offset = addLibraryPatterns(libnames, buf, "lib", ".so", patterns,
+ offset);
+ }
+ return patterns;
+ }
+ public static String[] getOutputFileSwitch(String outPath) {
+ StringBuffer buf = new StringBuffer("-o ");
+ if (outPath.indexOf(' ') >= 0) {
+ buf.append('\"');
+ buf.append(outPath);
+ buf.append('\"');
+ } else {
+ buf.append(outPath);
+ }
+ String[] retval = new String[]{buf.toString()};
+ return retval;
+ }
+ public static void getUndefineSwitch(StringBuffer buf, String define) {
+ buf.setLength(0);
+ buf.append("-U");
+ buf.append(define);
+ }
+ public static boolean isCaseSensitive() {
+ return true;
+ }
+ private C89Processor() {
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/sun/ForteCCCompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/sun/ForteCCCompiler.java
new file mode 100644
index 0000000..a35d01a
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/sun/ForteCCCompiler.java
@@ -0,0 +1,119 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.sun;
+import java.io.File;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.gcc.GccCompatibleCCompiler;
+import net.sf.antcontrib.cpptasks.OptimizationEnum;
+/**
+ * Adapter for the Sun (r) Forte (tm) C++ compiler
+ *
+ * @author Curt Arnold
+ */
+public final class ForteCCCompiler extends GccCompatibleCCompiler {
+ private static final ForteCCCompiler instance = new ForteCCCompiler("CC");
+ /**
+ * Gets singleton instance of this class
+ */
+ public static ForteCCCompiler getInstance() {
+ return instance;
+ }
+ private String identifier;
+ private File[] includePath;
+ /**
+ * Private constructor. Use ForteCCCompiler.getInstance() to get singleton
+ * instance of this class.
+ */
+ private ForteCCCompiler(String command) {
+ super(command, "-V", false, null, false, null);
+ }
+ public void addImpliedArgs(final Vector args,
+ final boolean debug,
+ final boolean multithreaded,
+ final boolean exceptions,
+ final LinkType linkType,
+ final Boolean rtti,
+ final OptimizationEnum optimization) {
+ args.addElement("-c");
+ if (debug) {
+ args.addElement("-g");
+ }
+ if (optimization != null) {
+ if (optimization.isSpeed()) {
+ args.addElement("-xO2");
+ }
+ }
+ if (rtti != null) {
+ if (rtti.booleanValue()) {
+ args.addElement("-features=rtti");
+ } else {
+ args.addElement("-features=no%rtti");
+ }
+ }
+ if (multithreaded) {
+ args.addElement("-mt");
+ }
+ if (linkType.isSharedLibrary()) {
+ args.addElement("-KPIC");
+ }
+
+ }
+ public void addWarningSwitch(Vector args, int level) {
+ switch (level) {
+ case 0 :
+ args.addElement("-w");
+ break;
+ case 1 :
+ case 2 :
+ args.addElement("+w");
+ break;
+ case 3 :
+ case 4 :
+ case 5 :
+ args.addElement("+w2");
+ break;
+ }
+ }
+ public File[] getEnvironmentIncludePath() {
+ if (includePath == null) {
+ File ccLoc = CUtil.getExecutableLocation("CC");
+ if (ccLoc != null) {
+ File compilerIncludeDir = new File(
+ new File(ccLoc, "../include").getAbsolutePath());
+ if (compilerIncludeDir.exists()) {
+ includePath = new File[2];
+ includePath[0] = compilerIncludeDir;
+ }
+ }
+ if (includePath == null) {
+ includePath = new File[1];
+ }
+ includePath[includePath.length - 1] = new File("/usr/include");
+ }
+ return includePath;
+ }
+ public Linker getLinker(LinkType linkType) {
+ return ForteCCLinker.getInstance().getLinker(linkType);
+ }
+ public int getMaximumCommandLength() {
+ return Integer.MAX_VALUE;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/sun/ForteCCLinker.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/sun/ForteCCLinker.java
new file mode 100644
index 0000000..c39071a
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/sun/ForteCCLinker.java
@@ -0,0 +1,100 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.sun;
+import java.io.File;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.gcc.AbstractLdLinker;
+/**
+ * Adapter for Sun (r) Forte(tm) C++ Linker
+ *
+ * @author Curt Arnold
+ */
+public final class ForteCCLinker extends AbstractLdLinker {
+ private static final String[] discardFiles = new String[]{".dll", ".so",
+ ".sl"};
+ private static final String[] objFiles = new String[]{".o", ".a", ".lib"};
+ private static final ForteCCLinker arLinker = new ForteCCLinker("CC",
+ objFiles, discardFiles, "lib", ".a");
+ private static final ForteCCLinker dllLinker = new ForteCCLinker("CC",
+ objFiles, discardFiles, "lib", ".so");
+ private static final ForteCCLinker instance = new ForteCCLinker("CC",
+ objFiles, discardFiles, "", "");
+ public static ForteCCLinker getInstance() {
+ return instance;
+ }
+ private File[] libDirs;
+ private ForteCCLinker(String command, String[] extensions,
+ String[] ignoredExtensions, String outputPrefix, String outputSuffix) {
+ super(command, "-V", extensions, ignoredExtensions, outputPrefix,
+ outputSuffix, false, null);
+ }
+ public void addImpliedArgs(boolean debug, LinkType linkType, Vector args) {
+ if (debug) {
+ args.addElement("-g");
+ }
+ if (linkType.isStaticRuntime()) {
+ args.addElement("-static");
+ }
+ if (linkType.isSharedLibrary()) {
+ args.addElement("-G");
+ }
+ if (linkType.isStaticLibrary()) {
+ args.addElement("-xar");
+ }
+ }
+ public void addIncremental(boolean incremental, Vector args) {
+ /*
+ * if (incremental) { args.addElement("-xidlon"); } else {
+ * args.addElement("-xidloff"); }
+ */
+ }
+ /**
+ * Returns library path.
+ *
+ */
+ public File[] getLibraryPath() {
+ if (libDirs == null) {
+ File CCloc = CUtil.getExecutableLocation("CC");
+ if (CCloc != null) {
+ File compilerLib = new File(new File(CCloc, "../lib")
+ .getAbsolutePath());
+ if (compilerLib.exists()) {
+ libDirs = new File[2];
+ libDirs[0] = compilerLib;
+ }
+ }
+ if (libDirs == null) {
+ libDirs = new File[1];
+ }
+ }
+ libDirs[libDirs.length - 1] = new File("/usr/lib");
+ return libDirs;
+ }
+ public Linker getLinker(LinkType type) {
+ if (type.isStaticLibrary()) {
+ return arLinker;
+ }
+ if (type.isSharedLibrary()) {
+ return dllLinker;
+ }
+ return instance;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ti/ClxxCCompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ti/ClxxCCompiler.java
new file mode 100644
index 0000000..d08b9fb
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ti/ClxxCCompiler.java
@@ -0,0 +1,192 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.ti;
+import java.io.File;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.compiler.CommandLineCCompiler;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.OptimizationEnum;
+
+
+import org.apache.tools.ant.types.Environment;
+/**
+ * Adapter for TI DSP compilers with cl** commands
+ *
+ * @author CurtA
+ */
+public class ClxxCCompiler extends CommandLineCCompiler {
+ /**
+ * Header file extensions
+ */
+ private static final String[] headerExtensions = new String[]{".h", ".hpp",
+ ".inl"};
+ /**
+ * Source file extensions
+ */
+ private static final String[] sourceExtensions = new String[]{".c", ".cc",
+ ".cpp", ".cxx", ".c++"};
+ /**
+ * Singleton for TMS320C55x
+ */
+ private static final ClxxCCompiler cl55 = new ClxxCCompiler("cl55", false,
+ null);
+ /**
+ * Singleton for TMS320C6000
+ */
+ private static final ClxxCCompiler cl6x = new ClxxCCompiler("cl6x", false,
+ null);
+ public static ClxxCCompiler getCl55Instance() {
+ return cl55;
+ }
+ public static ClxxCCompiler getCl6xInstance() {
+ return cl6x;
+ }
+ /**
+ * Private constructor
+ *
+ * @param command
+ * executable name
+ * @param newEnvironment
+ * Change environment
+ * @param env
+ * New environment
+ */
+ private ClxxCCompiler(String command, boolean newEnvironment,
+ Environment env) {
+ super(command, "-h", sourceExtensions, headerExtensions, ".o", false,
+ null, newEnvironment, env);
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineCompiler#addImpliedArgs(java.util.Vector,
+ * boolean, boolean, boolean,
+ * net.sf.antcontrib.cpptasks.compiler.LinkType)
+ */
+ protected void addImpliedArgs(
+ final Vector args,
+ final boolean debug,
+ final boolean multithreaded,
+ final boolean exceptions,
+ final LinkType linkType,
+ final Boolean rtti,
+ final OptimizationEnum optimization,
+ final Boolean defaultflag) {
+ if (debug) {
+ args.addElement("-gw");
+ }
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineCompiler#addWarningSwitch(java.util.Vector,
+ * int)
+ */
+ protected void addWarningSwitch(Vector args, int warnings) {
+ // TODO Auto-generated method stub
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineCompiler#getDefineSwitch(java.lang.StringBuffer,
+ * java.lang.String, java.lang.String)
+ */
+ protected void getDefineSwitch(StringBuffer buffer, String define,
+ String value) {
+ buffer.append("-d");
+ buffer.append(define);
+ if (value != null) {
+ buffer.append('=');
+ buffer.append(value);
+ }
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineCompiler#getEnvironmentIncludePath()
+ */
+ protected File[] getEnvironmentIncludePath() {
+ File[] c_dir = CUtil.getPathFromEnvironment("C_DIR", ";");
+ File[] cx_dir = CUtil.getPathFromEnvironment("C6X_C_DIR", ";");
+ if (c_dir.length == 0) {
+ return cx_dir;
+ }
+ if (cx_dir.length == 0) {
+ return c_dir;
+ }
+ File[] combo = new File[c_dir.length + cx_dir.length];
+ for (int i = 0; i < cx_dir.length; i++) {
+ combo[i] = cx_dir[i];
+ }
+ for (int i = 0; i < c_dir.length; i++) {
+ combo[i + cx_dir.length] = c_dir[i];
+ }
+ return combo;
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineCompiler#getIncludeDirSwitch(java.lang.String)
+ */
+ protected String getIncludeDirSwitch(String source) {
+ return "-I" + source;
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.Processor#getLinker(net.sf.antcontrib.cpptasks.compiler.LinkType)
+ */
+ public Linker getLinker(LinkType type) {
+ if (type.isStaticLibrary()) {
+ if (this == cl6x) {
+ return ClxxLibrarian.getCl6xInstance();
+ }
+ return ClxxLibrarian.getCl55Instance();
+ }
+ if (type.isSharedLibrary()) {
+ if (this == cl6x) {
+ return ClxxLinker.getCl6xDllInstance();
+ }
+ return ClxxLinker.getCl55DllInstance();
+ }
+ if (this == cl6x) {
+ return ClxxLinker.getCl6xInstance();
+ }
+ return ClxxLinker.getCl55Instance();
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineCompiler#getMaximumCommandLength()
+ */
+ public int getMaximumCommandLength() {
+ return 1024;
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineCompiler#getUndefineSwitch(java.lang.StringBuffer,
+ * java.lang.String)
+ */
+ protected void getUndefineSwitch(StringBuffer buffer, String define) {
+ buffer.append("-u");
+ buffer.append(define);
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ti/ClxxLibrarian.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ti/ClxxLibrarian.java
new file mode 100644
index 0000000..082d1a4
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ti/ClxxLibrarian.java
@@ -0,0 +1,162 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.ti;
+import java.io.File;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.compiler.CommandLineLinker;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.types.LibraryTypeEnum;
+
+/**
+ *
+ * Adapter for TI DSP librarian
+ * *
+ * @author CurtA
+ */
+public class ClxxLibrarian extends CommandLineLinker {
+ private static final ClxxLibrarian cl55Instance = new ClxxLibrarian("ar55");
+ private static final ClxxLibrarian cl6xInstance = new ClxxLibrarian("ar6x");
+ public static final ClxxLibrarian getCl55Instance() {
+ return cl55Instance;
+ }
+ public static final ClxxLibrarian getCl6xInstance() {
+ return cl6xInstance;
+ }
+ private ClxxLibrarian(String command) {
+ super(command, null, new String[]{".o"}, new String[0], ".lib", false,
+ null);
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addBase(long,
+ * java.util.Vector)
+ */
+ protected void addBase(long base, Vector args) {
+ // TODO Auto-generated method stub
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addFixed(java.lang.Boolean,
+ * java.util.Vector)
+ */
+ protected void addFixed(Boolean fixed, Vector args) {
+ // TODO Auto-generated method stub
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addImpliedArgs(boolean,
+ * net.sf.antcontrib.cpptasks.compiler.LinkType, java.util.Vector)
+ */
+ protected void addImpliedArgs(boolean debug, LinkType linkType, Vector args, Boolean defaultflag) {
+ // TODO Auto-generated method stub
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addIncremental(boolean,
+ * java.util.Vector)
+ */
+ protected void addIncremental(boolean incremental, Vector args) {
+ // TODO Auto-generated method stub
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addMap(boolean,
+ * java.util.Vector)
+ */
+ protected void addMap(boolean map, Vector args) {
+ // TODO Auto-generated method stub
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addStack(int,
+ * java.util.Vector)
+ */
+ protected void addStack(int stack, Vector args) {
+ // TODO Auto-generated method stub
+ }
+ /* (non-Javadoc)
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addEntry(int, java.util.Vector)
+ */
+ protected void addEntry(String entry, Vector args) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#getCommandFileSwitch(java.lang.String)
+ */
+ protected String getCommandFileSwitch(String commandFile) {
+ return "@" + commandFile;
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.Linker#getLibraryPath()
+ */
+ public File[] getLibraryPath() {
+ return new File[0];
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.Linker#getLibraryPatterns(java.lang.String[])
+ */
+ public String[] getLibraryPatterns(String[] libnames, LibraryTypeEnum libType) {
+ return new String[0];
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.Processor#getLinker(net.sf.antcontrib.cpptasks.compiler.LinkType)
+ */
+ public Linker getLinker(LinkType linkType) {
+ return null;
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#getMaximumCommandLength()
+ */
+ protected int getMaximumCommandLength() {
+ return 1024;
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#getOutputFileSwitch(java.lang.String)
+ */
+ protected String[] getOutputFileSwitch(String outputFile) {
+ return new String[]{"-o", outputFile};
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.Linker#isCaseSensitive()
+ */
+ public boolean isCaseSensitive() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ti/ClxxLinker.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ti/ClxxLinker.java
new file mode 100644
index 0000000..43ee7c0
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ti/ClxxLinker.java
@@ -0,0 +1,181 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.ti;
+import java.io.File;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.compiler.CommandLineLinker;
+import net.sf.antcontrib.cpptasks.compiler.LinkType;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+import net.sf.antcontrib.cpptasks.types.LibraryTypeEnum;
+
+/**
+ * Adapter for TI DSP linkers
+ * *
+ * @author CurtA
+ *
+ */
+public class ClxxLinker extends CommandLineLinker {
+ private static final ClxxLinker cl55DllInstance = new ClxxLinker("lnk55",
+ ".dll");
+ private static final ClxxLinker cl55Instance = new ClxxLinker("lnk55",
+ ".exe");
+ private static final ClxxLinker cl6xDllInstance = new ClxxLinker("lnk6x",
+ ".dll");
+ private static final ClxxLinker cl6xInstance = new ClxxLinker("lnk6x",
+ ".exe");
+ public static ClxxLinker getCl55DllInstance() {
+ return cl55DllInstance;
+ }
+ public static ClxxLinker getCl55Instance() {
+ return cl55Instance;
+ }
+ public static ClxxLinker getCl6xDllInstance() {
+ return cl6xDllInstance;
+ }
+ public static ClxxLinker getCl6xInstance() {
+ return cl6xInstance;
+ }
+ private ClxxLinker(String command, String outputSuffix) {
+ super(command, "-h", new String[]{".o", ".lib", ".res"}, new String[]{
+ ".map", ".pdb", ".lnk"}, outputSuffix, false, null);
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addBase(long,
+ * java.util.Vector)
+ */
+ protected void addBase(long base, Vector args) {
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addFixed(java.lang.Boolean,
+ * java.util.Vector)
+ */
+ protected void addFixed(Boolean fixed, Vector args) {
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addImpliedArgs(boolean,
+ * net.sf.antcontrib.cpptasks.compiler.LinkType, java.util.Vector)
+ */
+ protected void addImpliedArgs(boolean debug, LinkType linkType, Vector args, Boolean defaultflag) {
+ if (linkType.isSharedLibrary()) {
+ args.addElement("-abs");
+ }
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addIncremental(boolean,
+ * java.util.Vector)
+ */
+ protected void addIncremental(boolean incremental, Vector args) {
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addMap(boolean,
+ * java.util.Vector)
+ */
+ protected void addMap(boolean map, Vector args) {
+ if (map) {
+ args.addElement("-m");
+ }
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addStack(int,
+ * java.util.Vector)
+ */
+ protected void addStack(int stack, Vector args) {
+ }
+ /* (non-Javadoc)
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addEntry(int, java.util.Vector)
+ */
+ protected void addEntry(String entry, Vector args) {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#getCommandFileSwitch(java.lang.String)
+ */
+ protected String getCommandFileSwitch(String commandFile) {
+ return "@" + commandFile;
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.Linker#getLibraryPath()
+ */
+ public File[] getLibraryPath() {
+ return new File[0];
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.Linker#getLibraryPatterns(java.lang.String[])
+ */
+ public String[] getLibraryPatterns(String[] libnames, LibraryTypeEnum libType) {
+ //
+ // TODO: Looks bogus, should be .a or .so's not .o's
+ //
+ String[] libpats = new String[libnames.length];
+ for (int i = 0; i < libnames.length; i++) {
+ libpats[i] = libnames[i] + ".o";
+ }
+ return libpats;
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.Processor#getLinker(net.sf.antcontrib.cpptasks.compiler.LinkType)
+ */
+ public Linker getLinker(LinkType linkType) {
+ return this;
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#getMaximumCommandLength()
+ */
+ protected int getMaximumCommandLength() {
+ return 1024;
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#getOutputFileSwitch(java.lang.String)
+ */
+ protected String[] getOutputFileSwitch(String outputFile) {
+ return new String[]{"-o", outputFile};
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sf.antcontrib.cpptasks.compiler.Linker#isCaseSensitive()
+ */
+ public boolean isCaseSensitive() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/AslcompilerArgument.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/AslcompilerArgument.java
new file mode 100644
index 0000000..87babcf
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/AslcompilerArgument.java
@@ -0,0 +1,30 @@
+/*
+ *
+ * Copyright 2001-2005 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.types;
+
+/**
+ * A aslcompiler command line argument.
+ */
+public class AslcompilerArgument extends CommandLineArgument {
+ public AslcompilerArgument () {
+ }
+
+ public void execute() throws org.apache.tools.ant.BuildException {
+ throw new org.apache.tools.ant.BuildException(
+ "Not an actual task, but looks like one for documentation purposes");
+ }
+} \ No newline at end of file
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/AssemblerArgument.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/AssemblerArgument.java
new file mode 100644
index 0000000..1b5f54d
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/AssemblerArgument.java
@@ -0,0 +1,30 @@
+/*
+ *
+ * Copyright 2001-2005 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.types;
+
+/**
+ * A assembler command line argument.
+ */
+public class AssemblerArgument extends CommandLineArgument {
+ public AssemblerArgument () {
+ }
+
+ public void execute() throws org.apache.tools.ant.BuildException {
+ throw new org.apache.tools.ant.BuildException(
+ "Not an actual task, but looks like one for documentation purposes");
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/CommandLineArgument.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/CommandLineArgument.java
new file mode 100644
index 0000000..91ab2f6
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/CommandLineArgument.java
@@ -0,0 +1,122 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.types;
+
+import org.apache.tools.ant.types.EnumeratedAttribute;
+import java.io.File;
+/**
+ * An compiler/linker command line flag.
+ */
+public class CommandLineArgument {
+ /**
+ * Enumerated attribute with the values "start", "mid" and "end",
+ */
+ public static class LocationEnum extends EnumeratedAttribute {
+ public String[] getValues() {
+ return new String[]{"start", "mid", "end"};
+ }
+ }
+ private String ifCond;
+ private int location;
+ private String unlessCond;
+ private String value;
+ private File file;
+ public CommandLineArgument() {
+ }
+ public int getLocation() {
+ return location;
+ }
+ public String getValue() {
+ return value;
+ }
+ public File getFile() {
+ return file;
+ }
+ /**
+ * Returns true if the define's if and unless conditions (if any) are
+ * satisfied.
+ */
+ public boolean isActive(org.apache.tools.ant.Project p) {
+ if (value == null) {
+ return false;
+ }
+ if (ifCond != null && p.getProperty(ifCond) == null) {
+ return false;
+ } else if (unlessCond != null && p.getProperty(unlessCond) != null) {
+ return false;
+ }
+ return true;
+ }
+ /**
+ * Sets the property name for the 'if' condition.
+ *
+ * The argument will be ignored unless the property is defined.
+ *
+ * The value of the property is insignificant, but values that would imply
+ * misinterpretation ("false", "no") will throw an exception when
+ * evaluated.
+ */
+ public void setIf(String propName) {
+ ifCond = propName;
+ }
+ /**
+ * Specifies relative location of argument on command line. "start" will
+ * place argument at start of command line, "mid" will place argument after
+ * all "start" arguments but before filenames, "end" will place argument
+ * after filenames.
+ *
+ */
+ public void setLocation(LocationEnum location) {
+ this.location = location.getIndex();
+ }
+ /**
+ * Set the property name for the 'unless' condition.
+ *
+ * If named property is set, the argument will be ignored.
+ *
+ * The value of the property is insignificant, but values that would imply
+ * misinterpretation ("false", "no") of the behavior will throw an
+ * exception when evaluated.
+ *
+ * @param propName
+ * name of property
+ */
+ public void setUnless(String propName) {
+ unlessCond = propName;
+ }
+ /**
+ * Specifies the string that should appear on the command line. The
+ * argument will be quoted if it contains embedded blanks. Use multiple
+ * arguments to avoid quoting.
+ *
+ */
+ public void setValue(String value) {
+ this.value = value;
+ }
+ /**
+ * Specifies the file which lists many strings that should appear on
+ * the command line. Each line is one argument. The argument will be
+ * quated if it contains embedded blanks. Use multiple arguments in
+ * file to avoid quating.
+ *
+ * @param file
+ * name of the file
+ */
+ public void setFile(File file) {
+ this.file = file;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/CompilerArgument.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/CompilerArgument.java
new file mode 100644
index 0000000..ca9e90e
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/CompilerArgument.java
@@ -0,0 +1,28 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.types;
+/**
+ * A compiler command line argument.
+ */
+public class CompilerArgument extends CommandLineArgument {
+ public CompilerArgument() {
+ }
+ public void execute() throws org.apache.tools.ant.BuildException {
+ throw new org.apache.tools.ant.BuildException(
+ "Not an actual task, but looks like one for documentation purposes");
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/ConditionalFileSet.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/ConditionalFileSet.java
new file mode 100644
index 0000000..af2d141
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/ConditionalFileSet.java
@@ -0,0 +1,84 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.types;
+import net.sf.antcontrib.cpptasks.CUtil;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.AbstractFileSet;
+import org.apache.tools.ant.types.FileSet;
+/**
+ * An Ant FileSet object augmented with if and unless conditions.
+ *
+ * @author Curt Arnold
+ */
+public class ConditionalFileSet extends FileSet {
+ private String ifCond;
+ private String unlessCond;
+ public ConditionalFileSet() {
+ }
+ public void execute() throws org.apache.tools.ant.BuildException {
+ throw new org.apache.tools.ant.BuildException(
+ "Not an actual task, but looks like one for documentation purposes");
+ }
+ /**
+ * overrides FileSet's implementation which would throw an exception since
+ * the referenced object isn't this type.
+ */
+ protected AbstractFileSet getRef(Project p) {
+ return (AbstractFileSet) getRefid().getReferencedObject(p);
+ }
+ /**
+ * Returns true if the Path's if and unless conditions (if any) are
+ * satisfied.
+ */
+ public boolean isActive() throws BuildException {
+ Project p = getProject();
+ if (p == null) {
+ throw new java.lang.IllegalStateException(
+ "setProject() should have been called");
+ }
+ return CUtil.isActive(p, ifCond, unlessCond);
+ }
+ /**
+ * Sets the property name for the 'if' condition.
+ *
+ * The fileset will be ignored unless the property is defined.
+ *
+ * The value of the property is insignificant, but values that would imply
+ * misinterpretation ("false", "no") will throw an exception when
+ * evaluated.
+ */
+ public void setIf(String propName) {
+ ifCond = propName;
+ }
+ /**
+ * Set the property name for the 'unless' condition.
+ *
+ * If named property is set, the fileset will be ignored.
+ *
+ * The value of the property is insignificant, but values that would imply
+ * misinterpretation ("false", "no") of the behavior will throw an
+ * exception when evaluated.
+ *
+ * @param propName
+ * name of property
+ */
+ public void setUnless(String propName) {
+ unlessCond = propName;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/ConditionalPath.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/ConditionalPath.java
new file mode 100644
index 0000000..dc21189
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/ConditionalPath.java
@@ -0,0 +1,92 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.types;
+import java.io.File;
+
+import net.sf.antcontrib.cpptasks.CUtil;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.Path;
+/**
+ * An Ant Path object augmented with if and unless conditionals
+ *
+ * @author Curt Arnold
+ */
+public class ConditionalPath extends Path {
+ private String ifCond;
+ private String unlessCond;
+ private File file;
+ public ConditionalPath(Project project) {
+ super(project);
+ }
+ public ConditionalPath(Project p, String path) {
+ super(p, path);
+ }
+ public File getFile() {
+ return file;
+ }
+ /**
+ * Returns true if the Path's if and unless conditions (if any) are
+ * satisfied.
+ */
+ public boolean isActive(org.apache.tools.ant.Project p)
+ throws BuildException {
+ return CUtil.isActive(p, ifCond, unlessCond);
+ }
+ /**
+ * Sets the property name for the 'if' condition.
+ *
+ * The path will be ignored unless the property is defined.
+ *
+ * The value of the property is insignificant, but values that would imply
+ * misinterpretation ("false", "no") will throw an exception when
+ * evaluated.
+ *
+ * @param propName
+ * property name
+ */
+ public void setIf(String propName) {
+ ifCond = propName;
+ }
+ /**
+ * Set the property name for the 'unless' condition.
+ *
+ * If named property is set, the path will be ignored.
+ *
+ * The value of the property is insignificant, but values that would imply
+ * misinterpretation ("false", "no") of the behavior will throw an
+ * exception when evaluated.
+ *
+ * @param propName
+ * name of property
+ */
+ public void setUnless(String propName) {
+ unlessCond = propName;
+ }
+ /**
+ * Specifies the file which lists many include paths that should appear on
+ * the command line. Each line is an include path. The includepath will be
+ * quated if it contains embedded blanks.
+ *
+ * @param file
+ * name of the file
+ */
+ public void setFile(File file) {
+ this.file = file;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/DefineArgument.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/DefineArgument.java
new file mode 100644
index 0000000..824e939
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/DefineArgument.java
@@ -0,0 +1,38 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.types;
+/**
+ * Preprocessor macro definition.
+ *
+ * @author Mark A Russell <a
+ * href="mailto:mark_russell@csgsystems.com">mark_russell@csg_systems.com
+ * </a>
+ */
+public class DefineArgument extends UndefineArgument {
+ private String value;
+ public DefineArgument() {
+ super(true);
+ }
+ /** Returns the value of the define */
+ public final String getValue() {
+ return value;
+ }
+ /** Set the value attribute */
+ public final void setValue(String value) {
+ this.value = value;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/DefineSet.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/DefineSet.java
new file mode 100644
index 0000000..9d229fb
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/DefineSet.java
@@ -0,0 +1,199 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.types;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CUtil;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.types.DataType;
+import org.apache.tools.ant.types.Reference;
+/**
+ * Set of preprocessor macro defines and undefines.
+ *
+ * @author Mark A Russell <a
+ * href="mailto:mark_russell@csgsystems.com">mark_russell@csg_systems.com
+ * </a>
+ * @author Adam Murdoch
+ */
+public class DefineSet extends DataType {
+ private Vector defineList = new Vector();
+ private String ifCond = null;
+ private String unlessCond = null;
+ /**
+ *
+ * Adds a define element.
+ *
+ * @throws BuildException
+ * if reference
+ */
+ public void addDefine(DefineArgument arg) throws BuildException {
+ if (isReference()) {
+ throw noChildrenAllowed();
+ }
+ defineList.addElement(arg);
+ }
+ /** Adds defines/undefines. */
+ private void addDefines(String[] defs, boolean isDefine) {
+ for (int i = 0; i < defs.length; i++) {
+ UndefineArgument def;
+ if (isDefine) {
+ def = new DefineArgument();
+ } else {
+ def = new UndefineArgument();
+ }
+ def.setName(defs[i]);
+ defineList.addElement(def);
+ }
+ }
+ /**
+ *
+ * Adds an undefine element.
+ *
+ * @throws BuildException
+ * if reference
+ */
+ public void addUndefine(UndefineArgument arg) throws BuildException {
+ if (isReference()) {
+ throw noChildrenAllowed();
+ }
+ defineList.addElement(arg);
+ }
+ public void execute() throws org.apache.tools.ant.BuildException {
+ throw new org.apache.tools.ant.BuildException(
+ "Not an actual task, but looks like one for documentation purposes");
+ }
+ /** Returns the defines and undefines in this set. */
+ public UndefineArgument[] getDefines() throws BuildException {
+ if (isReference()) {
+ DefineSet defset = (DefineSet) getCheckedRef(DefineSet.class,
+ "DefineSet");
+ return defset.getDefines();
+ } else {
+ if (isActive()) {
+ UndefineArgument[] defs = new UndefineArgument[defineList
+ .size()];
+ defineList.copyInto(defs);
+ return defs;
+ } else {
+ return new UndefineArgument[0];
+ }
+ }
+ }
+ /**
+ * Returns true if the define's if and unless conditions (if any) are
+ * satisfied.
+ *
+ * @exception BuildException
+ * throws build exception if name is not set
+ */
+ public final boolean isActive() throws BuildException {
+ return CUtil.isActive(getProject(), ifCond, unlessCond);
+ }
+ /**
+ * A comma-separated list of preprocessor macros to define. Use nested
+ * define elements to define macro values.
+ *
+ * @param defList
+ * comma-separated list of preprocessor macros
+ * @throws BuildException
+ * throw if defineset is a reference
+ */
+ public void setDefine(CUtil.StringArrayBuilder defList)
+ throws BuildException {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ addDefines(defList.getValue(), true);
+ }
+ /**
+ * Sets a description of the current data type.
+ */
+ public void setDescription(String desc) {
+ super.setDescription(desc);
+ }
+ /**
+ * Sets an id that can be used to reference this element.
+ *
+ * @param id
+ * id
+ */
+ public void setId(String id) {
+ //
+ // this is actually accomplished by a different
+ // mechanism, but we can document it
+ //
+ }
+ /**
+ * Sets the property name for the 'if' condition.
+ *
+ * The define will be ignored unless the property is defined.
+ *
+ * The value of the property is insignificant, but values that would imply
+ * misinterpretation ("false", "no") will throw an exception when
+ * evaluated.
+ *
+ * @param propName
+ * property name
+ */
+ public final void setIf(String propName) {
+ ifCond = propName;
+ }
+ /**
+ * Specifies that this element should behave as if the content of the
+ * element with the matching id attribute was inserted at this location. If
+ * specified, no other attributes or child content should be specified,
+ * other than "description".
+ *
+ */
+ public void setRefid(Reference r) throws BuildException {
+ if (!defineList.isEmpty()) {
+ throw tooManyAttributes();
+ }
+ super.setRefid(r);
+ }
+ /**
+ * A comma-separated list of preprocessor macros to undefine.
+ *
+ * @param undefList
+ * comma-separated list of preprocessor macros
+ * @throws BuildException
+ * throw if defineset is a reference
+ */
+ public void setUndefine(CUtil.StringArrayBuilder undefList)
+ throws BuildException {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ addDefines(undefList.getValue(), false);
+ }
+ /**
+ * Set the property name for the 'unless' condition.
+ *
+ * If named property is set, the define will be ignored.
+ *
+ * The value of the property is insignificant, but values that would imply
+ * misinterpretation ("false", "no") of the behavior will throw an
+ * exception when evaluated.
+ *
+ * @param propName
+ * name of property
+ */
+ public final void setUnless(String propName) {
+ unlessCond = propName;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/FlexLong.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/FlexLong.java
new file mode 100644
index 0000000..d95959f
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/FlexLong.java
@@ -0,0 +1,59 @@
+/*
+ *
+ * Copyright 2002-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.types;
+import java.lang.reflect.Method;
+
+/**
+ * Helper class which can be used for Ant task attribute setter methods to
+ * allow the build file to specify a long in either decimal, octal, or
+ * hexadecimal format.
+ * // FlexInteger author
+ * @author Erik Hatcher
+ * @see org.apache.tools.ant.types.FlexInteger
+ */
+public class FlexLong {
+ private Long value;
+ /**
+ * Constructor used by Ant's introspection mechanism for attribute
+ * population
+ */
+ public FlexLong(String value) {
+ // Java 1.1 did not support Long.decode().. so we call it by
+ // reflection.
+ try {
+ Method m = Long.class
+ .getMethod("decode", new Class[]{String.class});
+ Object rc = m.invoke(null, new Object[]{value});
+ this.value = (Long) rc;
+ } catch (Exception e) {
+ // Try it the old fashioned way, we must be on a 1.1 jre
+ this.value = new Long(value);
+ }
+ }
+ /**
+ * Returns the decimal integer value
+ */
+ public long longValue() {
+ return value.longValue();
+ }
+ /**
+ * Overridden method to return the decimal value for display
+ */
+ public String toString() {
+ return value.toString();
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/IncludePath.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/IncludePath.java
new file mode 100644
index 0000000..edcc421
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/IncludePath.java
@@ -0,0 +1,38 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.types;
+import org.apache.tools.ant.Project;
+/**
+ * An include path.
+ *
+ * Works like other paths in Ant with with the addition of "if" and "unless"
+ * conditions.
+ *
+ * @author Curt Arnold
+ */
+public class IncludePath extends ConditionalPath {
+ public IncludePath(Project project) {
+ super(project);
+ }
+ public IncludePath(Project p, String path) {
+ super(p, path);
+ }
+ public void execute() throws org.apache.tools.ant.BuildException {
+ throw new org.apache.tools.ant.BuildException(
+ "Not an actual task, but looks like one for documentation purposes");
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/LibrarySet.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/LibrarySet.java
new file mode 100644
index 0000000..d522ccc
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/LibrarySet.java
@@ -0,0 +1,290 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.types;
+import java.io.File;
+
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.FileVisitor;
+import net.sf.antcontrib.cpptasks.compiler.Linker;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.DirectoryScanner;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.ProjectComponent;
+import org.apache.tools.ant.types.FileSet;
+import org.apache.tools.ant.types.PatternSet;
+/**
+ * A set of library names. Libraries can also be added to a link by specifying
+ * them in a fileset.
+ *
+ * For most Unix-like compilers, libset will result in a series of -l and -L
+ * linker arguments. For Windows compilers, the library names will be used to
+ * locate the appropriate library files which will be added to the linkers
+ * input file list as if they had been specified in a fileset.
+ *
+ * @author Mark A Russell <a
+ * href="mailto:mark_russell@csgsystems.com">mark_russell@csg_systems.com
+ * </a>
+ * @author Adam Murdoch
+ * @author Curt Arnold
+ */
+public class LibrarySet extends ProjectComponent {
+ private String dataset;
+ private boolean explicitCaseSensitive;
+ private String ifCond;
+ private String[] libnames;
+ private final FileSet set = new FileSet();
+ private String unlessCond;
+ private LibraryTypeEnum libraryType;
+ public LibrarySet() {
+ libnames = new String[0];
+ }
+ public void execute() throws org.apache.tools.ant.BuildException {
+ throw new org.apache.tools.ant.BuildException(
+ "Not an actual task, but looks like one for documentation purposes");
+ }
+ /**
+ * Gets the dataset. Used on OS390 if the libs are in a dataset.
+ *
+ * @return Returns a String
+ */
+ public String getDataset() {
+ return dataset;
+ }
+ public File getDir(Project project) {
+ return set.getDir(project);
+ }
+ protected FileSet getFileSet() {
+ return set;
+ }
+ public String[] getLibs() {
+ String[] retval = (String[]) libnames.clone();
+ return retval;
+ }
+
+ /**
+ * Gets preferred library type
+ *
+ * @return library type, may be null.
+ */
+ public LibraryTypeEnum getType() {
+ return libraryType;
+ }
+ /**
+ * Returns true if the define's if and unless conditions (if any) are
+ * satisfied.
+ */
+ public boolean isActive(org.apache.tools.ant.Project p) {
+ if (p == null) {
+ throw new NullPointerException("p");
+ }
+ if (ifCond != null) {
+ String ifValue = p.getProperty(ifCond);
+ if (ifValue != null) {
+ if (ifValue.equals("no") || ifValue.equals("false")) {
+ throw new BuildException(
+ "property "
+ + ifCond
+ + " used as if condition has value "
+ + ifValue
+ + " which suggests a misunderstanding of if attributes");
+ }
+ } else {
+ return false;
+ }
+ }
+ if (unlessCond != null) {
+ String unlessValue = p.getProperty(unlessCond);
+ if (unlessValue != null) {
+ if (unlessValue.equals("no") || unlessValue.equals("false")) {
+ throw new BuildException(
+ "property "
+ + unlessCond
+ + " used as unless condition has value "
+ + unlessValue
+ + " which suggests a misunderstanding of unless attributes");
+ }
+ return false;
+ }
+ }
+ if (libnames.length == 0) {
+ p.log("libnames not specified or empty.", Project.MSG_WARN);
+ return false;
+ }
+ return true;
+ }
+ /**
+ * Sets case sensitivity of the file system. If not set, will default to
+ * the linker's case sensitivity.
+ *
+ * @param isCaseSensitive
+ * "true"|"on"|"yes" if file system is case sensitive,
+ * "false"|"off"|"no" when not.
+ */
+ public void setCaseSensitive(boolean isCaseSensitive) {
+ explicitCaseSensitive = true;
+ set.setCaseSensitive(isCaseSensitive);
+ }
+ /**
+ * Sets the dataset. Used on OS390 if the libs are in a dataset.
+ *
+ * @param dataset
+ * The dataset to set
+ */
+ public void setDataset(String dataset) {
+ this.dataset = dataset;
+ }
+ /**
+ * Library directory.
+ *
+ * @param dir
+ * library directory
+ *
+ */
+ public void setDir(File dir) throws BuildException {
+ set.setDir(dir);
+ }
+ /**
+ * Sets the property name for the 'if' condition.
+ *
+ * The library set will be ignored unless the property is defined.
+ *
+ * The value of the property is insignificant, but values that would imply
+ * misinterpretation ("false", "no") will throw an exception when
+ * evaluated.
+ *
+ * @param propName
+ * property name
+ */
+ public void setIf(String propName) {
+ ifCond = propName;
+ }
+ /**
+ * Comma-separated list of library names without leading prefixes, such as
+ * "lib", or extensions, such as ".so" or ".a".
+ *
+ */
+ public void setLibs(CUtil.StringArrayBuilder libs) throws BuildException {
+ libnames = libs.getValue();
+ // If this is not active.. then it's ok if the lib names are invalid.
+ // so we can do a: <libset if="x.lib" dir="." libs="${x.lib}"/>
+ if (!isActive(getProject()))
+ return;
+ for (int i = 0; i < libnames.length; i++) {
+ int lastDot = libnames[i].lastIndexOf('.');
+ if (lastDot >= 0) {
+ String extension = libnames[i].substring(lastDot);
+ if (extension.equalsIgnoreCase(".lib")
+ || extension.equalsIgnoreCase(".so")
+ || extension.equalsIgnoreCase(".a")) {
+ getProject().log(
+ "Suspicious library name ending with \""
+ + extension + "\": " + libnames[i], Project.MSG_DEBUG );
+ }
+ }
+ if (libnames[i].length() >= 3
+ && libnames[i].substring(0, 3).equalsIgnoreCase("lib")) {
+ getProject().log(
+ "Suspicious library name starting with \"lib\": "
+ + libnames[i], Project.MSG_DEBUG);
+ }
+ }
+ }
+ public void setProject(Project project) {
+ set.setProject(project);
+ super.setProject(project);
+ }
+ /**
+ * Set the property name for the 'unless' condition.
+ *
+ * If named property is set, the library set will be ignored.
+ *
+ * The value of the property is insignificant, but values that would imply
+ * misinterpretation ("false", "no") of the behavior will throw an
+ * exception when evaluated.
+ *
+ * @param propName
+ * name of property
+ */
+ public void setUnless(String propName) {
+ unlessCond = propName;
+ }
+
+ /**
+ * Sets the preferred library type. Supported values "shared", "static", and
+ * "framework". "framework" is equivalent to "shared" on non-Darwin platforms.
+ */
+ public void setType(LibraryTypeEnum type) {
+ this.libraryType = type;
+ }
+
+ public void visitLibraries(Project project, Linker linker, File[] libpath,
+ FileVisitor visitor) throws BuildException {
+ FileSet localSet = (FileSet) set.clone();
+ //
+ // unless explicitly set
+ // will default to the linker case sensitivity
+ //
+ if (!explicitCaseSensitive) {
+ boolean linkerCaseSensitive = linker.isCaseSensitive();
+ localSet.setCaseSensitive(linkerCaseSensitive);
+ }
+ //
+ // if there was a libs attribute then
+ // add the corresponding patterns to the FileSet
+ //
+ if (libnames != null && libnames.length > 0) {
+ String[] patterns = linker.getLibraryPatterns(libnames, libraryType);
+ //
+ // if no patterns, then linker does not support libraries
+ //
+ if (patterns.length > 0) {
+ for (int i = 0; i < patterns.length; i++) {
+ PatternSet.NameEntry entry = localSet.createInclude();
+ entry.setName(patterns[i]);
+ }
+ //
+ // if there was no specified directory then
+ // run through the libpath backwards
+ //
+ if (localSet.getDir(project) == null) {
+ //
+ // scan libpath in reverse order
+ // to give earlier entries priority
+ //
+ for (int j = libpath.length - 1; j >= 0; j--) {
+ FileSet clone = (FileSet) localSet.clone();
+ clone.setDir(libpath[j]);
+ DirectoryScanner scanner = clone.getDirectoryScanner(project);
+ File basedir = scanner.getBasedir();
+ String[] files = scanner.getIncludedFiles();
+ for (int k = 0; k < files.length; k++) {
+ visitor.visit(basedir, files[k]);
+ }
+ }
+ } else {
+ DirectoryScanner scanner = localSet.getDirectoryScanner(project);
+ File basedir = scanner.getBasedir();
+ String[] files = scanner.getIncludedFiles();
+ for (int k = 0; k < files.length; k++) {
+ visitor.visit(basedir, files[k]);
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/LibraryTypeEnum.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/LibraryTypeEnum.java
new file mode 100644
index 0000000..82d7947
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/LibraryTypeEnum.java
@@ -0,0 +1,48 @@
+/*
+ *
+ * Copyright 2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.types;
+import org.apache.tools.ant.types.EnumeratedAttribute;
+/**
+ * Enumeration of library types for LibrarySet
+ *
+ * @author Curt Arnold
+ *
+ */
+public class LibraryTypeEnum extends EnumeratedAttribute {
+ /**
+ * Constructor
+ *
+ * Set by default to "shared"
+ *
+ * @see java.lang.Object#Object()
+ */
+ public LibraryTypeEnum() {
+ setValue("shared");
+ }
+ /**
+ * Gets list of acceptable values
+ *
+ * @see org.apache.tools.ant.types.EnumeratedAttribute#getValues()
+ */
+ public String[] getValues() {
+ return new String[]{"shared", // prefer shared libraries
+ "static", // prefer static libraries
+ "framework" // framework libraries (Mac OS/X)
+ // equiv to shared on other platforms
+ };
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/LinkerArgument.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/LinkerArgument.java
new file mode 100644
index 0000000..89bff18
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/LinkerArgument.java
@@ -0,0 +1,28 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.types;
+/**
+ * A linker command line argument.
+ */
+public class LinkerArgument extends CommandLineArgument {
+ public LinkerArgument() {
+ }
+ public void execute() throws org.apache.tools.ant.BuildException {
+ throw new org.apache.tools.ant.BuildException(
+ "Not an actual task, but looks like one for documentation purposes");
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/SystemIncludePath.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/SystemIncludePath.java
new file mode 100644
index 0000000..be0dbd5
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/SystemIncludePath.java
@@ -0,0 +1,45 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.types;
+import org.apache.tools.ant.Project;
+/**
+ * A system include path.
+ *
+ * Files located using a system include path will not participate in dependency
+ * analysis.
+ *
+ * Standard include paths for a compiler should not be specified since these
+ * should be determined from environment variables or configuration files by
+ * the compiler adapter.
+ *
+ * Works like other paths in Ant with with the addition of "if" and "unless"
+ * conditions.
+ *
+ * @author Curt Arnold
+ */
+public class SystemIncludePath extends ConditionalPath {
+ public SystemIncludePath(Project project) {
+ super(project);
+ }
+ public SystemIncludePath(Project p, String path) {
+ super(p, path);
+ }
+ public void execute() throws org.apache.tools.ant.BuildException {
+ throw new org.apache.tools.ant.BuildException(
+ "Not an actual task, but looks like one for documentation purposes");
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/SystemLibrarySet.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/SystemLibrarySet.java
new file mode 100644
index 0000000..02d08c8
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/SystemLibrarySet.java
@@ -0,0 +1,37 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.types;
+/**
+ * A set of system library names. Timestamp or location of system libraries are
+ * not considered in dependency analysis.
+ *
+ * Libraries can also be added to a link by specifying them in a fileset.
+ *
+ * For most Unix-like compilers, syslibset will result in a series of -l and -L
+ * linker arguments. For Windows compilers, the library names will be used to
+ * locate the appropriate library files which will be added to the linkers
+ * input file list as if they had been specified in a fileset.
+ */
+public class SystemLibrarySet extends LibrarySet {
+ public SystemLibrarySet() {
+ super();
+ }
+ public void execute() throws org.apache.tools.ant.BuildException {
+ throw new org.apache.tools.ant.BuildException(
+ "Not an actual task, but looks like one for documentation purposes");
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/UndefineArgument.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/UndefineArgument.java
new file mode 100644
index 0000000..2a18fca
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/UndefineArgument.java
@@ -0,0 +1,153 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.types;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CUtil;
+
+import org.apache.tools.ant.BuildException;
+/**
+ * Preprocessor macro undefinition.
+ *
+ * @author Mark A Russell <a
+ * href="mailto:mark_russell@csgsystems.com">mark_russell@csg_systems.com
+ * </a>
+ */
+public class UndefineArgument {
+ /**
+ * This method returns an array of UndefineArgument and DefineArgument's by
+ * merging a base list with an override list.
+ *
+ * Any define in the base list with a name that appears in the override
+ * list is suppressed. All entries in the override list are preserved
+ *
+ */
+ public static UndefineArgument[] merge(UndefineArgument[] base,
+ UndefineArgument[] override) {
+ if (base.length == 0) {
+ UndefineArgument[] overrideClone = (UndefineArgument[]) override
+ .clone();
+ return overrideClone;
+ }
+ if (override.length == 0) {
+ UndefineArgument[] baseClone = (UndefineArgument[]) base.clone();
+ return baseClone;
+ }
+ Vector unduplicated = new Vector(base.length);
+ for (int i = 0; i < base.length; i++) {
+ UndefineArgument current = base[i];
+ String currentName = current.getName();
+ boolean match = false;
+ if (currentName == null) {
+ match = true;
+ } else {
+ for (int j = 0; j < override.length; j++) {
+ UndefineArgument over = override[j];
+ String overName = over.getName();
+ if (overName != null && overName.equals(currentName)) {
+ match = true;
+ break;
+ }
+ }
+ }
+ if (!match) {
+ unduplicated.addElement(current);
+ }
+ }
+ UndefineArgument[] combined = new UndefineArgument[unduplicated.size()
+ + override.length];
+ unduplicated.copyInto(combined);
+ int offset = unduplicated.size();
+ for (int i = 0; i < override.length; i++) {
+ combined[offset + i] = override[i];
+ }
+ return combined;
+ }
+ private boolean define = false;
+ private String ifCond;
+ private String name;
+ private String unlessCond;
+ public UndefineArgument() {
+ }
+ protected UndefineArgument(boolean isDefine) {
+ this.define = isDefine;
+ }
+ public void execute() throws org.apache.tools.ant.BuildException {
+ throw new org.apache.tools.ant.BuildException(
+ "Not an actual task, but looks like one for documentation purposes");
+ }
+ /** Returns the name of the define */
+ public final String getName() {
+ return name;
+ }
+ /** Returns the value of the define */
+ public String getValue() {
+ return null;
+ }
+ /**
+ * Returns true if the define's if and unless conditions (if any) are
+ * satisfied.
+ *
+ * @exception BuildException
+ * throws build exception if name is not set
+ */
+ public final boolean isActive(org.apache.tools.ant.Project p)
+ throws BuildException {
+ if (name == null) {
+ throw new BuildException("<define> is missing name attribute");
+ }
+ return CUtil.isActive(p, ifCond, unlessCond);
+ }
+ /** Returns true if this is a define, false if an undefine. */
+ public final boolean isDefine() {
+ return define;
+ }
+ /**
+ * Sets the property name for the 'if' condition.
+ *
+ * The define will be ignored unless the property is defined.
+ *
+ * The value of the property is insignificant, but values that would imply
+ * misinterpretation ("false", "no") will throw an exception when
+ * evaluated.
+ *
+ * @param propName
+ * property name
+ */
+ public final void setIf(String propName) {
+ ifCond = propName;
+ }
+ /** Set the name attribute */
+ public final void setName(String name) {
+ this.name = name;
+ }
+ /**
+ * Set the property name for the 'unless' condition.
+ *
+ * If named property is set, the define will be ignored.
+ *
+ * The value of the property is insignificant, but values that would imply
+ * misinterpretation ("false", "no") of the behavior will throw an
+ * exception when evaluated.
+ *
+ * @param propName
+ * name of property
+ */
+ public final void setUnless(String propName) {
+ unlessCond = propName;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/userdefine/CommandLineUserDefine.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/userdefine/CommandLineUserDefine.java
new file mode 100644
index 0000000..7c66eb1
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/userdefine/CommandLineUserDefine.java
@@ -0,0 +1,389 @@
+package net.sf.antcontrib.cpptasks.userdefine;
+
+import java.io.File;
+import java.util.Iterator;
+import java.util.StringTokenizer;
+import java.util.Vector;
+
+import net.sf.antcontrib.cpptasks.CCTask;
+import net.sf.antcontrib.cpptasks.CUtil;
+import net.sf.antcontrib.cpptasks.types.CommandLineArgument;
+import net.sf.antcontrib.cpptasks.types.ConditionalFileSet;
+import net.sf.antcontrib.cpptasks.types.LibrarySet;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.DirectoryScanner;
+import org.apache.tools.ant.Project;
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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.
+ */
+public class CommandLineUserDefine {
+
+ String command;
+
+ /*
+ * The follows variable set at child class.
+ */
+ String includeFileFlag = null;
+ String entryPointFlag = null;
+ String subSystemFlag = null;
+ String mapFlag = null;
+ String pdbFlag = null;
+ String outputFileFlag = null;
+ String includePathDelimiter = null;
+
+ /*
+ * get lib string if Vendor = "gcc", it should respectively aadd "-(" and ")-"
+ * at library set before and end. This value set at userDefineCompiler class.
+ */
+ Vector<String> libSetList = new Vector<String>();
+ Vector<String> fileList = new Vector<String>();
+ public void command(CCTask cctask, UserDefineDef userdefine){
+ File workdir;
+ File outdir;
+ Project project = cctask.getProject();
+ if(userdefine.getWorkdir() == null) {
+ workdir = new File(".");
+ }
+ else {
+ workdir = userdefine.getWorkdir();
+ }
+
+ /*
+ * generate cmdline= command + args + includepath + endargs + outfile
+ */
+ Vector args = new Vector();
+ Vector argsWithoutSpace = new Vector();
+ Vector endargs = new Vector();
+ Vector endargsWithoutSpace = new Vector();
+ Vector includePath = new Vector();
+
+ /*
+ * Generate cmdline = command +
+ * general args +
+ * outputflag + outputfile
+ * subsystemFlag + subsystemValue +
+ * includeFlag + includeFile +
+ * includeFileincludpath +
+ * entryPointFlag + entryPointValue +
+ * mapFlag + mapValue +
+ * pdbFlag + pdbValue +
+ * endargs +
+ *
+ *
+ */
+ /*
+ * get Args.
+ */
+ CommandLineArgument[] argument = userdefine.getActiveProcessorArgs();
+ for (int j = 0; j < argument.length; j++) {
+ if (argument[j].getLocation() == 0) {
+ args.addElement(argument[j].getValue());
+ } else {
+ endargs.addElement(argument[j].getValue());
+ }
+ }
+ /*
+ * get include path.
+ */
+ String[] incPath = userdefine.getActiveIncludePaths();
+ for (int j = 0; j < incPath.length; j++) {
+ if(incPath[j].indexOf(' ') >= 0) {
+ includePath.addElement( includePathDelimiter + incPath[j]);
+ //includePath.addElement( includePathDelimiter + "\"" + incPath[j] + "\"");
+ }
+ else {
+ includePath.addElement( includePathDelimiter + incPath[j]);
+ }
+ }
+ /*
+ * Remove space in args and endargs.
+ */
+ for ( int i=0; i < args.size(); i++) {
+ String str = (String)args.get(i);
+ StringTokenizer st = new StringTokenizer(str);
+ while(st.hasMoreTokens()) {
+ argsWithoutSpace.addElement(st.nextToken());
+ }
+ }
+ for ( int i=0; i < endargs.size(); i++) {
+ String str = (String)endargs.get(i);
+ StringTokenizer st = new StringTokenizer(str);
+ while(st.hasMoreTokens()) {
+ endargsWithoutSpace.addElement(st.nextToken());
+ }
+ }
+
+ int cmdLen = 0;
+ if(userdefine.getOutdir() == null) {
+ outdir = new File(".");
+ /*
+ * command + args + endargs + includepath + sourcefile
+ */
+ cmdLen = 1 + argsWithoutSpace.size() + endargsWithoutSpace.size() + includePath.size() + 1;
+ }
+ else {
+ outdir = userdefine.getOutdir();
+ /*
+ * command + args + endargs + includepath + sourcefile + outfile
+ */
+ cmdLen = 1 + argsWithoutSpace.size() + endargsWithoutSpace.size() + includePath.size() + 2;
+ }
+ if (includeFileFlag != null && includeFileFlag.trim().length() > 0){
+ cmdLen++;
+ }
+ if (entryPointFlag != null && entryPointFlag.trim().length() > 0){
+ cmdLen++;
+ }
+ if (subSystemFlag != null && subSystemFlag.trim().length() > 0){
+ cmdLen++;
+ }
+ if (mapFlag != null && mapFlag.trim().length() > 0){
+ cmdLen++;
+ }
+ if (pdbFlag != null && pdbFlag.trim().length() > 0){
+ cmdLen++;
+ }
+ if (libSetList != null && libSetList.size() > 0){
+ cmdLen = cmdLen + libSetList.size();
+ }
+ if (fileList != null){
+ cmdLen = cmdLen + fileList.size();
+ }
+ /*
+ * In gcc the "cr" flag should follow space then add outputfile name, otherwise
+ * it will pop error.
+ */
+ if (outputFileFlag != null && outputFileFlag.trim().length() > 0){
+ if (outputFileFlag.trim().equalsIgnoreCase("-cr")){
+ cmdLen = cmdLen + 2;
+ }else {
+ cmdLen++;
+ }
+
+ }
+ /*
+ * for every source file
+ * if file is header file, just skip it (add later)
+ */
+ Vector srcSets = userdefine.getSrcSets();
+ if (srcSets.size() == 0) {
+ String[] cmd = new String[cmdLen - 1];
+ int index = 0;
+ cmd[index++] = this.command;
+
+
+
+ Iterator iter = argsWithoutSpace.iterator();
+ while (iter.hasNext()) {
+ cmd[index++] = project.replaceProperties((String)iter.next());
+ //cmd[index++] = (String)iter.next();
+ }
+
+ iter = endargsWithoutSpace.iterator();
+ while (iter.hasNext()) {
+ cmd[index++] = (String)iter.next();
+ }
+
+ /*
+ * "OutputFlag + outputFile" as first option follow command.exe.
+ */
+ if (outputFileFlag != null && outputFileFlag.trim().length() > 0){
+ if (outputFileFlag.trim().equalsIgnoreCase("-cr")){
+ cmd[index++] = outputFileFlag;
+ cmd[index++] = userdefine.getOutputFile();
+ }else {
+ cmd[index++] = outputFileFlag + userdefine.getOutputFile();
+ }
+ }
+
+ /*
+ * Add fileList to cmd
+ */
+ if (fileList != null && fileList.size()> 0){
+ for (int i = 0; i < fileList.size(); i++){
+ cmd[index++] = fileList.get(i);
+ }
+ }
+
+ if (subSystemFlag != null && subSystemFlag.trim().length() > 0){
+ cmd[index++] = subSystemFlag + userdefine.getSubSystemvalue();
+ }
+ if (includeFileFlag != null && includeFileFlag.trim().length() > 0){
+ cmd[index++] = includeFileFlag + userdefine.getIncludeFile();
+ }
+
+ iter = includePath.iterator();
+ while (iter.hasNext()) {
+ cmd[index++] = (String)iter.next();
+ }
+
+ if (entryPointFlag != null && entryPointFlag.trim().length() > 0){
+ //
+ // If GCC link use __ModuleEntrypoint instead of _ModuleEntryPoint;
+ //
+ if (entryPointFlag.equalsIgnoreCase("-e")){
+ cmd[index++] = entryPointFlag + "_" + userdefine.getEntryPointvalue();
+ } else {
+ cmd[index++] = entryPointFlag + userdefine.getEntryPointvalue();
+ }
+
+ }
+ if (mapFlag != null && mapFlag.trim().length() > 0){
+ cmd[index++] = mapFlag + userdefine.getMapvalue();
+ }
+ if (pdbFlag != null && pdbFlag.trim().length() > 0){
+ cmd[index++] = pdbFlag + userdefine.getPdbvalue();
+ }
+
+ if (userdefine.getOutdir() != null){
+ // will add code to generate outfile name and flag
+ cmd[index++] = "/nologo";
+ }
+
+ if (libSetList != null && libSetList.size() > 0){
+ for (int i = 0; i < libSetList.size(); i++){
+ cmd[index++] = libSetList.get(i);
+ }
+ }
+
+ // execute the command
+ int retval = runCommand(cctask, workdir, cmd);
+ // if with monitor, add more code
+ if (retval != 0) {
+ throw new BuildException(this.command
+ + " failed with return code " + retval,
+ cctask.getLocation());
+ }
+ }
+
+ //
+ // if have source file append source file in command land.
+ //
+ for (int i = 0; i < srcSets.size(); i++) {
+ ConditionalFileSet srcSet = (ConditionalFileSet) srcSets
+ .elementAt(i);
+ if (srcSet.isActive()) {
+ // Find matching source files
+ DirectoryScanner scanner = srcSet.getDirectoryScanner(project);
+ // Check each source file - see if it needs compilation
+ String[] fileNames = scanner.getIncludedFiles();
+ for (int j = 0; j < fileNames.length; j++){
+ String[] cmd = new String[cmdLen];
+ int index = 0;
+ cmd[index++] = this.command;
+
+
+
+ Iterator iter = argsWithoutSpace.iterator();
+ while (iter.hasNext()) {
+ cmd[index++] = (String)iter.next();
+ }
+
+ iter = endargsWithoutSpace.iterator();
+ while (iter.hasNext()) {
+ cmd[index++] = (String)iter.next();
+ }
+
+ /*
+ * Add outputFileFlag and output file to cmd
+ */
+ if (outputFileFlag != null && outputFileFlag.length()> 0){
+ if (outputFileFlag.trim().equalsIgnoreCase("-cr")){
+ cmd[index++] = outputFileFlag;
+ cmd[index++] = userdefine.getOutputFile();
+ }else {
+ cmd[index++] = outputFileFlag + userdefine.getOutputFile();
+ }
+ }
+
+ /*
+ * Add fileList to cmd
+ */
+ if (fileList != null && fileList.size()> 0){
+ for (int s = 0; s < fileList.size(); s++){
+ cmd[index++] = fileList.get(s);
+ }
+ }
+ if (subSystemFlag != null && subSystemFlag.length()> 0){
+ cmd[index++] = subSystemFlag + userdefine.getSubSystemvalue();
+ }
+ if (includeFileFlag != null && includeFileFlag.length()> 0){
+ cmd[index++] = includeFileFlag + userdefine.getIncludeFile();
+ }
+
+ iter = includePath.iterator();
+ while (iter.hasNext()) {
+ cmd[index++] = (String)iter.next();
+ }
+ if (userdefine.getOutdir() != null){
+ // will add code to generate outfile name and flag
+ cmd[index++] = "/nologo";
+ }
+
+ if (entryPointFlag != null && entryPointFlag.length()> 0){
+ cmd[index++] = entryPointFlag + userdefine.getEntryPointvalue();
+ }
+ if (mapFlag != null && mapFlag.length() > 0){
+ cmd[index++] = mapFlag + userdefine.getMapvalue();
+ }
+ if (pdbFlag != null && pdbFlag.length() > 0){
+ cmd[index++] = pdbFlag + userdefine.getPdbvalue();
+ }
+
+ if (libSetList != null && libSetList.size() > 0){
+ for (int k = 0; k < libSetList.size(); k++){
+ cmd[index++] = libSetList.get(k);
+ }
+ }
+
+ // execute the command
+ cmd[index++] = scanner.getBasedir() + "/" + fileNames[j];
+ for (int k = 0; k < cmd.length; k++){
+ }
+ int retval = runCommand(cctask, workdir, cmd);
+ // if with monitor, add more code
+ if (retval != 0) {
+ throw new BuildException(this.command
+ + " failed with return code " + retval,
+ cctask.getLocation());
+ }
+ }
+ }
+ }
+ }
+
+ protected int runCommand(CCTask task, File workingDir, String[] cmdline)
+ throws BuildException {
+ return CUtil.runCommand(task, workingDir, cmdline, false, null);
+
+ }
+
+ protected String getInputFileArgument(File outputDir, String filename,
+ int index) {
+ //
+ // if there is an embedded space,
+ // must enclose in quotes
+ if (filename.indexOf(' ') >= 0) {
+ StringBuffer buf = new StringBuffer("\"");
+ buf.append(filename);
+ buf.append("\"");
+ return buf.toString();
+ }
+ return filename;
+ }
+
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/userdefine/UserDefineArgument.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/userdefine/UserDefineArgument.java
new file mode 100644
index 0000000..85d9a04
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/userdefine/UserDefineArgument.java
@@ -0,0 +1,31 @@
+/*
+ *
+ * Copyright 2002-2006 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.userdefine;
+
+import net.sf.antcontrib.cpptasks.types.CommandLineArgument;
+
+public class UserDefineArgument extends CommandLineArgument {
+
+ public UserDefineArgument() {
+ }
+
+ public void execute() throws org.apache.tools.ant.BuildException {
+ throw new org.apache.tools.ant.BuildException(
+ "Not an actual task, but looks like one for documentation purposes");
+ }
+
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/userdefine/UserDefineCompiler.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/userdefine/UserDefineCompiler.java
new file mode 100644
index 0000000..382975a
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/userdefine/UserDefineCompiler.java
@@ -0,0 +1,219 @@
+/*
+ *
+ * Copyright 2002-2006 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.userdefine;
+
+import org.apache.tools.ant.Project;
+
+import net.sf.antcontrib.cpptasks.CCTask;
+import org.tianocore.build.toolchain.*;
+
+public class UserDefineCompiler extends CommandLineUserDefine {
+
+ public UserDefineCompiler(CCTask cctask, UserDefineDef userdefineDef) {
+ String arch = null;
+ String os = null;
+ String vendor = null;
+ String commandType = null;
+ Project project = cctask.getProject();
+ // get command string
+ if (cctask.getArch() == null) {
+ arch = project.getProperty("ARCH");
+ if (arch == null) {
+ arch = System.getProperty("os.arch");
+ }
+ } else {
+ arch = cctask.getArch();
+ }
+ arch = arch.toUpperCase();
+ if (cctask.getOs() == null) {
+ os = project.getProperty("OS");
+ if (os == null) {
+ os = System.getProperty("os.name");
+ }
+ } else {
+ os = cctask.getOs();
+ }
+
+ commandType = userdefineDef.getType();
+
+ if (commandType != null) {
+ if (ToolChainFactory.getValue(arch + "_" + commandType + "_VENDOR") != null
+ && ToolChainFactory.getValue(
+ arch + "_" + commandType + "_VENDOR").trim()
+ .length() > 0) {
+ vendor = ToolChainFactory.getValue(arch + "_" + commandType
+ + "_VENDOR");
+ } else if (ToolChainFactory.getValue(arch + "_VENDOR") != null) {
+ vendor = ToolChainFactory.getValue(arch + "_VENDOR");
+ }
+ }
+
+ // look if ARCH_VENDOR_OS_COMMANDTYPE is existed
+ if (arch != null && vendor != null && os != null && commandType != null) {
+ command = project.getProperty(arch + "_" + vendor + "_" + os + "_"
+ + commandType);
+ }
+ // look if ARCH_VENDOR_COMMANDTYPE is existed
+ if (command == null) {
+ if (arch != null && vendor != null && commandType != null) {
+ command = project.getProperty(arch + "_" + vendor + "_"
+ + commandType);
+ }
+ }
+ // look if ARCH_COMMANDTYPE is existed
+ if (command == null) {
+ if (arch != null && commandType != null) {
+ command = project.getProperty(arch + "_" + commandType);
+ }
+ }
+ // look if COMMANDTYPE is existed
+ if (command == null) {
+ if (commandType != null) {
+ command = project.getProperty(commandType);
+ }
+ }
+ // using the default value from VENDOR_OS_COMMANDTYPE or
+ // VENDOR_COMMANDTYPE
+ if (command == null) {
+ if (vendor != null && os != null && commandType != null) {
+ String str = vendor + "_" + os + "_" + commandType;
+ command = UserDefineMapping.getDefaultCommand(str);
+ }
+ }
+ // VENDOR_COMMANDTYPE
+ if (command == null) {
+ if (vendor != null && commandType != null) {
+ String str = vendor + "_" + commandType;
+ command = UserDefineMapping.getDefaultCommand(str);
+ }
+ }
+ // just give the name whatever
+ if (command == null) {
+ command = "cl";
+ }
+
+ // initialize the includePathDelimiter
+ if (userdefineDef.getIncludepathDelimiter() != null) {
+ includePathDelimiter = userdefineDef.getIncludepathDelimiter();
+ }
+ // else find VENDOR
+ else {
+ if (vendor != null) {
+ includePathDelimiter = UserDefineMapping
+ .getIncludePathDelimiter(vendor, commandType);
+ }
+ }
+ if (includePathDelimiter == null) {
+ includePathDelimiter = "-I";
+ }
+ /*
+ * Set libSet.
+ */
+ if (userdefineDef.getLibSet() != null
+ && userdefineDef.getLibSet().size() > 0) {
+ String[] libList;
+ if (vendor.equalsIgnoreCase("GCC")) {
+ libSetList.add("-(");
+ for (int i = 0; i < userdefineDef.getLibSet().size(); i++) {
+ libList = userdefineDef.getLibSet().get(i).getLibs();
+ for (int j = 0; j < libList.length; j++) {
+ libSetList.add(libList[j]);
+ }
+ }
+ libSetList.add("-)");
+ } else {
+ for (int i = 0; i < userdefineDef.getLibSet().size(); i++) {
+ libList = userdefineDef.getLibSet().get(i).getLibs();
+ for (int j = 0; j < libList.length; j++) {
+ libSetList.add(libList[j]);
+ }
+ }
+ }
+ }
+ /*
+ * set includeFileFlag
+ */
+ if (userdefineDef.getIncludeFile() != null) {
+ if (userdefineDef.getIncludeFileFlag() != null) {
+ includeFileFlag = userdefineDef.getIncludeFileFlag();
+ } else {
+ includeFileFlag = UserDefineMapping.getCompellingIncFileFlag(
+ vendor, commandType);
+ }
+ }
+ /*
+ * set entryPointFlag
+ */
+ if (userdefineDef.getEntryPointvalue() != null) {
+ if (userdefineDef.getEntryPointFlag() != null) {
+ entryPointFlag = userdefineDef.getEntryPointFlag();
+ } else {
+ entryPointFlag = UserDefineMapping.getEntryPointFlag(vendor,
+ commandType);
+ }
+ }
+ /*
+ * set subSystemFlag
+ */
+ if (userdefineDef.getSubSystemvalue() != null) {
+ if (userdefineDef.getSubSystemFlag() != null) {
+ subSystemFlag = userdefineDef.getSubSystemFlag();
+ } else {
+ subSystemFlag = UserDefineMapping.getSubSystemFlag(vendor,
+ commandType);
+ }
+ }
+ /*
+ * set mapFlag
+ */
+ if (userdefineDef.getMapvalue() != null) {
+ if (userdefineDef.getMapFlag() != null) {
+ mapFlag = userdefineDef.getMapFlag();
+ } else {
+ mapFlag = UserDefineMapping.getMapFlag(vendor, commandType);
+ }
+ }
+ /*
+ * set pdbFlag
+ */
+ if (userdefineDef.getPdbvalue() != null) {
+ if (userdefineDef.getPdbFlag() != null) {
+ pdbFlag = userdefineDef.getPdbFlag();
+ } else {
+ pdbFlag = UserDefineMapping.getPdbFlag(vendor, commandType);
+ }
+ }
+ /*
+ * set outputFileFlag
+ */
+ if (userdefineDef.getOutputFile() != null) {
+ if (userdefineDef.getOutPutFlag() != null) {
+ outputFileFlag = userdefineDef.getOutPutFlag();
+ } else {
+ outputFileFlag = UserDefineMapping.getOutputFileFlag(vendor,
+ arch, commandType);
+ }
+ }
+
+ /*
+ * set fileList
+ */
+ if (userdefineDef.getFileList() != null) {
+ fileList = userdefineDef.getFileList();
+ }
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/userdefine/UserDefineDef.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/userdefine/UserDefineDef.java
new file mode 100644
index 0000000..f17edcf
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/userdefine/UserDefineDef.java
@@ -0,0 +1,497 @@
+/*
+ *
+ * Copyright 2002-2006 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.userdefine;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.util.Vector;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.FileList;
+import org.apache.tools.ant.types.FileSet;
+
+import sun.nio.cs.ext.TIS_620;
+
+import net.sf.antcontrib.cpptasks.ProcessorDef;
+import net.sf.antcontrib.cpptasks.types.AslcompilerArgument;
+import net.sf.antcontrib.cpptasks.types.ConditionalPath;
+import net.sf.antcontrib.cpptasks.types.IncludePath;
+import net.sf.antcontrib.cpptasks.types.LibrarySet;
+
+public class UserDefineDef extends ProcessorDef{
+
+ public UserDefineDef () {}
+
+ private String type = "CC";
+ private String includepathDelimiter;
+
+ private File outdir;
+ private File workdir;
+
+ private String inputSuffix;
+ private String outputSuffix;
+
+ private Vector<IncludePath> includePaths= new Vector<IncludePath>();
+ private Vector<FileList> fileSetList = new Vector<FileList>();
+
+ /**
+ * New adding for support GCC toolchain.
+ * Most of those only have one value for example :
+ * entryPoint, mapFile, pdbFile, define those as element because
+ * if attribut too much the command line is not good-lookinng.
+ */
+
+ private Vector<UserDefineElement> includeFiles = new Vector<UserDefineElement>();
+ private Vector<UserDefineElement> outPutFiles = new Vector<UserDefineElement>();
+ private Vector<UserDefineElement> subSystem = new Vector<UserDefineElement>();
+ private Vector<UserDefineElement> entryPoint = new Vector<UserDefineElement>();
+ private Vector<UserDefineElement> map = new Vector<UserDefineElement>();
+ private Vector<UserDefineElement> pdb = new Vector<UserDefineElement>();
+ private Vector<LibrarySet> libSet = new Vector<LibrarySet>();
+
+ public void execute() throws org.apache.tools.ant.BuildException {
+ throw new org.apache.tools.ant.BuildException(
+ "Not an actual task, but looks like one for documentation purposes");
+ }
+
+
+ public void addConfiguredArgument(UserDefineArgument arg) {
+ if (isReference()) {
+ throw noChildrenAllowed();
+ }
+ addConfiguredProcessorArg(arg);
+ }
+
+ /**
+ * Creates an include path.
+ */
+ public IncludePath createIncludePath() {
+ Project p = getProject();
+ if (p == null) {
+ throw new java.lang.IllegalStateException("project must be set");
+ }
+ if (isReference()) {
+ throw noChildrenAllowed();
+ }
+ IncludePath path = new IncludePath(p);
+ includePaths.addElement(path);
+ return path;
+ }
+
+
+ /**
+ * Add a <includepath> if specify the file attribute
+ *
+ * @throws BuildException
+ * if the specify file not exist
+ */
+ protected void loadFile(Vector activePath, File file) throws BuildException {
+ FileReader fileReader;
+ BufferedReader in;
+ String str;
+ if (!file.exists()) {
+ throw new BuildException("The file " + file + " is not existed");
+ }
+ try {
+ fileReader = new FileReader(file);
+ in = new BufferedReader(fileReader);
+ while ((str = in.readLine()) != null) {
+ if (str.trim() == "") {
+ continue;
+ }
+ str = getProject().replaceProperties(str);
+ activePath.addElement(str.trim());
+ }
+ } catch (Exception e) {
+ throw new BuildException(e.getMessage());
+ }
+ }
+
+ /**
+ * Returns the specific include path.
+ */
+ public String[] getActiveIncludePaths() {
+ if (isReference()) {
+ return ((UserDefineDef) getCheckedRef(UserDefineDef.class,
+ "UserDefineDef")).getActiveIncludePaths();
+ }
+ return getActivePaths(includePaths);
+ }
+
+ private String[] getActivePaths(Vector paths) {
+ Project p = getProject();
+ if (p == null) {
+ throw new java.lang.IllegalStateException("project not set");
+ }
+ Vector activePaths = new Vector(paths.size());
+ for (int i = 0; i < paths.size(); i++) {
+ ConditionalPath path = (ConditionalPath) paths.elementAt(i);
+ if (path.isActive(p)) {
+ if (path.getFile() == null) {
+ String[] pathEntries = path.list();
+ for (int j = 0; j < pathEntries.length; j++) {
+ activePaths.addElement(pathEntries[j]);
+ }
+ } else {
+ loadFile(activePaths, path.getFile());
+ }
+ }
+ }
+ String[] pathNames = new String[activePaths.size()];
+ activePaths.copyInto(pathNames);
+ return pathNames;
+ }
+
+ public String getIncludepathDelimiter() {
+ if (isReference()) {
+ return ((UserDefineDef) getCheckedRef(UserDefineDef.class,
+ "UserDefineDef")).getIncludepathDelimiter();
+ }
+ return includepathDelimiter;
+ }
+
+ public void setIncludepathDelimiter(String includepathDelimiter) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ this.includepathDelimiter = includepathDelimiter;
+ }
+
+ public String getInputSuffix() {
+ if (isReference()) {
+ return ((UserDefineDef) getCheckedRef(UserDefineDef.class,
+ "UserDefineDef")).getInputSuffix();
+ }
+ return inputSuffix;
+ }
+
+ public void setInputSuffix(String inputSuffix) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ this.inputSuffix = inputSuffix;
+ }
+
+ public File getOutdir() {
+ if (isReference()) {
+ return ((UserDefineDef) getCheckedRef(UserDefineDef.class,
+ "UserDefineDef")).getOutdir();
+ }
+ return outdir;
+ }
+
+ public void setOutdir(File outdir) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ this.outdir = outdir;
+ }
+
+ public String getOutputSuffix() {
+ if (isReference()) {
+ return ((UserDefineDef) getCheckedRef(UserDefineDef.class,
+ "UserDefineDef")).getOutputSuffix();
+ }
+ return outputSuffix;
+ }
+
+ public void setOutputSuffix(String outputSuffix) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ this.outputSuffix = outputSuffix;
+ }
+
+ public String getType() {
+ if (isReference()) {
+ return ((UserDefineDef) getCheckedRef(UserDefineDef.class,
+ "UserDefineDef")).getType();
+ }
+ return type;
+ }
+
+ public void setType(String type) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ this.type = type;
+ }
+
+ public File getWorkdir() {
+ if (isReference()) {
+ return ((UserDefineDef) getCheckedRef(UserDefineDef.class,
+ "UserDefineDef")).getWorkdir();
+ }
+ return workdir;
+ }
+
+ public void setWorkdir(File workdir) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ this.workdir = workdir;
+ }
+
+ /**
+ * Add an libSet.
+ */
+ public LibrarySet createLibset() {
+ if (isReference()){
+ throw noChildrenAllowed();
+ }
+ LibrarySet lib = new LibrarySet();
+ libSet.addElement(lib);
+ return lib;
+ }
+
+ public String getLibSetString(){
+ String libString = null;
+ for (int i = 0; i < libSet.size(); i++){
+ String[] libList = libSet.get(i).getLibs();
+ for (int j = 0; j < libList.length; j++){
+ libString = libString + libList[j] + " ";
+ }
+ }
+ return libString;
+ }
+
+ public Vector<LibrarySet> getLibSet(){
+ return this.libSet;
+ }
+
+ /**
+ * Add map element
+ */
+ public void addMap(UserDefineElement mapElement){
+ if (isReference()){
+ throw noChildrenAllowed();
+ }else{
+ this.map.addElement(mapElement);
+ }
+ }
+
+ public Vector<UserDefineElement> getMap (){
+ return this.map;
+ }
+
+ public String getMapvalue (){
+ if (this.map.size() > 0){
+ /*
+ * If user set more than one map use the first one.
+ */
+ return this.map.get(0).value;
+ }
+ return null;
+
+ }
+ public String getMapFlag(){
+ if (this.map.size() > 0){
+ /*
+ * If user set more than one map use the first one.
+ */
+ return this.map.get(0).flag;
+ }
+ return null;
+ }
+ /**
+ * Add pdb element
+ */
+ public void addPdb(UserDefineElement pdbElement){
+ if (isReference()){
+ throw noChildrenAllowed();
+ }
+ this.pdb.addElement(pdbElement);
+ }
+
+ public Vector<UserDefineElement> getPdb(){
+ return this.pdb;
+ }
+ public String getPdbvalue (){
+ if (this.pdb.size() > 0){
+ /*
+ * If user set more than one pdb use the first one.
+ *
+ */
+ return this.pdb.get(0).value;
+ }
+ return null;
+
+ }
+ public String getPdbFlag(){
+ if (this.pdb.size() > 0){
+ /*
+ * If user set more than one pdb use the first one.
+ */
+ return this.pdb.get(0).flag;
+ }
+ return null;
+ }
+
+ /**
+ * add entryPoint element.
+ */
+ public void addEntryPoint(UserDefineElement entryPointElement){
+ if (isReference()){
+ throw noChildrenAllowed();
+ }
+ this.entryPoint.addElement(entryPointElement);
+ }
+
+ public Vector<UserDefineElement> getEntryPoint(){
+ return this.entryPoint;
+ }
+
+ public String getEntryPointvalue (){
+ if (this.entryPoint.size() > 0){
+ /*
+ * If user set more than one entryPoint use the first one.
+ */
+ return this.entryPoint.get(0).value;
+ }
+ return null;
+
+ }
+ public String getEntryPointFlag(){
+ if (this.entryPoint.size() > 0){
+ /*
+ * If user set more than one entry point use the first one.
+ */
+ return this.entryPoint.get(0).flag;
+ }
+ return null;
+ }
+
+ /**
+ * Add subSystem element.
+ */
+ public void addSubSystem (UserDefineElement subSystem){
+ if (isReference()){
+ throw noChildrenAllowed();
+ }
+ this.subSystem.addElement(subSystem);
+ }
+ public Vector<UserDefineElement> getSubSystem (){
+ return this.subSystem;
+ }
+
+ public String getSubSystemvalue (){
+ if (this.subSystem.size() > 0){
+ /*
+ * If user set more than one subsystem use the first one.
+ */
+ return this.subSystem.get(0).value;
+ }
+ return null;
+
+ }
+ public String getSubSystemFlag(){
+ if (this.subSystem.size() > 0){
+ /*
+ * If user set more than one subsystem use the first one.
+ */
+ return this.subSystem.get(0).flag;
+ }
+ return null;
+ }
+ /**
+ * Add includeFile element
+ */
+ public void addIncludeFile (UserDefineElement includeFile){
+ if (isReference()){
+ throw noChildrenAllowed();
+ }
+ this.includeFiles.addElement(includeFile);
+ }
+ public Vector<UserDefineElement> getIncludeFiles(){
+ return this.includeFiles;
+ }
+
+ public String getIncludeFile (){
+ if (this.includeFiles.size() > 0){
+ /*
+ * If user set more than one map use the first one.
+ */
+ return this.includeFiles.get(0).value;
+ }
+ return null;
+
+ }
+ public String getIncludeFileFlag(){
+ if (this.includeFiles.size() > 0){
+ /*
+ * If user set more than one map use the first one.
+ */
+ return this.includeFiles.get(0).flag;
+ }
+ return null;
+ }
+
+ /**
+ * Add OutputFile element
+ */
+ public void addOutputFile (UserDefineElement outPutFile){
+ if (isReference()){
+ throw noChildrenAllowed();
+ }
+ this.outPutFiles.addElement(outPutFile);
+ }
+
+ public Vector<UserDefineElement> getOutputFiles(){
+ return this.outPutFiles;
+ }
+
+ public String getOutputFile (){
+ if (this.outPutFiles.size() > 0){
+ /*
+ * If user set more than one map use the first one.
+ */
+ return this.outPutFiles.get(0).value;
+ }
+ return null;
+
+ }
+ public String getOutPutFlag(){
+ if (this.outPutFiles.size() > 0){
+ /*
+ * If user set more than one map use the first one.
+ */
+ return this.outPutFiles.get(0).flag;
+ }
+ return null;
+ }
+
+ /**
+ * Add fileSet list
+ */
+ public void addFileList(FileList fileSet){
+ this.fileSetList.addElement(fileSet);
+ }
+
+ public Vector<String> getFileList(){
+ Project p = getProject();
+ Vector<String> fileListVector = new Vector<String>();
+ for (int i = 0; i < this.fileSetList.size(); i++){
+ String[] tempStrList = this.fileSetList.get(i).getFiles(p);
+ for (int j = 0; j < tempStrList.length; j++){
+ fileListVector .addElement(tempStrList[j]);
+ }
+ }
+ return fileListVector;
+ }
+}
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/userdefine/UserDefineElement.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/userdefine/UserDefineElement.java
new file mode 100644
index 0000000..b8c852c
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/userdefine/UserDefineElement.java
@@ -0,0 +1,23 @@
+package net.sf.antcontrib.cpptasks.userdefine;
+
+public class UserDefineElement {
+ String flag = null;
+ String value = null;
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ public String getFlag() {
+ return flag;
+ }
+
+ public void setFlag(String flag) {
+ this.flag = flag;
+ }
+
+} \ No newline at end of file
diff --git a/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/userdefine/UserDefineMapping.java b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/userdefine/UserDefineMapping.java
new file mode 100644
index 0000000..bb290ef
--- /dev/null
+++ b/Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/userdefine/UserDefineMapping.java
@@ -0,0 +1,186 @@
+/*
+ *
+ * Copyright 2001-2004 The Ant-Contrib project
+ *
+ * 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 net.sf.antcontrib.cpptasks.userdefine;
+public class UserDefineMapping {
+ // list of Arch: EBC, ARM, IA32, X64, IPF, PPC, NT32
+ public final static String[] arch = { "EBC", "ARM", "IA32", "X64", "IPF",
+ "PPC", "NT32" };
+
+ // list of OS: Linux, Windows
+ public final static String[] os = { "WINDOWS", "LINUX" };
+
+ // list of Vendor: Microsoft, Intel, Cygwin, Gcc
+ public final static String[] vendor = { "MSFT", "INTEL", "GCC", "CYGWIN" };
+
+ // list of Command Type: CC, LIB, LINK, ASL, ASM, ASMLINK
+ public final static String[] commandType = { "CC", "LIB", "LINK", "ASL",
+ "ASM", "ASMLINK", "PP" };
+
+ //
+ // flags mapping (Include compellingIncFileFlag,Path Delimiter, Output file
+ // flag,
+ // includepathfalge,
+ // )
+ // Examples: '/I' for MSFT cl.exe while '-I' for GCC
+ // '/Fo' for MSFT cl.exe while '-o' for GCC
+ //
+ public final static String[][] compellingIncFileFlag = {
+ { "MSFT_CC", "/FI" }, { "GCC_CC", "-include" },
+ { "INTEL_CC", "-FI" }, { "WINDDK_CC", "/FI" },
+ { "MSFT_ASM", "/FI" }, { "GCC_ASM", "-include" },
+ { "WINDDK_ASM", "/FI" } };
+
+ public final static String[][] includePathFlag = { { "MSFT_CC", "/I" },
+ { "GCC_CC", "-I" }, { "INTEL_CC", "/I" }, { "WINDDK_CC", "/I" },
+ { "MSFT_ASM", "/I" }, { "GCC_ASM", "-I" }, { "WINDDK_CC", "/I" },
+ { "MSFT_PP", "/I" }, { "GCC_PP", "-I" }, { "WINDDK_PP", "/I" } };
+
+ public final static String[][] outputFileFlag = { { "MSFT_CC", "/Fo" },
+ { "GCC_CC", "-o" }, { "INTEL_CC", "/Fo" }, { "WINDDK_CC", "/Fo" },
+ { "MSFT_LIB", "/OUT:" }, { "GCC_LIB", "-cr" },
+ { "INTEL_LIB", "/OUT:" }, { "WINDDK_LIB", "/OUT:" },
+ { "MSFT_LINK", "/OUT:" }, { "GCC_LINK", "-o" },
+ { "INTEL_LINK", "/OUT:" }, { "WINDDK_LINK", "/OUT:" },
+ { "MSFT_ASM", "/Fo" }, { "GCC_ASM", "-o" },
+ { "WINDDK_ASM", "/Fo" },{"WINDDK_IPF_ASM", "-o"} };
+
+ public final static String[][] subSystemFlag = {
+ { "MSFT_LIB", "/SUBSYSTEM:" }, { "GCC_LIB", "--subsystem=" },
+ { "WINDDk_LIB", "/SUBSYSTEM:" }, { "INTEL_LIB", "/SUBSYSTEM:" },
+ { "MSFT_LINK", "/SUBSYSTEM:" }, { "GCC_LINK", "--subsystem=" },
+ { "INTEL_LINK", "/SUBSYSTEM:" }, { "WINDDK_LINK", "/SUBSYSTEM:" } };
+
+ public final static String[][] outputFileSuffix = {
+ { "WINDOWS_ASM", ".obj" }, { "WINDOWS_CC", ".obj" },
+ { "LINUX_ASM", ".o" }, { "LINUX_CC", ".o" } };
+
+ public final static String[][] entryPointFlag = {
+ { "MSFT_LINK", "/ENTRY:" }, { "GCC_LINK", "-e" },
+ { "INTEL_LINK", "/ENTRY:" },
+ { "WINDDK_LINK", "/ENTRY:" } };
+
+ public final static String[][] mapFlag = { { "MSFT_LINK", "/MAP:" },
+ { "GCC_LINK", "" }, { "INTEL_LINK", "/MAP:" },
+ { "WINDDK_LINK", "/MAP:" } };
+
+ public final static String[][] pdbFlag = { { "MSFT_LINK", "/PDB:" },
+ { "GCC_LINK", "" }, { "INTEL_LINK", "" }, { "WINDDK_LINK", "/PDB:"} };
+
+ public static String getIncludePathDelimiter(String vendor,
+ String commandType) {
+ String key = vendor + "_" + commandType;
+ for (int i = 0; i < includePathFlag.length; i++) {
+ if (includePathFlag[i][0].equalsIgnoreCase(key)) {
+ return includePathFlag[i][1];
+ }
+ }
+ return null;
+ }
+
+ public static String getOutputFileFlag(String vendor, String arch, String commandType) {
+ /*
+ * First find outputfileFlag by vendor_arch_commandType
+ */
+ String key = vendor + "_" + arch + "_" + commandType;
+ for (int i = 0; i < outputFileFlag.length; i++) {
+ if (outputFileFlag[i][0].equalsIgnoreCase(key)) {
+ return outputFileFlag[i][1];
+ }
+ }
+ key = vendor + "_" + commandType;
+ for (int i = 0; i < outputFileFlag.length; i++) {
+ if (outputFileFlag[i][0].equalsIgnoreCase(key)) {
+ return outputFileFlag[i][1];
+ }
+ }
+ return null;
+ }
+
+ public static String getCompellingIncFileFlag(String vendor,
+ String commandType) {
+ String key = vendor + "_" + commandType;
+ for (int i = 0; i < compellingIncFileFlag.length; i++) {
+ if (compellingIncFileFlag[i][0].equalsIgnoreCase(key)) {
+ return compellingIncFileFlag[i][1];
+ }
+ }
+ return null;
+ }
+
+ public static String getSubSystemFlag(String vendor, String commandType) {
+ String key = vendor + "_" + commandType;
+ for (int i = 0; i < subSystemFlag.length; i++) {
+ if (subSystemFlag[i][0].equalsIgnoreCase(key)) {
+ return subSystemFlag[i][1];
+ }
+ }
+ return null;
+ }
+
+ public static String getEntryPointFlag(String vendor, String commandType) {
+ String key = vendor + "_" + commandType;
+ for (int i = 0; i < entryPointFlag.length; i++) {
+ if (entryPointFlag[i][0].equalsIgnoreCase(key)) {
+ return entryPointFlag[i][1];
+ }
+ }
+ return null;
+ }
+
+ public static String getMapFlag(String vendor, String commandType) {
+ String key = vendor + "_" + commandType;
+ for (int i = 0; i < mapFlag.length; i++) {
+ if (mapFlag[i][0].equalsIgnoreCase(key)) {
+ return mapFlag[i][1];
+ }
+ }
+ return null;
+ }
+
+ public static String getPdbFlag(String vendor, String commandType) {
+ String key = vendor + "_" + commandType;
+ for (int i = 0; i < pdbFlag.length; i++) {
+ if (pdbFlag[i][0].equalsIgnoreCase(key)) {
+ return pdbFlag[i][1];
+ }
+ }
+ return null;
+ }
+
+ //
+ // Well-known source file suffix and output file suffix relationship
+ // sourceExtension(Multiple),
+ // headExtension(Multiple) and outputSuffix(Single)
+ //
+
+ //
+ // Default command string such as 'cl' in MSFT while 'gcc' in GCC
+ //
+ public final static String[][] defaultCommand = { { "GCC", "gcc" },
+ { "MSFT_CC", "cl" }, { "MSFT_LIB", "lib" },
+ { "MSFT_LINK", "link" }, };
+
+ public static String getDefaultCommand(String toolchain) {
+ for (int i = 0; i < defaultCommand.length; i++) {
+ if (defaultCommand[i][0].equalsIgnoreCase(toolchain)) {
+ return defaultCommand[i][1];
+ }
+ }
+ return null;
+ }
+
+} \ No newline at end of file