--- toast 2004/04/24 22:37:06 1.323 +++ toast 2004/04/25 00:50:13 1.324 @@ -240,6 +240,7 @@ "autofind" => "true", "autochange" => "true", "autorename" => "true", + "autoenv" => "true", "autoclean" => "true", "autopurge" => "false", "autoarm" => "true", @@ -728,7 +729,7 @@ else # child { defined($pid) || error("fork: $!"); - chdir($dir) || error("chdir $dir: $!"); + silentcd($dir); safeexec(@prog); } } @@ -1045,6 +1046,14 @@ } error("level>1024 in pwd"); } + + sub silentcd($) + { + my($dir) = @_; + $ENV{PWD} = $pwd = abspath($dir); + chdir($dir) || error("chdir $dir: $!"); + return true; + } } sub abspath($) @@ -1310,6 +1319,72 @@ ############################################################################## +sub newenvvar($$;$) +{ + my($varname, $subdirs, $default) = @_; + my(@dirs) = map(path(armdir, $_), split(/:/, $subdirs)); + my($current) = exists($ENV{$varname}) ? $ENV{$varname} : $default; + + if(defined($current)) + { + my(%have); + $have{$_} = 1 for split(/:/, $current); + @dirs = grep(!$have{$_}, @dirs); + push(@dirs, $current); + } + + return($varname, join(":", @dirs)); +} + +sub newenv() +{ + my($defaultman) = "/usr/man:/usr/share/man:/usr/local/man:/usr/X11R6/man"; + if(!exists($ENV{MANPATH})) # don't bother unless we're going to use it... + { + my($out) = `man -w 2>/dev/null`; + chomp($out) if defined($out); + $defaultman = $out if defined($out) && $out =~ m!^/! && $out !~ /\n/; + } + + my(@vars); + push(@vars, newenvvar("PATH", "sbin:bin")); + push(@vars, newenvvar("MANPATH", "man", $defaultman)); + push(@vars, newenvvar("INFOPATH", "info", "")); + push(@vars, newenvvar("CPATH", "include")); + push(@vars, newenvvar("LIBRARY_PATH", "lib")); + # there's also a LIBRARY_RUN_PATH or something that affects ld somehow... + return @vars; +} + +sub printnewenv() +{ + my(@vars) = newenv; + while(@vars) + { + my($key, $value) = (shift(@vars), shellescape(shift(@vars))); + my($export) = exists($ENV{$key}) ? "" : " export $key;"; + print("$key=$value;$export\n"); + } + return @vars; +} + +sub setbuildenv() +{ + my(%vars) = printnewenv; + $ENV{$_} = $vars{$_} for keys(%vars); +optrun("printenv") || optrun("env"); + true; +} + +sub env(@) +{ + @_ && error; + printnewenv; + return true; +} + +############################################################################## + sub yes() { explain("forking yes subprocess"); @@ -1327,7 +1402,7 @@ explain("$^X $0 $] $^O"); optrun("uname", "-a"); optrun(findperl, "-V"); - optrun("printenv"); + optrun("printenv") || optrun("env"); my(@urls) = pkgurls($name, $version); explain("no urls") unless @urls; explain("url: $_") for @urls; @@ -1537,7 +1612,7 @@ } else { - chdir($outdir) || error("chdir $outdir: $!"); + silentcd($outdir); safeexec("unzip", "-qo", $infile) if $type eq ".zip"; safeopen(*STDIN, "<", $infile); extractstdin($type); @@ -3255,6 +3330,7 @@ dropprivs; showprebuildinfo($name, $version, $build); yes; + setbuildenv if autoenv; my($archivedir) = path($verdir, archivedir); my($srcdir) = path($builddir, srcdir); @@ -4084,49 +4160,6 @@ ############################################################################## -sub printenvcmd($$;$) -{ - my($varname, $subdirs, $default) = @_; - my(@dirs) = map(path(armdir, $_), split(/:/, $subdirs)); - my($exists) = exists($ENV{$varname}); - my($current) = $exists ? $ENV{$varname} : $default; - my($export) = $exists ? "" : " export $varname;"; - - if(defined($current)) - { - my(%have); - $have{$_} = 1 for split(/:/, $current); - @dirs = grep(!$have{$_}, @dirs); - } - - push(@dirs, $current) if defined($current); - print("$varname=" . shellescape(join(":", @dirs)) . ";$export\n"); -} - -sub env(@) -{ - @_ && error; - - my($defaultman) = "/usr/man:/usr/share/man:/usr/local/man:/usr/X11R6/man"; - if(!exists($ENV{MANPATH})) # don't bother unless we're going to use it... - { - my($out) = `man -w 2>/dev/null`; - chomp($out) if defined($out); - $defaultman = $out if defined($out) && $out =~ m!^/! && $out !~ /\n/; - } - - printenvcmd("PATH", "sbin:bin"); - printenvcmd("MANPATH", "man", $defaultman); - printenvcmd("INFOPATH", "info", ""); - printenvcmd("CPATH", "include"); - printenvcmd("LIBRARY_PATH", "lib"); - # there's also a LIBRARY_RUN_PATH or something that affects ld somehow... - - return true; -} - -############################################################################## - sub selfopen(*) { local(*SCRIPT) = @_; @@ -5840,6 +5873,13 @@ a serial number for uniqueness; name may have been guessed or may also be C<unknown>). Default: enabled. +=item S<B<--autoenv> | B<--noautoenv>> + +When B<autoenv> is enabled, B<toast> will automatically export the +environment variable settings printed by B<toast env> to any programs +invoked while building a package. This may help the package being built +to locate other armed packages on which it depends. Default: enabled. + =item S<B<--autoclean> | B<--noautoclean>> When B<autoclean> is enabled, commands that create a new build for a @@ -6147,7 +6187,6 @@ Wish list: - - automatically "toast env"-ify environment during "toast build" - work around lack of getenv(), mkdir(), etc. in microperl...? - "toast upgrade" w/o args should imply --nostoponerror or something - "toast arm" should move armed packages to top of stacking order