summaryrefslogtreecommitdiff
path: root/Master
diff options
context:
space:
mode:
authorReinhard Kotucha <reinhard.kotucha@web.de>2007-10-07 21:10:48 +0000
committerReinhard Kotucha <reinhard.kotucha@web.de>2007-10-07 21:10:48 +0000
commit405dcbdf3bacec10202779d05bd5db22db168c13 (patch)
treebb366b2d6114be1dc0e23de7c4df4dfe79bf9cf3 /Master
parente130a3332005f460860734efe166df78eb5d25c6 (diff)
TLUtils.pm: bugfixes.
install-tl.pl: new, but far from being ready. git-svn-id: svn://tug.org/texlive/trunk@5133 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master')
-rwxr-xr-xMaster/install-tl.pl637
-rw-r--r--Master/tlpkg/TeXLive/TLUtils.pm11
2 files changed, 644 insertions, 4 deletions
diff --git a/Master/install-tl.pl b/Master/install-tl.pl
new file mode 100755
index 00000000000..8ad5909c9ef
--- /dev/null
+++ b/Master/install-tl.pl
@@ -0,0 +1,637 @@
+#!/usr/bin/env perl
+
+# $Id: $
+# install-tl.pl
+#
+# Copyright 2007 Reinhard Kotucha
+# This file is licensed under the GNU General Public License version 2
+# or any later version.
+
+$texlive_release="2007";
+
+BEGIN {
+ $^W = 1;
+ ($thisdir=$0)=~s/(.*)\/.*/$1/;
+ unshift (@INC, "$thisdir/tlpkg");
+}
+
+use TeXLive::TLUtils qw(initialize_installer media platform platform_desc
+ which getenv win32 unix program_exists binaries_available_from_disk
+ binaries_available_from_net get_system_tmpdir);
+use TeXLive::TLPOBJ;
+use TeXLive::TLPDB;
+
+###$texlive_url="http://localhost/texlive/Contents/inst";
+$texlive_url="http://tug.org/svn/texlive/trunk/Master";
+
+# The maximum number of binary systems on the CD. This number must be
+# smaller than the number of binaries available from the network.
+$max_bins_on_CD=7;
+
+#$_platform_='win32';
+
+initialize_installer;
+
+my $system_tmpdir=get_system_tmpdir;
+
+print "Platform: ", platform, " => \'", platform_desc(platform), "\'\n";
+print "Media: ", media, "\n";
+print "Directory for Temporary Files: '", get_system_tmpdir, "\'\n";
+
+# The global variable %vars is an associative list which contains all
+# variables and their values which can be changed by the user.
+
+my %vars;
+
+sub dump_vars {
+ open VARS, ">./vars";
+ foreach $key (keys %vars) {
+ print VARS "$key $vars{$key}\n";
+ }
+ close VARS;
+ print "\n%vars dumped to ./vars.\n";
+}
+
+
+# Determine which platforms are supported. This code should be
+# revised later.
+$trynet=0;
+sub set_platforms_supported {
+ $vars{'n_systems_available'}=0;
+ if (media=~/(CD|DVD)/) {
+ my @binaries=binaries_available_from_disk;
+ for my $binary (@binaries) {
+ unless (defined $vars{"diskbin_$binary"}) {
+ $vars{"diskbin_$binary"}=0;
+ ++$vars{'n_systems_available'};
+ }
+ }
+ }
+ if (media eq 'NET' or $trynet==1) {
+ print "\n\nLoading '$texlive_url/texlive.tlpdb' ...\n";
+ my @binaries=binaries_available_from_net;
+ for my $binary (@binaries) {
+ unless (defined $vars{"diskbin_$binary"}) {
+ $vars{"netbin_$binary"}=0;
+ ++$vars{'n_systems_available'};
+ }
+ }
+ }
+}
+
+# Environment variables and default values on UNIX:
+# TEXLIVE_INSTALL_PREFIX /usr/local/texlive => $tex_prefix
+# TEXLIVE_INSTALL_TEXDIR $tex_prefix/2007 => $TEXDIR
+# TEXLIVE_INSTALL_TEXMFSYSVAR $TEXDIR/texmf-var
+# TEXLIVE_INSTALL_TEXMFLOCAL $tex_prefix/texmf-local
+# TEXLIVE_INSTALL_TEXMFHOME '$HOME/texmf'
+
+sub set_texlive_default_dirs {
+ my $tex_prefix;
+ my $texmfsysvar;
+ my $texmflocal;
+ my $texmfhome;
+
+ $tex_prefix=getenv('TEXLIVE_INSTALL_PREFIX');
+ if (win32) {
+ if (-w getenv('CommonProgramFiles')) {
+ $tex_prefix||=getenv('CommonProgramFiles') . '/texlive';
+ } else {
+ $tex_prefix||=getenv('ProgramFiles') . '/texlive';
+ }
+ } else {
+ $tex_prefix||='/usr/local/texlive';
+ }
+ $vars{'TEXDIR'}="$tex_prefix/$texlive_release";
+
+ $texmfsysvar=getenv('TEXLIVE_INSTALL_TEXMFSYSVAR');
+ $texmfsysvar||=$vars{'TEXDIR'} . '/texmf-var';
+ $vars{'TEXMFSYSVAR'}="$texmfsysvar";
+
+ $texmflocal=getenv('TEXLIVE_INSTALL_TEXMFLOCAL');
+ $texmflocal||="$tex_prefix/texmf-local";
+ $vars{'TEXMFLOCAL'}="$texmflocal";
+
+ $texmfhome=getenv('TEXLIVE_INSTALL_TEXMFHOME');
+ if (win32) {
+ $texmfhome||=getenv('USERPROFILE');
+ } else {
+ $texmfhome||=getenv('HOME');
+ }
+ $vars{'TEXMFHOME'}="$texmfhome/texmf";
+}
+
+
+%vars=( # 'n_' means 'number of'.
+ 'this_platform' => platform,
+ 'n_systems_available' => 0,
+ 'n_systems_selected' => 0,
+ 'n_collections_selected' => 0,
+ 'n_collections_available' => 0,
+ 'total_size' => 0,
+ 'o_altfontdir' => 0,
+ 'altfontdir' => "$system_tmpdir/texfonts",
+ 'o_symlinks' => 0,
+ 'sys_bin' => '/usr/local/bin',
+ 'sys_man' => '/usr/local/man',
+ 'sys_info' => '/usr/local/info',
+ 'o_doc' => 1,
+ 'o_src' => 1,
+ 'selected_scheme' => 'scheme-full',
+ );
+
+
+sub clear_screen {
+# return 0;
+ (unix)? system 'clear':system 'cls';
+}
+
+sub string_to_list {
+ my $string=shift;
+ return split(//, $string);
+}
+
+sub button {
+ my $val=shift;
+ return ($val)? '[X]':'[ ]';
+}
+
+sub hbar {
+ return '=' x79, "\n";
+}
+
+sub toggle {
+ my $var=shift;
+ my $val=$vars{$var};
+ ++$val;
+ $vars{$var}=$val%2;;
+}
+
+sub menu_head {
+ my $text=shift;
+ clear_screen;
+ print "$text\n", hbar, "\n";
+}
+
+sub other_options {
+ print "\nOther options:\n", hbar, " <R> return to main menu\n <Q> quit\n\n";
+}
+
+sub prompt {
+ my $prompt=shift;
+ print "\n$prompt: ";
+ chomp(my $answer=<STDIN>);
+ return "$answer";
+}
+
+sub load_tlpdb {
+ my $database;
+ if (media eq 'NET') {
+ $database='http://www.tug.org/svn/texlive/trunk/Master/texlive.tlpdb';
+ } else {
+ $database='./texlive.tlpdb';
+ }
+ print "Loading $database ...\n";
+ $::tlpdb=TeXLive::TLPDB->new(location => "$database");
+}
+
+
+# If we are on the CD and we want to download binaries for additional
+# platforms, we need a second database which provides information
+# about binary systems which can be downloaded from net but are not on
+# the DVD, at least if we decide to support this.
+#sub load_tlpdb_net {
+# my $database;
+# $database='http://www.tug.org/svn/texlive/trunk/Master/texlive.tlpdb';
+# $::tlpdb_net=TeXLive::TLPDB->new(location => "$database");
+#}
+
+
+# The menu loop. A menu is a function. Its return value is a
+# reference to another menu or to itself.
+sub run_menu {
+ my $menu=\&main_menu;
+ while (1) {
+ $menu=$menu->();
+ }
+}
+
+
+# Not yet implemented. Will probably go away.
+sub platform_menu {
+ my %command=(
+ 'self' => \&platform_menu,
+ 'R' => \&main_menu,
+ 'Q' => \&quit
+ );
+ print "<<<<< PLATFORM MENU >>>>>>\n";
+
+ return $command{'R'}->();
+}
+
+
+sub binary_menu {
+ my %command=(
+ 'self' => \&binary_menu,
+ 'R' => \&main_menu,
+ 'Q' => \&quit
+ );
+
+ my @diskbins;
+ my @netbins;
+ my %from_net;
+ my @keys=string_to_list "abcdefghijklmopstuvwxyz";
+ my $index=0;
+ my $diskbin='';
+ my %keyval;
+ my $selected_platform;
+
+ menu_head "Available sets of binaries:";
+
+ foreach my $key (keys %vars) {
+ if ($key=~/diskbin_(.*)/) {
+ push @diskbins, $1;
+ $from_net{"$1"}=0;
+ }
+ if ($key=~/netbin_(.*)/) {
+ push @netbins, $1;
+ $from_net{"$1"}=1;
+ }
+ }
+ my @binaries=sort(@diskbins,@netbins);
+
+ $diskbin=' '
+ if (media eq 'CD' and $vars{'n_systems_available'}>$max_bins_on_CD);
+
+ foreach my $binary (@binaries) {
+ if (media eq 'CD' and $vars{'n_systems_available'}>$max_bins_on_CD) {
+ $diskbin=$from_net{"$binary"}? "* ":" ";
+ }
+ printf " %s %s %s%-16s %s\n", $keys[$index],
+ button($from_net{"$binary"}?
+ $vars{"netbin_$binary"}:$vars{"diskbin_$binary"}),
+ $diskbin, "$binary" . ":",
+ platform_desc "$binary";
+ $keyval{"$keys[$index]"}=$from_net{"$binary"}?
+ "netbin_$binary":"diskbin_$binary";
+ ++$index;
+ }
+ if ($vars{'n_systems_available'}<=$max_bins_on_CD ) {
+ print "\n Binaries for additional systems are available on the DVD.\n" .
+ " If you have network access, try option <N>.\n" .
+ "\nOther Options:\n", hbar, " <-> deselect all\n" .
+ " <+> select all\n <N> add binaries from net\n" .
+ " <R> return to main menu\n <Q> quit\n";
+ } else {
+ print "\n Network access is required to install binary systems " .
+ "marked with '*'.\n" if (media eq 'CD');
+ print "\nOther Options:\n", hbar, " <-> deselect all\n".
+ " <+> select all\n <R> return to main menu\n <Q> quit\n";
+ }
+
+ print "\n Press key to select/deselect binary systems: ";
+
+ chomp(my $answer=<STDIN>);
+ my @keystrokes=string_to_list $answer;
+
+ foreach my $keystroke (@keystrokes) {
+ if ($keystroke eq '-') {
+ for my $binary (@binaries) {
+ $vars{"netbin_$binary"}=0 if defined $vars{"netbin_$binary"};
+ $vars{"diskbin_$binary"}=0 if defined $vars{"diskbin_$binary"};
+ }
+ }
+ if ($keystroke eq '+') {
+ for my $binary (@binaries) {
+ $vars{"netbin_$binary"}=1 if defined $vars{"netbin_$binary"};
+ $vars{"diskbin_$binary"}=1 if defined $vars{"diskbin_$binary"};
+ }
+ }
+ if (defined $keyval{$keystroke}) {
+ toggle "$keyval{$keystroke}";
+ }
+ }
+ if ("\u$answer" eq 'N' and media eq 'CD') {
+ $trynet=1;
+ set_platforms_supported;
+ $trynet=0;
+ return $command{'self'};
+ }
+ if (defined $command{"\u$answer"}) {
+ return $command{"\u$answer"}->();
+ } else {
+ return $command{'self'}->();
+ }
+}
+
+
+sub scheme_menu {
+ my %command=(
+ 'self' => \&scheme_menu,
+ 'R' => \&main_menu,
+ 'Q' => \&quit
+ );
+
+ my @schemes;
+ my @keys=string_to_list "abcdefghijklmopstuvwxyz";
+ my %keyval;
+ my $index=0;
+
+ menu_head 'Select a scheme:';
+
+ foreach my $pkg ($tlpdb->list_packages) {
+ my $tlpobj = $tlpdb->{'tlps'}{$pkg};
+ if ($tlpobj->category eq "Scheme") {
+ push @schemes, $pkg;
+ $vars{"$pkg"}=($vars{'selected_scheme'} eq $pkg)? 1:0;
+ }
+ }
+ @schemes=sort @schemes;
+
+ foreach my $scheme (@schemes) {
+ $keyval{$keys[$index]}="$scheme";
+ printf " %s %s %s\n", $keys[$index], button($vars{"$scheme"}),
+ $scheme;
+ ++$index;
+ }
+
+ other_options;
+ print 'Press key to select a scheme: ';
+
+ chomp(my $answer=<STDIN>);
+
+ if (defined $keyval{"$answer"}) {
+ $vars{'selected_scheme'}=$keyval{"$answer"};
+ return $command{'self'}->();
+ }
+ if (defined $command{"\u$answer"}) {
+ return $command{"\u$answer"}->();
+ } else {
+ return $command{'self'}->();
+ }
+}
+
+
+sub collection_menu {
+ print "<<<<< COLLECTION MENU >>>>>>\n";
+}
+
+sub language_menu {
+ print "<<<<< LANGUAGE MENU >>>>>>\n";
+}
+
+
+sub directories_menu {
+ my %command=(
+ 'self' => \&directories_menu,
+ 'R' => \&main_menu,
+ 'Q' => \&quit
+ );
+
+ menu_head "Current directories setup:";
+ print <<"EOF";
+ <1> TEXDIR: $vars{'TEXDIR'}
+ support tree: $vars{'TEXDIR'}/texmf
+
+ <2> TEXMFLOCAL: $vars{'TEXMFLOCAL'}
+ <3> TEXMFSYSVAR: $vars{'TEXMFSYSVAR'}
+ <4> TEXMFHOME: $vars{'TEXMFHOME'}
+EOF
+;
+
+ other_options;
+ print 'Enter command: ';
+
+ chomp(my $answer=<STDIN>);
+
+ if ("\u$answer" eq '1') {
+ print "New value TEXDIR [$vars{'TEXDIR'}]: ";
+ chomp($answer=<STDIN>);
+ $vars{'TEXDIR'}="$answer" if (length $answer);
+ $vars{'TEXDIR'}=~s@\\@/@g if (win32);
+ if ($vars{'TEXDIR'}=~/^(.*)\/texlive\/$texlive_release$/) {
+ $vars{'TEXMFLOCAL'}="$1/texlive/texmf-local";
+ $vars{'TEXMFSYSVAR'}="$1/texlive/$texlive_release/texmf-var";
+ return $command{'self'};
+ }
+ }
+ if ("\u$answer" eq '2') {
+ print "New value TEXMFLOCAL [$vars{'TEXMFLOCAL'}]: ";
+ chomp($answer=<STDIN>);
+ $vars{'TEXMFLOCAL'}="$answer" if (length $answer);
+ $vars{'TEXMFLOCAL'}=~s@\\@/@g if (win32);
+ return $command{'self'};
+ }
+ if ("\u$answer" eq '3') {
+ print "New value TEXMFSYSVAR [$vars{'TEXMFSYSVAR'}]: ";
+ chomp($answer=<STDIN>);
+ $vars{'TEXMFSYSVAR'}="$answer" if (length $answer);
+ $vars{'TEXMFSYSVAR'}=~s@\\@/@g if (win32);
+ return $command{'self'};
+ }
+ if ("\u$answer" eq '4') {
+ print "New value TEXMFHOME [$vars{'TEXMFHOME'}]: ";
+ chomp($answer=<STDIN>);
+ $vars{'TEXMFHOME'}="$answer" if (length $answer);
+ $vars{'TEXMFHOME'}=~s@\\@/@g if (win32);
+ return $command{'self'};
+ }
+
+ if (defined $command{"\u$answer"}) {
+ return $command{"\u$answer"}->();
+ } else {
+ return $command{'self'}->();
+ }
+}
+
+sub options_menu {
+ my $b_altfontdir=button($vars{'o_altfontdir'});
+ my $b_symlinks=button($vars{'o_symlinks'});
+ my $b_doc=button($vars{'o_doc'});
+ my $b_src=button($vars{'o_src'});
+
+ my $altfontdir=$vars{'altfontdir'};
+ my $sys_bin=$vars{'sys_bin'};
+ my $sys_man=$vars{'sys_man'};
+ my $sys_info=$vars{'sys_info'};
+
+ my $t_altfontdir=($vars{'o_altfontdir'})? $vars{'altfontdir'}:'';
+ my $t_sys_bin=($vars{'o_symlinks'})? $vars{'sys_bin'}:'';
+ my $t_sys_man=($vars{'o_symlinks'})? $vars{'sys_man'}:'';
+ my $t_sys_info=($vars{'o_symlinks'})? $vars{'sys_info'}:'';
+
+ my %command=(
+ 'self' => \&options_menu,
+ 'R' => \&main_menu,
+ 'Q' => \&quit
+ );
+
+ clear_screen;
+ menu_head "Current options setup:";
+
+ print <<"EOF";
+ <A> alternate directory for automatically generated fonts: $b_altfontdir
+ directory name: $t_altfontdir
+EOF
+;
+ if (unix) {
+ print <<"EOF";
+ <L> create symlinks in standard directories: $b_symlinks
+ binaries to: $t_sys_bin
+ manpages to: $t_sys_man
+ info to: $t_sys_info
+EOF
+;
+ }
+ print <<"EOF";
+ <D> install font/macro doc tree: $b_doc
+ <S> install font/macro source tree: $b_src
+EOF
+;
+
+ other_options;
+ print 'Enter command: ';
+
+ chomp(my $answer=<STDIN>);
+ if ("\u$answer" eq 'A') {
+ toggle 'o_altfontdir';
+ if ($vars{'o_altfontdir'}) {
+ print "New value for alternate directory [$altfontdir]: ";
+ chomp($answer=<STDIN>);
+ $vars{'altfontdir'}="$answer" if (length $answer);
+ }
+ return $command{'self'};
+ }
+ if (unix) {
+ if ("\u$answer" eq 'L') {
+ toggle 'o_symlinks';
+ if ($vars{'o_symlinks'}) {
+ print "New value for binary directory [$sys_bin]: ";
+ chomp($answer=<STDIN>);
+ $vars{'sys_bin'}="$answer" if (length $answer);
+
+ if ($vars{'sys_bin'}=~/^(.*)\/bin$/) {
+ $vars{'sys_man'}="$1/man";
+ $vars{'sys_info'}="$1/info";
+ }
+ print "New value for man directory [$vars{'sys_man'}]: ";
+ chomp($answer=<STDIN>);
+ $vars{'sys_man'}="$answer" if (length $answer);
+
+ print "New value for info directory [$vars{'sys_info'}]: ";
+ chomp($answer=<STDIN>);
+ $vars{'sys_info'}="$answer" if (length $answer);
+ }
+ return $command{'self'};
+ }
+ }
+ if ("\u$answer" eq 'S') {
+ toggle 'o_src';
+ return $command{'self'};
+ }
+ if ("\u$answer" eq 'D') {
+ toggle 'o_doc';
+ return $command{'self'};
+ }
+ if (defined $command{"\u$answer"}) {
+ return $command{"\u$answer"};
+ } else {
+ return $command{'self'};
+ }
+}
+
+sub install {
+ print "<<<<< install >>>>>>\n";
+}
+
+sub quit {
+ dump_vars;
+ exit 0;
+}
+
+sub main_menu {
+ my $this_platform=platform_desc($vars{'this_platform'});
+
+ my $b_symlinks=button($vars{'o_symlinks'});
+ my $b_altfontdir=button($vars{'o_altfontdir'});
+ my $b_doc=button($vars{'o_doc'});
+ my $b_src=button($vars{'o_src'});
+ my $t_altfontdir=($vars{'o_altfontdir'})? "($vars{'altfontdir'})":'';
+
+ $vars{'n_systems_selected'}=0;
+ foreach my $key (keys %vars) {
+ if ($key=~/^diskbin.*/ or $key=~/^netbin.*/) {
+ ++$vars{'n_systems_selected'} if $vars{$key}==1;
+ }
+ }
+
+ my %command=(
+ 'self' => \&main_menu,
+ 'P' => \&platform_menu,
+ 'O' => \&options_menu,
+ 'D' => \&directories_menu,
+ 'S' => \&scheme_menu,
+ 'B' => \&binary_menu,
+ 'Q' => \&quit
+ );
+
+ clear_screen;
+
+ print <<"EOF";
+======================> TeX Live installation procedure <=====================
+
+=======> Note: Letters/digits in <angle brackets> indicate menu items <=======
+=======> for commands or configurable options <=======
+
+ Proposed platform: $this_platform
+ warn_nobin
+ <P> over-ride system detection and choose platform
+ <B> binary systems: $vars{'n_systems_selected'} out of $vars{'n_systems_available'}
+ <S> Installation scheme ($vars{'selected_scheme'})
+ [customizing installation scheme:
+ <C> standard collections <L> language collections]
+ $vars{'n_collections_selected'} out of $vars{'n_collections_available'}, disk space required: $vars{'total_size'} MB
+ <D> directories:
+ TEXDIR (The main TeX directory) : $vars{'TEXDIR'}
+ TEXMFLOCAL (Directory for local styles etc): $vars{'TEXMFLOCAL'}
+ TEXMFSYSVAR (Directory for local config) : $vars{'TEXMFSYSVAR'}
+ <O> options:
+ $b_altfontdir alternate directory for generated fonts $t_altfontdir
+EOF
+;
+ print <<"EOF" if (unix);
+ $b_symlinks create symlinks in standard directories
+EOF
+;
+ print <<"EOF";
+ $b_doc install macro/font doc tree
+ $b_src install macro/font source tree
+ <I> start installation
+ <H> help, <Q> quit
+EOF
+;
+
+ print 'Enter command: ';
+
+ chomp(my $answer=<STDIN>);
+ if (defined $command{"\u$answer"}) {
+ return $command{"\u$answer"};
+ } else {
+ return $command{'self'};
+ }
+}
+
+
+load_tlpdb;
+set_platforms_supported;
+set_texlive_default_dirs;
+run_menu;
+
+__END__
+
+### Local Variables:
+### perl-indent-level: 3
+### tab-width: 3
+### indent-tabs-mode: nil
+### End:
+# vim:set tabstop=3 expandtab: #
diff --git a/Master/tlpkg/TeXLive/TLUtils.pm b/Master/tlpkg/TeXLive/TLUtils.pm
index 62c24a9aa39..8418aa23aea 100644
--- a/Master/tlpkg/TeXLive/TLUtils.pm
+++ b/Master/tlpkg/TeXLive/TLUtils.pm
@@ -134,7 +134,10 @@ sub platform {
if (-d "/usr/bin") {
my $CPU; # CPU type as reported by config.guess.
my $OS; # O/S type as reported by config.guess.
- my $guessed_platform=`$::_installerdir_/config.guess`;
+ # We cannot rely on #! in config.guess but have to call /bin/sh
+ # explicitly because sometimes the 'noexec' flag is set in
+ # /etc/fstab for ISO9660 file systems.
+ my $guessed_platform=`/bin/sh $::_installerdir_/config.guess`;
chomp $guessed_platform;
($CPU=$guessed_platform)=~s/(.*?)-.*/$1/;
foreach my $os (@OSs) {
@@ -538,7 +541,7 @@ sub binaries_available_from_disk {
if (&media eq "CD") {
opendir DIR, "$::_installerdir_/archive";
} elsif (&media eq "DVD") {
- opendir DIR, "$::_installerdir_/texmf/bin";
+ opendir DIR, "$::_installerdir_/bin";
} else {
die "Media type must be CD or DVD.\n";
}
@@ -551,8 +554,8 @@ sub binaries_available_from_disk {
}
}
} elsif (&media eq "DVD") {
- for (@dir) {
- push @platforms, $1 unless (/^\./);
+ for my $platform (@dir) {
+ push @platforms, $platform unless ($platform=~/^\./);
}
} else {
die "Media type must be CD or DVD.\n";