#!/usr/bin/perl -w
#
# Update the dependencies in the programs main Makefile.in.
# Must be run in the programs/ directory of the Wine tree.
#
# Copyright 2003 Alexandre Julliard
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library 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
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#

use strict;

my $makefiles = `find . -name Makefile.in -print`;

my %directories = ();

# Programs that we want to install in the bin directory too
my %bin_install =
(
  "notepad" => 1,
  "progman" => 1,
  "regedit" => 1,
  "regsvr32" => 1,
  "uninstaller" => 1,
  "wcmd" => 1,
  "wineboot" => 1,
  "winebrowser" => 1,
  "winecfg" => 1,
  "wineconsole" => 1,
  "winedbg" => 1,
  "winefile" => 1,
  "winemine" => 1,
  "winepath" => 1,
  "winhelp" => 1,
);

# Programs that we don't want to install at all
my %dont_install =
(
  "cmdlgtst" => 1,
  "view" => 1,
);

foreach my $i (split(/\s/,$makefiles))
{
    my $module;

    next if $i =~ /\/tests\/Makefile.in/;

    open MAKE,$i;

    $module = undef;
    while (<MAKE>)
    {
        chop;
        # hack to disable this program... the MKPROG_SKIP comment must appear
        # at the very top of the Makefile.in
        last if (/^\#\s*MKPROG_SKIP/);

        if (/^MODULE\s*=\s*([a-zA-Z0-9_.]+)/)
        {
            $module = $1;
            next if ($module eq "none");
            ($directories{$module} = $i) =~ s/^\.\/(.*)\/[^\/]+$/$1/;
            last;
        }
        if (/^PROGRAMS\s*=((\s*[a-zA-Z0-9_.]+)+)/)
        {
            my @programs = split / /, $1;
            foreach my $prog (@programs)
            {
                next unless $prog =~ /\.exe$/;
                ($directories{$prog} = $i) =~ s/^\.\/(.*)\/[^\/]+$/$1/;
            }
            last;
        }
    }
    close MAKE;
}

open NEWMAKE,">Makefile.in.new" or die "cannot create Makefile.in.new";

################################################################
# makefile header

print NEWMAKE <<EOF;
# Automatically generated by make_progs; DO NOT EDIT!!

TOPSRCDIR = \@top_srcdir\@
TOPOBJDIR = ..
SRCDIR    = \@srcdir\@
VPATH     = \@srcdir\@

EOF

################################################################
# output the subdirs list

# get rid of duplicates
my %alldirs = ();
foreach my $dir (sort values %directories) { $alldirs{$dir} = 1; }

print NEWMAKE "SUBDIRS =";
foreach my $dir (sort keys %alldirs)
{
    printf NEWMAKE " \\\n\t%s", $dir;
}

print NEWMAKE "\n\n# Sub-directories to run make install into\nINSTALLSUBDIRS =";
foreach my $dir (sort keys %alldirs)
{
    next if $dont_install{$dir};
    printf NEWMAKE " \\\n\t%s", $dir;
}

print NEWMAKE "\n\n# Programs to install in bin directory\nINSTALLPROGS =";
foreach my $dir (sort keys %alldirs)
{
    printf NEWMAKE " \\\n\t%s", $dir if $bin_install{$dir};
}

print NEWMAKE "\n\n# Symlinks to apps that we want to run from inside the source tree\nSYMLINKS =";
foreach my $mod (sort keys %directories)
{
    printf NEWMAKE " \\\n\t%s", $mod;
}

################################################################
# output the build and install targets

print NEWMAKE <<EOF;


\@MAKE_RULES\@

all: wineapploader winelauncher \$(SUBDIRS) \$(SYMLINKS:%=%\$(DLLEXT))

wineapploader: wineapploader.in
	sed -e 's,\@bindir\\\@,\$(bindir),g' \$(SRCDIR)/wineapploader.in >\$\@ || (\$(RM) \$\@ && false)

winelauncher: winelauncher.in
	sed -e 's,\@bindir\\\@,\$(bindir),g' -e 's,\@libdir\\\@,\$(libdir),g' -e 's,\@dlldir\\\@,\$(dlldir),g' \$(SRCDIR)/winelauncher.in >\$\@ || (\$(RM) \$\@ && false)

# Rules for installation

.PHONY: install-apploader install-progs install-progs.so \$(INSTALLPROGS:%=%/__installprog__)

install-apploader: wineapploader dummy
	\$(MKINSTALLDIRS) \$(bindir)
	\$(INSTALL_SCRIPT) wineapploader \$(bindir)/wineapploader

\$(INSTALLPROGS:%=%/__installprog__): install-apploader
	\$(RM) \$(bindir)/`dirname \$\@` && \$(LN) \$(bindir)/wineapploader \$(bindir)/`dirname \$\@`

install-progs.so: \$(INSTALLPROGS:%=%/__installprog__)
	\$(RM) \$(bindir)/wineapploader

install-progs: # nothing to do here

install:: winelauncher install-progs\$(DLLEXT)
	\$(MKINSTALLDIRS) \$(bindir)
	\$(INSTALL_SCRIPT) winelauncher \$(bindir)/winelauncher

uninstall::
	\$(RM) \$(bindir)/wineapploader \$(bindir)/winelauncher \$(INSTALLPROGS:%=\$(bindir)/%)
	-rmdir \$(dlldir)

clean::
	\$(RM) wineapploader winelauncher \$(SYMLINKS)

# Rules for testing

check test:: \$(SUBDIRS:%=%/__test__)

EOF

################################################################
# output the symlinks rules

print NEWMAKE "# Rules for symlinks\n\n";

foreach my $mod (sort keys %directories)
{
    printf NEWMAKE "%s\$(DLLEXT)", $mod;
    printf NEWMAKE ": %s/%s\$(DLLEXT)\n", $directories{$mod}, $mod;
    printf NEWMAKE "\t\$(RM) \$@ && \$(LN_S) %s/%s\$(DLLEXT) \$@\n\n", $directories{$mod}, $mod;
}

foreach my $mod (sort keys %directories)
{
    printf NEWMAKE "%s/%s\$(DLLEXT): %s\n", $directories{$mod}, $mod, $directories{$mod};
}

################################################################
# makefile trailer

print NEWMAKE "\n### Dependencies:\n";

close NEWMAKE;
rename "Makefile.in.new", "Makefile.in";
printf "Successfully updated Makefile.in\n";
