--- siputils.py.orig
+++ siputils.py
@@ -298,7 +298,7 @@
             # These require special handling as they are (potentially) a set of
             # space separated values rather than a single value that might
             # contain spaces.
-            if m in ("DEFINES", "CONFIG") or m[:6] in ("INCDIR", "LIBDIR"):
+            if m in ("DEFINES", "CONFIG") or m[:6] in ("INCDIR", "LIBDIR") or m[:12] in ("FRAMEWORKDIR"):
                 val = val.split()
 
             # We also want to treat lists of libraries in the same way so that
@@ -615,6 +615,16 @@
             libdir.extend(libdir_qt)
             rpaths.extend(libdir_qt)
 
+            # projects using SIP may not define FRAMEWORKDIR_QT as a
+            # configuration option, so try to retrieve it and fallback
+            # as necessary to a reasonable default for MacPorts
+            try:
+                frameworkdir_qt = self.optional_list("FRAMEWORKDIR_QT")
+            except:
+                frameworkdir_qt = self.config.qt_dir + "/Library/Frameworks"
+            libdir.extend(frameworkdir_qt)
+            rpaths.extend(frameworkdir_qt)
+
             if qt_version >= 0x040000:
                 # Try and read QT_LIBINFIX from qconfig.pri.
                 qconfig = os.path.join(mkspecs, "qconfig.pri")
@@ -750,7 +760,7 @@
                         if mod == "QAxContainer":
                             incdir.append(os.path.join(qtincdir[0], "ActiveQt"))
                         elif self._is_framework(mod):
-                            idir = libdir_qt[0]
+                            idir = frameworkdir_qt[0]
 
                             if mod == "QtAssistant" and qt_version < 0x040202:
                                 mod = "QtAssistantClient"
@@ -836,7 +846,7 @@
     def _is_framework(self, mod):
         """Return true if the given Qt module is a framework.
         """
-        return (self.config.qt_framework and (self.config.qt_version >= 0x040200 or mod != "QtAssistant"))
+        return (self.config.qt_framework and (self.config.qt_version >= 0x040200 or mod != "QtAssistant") and (mod != "phonon"))
 
     def _qt_module_to_lib(self, mname):
         """Return the name of the Qt library corresponding to a module.
@@ -964,7 +974,7 @@
         if self.generator in ("MSVC", "MSVC.NET", "MSBUILD", "BMAKE"):
             prl_name = os.path.join(self.config.qt_lib_dir, clib + ".prl")
         elif sys.platform == "darwin" and framework:
-            prl_name = os.path.join(self.config.qt_lib_dir, clib + ".framework", clib + ".prl")
+            prl_name = os.path.join(self.config.qt_framework_dir, clib + ".framework", clib + ".prl")
         else:
             prl_name = os.path.join(self.config.qt_lib_dir, "lib" + clib + ".prl")
 
@@ -2510,6 +2520,40 @@
                 lhs = line[:assstart].strip()
                 rhs = line[assend + 1:].strip()
 
+#                print "lhs is", lhs
+#                print "rhs is", rhs
+
+                # check for X = foo $$X (like += but prepending)
+                s_start = rhs.find(lhs)
+                if s_start != -1:
+#                    print "maybe found substr"
+                    s_pre_s = s_start
+                    while s_pre_s >= 0 and rhs[s_pre_s] not in string.whitespace:
+                        s_pre_s -= 1
+                    s_pre_s += 1
+                    s_pre_str = rhs[s_pre_s:s_start]
+                    s_end = s_start
+                    while s_end < len(rhs) and rhs[s_end] not in string.whitespace:
+                        s_end += 1
+                    s_str = rhs[s_start:s_end]
+#                    print "before: s_str =", s_str
+#                    print "befire: s_pre_str =", s_pre_str
+                    if s_pre_str.find("$$") == 0:
+                        # $$ something, maybe; find that something
+                        if len(s_pre_str) == 3:
+#                            print "looking for brackets at end"
+                            # verify termination is a bracket type
+                            if s_str[len(s_str)-1] in "}]":
+                                s_str = s_str[:(len(s_str)-1)]
+#                    print "s_str is", s_str
+                    if len(s_str) == len(lhs):
+#                        print "found match"
+                        # make sure 'lhs' is already in 'raw'
+                        orig_rhs = raw.get(lhs)
+                        if orig_rhs is not None:
+                            rhs = rhs[:s_pre_s] + orig_rhs
+#                            print "new rhs is", rhs
+
                 # Remove the escapes for any quotes.
                 rhs = rhs.replace(r'\"', '"').replace(r"\'", "'")