diff --git a/bin/install.pike b/bin/install.pike index f99fbaffc3b8c6bf71722511cf91ed9b27d3eb72..38d5d3754d2248fb25dac46ccc87d6fcd8e81997 100644 --- a/bin/install.pike +++ b/bin/install.pike @@ -297,6 +297,16 @@ void install_header_files(string from, string to) mapping vars=([]); +string fakeroot(string s) +{ + if(vars->fakeroot) + { + return vars->fakeroot+combine_path(getcwd(),s); + }else{ + return s; + } +} + string export_base_name; int mklink(string from, string to) @@ -1064,22 +1074,22 @@ void do_install() lib_prefix); } - install_dir(vars->TMP_LIBDIR,lib_prefix,1); - install_dir(vars->LIBDIR_SRC,lib_prefix,1); + install_dir(fakeroot(vars->TMP_LIBDIR),lib_prefix,1); + install_dir(fakeroot(vars->LIBDIR_SRC),lib_prefix,1); - install_header_files(vars->SRCDIR,include_prefix); - install_header_files(vars->TMP_BUILDDIR,include_prefix); + install_header_files(fakeroot(vars->SRCDIR),include_prefix); + install_header_files(fakeroot(vars->TMP_BUILDDIR),include_prefix); - install_file(combine_path(vars->TMP_BUILDDIR,"modules/dynamic_module_makefile"), + install_file(fakeroot(combine_path(vars->TMP_BUILDDIR,"modules/dynamic_module_makefile")), combine_path(include_prefix,"dynamic_module_makefile")); - install_file(combine_path(vars->TMP_BUILDDIR,"aclocal"), + install_file(fakeroot(combine_path(vars->TMP_BUILDDIR,"aclocal")), combine_path(include_prefix,"aclocal.m4")); if(file_stat(vars->MANDIR_SRC)) { // trace(9); // _debug(5); - install_dir(vars->MANDIR_SRC,combine_path(man_prefix,"man1"),0); + install_dir(fakeroot(vars->MANDIR_SRC),combine_path(man_prefix,"man1"),0); } }; @@ -1098,20 +1108,30 @@ void do_install() 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(); + Process.create_process( ({pike,"-m", + combine_path(vars->SRCDIR,"dumpmaster.pike"), + @(vars->fakeroot? ({"--fakeroot="+vars->fakeroot}):({})), + master}))->wait(); } if(sizeof(to_dump)) { - status("Dumping modules, please wait... "); + status("Dumping modules, please wait..."); foreach(to_dump, string mod) rm(mod+".o"); - Process.create_process( ({pike, - combine_path(vars->SRCDIR,"dumpmodule.pike"), + /* Dump 50 modules at a time */ + write("\n"); + foreach(to_dump/50,to_dump) + { + write(" "); + Process.create_process( ({pike, + combine_path(vars->SRCDIR,"dumpmodule.pike"), #if defined(USE_GTK) && constant(GTK.parse_rc) - label1?"--distquiet": + label1?"--distquiet": #endif - "--quiet" - }) + to_dump)->wait(); + "--quiet", + @(vars->fakeroot? ({"--fakeroot="+vars->fakeroot}):({})), + }) + to_dump)->wait(); + } } // Delete any .pmod files that would shadow the .so diff --git a/src/dumpmaster.pike b/src/dumpmaster.pike index 4bfe92f7239e3e5373ebc9a8f280d7a3027bec68..cd07b193e707ccfe6e523128120a5a1e253cf810 100644 --- a/src/dumpmaster.pike +++ b/src/dumpmaster.pike @@ -1,12 +1,23 @@ #define UNDEFINED (([])[0]) +string fakeroot; + void handle_error(mixed err) { werror("%O\n",err); } + +string read_file(string s) +{ + if(fakeroot) + s=fakeroot+combine_path(getcwd(),s); + + return _static_modules.files()->Fd(s,"r")->read(); +} + program compile_file(string file) { - return compile(cpp(_static_modules.files()->Fd(file,"r")->read(),file)); + return compile(cpp(read_file(file),file)); } class Codec @@ -19,6 +30,9 @@ class Codec } void _main(string *argv, string *env) { + foreach(argv[1..sizeof(argv)-2], string f) + sscanf(f,"--fakeroot=%s",fakeroot); + program p=compile_file(argv[-1]); string s=encode_value(p, Codec()); _static_modules.files()->Fd(argv[-1] + ".o","wct")->write(s); diff --git a/src/dumpmodule.pike b/src/dumpmodule.pike index c58b0c86b3e98dfe7820839586c41ecc94b9fdb6..6f9fb1a07a85c56a36651abb36ac7f454a716957 100755 --- a/src/dumpmodule.pike +++ b/src/dumpmodule.pike @@ -2,6 +2,17 @@ program p; +string fakeroot; + +class FakeMaster +{ + inherit "/master"; + string master_read_file(string s) + { + return ::master_read_file(fakeroot+combine_path_with_cwd(s)); + } +} + #define error(X) throw( ({ (X), backtrace()[0..sizeof(backtrace())-2] }) ) class Codec { @@ -100,6 +111,75 @@ void log(string file, int line, string err) logfile->write(sprintf("%s:%d:%s\n",file,line,err)); } +void dumpit(string file) +{ + if(!quiet) + werror(file +": "); + + mixed err=catch { + rm(file+".o"); // Make sure no old files are left + if(mixed s=file_stat(file)) + { + if(s[1]<=0) + { + werror("is a directory or special file.\n"); + break; + } + }else{ + if(!quiet) + werror("does not exist.\n"); + break; + } + if(programp(p=compile_file(file))) + { + string s=encode_value(p, Codec()); + p=decode_value(s,Codec()); + if(programp(p)) + { + Stdio.File(file + ".o","wct")->write(s); + switch(quiet) + { + case 1: werror("."); break; + case 0: werror("dumped.\n"); + } + }else{ + switch(quiet) + { + case 1: werror("i"); break; + case 0: werror("Decode of %O failed.\n", file); + } + } + }else{ + switch(quiet) + { + case 1: werror("!"); break; + case 0: werror("Compilation of %O failed.\n", file); + } + } + }; + if(err) + { +#ifdef ERRORS + err[0]="While dumping "+file+": "+err[0]; + werror(master()->describe_backtrace(err)); +#else + if(quiet) + { + if(quiet<2) + werror("X"); + if(logfile) + { + err[0]="While dumping "+file+": "+err[0]; + logfile->write("================================================\n"); + logfile->write(master()->describe_backtrace(err)); + } + }else{ + werror(err[0]); + } +#endif + } +} + int main(int argc, string *argv) { if(argv[1]=="--quiet") @@ -123,74 +203,15 @@ int main(int argc, string *argv) logfile=0; } + if(sscanf(argv[1],"--fakeroot=%s",fakeroot)) + { + argv=argv[1..]; + replace_master(FakeMaster()); + } + foreach(argv[1..],string file) - { - if(!quiet) - werror(file +": "); + dumpit(file); - mixed err=catch { - rm(file+".o"); // Make sure no old files are left - if(mixed s=file_stat(file)) - { - if(s[1]<=0) - { - werror("is a directory or special file.\n"); - break; - } - }else{ - if(!quiet) - werror("does not exist.\n"); - break; - } - if(programp(p=compile_file(file))) - { - string s=encode_value(p, Codec()); - p=decode_value(s,Codec()); - if(programp(p)) - { - Stdio.File(file + ".o","wct")->write(s); - switch(quiet) - { - case 1: werror("."); break; - case 0: werror("dumped.\n"); - } - }else{ - switch(quiet) - { - case 1: werror("i"); break; - case 0: werror("Decode of %O failed.\n", file); - } - } - }else{ - switch(quiet) - { - case 1: werror("!"); break; - case 0: werror("Compilation of %O failed.\n", file); - } - } - }; - if(err) - { -#ifdef ERRORS - err[0]="While dumping "+file+": "+err[0]; - werror(master()->describe_backtrace(err)); -#else - if(quiet) - { - if(quiet<2) - werror("X"); - if(logfile) - { - err[0]="While dumping "+file+": "+err[0]; - logfile->write("================================================\n"); - logfile->write(master()->describe_backtrace(err)); - } - }else{ - werror(err[0]); - } -#endif - } - } if(quiet==1) werror("\n"); }