From 878ddf1fc3540a715f63594ed22b6929e881afb4 Mon Sep 17 00:00:00 2001 From: bbahnsen Date: Fri, 21 Apr 2006 22:54:32 +0000 Subject: Initial import. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@3 6f19259b-4bc3-4df7-8a09-765794883524 --- Tools/Source/Cpptasks/build.xml | 55 + Tools/Source/Cpptasks/cpptasks.mf | 7 + Tools/Source/Cpptasks/cpptasks.tasks | 1 + Tools/Source/Cpptasks/cpptasks.types | 9 + Tools/Source/Cpptasks/javadoc.xml | 30 + .../net/sf/antcontrib/cpptasks/AboutCCTask.java | 49 + .../net/sf/antcontrib/cpptasks/ArchEnum.java | 72 + .../net/sf/antcontrib/cpptasks/AslcompilerDef.java | 118 ++ .../sf/antcontrib/cpptasks/AslcompilerEnum.java | 54 + .../net/sf/antcontrib/cpptasks/AssemblerDef.java | 237 +++ .../net/sf/antcontrib/cpptasks/AssemblerEnum.java | 53 + .../net/sf/antcontrib/cpptasks/CCTask.java | 1749 ++++++++++++++++++++ .../antcontrib/cpptasks/CCTaskProgressMonitor.java | 56 + .../net/sf/antcontrib/cpptasks/CPUEnum.java | 71 + .../Cpptasks/net/sf/antcontrib/cpptasks/CUtil.java | 461 ++++++ .../net/sf/antcontrib/cpptasks/CompilerDef.java | 556 +++++++ .../net/sf/antcontrib/cpptasks/CompilerEnum.java | 221 +++ .../net/sf/antcontrib/cpptasks/CompilerParam.java | 33 + .../net/sf/antcontrib/cpptasks/DependencyInfo.java | 86 + .../sf/antcontrib/cpptasks/DependencyTable.java | 609 +++++++ .../net/sf/antcontrib/cpptasks/DistributerDef.java | 243 +++ .../net/sf/antcontrib/cpptasks/DistributerMap.java | 218 +++ .../cpptasks/DistributerProtocolEnum.java | 50 + .../net/sf/antcontrib/cpptasks/FileVisitor.java | 27 + .../net/sf/antcontrib/cpptasks/LinkerDef.java | 549 ++++++ .../net/sf/antcontrib/cpptasks/LinkerEnum.java | 106 ++ .../net/sf/antcontrib/cpptasks/LinkerParam.java | 33 + .../net/sf/antcontrib/cpptasks/OSFamilyEnum.java | 59 + .../antcontrib/cpptasks/ObjectFileCollector.java | 42 + .../sf/antcontrib/cpptasks/OptimizationEnum.java | 82 + .../net/sf/antcontrib/cpptasks/OutputTypeEnum.java | 48 + .../net/sf/antcontrib/cpptasks/PrecompileDef.java | 215 +++ .../antcontrib/cpptasks/PrecompileExceptDef.java | 80 + .../net/sf/antcontrib/cpptasks/ProcessorDef.java | 714 ++++++++ .../sf/antcontrib/cpptasks/ProcessorEnumValue.java | 47 + .../net/sf/antcontrib/cpptasks/ProcessorParam.java | 100 ++ .../net/sf/antcontrib/cpptasks/RuntimeType.java | 26 + .../net/sf/antcontrib/cpptasks/SourceHistory.java | 51 + .../net/sf/antcontrib/cpptasks/SubsystemEnum.java | 34 + .../net/sf/antcontrib/cpptasks/TargetDef.java | 228 +++ .../net/sf/antcontrib/cpptasks/TargetHistory.java | 58 + .../sf/antcontrib/cpptasks/TargetHistoryTable.java | 426 +++++ .../net/sf/antcontrib/cpptasks/TargetInfo.java | 127 ++ .../net/sf/antcontrib/cpptasks/TargetMatcher.java | 117 ++ .../net/sf/antcontrib/cpptasks/VersionInfo.java | 550 ++++++ .../sf/antcontrib/cpptasks/arm/ADSCCompiler.java | 215 +++ .../sf/antcontrib/cpptasks/arm/ADSLibrarian.java | 160 ++ .../net/sf/antcontrib/cpptasks/arm/ADSLinker.java | 166 ++ .../cpptasks/borland/BorlandCCompiler.java | 135 ++ .../cpptasks/borland/BorlandCfgParser.java | 70 + .../cpptasks/borland/BorlandLibrarian.java | 200 +++ .../antcontrib/cpptasks/borland/BorlandLinker.java | 264 +++ .../cpptasks/borland/BorlandProcessor.java | 219 +++ .../cpptasks/borland/BorlandResourceCompiler.java | 130 ++ .../cpptasks/borland/CfgFilenameState.java | 46 + .../cpptasks/borland/ConsumeToSpaceOrNewLine.java | 30 + .../cpptasks/borland/QuoteBranchState.java | 35 + .../compaq/CompaqVisualFortranCompiler.java | 138 ++ .../compaq/CompaqVisualFortranLibrarian.java | 82 + .../cpptasks/compaq/CompaqVisualFortranLinker.java | 77 + .../cpptasks/compiler/AbstractAslcompiler.java | 75 + .../cpptasks/compiler/AbstractAssembler.java | 72 + .../cpptasks/compiler/AbstractCompiler.java | 205 +++ .../cpptasks/compiler/AbstractLinker.java | 85 + .../cpptasks/compiler/AbstractProcessor.java | 129 ++ .../antcontrib/cpptasks/compiler/Aslcompiler.java | 23 + .../compiler/AslcompilerConfiguration.java | 29 + .../sf/antcontrib/cpptasks/compiler/Assembler.java | 23 + .../cpptasks/compiler/AssemblerConfiguration.java | 29 + .../cpptasks/compiler/CaptureStreamHandler.java | 122 ++ .../cpptasks/compiler/CommandLineAslcompiler.java | 226 +++ .../CommandLineAslcompilerConfiguration.java | 93 ++ .../cpptasks/compiler/CommandLineAssembler.java | 326 ++++ .../CommandLineAssemblerConfiguration.java | 123 ++ .../cpptasks/compiler/CommandLineCCompiler.java | 42 + .../cpptasks/compiler/CommandLineCompiler.java | 435 +++++ .../compiler/CommandLineCompilerConfiguration.java | 216 +++ .../compiler/CommandLineFortranCompiler.java | 42 + .../cpptasks/compiler/CommandLineLinker.java | 404 +++++ .../compiler/CommandLineLinkerConfiguration.java | 119 ++ .../sf/antcontrib/cpptasks/compiler/Compiler.java | 24 + .../cpptasks/compiler/CompilerConfiguration.java | 64 + .../sf/antcontrib/cpptasks/compiler/LinkType.java | 134 ++ .../sf/antcontrib/cpptasks/compiler/Linker.java | 57 + .../cpptasks/compiler/LinkerConfiguration.java | 31 + .../compiler/PrecompilingCommandLineCCompiler.java | 43 + .../compiler/PrecompilingCommandLineCompiler.java | 104 ++ .../cpptasks/compiler/PrecompilingCompiler.java | 49 + .../sf/antcontrib/cpptasks/compiler/Processor.java | 73 + .../cpptasks/compiler/ProcessorConfiguration.java | 52 + .../cpptasks/compiler/ProgressMonitor.java | 31 + .../cpptasks/devstudio/DevStudioAslcompiler.java | 70 + .../cpptasks/devstudio/DevStudioAssembler.java | 84 + .../cpptasks/devstudio/DevStudioCCompiler.java | 50 + .../devstudio/DevStudioCompatibleCCompiler.java | 136 ++ .../devstudio/DevStudioCompatibleLibrarian.java | 86 + .../devstudio/DevStudioCompatibleLinker.java | 127 ++ .../cpptasks/devstudio/DevStudioLibrarian.java | 36 + .../cpptasks/devstudio/DevStudioLinker.java | 44 + .../cpptasks/devstudio/DevStudioMIDLCompiler.java | 113 ++ .../cpptasks/devstudio/DevStudioProcessor.java | 90 + .../devstudio/DevStudioResourceCompiler.java | 117 ++ .../cpptasks/gcc/AbstractArLibrarian.java | 106 ++ .../antcontrib/cpptasks/gcc/AbstractLdLinker.java | 323 ++++ .../sf/antcontrib/cpptasks/gcc/GccAssembler.java | 76 + .../sf/antcontrib/cpptasks/gcc/GccCCompiler.java | 243 +++ .../cpptasks/gcc/GccCompatibleCCompiler.java | 152 ++ .../sf/antcontrib/cpptasks/gcc/GccLibrarian.java | 41 + .../net/sf/antcontrib/cpptasks/gcc/GccLinker.java | 210 +++ .../sf/antcontrib/cpptasks/gcc/GccProcessor.java | 299 ++++ .../net/sf/antcontrib/cpptasks/gcc/GppLinker.java | 203 +++ .../net/sf/antcontrib/cpptasks/gcc/LdLinker.java | 57 + .../cpptasks/gcc/cross/GccCCompiler.java | 273 +++ .../cpptasks/gcc/cross/GccLibrarian.java | 69 + .../antcontrib/cpptasks/gcc/cross/GccLinker.java | 234 +++ .../cpptasks/gcc/cross/GccProcessor.java | 288 ++++ .../antcontrib/cpptasks/gcc/cross/GppLinker.java | 228 +++ .../sf/antcontrib/cpptasks/gcc/cross/LdLinker.java | 83 + .../gcc/cross/sparc_sun_solaris2/GccCCompiler.java | 245 +++ .../gcc/cross/sparc_sun_solaris2/GccLibrarian.java | 43 + .../gcc/cross/sparc_sun_solaris2/GccLinker.java | 215 +++ .../gcc/cross/sparc_sun_solaris2/GccProcessor.java | 305 ++++ .../gcc/cross/sparc_sun_solaris2/GppLinker.java | 210 +++ .../gcc/cross/sparc_sun_solaris2/LdLinker.java | 60 + .../net/sf/antcontrib/cpptasks/hp/aCCCompiler.java | 104 ++ .../net/sf/antcontrib/cpptasks/hp/aCCLinker.java | 100 ++ .../cpptasks/ibm/VisualAgeCCompiler.java | 111 ++ .../antcontrib/cpptasks/ibm/VisualAgeLinker.java | 75 + .../cpptasks/intel/IntelLinux32CCompiler.java | 58 + .../cpptasks/intel/IntelLinux32Linker.java | 55 + .../cpptasks/intel/IntelLinux64CCompiler.java | 58 + .../cpptasks/intel/IntelLinux64Linker.java | 55 + .../antcontrib/cpptasks/intel/IntelProcessor.java | 51 + .../cpptasks/intel/IntelWin32Aslcompiler.java | 66 + .../cpptasks/intel/IntelWin32CCompiler.java | 53 + .../cpptasks/intel/IntelWin32Librarian.java | 38 + .../cpptasks/intel/IntelWin32Linker.java | 46 + .../cpptasks/intel/IntelWin64CCompiler.java | 53 + .../antcontrib/cpptasks/os390/OS390CCompiler.java | 157 ++ .../sf/antcontrib/cpptasks/os390/OS390Linker.java | 201 +++ .../antcontrib/cpptasks/os390/OS390Processor.java | 71 + .../sf/antcontrib/cpptasks/os400/IccCompiler.java | 124 ++ .../sf/antcontrib/cpptasks/os400/IccLinker.java | 202 +++ .../sf/antcontrib/cpptasks/os400/IccProcessor.java | 71 + .../antcontrib/cpptasks/parser/AbstractParser.java | 67 + .../cpptasks/parser/AbstractParserState.java | 41 + .../sf/antcontrib/cpptasks/parser/BranchState.java | 46 + .../net/sf/antcontrib/cpptasks/parser/CParser.java | 78 + .../parser/CaseInsensitiveLetterState.java | 87 + .../antcontrib/cpptasks/parser/FilenameState.java | 41 + .../antcontrib/cpptasks/parser/FortranParser.java | 106 ++ .../sf/antcontrib/cpptasks/parser/LetterState.java | 80 + .../net/sf/antcontrib/cpptasks/parser/Parser.java | 28 + .../net/sf/antcontrib/cpptasks/parser/PostE.java | 41 + .../WhitespaceOrCaseInsensitiveLetterState.java | 83 + .../cpptasks/parser/WhitespaceOrLetterState.java | 75 + .../sf/antcontrib/cpptasks/sun/C89CCompiler.java | 109 ++ .../net/sf/antcontrib/cpptasks/sun/C89Linker.java | 125 ++ .../sf/antcontrib/cpptasks/sun/C89Processor.java | 116 ++ .../antcontrib/cpptasks/sun/ForteCCCompiler.java | 119 ++ .../sf/antcontrib/cpptasks/sun/ForteCCLinker.java | 100 ++ .../sf/antcontrib/cpptasks/ti/ClxxCCompiler.java | 192 +++ .../sf/antcontrib/cpptasks/ti/ClxxLibrarian.java | 162 ++ .../net/sf/antcontrib/cpptasks/ti/ClxxLinker.java | 181 ++ .../cpptasks/types/AslcompilerArgument.java | 30 + .../cpptasks/types/AssemblerArgument.java | 30 + .../cpptasks/types/CommandLineArgument.java | 122 ++ .../cpptasks/types/CompilerArgument.java | 28 + .../cpptasks/types/ConditionalFileSet.java | 84 + .../antcontrib/cpptasks/types/ConditionalPath.java | 92 + .../antcontrib/cpptasks/types/DefineArgument.java | 38 + .../sf/antcontrib/cpptasks/types/DefineSet.java | 199 +++ .../net/sf/antcontrib/cpptasks/types/FlexLong.java | 59 + .../sf/antcontrib/cpptasks/types/IncludePath.java | 38 + .../sf/antcontrib/cpptasks/types/LibrarySet.java | 290 ++++ .../antcontrib/cpptasks/types/LibraryTypeEnum.java | 48 + .../antcontrib/cpptasks/types/LinkerArgument.java | 28 + .../cpptasks/types/SystemIncludePath.java | 45 + .../cpptasks/types/SystemLibrarySet.java | 37 + .../cpptasks/types/UndefineArgument.java | 153 ++ .../cpptasks/userdefine/CommandLineUserDefine.java | 389 +++++ .../cpptasks/userdefine/UserDefineArgument.java | 31 + .../cpptasks/userdefine/UserDefineCompiler.java | 219 +++ .../cpptasks/userdefine/UserDefineDef.java | 497 ++++++ .../cpptasks/userdefine/UserDefineElement.java | 23 + .../cpptasks/userdefine/UserDefineMapping.java | 186 +++ 186 files changed, 25412 insertions(+) create mode 100644 Tools/Source/Cpptasks/build.xml create mode 100644 Tools/Source/Cpptasks/cpptasks.mf create mode 100644 Tools/Source/Cpptasks/cpptasks.tasks create mode 100644 Tools/Source/Cpptasks/cpptasks.types create mode 100644 Tools/Source/Cpptasks/javadoc.xml create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/AboutCCTask.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ArchEnum.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/AslcompilerDef.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/AslcompilerEnum.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/AssemblerDef.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/AssemblerEnum.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CCTask.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CCTaskProgressMonitor.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CPUEnum.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CUtil.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CompilerDef.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CompilerEnum.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/CompilerParam.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/DependencyInfo.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/DependencyTable.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/DistributerDef.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/DistributerMap.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/DistributerProtocolEnum.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/FileVisitor.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/LinkerDef.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/LinkerEnum.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/LinkerParam.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/OSFamilyEnum.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ObjectFileCollector.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/OptimizationEnum.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/OutputTypeEnum.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/PrecompileDef.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/PrecompileExceptDef.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ProcessorDef.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ProcessorEnumValue.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ProcessorParam.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/RuntimeType.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/SourceHistory.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/SubsystemEnum.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/TargetDef.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/TargetHistory.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/TargetHistoryTable.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/TargetInfo.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/TargetMatcher.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/VersionInfo.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/arm/ADSCCompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/arm/ADSLibrarian.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/arm/ADSLinker.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/BorlandCCompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/BorlandCfgParser.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/BorlandLibrarian.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/BorlandLinker.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/BorlandProcessor.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/BorlandResourceCompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/CfgFilenameState.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/ConsumeToSpaceOrNewLine.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/borland/QuoteBranchState.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compaq/CompaqVisualFortranCompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compaq/CompaqVisualFortranLibrarian.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compaq/CompaqVisualFortranLinker.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AbstractAslcompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AbstractAssembler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AbstractCompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AbstractLinker.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AbstractProcessor.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/Aslcompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AslcompilerConfiguration.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/Assembler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/AssemblerConfiguration.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CaptureStreamHandler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineAslcompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineAslcompilerConfiguration.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineAssembler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineAssemblerConfiguration.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineCCompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineCompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineCompilerConfiguration.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineFortranCompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineLinker.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CommandLineLinkerConfiguration.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/Compiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/CompilerConfiguration.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/LinkType.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/Linker.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/LinkerConfiguration.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/PrecompilingCommandLineCCompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/PrecompilingCommandLineCompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/PrecompilingCompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/Processor.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/ProcessorConfiguration.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/compiler/ProgressMonitor.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioAslcompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioAssembler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioCCompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioCompatibleCCompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioCompatibleLibrarian.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioCompatibleLinker.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioLibrarian.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioLinker.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioMIDLCompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioProcessor.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/devstudio/DevStudioResourceCompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/AbstractArLibrarian.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/AbstractLdLinker.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GccAssembler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GccCCompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GccCompatibleCCompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GccLibrarian.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GccLinker.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GccProcessor.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/GppLinker.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/LdLinker.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/GccCCompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/GccLibrarian.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/GccLinker.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/GccProcessor.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/GppLinker.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/LdLinker.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/sparc_sun_solaris2/GccCCompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/sparc_sun_solaris2/GccLibrarian.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/sparc_sun_solaris2/GccLinker.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/sparc_sun_solaris2/GccProcessor.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/sparc_sun_solaris2/GppLinker.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/gcc/cross/sparc_sun_solaris2/LdLinker.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/hp/aCCCompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/hp/aCCLinker.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ibm/VisualAgeCCompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ibm/VisualAgeLinker.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelLinux32CCompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelLinux32Linker.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelLinux64CCompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelLinux64Linker.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelProcessor.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelWin32Aslcompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelWin32CCompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelWin32Librarian.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelWin32Linker.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/intel/IntelWin64CCompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/os390/OS390CCompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/os390/OS390Linker.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/os390/OS390Processor.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/os400/IccCompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/os400/IccLinker.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/os400/IccProcessor.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/AbstractParser.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/AbstractParserState.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/BranchState.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/CParser.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/CaseInsensitiveLetterState.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/FilenameState.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/FortranParser.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/LetterState.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/Parser.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/PostE.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/WhitespaceOrCaseInsensitiveLetterState.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/parser/WhitespaceOrLetterState.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/sun/C89CCompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/sun/C89Linker.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/sun/C89Processor.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/sun/ForteCCCompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/sun/ForteCCLinker.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ti/ClxxCCompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ti/ClxxLibrarian.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/ti/ClxxLinker.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/AslcompilerArgument.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/AssemblerArgument.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/CommandLineArgument.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/CompilerArgument.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/ConditionalFileSet.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/ConditionalPath.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/DefineArgument.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/DefineSet.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/FlexLong.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/IncludePath.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/LibrarySet.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/LibraryTypeEnum.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/LinkerArgument.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/SystemIncludePath.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/SystemLibrarySet.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/types/UndefineArgument.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/userdefine/CommandLineUserDefine.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/userdefine/UserDefineArgument.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/userdefine/UserDefineCompiler.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/userdefine/UserDefineDef.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/userdefine/UserDefineElement.java create mode 100644 Tools/Source/Cpptasks/net/sf/antcontrib/cpptasks/userdefine/UserDefineMapping.java (limited to 'Tools/Source/Cpptasks') 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + Copyright @2001-2005 Ant-Contrib project. All Rights Reserved. + + + 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 and"); + System.out.println("\t\t to build.xml"); + System.out.println("Add , , , and 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. + * + * Supported ASL Compilers + * + * + * + * + * + * + * + * + *
iasl (default)Intel ACPI Source Language
aslMicrosoft ACPI Source Language
+ * + */ + 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 + * + * Supported ASL Compilers + * + * + * + * + * + * + * + * + *
iasl (default)Intel ACPI Source Language
aslMicrosoft ACPI Source Language
+ * + */ +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 or 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. + * + * Supported assemblers + * + * + * + * + * + * + * + * + *
gcc (default)GAS assembler
masmMASM assembler
+ * + */ + 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 + * + * Supported assemblers + * + * + * + * + * + * + * + * + *
gas (default)GAS assembler
masmMASM assembler
+ * + */ +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. + * + *

+ * 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. + *

+ * + * + *

+ * Copyright (c) 2001-2005, The Ant-Contrib project. + *

+ * + *

+ * Licensed under the Apache Software License 2.0, + * http://www.apache.org/licenses/LICENSE-2.0. + *

+ * + *

+ * 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. + *

+ * + *

+ * THIS SOFTWARE IS PROVIDED 'AS-IS', See + * http://www.apache.org/licenses/LICENSE-2.0 for additional disclaimers. + *

+ * + * To use: + *
    + *
  1. Place cpptasks.jar into the lib directory of Ant 1.5 or later.
  2. + *
  3. Add <taskdef resource="cpptasks.tasks"/> and <typedef + * resource="cpptasks.types"/> to build.xml.
  4. + *
  5. Add <cc/>, <compiler/> <linker/> <assembler/> + * and <aslcompiler/> elements to project.
  6. + *
  7. Set path and environment variables to be able to run compiler from + * command line.
  8. + *
  9. Build project.
  10. + *
+ * + * @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 and also in are maintained by a + * captive CompilerDef instance + */ + private final CompilerDef compilerDef = new CompilerDef(); + + /** + * Content that appears in and also in 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 and also in are maintained by a + * captive AssemblerDef instance + */ + private final AssemblerDef assemblerDef = new AssemblerDef(); + + /** + * Content that appears in and also in 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 has embedded '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 element that + // explicitly did not inherit files from + // containing element + if (selectedLinkerDef == null || selectedLinkerDef.getInherit()) { + linkerDef.visitUserLibraries(selectedLinker, objCollector); + linkerDef.visitSystemLibraries(selectedLinker, sysLibraryCollector); + } + // + // if there was a in a nested + // evaluate it last so it takes priority over + // identically named libs from 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 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 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 and nested 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 '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. + * + * Supported compilers + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
gcc (default)GCC C++ compiler
g++GCC C++ compiler
c++GCC C++ compiler
g77GNU FORTRAN compiler
msvcMicrosoft Visual C++
bccBorland C++ Compiler
msrcMicrosoft Resource Compiler
brcBorland Resource Compiler
dfCompaq Visual Fortran Compiler
midlMicrosoft MIDL Compiler
iclIntel C++ compiler for Windows (IA-32)
eclIntel C++ compiler for Windows (IA-64)
iccIntel C++ compiler for Linux (IA-32)
eccIntel C++ compiler for Linux (IA-64)
CCSun ONE C++ compiler
aCCHP aC++ C++ Compiler
os390OS390 C Compiler
os400Icc Compiler
sunc89Sun C89 C Compiler
xlCVisualAge C Compiler
+ * + */ + 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. + * + * Supported subsystems + * + * + * + * + * + * + * + * + * + * + * + * + *
guiGraphical User Interface
consoleCommand Line Console
otherOther
+ * + * @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("""); + 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 or 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. + * + * + * Supported compilers + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
gcc (default)GCC C++ compiler
g++GCC C++ compiler
c++GCC C++ compiler
g77GNU Fortran compiler
msvcMicrosoft Visual C++
bccBorland C++ Compiler
msrcMicrosoft Resource Compiler
brcBorland Resource Compiler
dfCompaq Visual Fortran Compiler
midlMicrosoft MIDL Compiler
iclIntel C++ compiler for Windows (IA-32)
eclIntel C++ compiler for Windows (IA-64)
iccIntel C++ compiler for Linux (IA-32)
eccIntel C++ compiler for Linux (IA-64)
CCSun ONE C++ compiler
aCCHP aC++ C++ Compiler
os390OS390 C Compiler
os400Icc Compiler
sunc89Sun C89 C Compiler
xlCVisualAge C Compiler
+ * + */ + 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 + * + * Supported compilers + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
gcc (default)GCC C++ compiler
g++GCC C++ compiler
c++GCC C++ compiler
g77GNU FORTRAN compiler
msvcMicrosoft Visual C++
bccBorland C++ Compiler
msrcMicrosoft Resource Compiler
brcBorland Resource Compiler
dfCompaq Visual Fortran Compiler
midlMicrosoft MIDL Compiler
iclIntel C++ compiler for Windows (IA-32)
eclIntel C++ compiler for Windows (IA-64)
iccIntel C++ compiler for Linux (IA-32)
eccIntel C++ compiler for Linux (IA-64)
CCSun ONE C++ compiler
aCCHP aC++ C++ Compiler
os390OS390 C Compiler
os400Icc Compiler
sunc89Sun C89 C Compiler
xlCVisualAge C Compiler
cl6xTI TMS320C6000 Optimizing Compiler
cl55TI TMS320C55x Optimizing C/C++ Compiler
armcppARM 32-bit C++ compiler
armccARM 32-bit C compiler
tcppARM 16-bit C++ compiler
tccARM 16-bit C compiler
+ * + * @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 + * + * @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 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 elements outside the + // scope of an 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("\n"); + writer.write("\n"); + StringBuffer buf = new StringBuffer(); + Enumeration includePathEnum = includePaths.elements(); + while (includePathEnum.hasMoreElements()) { + writeIncludePathDependencies((String) includePathEnum + .nextElement(), writer, buf); + } + writer.write("\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(" \n"); + writer.write(buf.toString()); + for (int i = 0; i < includes.length; i++) { + buf.setLength(0); + buf.append(" \n"); + writer.write(buf.toString()); + } + for (int i = 0; i < sysIncludes.length; i++) { + buf.setLength(0); + buf.append(" \n"); + writer.write(buf.toString()); + } + writer.write(" \n"); + return; + } + private void writeIncludePathDependencies(String includePathIdentifier, + BufferedWriter writer, StringBuffer buf) throws IOException { + // + // include path element + // + buf.setLength(0); + 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(" \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. + * + * + * Supported linkers + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
gccGcc Linker
g++G++ Linker
ldLd Linker
arGcc Librarian
msvcMicrosoft Linker
bccBorland Linker
dfCompaq Visual Fortran Linker
iclIntel Linker for Windows (IA-32)
eclIntel Linker for Windows (IA-64)
iccIntel Linker for Linux (IA-32)
eccIntel Linker for Linux (IA-64)
CCSun ONE Linker
aCCHP aC++ Linker
os390OS390 Linker
os390batchOS390 Linker
os400IccLinker
sunc89C89 Linker
xlCVisualAge Linker
+ * + */ + 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 + * + * @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 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 + * element + */ + private boolean inherit; + private Boolean libtool = null; + protected boolean newEnvironment = false; + /** + * Processor. + */ + private Processor processor; + /** + * Collection of or contained by definition + */ + private final Vector processorArgs = new Vector(); + /** + * Collection of or contained by definition + */ + private final Vector processorParams = new Vector(); + /** + * if true, all targets will be unconditionally rebuilt + */ + private Boolean rebuild; + /** + * Collection of 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 or + * + * @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 or 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 or + * + * @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 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 ( , ) 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 ( , ) 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 element. + * + * @return if true then properties from the containing 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 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 + * + * @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 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 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 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("\n"); + writer.write("\n"); + StringBuffer buf = new StringBuffer(200); + Enumeration configEnum = configs.elements(); + while (configEnum.hasMoreElements()) { + String configId = (String) configEnum.nextElement(); + buf.setLength(0); + 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(" \n"); + writer.write(buf.toString()); + SourceHistory[] sourceHistories = targetHistory + .getSources(); + for (int i = 0; i < sourceHistories.length; i++) { + buf.setLength(0); + buf.append(" \n"); + writer.write(buf.toString()); + } + writer.write(" \n"); + } + } + writer.write(" \n"); + } + writer.write("\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 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 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 + // + 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 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 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 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 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 or element. + * + * @param defaultProviders + * When specificConfig corresponds to a 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 element + * @param specificConfig + * A or 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 + */ +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 + */ +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 + */ +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 + // + 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: + // + // + // 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: + // + // + // 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 mark_russell@csg_systems.com + * + */ +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 mark_russell@csg_systems.com + * + * @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 mark_russell@csg_systems.com + * + * @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: + 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 mark_russell@csg_systems.com + * + */ +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(" 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 libSetList = new Vector(); + Vector fileList = new Vector(); + 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 includePaths= new Vector(); + private Vector fileSetList = new Vector(); + + /** + * 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 includeFiles = new Vector(); + private Vector outPutFiles = new Vector(); + private Vector subSystem = new Vector(); + private Vector entryPoint = new Vector(); + private Vector map = new Vector(); + private Vector pdb = new Vector(); + private Vector libSet = new Vector(); + + 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 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 getLibSet(){ + return this.libSet; + } + + /** + * Add map element + */ + public void addMap(UserDefineElement mapElement){ + if (isReference()){ + throw noChildrenAllowed(); + }else{ + this.map.addElement(mapElement); + } + } + + public Vector 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 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 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 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 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 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 getFileList(){ + Project p = getProject(); + Vector fileListVector = new Vector(); + 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 -- cgit v1.1