123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- #!/usr/bin/perl -w
- use File::Spec;
- my @wine_ver_req = (1, 1, 34);
- my @gcc_ver_req = (3, 0, 0);
- my @jwasm_ver_req = (2, '00', 0);
- my %cfg;
- # parse command line args
- foreach my $i (@ARGV) {
- if ($i =~ /^--with-dxsdk=/) {
- ($cfg{dxsdk_path}) = $i =~ /=(.*)/;
- } elsif ($i =~ /^--enable-debug$/) {
- $cfg{debug} = 1;
- }
- }
- # platform
- $cfg{platform} = detect_platform();
- # assembler setup
- unless (check_jwasm_version()) {
- print "JWasm " . join('.', @jwasm_ver_req) . " is required.\n";
- exit 1;
- }
- $cfg{jwasm_args} = "-q " . get_jwasm_bin_format($cfg{platform});
- # compiler setup
- unless (check_gcc_version()) {
- print "GCC " . join('.', @gcc_ver_req) . " is required.\n";
- exit 1;
- }
- if ($cfg{platform} =~ /^linux/) {
- # search for wine
- $cfg{wine_prefix} = detect_wine_prefix();
- unless (defined($cfg{wine_prefix})) {
- print "Wine-" . join('.', @wine_ver_req) . " or later is required.\n";
- exit 1;
- }
- } elsif ($cfg{platform} =~ /^win32$/) {
- # search for the DXSDK
- unless (defined($cfg{dxsdk_path})) {
- print "Please specify the DXSDK path with --with-dxsdk=C:/yoursdk\n";
- exit 1;
- }
- }
- # The following sets flags used during compiling.
- # The flags that are known to work:
- # AMPLUS
- # DISABLE_MULTI_PLAYER
- # ENABLE_INTRO_VIDEO
- # FRENCH
- # GERMAN
- # SPANISH
- #our @defines = qw(
- #AMPLUS
- #DISABLE_MULTI_PLAYER
- #);
- # write the build options
- write_config(\%cfg);
- print "\nReady to run build.pl\n\n";
- 1;
- # which($exe_name)
- # Perl version to avoid using the system command that does not always exist.
- sub which {
- my @path = File::Spec->path();
- foreach my $i (@path) {
- my $loc = "$i/$_[0]";
- (-x $loc) and return $loc;
- }
- return undef;
- }
- # version_check(\@version, \@requirement)
- sub version_check {
- my ($ver, $req) = @_;
- # check major number
- $ver->[0] >= $req->[0] or return 0;
- # if major equals
- if ($ver->[0] == $req->[0]) {
- # check medium number
- $ver->[1] >= $req->[1] or return 0;
- # if medium number equals
- if ($ver->[1] == $req->[1]) {
- # check minor number
- $ver->[2] >= $req->[2] or return 0;
- }
- }
- return 1;
- }
- sub get_jwasm_bin_format {
- $_[0] eq 'linux32' and return '-elf';
- $_[0] eq 'win32' and return '-coff';
- die "Don't know bin format for platform '$_[0]' to use with jwasm.\n";
- }
- sub detect_platform {
- # Detect the platform
- print "Platform: ";
- # if (command line override) {
- if ($^O eq 'linux') {
- if (`uname -m` eq 'x86_64') {
- # probably won't build 64-bit binary, but it needs to be detected and
- # handled
- print "linux64\n";
- return "linux64";
- } else {
- print "linux32\n";
- return "linux32";
- }
- } elsif ($^O eq 'MSWin32') {
- print "win32\n";
- return "win32";
- } else {
- print '$^O (unsupported)\n';
- die;
- }
- }
- sub detect_wine_prefix {
- # Check the wine version
- print "Detecting wine version: ";
- my $wine_version = `wine --version`;
- my @ver = $wine_version =~ /^wine-(\d+)\.(\d+)\.(\d+)/;
- unless (@ver == 3) {
- print "not found\n";
- return undef;
- }
- print join('.', @ver);
- if (version_check(\@ver, \@wine_ver_req)) {
- print " ok\n";
- } else {
- print " failed\n";
- return undef;
- }
- # Decide where the wine prefix is
- print "Searching for wine: ";
- my $wine_executable = which('wine');
- unless (defined($wine_executable)) {
- print "not found\n";
- return undef;
- }
- my ($wine_prefix) = $wine_executable =~ /(.*)\/bin/;
- unless (defined($wine_prefix)) {
- print "malformed path\n";
- return undef;
- }
- print "$wine_prefix\n";
- return $wine_prefix;
- }
- sub check_gcc_version {
- print "Detecting gcc version: ";
- my $gcc_version = `gcc --version`;
- my @ver = $gcc_version =~ /^gcc \(.*\) (\d+)\.(\d+)\.(\d+)/;
- unless (@ver == 3) {
- print "not found\n";
- return undef;
- }
- print join('.', @ver);
- if (version_check(\@ver, \@gcc_ver_req)) {
- print " ok\n";
- return 1;
- }
- print " failed\n";
- return 0;
- }
- sub check_jwasm_version {
- print "Detecting JWasm version: ";
- my $jwasm_version = `jwasm -?`;
- my @ver = $jwasm_version =~ /^JWasm v(\d+)\.(\d+)/;
- $ver[2] = 0;
- unless (@ver == 3) {
- print "not found\n";
- return undef;
- }
- print join('.', @ver);
- if (version_check(\@ver, \@jwasm_ver_req)) {
- print " ok\n";
- return 1;
- }
- print " failed\n";
- return 0;
- }
- sub write_config {
- open (my $file, ">opts.pl") or die "Failed to write opts.pl";
- foreach my $i (keys %{$_[0]}) {
- if ($_[0]->{$i} =~ /^\d+$/) {
- print $file "\$$i = $_[0]->{$i};\n";
- } else {
- print $file "\$$i = \"$_[0]->{$i}\";\n";
- }
- }
- print $file "1;\n";
- close ($file);
- }
|