Use update-alternatives for handling generic tool names
authorsven.panne@aedion.de <unknown>
Thu, 15 Mar 2007 15:28:23 +0000 (15:28 +0000)
committersven.panne@aedion.de <unknown>
Thu, 15 Mar 2007 15:28:23 +0000 (15:28 +0000)
ATTENTION: Packagers should read the following stuff carefully!

GHC, Hugs and nhc come with various tools like runhaskell or hsc2hs. On the
one hand this is quite handy, avoiding lots of tiny native packages, but OTOH
this leads to a few problems:

   * The tools are not always identical in functionality.

   * The tools fight for a global generic name like "/usr/bin/runhaskell".

These problems are not new and not unique to Haskell implementations, so for
*nix-based system there is a tool called update-alternatives which handles
those cases. The idea is as follows:

   * Each program/man page/etc. installs itself with a very specific name
     like /usr/bin/hsc2hs-ghc or /usr/share/man/man1/lua5.1.1.gz, so nothing
     clashes.

   * The (un-)installation scripts call update-alternatives to notify the
     system about new alternatives for a generic tool/manpage/etc.

   * Alternatives can be grouped together ("link groups"), so e.g. switching
     from Sun's Java to Kaffe switches compiler, JRE, manpages etc. together.
     Alas, this doesn't work well with the Haskell implementations yet,
     because they come with different sets of tools (in addition to runFOO):

       GHC:  hsc2hs
       Hugs: hsc2hs, cpphs
       nhc:  cpphs

     Either these tools should be disentangled fromt the Haskell
     implementations or all implementations should offer the same set.
     Opinions and recommendations on this topic are highly welcome.

   * This mechanism can be used to easily switch between several versions of
     the same implementation, too, but we are not yet fully prepared for that.

As a first step, GHC now installs hsc2hs as 'hsc2hs-ghc' and does *not*
install runhaskell directly anymore, only runghc. hsc2hs and runhaskell are
created via update-alternatives now. What is currently missing is a mechanism
for platforms like Windows and probably Mac OS X.

Makefile
ghc.spec.in
utils/hsc2hs/Makefile
utils/runghc/Makefile

index 19c05a3..1ffd36a 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -206,7 +206,7 @@ install-docs ::
 # 
 
 ifneq "$(TARGETPLATFORM)" "i386-unknown-mingw32"
-BinDistShScripts = ghc-$(ProjectVersion) ghci-$(ProjectVersion) ghc-pkg-$(ProjectVersion) hsc2hs
+BinDistShScripts = ghc-$(ProjectVersion) ghci-$(ProjectVersion) ghc-pkg-$(ProjectVersion) hsc2hs-ghc
 else
 BinDistShScripts =
 endif
@@ -214,7 +214,6 @@ endif
 BinDistPrlScripts = ghcprof
 BinDistLibPrlScripts = ghc-asm ghc-split
 BinDistBins = hp2ps runghc
-BinDistOptBins = runhaskell
 BinDistLinks = ghc ghci ghc-pkg
 BinDistLibSplicedFiles = package.conf
 BinDistDirs = includes compiler docs driver libraries rts utils
index c50e805..ed7a00d 100644 (file)
@@ -1,6 +1,6 @@
 # RPM spec file for GHC                                                 -*-rpm-spec-*-
 #
-# Copyright [1998..2004] The GHC Team
+# Copyright [1998..2007] The GHC Team
 #
 # Thanks to Zoltan Vorosbaranyi <vbzoli@vbzo.li> for suggestions in
 # earlier versions and Pixel <pixel@mandrakesoft.com> for coding tips.
@@ -21,8 +21,9 @@ Source0:        http://haskell.org/ghc/dist/%{version}/ghc-%{version}-src.tar.bz
 Source1:        http://haskell.org/ghc/dist/%{version}/ghc-%{version}-src-extralibs.tar.bz2
 Packager:       Sven Panne <sven.panne@aedion.de>
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
+PreReq:         update-alternatives
 Requires:       gmp, readline
-BuildRequires:  alex >= 2.0, happy >= 1.15, ghc >= 5, haddock, docbook-dtd, docbook-xsl-stylesheets, libxslt, libxml2, fop, xmltex, dvips, gmp, readline-devel, mesaglut-devel
+BuildRequires:  update-alternatives, alex >= 2.0, happy >= 1.15, ghc >= 5, haddock, docbook-dtd, docbook-xsl-stylesheets, libxslt, libxml2, fop, xmltex, dvips, gmp, readline-devel, mesaglut-devel
 Provides:       haskell
 Summary:        The Glasgow Haskell Compiler
 
@@ -113,6 +114,27 @@ cd $dir
 %clean
 rm -rf ${RPM_BUILD_ROOT}
 
+%post
+# Alas, GHC, Hugs and nhc all come with different set of tools in addition to
+# a runFOO:
+#
+#   * GHC:  hsc2hs
+#   * Hugs: hsc2hs, cpphs
+#   * nhc:  cpphs
+#
+# Therefore it is currently not possible to use --slave below to form link
+# groups under a single name 'runhaskell'. Either these tools should be
+# disentangled from the Haskell implementations or all implementations should
+# have the same set of tools. *sigh*
+update-alternatives --install %{_bindir}/runhaskell runhaskell %{_bindir}/runghc     500
+update-alternatives --install %{_bindir}/hsc2hs     hsc2hs     %{_bindir}/hsc2hs-ghc 500
+
+%preun
+if test "$1" = 0; then
+  update-alternatives --remove runhaskell %{_bindir}/runghc
+  update-alternatives --remove hsc2hs     %{_bindir}/hsc2hs-ghc
+fi
+
 %files -f rpm-noprof-lib-files
 %defattr(-,root,root)
 %doc docs/docbook-cheat-sheet/docbook-cheat-sheet
@@ -137,9 +159,8 @@ rm -rf ${RPM_BUILD_ROOT}
 %{_prefix}/bin/ghcprof
 %{_prefix}/bin/hasktags
 %{_prefix}/bin/hp2ps
-%{_prefix}/bin/hsc2hs
+%{_prefix}/bin/hsc2hs-ghc
 %{_prefix}/bin/runghc
-%{_prefix}/bin/runhaskell
 
 %files prof -f rpm-prof-lib-files
 %defattr(-,root,root)
index 7c34bba..88f3edb 100644 (file)
@@ -33,7 +33,7 @@ endif
 SRC_HC_OPTS      += -Wall
 
 ifneq "$(HOSTPLATFORM)" "i386-unknown-mingw32"
-INSTALLED_SCRIPT_PROG  = hsc2hs
+INSTALLED_SCRIPT_PROG  = hsc2hs-ghc
 endif
 INPLACE_SCRIPT_PROG    = hsc2hs-inplace
 
index c1a94c7..f210b00 100644 (file)
@@ -15,18 +15,4 @@ include $(GHC_COMPAT_DIR)/compat.mk
 # we must also build with $(GhcHcOpts) here:
 SRC_HC_OPTS += $(GhcHcOpts) $(GhcStage1HcOpts)
 
-all :: runhaskell
-
-runhaskell : $(HS_PROG)
-       $(CP) $< runhaskell$(exeext)
-
-CLEAN_FILES += runhaskell
-
-# Only install runhaskell if there isn't already one installed
-ifneq "$(findstring install, $(MAKECMDGOALS))" ""
-ifeq "$(wildcard $(bindir)/runhaskell)" ""
-INSTALL_PROGS += runhaskell$(exeext)
-endif
-endif
-
 include $(TOP)/mk/target.mk