octave-maintainers
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Issues with build Fedora RPMs of octave packages


From: David Bateman
Subject: Re: Issues with build Fedora RPMs of octave packages
Date: Sat, 22 Sep 2007 02:47:33 +0200
User-agent: Thunderbird 1.5.0.7 (X11/20060921)

David Bateman wrote:
>
> The comes to the same thing as the "-global" flag. However, thinking
> about it a bit more there are other issues. Consider the case of having
> a system installed octave package with some oct-files and at the same
> time having a different user installed package with some oct-files. The
> base name for the install directory will be different, but the user
> should expect that both sets of oct-files will be available if the
> packages are loaded. To me this means that the information to find the
> directories containing the oct-files must be code in the "descriptions"
> structure saved to the "octave_packages" file...
> 
> This then begs a new question, what exactly is the goal of having
> architecture dependent and independent directories at all? The logic
> seems to be that you can have one copy of the independent files and
> multiple copies of the architecture dependent files, one for each
> installation of which the version of octave is run. Therefore, I see
> three solutions
> 
> 1) The "octave-packages" file contains only the prefix for the location
> of the oct-files and getarch() is added to the end. In this case a
> better hierarchy would be
> 
> $(DESTDIR)/<libexec>/octave/packages/<package>/getarch()
> 
> though does that meet the FHS? This is my preferred solution as make the
> multiple architecture dependent installation would just involve copying
> the architecture dependent directory to the appropriate location.
> 
> 2) We have different "octave-package" files per architecture. with the
> paths to the oct-files hard-coded. I don't like this as it goes against
> the logic of having a single installation with mutliple architecture
> dependent directories.
> 
> 3) Have the "octave-packages" file contain multiple entries for the
> location of the architecture dependent files for each package; One for
> each architecture supported. This is not fundamentally different from
> 1), except that the installation process of mutliple architecture would
> need to have "octave_packages" modified and that should be done by
> "pkg", when in fact this stuff would better be dealt with by the
> distributions package manager...
> 
> I've not had much time to try and implement case 1), but will try over
> the weekend.. Any comments?
> 
>> would be sufficient for RPM packaging (assuming that the octave-forge
>> makefiles are changed to pass in this parameter).
> 
> If the next octave-forge is for 2.9.14 then we shouldn't change the
> octave-forge makefiles yet... Should we wait for an octave-forge release
> till this is settled?

What about the attached patch that implements 1) above. For the case of
Fedora in the build process, you'd specific the prefix to the
architecture dependent directory something like

pkg ("prefix",%prefix, %archprefix)

where archprefix is something like $(DESTDIR)/<libexec>/octave/packages,
the package name and architecture dependent directory name are added by
Octave. You can then proceed with the install as before.. This might
need a few changes to the octave-forge Makefiles to allow the ARCHDIR to
be passed to the Makefile, but it should be minor.

Orion if you are happy enough with this change then I can offer to
change write an appropriate rpm template and Makefile for the
octave-forge packages...


D.





> 
> 

*** ./scripts/pkg/pkg.m.orig2   2007-08-23 18:14:51.000000000 +0200
--- ./scripts/pkg/pkg.m 2007-09-22 02:36:01.022097578 +0200
***************
*** 116,121 ****
--- 116,128 ----
  ## @example
  ## p = pkg prefix
  ## @end example
+ ##
+ ## The location in which to install the architecture dependent files can be
+ ## independent specified with an addition argument. For example
+ ##
+ ## @example
+ ## pkg prefix ~/my_octave_packages ~/my_octave_packages_for_my_pc
+ ## @end example
  ## @item local_list
  ## Set the file in which to look for information on the locally
  ## installed packages. Locally installed packages are those that are
***************
*** 173,196 ****
    ## Installation prefix (XXX: what should these be on windows?)
    persistent user_prefix = false;
    persistent prefix = -1;
    persistent local_list = tilde_expand (fullfile("~", ".octave_packages"));
    persistent global_list = fullfile (OCTAVE_HOME (), "share", "octave",
                                     "octave_packages");
    mlock ();
  
!   if (ispc () && ! isunix ())
!     global_install = 1;
!   else
!     global_install = (geteuid() == 0);
!   endif
  
    if (prefix == -1)
      if (global_install)
        prefix = fullfile (OCTAVE_HOME (), "share", "octave", "packages");
      else
        prefix = fullfile ("~", "octave");
      endif
      prefix = tilde_expand (prefix);
    endif
  
    ## Handle input
--- 180,203 ----
    ## Installation prefix (XXX: what should these be on windows?)
    persistent user_prefix = false;
    persistent prefix = -1;
+   persistent archprefix = -1;
    persistent local_list = tilde_expand (fullfile("~", ".octave_packages"));
    persistent global_list = fullfile (OCTAVE_HOME (), "share", "octave",
                                     "octave_packages");
    mlock ();
  
!   global_install = issuperuser ();
  
    if (prefix == -1)
      if (global_install)
        prefix = fullfile (OCTAVE_HOME (), "share", "octave", "packages");
+       archprefix = fullfile (OCTAVE_HOME (), "libexec", "octave", "packages");
      else
        prefix = fullfile ("~", "octave");
+       archprefix = prefix;
      endif
      prefix = tilde_expand (prefix);
+     archprefix = tilde_expand (archprefix);
    endif
  
    ## Handle input
***************
*** 222,230 ****
        if (! user_prefix)
          prefix = fullfile (OCTAVE_HOME (), "share", "octave", "packages");
        endif
!       case {"list", "install", "uninstall", "load", "unload", ...
!           "prefix", "local_list", "global_list", "rebuild", "build"}
!       if (strcmp (action,"none"))
          action = varargin{i};
        else
          error ("more than one action specified");
--- 229,237 ----
        if (! user_prefix)
          prefix = fullfile (OCTAVE_HOME (), "share", "octave", "packages");
        endif
!       case {"list", "install", "uninstall", "load", "unload", "prefix", ...
!           "local_list", "global_list", "rebuild", "build"}
!       if (strcmp (action, "none"))
          action = varargin{i};
        else
          error ("more than one action specified");
***************
*** 252,258 ****
        if (length (files) == 0)
        error ("you must specify at least one filename when calling 'pkg 
install'");
        endif
!       install (files, deps, auto, prefix, verbose, local_list, 
               global_list, global_install);
  
      case "uninstall"
--- 259,265 ----
        if (length (files) == 0)
        error ("you must specify at least one filename when calling 'pkg 
install'");
        endif
!       install (files, deps, auto, prefix, archprefix, verbose, local_list, 
               global_list, global_install);
  
      case "uninstall"
***************
*** 276,292 ****
  
      case "prefix"
        if (length (files) == 0 && nargout == 0)
!       disp (prefix);
!       elseif (length (files) == 0 && nargout == 1)
        local_packages = prefix;
!       elseif (length (files) == 1 && nargout <= 1 && ischar (files{1}))
        prefix = files{1};
-       ## if (!strcmp(prefix(end), filesep))
-       ##   prefix(end+1) = filesep;
-       ## endif
        prefix = absolute_pathname (prefix);
        local_packages = prefix;
        user_prefix = true;
        else
        error ("you must specify a prefix directory, or request an output 
argument");
        endif
--- 283,309 ----
  
      case "prefix"
        if (length (files) == 0 && nargout == 0)
!       printf ("Installation prefix:             %s\n", prefix);
!       printf ("Architecture dependent prefix:   %s\n", archprefix);
!       elseif (length (files) == 0 && nargout >= 1)
        local_packages = prefix;
!       global_packages = archprefix;
!       elseif (length (files) >= 1 && nargout <= 2 && ischar (files{1}))
        prefix = files{1};
        prefix = absolute_pathname (prefix);
        local_packages = prefix;
        user_prefix = true;
+       if (length (files) >= 2 && ischar (files{2}))
+         archprefix = files{2};
+         try
+           archprefix = absolute_pathname (archprefix);
+           catch
+           mkdir (archprefix);
+           warning ("creating the directory %s\n", archprefix);
+           archprefix = absolute_pathname (archprefix);
+         end_try_catch
+         global_packages = archprefix;
+       endif
        else
        error ("you must specify a prefix directory, or request an output 
argument");
        endif
***************
*** 327,340 ****
  
      case "rebuild"
        if (global_install)
!       global_packages = rebuild (prefix, global_list, files, auto, verbose);
        global_packages = save_order (global_packages);
        save (global_list, "global_packages");
        if (nargout > 0)
          local_packages = global_packages;
        endif
        else
!       local_packages = rebuild (prefix, local_list, files, auto, verbose);
        local_packages = save_order (local_packages);
        save (local_list, "local_packages");
        if (nargout == 0)
--- 344,359 ----
  
      case "rebuild"
        if (global_install)
!       global_packages = rebuild (prefix, archprefix, global_list, files, 
!                                  auto, verbose);
        global_packages = save_order (global_packages);
        save (global_list, "global_packages");
        if (nargout > 0)
          local_packages = global_packages;
        endif
        else
!       local_packages = rebuild (prefix, archprefix, local_list, files, auto, 
!                                 verbose);
        local_packages = save_order (local_packages);
        save (local_list, "local_packages");
        if (nargout == 0)
***************
*** 353,359 ****
    endswitch
  endfunction
  
! function descriptions = rebuild (prefix, list, files, auto, verbose)
    if (isempty (files))
      [dirlist, err, msg] = readdir (prefix);
      if (err)
--- 372,378 ----
    endswitch
  endfunction
  
! function descriptions = rebuild (prefix, archprefix, list, files, auto, 
verbose)
    if (isempty (files))
      [dirlist, err, msg] = readdir (prefix);
      if (err)
***************
*** 380,385 ****
--- 399,406 ----
      if (exist (descfile, "file"))
        desc = get_description (descfile);
        desc.dir = fullfile (prefix, dirlist{k});
+       desc.archprefix = fullfile (archprefix, strcat (desc.name, "-",
+                                 desc.version));
        if (auto != 0)
        if (exist (fullfile (desc.dir, "packinfo", ".autoload"), "file"))
          unlink (fullfile (desc.dir, "packinfo", ".autoload"));
***************
*** 450,456 ****
    endif
    files(1) = [];
    buildlist = fullfile (builddir, "octave_packages");
!   install (files, handle_deps, autoload, installdir, verbose, 
           buildlist, "", false);
    unwind_protect
      repackage (builddir, buildlist);
--- 471,477 ----
    endif
    files(1) = [];
    buildlist = fullfile (builddir, "octave_packages");
!   install (files, handle_deps, autoload, installdir, installdir, verbose, 
           buildlist, "", false);
    unwind_protect
      repackage (builddir, buildlist);
***************
*** 465,471 ****
    end_unwind_protect
  endfunction
  
! function install (files, handle_deps, autoload, prefix, verbose, local_list, 
global_list, global_install)
  
    # Check that the directory in prefix exist. If it doesn't: create it!
    if (! exist (prefix, "dir"))
--- 486,493 ----
    end_unwind_protect
  endfunction
  
! function install (files, handle_deps, autoload, prefix, archprefix, verbose, 
!                 local_list, global_list, global_install)
  
    # Check that the directory in prefix exist. If it doesn't: create it!
    if (! exist (prefix, "dir"))
***************
*** 491,497 ****
    ## Uncompress the packages and read the DESCRIPTION files
    tmpdirs = packdirs = descriptions = {};
    try
- 
      ## Warn about non existent files 
      for i = 1:length (files)
        if (isempty (glob(files{i}))) 
--- 513,518 ----
***************
*** 549,560 ****
          [dummy, nm] = fileparts (tgz); 
          if ((length (nm) >= length (desc.name))
              && ! strcmp (desc.name, nm(1:length(desc.name))))
!           error ("package name '%s' doesn't correspond to its filename '%s'", 
desc.name, nm);
          endif
  
          ## Set default installation directory
          desc.dir = fullfile (prefix, strcat (desc.name, "-", desc.version));
  
          ## Save desc
          descriptions{end+1} = desc;
  
--- 570,586 ----
          [dummy, nm] = fileparts (tgz); 
          if ((length (nm) >= length (desc.name))
              && ! strcmp (desc.name, nm(1:length(desc.name))))
!           error ("package name '%s' doesn't correspond to its filename '%s'", 
!                  desc.name, nm);
          endif
  
          ## Set default installation directory
          desc.dir = fullfile (prefix, strcat (desc.name, "-", desc.version));
  
+         ## Set default architectire dependent installation directory
+         desc.archprefix = fullfile (archprefix, strcat (desc.name, "-",
+                                                         desc.version));
+ 
          ## Save desc
          descriptions{end+1} = desc;
  
***************
*** 656,665 ****
      for i = 1:length (descriptions)
        desc = descriptions{i};
        pdir = packdirs{i};
!       copy_files (desc, pdir);
!       create_pkgadddel (desc, pdir, "PKG_ADD");
!       create_pkgadddel (desc, pdir, "PKG_DEL");
!       finish_installation (desc, pdir)
      endfor
    catch
      ## Something went wrong, delete tmpdirs
--- 682,691 ----
      for i = 1:length (descriptions)
        desc = descriptions{i};
        pdir = packdirs{i};
!       copy_files (desc, pdir, global_install);
!       create_pkgadddel (desc, pdir, "PKG_ADD", global_install);
!       create_pkgadddel (desc, pdir, "PKG_DEL", global_install);
!       finish_installation (desc, pdir, global_install)
      endfor
    catch
      ## Something went wrong, delete tmpdirs
***************
*** 668,673 ****
--- 694,700 ----
      endfor
      for i = 1:length (descriptions)
        rm_rf (descriptions{i}.dir);
+       rm_rf (getarchdir (descriptions{i}));
      endfor
      rethrow (lasterror ());
    end_try_catch
***************
*** 675,683 ****
    ## Check if the installed directory is empty. If it is remove it
    ## from the list
    for i = length (descriptions):-1:1
!     if (dirempty (descriptions{i}.dir, {"packinfo", "doc"}))
        warning ("package %s is empty\n", descriptions{i}.name);
        rm_rf (descriptions{i}.dir);
        descriptions(i) = [];
      endif
    endfor
--- 702,712 ----
    ## Check if the installed directory is empty. If it is remove it
    ## from the list
    for i = length (descriptions):-1:1
!     if (dirempty (descriptions{i}.dir, {"packinfo", "doc"}) &&
!       dirempty (getarchdir (descriptions{i})))
        warning ("package %s is empty\n", descriptions{i}.name);
        rm_rf (descriptions{i}.dir);
+       rm_rf (getarchdir (descriptions{i}));
        descriptions(i) = [];
      endif
    endfor
***************
*** 738,744 ****
        idx (end + 1) = i;
        endif
      endfor
!     load_packages_and_dependencies (idx, handle_deps, installed_pkgs_lst);
    endif
  endfunction
  
--- 767,774 ----
        idx (end + 1) = i;
        endif
      endfor
!     load_packages_and_dependencies (idx, handle_deps, installed_pkgs_lst,
!                                   global_install);
    endif
  endfunction
  
***************
*** 826,833 ****
      ## Do the actual deletion
      if (desc.loaded)
        rmpath (desc.dir);
!       if (exist (fullfile (desc.dir, getarch()), "dir"))
!       rmpath (fullfile (desc.dir, getarch ()));
        endif
      endif
      if (exist (desc.dir, "dir"))
--- 856,863 ----
      ## Do the actual deletion
      if (desc.loaded)
        rmpath (desc.dir);
!       if (exist (getarchdir (desc)))
!       rmpath (getarchdir (desc));
        endif
      endif
      if (exist (desc.dir, "dir"))
***************
*** 835,840 ****
--- 865,877 ----
        if (status != 1)
        error ("couldn't delete directory %s: %s", desc.dir, msg);
        endif
+       [status, msg] = rm_rf (getarchdir (desc));
+       if (status != 1)
+       error ("couldn't delete directory %s: %s", getarchdir (desc), msg);
+       endif
+       if (dirempty (desc.archprefix))
+       rm_rf (desc.archprefix);
+       endif
      else
        warning ("directory %s previously lost", desc.dir);
      endif
***************
*** 894,900 ****
        if (exist (fullfile (pack.name, "inst", "bin"), "dir"))
        movefile (fullfile (pack.name, "inst", "bin"), pack.name);
        endif
!       archdir = fullfile (pack.name, "inst", getarch ());
        if (exist (archdir, "dir"))
        if (exist (fullfile (pack.name, "inst", "PKG_ADD"), "file"))
          unlink (fullfile (pack.name, "inst", "PKG_ADD"));
--- 931,938 ----
        if (exist (fullfile (pack.name, "inst", "bin"), "dir"))
        movefile (fullfile (pack.name, "inst", "bin"), pack.name);
        endif
!       archdir = fullfile (pack.archprefix, strcat (pack.name, "-",
!                         pack.version), getarch ());
        if (exist (archdir, "dir"))
        if (exist (fullfile (pack.name, "inst", "PKG_ADD"), "file"))
          unlink (fullfile (pack.name, "inst", "PKG_ADD"));
***************
*** 1123,1138 ****
    endif
  endfunction
  
! function create_pkgadddel (desc, packdir, nm)
    instpkg = fullfile (desc.dir, nm);
    instfid = fopen (instpkg, "wt");
    ## If it is exists, most of the  PKG_* file should go into the 
    ## architecture dependent directory so that the autoload/mfilename 
    ## commands work as expected. The only part that doesn't is the
    ## part in the main directory.
!   if (exist (fullfile (desc.dir, getarch ()), "dir"))
!     archpkg = fullfile (desc.dir, getarch (), nm);
!     archfid = fopen (archpkg, "wt");
    else
      archpkg = instpkg;
      archfid = instfid;
--- 1161,1178 ----
    endif
  endfunction
  
! function create_pkgadddel (desc, packdir, nm, global_install)
    instpkg = fullfile (desc.dir, nm);
    instfid = fopen (instpkg, "wt");
    ## If it is exists, most of the  PKG_* file should go into the 
    ## architecture dependent directory so that the autoload/mfilename 
    ## commands work as expected. The only part that doesn't is the
    ## part in the main directory.
!   archdir = fullfile (getarchprefix (desc), strcat (desc.name, "-",
!                     desc.version), getarch ());
!   if (exist (getarchdir (desc, global_install), "dir"))
!     archpkg = fullfile (getarchdir (desc, global_install), nm);
!     archfid = fopen (archpkg, "at");
    else
      archpkg = instpkg;
      archfid = instfid;
***************
*** 1186,1192 ****
    endif
  endfunction
  
! function copy_files (desc, packdir, bindir)
    ## Create the installation directory
    if (! exist (desc.dir, "dir"))
      [status, output] = mkdir (desc.dir);
--- 1226,1232 ----
    endif
  endfunction
  
! function copy_files (desc, packdir, global_install)
    ## Create the installation directory
    if (! exist (desc.dir, "dir"))
      [status, output] = mkdir (desc.dir);
***************
*** 1196,1201 ****
--- 1236,1243 ----
      endif
    endif
  
+   octfiledir = getarchdir (desc);
+ 
    ## Copy the files from "inst" to installdir
    instdir = fullfile (packdir, "inst");
    if (! dirempty (instdir))
***************
*** 1204,1209 ****
--- 1246,1300 ----
        rm_rf (desc.dir);
        error ("couldn't copy files to the installation directory");
      endif
+     if (exist (fullfile (desc.dir, getarch ()), "dir") &&
+       ! strcmp (fullfile (desc.dir, getarch ()), octfiledir))
+       if (! exist (octfiledir, "dir"))
+         ## Can be required to create upto three levels of dirs
+         octm1 = fileparts (octfiledir);
+         if (! exist (octm1, "dir"))
+           octm2 = fileparts (octm1);
+           if (! exist (octm2, "dir"))
+             octm3 = fileparts (octm2);
+             if (! exist (octm3, "dir"))
+               [status, output] = mkdir (octm3);
+               if (status != 1)
+                 rm_rf (desc.dir);
+                 error ("couldn't create installation directory %s : %s", 
+                        octm3, output);
+               endif
+             endif
+             [status, output] = mkdir (octm2);
+             if (status != 1)
+               rm_rf (desc.dir);
+               error ("couldn't create installation directory %s : %s", 
+                      octm2, output);
+             endif
+           endif
+           [status, output] = mkdir (octm1);
+           if (status != 1)
+             rm_rf (desc.dir);
+             error ("couldn't create installation directory %s : %s", 
+                    octm1, output);
+           endif
+         endif
+         [status, output] = mkdir (octfiledir);
+         if (status != 1)
+           rm_rf (desc.dir);
+           error ("couldn't create installation directory %s : %s", 
+           octfiledir, output);
+         endif
+       endif
+       [status, output] = movefile (fullfile (desc.dir, getarch (), "*"), 
+                                  octfiledir);
+       rm_rf (fullfile (desc.dir, getarch ()));
+ 
+       if (status != 1)
+         rm_rf (desc.dir);
+         rm_rf (octfiledir);
+         error ("couldn't copy files to the installation directory");
+       endif
+     endif
+ 
    endif
  
    ## Create the "packinfo" directory
***************
*** 1211,1231 ****
    [status, msg] = mkdir (packinfo);
    if (status != 1)
      rm_rf (desc.dir);
      error ("couldn't create packinfo directory: %s", msg);
    endif
  
    ## Copy DESCRIPTION
    [status, output] = copyfile (fullfile (packdir, "DESCRIPTION"), packinfo);
    if (status != 1)
!    rm_rf (desc.dir);
!    error ("couldn't copy DESCRIPTION: %s", output);
    endif
  
    ## Copy COPYING
    [status, output] = copyfile (fullfile (packdir, "COPYING"), packinfo);
    if (status != 1)
!    rm_rf (desc.dir);
!    error ("couldn't copy COPYING: %s", output);
    endif
  
    ## If the file ChangeLog exists, copy it
--- 1302,1325 ----
    [status, msg] = mkdir (packinfo);
    if (status != 1)
      rm_rf (desc.dir);
+     rm_rf (octfiledir);
      error ("couldn't create packinfo directory: %s", msg);
    endif
  
    ## Copy DESCRIPTION
    [status, output] = copyfile (fullfile (packdir, "DESCRIPTION"), packinfo);
    if (status != 1)
!     rm_rf (desc.dir);
!     rm_rf (octfiledir);
!     error ("couldn't copy DESCRIPTION: %s", output);
    endif
  
    ## Copy COPYING
    [status, output] = copyfile (fullfile (packdir, "COPYING"), packinfo);
    if (status != 1)
!     rm_rf (desc.dir);
!     rm_rf (octfiledir);
!     error ("couldn't copy COPYING: %s", output);
    endif
  
    ## If the file ChangeLog exists, copy it
***************
*** 1234,1239 ****
--- 1328,1334 ----
      [status, output] = copyfile (fChangeLog, packinfo);
      if (status != 1)
        rm_rf (desc.dir);
+       rm_rf (octfiledir);
        error ("couldn't copy ChangeLog file: %s", output);
      endif
    endif
***************
*** 1244,1257 ****
      [status, output] = copyfile (fINDEX, packinfo);
      if (status != 1)
        rm_rf (desc.dir);
        error ("couldn't copy INDEX file: %s", output);
      endif
    else
      try
        write_INDEX (desc, fullfile (packdir, "inst"),
!                  fullfile (packinfo, "INDEX"));
      catch
        rm_rf (desc.dir);
        rethrow (lasterror ());
      end_try_catch
    endif
--- 1339,1354 ----
      [status, output] = copyfile (fINDEX, packinfo);
      if (status != 1)
        rm_rf (desc.dir);
+       rm_rf (octfiledir);
        error ("couldn't copy INDEX file: %s", output);
      endif
    else
      try
        write_INDEX (desc, fullfile (packdir, "inst"),
!                  fullfile (packinfo, "INDEX"), global_install);
      catch
        rm_rf (desc.dir);
+       rm_rf (octfiledir);
        rethrow (lasterror ());
      end_try_catch
    endif
***************
*** 1262,1267 ****
--- 1359,1365 ----
      [status, output] = copyfile (fon_uninstall, packinfo);
      if (status != 1)
        rm_rf (desc.dir);
+       rm_rf (octfiledir);
        error ("couldn't copy on_uninstall.m: %s", output);
      endif
    endif
***************
*** 1269,1285 ****
    ## Is there a doc/ directory that needs to be installed
    docdir = fullfile (packdir, "doc");
    if (exist (docdir, "dir") && ! dirempty (docdir))
!    [status, output] = copyfile (docdir, desc.dir);
    endif
  
    ## Is there a bin/ directory that needs to be installed
    bindir = fullfile (packdir, "bin");
    if (exist (bindir, "dir") && ! dirempty (bindir))
!    [status, output] = copyfile (bindir, desc.dir);
    endif
  endfunction
  
! function finish_installation (desc, packdir)
    ## Is there a post-install to call?
    if (exist (fullfile (packdir, "post_install.m"), "file"))
      wd = pwd ();
--- 1367,1383 ----
    ## Is there a doc/ directory that needs to be installed
    docdir = fullfile (packdir, "doc");
    if (exist (docdir, "dir") && ! dirempty (docdir))
!     [status, output] = copyfile (docdir, desc.dir);
    endif
  
    ## Is there a bin/ directory that needs to be installed
    bindir = fullfile (packdir, "bin");
    if (exist (bindir, "dir") && ! dirempty (bindir))
!     [status, output] = copyfile (bindir, desc.dir);
    endif
  endfunction
  
! function finish_installation (desc, packdir, global_install)
    ## Is there a post-install to call?
    if (exist (fullfile (packdir, "post_install.m"), "file"))
      wd = pwd ();
***************
*** 1290,1295 ****
--- 1388,1394 ----
      catch
        cd (wd);
        rm_rf (desc.dir);
+       rm_rf (getarchdir (desc), global_install);
        rethrow (lasterror ());
      end_try_catch
    endif
***************
*** 1470,1476 ****
  ##   'desc'  describes the package.
  ##   'dir'   is the 'inst' direcotyr in temporary directory.
  ##   'INDEX' is the name (including path) of resulting INDEX file.
! function write_INDEX (desc, dir, INDEX)
    ## Get names of functions in dir
    [files, err, msg] = readdir (dir);
    if (err)
--- 1569,1575 ----
  ##   'desc'  describes the package.
  ##   'dir'   is the 'inst' direcotyr in temporary directory.
  ##   'INDEX' is the name (including path) of resulting INDEX file.
! function write_INDEX (desc, dir, INDEX, global_install)
    ## Get names of functions in dir
    [files, err, msg] = readdir (dir);
    if (err)
***************
*** 1478,1485 ****
    endif
  
    ## Check for architecture dependent files
!   arch = getarch();
!   tmpdir = fullfile (dir, arch);
    if (exist (tmpdir, "dir"))
      [files2, err, msg] = readdir (tmpdir);
      if (err)
--- 1577,1583 ----
    endif
  
    ## Check for architecture dependent files
!   tmpdir = getarchdir (desc);
    if (exist (tmpdir, "dir"))
      [files2, err, msg] = readdir (tmpdir);
      if (err)
***************
*** 1718,1724 ****
    endif
  
    ## Load the packages, but take care of the ordering of dependencies
!   load_packages_and_dependencies (idx, handle_deps, installed_pkgs_lst);
  endfunction
  
  function unload_packages (files, handle_deps, local_list, global_list)
--- 1816,1822 ----
    endif
  
    ## Load the packages, but take care of the ordering of dependencies
!   load_packages_and_dependencies (idx, handle_deps, installed_pkgs_lst, true);
  endfunction
  
  function unload_packages (files, handle_deps, local_list, global_list)
***************
*** 1739,1773 ****
    ## unload all
    if (length (files) == 1 && strcmp (files{1}, "all"))
        dirs = pdirs;
    ## unload package_name1 ...
    else
      dirs = {};
      for i = 1:length (files)
!       idx = strcmp (pnames, files{i});
        if (! any (idx))
        error ("package %s is not installed", files{i});
        endif
!       dirs{end+1} = pdirs{idx};
        endfor
    endif
  
    ## Check for architecture dependent directories
-   arch = getarch();
    archdirs = {};
    for i = 1:length (dirs)
!     tmpdir = fullfile (dirs{i}, arch);
      if (exist (tmpdir, "dir"))
        archdirs{end + 1} = dirs{i};
        archdirs{end + 1} = tmpdir;
      endif
    endfor
-   if (length (archdirs) > 0)
-     dirs = archdirs;
-   endif
  
    ## Unload the packages
!   for i = 1:length (dirs)
!     d = dirs{i};
      idx = strcmp (p, d);
      if (any (idx))
        rmpath (d);
--- 1837,1872 ----
    ## unload all
    if (length (files) == 1 && strcmp (files{1}, "all"))
        dirs = pdirs;
+       desc = installed_pkgs_lst;
    ## unload package_name1 ...
    else
      dirs = {};
+     desc = {};
      for i = 1:length (files)
!       idx = strcmp (pnames, files {i});
        if (! any (idx))
        error ("package %s is not installed", files{i});
        endif
!       dirs {end + 1} = pdirs {idx};
!         desc {end + 1} = installed_pkgs_lst {idx};
        endfor
    endif
  
    ## Check for architecture dependent directories
    archdirs = {};
    for i = 1:length (dirs)
!     tmpdir = getarchdir (desc {i});
      if (exist (tmpdir, "dir"))
        archdirs{end + 1} = dirs{i};
        archdirs{end + 1} = tmpdir;
+     else
+       archdirs{end+ 1} = dirs {i};
      endif
    endfor
  
    ## Unload the packages
!   for i = 1:length (archdirs)
!     d = archdirs{i};
      idx = strcmp (p, d);
      if (any (idx))
        rmpath (d);
***************
*** 1777,1789 ****
  endfunction
  
  function [status_out, msg_out] = rm_rf (dir)
!   crr = confirm_recursive_rmdir ();
!   unwind_protect
!     confirm_recursive_rmdir (false);
!     [status, msg] = rmdir (dir, "s");
!   unwind_protect_cleanup
!     confirm_recursive_rmdir (crr);
!   end_unwind_protect
    if (nargout > 0)
      status_out = status;
    endif
--- 1876,1893 ----
  endfunction
  
  function [status_out, msg_out] = rm_rf (dir)
!   if (exist (dir))
!     crr = confirm_recursive_rmdir ();
!     unwind_protect
!       confirm_recursive_rmdir (false);
!       [status, msg] = rmdir (dir, "s");
!     unwind_protect_cleanup
!       confirm_recursive_rmdir (crr);
!     end_unwind_protect
!   else
!     status = 1;
!     msg = "";
!   endif
    if (nargout > 0)
      status_out = status;
    endif
***************
*** 1793,1818 ****
  endfunction
  
  function emp = dirempty (nm, ign)
!   if (nargin < 2)
!     ign = {".", ".."};
!   else
!     ign = [{".", ".."}, ign];
!   endif
!   l = dir (nm);
!   for i = 1:length (l)
!     found = false;
!     for j = 1:length (ign)
!       if (strcmp (l(i).name, ign{j}))
!         found = true;
!         break;
        endif
      endfor
!     if (! found)
!       emp = false;
!       return
!     endif
!   endfor
!   emp = true;
  endfunction
  
  function arch = getarch ()
--- 1897,1926 ----
  endfunction
  
  function emp = dirempty (nm, ign)
!   if (exist (nm, "dir"))
!     if (nargin < 2)
!       ign = {".", ".."};
!     else
!       ign = [{".", ".."}, ign];
!     endif
!     l = dir (nm);
!     for i = 1:length (l)
!       found = false;
!       for j = 1:length (ign)
!         if (strcmp (l(i).name, ign{j}))
!           found = true;
!           break;
!         endif
!       endfor
!       if (! found)
!         emp = false;
!         return
        endif
      endfor
!     emp = true;
!   else
!     emp = true;
!   endif
  endfunction
  
  function arch = getarch ()
***************
*** 1821,1826 ****
--- 1929,1955 ----
    arch = _arch;
  endfunction
  
+ function archprefix = getarchprefix (desc, global_install)
+   if ((nargin == 2 && global_install) || (nargin < 2 && issuperuser ()))
+     archprefix = fullfile (octave_config_info ("libexecdir"), "octave", 
+                          "packages", strcat(desc.name, "-", desc.version));
+   else
+     archprefix = desc.dir;
+   endif
+ endfunction
+ 
+ function archdir = getarchdir (desc)
+   archdir = fullfile (desc.archprefix, getarch());
+ endfunction
+ 
+ function s = issuperuser ()
+   if ((ispc () && ! isunix ()) || (geteuid() == 0))
+     s = true;
+   else
+     s = false;
+   endif
+ endfunction
+ 
  function [status, output] = shell (cmd)
    persistent have_sh;
  
***************
*** 1879,1887 ****
    newdesc(idx) = [];
  endfunction
  
! function load_packages_and_dependencies (idx, handle_deps, installed_pkgs_lst)
    idx = load_package_dirs (idx, [], handle_deps, installed_pkgs_lst);
-   arch = getarch ();
    dirs = {};
    execpath = EXEC_PATH ();
    for i = idx;
--- 2008,2016 ----
    newdesc(idx) = [];
  endfunction
  
! function load_packages_and_dependencies (idx, handle_deps, installed_pkgs_lst,
!                                        global_install)
    idx = load_package_dirs (idx, [], handle_deps, installed_pkgs_lst);
    dirs = {};
    execpath = EXEC_PATH ();
    for i = idx;
***************
*** 1890,1896 ****
      if (exist (fullfile (dirs{end}, "bin"), "dir"))
        execpath = strcat (fullfile(dirs{end}, "bin"), ":", execpath);
      endif
!     tmpdir = fullfile (ndir, arch);
      if (exist (tmpdir, "dir"))
        dirs{end + 1} = tmpdir;
      endif
--- 2019,2025 ----
      if (exist (fullfile (dirs{end}, "bin"), "dir"))
        execpath = strcat (fullfile(dirs{end}, "bin"), ":", execpath);
      endif
!     tmpdir = getarchdir (installed_pkgs_lst {i});
      if (exist (tmpdir, "dir"))
        dirs{end + 1} = tmpdir;
      endif
2007-09-21  David Bateman  <address@hidden>

        * pkg/pkg.m: Add second argument to setting for prefix for
        architecture dependent files. Use throughout.
        (pkg:issuperuser): New function, use through to check for
        root user.
        (pkg:getarchprefix): function to give the archiecture dependent
        prefix for a package.
        (pkg:getarchdir): New function giving location of architetcure
        dependent directory. Use through out.
        (pkg:install): Treat architecture dependent directory separately
        as in might not be a sub-directory of the package directory.
        (pkg:uninstall): ditto.
        (pkg:create_pkgadddel): Check for global or local install for
        architecture dependent directory.
        (pkg:finish_installation): ditto.
        (pkg:write_INDEX): ditto.
        (pkg:load_packages_and_dependencies): ditto.
        (pkg:copy_files): ditto. Add step to copy architecture dependent
        files to a new location if user is root.
        (pkg:rm_rf): Check if file or directory exists before removing.
        (pkg:dirempty): Check if directory exists before checking.
        
        

reply via email to

[Prev in Thread] Current Thread [Next in Thread]