diff --git a/bin/install.pike b/bin/install.pike
index 37428d45b54ea79d59e1273b6ae23cc30a707179..2030f81bed4060a363605158b0c6f38549d80023 100644
--- a/bin/install.pike
+++ b/bin/install.pike
@@ -4,6 +4,9 @@ int last_len;
 int redump_all;
 string pike;
 array(string) to_dump=({});
+array(string) to_export=({});
+
+int export;
 
 #define MASTER_COOKIE "(#*&)@(*&$Master Cookie:"
 
@@ -32,6 +35,7 @@ string status(string doing, string file, string|void msg)
 int mkdirhier(string dir)
 {
   int tomove;
+  if(export) return 1;
 
   if(dir=="") return 1;
   status("creating",dir);
@@ -79,6 +83,13 @@ int low_install_file(string from,
 		     string to,
 		     void|int mode)
 {
+  if(export)
+  {
+//    werror("FROM: %O\n",from);
+    to_export+=({ from });
+    return 1;
+  }
+
   status("installing",to);
 
   if(compare_files(from,to))
@@ -213,6 +224,71 @@ void dumpmodules(string dir)
 
 mapping vars=([]);
 
+string export_base_name;
+
+int mklink(string from, string to)
+{
+#if constant(symlink)
+  catch  {
+    symlink(from, to);
+    return 1;
+  };
+#endif
+  return 0;
+}
+
+void do_export()
+{
+  export=0;
+  cd("..");
+  Stdio.write_file(export_base_name+".x",
+		   "#!/bin/sh\n"
+		   "( cd "+export_base_name+".dir\n"+
+		   "  build/pike -DNOT_INSTALLED -mbuild/master.pike -Mbuild/lib/modules -Mlib/modules bin/install.pike --interactive \\\n"+
+		   "  TMP_LIBDIR=\"build/lib\"\\\n"+
+		   "  LIBDIR_SRC=\"lib\"\\\n"+
+		   "  SRCDIR=\"src\"\\\n"+
+		   "  TMP_BINDIR=\"bin\"\\\n"+
+		   "  TMP_BUILDDIR=\"build\"\\\n"+
+		   "  MANDIR_SRC=\"man\"\n"+
+		   ")\n"+
+		   "rm -rf '#!' "+export_base_name+".dir "+export_base_name+".x\n"
+    );
+  chmod(export_base_name+".x",0755);
+  string script="#!/bin/sh\ntar xf $0\nexec "+export_base_name+".x\n";
+  if(strlen(script) > 100)
+  {
+    werror("Script too long!!\n");
+    exit(1);
+  }
+
+  string *parts=(script/"/");
+  mkdirhier( parts[..sizeof(parts)-2]*"/");
+  Stdio.write_file(script,"");
+
+  to_export=({script,export_base_name+".x"})+
+    Array.map(to_export,
+	      lambda(string s)
+	      {
+		werror("FOO: %O\n",s);
+		return combine_path(export_base_name+".dir",s);
+	      });
+
+  werror("To export_base_name = %O\n",export_base_name);
+  werror("To export = %O\n",to_export);
+
+  Process.create_process( ({ "tar","cvf", export_base_name})+ to_export)
+    ->wait();
+
+  chmod(export_base_name,0755);
+
+  Process.create_process( ({ "rm","-rf",
+			       export_base_name+".dir",
+			       export_base_name+".x"
+			       }) ) ->wait();
+
+  exit(0);
+}
 
 int main(int argc, string *argv)
 {
@@ -224,81 +300,154 @@ int main(int argc, string *argv)
   string man_prefix;
   string lnk;
   string old_exec_prefix;
+  object interactive;
+
   foreach(argv[1..], string foo)
     if(sscanf(foo,"%s=%s",string var, string value)==2)
       vars[var]=value;
 
-  prefix=vars->prefix;
-  if(argc>1 && argv[1]=="--traditional")
-  {
-    exec_prefix=vars->exec_prefix;
-    lib_prefix=vars->lib_prefix;
-    include_prefix=combine_path(prefix,"include","pike");
-    man_prefix=vars->man_prefix;
-  }else{
+  prefix=vars->prefix || "/usr/local";
 
-    if(!(lnk=vars->pike_name) || !strlen(lnk)) {
-      lnk=combine_path(vars->exec_prefix,"pike");
-      old_exec_prefix=vars->exec_prefix; // to make the directory for pike link
-    }
-    prefix=combine_path("/",getcwd(),prefix,"pike",replace(version()-"Pike v"," release ","."));
-    exec_prefix=combine_path(prefix);
-    lib_prefix=combine_path(prefix,"lib");
-    include_prefix=combine_path(prefix,"include","pike");
-    man_prefix=combine_path(prefix,"man");
+  string install_type="";
+  if(argc > 1) install_type=argv[1];
+
+  if(!vars->TMP_BINDIR)
+    vars->TMP_BINDIR=combine_path(vars->SRCDIR,"../bin");
+
+
+  if(!vars->TMP_BUILDDIR) vars->TMP_BUILDDIR=".";
+
+  while(1)
+  {
+  switch(install_type)
+  {
+    case "--traditional":
+      exec_prefix=vars->exec_prefix;
+      lib_prefix=vars->lib_prefix;
+      include_prefix=combine_path(prefix,"include","pike");
+      man_prefix=vars->man_prefix;
+      break;
+
+    case "--interactive":
+      interactive=Stdio.Readline();
+      prefix=interactive->edit(prefix,"Install prefix: ");
+      vars->pike_name=interactive->edit(
+	vars->pike_name || 
+	combine_path(vars->exec_prefix || combine_path(prefix, "bin"),"pike"), "Pike binary name: ");
+      destruct(interactive);
+      install_type="--new-style";
+//      trace(2);
+      continue;
+
+    default:
+    case "--export":
+      string ver=replace(replace(version()," ","-"),"-release-",".");
+      export_base_name=sprintf("%s-%s",ver,uname()->sysname);
+
+      mkdirhier(export_base_name+".dir");
+
+      mklink(vars->LIBDIR_SRC,export_base_name+".dir/lib");
+      mklink(vars->SRCDIR,export_base_name+".dir/src");
+      mklink(getcwd(),export_base_name+".dir/build");
+      mklink(vars->TMP_BINDIR,export_base_name+".dir/bin");
+      mklink(vars->MANDIR_SRC,export_base_name+".dir/man");
+      
+      cd(export_base_name+".dir");
+
+      vars->TMP_LIBDIR="build/lib";
+      vars->LIBDIR_SRC="lib";
+      vars->SRCDIR="src";
+      vars->TMP_BINDIR="bin";
+      vars->MANDIR_SRC="man";
+      vars->TMP_BUILDDIR="build";
+
+      export=1;
+      to_export+=({ combine_path(vars->TMP_BINDIR,"install.pike") });
+      
+    case "":
+    case "--new-style":
+      if(!(lnk=vars->pike_name) || !strlen(lnk)) {
+	lnk=combine_path(vars->exec_prefix || combine_path(vars->prefix, "bin"),"pike");
+	old_exec_prefix=vars->exec_prefix; // to make the directory for pike link
+      }
+      prefix=combine_path("/",getcwd(),prefix,"pike",
+			  replace(version()-"Pike v"," release ","."));
+      exec_prefix=combine_path(prefix,"bin");
+      lib_prefix=combine_path(prefix,"lib");
+      include_prefix=combine_path(prefix,"include","pike");
+      man_prefix=combine_path(prefix,"man");
+      break;
+  }
+  break;
   }
+
   pike=combine_path(exec_prefix,"pike");
 
   mixed err=catch {
-    write("\nInstalling Pike in %s...\n\n",prefix);
-
-    string pike_bin_file="pike";
-    status("Finalizing",pike_bin_file);
-    string pike_bin=Stdio.read_file(pike_bin_file);
-    int pos=search(pike_bin,MASTER_COOKIE);
-
-    if(pos<=0 && strlen(pike_bin) < 10000 && file_stat("pike.exe"))
+    if(export)
     {
-      pike_bin_file="pike.exe";
+      to_export+=({combine_path(vars->TMP_BUILDDIR,"pike")});
+    }else{
+      write("\nInstalling Pike in %s...\n\n",prefix);
+      
+      string pike_bin_file=combine_path(vars->TMP_BUILDDIR,"pike");
       status("Finalizing",pike_bin_file);
-      pike_bin=Stdio.read_file(pike_bin_file);
-      pos=search(pike_bin,MASTER_COOKIE);
-      pike+=".exe";
+      string pike_bin=Stdio.read_file(pike_bin_file);
+      int pos=search(pike_bin,MASTER_COOKIE);
+      
+      if(pos<=0 && strlen(pike_bin) < 10000 && 
+	 file_stat(combine_path(vars->TMP_BUILDDIR,"pike.exe")))
+      {
+	pike_bin_file=combine_path(vars->TMP_BUILDDIR,"pike.exe");
+	status("Finalizing",pike_bin_file);
+	pike_bin=Stdio.read_file(pike_bin_file);
+	pos=search(pike_bin,MASTER_COOKIE);
+	pike+=".exe";
+      }
+      
+      if(pos>=0)
+      {
+	status("Finalizing",pike_bin_file,"...");
+	Stdio.write_file(pike_bin_file=combine_path(vars->TMP_BUILDDIR,"pike.tmp"),pike_bin);
+	Stdio.File f=Stdio.File(pike_bin_file,"rw");
+	f->seek(pos+strlen(MASTER_COOKIE));
+	f->write(combine_path(lib_prefix,"master.pike"));
+	f->close();
+	status("Finalizing",pike_bin_file,"done");
+      }else{
+	write("Warning! Failed to finalize master location!\n");
+      }
+      if(install_file(pike_bin_file,pike)) redump_all=1;
     }
 
-    if(pos>=0)
+    install_file(combine_path(vars->TMP_BUILDDIR,"hilfe"),combine_path(exec_prefix,"hilfe"));
+    string master=combine_path(vars->LIBDIR_SRC,"master.pike.in");
+    
+    if(export)
     {
-      status("Finalizing",pike_bin_file,"...");
-      Stdio.write_file(pike_bin_file="pike.tmp",pike_bin);
-      Stdio.File f=Stdio.File(pike_bin_file,"rw");
-      f->seek(pos+strlen(MASTER_COOKIE));
-      f->write(combine_path(lib_prefix,"master.pike"));
-      f->close();
-      status("Finalizing",pike_bin_file,"done");
+      to_export+=({master,
+		   combine_path(vars->TMP_BUILDDIR,"master.pike"),
+		   combine_path(vars->SRCDIR,"dumpmaster.pike"),
+		   combine_path(vars->SRCDIR,"dumpmodule.pike")
+      });
     }else{
-      write("Warning! Failed to finalize master location!\n");
-    }
-    if(install_file(pike_bin_file,pike)) redump_all=1;
-
-    install_file("hilfe",combine_path(exec_prefix,"hilfe"));
-    string master=combine_path(vars->LIBDIR_SRC,"master.pike.in");
-
 //    werror("Making master with libdir=%s\n",lib_prefix);
-    status("Finalizing",master);
-    string master_data=Stdio.read_file(master);
-    master_data=replace(master_data,"�lib_prefix�",replace(lib_prefix,"\\","\\\\"));
-    Stdio.write_file(combine_path(vars->TMP_LIBDIR,"master.pike"),master_data);
-    status("Finalizing",master,"done");
-		    
+      status("Finalizing",master);
+      string master_data=Stdio.read_file(master);
+      master_data=replace(master_data,"�lib_prefix�",replace(lib_prefix,"\\","\\\\"));
+      Stdio.write_file(combine_path(vars->TMP_LIBDIR,"master.pike"),master_data);
+      status("Finalizing",master,"done");
+    }
+    
     install_dir(vars->TMP_LIBDIR,lib_prefix,1);
     install_dir(vars->LIBDIR_SRC,lib_prefix,1);
     
     install_header_files(vars->SRCDIR,include_prefix);
-    install_header_files(".",include_prefix);
+    install_header_files(vars->TMP_BUILDDIR,include_prefix);
     
-    install_file("modules/dynamic_module_makefile",
+    install_file(combine_path(vars->TMP_BUILDDIR,"modules/dynamic_module_makefile"),
 		 combine_path(include_prefix,"dynamic_module_makefile"));
-    install_file("./aclocal",
+    install_file(combine_path(vars->TMP_BUILDDIR,"aclocal"),
 		 combine_path(include_prefix,"aclocal.m4"));
     
     if(file_stat(vars->MANDIR_SRC))
@@ -315,40 +464,47 @@ int main(int argc, string *argv)
 
   if(err) throw(err);
 
-  string master=combine_path(lib_prefix,"master.pike");
-  mixed s1=file_stat(master);
-  mixed s2=file_stat(master+".o");
-  if(!s1 || !s2 || s1[3]>=s2[3] || redump_all)
+
+  if(export)
   {
-    Process.create_process( ({pike,"-m",combine_path(vars->SRCDIR,"dumpmaster.pike"),master}))->wait();
-  }
-  
+    do_export();
+  }else{
+    string master=combine_path(lib_prefix,"master.pike");
+    mixed s1=file_stat(master);
+    mixed s2=file_stat(master+".o");
+    if(!s1 || !s2 || s1[3]>=s2[3] || redump_all)
+    {
+      Process.create_process( ({pike,"-m",combine_path(vars->SRCDIR,"dumpmaster.pike"),master}))->wait();
+    }
+    
 //    dumpmodules(combine_path(vars->lib_prefix,"modules"));
-  if(sizeof(to_dump))
-  {
-    foreach(to_dump, string mod) rm(mod+".o");
-    Process.create_process( ({pike,combine_path(vars->SRCDIR,"dumpmodule.pike")}) + to_dump)->wait();
-  }
-
+    if(sizeof(to_dump))
+    {
+      foreach(to_dump, string mod) rm(mod+".o");
+      Process.create_process( ({pike,combine_path(vars->SRCDIR,"dumpmodule.pike")}) + to_dump)->wait();
+    }
+    
 #if constant(symlink)
-  if(lnk)
-  {
-    mixed s=file_stat(lnk,1);
-    if(s)
+    if(lnk)
     {
-      if(!mv(lnk,lnk+".old"))
+      mixed s=file_stat(lnk,1);
+      if(s)
       {
-	werror("Failed to move %s\n",lnk);
-	exit(1);
+	if(!mv(lnk,lnk+".old"))
+	{
+	  werror("Failed to move %s\n",lnk);
+	  exit(1);
+	}
       }
+      if (old_exec_prefix) {
+	mkdirhier(old_exec_prefix);
+      }
+      mkdirhier(dirname(lnk));
+      symlink(pike,lnk);
     }
-    if (old_exec_prefix) {
-      mkdirhier(old_exec_prefix);
-    }
-    symlink(pike,lnk);
-  }
 #endif
+  }
   write("\nDone\n");
-
+    
   return 0;
 }
diff --git a/src/Makefile.in b/src/Makefile.in
index b1e6eee4042580321f45a2f5c7c707fcb578b403..05cfd9746d619d4d33ff9bb4c5082085431526db 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -1,5 +1,5 @@
 #
-# $Id: Makefile.in,v 1.143 1999/06/01 13:33:22 mirar Exp $
+# $Id: Makefile.in,v 1.144 1999/06/10 00:12:08 hubbe Exp $
 #
 
 # This line is needed on some machines.
@@ -492,8 +492,11 @@ all_exports: full_export
 	( cd .. ; $(TMP_BINDIR)/makedists )
 
 bin_export:
-	PATH=$(TMP_BINDIR)/fakes:$$PATH INSTALL_LOG=`pwd`/log make old-install INSTALL=install
-	$(RUNPIKE) $(TMP_BINDIR)/parse_install_log <log $(SRCDIR) $(prefix)
+	@$(RUNPIKE) $(TMP_BINDIR)/install.pike --export \
+	exec_prefix="$(exec_prefix)" lib_prefix="$(lib_prefix)" \
+	TMP_LIBDIR="$(TMP_LIBDIR)" LIBDIR_SRC="$(LIBDIR_SRC)" \
+	SRCDIR="$(SRCDIR)" prefix="$(prefix)" MANDIR_SRC="$(MANDIR_SRC)" \
+	man_prefix="$(man_prefix)" pike_name=$(pike_name)
 
 new_peep_engine:
 	$(RUNPIKE) $(TMP_BINDIR)/mkpeep.pike $(SRCDIR)/peep.in >$(SRCDIR)/peep_engine.c