#!/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/;
            die "invalid module $module in dir $directories{$module}\n" if "$directories{$module}.exe" ne $module;
            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};
}

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

print NEWMAKE <<EOF;


\@MAKE_RULES\@

all: wineapploader winelauncher \$(SUBDIRS)

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

# Rules for testing

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

### Dependencies:
EOF

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