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

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

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,
    "chprst.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,
    "errrec.idl" => 1,
    "opnrst.idl" => 1,
    "row.idl" => 1,
    "rowchg.idl" => 1,
    "rowpos.idl" => 1,
    "rowpsc.idl" => 1,
    "rstbas.idl" => 1,
    "rstinf.idl" => 1,
    "rstloc.idl" => 1,
    "rstnot.idl" => 1,
    "srcrst.idl" => 1,
    "sesprp.idl" => 1,
    "vmrender.idl" => 1,
    "xmldom.idl" => 1,
    "xmldso.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 (@linguas, @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};
    my $replaced = 0;
    my @values;

    if (defined ${$make}{"=$var"})
    {
        @values = @{${$make}{"=$var"}};
        ${$make}{$var} = \@values;
    }
    else
    {
        return unless defined ${$make}{$var};
        undef ${$make}{$var};
    }

    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 (!@values)
            {
                # nothing
            }
            elsif ($multiline)
            {
                print NEW_FILE "$var = \\\n\t" . join(" \\\n\t", sort @values) . "\n";
            }
            else
            {
                print NEW_FILE "$prefix= @values\n";
            }
            $replaced = 1;
            next;
        }
        if (/^\@MAKE/ && !$replaced && @values)
        {
            print NEW_FILE "$var = \\\n\t" . join(" \\\n\t", sort @values) . "\n";
        }
        print NEW_FILE $_;
    }
    close OLD_FILE;
    close NEW_FILE;
    return update_file("$file.in");
}

# parse the specified makefile and load the variables
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 (/^\s*(MODULE|IMPORTLIB|TESTDLL|PARENTSRC|APPMODE)\s*=\s*(.*)/)
        {
            my $var = $1;
            $make{$var} = $2;
            ${$make{"=flags"}}{"implib"} = 1 if $var eq "IMPORTLIB";
            next;
        }
        if (/^\s*(BISON_SRCS|LEX_SRCS|IDL_SRCS|IMPLIB_SRCS|C_SRCS|OBJC_SRCS|MC_SRCS|RC_SRCS|SVG_SRCS|FONT_SRCS|IN_SRCS|PROGRAMS|EXTRA_TARGETS|MANPAGES)\s*=\s*(.*)/)
        {
            my $var = $1;
            my @list = split(/\s+/, $2);
            $make{$var} = \@list;
            ${$make{"=flags"}}{"clean"} = 1 if $var eq "PROGRAMS";
            ${$make{"=flags"}}{"clean"} = 1 if $var eq "EXTRA_TARGETS";
            next;
        }
        if (/(install-lib|install-dev|clean)\s*:/)
        {
            ${$make{"=flags"}}{$1} = 1;
            next;
        }
        if (/^\s*(TOPSRCDIR|TOPOBJDIR|SRCDIR|VPATH)\s*=\s*(.*)/)
        {
            die "Variable $1 in $file.in is obsolete";
        }
    }

    if ($file =~ /^programs\/([^\/]+)\/Makefile/)
    {
        ${$make{"=flags"}}{"install"} = 1 unless $dont_install{$1};
        ${$make{"=flags"}}{"installbin"} = 1 if $bin_install{$1};
    }

    if (defined $make{"=flags"} && defined $make{"MODULE"})
    {
        die "Custom install-lib rule not allowed in $file" if defined ${$make{"=flags"}}{"install-lib"};
        die "Custom install-dev rule not allowed in $file" if defined ${$make{"=flags"}}{"install-dev"};
    }

    return %make;
}

# read pragma makedep flags from a source file
sub get_makedep_flags($)
{
    my $file = shift;
    my %flags;

    open FILE, $file or die "cannot open $file";
    while (<FILE>)
    {
        next unless /^#\s*pragma\s+makedep\s+(.*)/;
        foreach my $flag (split /\s+/, $1)
        {
            last if $flag eq "depend";
            $flags{$flag} = 1;
        }
    }
    close FILE;
    return %flags;
}

sub get_parent_makefile($)
{
    my $file = shift;
    my %make = %{$makefiles{$file}};
    my $reldir = $make{"PARENTSRC"} || "";
    return "" unless $reldir;
    (my $path = $file) =~ s/\/Makefile$/\//;
    while ($reldir =~ /^\.\.\//)
    {
        $reldir =~ s/^\.\.\///;
        $path =~ s/[^\/]+\/$//;
    }
    return "$path$reldir/Makefile";
}

# preserve shared source files that are listed in the existing makefile
sub preserve_shared_source_files($$$)
{
    my ($make, $parent, $var) = @_;
    my %srcs;

    return unless defined ${$parent}{"=$var"};
    foreach my $file (@{${$parent}{"=$var"}}) { $srcs{$file} = 1; }
    foreach my $file (@{${$make}{"=$var"}}) { $srcs{$file} = 0; }

    foreach my $file (@{${$make}{$var}})
    {
        next unless defined $srcs{$file} && $srcs{$file} == 1;
        push @{${$make}{"=$var"}}, $file;
    }
}

# assign source files to their respective makefile
sub assign_sources_to_makefiles(@)
{
    foreach my $file (@_)
    {
        next if defined $ignored_source_files{$file};
        next if $file =~ /Makefile\.in$/;
        my $dir = dirname( $file );
        my $subdir = $dir;

        while ($dir && !defined $makefiles{"$dir/Makefile"}) { $dir = dirname( $dir ); }
        $subdir =~ s/^$dir\/?//;
        next unless $dir;

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

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

        ${$make}{"=flags"}{"clean"} = 1 if $subdir;

        if ($dir eq "include")
        {
            next if ($name =~ /\.in$/);
            if ($name =~ /^wine\// && !$exported_wine_headers{$name})
            {
                if ($private_idl_headers{$name}) { push @{${$make}{"=PRIVATE_IDL_H_SRCS"}}, $name; }
                next;
            }
            if ($name =~ /stdole2\.idl$/) { push @{${$make}{"=IDL_TLB_SRCS"}}, $name; }
            elsif ($private_idl_headers{$name}) { push @{${$make}{"=SRCDIR_INCLUDES"}}, $name; }
            elsif ($name =~ /\.h$/) { push @{${$make}{"=SRCDIR_INCLUDES"}}, $name; }
            elsif ($name =~ /\.x$/) { push @{${$make}{"=XTEMPLATE_SRCS"}}, $name; }
            elsif ($name =~ /\.rh$/) { push @{${$make}{"=SRCDIR_INCLUDES"}}, $name; }
            elsif ($name =~ /\.inl$/) { push @{${$make}{"=SRCDIR_INCLUDES"}}, $name; }
            elsif ($name =~ /\.idl$/) { push @{${$make}{"=PUBLIC_IDL_H_SRCS"}}, $name; }
            else { die "unknown file $name in include dir"; }
        }
        else
        {
            if ($name =~ /\.m$/) { push @{${$make}{"=OBJC_SRCS"}}, $name; }
            elsif ($name =~ /\.l$/) { push @{${$make}{"=LEX_SRCS"}}, $name; }
            elsif ($name =~ /\.y$/) { push @{${$make}{"=BISON_SRCS"}}, $name; }
            elsif ($name =~ /\.svg$/) { push @{${$make}{"=SVG_SRCS"}}, $name; }
            elsif ($name =~ /\.sfd$/) { push @{${$make}{"=FONT_SRCS"}}, $name; }
            elsif ($name =~ /\.c$/)
            {
                my %flags = get_makedep_flags( $file );
                if (defined $flags{"implib"})
                {
                    push @{${$make}{"=IMPLIB_SRCS"}}, $name;
                    ${${$make}{"=flags"}}{"staticimplib"} = 1;
                }
                push @{${$make}{"=C_SRCS"}}, $name;
            }
            elsif ($name =~ /\.rc$/)
            {
                my %flags = get_makedep_flags( $file );
                ${${$make}{"=flags"}}{"po"} = 1 if defined $flags{"po"};
                push @{${$make}{"=RC_SRCS"}}, $name;
            }
            elsif ($name =~ /\.mc$/)
            {
                push @{${$make}{"=MC_SRCS"}}, $name;
                ${${$make}{"=flags"}}{"mc"} = 1;
            }
            elsif ($name =~ /\.idl$/)
            {
                push @{${$make}{"=IDL_SRCS"}}, $name;
                ${${$make}{"=flags"}}{"clean"} = 1;
            }
            elsif ($name =~ /\.man\.in$/)
            {
                push @{${$make}{"=MANPAGES"}}, $name;
                ${${$make}{"=flags"}}{"manpage"} = 1;
            }
            elsif ($name =~ /\.in$/)
            {
                push @{${$make}{"=IN_SRCS"}}, $name;
            }
        }
    }

    # add extra variables to include source list
    my $make = $makefiles{"include/Makefile"};
    unshift @{${$make}{"=SRCDIR_INCLUDES"}}, "\$(XTEMPLATE_SRCS)";
    unshift @{${$make}{"=SRCDIR_INCLUDES"}}, "\$(PUBLIC_IDL_H_SRCS)";
    unshift @{${$make}{"=SRCDIR_INCLUDES"}}, "\$(IDL_TLB_SRCS)";
    unshift @{${$make}{"=IDL_SRCS"}}, "\$(IDL_H_SRCS) \$(IDL_TLB_SRCS)";

    # preserve shared source files from the parent makefile
    foreach my $file (@makefiles)
    {
        my %make = %{$makefiles{$file}};
        my $parent = get_parent_makefile( $file );
        next unless $parent;
        preserve_shared_source_files( $makefiles{$file}, $makefiles{$parent}, "C_SRCS" );
        preserve_shared_source_files( $makefiles{$file}, $makefiles{$parent}, "IDL_SRCS" );
        preserve_shared_source_files( $makefiles{$file}, $makefiles{$parent}, "LEX_SRCS" );
        preserve_shared_source_files( $makefiles{$file}, $makefiles{$parent}, "BISON_SRCS" );
    }
}

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

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

    foreach my $file (sort @_)
    {
        my %make = %{$makefiles{$file}};
        my $args = "";
        my $is_win16 = $make{"MODULE"} && ($make{"MODULE"} =~ /16$/ || $modules16{$make{"MODULE"}});
        my $flag_args = defined $make{"=flags"} ? ",[" . join(",",sort keys %{$make{"=flags"}}) ."]" : "";
        if (defined($make{"TESTDLL"}))  # test
        {
            die "TESTDLL should not be defined in $file" unless $file =~ /\/tests\/Makefile$/;
            die "MODULE should not be defined in $file" if defined $make{"MODULE"};
            die "STATICLIB should not be defined in $file" if defined $make{"STATICLIB"};
            (my $dir = $file) =~ s/^(.*)\/Makefile/$1/;
            push @lines, "WINE_CONFIG_TEST($dir$flag_args)\n";
        }
        elsif (defined($make{"MODULE"}) && $make{"MODULE"} =~ /\.a$/)  # import lib
        {
            die "MODULE should not be defined as static lib in $file" unless $file =~ /^dlls\//;
            die "APPMODE should not be defined in $file" if defined $make{"APPMODE"};
            die "STATICLIB should not be defined in $file" if defined $make{"STATICLIB"};
            (my $name = $file) =~ s/^dlls\/(.*)\/Makefile/$1/;
            push @lines, "WINE_CONFIG_LIB($name$flag_args)\n";
        }
        elsif (defined($make{"MODULE"}) && defined($make{"APPMODE"}))  # program
        {
            die "APPMODE should not be defined in $file" unless $file =~ /^programs\//;
            die "STATICLIB should not be defined in $file" if defined $make{"STATICLIB"};
            (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";
            }
            $args .= "," if $is_win16 || defined $make{"=flags"};
            $args .= "enable_win16" if $is_win16;
            push @lines, "WINE_CONFIG_PROGRAM($name$args$flag_args)\n";
        }
        elsif (defined($make{"MODULE"}))  # dll
        {
            die "APPMODE should be defined in $file" if $file =~ /^programs\//;
            die "MODULE should not be defined in $file" unless $file =~ /^dlls\//;
            die "STATICLIB should not be defined in $file" if defined $make{"STATICLIB"};
            (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"} || "";
            $args .= "," if $is_win16 || defined $make{"=flags"};
            $args .= "enable_win16" if $is_win16;
            $args .= $flag_args;
            $args .= ",[$implib]" if $implib && $implib ne $name;
            push @lines, "WINE_CONFIG_DLL($name$args)\n";
        }
        elsif ($file =~ /^tools.*\/Makefile$/)
        {
            die "APPMODE should not be defined in $file" if defined $make{"APPMODE"};
            die "STATICLIB should not be defined in $file" if defined $make{"STATICLIB"};
            (my $name = $file) =~ s/^(.*)\/Makefile/$1/;
            push @lines, "WINE_CONFIG_TOOL($name$flag_args)\n";
        }
        elsif ($file =~ /\/Makefile$/)
        {
            (my $name = $file) =~ s/^(.*)\/Makefile/$1/;
            $args = "[$name]";
            $args .= "," if defined $make{"=flags"};
            push @lines, "WINE_CONFIG_MAKEFILE($args$flag_args)\n";
        }
    }

    push @lines, "\nAC_SUBST([LINGUAS],[\"\\\n", join( " \\\n", sort @linguas ), "\"])\n\n";

    # update the source variables in all the makefiles

    foreach my $file (sort @_)
    {
        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, "FONT_SRCS" );
        replace_makefile_variable( $file, "C_SRCS" );
        replace_makefile_variable( $file, "OBJC_SRCS" );
        replace_makefile_variable( $file, "RC_SRCS" );
        replace_makefile_variable( $file, "IDL_SRCS" );
        replace_makefile_variable( $file, "XTEMPLATE_SRCS" );
        replace_makefile_variable( $file, "IN_SRCS" );
        replace_makefile_variable( $file, "IMPLIB_SRCS" );
        replace_makefile_variable( $file, "MANPAGES" );
        next unless $file eq "include/Makefile";
        replace_makefile_variable( $file, "PRIVATE_IDL_H_SRCS" );
        replace_makefile_variable( $file, "PUBLIC_IDL_H_SRCS" );
        replace_makefile_variable( $file, "IDL_TLB_SRCS" );
        replace_makefile_variable( $file, "SRCDIR_INCLUDES" );
    }

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


################################################################
# update the LINGUAS file

sub update_linguas(@)
{
    replace_in_file( "po/LINGUAS", undef, undef, join("\n", sort @_), "\n" );
}


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

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

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

assign_sources_to_makefiles( @all_files );
update_linguas( @linguas );
update_makefiles( @makefiles );
