/* * Copyright 2001-2005 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.apache.tools.ant.taskdefs.optional.dotnet; import org.apache.tools.ant.BuildException; /** * This task compiles Visual Basic.NET source into executables or modules. * The task requires vbc.exe on the execute path, unless it or an equivalent * program is specified in the executable parameter * *

* All parameters are optional: <vbc/> should suffice to produce a debug * build of all *.vb files. * *

* The task is a directory based task, so attributes like * includes="**\/*.vb" and * excludes="broken.vb" can be used to control * the files pulled in. By default, * all *.vb files from the project folder down are included in the command. * When this happens the destFile -if not specified- * is taken as the first file in the list, which may be somewhat hard to control. Specifying the output file with destfile is prudent.

* Also, dependency checking only works if destfile is set. * *

For historical reasons the pattern * **/*.vb is preset as includes list and * you can not override it with an explicit includes attribute. Use * nested <src> elements instead of the basedir * attribute if you need more control.

* * As with <csc> nested src filesets of source, * reference filesets, definitions and resources can be provided. * *

* Example *

*
<vbc
 *   optimize="true"
 *   debug="false"
 *   warnLevel="4"
 *   targetType="exe"
 *   definitions="RELEASE"
 *   excludes="src/unicode_class.vb"
 *   mainClass = "MainApp"
 *   destFile="NetApp.exe"
 *   optionExplicit="true"
 *   optionCompare="text"
 *   references="System.Xml,System.Web.Xml"
 *   >
 *          <reference file="${testCSC.dll}" />
 *          <define name="RELEASE" />
 *          <define name="DEBUG" if="debug.property"/>
 *          <define name="def3" unless="def2.property"/>
 *   </vbc>
 
* @ant.task name="vbc" category="dotnet" */ public class VisualBasicCompile extends DotnetCompile { /** * Compiler option to remove integer checks. Default: false. */ private boolean removeIntChecks = false; /** * Require explicit declaration of variables? Default: false. */ private boolean optionExplicit = false; /** * Enforce strict language semantics? Default: false. */ private boolean optionStrict = false; /** * Whether to compare strings as "text" or "binary". Default: "binary". */ private String optionCompare; /** * Root namespace for all type declarations. */ private String rootNamespace; /** * Declare global imports fornamespaces in referenced metadata files. */ private String imports; /** * Constructor for VisualBasicCompile. */ public VisualBasicCompile() { clear(); } /** * reset all contents. */ public void clear() { super.clear(); imports = null; rootNamespace = null; optionCompare = null; optionExplicit = false; optionStrict = false; removeIntChecks = false; setExecutable("vbc"); } /** * get the argument or null for no argument needed * This is overridden from DotnetCompile.java because VBC uses * "/win32resource:" rather than "/win32res:" * *@return The Win32Res Parameter to CSC */ protected String getWin32ResParameter() { if (getWin32Res() != null) { return "/win32resource:" + getWin32Res().toString(); } else { return null; } } /** * Whether to remove integer checks. Default false. * @param flag on/off flag */ public void setRemoveIntChecks(boolean flag) { removeIntChecks = flag; } /** * Get the flag for removing integer checks. * @return true if flag is turned on */ public boolean getRemoveIntChecks() { return removeIntChecks; } /** * Form the option string for removeIntChecks. * @return The parameter string. */ public String getRemoveIntChecksParameter() { return "/removeintchecks" + (removeIntChecks ? "+" : "-"); } /** * Whether to require explicit declaration of variables. * @param flag on/off flag */ public void setOptionExplicit(boolean flag) { optionExplicit = flag; } /** * Get the flag for whether to require explicit declaration of variables. *@return true if flag is turned on */ public boolean getOptionExplicit() { return optionExplicit; } /** * Form the option string for optionExplicit.. * @return The parameter string. */ public String getOptionExplicitParameter() { return "/optionexplicit" + (optionExplicit ? "+" : "-"); } /** * Enforce strict language semantics. * @param flag on/off flag */ public void setOptionStrict(boolean flag) { optionStrict = flag; } /** * Get the flag for whether to enforce strict language semantics. * @return true if flag is turned on */ public boolean getOptionStrict() { return optionStrict; } /** * For the option string for optionStrict. * @return The parameter string. */ public String getOptionStrictParameter() { return "/optionstrict" + (optionStrict ? "+" : "-"); } /** * Specifies the root namespace for all type declarations. * @param rootNamespace a root namespace. */ public void setRootNamespace(String rootNamespace) { this.rootNamespace = rootNamespace; } /** * Get the root namespace. * @return the root namespace. */ public String getRootNamespace() { return this.rootNamespace; } /** * Form the option string for rootNamespace. * @return the root namespace option string. */ protected String getRootNamespaceParameter() { if (rootNamespace != null && rootNamespace.length() != 0) { return "/rootnamespace:" + rootNamespace; } else { return null; } } /** * Declare global imports for namespaces in referenced metadata files. * @param imports the imports string */ public void setImports(String imports) { this.imports = imports; } /** * Get global imports for namespaces in referenced metadata files. * @return the imports string. */ public String getImports() { return this.imports; } /** * Format the option for imports. * @return the formatted import option. */ protected String getImportsParameter() { if (imports != null && imports.length() != 0) { return "/imports:" + imports; } else { return null; } } /** * Specify binary- or text-style string comparisons. Defaults * to "binary" * @param optionCompare the option compare style. "text" | "binary". */ public void setOptionCompare(String optionCompare) { if ("text".equalsIgnoreCase(optionCompare)) { this.optionCompare = "text"; } else { this.optionCompare = "binary"; } } /** * "binary" or "text" for the string-comparison style. * @return the option compare style. */ public String getOptionCompare() { return this.optionCompare; } /** * Format the option for string comparison style. * @return The formatted option. */ protected String getOptionCompareParameter() { if (optionCompare != null && "text".equalsIgnoreCase(optionCompare)) { return "/optioncompare:text"; } else { return "/optioncompare:binary"; } } /** * implement VBC commands * @param command */ protected void addCompilerSpecificOptions(NetCommand command) { command.addArgument(getRemoveIntChecksParameter()); command.addArgument(getImportsParameter()); command.addArgument(getOptionExplicitParameter()); command.addArgument(getOptionStrictParameter()); command.addArgument(getRootNamespaceParameter()); command.addArgument(getOptionCompareParameter()); } /** * Get the delimiter that the compiler uses between references. * For example, c# will return ";"; VB.NET will return "," * @return The string delimiter for the reference string. */ public String getReferenceDelimiter() { return ","; } /** * Get the extension of filenames to compile. * @return The string extension of files to compile. */ public String getFileExtension() { return "vb"; } /** * from a resource, get the resource param * @param resource * @return a string containing the resource param, or a null string * to conditionally exclude a resource. */ protected String createResourceParameter(DotnetResource resource) { return resource.getVbStyleParameter(); } /** * validation code * @throws BuildException if validation failed */ protected void validate() throws BuildException { super.validate(); if (getDestFile() == null) { throw new BuildException("DestFile was not specified"); } } }