#! /usr/bin/perl -w

# Copyright 2002 Patrik Stridvall

use strict;

BEGIN {
    $0 =~ m%^(.*?/?tools)/winapi/msvcmaker$%;
    require "$1/winapi/setup.pm";
}

use config qw(&file_directory &get_spec_files &get_makefile_in_files $current_dir $wine_dir);
use output qw($output);
use util qw(replace_file);

use msvcmaker_options qw($options);

if($options->progress) {
    $output->enable_progress;
} else {
    $output->disable_progress;
}

########################################################################
# main

my @spec_files = get_spec_files("winelib");
my @makefile_in_files = get_makefile_in_files("winelib");

my $wine = 1;

my $output_prefix_dir = "Output";
my $no_release = 1;

if ($options->wine || $options->winetest) {
    foreach my $spec_file (@spec_files) {
	read_spec_file($spec_file);
    }
}

my %modules;

sub read_spec_file {
    my $spec_file = shift;

    my $module = $spec_file;
    $module =~ s%^.*?([^/]+)\.spec$%$1%;
    $module .= ".dll" if $module !~ /\./;

    my $type = "win32";

    open(IN, "< $wine_dir/$spec_file");

    my $header = 1;
    my $lookahead = 0;
    while($lookahead || defined($_ = <IN>)) {
	$lookahead = 0;

	s/^\s*?(.*?)\s*$/$1/; # remove whitespace at begining and end of line
	s/^(.*?)\s*#.*$/$1/;  # remove comments
	/^$/ && next;         # skip empty lines

	if($header)  {
	    if(/^\d+|@/) {
		$header = 0;
		$lookahead = 1;
	    }
	    next;
	}

	if(/^(\d+|@)\s+pascal(?:16)?/) {
	    $type = "win16";
	    last;
	}
    }
    close(IN);

    # FIXME: Kludge
    if($module =~ /^(?:comm|imm|ole2conv|ole2prox|ole2thk|rasapi16|windebug)\.dll$/) {
	$type = "win16";
    }

    if($type eq "win32") {
	$modules{$module}{module} = $module;
	$modules{$module}{type} = $type;
	$modules{$module}{spec_file} = $spec_file;
    }
}

my @gdi32_dirs = qw(dlls/gdi/enhmfdrv dlls/gdi/mfdrv dlls/gdi/win16drv graphics objects);
my @ntdll_dirs = qw(files if1632 loader/ne loader memory misc msdos ole relay32 scheduler win32);
my @user32_dirs = qw(controls dlls/user/dde windows);

push @makefile_in_files, "library/Makefile.in";
push @makefile_in_files, "unicode/Makefile.in";
push @makefile_in_files, "tools/winebuild/Makefile.in";

sub filter_files {
    my $files = shift;
    my $filter = shift;

    my $filtered_files = [];
    my $rest_of_files = [];
    foreach my $file (@$files) {
	if($file =~ /$filter/) {
	    $file =~ s%.*?([^/]+)$%./$1%; # FIXME: Kludge
	    push @$filtered_files, $file;
	} else {
	    push @$rest_of_files, $file;
	}
    }
    return ($rest_of_files, $filtered_files);
}

my %wine_test_dsp_files;

MAKEFILE_IN: foreach my $makefile_in_file (@makefile_in_files) {
    open(IN, "< $wine_dir/$makefile_in_file");

    my $topobjdir;
    my $module;
    my $testdll;
    my @imports;

    my %vars;

    my $again = 0;
    my $lookahead = 0;
    while($again || defined(my $line = <IN>)) {
	if(!$again) {
	    chomp $line;
	    if($lookahead) {
		$lookahead = 0;
		$_ .= "\n" . $line;
	    } else {
		$_ = $line;
	    }
	} else {
	    $again = 0;
	}

	s/^\s*?(.*?)\s*$/$1/; # remove whitespace at begining and end of line
	s/^(.*?)\s*#.*$/$1/;  # remove comments
	/^$/ && next;         # skip empty lines

	if(s/\\$/ /s) {
	    $lookahead = 1;
	    next;
	}

	if(/^MODULE\s*=\s*([\w\.]+)$/) {
	    $module = $1;

	    if($module eq "none") {
		if($makefile_in_file eq "library/Makefile.in") {
		    $module = "wine.dll";
		} elsif($makefile_in_file eq "unicode/Makefile.in") {
		    $module = "wine_unicode.dll";
		} elsif($makefile_in_file eq "tools/winebuild/Makefile.in") {
		    $module = "winebuild.exe";
		} else {
		    next MAKEFILE_IN;
		}
	    }
	} elsif(/^TOPOBJDIR\s*=\s*(\S+)\s*$/) {
	    $topobjdir = $1;
	} elsif (/^TESTDLL\s*=\s*(\S+)\s*$/) {
	    $testdll = $1;
	} elsif (/^IMPORTS\s*=\s*/) {
	    @imports = split /\s+/s, $';
	    @imports = grep !/^ntdll$/, @imports;
	} elsif (/^CTESTS\s*=\s*/) {
	    my @files = split /\s+/s, $';

	    my $dir = $makefile_in_file;
	    $dir =~ s/\/Makefile\.in$//;

	    my $dsp_file = $testdll;
	    $dsp_file =~ s/\.(dll|drv)$/_test.dsp/;
	    $dsp_file = "$dir/$dsp_file";

	    $wine_test_dsp_files{$dsp_file}{files} = [@files, "testlist.c"];
	    $wine_test_dsp_files{$dsp_file}{imports} = [@imports];
	} elsif(/^(\w+)\s*=\s*/) {
	    my $var = $1;
	    my @files = split /\s+/s, $';

	    @files = map {
		if(/^\$\((\w+):\%=(.*?)\%(.*?)\)$/) {
		    my @list = @{$vars{$1}};
		    my $prefix = $2;
		    my $suffix = $3;
		    foreach my $item (@list) {
			$item = "$prefix$item$suffix";
		    }
		    @list;
		} elsif(/^\$\(TOPOBJDIR\)(.*?)$/) {
		    "$topobjdir$1";
		} elsif(/^\$/) {
		    print STDERR "unknown variable '$_'\n" if 0;
		    ();
		} else {
		    $_;
		}
	    } @files;

	    $vars{$var} = \@files;
	}
    }

    close(IN);

    next if !$module;

    my $c_srcs = [];
    my $source_files = [];
    if(exists($vars{C_SRCS})) {
	$c_srcs = [sort(@{$vars{C_SRCS}})];
	$source_files = [sort(@{$vars{C_SRCS}})];
    }

    my $header_files = [];
    if(exists($vars{H_SRCS})) {
	$header_files = [sort(@{$vars{H_SRCS}})];
    }

    my $resource_files = [];
    if(exists($vars{RC_SRCS})) {
	$resource_files = [sort(@{$vars{RC_SRCS}})];
    }

    my $project = $module;
    $project =~ s/\.(?:dll|exe|lib)$//;
    $project =~ y/./_/;

    my $type;
    if($module =~ /\.exe$/) {
	$type = "exe";
    } elsif($module =~ /\.lib$/) {
	$type = "lib";
    } else {
	$type = "dll";
    }

    my $dsp_file = $makefile_in_file;
    $dsp_file =~ s/Makefile.in$/$project.dsp/;

    if($module eq "gdi32.dll") {
	foreach my $dir (@gdi32_dirs) {
	    my $dir2 = $dir;
	    $dir2 =~ s%^.*?/([^/]+)$%$1%;

	    my $module = "gdi32_$dir2.lib";
	    $module =~ s%/%_%g;

	    my $project = "gdi32_$dir2";
	    $project =~ s%/%_%g;

	    my $type = "lib";
	    my $dsp_file = "$dir/$project.dsp";

	    ($source_files, my $local_source_files) = filter_files($source_files, "$dir2/");
	    ($header_files, my $local_header_files) = filter_files($header_files, "$dir2/");
	    ($resource_files, my $local_resource_files) = filter_files($resource_files, "$dir2/");

	    $modules{$module}{wine} = 1;
	    $modules{$module}{winetest} = 0;
	    $modules{$module}{project} = $project;
	    $modules{$module}{type} = $type;
	    $modules{$module}{dsp_file} = $dsp_file;
	    $modules{$module}{c_srcs} = $c_srcs;
	    $modules{$module}{source_files} = $local_source_files;
	    $modules{$module}{header_files} = $local_header_files;
	    $modules{$module}{resource_files} = $local_resource_files;
	    $modules{$module}{imports} = [];
	}
    } elsif($module eq "ntdll.dll") {
	foreach my $dir (@ntdll_dirs) {
	    my $module = "ntdll_$dir.lib";
	    $module =~ s%/%_%g;

	    my $project = "ntdll_$dir";
	    $project =~ s%/%_%g;

	    my $type = "lib";
	    my $dsp_file = "$dir/$project.dsp";

	    ($source_files, my $local_source_files) = filter_files($source_files, "/$dir/");
	    ($header_files, my $local_header_files) = filter_files($header_files, "/$dir/");
	    ($resource_files, my $local_resource_files) = filter_files($resource_files, "/$dir/");

	    $modules{$module}{wine} = 1;
	    $modules{$module}{winetest} = 0;
	    $modules{$module}{project} = $project;
	    $modules{$module}{type} = $type;
	    $modules{$module}{dsp_file} = $dsp_file;
	    $modules{$module}{c_srcs} = $c_srcs;
	    $modules{$module}{source_files} = $local_source_files;
	    $modules{$module}{header_files} = $local_header_files;
	    $modules{$module}{resource_files} = $local_resource_files;
	    $modules{$module}{imports} = [];
	}
    } elsif($module eq "user32.dll") {
	foreach my $dir (@user32_dirs) {
	    my $dir2 = $dir;
	    $dir2 =~ s%^.*?/([^/]+)$%$1%;

	    my $module = "user32_$dir2.lib";
	    $module =~ s%/%_%g;

	    my $project = "user32_$dir2";
	    $project =~ s%/%_%g;

	    my $type = "lib";
	    my $dsp_file = "$dir/$project.dsp";

	    ($source_files, my $local_source_files) = filter_files($source_files, "$dir2/");
	    ($header_files, my $local_header_files) = filter_files($header_files, "$dir2/");
	    ($resource_files, my $local_resource_files) = filter_files($resource_files, "$dir2/");

	    $modules{$module}{wine} = 1;
	    $modules{$module}{winetest} = 0;
	    $modules{$module}{project} = $project;
	    $modules{$module}{type} = $type;
	    $modules{$module}{dsp_file} = $dsp_file;
	    $modules{$module}{c_srcs} = $c_srcs;
	    $modules{$module}{source_files} = $local_source_files;
	    $modules{$module}{header_files} = $local_header_files;
	    $modules{$module}{resource_files} = $local_resource_files;
	    $modules{$module}{imports} = [];
	}
    }

    $modules{$module}{wine} = 1;
    $modules{$module}{winetest} = 0;
    $modules{$module}{project} = $project;
    $modules{$module}{type} = $type;
    $modules{$module}{dsp_file} = $dsp_file;
    $modules{$module}{c_srcs} = $c_srcs;
    $modules{$module}{source_files} = $source_files;
    $modules{$module}{header_files} = $header_files;
    $modules{$module}{resource_files} = $resource_files;
    $modules{$module}{imports} = [];
}

$wine_test_dsp_files{"wineruntests.dsp"}{files} = ["runtests.c"];
$wine_test_dsp_files{"wineruntests.dsp"}{imports} = [];

$wine_test_dsp_files{"winetest.dsp"}{files} = [
  'include/wine/exception.h',
  'include/wine/test.h',
  'include/wine/unicode.h'
];
$wine_test_dsp_files{"winetest.dsp"}{imports} = [];

my %runtests = ();

foreach my $dsp_file (keys(%wine_test_dsp_files)) {
    my $project = $dsp_file;
    $project =~ s%^(?:.*?/)?([^/]+)\.dsp$%$1%;

    my @files = @{$wine_test_dsp_files{$dsp_file}{files}};
    my @imports = @{$wine_test_dsp_files{$dsp_file}{imports}};

    my $type;
    my $c_srcs = [];
    my $source_files = [];
    my $header_files = [];
    my $resource_files = [];

    my @tests = ();

    if ($project eq "winetest") {
	$type = "lib";
	$c_srcs = [@files];
	$source_files = [@files];
	$header_files = [];
	$resource_files = [];
    } elsif ($project eq "wineruntests") {
	$type = "exe";
	$c_srcs = [@files];
	$source_files = [@files];
	$header_files = [];
	$resource_files = [];
    } else {
	$type = "exe";
	$c_srcs = [@files];
	$source_files = [@files];
	$header_files = [];
	$resource_files = [];
	
	@tests = map {
	    if (/^testlist\.c$/) {
		();
	    } else {
		s/\.c$//;
		$_;
	    }
	} @files;

	$runtests{$dsp_file} = [@tests];
    }
    my $module = "$project.$type";

    $modules{$module}{wine} = 0;
    $modules{$module}{winetest} = 1;

    $modules{$module}{project} = $project;
    $modules{$module}{type} = $type;
    $modules{$module}{dsp_file} = $dsp_file;
    $modules{$module}{c_srcs} = $c_srcs;
    $modules{$module}{source_files} = $source_files;
    $modules{$module}{header_files} = $header_files;
    $modules{$module}{resource_files} = $resource_files;
    $modules{$module}{imports} = [@imports];

    $modules{$module}{tests} = [@tests];
}

foreach my $module (sort(keys(%modules))) {
    if($module =~ /^(?:ttydrv.dll|x11drv.dll)$/) {
	delete $modules{$module};
    }
}

my @modules = ();
foreach my $module (sort(keys(%modules))) {
    if (($options->wine && $modules{$module}{wine}) ||
	($options->winetest && $modules{$module}{winetest}))
    {
	push @modules, $module;
    }
}

my $progress_output;
my $progress_current = 0;
my $progress_max = scalar(@modules);

foreach my $module (@modules) {
    my $dsp_file = $modules{$module}{dsp_file};
    replace_file("$wine_dir/$dsp_file", \&_generate_dsp, $module);
}

sub _generate_dsp {
    local *OUT = shift;

    my $module = shift;

    my $dsp_file = $modules{$module}{dsp_file};
    my $project = $modules{$module}{project};
    my @imports = @{$modules{$module}{imports}};

    my $lib = ($modules{$module}{type} eq "lib");
    my $dll = ($modules{$module}{type} eq "dll");
    my $exe = ($modules{$module}{type} eq "exe");

    my $console = $exe; # FIXME: Not always correct

    my $msvc_wine_dir = do {
	my @parts = split(m%/%, $dsp_file);
	if($#parts == 1) {
	    "..";
	} elsif($#parts == 2) {
	    "..\\..";
	} else {
	    "..\\..\\..";
	}
    };
    my $wine_include_dir = "$msvc_wine_dir\\include";

    $progress_current++;
    $output->progress("$dsp_file (file $progress_current of $progress_max)");

    my @c_srcs = @{$modules{$module}{c_srcs}};
    my @source_files = @{$modules{$module}{source_files}};
    my @header_files = @{$modules{$module}{header_files}};
    my @resource_files = @{$modules{$module}{resource_files}};

    if ($project !~ /^(?:wine(?:_unicode)?|wine(?:build|runtests|test))$/ &&
        $project !~ /^(?:gdi32|ntdll|user32)_.+?$/ &&
        $project !~ /_test$/)
    {
	push @source_files, "$project.spec";
	# push @source_files, "$project.spec.c";
	@source_files = sort(@source_files);
    }

    my $no_cpp = 1;
    my $no_msvc_headers = 1;
    if ($project =~ /^(?:wine(?:runtests|test))$/ || $project =~ /_test$/) {
	$no_msvc_headers = 0;
    }

    my @cfgs;

    push @cfgs, "$project - Win32";

    if (!$no_cpp) {
	my @_cfgs;
	foreach my $cfg (@cfgs) {
	    push @_cfgs, "$cfg C";
	    push @_cfgs, "$cfg C++";
	}
	@cfgs = @_cfgs;
    }

    if (!$no_release) {
	my @_cfgs;
	foreach my $cfg (@cfgs) {
	    push @_cfgs, "$cfg Debug";
	    push @_cfgs, "$cfg Release";
	}
	@cfgs = @_cfgs;
    }

    if (!$no_msvc_headers) {
	my @_cfgs;
	foreach my $cfg (@cfgs) {
	    push @_cfgs, "$cfg MSVC Headers";
	    push @_cfgs, "$cfg Wine Headers";
	}
	@cfgs = @_cfgs;
    }

    my $default_cfg = $cfgs[$#cfgs];

    print OUT "# Microsoft Developer Studio Project File - Name=\"$project\" - Package Owner=<4>\r\n";
    print OUT "# Microsoft Developer Studio Generated Build File, Format Version 6.00\r\n";
    print OUT "# ** DO NOT EDIT **\r\n";
    print OUT "\r\n";

    if ($lib) {
	print OUT "# TARGTYPE \"Win32 (x86) Static Library\" 0x0104\r\n";
    } elsif ($dll) {
	print OUT "# TARGTYPE \"Win32 (x86) Dynamic-Link Library\" 0x0102\r\n";
    } else {
	print OUT "# TARGTYPE \"Win32 (x86) Console Application\" 0x0103\r\n";
    }
    print OUT "\r\n";

    print OUT "CFG=$default_cfg\r\n";
    print OUT "!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r\n";
    print OUT "!MESSAGE use the Export Makefile command and run\r\n";
    print OUT "!MESSAGE \r\n";
    print OUT "!MESSAGE NMAKE /f \"$project.mak\".\r\n";
    print OUT "!MESSAGE \r\n";
    print OUT "!MESSAGE You can specify a configuration when running NMAKE\r\n";
    print OUT "!MESSAGE by defining the macro CFG on the command line. For example:\r\n";
    print OUT "!MESSAGE \r\n";
    print OUT "!MESSAGE NMAKE /f \"$project.mak\" CFG=\"$default_cfg\"\r\n";
    print OUT "!MESSAGE \r\n";
    print OUT "!MESSAGE Possible choices for configuration are:\r\n";
    print OUT "!MESSAGE \r\n";
    foreach my $cfg (@cfgs) {
	if ($lib) {
	    print OUT "!MESSAGE \"$cfg\" (based on \"Win32 (x86) Static Library\")\r\n";
	} elsif ($dll) {
	    print OUT "!MESSAGE \"$cfg\" (based on \"Win32 (x86) Dynamic-Link Library\")\r\n";
	} else {
	    print OUT "!MESSAGE \"$cfg\" (based on \"Win32 (x86) Console Application\")\r\n";
	}
    }
    print OUT "!MESSAGE \r\n";
    print OUT "\r\n";

    print OUT "# Begin Project\r\n";
    print OUT "# PROP AllowPerConfigDependencies 0\r\n";
    print OUT "# PROP Scc_ProjName \"\"\r\n";
    print OUT "# PROP Scc_LocalPath \"\"\r\n";
    print OUT "CPP=cl.exe\r\n";
    print OUT "MTL=midl.exe\r\n" if !$lib && !$exe;
    print OUT "RSC=rc.exe\r\n";

    my $n = 0;

    my $output_dir;
    foreach my $cfg (@cfgs) {
	if($#cfgs == 0) {
	    # Nothing
	} elsif($n == 0) {
	    print OUT "!IF  \"\$(CFG)\" == \"$cfg\"\r\n";
	    print OUT "\r\n";
	} else {
	    print OUT "\r\n";
	    print OUT "!ELSEIF  \"\$(CFG)\" == \"$cfg\"\r\n";
	    print OUT "\r\n";
	}

	my $debug = ($cfg !~ /Release/);
	my $msvc_headers = ($cfg =~ /MSVC Headers/);

	print OUT "# PROP BASE Use_MFC 0\r\n";

	if($debug) {
	    print OUT "# PROP BASE Use_Debug_Libraries 1\r\n";
	} else {
	    print OUT "# PROP BASE Use_Debug_Libraries 0\r\n";
	}

	$output_dir = $cfg;
	$output_dir =~ s/^$project - //;
	$output_dir =~ s/ /_/g;
	$output_dir =~ s/C\+\+/Cxx/g;
	if($output_prefix_dir) {
	    $output_dir = "$output_prefix_dir\\$output_dir";
	}

	print OUT "# PROP BASE Output_Dir \"$output_dir\"\r\n";
	print OUT "# PROP BASE Intermediate_Dir \"$output_dir\"\r\n";

	print OUT "# PROP BASE Target_Dir \"\"\r\n";

	print OUT "# PROP Use_MFC 0\r\n";
	if($debug) {
	    print OUT "# PROP Use_Debug_Libraries 1\r\n";
	} else {
	    print OUT "# PROP Use_Debug_Libraries 0\r\n";
	}
	print OUT "# PROP Output_Dir \"$output_dir\"\r\n";
	print OUT "# PROP Intermediate_Dir \"$output_dir\"\r\n";

	print OUT "# PROP Ignore_Export_Lib 0\r\n" if $dll;
	print OUT "# PROP Target_Dir \"\"\r\n";

	my @defines;
	if($debug) {
	    if($lib || $exe) {
		print OUT "# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od";
		@defines = (qw(WIN32 _DEBUG _MBCS _LIB));
	    } else {
		print OUT "# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od";
		@defines = (qw(WIN32 _DEBUG _WINDOWS _MBCS _USRDLL), ("\U${project}\E_EXPORTS"));
	    }
	} else {
	    if($lib || $exe) {
		print OUT "# ADD BASE CPP /nologo /W3 /GX /O2";
		@defines = (qw(WIN32 NDEBUG _MBCS _LIB));
	    } else {
		print OUT "# ADD BASE CPP /nologo /MT /W3 /GX /O2";
		@defines = (qw(WIN32 NDEBUG _WINDOWS _MBCS _USRDLL), ("\U${project}\E_EXPORTS"));
	    }
	}

	foreach my $define (@defines) {
	    print OUT " /D \"$define\"";
	}
	print OUT " /YX" if $lib || $exe;
	print OUT " /FD";
	print OUT " /GZ" if $debug;
	print OUT " " if $debug && ($lib || $exe);
	print OUT " /c";
	print OUT "\r\n";

	my @defines2;
	if($debug) {
	    if($lib) {
		print OUT "# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od";
		@defines2 = qw(WIN32 _DEBUG _WINDOWS _MBCS _LIB);
	    } else {
		print OUT "# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od";
		@defines2 = qw(_DEBUG WIN32 _WINDOWS _MBCS _USRDLL);
	    }
	} else {
	    if($lib) {
		print OUT "# ADD CPP /nologo /MT /W3 /GX /O2";
		@defines2 = qw(WIN32 NDEBUG _WINDOWS _MBCS _LIB);
	    } else {
		print OUT "# ADD CPP /nologo /MT /W3 /GX /O2";
		@defines2 = qw(NDEBUG WIN32 _WINDOWS _MBCS _USRDLL);
	    }
	}

	my @includes = ();
	if($wine) {
	    push @defines2, "_\U${project}\E_";
	    push @defines2, qw(__WINESRC__) if $project !~ /^(?:wine(?:build|test)|.*?_test)$/;
	    push @defines2, qw(__WINE_USE_MSVCRT);
	    my $output_dir2 = $output_dir;
	    $output_dir =~ s/\\/\\\\/g;
	    push @defines2, "__WINETEST_OUTPUT_DIR=\\\"$output_dir\\\"";
	    push @defines2, qw(__i386__ _X86_);

	    if($project =~ /^gdi32_(?:enhmfdrv|mfdrv|win16drv)$/) {
		push @includes, "..";
	    }

	    if($project =~ /^user32_(?:controls|windows)$/) {
		push @includes, "..\\dlls\\user";
	    }

	    if($project =~ /^user32_dde$/) {
		push @includes, "..";
	    }

	    if ($project =~ /_test$/) {
		push @includes, "$msvc_wine_dir\\$output_dir";
	    } 

	    if (!$msvc_headers || $project =~ /^winetest$/) {
		push @includes, $wine_include_dir;
	    }
	}

	if($wine) {
	    foreach my $include (@includes) {
		if ($include !~ /[\\\"]/) {
		    print OUT " /I \"$include\"";
		} else {
		    print OUT " /I $include";
		}
	    }
	}

	foreach my $define (@defines2) {
	    if ($define !~ /[\\\"]/) {
		print OUT " /D \"$define\"";
	    } else {
		print OUT " /D $define";
	    }
	}
	print OUT " /D inline=__inline" if $wine;
	print OUT " /D \"__STDC__\"" if 0 && $wine;

	print OUT " /YX" if $lib;
	print OUT " /FR" if !$lib;
	print OUT " /FD";
	print OUT " /GZ" if $debug;
	print OUT " " if $debug && $lib;
	print OUT " /c";
	print OUT " /TP" if !$no_cpp;
	print OUT "\r\n";

	if($debug) {
	    print OUT "# SUBTRACT CPP /X /YX\r\n" if $dll;
	    print OUT "# ADD BASE MTL /nologo /D \"_DEBUG\" /mktyplib203 /win32\r\n" if $dll;
	    print OUT "# ADD MTL /nologo /D \"_DEBUG\" /mktyplib203 /win32\r\n" if $dll;
	    print OUT "# ADD BASE RSC /l 0x41d /d \"_DEBUG\"\r\n";
	    print OUT "# ADD RSC /l 0x41d";
	    if($wine) {
		foreach my $include (@includes) {
		    print OUT " /i \"$include\"";
		}
	    }
	    print OUT " /d \"_DEBUG\"\r\n";
	} else {
	    print OUT "# SUBTRACT CPP /YX\r\n" if $dll;
	    print OUT "# ADD BASE MTL /nologo /D \"NDEBUG\" /mktyplib203 /win32\r\n" if $dll;
	    print OUT "# ADD MTL /nologo /D \"NDEBUG\" /mktyplib203 /win32\r\n" if $dll;
	    print OUT "# ADD BASE RSC /l 0x41d /d \"NDEBUG\"\r\n";
	    print OUT "# ADD RSC /l 0x41d";
	    if($wine) {
		foreach my $include (@includes) {
		    print OUT " /i \"$include\"";
		}
	    }
	    print OUT "/d \"NDEBUG\"\r\n";
	}
	print OUT "BSC32=bscmake.exe\r\n";
	print OUT "# ADD BASE BSC32 /nologo\r\n";
	print OUT "# ADD BSC32 /nologo\r\n";

	if($exe || $dll) {
	    print OUT "LINK32=link.exe\r\n";
	    print OUT "# ADD BASE LINK32 ";
	    my @libraries = qw(kernel32.lib user32.lib gdi32.lib winspool.lib
			       comdlg32.lib advapi32.lib shell32.lib ole32.lib
			       oleaut32.lib uuid.lib odbc32.lib odbccp32.lib);
	    foreach my $library (@libraries) {
		print OUT "$library ";
	    }
	    print OUT " /nologo";
	    print OUT " /dll" if $dll;
            print OUT " /subsystem:console" if $console;
	    print OUT " /debug" if $debug;
	    print OUT " /machine:I386";
	    print OUT " /pdbtype:sept" if $debug;
	    print OUT "\r\n";

	    print OUT "# ADD LINK32";
	    print OUT " /nologo";
	    print OUT " libcmt.lib" if $project =~ /^ntdll$/; # FIXME: Kludge
	    foreach my $import (@imports) {
		print OUT " $import.lib" if ($import ne "msvcrt");
	    }
	    print OUT " /dll" if $dll;
            print OUT " /subsystem:console" if $console;
	    print OUT " /debug" if $debug;
	    print OUT " /machine:I386";
	    print OUT " /nodefaultlib" if $project =~ /^ntdll$/; # FIXME: Kludge
	    print OUT " /def:\"$project.def\"" if $dll;
	    print OUT " /pdbtype:sept" if $debug;
	    print OUT "\r\n";
	} else {
	    print OUT "LIB32=link.exe -lib\r\n";
	    print OUT "# ADD BASE LIB32 /nologo\r\n";
	    print OUT "# ADD LIB32 /nologo\r\n";
	}

	$n++;
    }

    if($#cfgs != 0) {
	print OUT "\r\n";
	print OUT "!ENDIF \r\n";
	print OUT "\r\n";
    }

    if ($project eq "winebuild") {
	print OUT "# Begin Special Build Tool\r\n";
	print OUT "SOURCE=\"\$(InputPath)\"\r\n";
        print OUT "PostBuild_Desc=Copying wine.dll and wine_unicode.dll ...\r\n";
	print OUT "PostBuild_Cmds=";
	print OUT "copy ..\\..\\library\\$output_dir\\wine.dll \$(OutDir)\t";
	print OUT "copy ..\\..\\unicode\\$output_dir\\wine_unicode.dll \$(OutDir)\r\n";
	print OUT "# End Special Build Tool\r\n";
    }
    print OUT "# Begin Target\r\n";
    print OUT "\r\n";
    foreach my $cfg (@cfgs) {
	print OUT "# Name \"$cfg\"\r\n";
    }

    print OUT "# Begin Group \"Source Files\"\r\n";
    print OUT "\r\n";
    print OUT "# PROP Default_Filter \"cpp;c;cxx;rc;def;r;odl;idl;hpj;bat\"\r\n";

    foreach my $source_file (@source_files) {
	$source_file =~ s%/%\\%g;
	if($source_file !~ /^\./) {
	    $source_file = ".\\$source_file";
	}

	if($source_file =~ /^(.*?)\.spec$/) {
	    my $basename = $1;

	    $basename = "$basename.dll" if $basename !~ /\..{1,3}$/;
	    my $dbg_c_file = "$basename.dbg.c";

	    print OUT "# Begin Source File\r\n";
	    print OUT "\r\n";
	    print OUT "SOURCE=$dbg_c_file\r\n";
	    print OUT "# End Source File\r\n";
	}

	print OUT "# Begin Source File\r\n";
	print OUT "\r\n";

	print OUT "SOURCE=$source_file\r\n";

	if($source_file =~ /^(.*?)\.spec$/) {
	    my $basename = $1;

	    my $spec_file = $source_file;
	    my $def_file = "$basename.def";

	    $basename = "$basename.dll" if $basename !~ /\..{1,3}$/;
	    my $dbg_file = "$basename.dbg";
	    my $dbg_c_file = "$basename.dbg.c";

	    my $srcdir = "."; # FIXME: Is this really always correct?

	    print OUT "# Begin Custom Build\r\n";
	    print OUT "InputPath=$spec_file\r\n";
	    print OUT "\r\n";
	    print OUT "BuildCmds= \\\r\n";
	    print OUT "\t..\\..\\tools\\winebuild\\$output_dir\\winebuild.exe -def $spec_file > $def_file \\\r\n";
	    
	    if($project =~ /^ntdll$/) {
		my $n = 0;
		foreach my $c_src (@c_srcs) {
		    if($n++ > 0)  {
			print OUT "\techo $c_src >> $dbg_file \\\r\n";
		    } else {
			print OUT "\techo $c_src > $dbg_file \\\r\n";
		    }
		}
		print OUT "\t..\\..\\tools\\winebuild\\$output_dir\\winebuild.exe";
		print OUT " -o $dbg_c_file -debug -C$srcdir $dbg_file \\\r\n";
	    } else {
		my $c_srcs = join(" ", grep(/\.c$/, @c_srcs));

		print OUT "\t..\\..\\tools\\winebuild\\$output_dir\\winebuild.exe";
		print OUT " -o $dbg_c_file -debug -C$srcdir $c_srcs \\\r\n";
	    }

	    print OUT "\t\r\n";
	    print OUT "\r\n";
	    print OUT "\"$def_file\" : \$(SOURCE) \"\$(INTDIR)\" \"\$(OUTDIR)\"\r\n";
	    print OUT "   \$(BuildCmds)\r\n";
	    print OUT "\r\n";
	    print OUT "\"$dbg_c_file\" : \$(SOURCE) \"\$(INTDIR)\" \"\$(OUTDIR)\"\r\n";
	    print OUT "   \$(BuildCmds)\r\n";
	    print OUT "# End Custom Build\r\n";
	} elsif($source_file =~ /([^\\]*?\.h)$/) {
	    my $h_file = $1;

	    foreach my $cfg (@cfgs) {
		if($#cfgs == 0) {
		    # Nothing
		} elsif($n == 0) {
		    print OUT "!IF  \"\$(CFG)\" == \"$cfg\"\r\n";
		    print OUT "\r\n";
		} else {
		    print OUT "\r\n";
		    print OUT "!ELSEIF  \"\$(CFG)\" == \"$cfg\"\r\n";
		    print OUT "\r\n";
		}

		$output_dir = $cfg;
		$output_dir =~ s/^$project - //;
		$output_dir =~ s/ /_/g;
		$output_dir =~ s/C\+\+/Cxx/g;
		if($output_prefix_dir) {
		    $output_dir = "$output_prefix_dir\\$output_dir";
		}

		print OUT "# Begin Custom Build\r\n";
		print OUT "OutDir=$output_dir\r\n";
		print OUT "InputPath=$source_file\r\n";
		print OUT "\r\n";
		print OUT "\"\$(OutDir)\\wine\\$h_file\" : \$(SOURCE) \"\$(INTDIR)\" \"\$(OUTDIR)\"\r\n";
		print OUT "\tcopy \$(InputPath) \$(OutDir)\\wine\r\n";
		print OUT "\r\n";
		print OUT "# End Custom Build\r\n";
	    }

	    if($#cfgs != 0) {
		print OUT "\r\n";
		print OUT "!ENDIF \r\n";
		print OUT "\r\n";
	    }
	}

	print OUT "# End Source File\r\n";
    }
    print OUT "# End Group\r\n";

    print OUT "# Begin Group \"Header Files\"\r\n";
    print OUT "\r\n";
    print OUT "# PROP Default_Filter \"h;hpp;hxx;hm;inl\"\r\n";
    foreach my $header_file (@header_files) {
	print OUT "# Begin Source File\r\n";
	print OUT "\r\n";
	print OUT "SOURCE=.\\$header_file\r\n";
	print OUT "# End Source File\r\n";
    }
    print OUT "# End Group\r\n";



    print OUT "# Begin Group \"Resource Files\"\r\n";
    print OUT "\r\n";
    print OUT "# PROP Default_Filter \"ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe\"\r\n";
    foreach my $resource_file (@resource_files) {
	print OUT "# Begin Source File\r\n";
	print OUT "\r\n";
	print OUT "SOURCE=.\\$resource_file\r\n";
	print OUT "# End Source File\r\n";
    }
    print OUT "# End Group\r\n";

    print OUT "# End Target\r\n";
    print OUT "# End Project\r\n";

    close(OUT);
}

sub _generate_dsw_header {
    local *OUT = shift;

    print OUT "Microsoft Developer Studio Workspace File, Format Version 6.00\r\n";
    print OUT "# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!\r\n";
    print OUT "\r\n";
}

sub _generate_dsw_project {
    local *OUT = shift;

    my $project = shift;
    my $dsp_file = shift;
    my @dependencies = @{(shift)};

    $dsp_file = "./$dsp_file";
    $dsp_file =~ y%/%\\%;
    
    @dependencies = sort(@dependencies);

    print OUT "###############################################################################\r\n";
    print OUT "\r\n";
    print OUT "Project: \"$project\"=$dsp_file - Package Owner=<4>\r\n";
    print OUT "\r\n";
    print OUT "Package=<5>\r\n";
    print OUT "{{{\r\n";
    print OUT "}}}\r\n";
    print OUT "\r\n";
    print OUT "Package=<4>\r\n";
    print OUT "{{{\r\n";
    foreach my $dependency (@dependencies) {
	print OUT "    Begin Project Dependency\r\n";
	print OUT "    Project_Dep_Name $dependency\r\n";
	print OUT "    End Project Dependency\r\n";
    }
    print OUT "}}}\r\n";
    print OUT "\r\n";
}

sub _generate_dsw_footer {
    local *OUT = shift;

    print OUT "###############################################################################\r\n";
    print OUT "\r\n";
    print OUT "Global:\r\n";
    print OUT "\r\n";
    print OUT "Package=<5>\r\n";
    print OUT "{{{\r\n";
    print OUT "}}}\r\n";
    print OUT "\r\n";
    print OUT "Package=<3>\r\n";
    print OUT "{{{\r\n";
    print OUT "}}}\r\n";
    print OUT "\r\n";
    print OUT "###############################################################################\r\n";
    print OUT "\r\n";
}

if ($options->wine) {
    my $dsw_file = "wine.dsw";
    $output->progress("$dsw_file");
    replace_file("$wine_dir/$dsw_file", \&_generate_wine_dsw);
}

sub _generate_wine_dsw {
    local *OUT = shift;

    _generate_dsw_header(\*OUT);
    foreach my $module (sort(keys(%modules))) {
	next if $module =~ /(?:winetest\.lib|wineruntests\.exe|_test\.exe)$/;

	my $project = $modules{$module}{project};
	my $dsp_file = $modules{$module}{dsp_file};

	my @dependencies;
	if($project =~ /^wine(?:_unicode)?$/) {
	    @dependencies = ();
	} elsif($project =~ /^winebuild$/) {
	    @dependencies = ("wine", "wine_unicode");
	} elsif($project =~ /^(?:gdi32|ntdll|user32)_.+?$/) {
	    @dependencies = ();
	} else {
	    @dependencies = ("wine", "wine_unicode", "winebuild");
	}

        if($project =~ /^gdi32$/) {
	    foreach my $dir (@gdi32_dirs) {
		my $dir2 = $dir;
		$dir2 =~ s%^.*?/([^/]+)$%$1%;

		my $module = "gdi32_$dir2";
		$module =~ s%/%_%g;
		push @dependencies, $module;
	    }
        } elsif($project =~ /^ntdll$/) {
	    foreach my $dir (@ntdll_dirs) {
		my $module = "ntdll_$dir";
		$module =~ s%/%_%g;
		push @dependencies, $module;
	    }
        } elsif($project =~ /^user32$/) {
	    foreach my $dir (@user32_dirs) {
		my $dir2 = $dir;
		$dir2 =~ s%^.*?/([^/]+)$%$1%;

		my $module = "user32_$dir2";
		$module =~ s%/%_%g;
		push @dependencies, $module;
	    }
        }

	_generate_dsw_project(\*OUT, $project, $dsp_file, \@dependencies);
    }
    _generate_dsw_footer(\*OUT);

    return 1;
}

if ($options->winetest) {
    my $dsw_file = "winetest.dsw";
    $output->progress("$dsw_file");
    replace_file("$wine_dir/$dsw_file", \&_generate_winetest_dsw);
}

sub _generate_winetest_dsw {
    local *OUT = shift;

    _generate_dsw_header(\*OUT);

    my @runtests_dependencies = ();
    foreach my $module (sort(keys(%modules))) {
	next if $module !~ /(?:winetest\.lib|wineruntests\.exe|_test\.exe)$/;
	next if $module eq "wineruntests";

	my $project = $modules{$module}{project};

	push @runtests_dependencies, $project;
    }

    foreach my $module (sort(keys(%modules))) {
	next if $module !~ /(?:winetest\.lib|wineruntests\.exe|_test\.exe)$/;

	my $project = $modules{$module}{project};
	my $dsp_file = $modules{$module}{dsp_file};

	my @dependencies;
	if($project =~ /^winetest$/) {
	    @dependencies = ();
	} elsif($project =~ /^wineruntests$/) {
	    @dependencies = @runtests_dependencies;
	} else {
	    @dependencies = ("winetest");
	}

	_generate_dsw_project(\*OUT, $project, $dsp_file, \@dependencies);
    }

    _generate_dsw_footer(\*OUT);
}

if ($options->winetest) {
    foreach my $module (sort(keys(%modules))) {
	next if $module !~ /_test\.exe$/;

	my $project = $modules{$module}{project};
	my $dsp_file = $modules{$module}{dsp_file};
	my @tests = @{$modules{$module}{tests}};

	my $testlist_c = $dsp_file;
	$testlist_c =~ s%[^/]*\.dsp$%testlist.c%;

	replace_file("$wine_dir/$testlist_c", \&_generate_testlist_c, \@tests);
    }
}

sub _generate_testlist_c {
    local *OUT = shift;

    my @tests = @{(shift)};

    print OUT "/* Automatically generated file; DO NOT EDIT!! */\n";
    print OUT "\n";
    print OUT "#include <stdio.h>\n";
    print OUT "#include <stdlib.h>\n";
    print OUT "#include \"windef.h\"\n";
    print OUT "#include \"winbase.h\"\n";
    print OUT "\n";
    foreach my $test (@tests) {
	print OUT "extern void func_$test(void);\n";
    }
    print OUT "\n";
    print OUT "struct test\n";
    print OUT "{\n";
    print OUT "    const char *name;\n";
    print OUT "    void (*func)(void);\n";
    print OUT "};\n";
    print OUT "\n";
    print OUT "static const struct test winetest_testlist[] =\n";
    print OUT "{\n";
    foreach my $test (@tests) {
	print OUT "    { \"$test\", func_$test },\n";
    }
    print OUT "    { 0, 0 }\n";
    print OUT "};\n";
    print OUT "\n";
    print OUT "#define WINETEST_WANT_MAIN\n";
    print OUT "#include \"wine/test.h\"\n";
}

if ($options->winetest) {
    replace_file("$wine_dir/runtests.c", \&_generate_runtests_c);
}

sub _generate_runtests_c {
    local *OUT = shift;

    print OUT "/* Automatically generated file; DO NOT EDIT!! */\n";

    print OUT "\n";
    print OUT "#include <stdio.h>\n";
    print OUT "#include <stdlib.h>\n";
    print OUT "\n";

    print OUT "int main(int argc, char *argv[])\n";
    print OUT "{\n";
    print OUT "    char output_dir[] = __WINETEST_OUTPUT_DIR;\n";
    print OUT "    char command[4096];\n";
    print OUT "\n";
    foreach my $dsp_file (keys(%runtests)) {
	my @tests =  @{$runtests{$dsp_file}};

	my $project = $dsp_file;
	$project =~ s%^(.*?)/?([^/]+)\.dsp$%$2%;
	my $dir = $1;
	$dir =~ s%/%\\\\%g; 

	foreach my $test (@tests) {
	    print OUT "    sprintf(command, \"$dir\\\\%s\\\\$project.exe $test\", output_dir);\n";
	    print OUT "    system(command);\n";
	    print OUT "\n";
	}
    }
    print OUT "    return 0;\n";
    print OUT "}\n";
}


if ($options->wine) {
    my $config_h = "include/config.h";

    $output->progress("$config_h");

    replace_file("$wine_dir/$config_h", \&_generate_config_h);
}

sub _generate_config_h {
    local *OUT = shift;

    print OUT "#define __WINE_CONFIG_H\n";
    print OUT "\n";

    my @headers = qw(direct.h io.h);
    foreach my $header (@headers) {
	$header =~ y/\.\//__/;
	print OUT "#define HAVE_\U$header\E\n";
	print OUT "\n";
    }

    my @functions = qw(
        _alldiv _allmul _allrem _aulldiv _aullrem
        _access _chdir _close _lseek _mkdir _open _pclose _popen _read _rmdir _write _stat
        _snprintf _stricmp _strnicmp _vsnprintf _wcsicmp wcslen
        ecvt fcvt gcvt
        strerror
    );
    foreach my $function (@functions) {
	print OUT "#define HAVE_\U$function\E 1\n";
	print OUT "\n";
    }

    if(0) {
	print OUT "#define NEED_STDCALL_DECORATION 1\n";
	print OUT "\n";
    }

    print OUT "#define X_DISPLAY_MISSING 1\n";
    print OUT "\n";

    print OUT "/* Define to a macro to generate an assembly function directive */\n";
    print OUT "#define __ASM_FUNC(name) \"\"\n";
    print OUT "\n";

    print OUT "/* Define to a macro to generate an assembly name from a C symbol */\n";
    print OUT "#define __ASM_NAME(name) name\n";
    print OUT "\n";

    print OUT "/* Define to the address where bug reports for this package should be sent. */\n";
    print OUT "#define PACKAGE_BUGREPORT \"\"\n";
    print OUT "\n";

    print OUT "/* Define to the full name of this package. */\n";
    print OUT "#define PACKAGE_NAME \"Wine\"\n";
    print OUT "\n";

    print OUT "/* Define to the full name and version of this package. */\n";
    print OUT "#define PACKAGE_STRING \"Wine YYYYMMDD\"\n";
    print OUT "\n";

    print OUT "/* Define to the one symbol short name of this package. */\n";
    print OUT "#define PACKAGE_TARNAME \"wine\"\n";
    print OUT "\n";

    print OUT "/* Define to the version of this package. */\n";
    print OUT "#define PACKAGE_VERSION \"YYYYMMDD\"\n";
    print OUT "\n";

    close(OUT);
}
