mirror of
https://github.com/reactos/wine.git
synced 2024-11-29 06:30:37 +00:00
272d240402
Define __WINE_USE_NATIVE_HEADERS for tests that need to care. Change the debug information format to prevent winedbg from crashing.
1302 lines
35 KiB
Perl
Executable File
1302 lines
35 KiB
Perl
Executable File
#! /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',
|
|
'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 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);
|
|
}
|