From 10e7f2d6a8baa35122cd1977d7eeb28baacdb39b Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Fri, 6 May 2022 10:02:13 +0900 Subject: install-tl: support setting vars on cmd line, no-interactive install --- Master/install-tl | 106 +++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 81 insertions(+), 25 deletions(-) diff --git a/Master/install-tl b/Master/install-tl index 862858c75fa..f4c2106caba 100755 --- a/Master/install-tl +++ b/Master/install-tl @@ -296,6 +296,11 @@ my $opt_version = 0; my $opt_warn_checksums = 1; my $opt_font; my $opt_continue = 1; +# no-interactive installation +my $opt_interactive = 1; +my $opt_paper = ""; +my $opt_texdir = ""; +my %pathopts; # unusual cases: $::opt_select_repository = 0; our $opt_in_place = 0; @@ -383,13 +388,22 @@ GetOptions( "location|url|repository|repos|repo=s" => \$opt_location, "no-cls", # $::opt_no_cls in install-menu-text-pl "no-gui" => \$opt_no_gui, + "interactive!", => \$opt_interactive, "non-admin" => \$opt_nonadmin, + "paper=s" => \$opt_paper, "persistent-downloads!" => \$opt_persistent_downloads, "portable" => \$opt_portable, "print-platform|print-arch" => \$opt_print_arch, "profile=s" => \$opt_profile, "scheme=s" => \$opt_scheme, "select-repository" => \$::opt_select_repository, + "texdir=s" => \$opt_texdir, + "texmflocal=s" => \$pathopts{'texmflocal'}, + "texmfhome=s" => \$pathopts{'texmfhome'}, + "texmfvar=s" => \$pathopts{'texmfvar'}, + "texmfconfig=s" => \$pathopts{'texmfconfig'}, + "texmfsysvar=s" => \$pathopts{'texmfsysvar'}, + "texmfsysconfig=s" => \$pathopts{'texmfsysconfig'}, "font=s" => \$opt_font, "tcl", # handled by wrapper "verify-downloads!" => \$opt_verify_downloads, @@ -610,7 +624,7 @@ if (!setup_programs ("$::installerdir/tlpkg/installer", "$::_platform_")) { } -if ($opt_profile eq "") { +if ($opt_profile eq "" && $opt_interactive) { if ($opt_init_from_profile) { read_profile("$opt_init_from_profile", seed => 1); } @@ -687,7 +701,7 @@ if ($opt_profile eq "") { if (!do_remote_init()) { die ("Exiting installation.\n"); } - read_profile($opt_profile); + read_profile($opt_profile) if ($opt_profile ne ""); } my $varsdump = ""; @@ -1219,14 +1233,26 @@ operations might be disturbed.\n\n"; # now work through the options if specified at all my $env_paper = $ENV{"TEXLIVE_INSTALL_PAPER"}; - if (defined $env_paper && $env_paper eq "letter") { - $vars{'instopt_letter'} = 1; - } elsif (defined $env_paper && $env_paper eq "a4") { - ; # do nothing - } elsif ($env_paper) { - tlwarn("$0: TEXLIVE_INSTALL_PAPER value must be letter or a4, not: " - . "$env_paper (ignoring)\n"); + if (defined $env_paper) { + if ($env_paper eq "letter") { + $vars{'instopt_letter'} = 1; + } elsif ($env_paper eq "a4") { + ; # do nothing + } else { + tlwarn("$0: TEXLIVE_INSTALL_PAPER value must be letter or a4, not: " + . "$env_paper (ignoring)\n"); + } + } elsif ($opt_paper) { + if ($opt_paper eq "letter") { + $vars{'instopt_letter'} = 1; + } elsif ($opt_paper eq "a4") { + ; # do nothing + } else { + tlwarn("$0: cmd line option --paper value must be letter or a4, not: " + . "$opt_paper (ignoring)\n"); + } } + # letter instead of a4 if ($vars{'instopt_letter'}) { # set paper size, but do not execute any post actions, which in this @@ -1593,24 +1619,32 @@ sub set_var_from_alternatives { } sub set_standard_var { - my ($what, $envstr, $default) = @_; + my ($what, $envstr, $cmdlinestr, $default) = @_; # warn if a value was set from both the profile and # via env var my $envvar = getenv($envstr); - if ($vars{$what} && $envvar && $vars{$what} ne $envvar) { + my $cmdlinevar = $pathopts{$cmdlinestr}; + my %nrdefs; + $nrdefs{$vars{$what}} = 1 if ($vars{$what}); + $nrdefs{$envvar} = 1 if ($envvar); + $nrdefs{$cmdlinevar} = 1 if ($cmdlinevar); + if (scalar keys %nrdefs > 1) { + # multiple conflicting definitions, fail! tlwarn("Trying to define $what via conflicting settings:\n"); - tlwarn(" from envvar $envvar = $envvar($envstr)\n"); - tlwarn(" from profile = $vars{$what}\n"); - tlwarn(" Preferring the profile value!\n"); - $envvar = undef; + tlwarn(" from envvar $envstr = $envvar\n") if ($envvar); + tlwarn(" from command line argument $cmdlinestr = $cmdlinevar\n") if ($cmdlinevar); + tlwarn(" from profile = $vars{$what}\n") if ($vars{$what}); + tlwarn(" Preferring the last value from above!\n"); + # actual preference order is given via the below call } # default for most variables is in increasing priority # - some default # - setting from profile saved already in $vars{$what} # - environment variable set_var_from_alternatives( \$vars{$what}, - $envvar, $vars{$what}, + $cmdlinevar, + $envvar, $default); } @@ -1618,14 +1652,35 @@ sub set_texlive_default_dirs { my $homedir = (platform() =~ m/darwin/) ? "~/Library" : "~"; my $yyyy = $TeXLive::TLConfig::ReleaseYear; # + # Sources of target directory settings + # - env variable TEXLIVE_INSTALL_PREFIX + # will be used with YYYY (in portable case without) + # - --texdir cmd line option + # will be used as is, similar to profile setting + # - profile setting + # + # first compare whether profile setting and cmd line agree if both given + if ($opt_texdir && $vars{'TEXDIR'}) { + # TODO should we really prefer profile over command line? + if ($opt_texdir ne $vars{'TEXDIR'}) { + tlwarn("Conflicting settings for installation path given:\n"); + tlwarn(" from command line option --texdir = $opt_texdir\n"); + tlwarn(" from profile TEXDIR = $vars{'TEXDIR'}\n"); + tlwarn(" Preferring the profile value!\n"); + # actual setting of preference is done below in the + # set_var_from_alternatives( \$vars{'TEXDIR'}, + # call, where the order determines the preference! + } + } my $tlprefixenv = getenv('TEXLIVE_INSTALL_PREFIX'); - if ($tlprefixenv && $vars{'TEXDIR'}) { + if ($tlprefixenv && ($opt_texdir || $vars{'TEXDIR'})) { # NOTE we cannot compare these two values because the one might # contain the YYYY part (TEXDIR) while the other is the one without. tlwarn("Trying to set up basic path using two incompatible methods:\n"); tlwarn(" from envvar TEXLIVE_INSTALL_PREFIX = $tlprefixenv\n"); - tlwarn(" from profile TEXDIR = $vars{'TEXDIR'}\n"); - tlwarn(" Preferring the profile value!\n"); + tlwarn(" from command line option --texdir = $opt_texdir\n") if ($opt_texdir); + tlwarn(" from profile TEXDIR = $vars{'TEXDIR'}\n") if ($vars{'TEXDIR'}); + tlwarn(" Preferring the later value!\n"); $tlprefixenv = undef; } # first set $tex_prefix @@ -1636,21 +1691,22 @@ sub set_texlive_default_dirs { (win32() ? getenv('SystemDrive') . '/texlive' : '/usr/local/texlive')); set_var_from_alternatives( \$vars{'TEXDIR'}, $vars{'TEXDIR'}, + $opt_texdir, ($vars{'instopt_portable'} || $opt_in_place) ? $tex_prefix : "$tex_prefix/$texlive_release"); - set_standard_var('TEXMFSYSVAR', 'TEXLIVE_INSTALL_TEXMFSYSVAR', + set_standard_var('TEXMFSYSVAR', 'TEXLIVE_INSTALL_TEXMFSYSVAR', 'texmfsysvar', $vars{'TEXDIR'} . '/texmf-var'); - set_standard_var('TEXMFSYSCONFIG', 'TEXLIVE_INSTALL_TEXMFSYSCONFIG', + set_standard_var('TEXMFSYSCONFIG', 'TEXLIVE_INSTALL_TEXMFSYSCONFIG', 'texmfsysconfig', $vars{'TEXDIR'} . '/texmf-config'); - set_standard_var('TEXMFLOCAL', 'TEXLIVE_INSTALL_TEXMFLOCAL', + set_standard_var('TEXMFLOCAL', 'TEXLIVE_INSTALL_TEXMFLOCAL', 'texmflocal', "$tex_prefix/texmf-local"); - set_standard_var('TEXMFHOME', 'TEXLIVE_INSTALL_TEXMFHOME', + set_standard_var('TEXMFHOME', 'TEXLIVE_INSTALL_TEXMFHOME', 'texmfhome', "$homedir/texmf"); - set_standard_var('TEXMFVAR', 'TEXLIVE_INSTALL_TEXMFVAR', + set_standard_var('TEXMFVAR', 'TEXLIVE_INSTALL_TEXMFVAR', 'texmfvar', (platform() =~ m/darwin/) ? "$homedir/texlive/$yyyy/texmf-var" : "$homedir/.texlive$yyyy/texmf-var"); - set_standard_var('TEXMFCONFIG', 'TEXLIVE_INSTALL_TEXMFCONFIG', + set_standard_var('TEXMFCONFIG', 'TEXLIVE_INSTALL_TEXMFCONFIG', 'texmfconfig', (platform() =~ m/darwin/) ? "$homedir/texlive/$yyyy/texmf-config" : "$homedir/.texlive$yyyy/texmf-config"); -- cgit v1.2.3