From 8d784e353f7169eebb75c8c8677a1b9e5fe2c19b Mon Sep 17 00:00:00 2001
From: Jack Jansen <jack.jansen@cwi.nl>
Date: Fri, 31 Dec 2004 11:23:20 +0000
Subject: Backport: Fix for #1091468: DESTROOTed frameworkinstalls fail. Added
 a --destroot option to various tools, and do the right thing when we're doing
 a destroot install.

---
 Lib/plat-mac/buildtools.py    | 11 ++++++-----
 Lib/plat-mac/bundlebuilder.py |  9 +++++++--
 Mac/OSX/Makefile              |  9 ++++++++-
 Mac/scripts/BuildApplet.py    | 10 +++++++---
 4 files changed, 28 insertions(+), 11 deletions(-)

diff --git a/Lib/plat-mac/buildtools.py b/Lib/plat-mac/buildtools.py
index 17e4076..c83e218 100644
--- a/Lib/plat-mac/buildtools.py
+++ b/Lib/plat-mac/buildtools.py
@@ -60,7 +60,7 @@ def findtemplate(template=None):
     return file
 
 def process(template, filename, destname, copy_codefragment=0,
-        rsrcname=None, others=[], raw=0, progress="default"):
+        rsrcname=None, others=[], raw=0, progress="default", destroot=""):
 
     if progress == "default":
         progress = EasyDialogs.ProgressBar("Processing %s..."%os.path.split(filename)[1], 120)
@@ -108,7 +108,7 @@ def process(template, filename, destname, copy_codefragment=0,
     except os.error:
         pass
     process_common(template, progress, code, rsrcname, destname, 0,
-        copy_codefragment, raw, others, filename)
+        copy_codefragment, raw, others, filename, destroot)
 
 
 def update(template, filename, output):
@@ -130,10 +130,10 @@ def update(template, filename, output):
 
 
 def process_common(template, progress, code, rsrcname, destname, is_update,
-        copy_codefragment, raw=0, others=[], filename=None):
+        copy_codefragment, raw=0, others=[], filename=None, destroot=""):
     if MacOS.runtimemodel == 'macho':
         return process_common_macho(template, progress, code, rsrcname, destname,
-            is_update, raw, others, filename)
+            is_update, raw, others, filename, destroot)
     if others:
         raise BuildError, "Extra files only allowed for MachoPython applets"
     # Create FSSpecs for the various files
@@ -265,7 +265,7 @@ def process_common(template, progress, code, rsrcname, destname, is_update,
         progress.inc(0)
 
 def process_common_macho(template, progress, code, rsrcname, destname, is_update,
-        raw=0, others=[], filename=None):
+        raw=0, others=[], filename=None, destroot=""):
     # Check that we have a filename
     if filename is None:
         raise BuildError, "Need source filename on MacOSX"
@@ -302,6 +302,7 @@ def process_common_macho(template, progress, code, rsrcname, destname, is_update
     builder.mainprogram = filename
     builder.builddir = destdir
     builder.name = shortname
+    builder.destroot = destroot
     if rsrcname:
         realrsrcname = macresource.resource_pathname(rsrcname)
         builder.files.append((realrsrcname,
diff --git a/Lib/plat-mac/bundlebuilder.py b/Lib/plat-mac/bundlebuilder.py
index 09b9dea..e379544 100755
--- a/Lib/plat-mac/bundlebuilder.py
+++ b/Lib/plat-mac/bundlebuilder.py
@@ -110,6 +110,9 @@ class BundleBuilder(Defaults):
 
     # Verbosity level.
     verbosity = 1
+    
+    # Destination root directory
+    destroot = ""
 
     def setup(self):
         # XXX rethink self.name munging, this is brittle.
@@ -445,7 +448,7 @@ class AppBuilder(BundleBuilder):
                 execname = os.path.basename(self.executable)
             execpath = pathjoin(self.execdir, execname)
             if not self.symlink_exec:
-                self.files.append((self.executable, execpath))
+                self.files.append((self.destroot + self.executable, execpath))
             self.execpath = execpath
 
         if self.mainprogram is not None:
@@ -828,7 +831,7 @@ def main(builder=None):
         "mainprogram=", "creator=", "nib=", "plist=", "link",
         "link-exec", "help", "verbose", "quiet", "argv", "standalone",
         "exclude=", "include=", "package=", "strip", "iconfile=",
-        "lib=", "python=", "semi-standalone", "bundle-id=")
+        "lib=", "python=", "semi-standalone", "bundle-id=", "destroot=")
 
     try:
         options, args = getopt.getopt(sys.argv[1:], shortopts, longopts)
@@ -890,6 +893,8 @@ def main(builder=None):
             builder.includePackages.append(arg)
         elif opt == '--strip':
             builder.strip = 1
+        elif opt == '--destroot':
+            builder.destroot = arg
 
     if len(args) != 1:
         usage("Must specify one command ('build', 'report' or 'help')")
diff --git a/Mac/OSX/Makefile b/Mac/OSX/Makefile
index e8d1529..bfee43f 100644
--- a/Mac/OSX/Makefile
+++ b/Mac/OSX/Makefile
@@ -2,7 +2,7 @@
 # main Makefile. The next couple of variables are overridden on the 
 # commandline in that case.
 
-VERSION=2.4
+VERSION=2.5
 builddir = ../..
 srcdir = ../..
 prefix=/Library/Frameworks/Python.framework/Versions/$(VERSION)
@@ -120,10 +120,12 @@ install_IDE:
 		echo See Mac/OSX/README for details; \
 	else \
 		echo $(BUILDPYTHON) $(srcdir)/Mac/scripts/BuildApplet.py \
+		    --destroot $(DESTDIR) \
 			--python $(INSTALLED_PYTHONW) \
 			--output $(DESTDIR)$(PYTHONAPPSDIR)/PythonIDE.app --noargv \
 			$(srcdir)/Mac/Tools/IDE/PythonIDE.py ; \
 		$(BUILDPYTHON) $(srcdir)/Mac/scripts/BuildApplet.py \
+		    --destroot $(DESTDIR) \
 			--python $(INSTALLED_PYTHONW) \
 			--output $(DESTDIR)$(PYTHONAPPSDIR)/PythonIDE.app --noargv \
 			$(srcdir)/Mac/Tools/IDE/PythonIDE.py; \
@@ -136,6 +138,7 @@ install_PackageManager:
 	else \
 		echo $(BUILDPYTHON) $(bundlebuilder) \
 			--builddir $(DESTDIR)$(PYTHONAPPSDIR)/ \
+		    --destroot $(DESTDIR) \
 			--python $(INSTALLED_PYTHONW) \
 			--resource $(srcdir)/Mac/Tools/IDE/PythonIDE.rsrc \
 			--mainprogram $(srcdir)/Mac/Tools/IDE/PackageManager.py \
@@ -143,6 +146,7 @@ install_PackageManager:
 			--creator Pimp build; \
 		$(BUILDPYTHON) $(bundlebuilder) \
 			--builddir $(DESTDIR)$(PYTHONAPPSDIR)/ \
+		    --destroot $(DESTDIR) \
 			--python $(INSTALLED_PYTHONW) \
 			--resource $(srcdir)/Mac/Tools/IDE/PythonIDE.rsrc \
 			--mainprogram $(srcdir)/Mac/Tools/IDE/PackageManager.py \
@@ -157,11 +161,13 @@ install_IDLE:
 	else \
 		echo $(BUILDPYTHON) $(srcdir)/Mac/scripts/BuildApplet.py \
 			--python $(INSTALLED_PYTHONW) \
+		    --destroot $(DESTDIR) \
 			--output $(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app \
 			--extra $(srcdir)/Lib/idlelib \
 			$(srcdir)/Tools/scripts/idle ; \
 		$(BUILDPYTHON) $(srcdir)/Mac/scripts/BuildApplet.py \
 			--python $(INSTALLED_PYTHONW) \
+		    --destroot $(DESTDIR) \
 			--output $(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app \
 			--extra $(srcdir)/Lib/idlelib:Contents/Resources/idlelib \
 			$(srcdir)/Tools/scripts/idle ; \
@@ -170,6 +176,7 @@ install_IDLE:
 
 install_BuildApplet:
 	$(BUILDPYTHON) $(srcdir)/Mac/scripts/BuildApplet.py \
+		--destroot $(DESTDIR) \
 		--python $(INSTALLED_PYTHONW) \
 		--output $(DESTDIR)$(PYTHONAPPSDIR)/BuildApplet.app \
 		$(srcdir)/Mac/scripts/BuildApplet.py
diff --git a/Mac/scripts/BuildApplet.py b/Mac/scripts/BuildApplet.py
index cb2aed8..756218f 100644
--- a/Mac/scripts/BuildApplet.py
+++ b/Mac/scripts/BuildApplet.py
@@ -53,8 +53,8 @@ def buildapplet():
             buildtools.process(template, filename, dstfilename, 1)
     else:
 
-        SHORTOPTS = "o:r:ne:v?P"
-        LONGOPTS=("output=", "resource=", "noargv", "extra=", "verbose", "help", "python=")
+        SHORTOPTS = "o:r:ne:v?PR"
+        LONGOPTS=("output=", "resource=", "noargv", "extra=", "verbose", "help", "python=", "destroot=")
         try:
             options, args = getopt.getopt(sys.argv[1:], SHORTOPTS, LONGOPTS)
         except getopt.error:
@@ -67,6 +67,7 @@ def buildapplet():
         raw = 0
         extras = []
         verbose = None
+        destroot = ''
         for opt, arg in options:
             if opt in ('-o', '--output'):
                 dstfilename = arg
@@ -87,6 +88,8 @@ def buildapplet():
                 verbose = Verbose()
             elif opt in ('-?', '--help'):
                 usage()
+            elif opt in ('-d', '--destroot'):
+                destroot = arg
         # On OS9 always be verbose
         if sys.platform == 'mac' and not verbose:
             verbose = 'default'
@@ -97,7 +100,8 @@ def buildapplet():
                 buildtools.update(template, filename, dstfilename)
             else:
                 buildtools.process(template, filename, dstfilename, 1,
-                        rsrcname=rsrcfilename, others=extras, raw=raw, progress=verbose)
+                        rsrcname=rsrcfilename, others=extras, raw=raw,
+                        progress=verbose, destroot=destroot)
 
 def usage():
     print "BuildApplet creates an application from a Python source file"
-- 
cgit v0.12

