#!/usr/bin/perl -w
#
# Build the auto-generated parts of the Wine makefiles.
#
# Copyright 2006 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
#

# Make rules files
my %makerules =
(
 "MAKE_RULES" => "Make.rules",
 "MAKE_DLL_RULES" => "dlls/Makedll.rules",
 "MAKE_IMPLIB_RULES" => "dlls/Makeimplib.rules",
 "MAKE_TEST_RULES" => "dlls/Maketest.rules",
 "MAKE_PROG_RULES" => "programs/Makeprog.rules",
);

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

my (@makefiles, %makefiles);

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

# replace some lines in a file between two markers
sub replace_in_file($$$@)
{
    my $file = shift;
    my $start = shift;
    my $end = shift;

    open NEW_FILE, ">$file.new" or die "cannot create $file.new";

    if (defined($start))
    {
        open OLD_FILE, "$file" or die "cannot open $file";
        while (<OLD_FILE>)
        {
            last if /$start/;
            print NEW_FILE $_;
        }
    }

    print NEW_FILE @_;

    if (defined($end))
    {
        my $skip=1;
        while (<OLD_FILE>)
        {
            print NEW_FILE $_ unless $skip;
            $skip = 0 if /$end/;
        }
    }

    close OLD_FILE if defined($start);
    close NEW_FILE;
    return update_file($file);
}

# parse the specified makefile to identify the rules file
sub parse_makefile($)
{
    my $file = shift;
    my %make;

    open MAKE, "$file.in" or die "cannot open $file.in\n";

    while (<MAKE>)
    {
        chomp;
        while (/\\$/) { chop; $_ .= <MAKE>; chomp; }  # merge continued lines

        if (/^\@(MAKE.*RULES)\@/)
        {
            my $var = $1;
            $make{"=rules"} = $makerules{$var};
            next;
        }
        if (/^MODULE\s*=\s*([a-zA-Z0-9_.]+)/)
        {
            $make{"MODULE"} = $1;
            next;
        }
        if (/^\#\s*MKDLL_SKIP/ || /^\#\s*MKPROG_SKIP/)
        {
            $make{"=skip"} = 1;
            next;
        }
    }
    return %make;
}

if (-d ".git")
{
    @makefiles = map { s/\.in$//; $_; } split /\s/, `git ls-files -c Makefile.in \\*/Makefile.in`;
}
else
{
    @makefiles = map { s/^\.\/(.*)\.in/$1/; $_; } split(/\s/,`find . -name Makefile.in -print`);
}

foreach my $file (sort values %makerules, @makefiles)
{
    my %make = parse_makefile( $file );
    $makefiles{$file} = \%make;
}

################################################################
# update the makefile list in configure.ac

my @lines = ();

foreach my $var (sort { $makerules{$a} cmp $makerules{$b}; } keys %makerules)
{
    push @lines, "$var=$makerules{$var}\n";
    push @lines, "AC_SUBST_FILE($var)\n\n";
}

replace_in_file( "configure.ac", '^MAKE_RULES', '\]\)$',
                 @lines,
                 "AC_CONFIG_FILES([\n",
                 join ("\n", (sort values %makerules), (sort @makefiles) ), "])\n" );


################################################################
# update the tests list in programs/winetest/Makefile.in and programs/winetest/winetest.rc

my %modules = ( "user" => "user32" );
my %tests;
@lines = ( "TESTBINS =" );

foreach my $file (sort grep /^dlls\/.*\/tests\/Makefile/, @makefiles)
{
    if ($file =~ /^dlls\/(.*)\/tests\/Makefile/)
    {
        my $dir = $1;
        my $mod = $modules{$dir} || $dir;
        $tests{$mod} = $dir;
        push @lines, " \\\n\t${mod}_test.exe";
    }
}
push @lines, "\n\n";

foreach my $test (sort keys %tests)
{
    my $dir = $tests{$test};
    push @lines, "${test}_test.exe: \$(DLLDIR)/$dir/tests/${test}_test.exe\$(DLLEXT)\n";
    push @lines, "\tcp \$(DLLDIR)/$dir/tests/${test}_test.exe\$(DLLEXT) \$\@ && \$(STRIP) \$\@\n";
}
push @lines, "\n# Special rules\n";

replace_in_file( "programs/winetest/Makefile.in", '^TESTBINS\s*=', '^# Special rules', @lines );

@lines = ();
foreach my $test (sort keys %tests)
{
    push @lines, "${test}_test.exe TESTRES \"${test}_test.exe\"\n";
}

replace_in_file( "programs/winetest/winetest.rc", ' TESTRES ', undef, @lines );

################################################################
# update the makefile list in Makefile.in

my @targets;
my @depends;

foreach my $file (sort values %makerules)
{
    push @targets, $file;
    my %make = %{$makefiles{$file}};
    if (!defined($make{"=rules"})) { push @depends, "$file: $file.in"; }
    else { push @depends, "$file: $file.in Make.rules"; }
}

foreach my $file (sort @makefiles)
{
    push @targets, $file unless $file eq "Makefile";
    my $dep = ${$makefiles{$file}}{"=rules"};
    push @depends, "$file: $file.in $dep";
}

@lines = ();
push @lines, "ALL_MAKEFILES = \\\n\t";
push @lines, join (" \\\n\t", @targets ), "\n\n";
push @lines, "Makefile \$(ALL_MAKEFILES): config.status\n";
push @lines, "\t\@./config.status \$\@\n\n";
push @lines, "\$(RECURSE_TARGETS) \$(MAKEDEP): \$(ALL_MAKEFILES)\n\n";
push @lines, "distclean::\n";
push @lines, "\t\$(RM) Makefile \$(ALL_MAKEFILES)\n\n";
push @lines, join ("\n", @depends ), "\n";

replace_in_file( "Makefile.in", '^ALL_MAKEFILES\s*=', undef, @lines );


################################################################
# update dlls/Makefile.in

my @dll_makefiles = grep /^dlls\//, @makefiles;
system "dlls/make_dlls", @dll_makefiles;


################################################################
# update programs/Makefile.in and programs/.gitignore

sub update_progs(@)
{
    my (@subdirs, @install_subdirs, @install_progs);

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

    foreach my $make (@_)
    {
        my %makefile = %{$makefiles{$make}};
        my $module = $makefile{"MODULE"};
        (my $dir = $make) =~ s/^programs\/(.*)\/Makefile$/$1/;
        die "Invalid module $module in $make" unless "$dir.exe" eq $module;
        next if defined $makefile{"=skip"};
        push @subdirs, $dir;
        push @ignores, "$dir/$dir";
        push @install_subdirs, $dir unless $dont_install{$dir};
        push @install_progs, $dir if $bin_install{$dir};
    }

    replace_in_file( "programs/Makefile.in", '^SUBDIRS\s*=', '^INSTALLDIRS',
                     "SUBDIRS = \\\n\t",
                     join( " \\\n\t", @subdirs ),
                     "\n\n# Sub-directories to run make install into\nINSTALLSUBDIRS = \\\n\t",
                     join( " \\\n\t", @install_subdirs ),
                     "\n\n# Programs to install in bin directory\nINSTALLPROGS = \\\n\t",
                     join( " \\\n\t", @install_progs ),
                     "\n\nINSTALLDIRS = \$(DESTDIR)\$(bindir)\n" );

    replace_in_file( "programs/.gitignore", undef, undef,
                     "# Automatically generated by make_makefiles; DO NOT EDIT!!\n",
                     join("\n", sort @ignores), "\n" );
}

update_progs( sort grep /^programs\/.*\/Makefile$/, @makefiles );
