#!/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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
#

use strict;

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,
);

sub update_file($)
{
    my $file = shift;
    if (!system "cmp $file $file.new >/dev/null")
    {
        unlink "$file.new";
        print "$file is unchanged\n";
    }
    else
    {
        rename "$file.new", "$file";
        print "$file updated\n";
    }
}

# if we are inside the programs dir, go up one level
if (! -f "configure.ac" && -f "../configure.ac") { chdir(".."); }

my @args = @ARGV;
if (!@args) { @args = split /\s/, `find programs -name Makefile.in -print`; }

foreach my $i (@args)
{
    my $module;

    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/^programs\/(.*)\/[^\/]+$/$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,">programs/Makefile.in.new" or die "cannot create programs/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;


INSTALLDIRS = \$(DESTDIR)\$(bindir)

\@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 \$(INSTALLDIRS) dummy
	\$(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) \$(INSTALLDIRS)
	\$(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;
update_file("programs/Makefile.in");

################################################################
# .gitignore file

open GITIGNORE, ">programs/.gitignore.new" or die "cannot create programs/.gitignore.new";
print GITIGNORE "# Automatically generated by make_dlls; DO NOT EDIT!!\n";

my @ignores =
(
 "/Makeprog.rules",
 "/wineapploader",
 "/winelauncher",
);

foreach my $dir (sort keys %alldirs)
{
    push @ignores, "$dir/$dir";
}

print GITIGNORE join("\n", sort @ignores) . "\n";

close GITIGNORE;
update_file("programs/.gitignore");
