]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR libstdc++/40289 (share/libstdc++/python/ pollutes common namespace)
authorTom Tromey <tromey@redhat.com>
Wed, 10 Jun 2009 22:58:22 +0000 (22:58 +0000)
committerTom Tromey <tromey@gcc.gnu.org>
Wed, 10 Jun 2009 22:58:22 +0000 (22:58 +0000)
PR libstdc++/40289:
* python/Makefile.in: Rebuild.
* python/hook.in: Compute module path relative to objfile.
* python/Makefile.am (pythondir): Redefine.
(gdb.py): Subst toolexeclibdir.
(install-data-local): Rewrite.

From-SVN: r148357

libstdc++-v3/ChangeLog
libstdc++-v3/python/Makefile.am
libstdc++-v3/python/Makefile.in
libstdc++-v3/python/hook.in

index d8d9361e5239230f20dc5adae81ccc2fcfd92a28..642fff10c9863e9ba166e8d427648d6af4c4590c 100644 (file)
@@ -1,3 +1,12 @@
+2009-06-10  Tom Tromey  <tromey@redhat.com>
+
+       PR libstdc++/40289:
+       * python/Makefile.in: Rebuild.
+       * python/hook.in: Compute module path relative to objfile.
+       * python/Makefile.am (pythondir): Redefine.
+       (gdb.py): Subst toolexeclibdir.
+       (install-data-local): Rewrite.
+
 2009-06-09  Benjamin Kosnik  <bkoz@redhat.com>
 
        * include/bits/move.h: Doxygen group fixes.
index bcc8afea1eb9914f89021b8faf4f911c6b9afc43..50cc6d94541089d1d077a90e4bd8a24e7a7d1767 100644 (file)
@@ -24,7 +24,7 @@
 include $(top_srcdir)/fragment.am
 
 ## Where to install the module code.
-pythondir = $(pkgdatadir)/python
+pythondir = $(datadir)/gcc-$(gcc_version)/python
 
 all-local: gdb.py
 
@@ -34,10 +34,27 @@ nobase_python_DATA = \
     libstdcxx/__init__.py
 
 gdb.py: hook.in Makefile
-       sed -e 's,@dir@,$(pythondir),' < $(srcdir)/hook.in > $@
+       sed -e 's,@pythondir@,$(pythondir),' \
+           -e 's,@toolexeclibdir@,$(toolexeclibdir),' < $(srcdir)/hook.in > $@
 
 install-data-local: gdb.py
        @$(mkdir_p) $(DESTDIR)$(toolexeclibdir)
-       @libname=`cd $(toolexeclibdir) && ls -r libstdc++* | fgrep -v gdb.py | sed 1q`; \
+## We want to install gdb.py as SOMETHING-gdb.py.  SOMETHING is the
+## full name of the final library.  We want to ignore symlinks, the
+## .la file, and any previous -gdb.py file.  This is inherently
+## fragile, but there does not seem to be a better option, because
+## libtool hides the real names from us.
+       @here=`pwd`; cd $(toolexeclibdir); \
+         for file in libstdc++*; do \
+           case $$file in \
+             *-gdb.py) ;; \
+             *.la) ;; \
+             *) if test -h $$file; then \
+                  continue; \
+                fi; \
+                libname=$$file;; \
+           esac; \
+         done; \
+       cd $$here; \
        echo " $(INSTALL_DATA) gdb.py $(DESTDIR)$(toolexeclibdir)/$$libname-gdb.py"; \
        $(INSTALL_DATA) gdb.py $(DESTDIR)$(toolexeclibdir)/$$libname-gdb.py
index 879f040d606c3f49b89afd4c2704c96860e5d8e9..88cc7ea34c3e3e41f83ea632a9b619dca6f73680 100644 (file)
@@ -298,7 +298,7 @@ WARN_CXXFLAGS = \
 
 # -I/-D flags to pass when compiling.
 AM_CPPFLAGS = $(GLIBCXX_INCLUDES)
-pythondir = $(pkgdatadir)/python
+pythondir = $(datadir)/gcc-$(gcc_version)/python
 nobase_python_DATA = \
     libstdcxx/v6/printers.py \
     libstdcxx/v6/__init__.py \
@@ -492,11 +492,23 @@ uninstall-am: uninstall-info-am uninstall-nobase_pythonDATA
 all-local: gdb.py
 
 gdb.py: hook.in Makefile
-       sed -e 's,@dir@,$(pythondir),' < $(srcdir)/hook.in > $@
+       sed -e 's,@pythondir@,$(pythondir),' \
+           -e 's,@toolexeclibdir@,$(toolexeclibdir),' < $(srcdir)/hook.in > $@
 
 install-data-local: gdb.py
        @$(mkdir_p) $(DESTDIR)$(toolexeclibdir)
-       @libname=`cd $(toolexeclibdir) && ls -r libstdc++* | fgrep -v gdb.py | sed 1q`; \
+       @here=`pwd`; cd $(toolexeclibdir); \
+         for file in libstdc++*; do \
+           case $$file in \
+             *-gdb.py) ;; \
+             *.la) ;; \
+             *) if test -h $$file; then \
+                  continue; \
+                fi; \
+                libname=$$file;; \
+           esac; \
+         done; \
+       cd $$here; \
        echo " $(INSTALL_DATA) gdb.py $(DESTDIR)$(toolexeclibdir)/$$libname-gdb.py"; \
        $(INSTALL_DATA) gdb.py $(DESTDIR)$(toolexeclibdir)/$$libname-gdb.py
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
index fe7c0722484f6265fec861cf472a263fa1ee5055..f7bf1afb44d5f700ca4c7df5a784a61eb06b8786 100644 (file)
 
 import sys
 import gdb
+import os
+import os.path
+
+pythondir = '@pythondir@'
+libdir = '@toolexeclibdir@'
+
+# Update module path.  We want to find the relative path from libdir
+# to pythondir, and then we want to apply that relative path to the
+# directory holding the objfile with which this file is associated.
+# This preserves relocatability of the gcc tree.
+
+# Do a simple normalization that removes duplicate separators.
+pythondir = os.path.join (*['/'] + pythondir.split (os.sep))
+libdir = os.path.join (*['/'] + libdir.split (os.sep))
+
+prefix = os.path.commonprefix ([libdir, pythondir])
+# In some bizarre configuration we might have found a match in the
+# middle of a directory name.
+if prefix[-1] != '/':
+    prefix = os.path.dirname (prefix)
+
+# Strip off the prefix.
+pythondir = pythondir[len (prefix):]
+libdir = libdir[len (prefix):]
+
+# Compute the ".."s needed to get from libdir to the prefix.
+dotdots = ('..' + os.sep) * len (libdir.split (os.sep))
+
+objfile = gdb.current_objfile ().filename
+dir = os.path.join (os.path.dirname (objfile), dotdots, pythondir)
 
-# Update module path.
-dir = '@dir@'
 if not dir in sys.path:
     sys.path.insert(0, dir)