/* --COPYRIGHT--,EPL
 *  Copyright (c) 2008 Texas Instruments and others.
 *  All rights reserved. This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License v1.0
 *  which accompanies this distribution, and is available at
 *  http://www.eclipse.org/legal/epl-v10.html
 * 
 *  Contributors:
 *      Texas Instruments - initial implementation
 * 
 * --/COPYRIGHT--*/
/*
 *  ======== Release.xdc ========
 */
package xdc.bld;

/*!
 *  ======== Release ========
 *  Model of an archive of all files that are part of a release.
 *
 *  Release instances define a container object that represents all files that
 *  are part of a release of a package.  A release may, for example, include
 *  just the files necessary to support a particular ISA even though the
 *  package as a whole can support multiple ISAs.
 *
 *  Each Release instance is realized as a tar file containing the files
 *  that are part of a release of a package.
 */
metaonly module Release {

    /*!
     *  ======== Attrs ========
     *  Optional Release attributes
     *
     *  Unspecified attributes are "inherited" from
     *  `{@link xdc.bld.PackageContents#Attrs}`; i.e., if one of fields in
     *  this structure is unspecified *and* this field's name matches a field
     *  name in `{@link xdc.bld.PackageContents#Attrs}`, then
     *  this field's value defaults to the value in specified by
     *  `{@link xdc.bld.PackageContents#attrs}`.  This mechanism makes it
     *  possible to establish package-wide default values for any of the
     *  "inherited" attributes.
     *
     *  However, elements added to a release can "override" these attributes.
     *  For example, when an executable is added to a release and the
     *  executable's attributes specify `'exportSrc = false'`, the release
     *  will not contain the executable's sources (even if the release's
     *  `{@link #attrs}.exportSrc` attribute is set to `true`).
     *
     *  @field(exportCfg)  If this field is set to `true`, configuration
     *          scripts will be part of the release.  If it is unspecified
     *          (or set to `null`), program configuration scripts will not
     *          be added to this release.
     *
     *  @field(exportDoc)  If this field is set to `true`,  generated
     *          documentation will be part of the release.
     *
     *  @field(exportSrc)  If this field is set to `true`, sources
     *          used to produce object files will be part of the release.
     *          If it is unspecified (or set to `null`), no sources will
     *          be part of this release.
     *
     *  @field(exportExe)  If this field is set to `true`, executables
     *          will be part of the release.  If it is unspecified (or set
     *          to `null`), executables will not be part of this release.
     *
     *  @field(exportAll)  If this field is set to `true`, all files
     *          in this package that are not known to be generated are in
     *          the release.  If it is unspecified (or set to `null`), these
     *          files will not be added to this release.
     *
     *          Note that the set of files specified by `exportAll` is
     *          determined at the time the package's makefile is generated.
     *          If one of these files is subsequently removed before the
     *          release is built, the build of the release will fail; a file
     *          required by the release no longer exists.  If the file is
     *          not really required for the release, you must trigger a
     *          rebuild for the generated makefiles; either touch
     *          `package.bld` or remove the generated makefile and re-build
     *          the release.
     *
     *  @field(relScript)  If this field is non-`null`, the string names a
     *          "release script" that is run to post-process the
     *          files that are part of a release.  Like
     *          configuration scripts, the string names a script
     *          file that is searched for first in the in package's
     *          base directory, and then along the package path.  See
     *          `{@link Manifest}` for more information about release scripts
     *          and what they can do.
     *
     *  @field(relScriptArgs)  If this field is non-`null`, the string is
     *          used to initialize the `arguments[]` array which is
     *          accessible to the release script named by `relScript`.  The
     *          elements of the `arguments[]` array are formed from the white
     *          space separated elements of `relScriptArgs`.  If this string
     *          is `null` or empty, the `arguments[]` array has length `0`.
     *
     *  @field(label)  This string allows one to "tag" each release with a
     *          label that can be used by other tools to select appropriate
     *          releases.  For example, the label might contain customer names.
     *
     *          This label is not interpreted by the XDC tools.  It is simply 
     *          recorded in the package's build model XML file
     *          (`package/package.bld.xml`) and retrieved via
     *          `{@link xdc.bld.BuildEnvironment#getReleaseDescs()}`
     *
     *  @field(prefix)  This string allows one to "export" each release to a
     *          location outside of the package.  `prefix` is prepended
     *          to the name of the release name to form the name of the
     *          release archive.
     *
     *          For example, setting `prefix` to `"../"` implies that a 
     *          release named `"exports/foo"` generates an archive file named
     *          `foo.tar` in the directory `"../exports"`.
     *
     *          `prefix` must either begin with the '^' character or
     *          be a path that is relative to the package's "base"
     *          directory; i.e., the directory containing the package's
     *          specification file `package.xdc`.
     *
     *          If `prefix` begins with the '^' character, the
     *          remainder of the string is treated as though it is relative
     *          to the package's repository.  In effect, the '^' character is
     *          replaced with an appropriate number of '../' sequences to
     *          sufficient to navigate to the package's repository.
     *
     *          If it is not specified (or set to `null`) the current setting
     *          of `{@link xdc.bld.PackageContents#releasePrefix}` is used.
     *
     *  @field(compress) If this field is set to `true`, the release
     *          archive file will be compressed; otherwise, the
     *          archive will not be compressed.  Archives are compressed
     *          via `gzip`; compressed archives are `.tar.gz` files.
     *
     *  @field(archiver) This field names the archiver to use when creating a
     *          release.  Two archivers are currently supported:
     *          "tar" and "zip".  If the archiver is set to "zip"
     *          the `{@link #Attrs.compress}` field is implicitly set to
     *          `true`.
     *
     *  @see #attrs
     */
    struct Attrs {
        String  archiver;       /*! "tar" or "zip"; defaults to "tar" */
        Bool    compress;       /*! if `true`, compress package archive */
        Bool    exportDoc;      /*! if `true`, export generated docs */
        Bool    exportExe;      /*! if `true`, export program executables */
        Bool    exportCfg;      /*! if `true`, export program cfg scripts */
        Bool    exportSrc;      /*! if `true`, export all package sources */
        Bool    exportAll;      /*! if `true`, export all files in package */
        String  relScript;      /*! release files post-processing script */
        String  relScriptArgs;  /*! optional arguments to relScript */
        String  prefix;         /*! prefix for name of install of archive */
        String  label;          /*! uninterpreted label for this release */
    };

    /*!
     *  ======== Desc ========
     *  A description of a release
     *
     *  This structure provides information about a release that can be
     *  used to select from multiple releases provided by a package.
     *
     *  @see xdc.bld.BuildEnvironment#getReleaseDescs()
     */
    struct Desc {
        String name;    /*! the name used to create the release */
        String aname;   /*! the file name of the archive */
        String label;   /*! the label given to the release */
    };
    
    /*!
     *  ======== DescArray ========
     *  An array of release descriptors
     */
    typedef Desc DescArray[];

instance:
    /*!
     *  ======== create ========
     *  @_nodoc
     *  Instances should only be created via PackageContents.addRelease()
     */
    create();

    /*!
     *  ======== name ========
     *  The name of the release.
     *
     *  This name is the base name of the generated tar file containing all
     *  files that make up the release.  For example, if the name of the
     *  release is "foo" then the file "foo.tar" (located in the same
     *  directory as package.bld) is a tar file containing the release files.
     *
     *  Note that each package has at least one release defined, the default
     *  release.  The default release's name is the name of the package with
     *  '.'s replaced with '_'s.  For example, the default release name for
     *  the package "foo.bar" is "foo_bar" and the generated tar file is
     *  named "foo_bar.tar".
     */
    config String name;
    
    /*!
     *  ======== attrs ========
     *  This instance's attributes.
     *
     *  Unless explicitly specified, these attributes are "inherited" from
     *  the package's attributes (`{@link xdc.bld.PackageContents#attrs}`)
     *
     *  @see xdc.bld.PackageContents#attrs
     */
    config Release.Attrs attrs;

    /*!
     *  ======== otherFiles ========
     *  Additional files to add to this release.
     *
     *  This is an array of arbitrary files that are to be included
     *  in this release of the package.
     *
     *  Only those files that are not already directly (or indirectly) named
     *  by adding programs or libraries to this release need to appear in
     *  this array.
     */
    config String otherFiles[];

    /*!
     *  ======== excludeDirs ========
     *  List of directory base names to exclude
     *
     *  This is an array of arbitrary directory "base names" that should
     *  be excluded in this release of the package.  This list only
     *  excludes directories that would otherwise be added due to the
     *  recursive include of a parent directory.
     *
     *  For example, if a directory is specified in `{@link #otherFiles}`
     *  all of its sub-directories will be added unless those sub-directories
     *  are named in the `excludeDirs` list.
     *
     *  This list is often used to exclude "hidden" directories added by
     *  change control systems and IDEs (`.svn`, `.git`, `.settings`, ...).
     *
     *  @see #otherFiles
     *  @see PackageContents#excludeDirs
     */
    config String excludeDirs[];
}
