#!/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 =
(
  "msiexec" => 1,
  "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,
  "winetest" => 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\$(DLLEXT)", $mod;
}

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

print NEWMAKE <<EOF;


\@MAKE_RULES\@

all: wineapploader winelauncher \$(SUBDIRS) \$(SYMLINKS)

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) \$(DESTDIR)\$(bindir)
	\$(INSTALL_SCRIPT) wineapploader \$(DESTDIR)\$(bindir)/wineapploader

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

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

install-progs: # nothing to do here

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

uninstall::
	-cd \$(DESTDIR)\$(bindir) && \$(RM) wineapploader winelauncher \$(INSTALLPROGS)
	-rmdir \$(DESTDIR)\$(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";
