summaryrefslogtreecommitdiff
path: root/distrib
diff options
context:
space:
mode:
authorIan Lynagh <igloo@earth.li>2010-10-22 22:31:04 +0000
committerIan Lynagh <igloo@earth.li>2010-10-22 22:31:04 +0000
commit280bd5bb982cf7526ce01a5344f2fe669d55d076 (patch)
tree11cf07459b19f940bf28860be50b4772f72fbd0f /distrib
parente646bb2961a7250915e519e7852fecdb3f86cc15 (diff)
downloadhaskell-280bd5bb982cf7526ce01a5344f2fe669d55d076.tar.gz
Improve the OS X installer
Major changes are: * Version number now includes full GHC version and arch * Uninstaller copes with multiple versions
Diffstat (limited to 'distrib')
-rw-r--r--distrib/MacOS/GHC-relocatable.pmdoc/01ghc.xml2
-rw-r--r--distrib/MacOS/GHC-system.pmdoc/01ghc.xml2
-rw-r--r--distrib/MacOS/GHC-system.pmdoc/index.xml.in (renamed from distrib/MacOS/GHC-system.pmdoc/index.xml)2
-rw-r--r--distrib/MacOS/GHC.xcodeproj/project.pbxproj4
-rw-r--r--distrib/MacOS/Makefile20
-rw-r--r--distrib/MacOS/installer-scripts/Uninstaller75
-rw-r--r--distrib/MacOS/installer-scripts/Uninstaller.in91
-rw-r--r--distrib/MacOS/installer-scripts/create-links.in6
8 files changed, 110 insertions, 92 deletions
diff --git a/distrib/MacOS/GHC-relocatable.pmdoc/01ghc.xml b/distrib/MacOS/GHC-relocatable.pmdoc/01ghc.xml
index a4142538ad..6ad037d825 100644
--- a/distrib/MacOS/GHC-relocatable.pmdoc/01ghc.xml
+++ b/distrib/MacOS/GHC-relocatable.pmdoc/01ghc.xml
@@ -1 +1 @@
-<pkgref spec="1.12" uuid="FD3688D8-0443-4DCE-A3BB-F4A8EF12A4AB"><config><identifier>org.haskell.ghc.pkg</identifier><version>1</version><description></description><post-install type="none"/><installFrom relative="true" mod="true" includeRoot="true">build/Release/GHC.framework</installFrom><installTo relocatable="true">/Library/Frameworks</installTo><flags><followSymbolicLinks/></flags><packageStore type="internal"></packageStore><mod>parent</mod><mod>scripts.postinstall.path</mod><mod>requireAuthorization</mod><mod>scripts.scriptsDirectoryPath.isRelativeType</mod><mod>scripts.postinstall.isRelativeType</mod><mod>installTo.isRelativeType</mod><mod>scripts.postinstall.isAbsoluteType</mod><mod>relocatable</mod><mod>installFrom.isRelativeType</mod><mod>installFrom.path</mod><mod>installTo</mod></config><scripts><postinstall relative="true" mod="true">installer-scripts/relocate</postinstall><scripts-dir relative="true" mod="true">installer-scripts</scripts-dir></scripts><contents><component id="org.haskell.GHC" path="/Users/chak/Code/ghc/distrib/MacOS/build/Release/GHC.framework" version="609.20071208"/><filter>/CVS$</filter><filter>/\.svn$</filter><filter>/\.cvsignore$</filter><filter>/\.cvspass$</filter><filter>/\.DS_Store$</filter></contents></pkgref> \ No newline at end of file
+<pkgref spec="1.12" uuid="FD3688D8-0443-4DCE-A3BB-F4A8EF12A4AB"><config><identifier>org.haskell.ghc.pkg</identifier><version>1</version><description></description><post-install type="none"/><installFrom relative="true" mod="true" includeRoot="true">build/Release/GHC.framework</installFrom><installTo relocatable="true">/Library/Frameworks</installTo><flags><followSymbolicLinks/></flags><packageStore type="internal"></packageStore><mod>parent</mod><mod>scripts.postinstall.path</mod><mod>requireAuthorization</mod><mod>scripts.scriptsDirectoryPath.isRelativeType</mod><mod>scripts.postinstall.isRelativeType</mod><mod>installTo.isRelativeType</mod><mod>scripts.postinstall.isAbsoluteType</mod><mod>relocatable</mod><mod>installFrom.isRelativeType</mod><mod>installFrom.path</mod><mod>installTo</mod></config><scripts><postinstall relative="true" mod="true">installer-scripts/relocate</postinstall><scripts-dir relative="true" mod="true">installer-scripts</scripts-dir></scripts><contents><component id="org.haskell.ghc" path="/Users/chak/Code/ghc/distrib/MacOS/build/Release/GHC.framework" version="609.20071208"/><filter>/CVS$</filter><filter>/\.svn$</filter><filter>/\.cvsignore$</filter><filter>/\.cvspass$</filter><filter>/\.DS_Store$</filter></contents></pkgref> \ No newline at end of file
diff --git a/distrib/MacOS/GHC-system.pmdoc/01ghc.xml b/distrib/MacOS/GHC-system.pmdoc/01ghc.xml
index 9963fb1ba8..4eb91c3542 100644
--- a/distrib/MacOS/GHC-system.pmdoc/01ghc.xml
+++ b/distrib/MacOS/GHC-system.pmdoc/01ghc.xml
@@ -1 +1 @@
-<pkgref spec="1.12" uuid="24EEBBE7-7B79-47C9-839B-A5407A419948"><config><identifier>org.haskell.ghc.pkg</identifier><version>1.0</version><description/><post-install type="none"/><requireAuthorization/><installFrom includeRoot="true">/tmp/GHC.dst/Library/Frameworks/GHC.framework</installFrom><installTo>/Library/Frameworks</installTo><flags><followSymbolicLinks/></flags><packageStore type="internal"/><mod>scripts.scriptsDirectoryPath.path</mod><mod>parent</mod><mod>identifier</mod><mod>scripts.postinstall.path</mod></config><scripts><postinstall relative="true" mod="true">installer-scripts/create-links</postinstall><scripts-dir relative="true" mod="true">installer-scripts</scripts-dir></scripts><contents><file-list>01ghc-contents.xml</file-list><component id="org.haskell.GHC" path="/tmp/GHC.dst/Library/Frameworks/GHC.framework" version="612.220100521"/><filter>/CVS$</filter><filter>/\.svn$</filter><filter>/\.cvsignore$</filter><filter>/\.cvspass$</filter><filter>/\.DS_Store$</filter></contents></pkgref> \ No newline at end of file
+<pkgref spec="1.12" uuid="24EEBBE7-7B79-47C9-839B-A5407A419948"><config><identifier>org.haskell.ghc.pkg</identifier><version>1.0</version><description/><post-install type="none"/><requireAuthorization/><installFrom includeRoot="true">/tmp/GHC.dst/Library/Frameworks/GHC.framework</installFrom><installTo>/Library/Frameworks</installTo><flags><followSymbolicLinks/></flags><packageStore type="internal"/><mod>scripts.scriptsDirectoryPath.path</mod><mod>parent</mod><mod>identifier</mod><mod>scripts.postinstall.path</mod></config><scripts><postinstall relative="true" mod="true">installer-scripts/create-links</postinstall><scripts-dir relative="true" mod="true">installer-scripts</scripts-dir></scripts><contents><file-list>01ghc-contents.xml</file-list><component id="org.haskell.ghc" path="/tmp/GHC.dst/Library/Frameworks/GHC.framework" version="612.220100521"/><filter>/CVS$</filter><filter>/\.svn$</filter><filter>/\.cvsignore$</filter><filter>/\.cvspass$</filter><filter>/\.DS_Store$</filter></contents></pkgref> \ No newline at end of file
diff --git a/distrib/MacOS/GHC-system.pmdoc/index.xml b/distrib/MacOS/GHC-system.pmdoc/index.xml.in
index ba5f836151..2e90ba69c6 100644
--- a/distrib/MacOS/GHC-system.pmdoc/index.xml
+++ b/distrib/MacOS/GHC-system.pmdoc/index.xml.in
@@ -28,4 +28,4 @@ in a web browser. More documentation is available online at\
\
To uninstall, execute\
\
- /Library/Frameworks/GHC.framework/Tools/Uninstaller}]]></resource></locale></resources><flags/><item type="file">01ghc.xml</item><mod>properties.systemDomain</mod><mod>properties.title</mod><mod>properties.userDomain</mod><mod>properties.anywhereDomain</mod><mod>description</mod></pkmkdoc>
+ /Library/Frameworks/GHC.framework/Versions/@ProjectVersion@-@TargetArch_CPP@/Tools/Uninstaller}]]></resource></locale></resources><flags/><item type="file">01ghc.xml</item><mod>properties.systemDomain</mod><mod>properties.title</mod><mod>properties.userDomain</mod><mod>properties.anywhereDomain</mod><mod>description</mod></pkmkdoc>
diff --git a/distrib/MacOS/GHC.xcodeproj/project.pbxproj b/distrib/MacOS/GHC.xcodeproj/project.pbxproj
index 0b2e480842..6cd8658a66 100644
--- a/distrib/MacOS/GHC.xcodeproj/project.pbxproj
+++ b/distrib/MacOS/GHC.xcodeproj/project.pbxproj
@@ -74,7 +74,7 @@
);
buildRules = (
);
- comments = "Supported targets: build\n\nPrecondition: Fully compiled tree (i.e., \"perl boot; ./configure; make\" was already executed)\n\nThis project creates a Mac OS X framework that encapsulates a *relocatable* *binary* GHC distribution.\n\n* The framework is versioned using GHC's ProjectVersionInt. and we call the current version directory in the following CONTENTS_FOLDER_BUILD.\n\n* This target installs into CONTENTS_FOLDER_BUILD/ghc/ the same contents that is in a binary-dist tar ball.\n\n* The idea is that at framework installation time, a post install script will perform \n\n ./configure --prefix=CONTENTS_FOLDER_INSTALL/usr; make install \n\n in that ghc/ directory, where CONTENTS_FOLDER_INSTALL is the path that CONTENTS_FOLDER_BUILD has after the package containing the framework was installed by the package installer. This effectively rellocates the ghc installation to its final destination.";
+ comments = "Supported targets: build\n\nPrecondition: Fully compiled tree (i.e., \"perl boot; ./configure; make\" was already executed)\n\nThis project creates a Mac OS X framework that encapsulates a *relocatable* *binary* GHC distribution.\n\n* The framework is versioned using GHC's version and platform, and we call the current version directory in the following CONTENTS_FOLDER_BUILD.\n\n* This target installs into CONTENTS_FOLDER_BUILD/ghc/ the same contents that is in a binary-dist tar ball.\n\n* The idea is that at framework installation time, a post install script will perform \n\n ./configure --prefix=CONTENTS_FOLDER_INSTALL/usr; make install \n\n in that ghc/ directory, where CONTENTS_FOLDER_INSTALL is the path that CONTENTS_FOLDER_BUILD has after the package containing the framework was installed by the package installer. This effectively rellocates the ghc installation to its final destination.";
dependencies = (
);
name = "GHC-relocatable";
@@ -92,7 +92,7 @@
);
buildRules = (
);
- comments = "Supported targets: build, install\n\nPrecondition: We are in a distribution tree, not a vanilla tree from darcs - i.e., \"perl boot; ./configure\" was already executed.\n\nAs part of the build target, ./configure will be executed again (setting a --prefix). Additional arguments to ./configure can be specified by way of the environment variable XCODE_EXTRA_CONFIGURE_ARGS.\n\nThis project creates a Mac OS X framework at /Library/Frameworks.\n\n* The framework is versioned using GHC's ProjectVersionInt.\n\n* The target configures the tree for the deployment location and builds the tree.\n\n* This target installs the framework not into its final destination, but into a build directory using the DESTDIR feature of GHC build system (unless the deployment flag in the build rules is set).\n\n* The idea is that the framework at the build location is being turned into a package and the package installer eventually puts its at its final destination. \n";
+ comments = "Supported targets: build, install\n\nPrecondition: We are in a distribution tree, not a vanilla tree from darcs - i.e., \"perl boot; ./configure\" was already executed.\n\nAs part of the build target, ./configure will be executed again (setting a --prefix). Additional arguments to ./configure can be specified by way of the environment variable XCODE_EXTRA_CONFIGURE_ARGS.\n\nThis project creates a Mac OS X framework at /Library/Frameworks.\n\n* The framework is versioned using GHC's version and platform.\n\n* The target configures the tree for the deployment location and builds the tree.\n\n* This target installs the framework not into its final destination, but into a build directory using the DESTDIR feature of GHC build system (unless the deployment flag in the build rules is set).\n\n* The idea is that the framework at the build location is being turned into a package and the package installer eventually puts its at its final destination. \n";
dependencies = (
);
name = "GHC-systemwide";
diff --git a/distrib/MacOS/Makefile b/distrib/MacOS/Makefile
index dbf7886674..eef566185f 100644
--- a/distrib/MacOS/Makefile
+++ b/distrib/MacOS/Makefile
@@ -28,20 +28,21 @@ endif
include ../../mk/custom-settings.mk
-# The ProjectVersionInt is GHC's idea of an API version and hence determines
-# the framework version.
-FRAMEWORK_VERSION = $(ProjectVersionInt)
+# The framework version is a string like
+# 7.0.1-i386
+# for an i386 build of GHC 7.0.1. It's used for the subdirectory of
+# /Library/Frameworks/GHC.framework/Versions/
+FRAMEWORK_VERSION = $(ProjectVersion)-$(TargetArch_CPP)
# Xcode requires CURRENT_PROJECT_VERSION to be an int or float. We use this
# only as the build version (aka CFBundleVersion).
CURRENT_PROJECT_VERSION = $(ProjectVersionInt).$(ProjectPatchLevel)
-# The user-visible CFBundleShortVersionString is set to the standard GHC
-# version number.
-SHORT_VERSION_STRING = $(ProjectVersion)
+# The user-visible CFBundleShortVersionString
+SHORT_VERSION_STRING = $(FRAMEWORK_VERSION)
# Name of the installer package
-PACKAGE_NAME = GHC-$(ProjectVersion)-$(TargetArch_CPP).pkg
+PACKAGE_NAME = GHC-$(FRAMEWORK_VERSION).pkg
# Determine arguments that should be passed to ./configure from within Xcode
#
@@ -69,7 +70,7 @@ endif
DSTROOT=/tmp/GHC.dst
# Tools directory for a system volume install
-TOOLS_SYSTEM=$(DSTROOT)/Library/Frameworks/GHC.framework/Tools
+TOOLS_SYSTEM=$(DSTROOT)/Library/Frameworks/GHC.framework/Versions/$(FRAMEWORK_VERSION)/Tools
PACKAGEMAKER=/Developer/usr/bin/packagemaker
@@ -87,6 +88,7 @@ framework-pkg:
-$(RM) -rf $(DSTROOT)
mkdir -p $(TOOLS_SYSTEM)
cp installer-scripts/Uninstaller $(TOOLS_SYSTEM)
+ cp installer-scripts/create-links $(TOOLS_SYSTEM)
xcodebuild -target GHC-systemwide clean build\
CURRENT_PROJECT_VERSION=$(CURRENT_PROJECT_VERSION)\
SHORT_VERSION_STRING=$(SHORT_VERSION_STRING)\
@@ -102,7 +104,7 @@ framework-pkg:
-$(RM) -f GHC-system.pmdoc/*-contents.xml
$(PACKAGEMAKER) -v --doc GHC-system.pmdoc\
$(PACKAGEMAKER_TARGET) -o $(TOP)/$(PACKAGE_NAME)\
- -i org.haskell.GHC.$(FRAMEWORK_VERSION)
+ -i org.haskell.ghc.$(FRAMEWORK_VERSION)
# If we don't specify COMMAND_MODE=unix2003 then xcodebuild defaults
# to setting it to legacy, which means that ar builds archives
diff --git a/distrib/MacOS/installer-scripts/Uninstaller b/distrib/MacOS/installer-scripts/Uninstaller
deleted file mode 100644
index 784c7c23bb..0000000000
--- a/distrib/MacOS/installer-scripts/Uninstaller
+++ /dev/null
@@ -1,75 +0,0 @@
-#!/bin/sh
-
-# Uninstaller script for GHC.framework
-# (currently only for system volume installations)
-
-INSTALL_DEST=/Library/Frameworks
-INSTALL_BASE=/
-
-if [ ${INSTALL_BASE} = / ]; then
- INSTALL_BASE=/usr
-fi
-INSTALL_BIN=${INSTALL_BASE}/bin
-INSTALL_MAN1=${INSTALL_BASE}/share/man/man1
-INSTALL_HTML=${INSTALL_BASE}/share/doc
-
-if [ ! -x ${INSTALL_DEST}/GHC.framework ]; then
- echo "${INSTALL_DEST}/GHC.framework does not exit"
- exit 1
-fi
-
-if [ ${USER} != root ]; then
- echo "GHC.framework installer must be run with admin privileges"
- echo "Prefix command by 'sudo'"
- exit 1
-fi
-
-VERSIONS=(`ls ${INSTALL_DEST}/GHC.framework/Versions`)
-NO_VERSIONS=${#VERSIONS[@]}
-
-if [ ${VERSIONS[${NO_VERSIONS}-1]} != Current ]; then
- echo "Fatal error: last version should be Current"
- echo "Found versions: ${VERSIONS[@]}"
- exit 1
-fi
-CURRENT_PHYS=`cd /Library/Frameworks/GHC.framework/Versions/Current; pwd -P`
-CURRENT=`basename ${CURRENT_PHYS}`
-
-if [ ${NO_VERSIONS} -ne 2 ]; then
- echo "Multiple versions of GHC.framework are currently installed."
- echo "This uninstaller removes GHC.framework entirely and should only"
- echo "be used if there is exactly one version."
- echo
- echo "To remove individual old versions, simply delete the directory"
- echo "${INSTALL_DEST}/GHC.framework/Versions/VERSION_TO_REMOVE"
- echo
- echo "Found versions: ${VERSIONS[@]}(= ${CURRENT})"
- exit 1
-fi
-
-echo "Removing symbolic links into GHC.framework"
-for thisfile in ${INSTALL_BIN}/*; do
- if ls -l "${thisfile}" | grep -q GHC.framework/Versions; then
- rm -f "${thisfile}"
- fi
-done
-for thisfile in ${INSTALL_MAN1}/*; do
- if ls -l "${thisfile}" | grep -q GHC.framework/Versions; then
- rm -f "${thisfile}"
- fi
-done
-for thisfile in ${INSTALL_HTML}/*; do
- if ls -l "${thisfile}" | grep -q GHC.framework/Versions; then
- rm -f "${thisfile}"
- fi
-done
-
-echo "Removing ${INSTALL_DEST}/GHC.framework"
-rm -rf ${INSTALL_DEST}/GHC.framework
-
-echo "Removing package recipt"
-# The first is for Leopard packages and the second for Tiger packages.
-rm -f /Library/Receipts/boms/org.haskell.ghc.pkg.bom
-rm -rf /Library/Receipts/ghc.pkg
-
-echo "${INSTALL_DEST}/GHC.framework has been purged!"
diff --git a/distrib/MacOS/installer-scripts/Uninstaller.in b/distrib/MacOS/installer-scripts/Uninstaller.in
new file mode 100644
index 0000000000..8774e07ad3
--- /dev/null
+++ b/distrib/MacOS/installer-scripts/Uninstaller.in
@@ -0,0 +1,91 @@
+#!/bin/sh
+
+# Uninstaller script for GHC.framework
+# (currently only for system volume installations)
+
+INSTALL_DEST=/Library/Frameworks
+INSTALL_BASE=/
+
+# Turn off things that might make /usr/bin/ls give funky output
+unset CLICOLOR
+unset CLICOLOR_FORCE
+unset LSCOLORS
+
+if [ ${INSTALL_BASE} = / ]; then
+ INSTALL_BASE=/usr
+fi
+INSTALL_BIN=${INSTALL_BASE}/bin
+INSTALL_MAN1=${INSTALL_BASE}/share/man/man1
+INSTALL_HTML=${INSTALL_BASE}/share/doc
+
+if [ ! -x ${INSTALL_DEST}/GHC.framework ]; then
+ echo "${INSTALL_DEST}/GHC.framework does not exit"
+ exit 1
+fi
+
+if [ ${USER} != root ]; then
+ echo "GHC.framework installer must be run with admin privileges"
+ echo "Prefix command by 'sudo'"
+ exit 1
+fi
+
+FRAMEWORK_DIRECTORY="$INSTALL_DEST/GHC.framework"
+VERSIONS_DIRECTORY="$FRAMEWORK_DIRECTORY/Versions"
+
+MY_VERSION=@ProjectVersion@-@TargetArch_CPP@
+MY_DIRECTORY="$VERSIONS_DIRECTORY/$MY_VERSION"
+
+CURRENT_DIRECTORY="$VERSIONS_DIRECTORY/Current"
+CURRENT_VERSION=`readlink "$CURRENT_DIRECTORY"`
+
+if [ "$CURRENT_VERSION" = "$MY_VERSION" ]
+then
+ rm -f "$CURRENT_DIRECTORY"
+
+ removeLinksFrom () {
+ for f in `ls -1 "$MY_DIRECTORY/$1"`
+ do
+ qf="$1/$f"
+ # Sanity check that it is a link like we expect
+ l=`readlink "$qf" | grep GHC.framework/Versions`
+ if [ "$l" != "" ]
+ then
+ rm -f "$qf"
+ fi
+ done
+ }
+
+ removeLinksFrom /usr/bin
+ removeLinksFrom /usr/share/man/man1
+ removeLinksFrom /usr/share/doc
+fi
+
+echo "Removing $MY_DIRECTORY"
+rm -rf "$MY_DIRECTORY"
+
+if [ "$CURRENT_VERSION" = "$MY_VERSION" ]
+then
+ # This isn't ideal, but it's a vague approximation to
+ # "the most recent version":
+ NEW_VERSION=`ls -1 "$VERSIONS_DIRECTORY" | tail -1`
+ if [ "$NEW_VERSION" = "" ]
+ then
+ echo "Removing $FRAMEWORK_DIRECTORY"
+ rm -rf "$FRAMEWORK_DIRECTORY"
+ else
+ ln -s "$NEW_VERSION" "$CURRENT_DIRECTORY"
+ NEW_CREATE_LINKS="$VERSIONS_DIRECTORY/$NEW_VERSION/Tools/create-links"
+ if [ -f "$NEW_CREATE_LINKS" ]
+ then
+ sh "$NEW_CREATE_LINKS"
+ fi
+ fi
+fi
+
+echo "Removing package receipt"
+# The first is for Leopard packages and the second for Tiger packages.
+rm -f "/Library/Receipts/boms/org.haskell.ghc.$MY_VERSION.bom"
+rm -rf "/Library/Receipts/ghc.$MY_VERSION.pkg"
+
+echo "Done."
+
diff --git a/distrib/MacOS/installer-scripts/create-links.in b/distrib/MacOS/installer-scripts/create-links.in
index 2e3dc5e376..c12d90a36c 100644
--- a/distrib/MacOS/installer-scripts/create-links.in
+++ b/distrib/MacOS/installer-scripts/create-links.in
@@ -20,8 +20,8 @@ if [ "$INSTALL_BASE" = / ]; then
INSTALL_BASE=/usr
fi
-ProjectVersionInt=@ProjectVersionInt@
-GHC_BASE="$INSTALL_DEST/GHC.framework/Versions/$ProjectVersionInt"
+VERSION=@ProjectVersion@-@TargetArch_CPP@
+GHC_BASE="$INSTALL_DEST/GHC.framework/Versions/$VERSION"
INSTALL_BIN="$INSTALL_BASE/bin"
mkdir -p "$INSTALL_BIN"
@@ -34,5 +34,5 @@ INSTALL_HTML="$INSTALL_BASE"/share/doc
mkdir -p "$INSTALL_MAN1"
if [ -d "$GHC_BASE"/usr/share/man/man1 ]; then
ln -sf "$GHC_BASE"/usr/share/man/man1/* "$INSTALL_MAN1/"
- ln -sf "$GHC_BASE"/usr/share/doc/ghc.$ProjectVersionInt "$INSTALL_HTML/"
+ ln -sf "$GHC_BASE"/usr/share/doc/ghc "$INSTALL_HTML/"
fi