[Hackage] #688: adopt XDG basedir spec

Hackage cvs-ghc at haskell.org
Fri May 28 07:10:30 EDT 2010


#688: adopt XDG basedir spec
---------------------------------+------------------------------------------
  Reporter:  guest               |        Owner:         
      Type:  enhancement         |       Status:  new    
  Priority:  low                 |    Milestone:         
 Component:  cabal-install tool  |      Version:  1.8.0.4
  Severity:  normal              |     Keywords:         
Difficulty:  hard (< 1 day)      |   Ghcversion:  6.10.4 
  Platform:  Linux               |  
---------------------------------+------------------------------------------

Comment(by Syzygies):

 I found this ticket while researching precedents for a related question.

 For various reasons I like to build multiple versions of GHC side by side:
 Migration between major releases, testing candidate releases. For torture-
 testing new hardware, building many copies of GHC at once is better than
 e.g. the usual prime testing. I once literally caused a server power
 supply to smoke this way; my friend's hardware vendor was in over their
 head. They took my GHC test in-house to minimize delivery cycles.

 A related piece of de facto convention comes up here: It is crazy to
 sprinkle pieces of a system like GHC into separate global locations like
 /usr/local/bin, /usr/local/share, unless one will only ever use one
 version, with no desire to look under the hood or move the installation.
 In other words, I have no issue with Linux or OS X shipping this way, but
 major additions should be localized by default. Some are, e.g. TeX. GHC
 should.

 Fortunately, to avoid Siamese twin installations with accidentally shared
 parts, one can use the ./configure --prefix option while building GHC.
 Then, it becomes apparent that "cabal install" is the remaining holdout to
 ideal version localization. There is a perfect storm of tiny factors
 keeping Cabal from gracefully localizing. I wanted to elicit advice before
 contributing a fix; this ticket seems to have touched on a key issue.

 I did not know about the "--config-file=..." command-line option; I will
 start using it in scripts. However, we need a better default for global
 installs.

 In /usr/local I now use a symbolic link from ghc to one of the directories
 ghc-6.10.4, ghc-6.12.1, ghc-6.12.2, ghc-6.12.3-rc1. It then appears that I
 built GHC using "--prefix=/usr/local/ghc". My ~/.cabal/config file
 includes lines like "remote-repo-cache: /usr/local/ghc/packages". This
 works, but I've had amusing debates with unix experts on why my symbolic
 link is a terrible solution. Basically, when I change this link I pull the
 rug out from under any ongoing process that wants to see a consistent
 environment.

 Environment variables are one "right" way to handle this. In short, a
 symbolic link is like changing state, while environment variables are like
 functional programming.

 However, not only does .cabal/config fail to allow external environment
 variables, it doesn't allow forms like one sees in its own comments. (Who
 reads documentation? We all read sample code.) For example, even though I
 see the comment "-- bindir: $prefix/bin" I cannot write "remote-repo-
 cache: $prefix/packages". I would prefer to be able to write anything that
 would evaluate correctly in a shell to an absolute path, e.g. `which ghc`
 or `perl -pe ...` and so forth.

 Ideally, a global install would by default use a global location for the
 Cabal config file, but we slam back into the original problem: By default
 the global install of GHC did not use the --prefix option, so there is no
 well-defined location parametrized by the version of GHC. On the other
 hand, this isn't so bad, e.g. put everything in
 ../share/hackage.haskell.org relative to the currently visible ghc. Saves
 bandwidth caching packages; if someone hasn't bothered to build ghc using
 --prefix, they won't mind the Siamese twin effects with Cabal either.

 The simplest change that would help my issue would be to allow both
 absolute and relative paths in .cabal/install, with a relative path
 relative to the location of `which ghc`. This would "just work" in simple
 cases, and allow competing processes to coexist, that chose different
 versions of ghc via a custom $PATH alone, with no other flags needed. If
 this change was accepted, I wouldn't mind leaving my config file in
 ~/.cabal. That location is only mildly annoying; as has been noted, we've
 already lost the war on keeping that area uncluttered.

 However, it just shouldn't matter which authorized user works on a global
 install. Relying on ~/.cabal/config for a global install should be viewed
 as a bug, as it prevents several admins from cooperating in consistently
 maintaining GHC on a shared system.

-- 
Ticket URL: <http://hackage.haskell.org/trac/hackage/ticket/688#comment:6>
Hackage <http://haskell.org/cabal/>
Hackage: Cabal and related projects



More information about the cabal-devel mailing list