Modified behavior of staging_install.py so that if a "make install"
is being done by a user to a user-owned path, then references to
the user's path are replaced as appropriate with "${HOME}" or
"$::env(HOME)", making the installed PDK more portable.  This should
work well with volare.
diff --git a/common/staging_install.py b/common/staging_install.py
index fe98d02..186a19e 100755
--- a/common/staging_install.py
+++ b/common/staging_install.py
@@ -101,6 +101,22 @@
     stagingparent = os.path.split(stagingdir)[0]
     localparent = os.path.split(finaldir)[0]
 
+    # Alternative expressions for the final location when called from
+    # Tcl scripts or shell scripts.  This affects startup scripts like
+    # .magicrc and .xcircuitrc, and qflow setup scripts.  Note that the
+    # startup scripts are detected by having a file extension ending in
+    # "rc", so if this substitution needs to happen in other files, then
+    # the code to set 'istcl' below needs to be expanded.
+    #
+    # NOTE:  $HOME does not work with 'sudo make install' but it is
+    # assumed that the user does 'make install' when installing locally.
+
+    homedir = os.environ['HOME']
+    shfinaldir = finaldir.replace(homedir, '${HOME}')
+    shlocalparent = localparent.replace(homedir, '${HOME}')
+    tclfinaldir = finaldir.replace(homedir, '$::env(HOME)')
+    tcllocalparent = localparent.replace(homedir, '$::env(HOME)')
+
     if not os.path.exists(tooldir):
         return 0
     elif os.path.islink(tooldir):
@@ -130,11 +146,27 @@
             # Make sure this file is writable (as the original may not be)
             makeuserwritable(filepath)
 
+            # For cases in which the target is in the home directory, make
+            # the PDK more portable by replacing the home directory with the
+            # appropriate environment variable.  This is found in Tcl and shell
+            # scripts and needs to be handled accordingly.
+
+            fext = os.path.splitext(filepath)[1]
+            isshell = True if fext == '.sh' else False
+            istcl = True if fext.endswith('rc') else False
+
             modified = False
             with open(filepath, 'wb') as ofile:
                 for line in flines:
-                    newline = line.replace(stagingdir, finaldir)
-                    newline = newline.replace(stagingparent, localparent)
+                    if isshell:
+                        newline = line.replace(stagingdir, shfinaldir)
+                        newline = newline.replace(stagingparent, shlocalparent)
+                    elif istcl:
+                        newline = line.replace(stagingdir, tclfinaldir)
+                        newline = newline.replace(stagingparent, tcllocalparent)
+                    else:
+                        newline = line.replace(stagingdir, finaldir)
+                        newline = newline.replace(stagingparent, localparent)
                     ofile.write(newline.encode('utf-8'))
                     if newline != line:
                         modified = True