/*
 * fstrcmp - fuzzy string compare library
 * Copyright (C) 2009 Peter Miller
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or (at
 * your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program. If not, see <http://www.gnu.org/licenses/>.
 */

if [find_command ctags] then
{
    /*
     * There are three different versions of these commands,
     * and they take completely different command line options.  We
     * assume minimal posix syntax if nothing better is available.
     * (What were they thinking?  Were they even thinking?)
     */
    ctags-variant = posix;

    ctags = ctags;
    ctags-opts = ;
    etags = ctags;
    etags-opts = ;

    /*
     *  The '|| true' is needed because if ctags fails the build stops.
     */
    ctags-version = [collect ctags --version 2>/dev/null || true];
    if [in Exuberant [ctags-version]] then
    {
        ctags-variant = exuberant;
    }
    else
    if [in Emacs [ctags-version]] then
    {
        ctags-variant = emacs;
    }

    all += tags;

    if [find_command etags] then
    {
        etags = etags;
        all += TAGS;
    }

    /*
     * xargs can invoke ctags/etags more than once if the underling
     * shell does not handle so much arguments.  In order to not
     * truncate the target the '-a' options must be used.  It is posix
     * compliant and should be supported by different ctags variant.
     */
    ctags-opts = -a;

    if [in posix [ctags-variant]] then
        ctags-opts += -f;

    if [in exuberant [ctags-variant]] then
    {
        ctags-opts += --c-types\=+px -f;
        etags = ctags -e;
        all += TAGS;
    }

    /*
     * The (GNU) Emacs variant of ctags (based an Exuberant) use -o
     * to set the output file name.
     */
    if [in emacs [ctags-variant]] then
    {
        etags-opts = [ctags-opts]
                   --declarations -o ;
        ctags-opts += --declarations --defines --globals --members --typedefs
            --no-warn /* (--no-warn option only works for ctags) */
            -o
            ;
    }
}

tags: [change_files]
    set shallow no-cascade
{
    xargs ctags [ctags-opts] [target]
            set meter;
data
[unsplit "\n" [resolve [source_files]]]
dataend
}

TAGS: [change_files]
    set shallow no-cascade
{
    xargs [etags] [etags-opts] [target]
        set meter;
data
[unsplit "\n" [resolve [source_files]]]
dataend
}
