diff --git a/bin/install.pike b/bin/install.pike index 2030f81bed4060a363605158b0c6f38549d80023..a667ac2a17023629c14770e09582aefa8c769416 100644 --- a/bin/install.pike +++ b/bin/install.pike @@ -241,8 +241,16 @@ void do_export() { export=0; cd(".."); - Stdio.write_file(export_base_name+".x", - "#!/bin/sh\n" + string tmpname=sprintf("PtmP%07x",random(0xfffffff)); + + status("Creating","script glue"); + Stdio.write_file(tmpname+".x", + "#!/bin/sh\n"+ + "echo Unpacking...\n"+ + "tar xf \"$1\" "+tmpname+".tar.gz\n"+ + "gzip -dc "+tmpname+".tar.gz | tar xf -\n"+ + "rm -rf "+tmpname+".tar.gz\n"+ + "shift\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"+ @@ -250,13 +258,14 @@ void do_export() " SRCDIR=\"src\"\\\n"+ " TMP_BINDIR=\"bin\"\\\n"+ " TMP_BUILDDIR=\"build\"\\\n"+ - " MANDIR_SRC=\"man\"\n"+ + " MANDIR_SRC=\"man\"\\\n"+ + " \"$@\"\n"+ ")\n"+ - "rm -rf '#!' "+export_base_name+".dir "+export_base_name+".x\n" + "rm -rf "+export_base_name+".dir "+tmpname+".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) + chmod(tmpname+".x",0755); + string script=sprintf("#!/bin/sh\ntar xf \"$0\" %s.x\nexec %s.x \"$0\" \"$@\"\n",tmpname,tmpname,tmpname); + if(strlen(script) >= 100) { werror("Script too long!!\n"); exit(1); @@ -266,27 +275,45 @@ void do_export() mkdirhier( parts[..sizeof(parts)-2]*"/"); Stdio.write_file(script,""); - to_export=({script,export_base_name+".x"})+ - Array.map(to_export, + to_export=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) + status("Creating",tmpname+".tar"); + + Process.create_process(({"tar","cf",tmpname+".tar"})+ to_export) + ->wait(); + + status("Creating",tmpname+".tar.gz"); + + Process.create_process(({"gzip","-9",tmpname+".tar"}))->wait(); + + to_export=({script,tmpname+".x",tmpname+".tar.gz"}); + + status("Creating",export_base_name); + + Process.create_process( ({ "tar","cf", export_base_name})+ to_export) ->wait(); chmod(export_base_name,0755); + status("Cleaning up",""); + Process.create_process( ({ "rm","-rf", export_base_name+".dir", export_base_name+".x" }) ) ->wait(); + + if(last_len) + { + status(0,""); + status(0,""); + } + exit(0); } @@ -329,17 +356,21 @@ int main(int argc, string *argv) break; case "--interactive": + write("\n"); + write(" Welcome to the interactive Pike installation script.\n"); + write("\n"); 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: "); + if(!vars->prefix) + prefix=interactive->edit(prefix,"Install prefix: "); + + if(!vars->pike_name) + vars->pike_name=interactive->edit( + 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); @@ -365,6 +396,7 @@ int main(int argc, string *argv) to_export+=({ combine_path(vars->TMP_BINDIR,"install.pike") }); case "": + default: case "--new-style": if(!(lnk=vars->pike_name) || !strlen(lnk)) { lnk=combine_path(vars->exec_prefix || combine_path(vars->prefix, "bin"),"pike");