diff --git a/bin/export.pike b/bin/export.pike
index cdb1df6b579fcdedb07dacae759136397f7bfdd1..7f204d1bcc8f3ca1bc12a22726acaa4ba8aec62b 100755
--- a/bin/export.pike
+++ b/bin/export.pike
@@ -1,6 +1,6 @@
 #!/usr/local/bin/pike
 
-/* $Id: export.pike,v 1.26 1999/08/30 21:49:25 hubbe Exp $ */
+/* $Id: export.pike,v 1.27 1999/09/06 11:01:45 hubbe Exp $ */
 
 #include <simulate.h>
 import Stdio;
@@ -8,6 +8,16 @@ import Stdio;
 multiset except_modules  =(<>);
 string vpath;
 
+
+string dirname(string dir)
+{
+  array tmp=dir/"/";
+  if(tmp[-1]=="") tmp=tmp[..sizeof(tmp)-2];
+  tmp=tmp[..sizeof(tmp)-2];
+  if(!sizeof(tmp)) return "/";
+  return tmp*"/";
+}
+
 string *get_files(string path)
 {
   string *files,tmp,*ret;
@@ -61,7 +71,7 @@ void fix_configure(string dir)
 string getversion()
 {
 //  werror("FNORD:%O\n",getcwd());
-  string s=Stdio.read_file("pike/src/version.h");
+  string s=Stdio.read_file(pike_base_name+"/src/version.h");
 
   int maj, min, build;
 
@@ -79,19 +89,22 @@ void bump_version()
 {
   werror("Bumping release number.\n");
   Process.create_process(({ "cvs", "update", "version.h" }),
-			 ([ "cwd":"pike/src" ]))->wait();
+			 ([ "cwd":pike_base_name+"/src" ]))->wait();
 
-  string s=Stdio.read_file("pike/src/version.h");
+  string s=Stdio.read_file(pike_base_name+"/src/version.h");
   sscanf(s,"%s PIKE_BUILD_VERSION %d%s",string pre, int rel, string post);
   rel++;
-  Stdio.File("pike/src/version.h", "wct")->
+  Stdio.File(pike_base_name+"/src/version.h", "wct")->
     write(pre+" PIKE_BUILD_VERSION "+rel+post);
   Process.create_process(({ "cvs", "commit", "-m",
 			    "release number bumped to "+rel+" by export.pike",
 			    "version.h" }),
-			 ([ "cwd":"pike/src" ]))->wait();
+			 ([ "cwd":pike_base_name+"/src" ]))->wait();
 }
 
+string pike_base_name;
+string srcdir;
+int rebuild;
 
 int main(int argc, string *argv)
 {
@@ -100,20 +113,57 @@ int main(int argc, string *argv)
   string *files;
   object cvs;
 
-  tmp=reverse(argv[0]/"/");
-  except_modules=mklist(argv[1..]);
-  e=search(tmp,"pike");
-  if(e==-1)
+
+  foreach(Getopt.find_all_options(argv,aggregate(
+    ({ "srcdir", "--srcdir", Getopt.HAS_ARG }),
+    ({ "rebuild","--rebuild", Getopt.NO_ARG }),
+    )),array opt)
+    {
+      switch(opt[0])
+      {
+	case "srcdir":
+	  srcdir=opt[1];
+	  if(basename(srcdir)=="src")
+	    srcdir=dirname(srcdir);
+	  pike_base_name=basename(srcdir);
+	  cd(dirname(srcdir));
+	  break;
+
+	case "rebuild":
+	  rebuild=1;
+      }
+    }
+      
+  argv=Getopt.get_args(argv);
+
+  if(!srcdir)
+  {
+    tmp=reverse(argv[0]/"/");
+    except_modules=mklist(argv[1..]);
+    e=search(tmp,"pike");
+    if(e==-1)
+    {
+      werror("Couldn't find Pike source dir.\n");
+      werror("Use export.pike --srcdir=<dir> <except modules>.\n");
+      exit(1);
+    }
+    tmp=reverse(tmp[e+1..]);
+    cd(sizeof(tmp)<1 ? tmp*"/" : "/");
+    werror("Sourcedir = "+tmp*"/"+"/pike\n");
+    pike_base_name="pike";
+  }
+
+  if(rebuild)
   {
-    werror("Couldn't find Pike source dir.\n");
-    werror("Use /full/path/export.pike <except modules>.\n");
+    werror("Not yet finished!\n");
     exit(1);
+    object autoconfig=Process.create_process(({"./run_autoconfig"}),
+					     (["cwd":pike_base_name]));
+    /* make depend... */
+    /* And other things... */
   }
-  tmp=reverse(tmp[e+1..]);
-  cd(sizeof(tmp)<1 ? tmp*"/" : "/");
-  werror("Sourcedir = "+tmp*"/"+"/pike\n");
 
-  if(file_stat("pike/CVS"))
+  if(file_stat(pike_base_name+"/CVS"))
   {
     bump_version();
 
@@ -122,15 +172,15 @@ int main(int argc, string *argv)
 
     werror("Creating tag "+tag+" in the background.\n");
     cvs=Process.create_process(({"cvs","tag","-R","-F",tag}),
-			   (["cwd":"pike"]));
+			   (["cwd":pike_base_name]));
   }else{
     vpath=replace(replace(getversion()," ","-"),"-release-",".");
   }
 
-  fix_configure("pike/src");
+  fix_configure(pike_base_name+"/src");
 
-  foreach(get_dir("pike/src/modules") - ({"CVS","RCS"}), tmp)
-    if(file_size("pike/src/modules/"+tmp) == -2)
+  foreach(get_dir(pike_base_name+"/src/modules") - ({"CVS","RCS"}), tmp)
+    if(file_size(pike_base_name+"/src/modules/"+tmp) == -2)
       fix_configure("modules/"+tmp);
 
     werror("vpath = %s\n",vpath);
@@ -144,7 +194,7 @@ int main(int argc, string *argv)
   werror("Creating "+vpath+"-indigo.tar.gz:\n");
   object o=Stdio.File();
   spawn("tar cvf - "+files*" ",0,o->pipe(Stdio.PROP_IPC));
-  spawn("gzip -9",o,Stdio.File("pike/"+vpath+"-indigo.tar.gz","wct"))->wait();
+  spawn("gzip -9",o,Stdio.File(pike_base_name+"/"+vpath+"-indigo.tar.gz","wct"))->wait();
   rm(vpath);
   werror("Done.\n");