#! /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 graphics objects);
my @ntdll_dirs = qw(files misc);
my @user32_dirs = qw(controls dlls/user/dde windows);

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',
  'winetest.c'
];
$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);
	    if ($msvc_headers) {
	    	push @defines2, qw(__WINE_USE_NATIVE_HEADERS);
	    }
	    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->winetest) {
    replace_file("$wine_dir/winetest.c", \&_generate_winetest_c);
}

sub _generate_winetest_c {
    local *OUT = shift;

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

    print OUT "/* Force the linker to generate a .lib file */\n";
    print OUT "void __wine_dummy_lib_function()\n{\n}\n\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 fcntl.h io.h string.h process.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 _spawnvp _stricmp _strnicmp _vsnprintf _wcsicmp
        ecvt fcvt gcvt
        memmove
        strerror
        wcslen
    );
    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 assembler keyword used to specify a word value */";
    print OUT "define __ASM_SHORT \".short\"";
    print OUT "\n";

    print OUT "/* Define to the assembler keyword used to specify an ASCII string */";
    print OUT "#define __ASM_STRING \".string\"";
    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);
}
