Dynamically-linked version of Python-2.1 for linux

R. Timothy Edwards tim at stravinsky.jhuapl.edu
Wed Jun 13 12:26:26 EDT 2001


To the python developers:

I am the author of "xcircuit", into which I embedded python for use
as a scripting language (very successfully, I might add).  The only
problem I had with Python was that the source always compiled a
static ".a" library, and this would enlarge the size of the xcircuit
executable from 1.5MB to more like 4.5MB---i.e., the python
interpreter was twice the size of the program it was embedded in!
Because I am a traditional programmer who actually believes in
saving disk space and removing redundancy where warranted, I worked
out how to get a libpython2.1.so under linux, and made some
reasonable effort to make sure that this would not affect other
architectures.  Would someone please check my code and make sure
that it doesn't break the compile process on other OS's (including
Linux versions other than RedHat)?  Thanks.
						Regards,
						Tim Edwards

------------------------------------------------------------------
Source version: Python-2.1c2

Summary of changes:

1) Add LDCONFIG to the makefile so that the install process can
   update the ld.so cache (LDCONFIG = /bin/true on non-linux
   systems.  Do any other systems use an ld.so cache?).

2) Export LD_LIBRARY_PATH to python during the build process so
   that it will link correctly before doing make install

3) Change LDLIBRARY to libpython$(VERSION).so for Linux

4) Add a rule to generate libpython$(VERSION).so for Linux
   (is the same as for unixware)

5) Add a few lines to the make install process to check for
   /etc/ld.so.conf, and if it exists, append $(LIBRARY) to it
   and run LDCONFIG to rebuild /etc/ld.so.cache.

6) The install process currently installs LDLIBRARY into LIBPL
   and then runs RANLIB on it;  this would appear to be an error
   based on the fact that most systems set LDLIBRARY to be the
   same as LIBRARY, so that it is actually a static library.
   I would argue that this install should be changed to LIBRARY,
   not LDLIBRARY, so that it really is the static library that
   is installed here, and therefore it is not an error to run
   RANLIB on it.  It is around here, though, that I get a bit
   fuzzy on the intended use of the directory structure created
   by the install process, so there may be a difference of
   opinion.  But I am confused why the library needs to be
   installed both in $(LIBDIR) and in $(LIBPL), which is a
   subdirectory of $(LIBDIR).  One would think that one or the
   other would suffice. 

Patch files (diff -c original_file new_file)
------------------------------------------------------------------
1) Changes to Makefile.pre.in
------------------------------------------------------------------

*** Makefile.pre.in.orig	Sat Apr 14 13:57:07 2001
--- Makefile.pre.in	Tue Jun 12 16:12:30 2001
***************
*** 94,99 ****
--- 94,100 ----
  # Symbols used for using shared libraries
  SO=		@SO@
  LDSHARED=	@LDSHARED@
+ LDCONFIG=	@LDCONFIG@
  BLDSHARED=	@BLDSHARED@
  DESTSHARED=	$(BINLIBDEST)/lib-dynload
  
***************
*** 282,288 ****
  
  # Build the shared modules
  sharedmods: $(PYTHON)
! 	PYTHONPATH= ./$(PYTHON) $(srcdir)/setup.py build
  
  # buildno should really depend on something like LIBRARY_SRC
  buildno: $(PARSER_OBJS) \
--- 283,290 ----
  
  # Build the shared modules
  sharedmods: $(PYTHON)
! 	PYTHONPATH=export LD_LIBRARY_PATH; LD_LIBRARY_PATH=$(srcdir); \
! 	./$(PYTHON) $(srcdir)/setup.py build
  
  # buildno should really depend on something like LIBRARY_SRC
  buildno: $(PARSER_OBJS) \
***************
*** 309,315 ****
  	$(AR) cr $@ $(MODOBJS)
  	$(RANLIB) $@
  
! # This rule is only here for DG/UX, UnixWare, and BeOS!!!
  libpython$(VERSION).so:	$(LIBRARY)
  	case `uname -s | tr -d '/ ' | tr '[A-Z]' '[a-z]'` in \
  	*dgux*) \
--- 311,317 ----
  	$(AR) cr $@ $(MODOBJS)
  	$(RANLIB) $@
  
! # This rule is here for DG/UX, UnixWare, Linux, and BeOS
  libpython$(VERSION).so:	$(LIBRARY)
  	case `uname -s | tr -d '/ ' | tr '[A-Z]' '[a-z]'` in \
  	*dgux*) \
***************
*** 320,325 ****
--- 322,330 ----
  	unixware*) \
  	    $(LDSHARED) -o $@ $(LIBRARY_OBJS) \
  	    ;; \
+ 	linux*) \
+ 	    $(LDSHARED) -o $@ $(LIBRARY_OBJS) \
+ 	    ;; \
  	beos) \
  	    $(AR) so $(LIBRARY) $@ \
  	    ;; \
***************
*** 534,539 ****
--- 539,548 ----
  	$(INSTALL_PROGRAM) $(PYTHON) $(BINDIR)/python$(VERSION)$(EXE)
  	if test -f libpython$(VERSION).so; then \
  		$(INSTALL_DATA) libpython$(VERSION).so $(LIBDIR); \
+ 		if test -z `grep $(LIBDIR) /etc/ld.so.conf | uniq`; then \
+ 		   echo $(LIBDIR) >> /etc/ld.so.conf; \
+ 		fi; \
+ 		$(LDCONFIG) $(LIBDIR); \
  	else	true; \
  	fi
  	if test -f "$(DLLLIBRARY)"; then \
***************
*** 659,667 ****
  		else	true; \
  		fi; \
  	done
! 	@if test -d $(LDLIBRARY); then :; else \
! 		$(INSTALL_DATA) $(LDLIBRARY) $(LIBPL)/$(LDLIBRARY) ; \
! 		$(RANLIB) $(LIBPL)/$(LDLIBRARY) ; \
  	fi
  	$(INSTALL_DATA) Modules/config.c $(LIBPL)/config.c
  	$(INSTALL_DATA) Modules/$(MAINOBJ) $(LIBPL)/$(MAINOBJ)
--- 668,676 ----
  		else	true; \
  		fi; \
  	done
! 	@if test -d $(LIBRARY); then :; else \
! 		$(INSTALL_DATA) $(LIBRARY) $(LIBPL)/$(LIBRARY) ; \
! 		$(RANLIB) $(LIBPL)/$(LIBRARY) ; \
  	fi
  	$(INSTALL_DATA) Modules/config.c $(LIBPL)/config.c
  	$(INSTALL_DATA) Modules/$(MAINOBJ) $(LIBPL)/$(MAINOBJ)

------------------------------------------------------------------
2) Changes to configure.in for autoconf
------------------------------------------------------------------

*** configure.in.orig	Wed Apr 11 16:56:19 2001
--- configure.in	Tue Jun 12 16:09:58 2001
***************
*** 273,278 ****
--- 273,281 ----
        LDLIBRARY='libpython$(VERSION).dll.a'
        DLLLIBRARY='libpython$(VERSION).dll'
        ;;
+ linux*)
+       LDLIBRARY='libpython$(VERSION).so'
+       ;;
  unixware*)
        LDLIBRARY='libpython$(VERSION).so'
        ;;
***************
*** 546,551 ****
--- 549,555 ----
  # Set info about shared libraries.
  AC_SUBST(SO)
  AC_SUBST(LDSHARED)
+ AC_SUBST(LDCONFIG)
  AC_SUBST(BLDSHARED)
  AC_SUBST(CCSHARED)
  AC_SUBST(LINKFORSHARED)
***************
*** 561,566 ****
--- 565,583 ----
  	esac
  fi
  AC_MSG_RESULT($SO)
+ # LDCONFIG is the command used to create the ld.so cache in
+ # /etc/ld.so.cache.  Linux only.
+ AC_MSG_CHECKING(LDCONFIG)
+ if test -z "$LDCONFIG"
+ then
+ 	case $ac_sys_system/$ac_sys_release in
+ 	Linux*)
+ 		LDCONFIG="ldconfig";;
+ 	*)
+ 		LDCONFIG="/bin/true";;
+ 	esac
+ fi
+ AC_MSG_RESULT($LDCONFIG)
  # LDSHARED is the ld *command* used to create shared library
  # -- "ld" on SunOS 4.x.x, "ld -G" on SunOS 5.x, "ld -shared" on IRIX 5
  # (Shared libraries in this instance are shared modules to be loaded into




More information about the Python-list mailing list