]> git.ipfire.org Git - ipfire-3.x.git/blobdiff - pakfire/patches/0006-python-Byte-compile-all-files-in-sitelib.patch
pakfire: Import latest upstream patches.
[ipfire-3.x.git] / pakfire / patches / 0006-python-Byte-compile-all-files-in-sitelib.patch
diff --git a/pakfire/patches/0006-python-Byte-compile-all-files-in-sitelib.patch b/pakfire/patches/0006-python-Byte-compile-all-files-in-sitelib.patch
new file mode 100644 (file)
index 0000000..070aa47
--- /dev/null
@@ -0,0 +1,167 @@
+From e9e430d4fd5b09327f57651726ffac1b7874ae01 Mon Sep 17 00:00:00 2001
+From: Michael Tremer <michael.tremer@ipfire.org>
+Date: Wed, 3 Oct 2012 00:45:11 +0200
+Subject: [PATCH 6/6] python: Byte-compile all files in sitelib.
+
+For files which are located elsewhere, it is required
+to call:
+  python_bytecompile <path1> <path2>... (Python 2)
+or
+  python3_bytecompile <path1> <path2>... (Python 3)
+---
+ macros/build.macro  | 12 ++++++-
+ macros/python.macro |  3 ++
+ tools/py-compile    | 90 +++++++++++++++++++++++++++++------------------------
+ 3 files changed, 64 insertions(+), 41 deletions(-)
+
+diff --git a/macros/build.macro b/macros/build.macro
+index 6987068..4e4d830 100644
+--- a/macros/build.macro
++++ b/macros/build.macro
+@@ -46,7 +46,17 @@ def MACRO_INSTALL_LOGROTATE_FILES
+ end
+ def MACRO_PYTHON_COMPILE
+-      # XXX TODO
++      if [ -x "%{python3}" ]; then
++              %{python3_bytecompile} \
++                      %{BUILDROOT}%{python3_sitearch} \
++                      %{BUILDROOT}%{python3_sitelib}
++      fi
++
++      if [ -x "%{python}" ]; then
++              %{python_bytecompile} \
++                      %{BUILDROOT}%{python_sitearch} \
++                      %{BUILDROOT}%{python_sitelib}
++      fi
+ end
+ MACRO_PERL_CLEANUP
+diff --git a/macros/python.macro b/macros/python.macro
+index 1b417f2..15c1209 100644
+--- a/macros/python.macro
++++ b/macros/python.macro
+@@ -1,7 +1,9 @@
+ # A bunch of predefined things for Python.
++python_bytecompile_script = /usr/lib/pakfire/py-compile
+ # Python 3 constants.
+ python3 = /usr/bin/python3
++python3_bytecompile = %{python_bytecompile_script} --python=%{python3}
+ python3_sitearch = %(%{python3} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(1))")
+ python3_sitelib  = %(%{python3} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())")
+@@ -9,6 +11,7 @@ python3_version  = %(%{python3} -c "import sys; sys.stdout.write(sys.version[:3]
+ # Python 2 constants.
+ python = /usr/bin/python2
++python_bytecompile = %{python_bytecompile_script} --python=%{python}
+ python_sitearch = %(%{python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib(1)")
+ python_sitelib  = %(%{python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")
+diff --git a/tools/py-compile b/tools/py-compile
+index 66c33ed..5ccd8f9 100755
+--- a/tools/py-compile
++++ b/tools/py-compile
+@@ -1,48 +1,58 @@
+ #!/bin/sh
+-PYTHON=$(which python 2>/dev/null)
++python_interpreter="python"
++paths=""
++
++while [ $# -gt 0 ]; do
++      case "${1}" in
++              --python=*)
++                      python_interpreter=${1#--python=}
++                      ;;
++              *)
++                      paths="${paths} ${1}"
++                      ;;
++      esac
++      shift
++done
+-if [ -z "${PYTHON}" ]; then
+-      # Python is not present. Fail silently.
+-      exit 0
++if [ -z "${paths}" ]; then
++      echo >&2 "No path specified!"
++      exit 1
+ fi
+-files=""
+-for i in $*; do
+-      if [ -e ${i}c ] && [ -e ${i}o ]; then
+-              continue # all files we want are already there
+-      fi
+-      files="$files $i"
+-done
++if [ "${python_interpreter:0:1}" != "/" ]; then
++      python_interpreter=$(which ${python_interpreter} 2>/dev/null)
++fi
+-if [ -z "${files}" ]; then
+-      # No files need to be proceeded.
+-      exit 0
++if [ ! -x "${python_interpreter}" ]; then
++      echo >&2 "Python interpreter is not executable: ${python_interpreter}"
++      exit 1
+ fi
+-$PYTHON -c "
+-import sys, os, string, py_compile
+-
+-files = '''$files'''
+-print 'Byte-compiling python modules...'
+-for file in string.split(files):
+-    if not os.path.exists(file) or not (len(file) >= 3 and file[-3:] == '.py'):
+-        continue
+-    print file,
+-    sys.stdout.flush()
+-    py_compile.compile(file)
+-print" || exit $?
+-
+-# this will fail for python < 1.5, but that doesn't matter ...
+-$PYTHON -O -c "
+-import sys, os, string, py_compile
+-
+-files = '''$files'''
+-print 'Byte-compiling python modules (optimised versions) ...'
+-for file in string.split(files):
+-    if not os.path.exists(file) or not (len(file) >= 3 and file[-3:] == '.py'):
+-        continue
+-    print file,
+-    sys.stdout.flush()
+-    py_compile.compile(file)
+-print" 2>/dev/null || :
++tempfile=$(mktemp)
++trap "rm -f ${tempfile}" EXIT
++
++cat > ${tempfile} <<EOF
++import py_compile
++import sys
++
++for file in sys.argv[1:]:
++      py_compile.compile(file, doraise=0)
++EOF
++
++filelist=$(find ${paths} -type f -a -name "*.py")
++
++# Compile with optimization.
++${python_interpreter} -O ${tempfile} ${filelist}
++
++# Compile without optimization.
++${python_interpreter} ${tempfile} ${filelist}
++
++# Hardlink identical files.
++for pyc in $(find ${paths} -type f -a -name "*.pyc"); do
++      pyo="${pyc/.pyc/.pyo}"
++
++      if cmp -s "${pyc}" "${pyo}"; then
++              ln -f "${pyc}" "${pyo}"
++      fi
++done
+-- 
+1.7.11.4
+