From 9b35a913dd8d865721e66310498da41653f5af7e Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Wed, 11 Dec 2019 13:46:41 +0900 Subject: work on win64 support --- Master/install-tl | 17 ++++++-- Master/texmf-dist/scripts/texlive/tlmgr.pl | 47 ++++++++++++++------ .../texmf-dist/scripts/texlive/uninstall-win32.pl | 3 +- Master/tlpkg/TeXLive/TLConfig.pm | 5 ++- Master/tlpkg/TeXLive/TLPDB.pm | 6 +++ Master/tlpkg/TeXLive/TLPSRC.pm | 9 ++-- Master/tlpkg/TeXLive/TLUtils.pm | 50 ++++++++++++++++++++-- Master/tlpkg/TeXLive/TLWinGoo.pm | 1 + Master/tlpkg/bin/tl-compare-tlpdbs | 4 +- Master/tlpkg/bin/tl-update-4ht | 3 +- Master/tlpkg/bin/tl-update-bindir | 1 + Master/tlpkg/bin/tl-update-install-pkg | 5 ++- Master/tlpkg/bin/tl-update-nsis | 6 ++- Master/tlpkg/bin/tl-update-tlcritical | 2 +- Master/tlpkg/installer/install-menu-perltk.pl | 2 +- Master/tlpkg/installer/install-menu-text.pl | 4 +- Master/tlpkg/installer/tl-cmd.bat | 1 + Master/tlpkg/installer/tl-tray-menu.ini | 2 +- Master/tlpkg/libexec/ctan2tds | 10 ++++- 19 files changed, 138 insertions(+), 40 deletions(-) diff --git a/Master/install-tl b/Master/install-tl index 875589cc949..b0cd3dddf1b 100755 --- a/Master/install-tl +++ b/Master/install-tl @@ -1358,7 +1358,8 @@ sub do_path_adjustments { my $ret = 0; info ("running path adjustment actions\n"); if (win32()) { - TeXLive::TLUtils::w32_add_to_path($vars{'TEXDIR'}.'/bin/win32', + my $subpath = win32() ? "win32" : "win64"; + TeXLive::TLUtils::w32_add_to_path($vars{'TEXDIR'} . $subpath, $vars{'tlpdbopt_w32_multi_user'}); broadcast_env(); } else { @@ -1701,6 +1702,11 @@ sub calc_depends { $install{"tlgs.win32"} = 1; $install{"tlpsv.win32"} = 1; } + if (grep(/^win64$/,@archs)) { + $install{"tlperl.win64"} = 1; + $install{"tlgs.win64"} = 1; + $install{"tlpsv.win64"} = 1; + } # loop over all the packages until it is getting stable my $changed = 1; @@ -1727,12 +1733,15 @@ sub calc_depends { foreach $a (@archs) { $install{"$foo.$a"} = 1 if defined($tlpdb->get_package("$foo.$a")); } - } elsif ($p_dep =~ m/^(.*)\.win32$/) { + } elsif ($p_dep =~ m/^(.*)\.win(32|64)$/) { # a win32 package should *only* be installed if we are installing # the win32 arch if (grep(/^win32$/,@archs)) { $install{$p_dep} = 1; } + if (grep(/^win64$/,@archs)) { + $install{$p_dep} = 1; + } } else { $install{$p_dep} = 1; } @@ -1889,7 +1898,7 @@ sub initialize_collections { ++$vars{'n_collections_selected'}; } } - if ($vars{"binary_win32"}) { + if ($vars{"binary_win32"} || $vars{"binary_win64"}) { $vars{"collection-wintools"} = 1; ++$vars{'n_collections_selected'}; } @@ -2446,7 +2455,7 @@ sub select_scheme { # set to 1 only those which are required by the scheme # since now scheme asks for collection-wintools we set its vars value # to 1 in case we are installing win32 binaries - if ($vars{"binary_win32"}) { + if ($vars{"binary_win32"} || $vars{"binary_win64"}) { $vars{"collection-wintools"} = 1; ++$vars{'n_collections_selected'}; } diff --git a/Master/texmf-dist/scripts/texlive/tlmgr.pl b/Master/texmf-dist/scripts/texlive/tlmgr.pl index 20cf640a562..d8edaaf756c 100755 --- a/Master/texmf-dist/scripts/texlive/tlmgr.pl +++ b/Master/texmf-dist/scripts/texlive/tlmgr.pl @@ -54,7 +54,11 @@ BEGIN { $Master =~ s!\\!/!g; $Master =~ s![^/]*$!../../..! unless ($Master =~ s!/texmf-dist/scripts/texlive/tlmgr\.pl$!!i); - $bindir = "$Master/bin/win32"; + if (win32_32()) { + $bindir = "$Master/bin/win32"; + } else { + $bindir = "$Master/bin/win64"; + } $kpsewhichname = "kpsewhich.exe"; # path already set by wrapper batchfile } else { @@ -105,7 +109,7 @@ use TeXLive::TLWinGoo; use TeXLive::TLDownload; use TeXLive::TLConfFile; use TeXLive::TLCrypto; -TeXLive::TLUtils->import(qw(member info give_ctan_mirror win32 dirname +TeXLive::TLUtils->import(qw(member info give_ctan_mirror win32 win32_32 dirname mkdirhier copy debug tlcmp repository_to_array)); use TeXLive::TLPaper; @@ -820,7 +824,8 @@ sub do_cmd_and_check { if ($opts{"dry-run"}) { $ret = $F_OK; $out = ""; - } elsif (win32() && (! -r "$Master/bin/win32/luatex.dll")) { + } elsif ((win32_32() && (! -r "$Master/bin/win32/luatex.dll")) || + (win32_64() && (! -r "$Master/bin/win64/luatex.dll"))) { # deal with the case where only scheme-infrastructure is installed # on Windows, thus no luatex.dll is available and the wrapper cannot be started tlwarn("Cannot run wrapper due to missing luatex.dll\n"); @@ -1492,7 +1497,7 @@ sub action_path { if ($what =~ m/^add$/i) { if (win32()) { $ret |= TeXLive::TLUtils::w32_add_to_path( - $localtlpdb->root . "/bin/win32", + $localtlpdb->root . win32_32() ? "/bin/win32" : "/bin/win64", $winadminmode); $ret |= TeXLive::TLWinGoo::broadcast_env(); } else { @@ -1505,7 +1510,7 @@ sub action_path { } elsif ($what =~ m/^remove$/i) { if (win32()) { $ret |= TeXLive::TLUtils::w32_remove_from_path( - $localtlpdb->root . "/bin/win32", + $localtlpdb->root . win32_32() ? "/bin/win32" : "/bin/win64", $winadminmode); $ret |= TeXLive::TLWinGoo::broadcast_env(); } else { @@ -4831,6 +4836,9 @@ sub action_platform { my @extra_w32_packs = qw/tlperl.win32 tlgs.win32 tlpsv.win32 collection-wintools dviout.win32 wintools.win32/; + my @extra_w64_packs = qw/tlperl.win64 tlgs.win64 tlpsv.win64 + collection-wintools + dviout.win64 wintools.win64/; if ($^O =~ /^MSWin/i) { warn("action `platform' not supported on Windows\n"); # return an error here so that we don't go into post-actions @@ -4902,14 +4910,19 @@ sub action_platform { } } } + my @extrapacks; if (TeXLive::TLUtils::member('win32', @todoarchs)) { - # install the necessary w32 stuff - for my $p (@extra_w32_packs) { - info("install: $p\n"); - if (!$opts{'dry-run'}) { - if (! $remotetlpdb->install_package($p, $localtlpdb)) { - $ret |= $F_ERROR; - } + push @extrapacks, @extra_w32_packs; + } + if (TeXLive::TLUtils::member('win64', @todoarchs)) { + push @extrapacks, @extra_w64_packs; + } + # install the necessary w32 stuff + for my $p (@extrapacks) { + info("install: $p\n"); + if (!$opts{'dry-run'}) { + if (! $remotetlpdb->install_package($p, $localtlpdb)) { + $ret |= $F_ERROR; } } } @@ -4966,6 +4979,12 @@ sub action_platform { $localtlpdb->remove_package($p) if (!$opts{"dry-run"}); } } + if (TeXLive::TLUtils::member('win64', @todoarchs)) { + for my $p (@extra_w64_packs) { + info("remove: $p\n"); + $localtlpdb->remove_package($p) if (!$opts{"dry-run"}); + } + } if (!$opts{"dry-run"}) { # try to remove bin/$a dirs for my $a (@todoarchs) { @@ -5347,7 +5366,7 @@ sub init_tltree { # if we are on W32, die (no find). my $arch = $localtlpdb->platform(); - if ($arch eq "win32") { + if (($arch eq "win32") || ($arch eq "win64")) { tldie("$prg: sorry, cannot check this on Windows.\n"); } @@ -5877,7 +5896,7 @@ sub check_depends { # For each package, check that it is a dependency of some collection. if (! exists $coll_deps{$pkg}) { # Except that schemes and our ugly Windows packages are ok. - push (@no_dep, $pkg) unless $pkg =~/^scheme-|\.win32$/; + push (@no_dep, $pkg) unless $pkg =~/^scheme-|\.win(32|64)$/; } # For each dependency, check that we have a package. diff --git a/Master/texmf-dist/scripts/texlive/uninstall-win32.pl b/Master/texmf-dist/scripts/texlive/uninstall-win32.pl index d82bd38184f..4c6e8c6c7a5 100755 --- a/Master/texmf-dist/scripts/texlive/uninstall-win32.pl +++ b/Master/texmf-dist/scripts/texlive/uninstall-win32.pl @@ -55,7 +55,8 @@ sub doit { `rmdir /s /q "$menupath\\$TeXLive::TLConfig::WindowsMainMenuName" 2>nul`; # remove bindir from PATH settings - TeXLive::TLUtils::w32_remove_from_path("$Master/bin/win32", + TeXLive::TLUtils::w32_remove_from_path( + TeXLive::TLUtils::win32_32 ? "$Master/bin/win32" : "$Master/bin/win64", $localtlpdb->option("w32_multi_user")); # unsetenv_reg("TEXBINDIR"); diff --git a/Master/tlpkg/TeXLive/TLConfig.pm b/Master/tlpkg/TeXLive/TLConfig.pm index b2ec57215c7..47fdc82cd48 100644 --- a/Master/tlpkg/TeXLive/TLConfig.pm +++ b/Master/tlpkg/TeXLive/TLConfig.pm @@ -116,7 +116,8 @@ our @CriticalPackagesList = qw/texlive.infra/; our $CriticalPackagesRegexp = '^(texlive\.infra)'; if ($^O =~ /^MSWin/i) { push (@CriticalPackagesList, "tlperl.win32"); - $CriticalPackagesRegexp = '^(texlive\.infra|tlperl\.win32$)'; + push (@CriticalPackagesList, "tlperl.win64"); + $CriticalPackagesRegexp = '^(texlive\.infra|tlperl\.win(32|64)$)'; } # @@ -351,7 +352,7 @@ C. =item C<@TeXLive::TLConfig::CriticalPackagesRegexp> A list of all those packages which we do not update regularly since they -are too central, currently texlive.infra and (for Windows) tlperl.win32. +are too central, currently texlive.infra and (for Windows) tlperl.win(32|64). =item C<$TeXLive::TLConfig::RelocTree> diff --git a/Master/tlpkg/TeXLive/TLPDB.pm b/Master/tlpkg/TeXLive/TLPDB.pm index d5c0f6cb463..9880e6d370e 100644 --- a/Master/tlpkg/TeXLive/TLPDB.pm +++ b/Master/tlpkg/TeXLive/TLPDB.pm @@ -877,6 +877,12 @@ sub expand_dependencies { if (grep(/^win32$/,@archs)) { $install{$p_dep} = 0; } + } elsif ($p_dep =~ m/^(.*)\.win64$/) { + # a win32 package should *only* be installed if we are installing + # the win64 arch + if (grep(/^win64$/,@archs)) { + $install{$p_dep} = 0; + } } else { $install{$p_dep} = 0 unless $only_arch; } diff --git a/Master/tlpkg/TeXLive/TLPSRC.pm b/Master/tlpkg/TeXLive/TLPSRC.pm index d25f4803135..929f1799f9b 100644 --- a/Master/tlpkg/TeXLive/TLPSRC.pm +++ b/Master/tlpkg/TeXLive/TLPSRC.pm @@ -160,7 +160,7 @@ sub from_file { # - normal texlive specific packages: ^texlive.*\..*$ # - configuration texlive specific packages: ^00texlive.*\..*$ if ($line =~ /^name\s/) { - $line =~ /^name\s+([-\w]+(\.win32)?|(00)?texlive\..*)$/; + $line =~ /^name\s+([-\w]+(\.win(32|64))?|(00)?texlive\..*)$/; $foundnametag && die "$srcfile:$lineno: second name directive not allowed: $line" . "(have $name)\n"; @@ -488,13 +488,16 @@ sub make_tlpobj { if ($finalp =~ m! bin/win32/!) { @todoarchs = qw/win32/; } + if ($finalp =~ m! bin/win64/!) { + @todoarchs = qw/win64/; + } # now @todoarchs contains only those archs for which we want # to match the pattern foreach my $arch (@todoarchs) { # get only those files matching the pattern my @archfiles = $tltree->get_matching_files('bin',$finalp, $pkgname, $arch); if (!@archfiles) { - if (($arch ne "win32") || defined($::tlpsrc_pattern_warn_win)) { + if ((($arch ne "win32") && ($arch ne "win64")) || defined($::tlpsrc_pattern_warn_win)) { tlwarn("$self->{name} ($arch): no hit on binpattern $finalp\n"); } } @@ -531,7 +534,7 @@ sub make_tlpobj { # get only those files matching the pattern my @archfiles = $tltree->get_matching_files('bin', $finalp, $pkgname, $arch); if (!@archfiles) { - if (($arch ne "win32") || defined($::tlpsrc_pattern_warn_win)) { + if ((($arch ne "win32") && ($arch ne "win64")) || defined($::tlpsrc_pattern_warn_win)) { tlwarn("$self->{name} ($arch): no hit on negative binpattern $finalp\n") unless $::tlpsrc_pattern_no_warn_negative; # see comments in libexec/place script. diff --git a/Master/tlpkg/TeXLive/TLUtils.pm b/Master/tlpkg/TeXLive/TLUtils.pm index ab1f6c99ddc..755500182f8 100644 --- a/Master/tlpkg/TeXLive/TLUtils.pm +++ b/Master/tlpkg/TeXLive/TLUtils.pm @@ -25,6 +25,8 @@ C - utilities used in TeX Live infrastructure TeXLive::TLUtils::platform(); TeXLive::TLUtils::platform_name($canonical_host); TeXLive::TLUtils::platform_desc($platform); + TeXLive::TLUtils::win32_32(); + TeXLive::TLUtils::win32_64(); TeXLive::TLUtils::win32(); TeXLive::TLUtils::unix(); @@ -219,7 +221,7 @@ BEGIN { @EXPORT = qw(setup_programs download_file process_logging_options tldie tlwarn info log debug ddebug dddebug debug debug_hash_str debug_hash - win32 xchdir xsystem run_cmd system_pipe sort_archs); + win32 win32_32 win32_64 xchdir xsystem run_cmd system_pipe sort_archs); } use Cwd; @@ -253,6 +255,7 @@ sub platform { unless (defined $::_platform_) { if ($^O =~ /^MSWin/i) { $::_platform_ = "win32"; + # TODO make sure we check how to detect win64!!! } else { my $config_guess = "$::installerdir/tlpkg/installer/config.guess"; @@ -425,7 +428,8 @@ sub platform_desc { 'sparc-linux' => 'GNU/Linux on Sparc', 'sparc-solaris' => 'Solaris on Sparc', 'universal-darwin' => 'MacOSX universal binaries', - 'win32' => 'Windows', + 'win32' => 'Windows 32bit', + 'win64' => 'Windows 64bit', 'x86_64-cygwin' => 'Cygwin on x86_64', 'x86_64-darwin' => 'MacOSX current (10.13-) on x86_64', 'x86_64-darwinlegacy' => 'MacOSX legacy (10.6-) on x86_64', @@ -448,9 +452,44 @@ sub platform_desc { } +=item C + +Return C<1> if platform is Windows32 and C<0> otherwise. The test is +currently based on the value of Perl's C<$^O> variable. + +=cut + +sub win32_32 { + if ($^O =~ /^MSWin/i) { + # TODO check 32bit + return 1; + } else { + return 0; + } + # the following needs config.guess, which is quite bad ... + # return (&platform eq "win32")? 1:0; +} +=item C + +Return C<1> if platform is Windows64 and C<0> otherwise. The test is +currently based on the value of Perl's C<$^O> variable. + +=cut + +sub win32_64 { + if ($^O =~ /^MSWin/i) { + # TODO check 64bit + return 1; + } else { + return 0; + } + # the following needs config.guess, which is quite bad ... + # return (&platform eq "win32")? 1:0; +} + =item C -Return C<1> if platform is Windows and C<0> otherwise. The test is +Return C<1> if platform is Windows32 or 64 and C<0> otherwise. The test is currently based on the value of Perl's C<$^O> variable. =cut @@ -466,6 +505,9 @@ sub win32 { } + + + =item C Return C<1> if platform is UNIX and C<0> otherwise. @@ -473,7 +515,7 @@ Return C<1> if platform is UNIX and C<0> otherwise. =cut sub unix { - return (&platform eq "win32")? 0:1; + return (&platform eq "win32" || &platform eq "win64" )? 0:1; } diff --git a/Master/tlpkg/TeXLive/TLWinGoo.pm b/Master/tlpkg/TeXLive/TLWinGoo.pm index 030cec04965..0e1c8d4b31b 100644 --- a/Master/tlpkg/TeXLive/TLWinGoo.pm +++ b/Master/tlpkg/TeXLive/TLWinGoo.pm @@ -1199,6 +1199,7 @@ sub create_uninstaller { my $td = $td_fw; $td =~ s!/!\\!g; + # TODO win64 support!!! my $tdmain = `"$td\\bin\\win32\\kpsewhich" -var-value=TEXMFMAIN`; $tdmain =~ s!/!\\!g; chomp $tdmain; diff --git a/Master/tlpkg/bin/tl-compare-tlpdbs b/Master/tlpkg/bin/tl-compare-tlpdbs index 4632280e9fb..5b1b99ea9f2 100755 --- a/Master/tlpkg/bin/tl-compare-tlpdbs +++ b/Master/tlpkg/bin/tl-compare-tlpdbs @@ -20,7 +20,7 @@ use Pod::Usage; # packages ignored unless --all is given # see @critical_pkg_list in tl-update-containers -my @add_ignored_packs = qw/texlive.infra tlperl.win32/; +my @add_ignored_packs = qw/texlive.infra tlperl.win32 tlperl.win64/; our ($mydir, $vc_id); my $opt_version = 0; @@ -116,7 +116,7 @@ tl-compare-tlpdbs [I