- Added proper parsing of the Makefile.in's to find the tests.
- Added support for optionally using the Microsoft headers instead of the Wine headers.
This commit is contained in:
parent
4eeadac1e7
commit
ccfd32fbf6
|
@ -65,7 +65,6 @@ my $wine = 1;
|
|||
|
||||
my $output_prefix_dir = "Output";
|
||||
my $no_release = 1;
|
||||
my $no_msvc_headers = 1;
|
||||
|
||||
my %modules;
|
||||
|
||||
|
@ -139,11 +138,15 @@ sub filter_files {
|
|||
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;
|
||||
|
||||
|
@ -187,12 +190,27 @@ MAKEFILE_IN: foreach my $makefile_in_file (@makefile_in_files) {
|
|||
}
|
||||
} 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$/_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 = ();
|
||||
|
||||
@files = map {
|
||||
if(/^\$\((\w+):\%=(.*?)\%(.*?)\)$/) {
|
||||
my @list = @{$vars{$1}};
|
||||
|
@ -278,6 +296,7 @@ MAKEFILE_IN: foreach my $makefile_in_file (@makefile_in_files) {
|
|||
$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) {
|
||||
|
@ -301,6 +320,7 @@ MAKEFILE_IN: foreach my $makefile_in_file (@makefile_in_files) {
|
|||
$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) {
|
||||
|
@ -327,6 +347,7 @@ MAKEFILE_IN: foreach my $makefile_in_file (@makefile_in_files) {
|
|||
$modules{$module}{source_files} = $local_source_files;
|
||||
$modules{$module}{header_files} = $local_header_files;
|
||||
$modules{$module}{resource_files} = $local_resource_files;
|
||||
$modules{$module}{imports} = [];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -337,40 +358,48 @@ MAKEFILE_IN: foreach my $makefile_in_file (@makefile_in_files) {
|
|||
$modules{$module}{source_files} = $source_files;
|
||||
$modules{$module}{header_files} = $header_files;
|
||||
$modules{$module}{resource_files} = $resource_files;
|
||||
$modules{$module}{imports} = [];
|
||||
}
|
||||
|
||||
# FIMXE: Parse the Makefile.in's instead.
|
||||
$wine_test_dsp_files{"programs/winetest/winetest.dsp"}{files} = ["wtmain.c"];
|
||||
$wine_test_dsp_files{"programs/winetest/winetest.dsp"}{imports} = [];
|
||||
|
||||
my @wine_test_dsp_files = (
|
||||
"dlls/gdi/tests/gdi32_test.dsp",
|
||||
"dlls/kernel/tests/kernel32_test.dsp",
|
||||
"dlls/ntdll/tests/ntdll_test.dsp",
|
||||
"dlls/user/tests/user32_test.dsp",
|
||||
"programs/winetest/winetest.dsp",
|
||||
);
|
||||
|
||||
foreach my $dsp_file (@wine_test_dsp_files) {
|
||||
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 = ["wtmain.c"];
|
||||
$source_files = ["wtmain.c"];
|
||||
$c_srcs = [@files];
|
||||
$source_files = [@files];
|
||||
$header_files = [];
|
||||
$resource_files = [];
|
||||
} else {
|
||||
$type = "exe";
|
||||
$c_srcs = ["generated.c", "testlist.c"];
|
||||
$source_files = ["generated.c", "testlist.c"];
|
||||
$c_srcs = [@files];
|
||||
$source_files = [@files];
|
||||
$header_files = [];
|
||||
$resource_files = [];
|
||||
|
||||
@tests = map {
|
||||
if (/^testlist\.c$/) {
|
||||
();
|
||||
} else {
|
||||
s/\.c$//;
|
||||
$_;
|
||||
}
|
||||
} @files;
|
||||
}
|
||||
my $module = "$project.$type";
|
||||
|
||||
|
@ -381,6 +410,9 @@ foreach my $dsp_file (@wine_test_dsp_files) {
|
|||
$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))) {
|
||||
|
@ -406,6 +438,7 @@ sub _generate_dsp {
|
|||
|
||||
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");
|
||||
|
@ -413,16 +446,17 @@ sub _generate_dsp {
|
|||
|
||||
my $console = $exe; # FIXME: Not always correct
|
||||
|
||||
my $wine_include_dir = do {
|
||||
my $msvc_wine_dir = do {
|
||||
my @parts = split(m%/%, $dsp_file);
|
||||
if($#parts == 1) {
|
||||
"..\\include";
|
||||
"..";
|
||||
} elsif($#parts == 2) {
|
||||
"..\\..\\include";
|
||||
"..\\..";
|
||||
} else {
|
||||
"..\\..\\..\\include";
|
||||
"..\\..\\..";
|
||||
}
|
||||
};
|
||||
my $wine_include_dir = "$msvc_wine_dir\\include";
|
||||
|
||||
$progress_current++;
|
||||
$output->progress("$dsp_file (file $progress_current of $progress_max)");
|
||||
|
@ -441,25 +475,28 @@ sub _generate_dsp {
|
|||
@source_files = sort(@source_files);
|
||||
}
|
||||
|
||||
my $no_msvc_headers = 1;
|
||||
if ($project =~ /^(?:winetest)$/ || $project =~ /_test$/) {
|
||||
$no_msvc_headers = 0;
|
||||
}
|
||||
|
||||
my @cfgs;
|
||||
if($no_release && $no_msvc_headers) {
|
||||
push @cfgs, "$project - Win32";
|
||||
} elsif($no_release && !$no_msvc_headers) {
|
||||
push @cfgs, "$project - Win32 MS Headers";
|
||||
push @cfgs, "$project - Win32 MSVC Headers";
|
||||
push @cfgs, "$project - Win32 Wine Headers";
|
||||
} elsif(!$no_release && $no_msvc_headers) {
|
||||
push @cfgs, "$project - Win32 Release";
|
||||
push @cfgs, "$project - Win32 Debug";
|
||||
} else {
|
||||
push @cfgs, "$project - Win32 Release MS Headers";
|
||||
push @cfgs, "$project - Win32 Debug MS Headers";
|
||||
push @cfgs, "$project - Win32 Release MSVC Headers";
|
||||
push @cfgs, "$project - Win32 Debug MSVC Headers";
|
||||
push @cfgs, "$project - Win32 Release Wine Headers";
|
||||
push @cfgs, "$project - Win32 Debug Wine Headers";
|
||||
}
|
||||
my $default_cfg = $cfgs[$#cfgs];
|
||||
|
||||
my $msvc_include = "d:\\program files\\microsoft visual studio\\vc98\\include";
|
||||
|
||||
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";
|
||||
|
@ -523,7 +560,7 @@ sub _generate_dsp {
|
|||
}
|
||||
|
||||
my $debug = ($cfg !~ /Release/);
|
||||
my $msvc_headers = ($cfg =~ /MS Headers/);
|
||||
my $msvc_headers = ($cfg =~ /MSVC Headers/);
|
||||
|
||||
print OUT "# PROP BASE Use_MFC 0\r\n";
|
||||
|
||||
|
@ -534,8 +571,8 @@ sub _generate_dsp {
|
|||
}
|
||||
|
||||
$output_dir = $cfg;
|
||||
$output_dir =~ s/^$project -//;
|
||||
$output_dir =~ s/ //g;
|
||||
$output_dir =~ s/^$project - //;
|
||||
$output_dir =~ s/ /_/g;
|
||||
if($output_prefix_dir) {
|
||||
$output_dir = "$output_prefix_dir\\$output_dir";
|
||||
}
|
||||
|
@ -608,12 +645,9 @@ sub _generate_dsp {
|
|||
my @includes = ();
|
||||
if($wine) {
|
||||
push @defines2, "_\U${project}\E_";
|
||||
push @defines2, "__WINE__" if $module !~ /^winebuild\.exe$/;
|
||||
push @defines2, "__WINE__" if $project !~ /^(?:wine(?:build|test)|.*?_test)$/;
|
||||
push @defines2, qw(__i386__ _X86_);
|
||||
|
||||
if($msvc_headers) {
|
||||
push @includes, $msvc_include;
|
||||
}
|
||||
|
||||
if($project =~ /^gdi32_(?:enhmfdrv|mfdrv|win16drv)$/) {
|
||||
push @includes, "..";
|
||||
|
@ -627,12 +661,16 @@ sub _generate_dsp {
|
|||
push @includes, "..";
|
||||
}
|
||||
|
||||
if ($project =~ /_test$/) {
|
||||
push @includes, "$msvc_wine_dir\\programs\\winetest\\$output_dir";
|
||||
}
|
||||
|
||||
if (!$msvc_headers || $project =~ /^winetest$/) {
|
||||
push @includes, $wine_include_dir;
|
||||
}
|
||||
}
|
||||
|
||||
if($wine) {
|
||||
print OUT " /X" if $msvc_headers;
|
||||
|
||||
foreach my $include (@includes) {
|
||||
print OUT " /I \"$include\"";
|
||||
}
|
||||
|
@ -701,6 +739,9 @@ sub _generate_dsp {
|
|||
print OUT "# ADD LINK32";
|
||||
print OUT " /nologo";
|
||||
print OUT " libcmt.lib" if $project =~ /^ntdll$/; # FIXME: Kludge
|
||||
foreach my $import (@imports) {
|
||||
print OUT " $import.lib";
|
||||
}
|
||||
print OUT " /dll" if $dll;
|
||||
print OUT " /subsystem:console" if $console;
|
||||
print OUT " /debug" if $debug;
|
||||
|
@ -724,7 +765,7 @@ sub _generate_dsp {
|
|||
print OUT "\r\n";
|
||||
}
|
||||
|
||||
if($project eq "winebuild") {
|
||||
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";
|
||||
|
@ -732,6 +773,24 @@ sub _generate_dsp {
|
|||
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";
|
||||
} elsif ($project eq "winetest") {
|
||||
print OUT "# Begin Special Build Tool\r\n";
|
||||
print OUT "SOURCE=\"\$(InputPath)\"\r\n";
|
||||
|
||||
my @includes = qw(exception.h test.h unicode.h);
|
||||
print OUT "PostBuild_Desc=Copying ";
|
||||
foreach my $include (@includes) {
|
||||
print OUT "wine\\$include ";
|
||||
}
|
||||
print OUT "...\r\n";
|
||||
print OUT "PostBuild_Cmds=";
|
||||
print OUT "mkdir \$(OutDir)\\wine\t";
|
||||
foreach my $include (@includes) {
|
||||
print OUT "\t";
|
||||
print OUT "copy $msvc_wine_dir\\include\\wine\\$include \$(OutDir)\\wine";
|
||||
}
|
||||
print OUT "\r\n";
|
||||
print OUT "# End Special Build Tool\r\n";
|
||||
}
|
||||
print OUT "# Begin Target\r\n";
|
||||
print OUT "\r\n";
|
||||
|
@ -1000,18 +1059,19 @@ do {
|
|||
|
||||
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);
|
||||
replace_file("$wine_dir/$testlist_c", \&_generate_testlist_c, \@tests);
|
||||
}
|
||||
};
|
||||
|
||||
sub _generate_testlist_c {
|
||||
local *OUT = shift;
|
||||
|
||||
my @tests = qw(generated); # FIXME: Not alway correct
|
||||
my @tests = @{(shift)};
|
||||
|
||||
print OUT "/* Automatically generated file; DO NOT EDIT!! */\n";
|
||||
print OUT "\n";
|
||||
|
|
Loading…
Reference in New Issue