From b9d077c10d0ded84ee91ac375eafb24e1658237d Mon Sep 17 00:00:00 2001 From: Malcolm Tredinnick Date: Tue, 3 Apr 2007 12:28:19 +0000 Subject: [PATCH] Fixed #3338, #3536, #3796 -- Fixed a bunch of setup and build problems in a portable fashion. That took a *lot* longer to debug than I thought it would, so let's try not to break it. git-svn-id: http://code.djangoproject.com/svn/django/trunk@4912 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- MANIFEST.in | 4 ++++ scripts/rpm-install.sh | 12 ++++++++---- setup.cfg | 2 +- setup.py | 37 ++++++++++++++++++++++++++----------- 4 files changed, 39 insertions(+), 16 deletions(-) diff --git a/MANIFEST.in b/MANIFEST.in index 11b60bcc14..a47b6e30f1 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,8 +1,12 @@ +include README include AUTHORS include INSTALL include LICENSE +include MANIFEST.in recursive-include docs * recursive-include scripts * +recursive-include examples * +recursive-include extras * recursive-include django/conf/locale * recursive-include django/contrib/admin/templates * recursive-include django/contrib/admin/media * diff --git a/scripts/rpm-install.sh b/scripts/rpm-install.sh index 07a087c447..d3d95bcdb1 100644 --- a/scripts/rpm-install.sh +++ b/scripts/rpm-install.sh @@ -1,12 +1,14 @@ #! /bin/sh # -# this file is *inserted* into the install section of the generated -# spec file +# This file becomes the install section of the generated spec file. # -# this is, what dist.py normally does +# This is what dist.py normally does. python setup.py install --root=${RPM_BUILD_ROOT} --record="INSTALLED_FILES" +# Sort the filelist so that directories appear before files. This avoids +# duplicate filename problems on some systems. +touch DIRS for i in `cat INSTALLED_FILES`; do if [ -f ${RPM_BUILD_ROOT}/$i ]; then echo $i >>FILES @@ -16,4 +18,6 @@ for i in `cat INSTALLED_FILES`; do fi done -cat DIRS FILES >INSTALLED_FILES +# Make sure we match foo.pyo and foo.pyc along with foo.py (but only once each) +sed -e "/\.py[co]$/d" -e "s/\.py$/.py*/" DIRS FILES >INSTALLED_FILES + diff --git a/setup.cfg b/setup.cfg index ce9779aa00..99bc60c9a3 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,4 +1,4 @@ [bdist_rpm] -doc_files = docs/*.txt +doc_files = docs examples extras AUTHORS INSTALL LICENSE README install-script = scripts/rpm-install.sh diff --git a/setup.py b/setup.py index 6fd6fab816..933ea87b1b 100644 --- a/setup.py +++ b/setup.py @@ -3,6 +3,20 @@ from distutils.command.install import INSTALL_SCHEMES import os import sys +def fullsplit(path, result=None): + """ + Split a pathname into components (the opposite of os.path.join) in a + platform-neutral way. + """ + if result is None: + result = [] + head, tail = os.path.split(path) + if head == '': + return [tail] + result + if head == path: + return result + return fullsplit(head, [tail] + result) + # Tell distutils to put the data_files in platform-specific installation # locations. See here for an explanation: # http://groups.google.com/group/comp.lang.python/browse_thread/thread/35ec7b2fed36eaec/2105ee4d9e8042cb @@ -13,27 +27,28 @@ for scheme in INSTALL_SCHEMES.values(): # an easy way to do this. packages, data_files = [], [] root_dir = os.path.dirname(__file__) -len_root_dir = len(root_dir) django_dir = os.path.join(root_dir, 'django') +pieces = fullsplit(root_dir) +if pieces[-1] == '': + len_root_dir = len(pieces)- 1 +else: + len_root_dir = len(pieces) for dirpath, dirnames, filenames in os.walk(django_dir): # Ignore dirnames that start with '.' for i, dirname in enumerate(dirnames): if dirname.startswith('.'): del dirnames[i] if '__init__.py' in filenames: - package = dirpath[len_root_dir:].lstrip('/').replace('/', '.') - packages.append(package) - else: + packages.append('.'.join(fullsplit(dirpath)[len_root_dir:])) + elif filenames: data_files.append([dirpath, [os.path.join(dirpath, f) for f in filenames]]) -# Small hack for working with bdist_wininst. -# See http://mail.python.org/pipermail/distutils-sig/2004-August/004134.html -if len(sys.argv) > 1 and sys.argv[1] == 'bdist_wininst': - for file_info in data_files: - file_info[0] = '/PURELIB/%s' % file_info[0] - # Dynamically calculate the version based on django.VERSION. -version = "%d.%d-%s" % (__import__('django').VERSION) +version_tuple = __import__('django').VERSION +if version_tuple[2] is not None: + version = "%d.%d_%s" % version_tuple +else: + version = "%d.%d" % version_tuple[:2] setup( name = "Django",