#!/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
#

use strict;

# Make rules files
my %makerules =
(
 "MAKE_RULES" => "Make.rules",
 "MAKE_DLL_RULES" => "dlls/Makedll.rules",
 "MAKE_IMPLIB_RULES" => "dlls/Makeimplib.rules",
 "MAKE_TEST_RULES" => "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,
  "regedit" => 1,
  "regsvr32" => 1,
  "wineboot" => 1,
  "winecfg" => 1,
  "wineconsole" => 1,
  "winedbg" => 1,
  "winefile" => 1,
  "winemine" => 1,
  "winepath" => 1,
);

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

# Dlls and programs that are 16-bit specific
my %modules16 =
(
  "ifsmgr.vxd" => 1,
  "mmdevldr.vxd" => 1,
  "monodebg.vxd" => 1,
  "vdhcp.vxd" => 1,
  "vmm.vxd" => 1,
  "vnbt.vxd" => 1,
  "vnetbios.vxd" => 1,
  "vtdapi.vxd" => 1,
  "vwin32.vxd" => 1,
  "w32skrnl.dll" => 1,
  "winevdm.exe" => 1,
  "wow32.dll" => 1,
);

# Default patterns for top-level .gitignore
my @ignores = (
    "*.[oa]",
    "*.fake",
    "*.ok",
    "*.res",
    "*.so",
    "/autom4te.cache",
    "/config.cache",
    "/config.log",
    "/config.status",
    "/configure.lineno",
    "/TAGS",
    "/tags",
    "/wine",
    "Makefile",
    "dlldata.c",
    "dlls/*/*.def",
    "dlls/shell32/AUTHORS",
    "*/*/tests/*crosstest.exe",
    "*/*/tests/testlist.c",
    "include/config.h",
    "include/stamp-h",
    "programs/winetest/*_test.exe",
    "programs/winetest/*_test.rc",
    "programs/winetest/build.nfo",
    "programs/winetest/build.rc",
    "tools/makedep",
);

# Source files and their resulting target to ignore
my @ignore_srcs = (
    [ 'BISON_SRCS',   '\.y',   '.tab.c' ],
    [ 'BISON_SRCS',   '\.y',   '.tab.h' ],
    [ 'LEX_SRCS',     '\.l',   '.yy.c' ],
    [ 'MC_SRCS',      '\.mc',  '.mc.rc' ],
    [ 'IDL_TLB_SRCS', '\.idl', '.tlb' ],
    [ 'IDL_H_SRCS',   '\.idl', '.h' ],
    [ 'IDL_C_SRCS',   '\.idl', '.h' ],
    [ 'IDL_I_SRCS',   '\.idl', '.h' ],
    [ 'IDL_P_SRCS',   '\.idl', '.h' ],
    [ 'IDL_S_SRCS',   '\.idl', '.h' ],
    [ 'IDL_C_SRCS',   '\.idl', '_c.c' ],
    [ 'IDL_I_SRCS',   '\.idl', '_i.c' ],
    [ 'IDL_P_SRCS',   '\.idl', '_p.c' ],
    [ 'IDL_S_SRCS',   '\.idl', '_s.c' ],
);

my %exported_wine_headers = (
    "wine/debug.h" => 1,
    "wine/exception.h" => 1,
    "wine/library.h" => 1,
    "wine/unicode.h" => 1,
    "wine/itss.idl" => 1,
    "wine/svcctl.idl" => 1,
);

my %private_idl_headers = (
    "access.idl" => 1,
    "asynot.idl" => 1,
    "asysta.idl" => 1,
    "axcore.idl" => 1,
    "axextend.idl" => 1,
    "binres.idl" => 1,
    "cmdbas.idl" => 1,
    "cmdtxt.idl" => 1,
    "crtrow.idl" => 1,
    "dbccmd.idl" => 1,
    "dbcses.idl" => 1,
    "dbdsad.idl" => 1,
    "dbinit.idl" => 1,
    "dbprop.idl" => 1,
    "dbs.idl" => 1,
    "devenum.idl" => 1,
    "dyngraph.idl" => 1,
    "opnrst.idl" => 1,
    "row.idl" => 1,
    "rowchg.idl" => 1,
    "rstbas.idl" => 1,
    "rstinf.idl" => 1,
    "rstloc.idl" => 1,
    "sesprp.idl" => 1,
    "vmrender.idl" => 1,
    "wine/wined3d.idl" => 1,
    "wine/winedxgi.idl" => 1,
);

my %ignored_source_files = (
    "dlls/wineps.drv/afm2c.c" => 1,
    "dlls/wineps.drv/mkagl.c" => 1,
    "programs/winetest/dist.rc" => 1,
);

my (@all_files, @makefiles, %makefiles);

sub dirname($)
{
    my $ret = shift;
    return "" unless $ret =~ /\//;
    $ret =~ s!/[^/]*$!!;
    return $ret;
}

# update a file if changed
sub update_file($)
{
    my $file = shift;
    my $ret = !(-f $file) || system "cmp $file $file.new >/dev/null";
    if (!$ret)
    {
        unlink "$file.new";
    }
    else
    {
        rename "$file.new", "$file";
        print "$file updated\n";
        if ($file eq "configure.ac")
        {
            system "autoconf";
            print "configure 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);
}

# replace a variable in a makefile
sub replace_makefile_variable($$)
{
    my ($file, $var) = @_;
    my $make = $makefiles{$file};

    return unless defined ${$make}{"=$var"};

    my @values = @{${$make}{"=$var"}};
    ${$make}{$var} = \@values;

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

    open OLD_FILE, "$file.in" or die "cannot open $file.in";
    while (<OLD_FILE>)
    {
        if (/^\s*($var\s+)=/)
        {
            # try to preserve formatting
            my $prefix = $1;
            my $multiline = /\\$/ || (@values > 1);
            while (/\\$/)
            {
                $_ = <OLD_FILE>;
                last unless $_;
            }
            if ($multiline)
            {
                print NEW_FILE "$var = \\\n\t" . join(" \\\n\t", sort @values) . "\n";
            }
            else
            {
                print NEW_FILE "$prefix= @values\n";
            }
            next;
        }
        print NEW_FILE $_;
    }
    close OLD_FILE;
    close NEW_FILE;
    return update_file("$file.in");
}

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

    ($make{"=dir"} = $file) =~ s/[^\/]+$//;

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

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

        if (/^\@(MAKE.*RULES)\@/)
        {
            my $var = $1;
            $make{"=rules"} = $makerules{$var};
            next;
        }
        if (/^\s*(MODULE|IMPORTLIB|TESTDLL)\s*=\s*(.*)/)
        {
            $make{$1} = $2;
            next;
        }
        if (/^\s*(BISON_SRCS|LEX_SRCS|IDL_[CHIPS]_SRCS|IDL_TLB_SRCS|IMPLIB_SRCS|C_SRCS|MC_SRCS|RC_SRCS|SVG_SRCS|MANPAGES|PROGRAMS)\s*=\s*(.*)/)
        {
            my @list = split(/\s+/, $2);
            $make{$1} = \@list;
            next;
        }
        if (/^\s*(TOPSRCDIR|TOPOBJDIR|SRCDIR|VPATH)\s*=\s*(.*)/)
        {
            die "Variable $1 in $file.in is obsolete";
        }
    }
    return %make;
}

# assign source files to their respective makefile
sub assign_sources_to_makefiles()
{
    foreach my $file (@all_files)
    {
        next if defined $ignored_source_files{$file};
        my $dir = dirname( $file );

        while ($dir && !defined $makefiles{"$dir/Makefile"}) { $dir = dirname( $dir ); }
        next unless $dir;

        die "no makefile found for $file\n" unless defined $makefiles{"$dir/Makefile"};

        my $make = $makefiles{"$dir/Makefile"};
        my $basename = substr( $file, length($dir) + 1 );

        if ($basename =~ /\.c$/) { push @{${$make}{"=C_SRCS"}}, $basename; }
        elsif ($basename =~ /\.l$/) { push @{${$make}{"=LEX_SRCS"}}, $basename; }
        elsif ($basename =~ /\.y$/) { push @{${$make}{"=BISON_SRCS"}}, $basename; }
        elsif ($basename =~ /\.rc$/) { push @{${$make}{"=RC_SRCS"}}, $basename; }
        elsif ($basename =~ /\.mc$/) { push @{${$make}{"=MC_SRCS"}}, $basename; }
        elsif ($basename =~ /\.svg$/) { push @{${$make}{"=SVG_SRCS"}}, $basename; }
    }
}

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

sub update_makefiles(@)
{
    my (@lines);

    foreach my $var (sort { $makerules{$a} cmp $makerules{$b}; } keys %makerules)
    {
        my $file = $makerules{$var};
        my %make = %{$makefiles{$file}};
        my $rules = $make{"=rules"} ? ",[$make{\"=rules\"}]" : "";
        push @lines, "WINE_CONFIG_MAKERULES([$file],[$var]$rules)\n";
    }
    push @lines, "\n";

    foreach my $file (sort @_)
    {
        my %make = %{$makefiles{$file}};
        my $rules = $make{"=rules"};
        my $args = "";
        my $is_win16 = $make{"MODULE"} && ($make{"MODULE"} =~ /16$/ || $modules16{$make{"MODULE"}});
        if ($rules eq $makerules{"MAKE_DLL_RULES"})
        {
            (my $name = $file) =~ s/^dlls\/(.*)\/Makefile/$1/;
            if ($name =~ /\./)
            {
                die "Invalid MODULE in $file" unless $make{"MODULE"} eq $name;
            }
            else
            {
                die "Invalid MODULE in $file" unless $make{"MODULE"} eq "$name.dll";
            }
            my $implib = $make{"IMPORTLIB"} || "";
            my $implib_srcs = defined($make{"IMPLIB_SRCS"}) && join( " ", @{$make{"IMPLIB_SRCS"}} );
            $args .= "," if $implib || $is_win16;
            $args .= "enable_win16" if $is_win16;
            $args .= ",[$implib]" if $implib;
            $args .= ",[$implib_srcs]" if $implib_srcs;
            push @lines, "WINE_CONFIG_DLL($name$args)\n";
        }
        elsif ($rules eq $makerules{"MAKE_PROG_RULES"})
        {
            (my $name = $file) =~ s/^programs\/(.*)\/Makefile/$1/;
            if ($name =~ /\./)
            {
                die "Invalid MODULE in $file" unless $make{"MODULE"} eq $name;
            }
            else
            {
                die "Invalid MODULE in $file" unless $make{"MODULE"} eq "$name.exe";
            }
            my $install = $dont_install{$name} ? "" : "install";
            $install .= "bin" if $bin_install{$name};
            $args .= "," if $is_win16 || $install;
            $args .= "$install" if $install;
            $args .= ",enable_win16" if $is_win16;
            push @lines, "WINE_CONFIG_PROGRAM($name$args)\n";
        }
        elsif ($rules eq $makerules{"MAKE_TEST_RULES"})
        {
            (my $dir = $file) =~ s/^(.*)\/Makefile/$1/;
            push @lines, "WINE_CONFIG_TEST($dir)\n";
        }
        elsif ($rules eq $makerules{"MAKE_IMPLIB_RULES"})
        {
            (my $name = $file) =~ s/^dlls\/(.*)\/Makefile/$1/;
            push @lines, "WINE_CONFIG_LIB($name)\n";
        }
        elsif ($file =~ /^tools.*\/Makefile$/)
        {
            (my $name = $file) =~ s/^(.*)\/Makefile/$1/;
            push @lines, "WINE_CONFIG_TOOL($name)\n";
        }
        elsif ($file =~ /\/Makefile$/)
        {
            (my $name = $file) =~ s/^(.*)\/Makefile/$1/;
            push @lines, "WINE_CONFIG_MAKEFILE([$name])\n";
        }
    }

    # update the source variables in all the makefiles

    foreach my $file (sort @_)
    {
        my %make = %{$makefiles{$file}};

        replace_makefile_variable( $file, "LEX_SRCS" );
        replace_makefile_variable( $file, "BISON_SRCS" );
        replace_makefile_variable( $file, "MC_SRCS" );
        replace_makefile_variable( $file, "SVG_SRCS" );
        replace_makefile_variable( $file, "C_SRCS" );
        replace_makefile_variable( $file, "RC_SRCS" );
    }

    push @lines, "dnl End of auto-generated output commands\n";
    replace_in_file( "configure.ac", '^WINE_CONFIG_MAKERULES', '^dnl End of auto-generated output commands\n$', @lines);
}


################################################################
# process ignore targets for generic source files

sub update_ignores(@)
{
    my @ignores;

    foreach my $file (sort @_)
    {
        my %makefile = %{$makefiles{$file}};
        my @list;

        foreach my $src (@ignore_srcs)
        {
            my @pattern = @{$src};
            next unless defined $makefile{$pattern[0]};
            push @list, map { (my $ret = $_) =~ s/$pattern[1]$/$pattern[2]/; $ret; } @{$makefile{$pattern[0]}};
        }
        foreach my $f (@list)
        {
            push @ignores, $makefile{"=dir"} . $f unless $f =~ /\$\(.*\)/;  # skip make variables
        }

        if (defined $makefile{"IMPORTLIB"})
        {
            if ($makefile{"IMPORTLIB"} =~ /^([a-zA-Z0-9_.]+)/)
            {
                if ("dlls/$1/" ne $makefile{"=dir"}) { push @ignores, "dlls/lib$1.def"; }
            }
            else
            {
                die "invalid importlib name $makefile{IMPORTLIB} in $file";
            }
        }
    }
    return @ignores;
}


################################################################
# update include/Makefile.in

sub update_includes()
{
    my (@h_srcs, @private_idl_srcs, @public_idl_srcs, @tlb_srcs, %subdirs);
    my @includes = map { (my $ret = $_) =~ s/^include\///; $ret; } grep /^include\//, @all_files;
    foreach my $incl (@includes)
    {
        if ($incl =~ /(.*)\//) { $subdirs{$1} = 1; }
        next if ($incl =~ /\.in$/);
        if ($incl =~ /^wine\// && !$exported_wine_headers{$incl})
        {
            if ($private_idl_headers{$incl}) { push @private_idl_srcs, $incl; }
            next;
        }
        if ($incl =~ /stdole2\.idl$/) { push @tlb_srcs, $incl; }
        elsif ($private_idl_headers{$incl}) { push @h_srcs, $incl; }
        elsif ($incl =~ /\.h$/) { push @h_srcs, $incl; }
        elsif ($incl =~ /\.rh$/) { push @h_srcs, $incl; }
        elsif ($incl =~ /\.inl$/) { push @h_srcs, $incl; }
        elsif ($incl =~ /\.idl$/) { push @public_idl_srcs, $incl; }
        else { die "unknown file $incl in include dir"; }
    }
    replace_in_file( "include/Makefile.in", '^PRIVATE_IDL_H_SRCS\s*=', '^INSTALLDIRS',
                     "PRIVATE_IDL_H_SRCS = \\\n\t",
                     join( " \\\n\t", sort @private_idl_srcs ),
                     "\n\nPUBLIC_IDL_H_SRCS = \\\n\t",
                     join( " \\\n\t", sort @public_idl_srcs ),
                     "\n\nIDL_TLB_SRCS = \\\n\t",
                     join( " \\\n\t", sort @tlb_srcs ),
                     "\n\nSRCDIR_INCLUDES = \\\n\t\$(IDL_TLB_SRCS) \\\n\t\$(PUBLIC_IDL_H_SRCS) \\\n\t",
                     join( " \\\n\t", sort @h_srcs ),
                     "\n\nEXTRASUBDIRS = ",
                     join( " ", sort keys %subdirs ),
                     "\n\nINSTALLDIRS = \\\n" );
    return map { s/(.*)\.idl$/include\/$1.h/; $_; } @public_idl_srcs, @private_idl_srcs;
}


################################################################
# update the main .gitignore

sub update_gitignore(@)
{
    my @ignores = values %makerules;

    foreach my $make (@makefiles)
    {
        my %makefile = %{$makefiles{$make}};
        my $dir = $makefile{"=dir"};
        if (defined $makefile{"MANPAGES"})
        {
            push @ignores, map { $dir . $_; } @{$makefile{"MANPAGES"}};
        }
        if (defined $makefile{"PROGRAMS"})
        {
            push @ignores, map { s/\$\(EXEEXT\)//; $dir . $_; } @{$makefile{"PROGRAMS"}};
        }
    }

    # prepend a slash to paths that don't have one
    @ignores = map { $_ =~ s/^([^\/]+)$/\/$1/; $_; } @ignores;

    # get rid of duplicates
    my %ignores = ();
    foreach my $i (@ignores, @_) { $ignores{$i} = 1; }

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


die "needs to be run from a git checkout" unless -d ".git";

@all_files = split /\0/, `git ls-files -c -z`;
@makefiles = map { my $ret = $_; $ret =~ s/\.in$//; $ret; } grep /Makefile.in$/, @all_files;

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

assign_sources_to_makefiles();
update_makefiles( @makefiles );
push @ignores, update_includes();
push @ignores, update_ignores( @makefiles );
update_gitignore( @ignores );
