#!/usr/bin/env perl # # tpm2deb-source.pl # machinery to create debian packages from TeX Live depot # (c) 2005, 2006 Norbert Preining # # $Id: tpm2deb-source.pl 2691 2007-04-16 09:42:22Z frank $ # # configuration is done via the file tpm2deb.cfg # use strict; no strict 'refs'; # use warnings; # no warnings 'uninitialized'; my $opt_master; our $opt_debug; our $opt_nosrcpkg; our $opt_noremove; my $globalreclevel; my $oldsrcdir; my $datadump ; BEGIN { my $upstream_modules = "/usr/share/tex-common/"; unshift (@INC, "./all/debian"); unshift (@INC, $upstream_modules); } my ($mydir,$mmydir); ($mydir = $0) =~ s,/[^/]*$,,; if ($mydir eq $0) { $mydir = `pwd` ; chomp($mydir); } if (!($mydir =~ m,/.*,,)) { $mmydir = `pwd`; chomp($mmydir); $mydir = "$mmydir/$mydir" ; } # $opt_master = "./LocalTPM"; $opt_debug = 0; $opt_nosrcpkg = 0; $opt_noremove = 0; $globalreclevel = 1; $oldsrcdir = "./src"; $datadump = "tpm.data"; use Getopt::Long; # use Data::Dumper; #use Strict; use File::Basename; use File::Copy; use File::Path; use File::Temp qw/ tempfile tempdir /; use Storable; ## not needed, atm we are calling eperl binary use Parse::ePerl; #use XML::DOM; use Cwd; #use FileUtils qw(canon_dir cleandir make_link newpath member # normalize substitute_var_val dirname diff_list remove_list # rec_rmdir sync_dir walk_dir start_redirection stop_redirection); #use Tpm; # # Configuration for destination of files # DONT USER DOUBLE QUOTES; THESE VARIABLES HAVE TO GET REEVALUATED # AFTER $tmpdir IS SET!! # my $changelog = ""; my $changelogversion = ""; my $changelogextraversion = ""; my $changelogrevision = ""; my $changelogdistribution = ""; my $allowed_dists = "(unstable|UNRELEASED|sarge-backports|etch-backports|stable-security|experimental)"; our $Master; our %TpmData; $Master = `pwd`; chomp($Master); my $TpmGlobalPath = $Master; my $DataGlobalPath = $Master; unshift (@INC, "$Master/../Build/tools"); File::Basename::fileparse_set_fstype('unix'); use Getopt::Long; use File::Basename; use File::Copy; use File::Path; use File::Temp qw/ tempfile tempdir /; use Storable; use Cwd; use Tpm; our (%TeXLive); our (%Config,%TpmData); our %TexmfTreeOfType = ( "TLCore" => "texmf", "Documentation" => "texmf-doc", "Package" => "texmf-dist"); our @TpmCategories = keys %TexmfTreeOfType; our %TypeOfTexmfTree = reverse %TexmfTreeOfType; # pre set $opt_master to ./LocalTPM which contains also the Tools dir # this is set in the main script, and changed with commandline option. # should it maybe be deleted here? my $opt_debug; my $opt_onlyscripts; sub populate_TpmData_from_dump { my $datafile = $_[0]; my $tpmdataref = retrieve($datafile); %TpmData = %{$tpmdataref}; } sub load_collection_tpm_data { # local functions sub trim { my ($str) = @_; $str =~ s/^[\n\s]+//; $str =~ s/[\n\s]+$//; return $str; } sub get_requires { my ($tpm,$type) = @_; my %requires = $tpm->getHash("Requires"); my @keylist = keys %requires; my @tlcorereqlist = (); my @packagereqlist = (); if ($type eq '') { $type = "all"; } foreach my $k (keys %requires) { foreach my $e (@{$requires{$k}}) { # manually exclude Windows-only packages if ($e eq "bin-bzip2") {} elsif ($e eq "bin-xpdf") {} elsif ($e eq "bin-chktex") {} elsif ($e eq "bin-ghostscript") {} elsif ($e eq "bin-gzip") {} elsif ($e eq "bin-jpeg2ps") {} elsif ($e eq "bin-perl") {} elsif ($e eq "bin-windvi") {} elsif ($e eq "lib-freetype2") {} elsif ($e eq "lib-gd") {} elsif ($e eq "lib-geturl") {} elsif ($e eq "lib-gnu") {} elsif ($e eq "lib-gs") {} elsif ($e eq "lib-jpeg") {} elsif ($e eq "lib-md5") {} elsif ($e eq "lib-png") {} elsif ($e eq "lib-regex") {} elsif ($e eq "lib-texmfmp") {} elsif ($e eq "lib-tiff") {} elsif ($e eq "lib-ttf") {} elsif ($e eq "lib-xpdf") {} elsif ($e eq "lib-xpm") {} elsif ($e eq "lib-zlib") {} elsif ($e =~ /^bin-(.*)$/) { push @packagereqlist, "$k/$e"; } elsif ($e =~ /^hyphen-(.*)$/){ push @packagereqlist, "$k/$e"; } elsif ($k eq "TLCore") { push @tlcorereqlist, "$k/$e"; } else { push @packagereqlist, "$k/$e"; } } } if ($type eq '' || $type eq 'all') { my %foo; $foo{'TLCore'} = \@tlcorereqlist; $foo{'Package'} = \@packagereqlist; #my @foo=(@tlcorereqlist,@packagereqlist); #return(@foo); return(\%foo); } elsif ($type eq 'TLCore') { return(@tlcorereqlist); } elsif ($type eq 'Package') { return(@packagereqlist); } else { die("Don't know this type: $type!\n"); } } # start of real function print "Start loading tpm data ... \n"; foreach my $t ('TLCore', 'Documentation', 'Package') { my $subtree = ${TexmfTreeOfType}{$t}; foreach my $f (<$Master/$subtree/tpm/*.tpm>) { print "Working on $f\n"; my $shortn = basename($f); $shortn =~ s,\.tpm$,,; if (($t eq 'TLCore') && ($shortn =~ m/^scheme-/)) { next ; } my $tpm = Tpm->new("$subtree/tpm/$shortn.tpm"); foreach my $a (@Tpm::ArchList) { ${Tpm::CurrentArch} = $a; $TpmData{$t}{$shortn}{'BinFiles'}{$a} = [ $tpm->getFileList("BinFiles") ]; } #$TpmData{$t}{$shortn}{'BinFiles'} = [ $tpm->getFileList("BinFiles") ]; $TpmData{$t}{$shortn}{'DocFiles'} = [ $tpm->getFileList("DocFiles") ]; $TpmData{$t}{$shortn}{'RunFiles'} = [ $tpm->getFileList("RunFiles") ]; $TpmData{$t}{$shortn}{'SourceFiles'} = [ $tpm->getFileList("SourceFiles") ]; $TpmData{$t}{$shortn}{'RemoteFiles'} = [ $tpm->getFileList("RemoteFiles") ]; $TpmData{$t}{$shortn}{'Title'} = trim($tpm->getAttribute("Title")); # print "got title $TpmData{$t}{$shortn}{'Title'}\n"; $TpmData{$t}{$shortn}{'Description'} = trim($tpm->getAttribute("Description")); $TpmData{$t}{$shortn}{'License'} = trim($tpm->getAttribute("License")); my @foo = $tpm->getList("Installation"); $TpmData{$t}{$shortn}{'Installation'} = \@foo ; my $alldeps = get_requires($tpm,'all'); my @incs = @{$alldeps->{'Package'}}; my @deps = @{$alldeps->{'TLCore'}}; $TpmData{$t}{$shortn}{'Package'} = \@incs; $TpmData{$t}{$shortn}{'TLCore'} = \@deps; } } print " ... done\n"; } sub dump_tpm_data { print "Dumping TpmData\n\n"; foreach my $t ('TLCore', 'Documentation', 'Package') { #foreach my $t ('Package') { print "Dumping $t:\n"; my %foo = %{$TpmData{$t}}; foreach my $p (keys %foo) { open (FOO,">tlptpm/$p.tlp") || die("Cannot open tlptpm/$p.tpmtlp!"); print FOO "name $p\n"; print FOO "category $t\n"; foreach my $foo (@{$TpmData{$t}{$p}{'Package'}}) { print FOO "depend $foo\n"; } foreach my $foo (@{$TpmData{$t}{$p}{'TLCore'}}) { print FOO "depend $foo\n"; } foreach my $ex (@{$TpmData{$t}{$p}{'Installation'}}) { my %foo = %{$ex}; print FOO "execute $foo{'function'} $foo{'mode'} $foo{'parameter'}\n"; } my @foo; @foo = @{$TpmData{$t}{$p}{'DocFiles'}}; if ($#foo >= 0) { print FOO "docfiles\n"; foreach my $foo (sort @foo) { print FOO " $foo\n"; } } @foo = @{$TpmData{$t}{$p}{'SourceFiles'}}; if ($#foo >= 0) { print FOO "srcfiles\n"; foreach my $foo (sort @foo) { print FOO " $foo\n"; } } @foo = @{$TpmData{$t}{$p}{'RunFiles'}}; if ($#foo >= 1) { print FOO "runfiles\n"; foreach my $foo (sort @foo) { next if ($foo =~ /\.tpm$/); print FOO " $foo\n"; } } @foo = @{$TpmData{$t}{$p}{'RemoteFiles'}}; if ($#foo >= 0) { print FOO "remotefiles\n"; foreach my $foo (sort @foo) { print FOO " $foo\n"; } } foreach my $a (sort @Tpm::ArchList) { @foo = @{$TpmData{$t}{$p}{'BinFiles'}{$a}}; if ($#foo >= 0) { print FOO "binfiles arch=$a\n"; foreach my $foo (sort @foo) { print FOO " $foo\n"; } } } close(FOO); } } } &main(@ARGV); 1; # variables needed outside of main my $version; my $revision; my $extraversion; my $date; my $arch; my $shortl; sub main { ${Tpm::MasterDir} = $TeXLive{'all'}{'tpm_global_path'}; $arch = "all"; ${Tpm::CurrentArch} = "i386-linux"; ${Tpm::MasterDir} = $Master; load_collection_tpm_data(); dump_tpm_data(); } ### Local Variables: ### perl-indent-level: 4 ### tab-width: 4 ### indent-tabs-mode: t ### End: # vim:set tabstop=4: #