summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES8
-rw-r--r--Mk/Uses/python.mk25
-rw-r--r--UPDATING17
-rw-r--r--lang/python310/Makefile11
-rw-r--r--lang/python310/files/python3.10.ucl.in40
-rw-r--r--lang/python311/Makefile11
-rw-r--r--lang/python311/files/python3.11.ucl.in40
-rw-r--r--lang/python37/Makefile10
-rw-r--r--lang/python37/files/python3.7.ucl.in42
-rw-r--r--lang/python38/Makefile10
-rw-r--r--lang/python38/files/python3.8.ucl.in42
-rw-r--r--lang/python39/Makefile11
-rw-r--r--lang/python39/files/python3.9.ucl.in40
13 files changed, 269 insertions, 38 deletions
diff --git a/CHANGES b/CHANGES
index 2c65d5dbbe11..a8736d2217ea 100644
--- a/CHANGES
+++ b/CHANGES
@@ -10,6 +10,14 @@ in the release notes and/or placed into UPDATING.
All ports committers are allowed to commit to this file.
+20230215:
+AUTHOR: vishwin@FreeBSD.org
+
+ USES=python now includes SUB_LIST entries to facilitate common
+ substitutions for python.mk variables other than in ${PLIST}.
+ They are the same as PLIST_SUB, except PYTHON_INCLUDEDIR,
+ PYTHON_LIBDIR and PYTHON_SITELIBDIR include ${PREFIX}.
+
20230111:
AUTHOR: vishwin@FreeBSD.org
diff --git a/Mk/Uses/python.mk b/Mk/Uses/python.mk
index 4e98aa29603c..7017308e7c9c 100644
--- a/Mk/Uses/python.mk
+++ b/Mk/Uses/python.mk
@@ -257,17 +257,20 @@
# packages for different Python versions.
# default: -py${PYTHON_SUFFIX}
#
-# Using USES=python also will add some useful entries to PLIST_SUB:
+# Using USES=python also will add some useful entries to SUB_LIST and PLIST_SUB:
#
-# PYTHON_INCLUDEDIR=${PYTHONPREFIX_INCLUDEDIR:S;${PREFIX}/;;}
-# PYTHON_LIBDIR=${PYTHONPREFIX_LIBDIR:S;${PREFIX}/;;}
+# PYTHON_INCLUDEDIR=${PYTHONPREFIX_INCLUDEDIR}
+# PYTHON_LIBDIR=${PYTHONPREFIX_LIBDIR}
# PYTHON_PLATFORM=${PYTHON_PLATFORM}
-# PYTHON_SITELIBDIR=${PYTHONPREFIX_SITELIBDIR:S;${PREFIX}/;;}
+# PYTHON_SITELIBDIR=${PYTHONPREFIX_SITELIBDIR}
# PYTHON_SUFFIX=${PYTHON_SUFFIX}
# PYTHON_VER=${PYTHON_VER}
# PYTHON_VERSION=${PYTHON_VERSION}
#
-# and PYTHON2 and PYTHON3 will be set according to the Python version:
+# where PYTHON_INCLUDEDIR, PYTHON_LIBDIR and PYTHON_SITELIBDIR have their PREFIX
+# stripped for PLIST_SUB.
+#
+# PYTHON2 and PYTHON3 will also be set according to the Python version:
#
# PYTHON2="" PYTHON3="@comment " for Python 2.x
# PYTHON2="@comment " PYTHON3="" for Python 3.x
@@ -785,6 +788,16 @@ ${_stage}_DEPENDS+= ${PYTHON_CMD}:${PYTHON_PORTSDIR}
PREFIX= ${PYTHONBASE}
. endif
+# Substitutions for SUB_FILES
+SUB_LIST+= PYTHON_INCLUDEDIR=${PYTHONPREFIX_INCLUDEDIR} \
+ PYTHON_LIBDIR=${PYTHONPREFIX_LIBDIR} \
+ PYTHON_PLATFORM=${PYTHON_PLATFORM} \
+ PYTHON_SITELIBDIR=${PYTHONPREFIX_SITELIBDIR} \
+ PYTHON_SUFFIX=${PYTHON_SUFFIX} \
+ PYTHON_EXT_SUFFIX=${PYTHON_EXT_SUFFIX} \
+ PYTHON_VER=${PYTHON_VER} \
+ PYTHON_VERSION=${PYTHON_VERSION}
+
# Substitutions for pkg-plist
# Use a short form of the PYTHONPREFIX_*DIR variables; we don't need the
# base directory in the plist file.
@@ -797,8 +810,10 @@ PLIST_SUB+= PYTHON_INCLUDEDIR=${PYTHONPREFIX_INCLUDEDIR:S;${PREFIX}/;;} \
PYTHON_VER=${PYTHON_VER} \
PYTHON_VERSION=${PYTHON_VERSION}
. if ${PYTHON_REL} < 30000
+SUB_LIST+= PYTHON2="" PYTHON3="@comment "
PLIST_SUB+= PYTHON2="" PYTHON3="@comment "
. else
+SUB_LIST+= PYTHON2="@comment " PYTHON3=""
PLIST_SUB+= PYTHON2="@comment " PYTHON3=""
. endif
diff --git a/UPDATING b/UPDATING
index 9a4ea9c7a5ed..d3bd39a6dcb5 100644
--- a/UPDATING
+++ b/UPDATING
@@ -5,6 +5,23 @@ they are unavoidable.
You should get into the habit of checking this file for changes each time
you update your ports collection, before attempting any port upgrades.
+20230215:
+ AFFECTS: users of python
+ AUTHOR: vishwin@FreeBSD.org
+
+ A trigger has been added to the lang/python3* ports to compile,
+ write and remove bytecode files (.pyc) in site-packages after all
+ pkg transactions have been completed. pkg will no longer manage
+ such files directly, as they are meant to be generated after
+ installation.
+
+ For those ports/packages that still package bytecode, some package
+ checksum mismatches on those files may occur. This is harmless
+ and will be rectified.
+
+ Technical details available at:
+ https://wiki.freebsd.org/Python/CompiledPackages
+
20230213:
Affects: users of sysutils/nut*
AUTHOR: cy@FreeBSD.org
diff --git a/lang/python310/Makefile b/lang/python310/Makefile
index 7e51ea43cce1..66974f6c5366 100644
--- a/lang/python310/Makefile
+++ b/lang/python310/Makefile
@@ -1,5 +1,6 @@
PORTNAME= python
DISTVERSION= ${PYTHON_DISTVERSION}
+PORTREVISION= 1
CATEGORIES= lang python
MASTER_SITES= PYTHON/ftp/python/${DISTVERSION:C/[a-z].*//}
PKGNAMESUFFIX= ${PYTHON_SUFFIX}
@@ -14,8 +15,8 @@ LICENSE= PSFL
LIB_DEPENDS= libffi.so:devel/libffi
-USES= compiler:c11 cpe ncurses pathfix pkgconfig readline \
- shebangfix ssl tar:xz
+USES= compiler:c11 cpe ncurses pathfix pkgconfig \
+ python:${PYTHON_DISTVERSION:R},env readline shebangfix ssl tar:xz trigger
PATHFIX_MAKEFILEIN= Makefile.pre.in
USE_LDCONFIG= yes
GNU_CONFIGURE= yes
@@ -24,11 +25,7 @@ SHEBANG_FILES= Lib/*.py Lib/*/*.py Lib/*/*/*.py Lib/*/*/*/*.py
SHEBANG_FILES+= Lib/test/ziptestdata/exe_with_z64 \
Lib/test/ziptestdata/exe_with_zip \
Lib/test/ziptestdata/header.sh
-
-# Duplicate python.mk variables. TODO: Let lang/python?? ports use python.mk bits.
-PYTHON_VER= ${PYTHON_DISTVERSION:R}
-PYTHON_VERSION= python${PYTHON_VER}
-PYTHON_SUFFIX= ${PYTHON_VER:S/.//g}
+TRIGGERS= ${PYTHON_VERSION}
DISABLED_EXTENSIONS= _sqlite3 _tkinter _gdbm
CONFIGURE_ARGS+= --enable-shared --without-ensurepip \
diff --git a/lang/python310/files/python3.10.ucl.in b/lang/python310/files/python3.10.ucl.in
new file mode 100644
index 000000000000..63d455839549
--- /dev/null
+++ b/lang/python310/files/python3.10.ucl.in
@@ -0,0 +1,40 @@
+path_glob: "%%PYTHON_SITELIBDIR%%/*"
+trigger: {
+ type: lua
+ sandbox: false
+ script: <<EOS
+function cleanup(directory)
+ for _,d in ipairs(pkg.readdir(directory)) do
+ local full_path = directory .. "/" .. d
+ local stat = pkg.stat(full_path)
+ if stat["type"] == "dir" then
+ if (d ~= "__pycache__") then
+ cleanup(full_path)
+ else
+ for _,bytecode_file in ipairs(pkg.readdir(full_path)) do
+ local file_origin = string.gsub(bytecode_file, "[.]cpython[-]%%PYTHON_SUFFIX%%[.].*pyc", ".py")
+ if file_origin then
+ local origin_path = directory .. "/" .. file_origin
+ if (not pkg.stat(origin_path)) then
+ --print(" >=> removed stale bytecode " .. bytecode_file)
+ os.remove(full_path .. "/" .. bytecode_file)
+ end
+ end
+ end
+ end
+ local res = pkg.readdir(full_path)
+ if #res == 0 then
+ --print(" >=> removed empty directory " .. full_path )
+ os.remove(full_path)
+ end
+ end
+ end
+end
+
+print(">=> Cleaning stale bytecode files...")
+cleanup("%%PYTHON_SITELIBDIR%%")
+
+print(">=> Byte-compiling Python source files...")
+pkg.exec({"%%PYTHON_VERSION%%", "-m", "compileall", "-q", "-o", "0", "-o", "1", "-o", "2", "%%PYTHON_SITELIBDIR%%"})
+EOS
+}
diff --git a/lang/python311/Makefile b/lang/python311/Makefile
index 81b31ae90b5c..537d1c352706 100644
--- a/lang/python311/Makefile
+++ b/lang/python311/Makefile
@@ -1,5 +1,6 @@
PORTNAME= python
DISTVERSION= ${PYTHON_DISTVERSION}
+PORTREVISION= 1
CATEGORIES= lang python
MASTER_SITES= PYTHON/ftp/python/${DISTVERSION:C/[a-z].*//}
PKGNAMESUFFIX= ${PYTHON_SUFFIX}
@@ -14,8 +15,8 @@ LICENSE= PSFL
LIB_DEPENDS= libffi.so:devel/libffi
-USES= compiler:c11 cpe ncurses pathfix pkgconfig readline \
- shebangfix ssl tar:xz
+USES= compiler:c11 cpe ncurses pathfix pkgconfig \
+ python:${PYTHON_DISTVERSION:R},env readline shebangfix ssl tar:xz trigger
PATHFIX_MAKEFILEIN= Makefile.pre.in
USE_LDCONFIG= yes
GNU_CONFIGURE= yes
@@ -24,11 +25,7 @@ SHEBANG_FILES= Lib/*.py Lib/*/*.py Lib/*/*/*.py Lib/*/*/*/*.py
SHEBANG_FILES+= Lib/test/ziptestdata/exe_with_z64 \
Lib/test/ziptestdata/exe_with_zip \
Lib/test/ziptestdata/header.sh
-
-# Duplicate python.mk variables. TODO: Let lang/python?? ports use python.mk bits.
-PYTHON_VER= ${PYTHON_DISTVERSION:R}
-PYTHON_VERSION= python${PYTHON_VER}
-PYTHON_SUFFIX= ${PYTHON_VER:S/.//g}
+TRIGGERS= ${PYTHON_VERSION}
DISABLED_EXTENSIONS= _sqlite3 _tkinter _gdbm
CONFIGURE_ARGS+= --enable-shared --without-ensurepip \
diff --git a/lang/python311/files/python3.11.ucl.in b/lang/python311/files/python3.11.ucl.in
new file mode 100644
index 000000000000..63d455839549
--- /dev/null
+++ b/lang/python311/files/python3.11.ucl.in
@@ -0,0 +1,40 @@
+path_glob: "%%PYTHON_SITELIBDIR%%/*"
+trigger: {
+ type: lua
+ sandbox: false
+ script: <<EOS
+function cleanup(directory)
+ for _,d in ipairs(pkg.readdir(directory)) do
+ local full_path = directory .. "/" .. d
+ local stat = pkg.stat(full_path)
+ if stat["type"] == "dir" then
+ if (d ~= "__pycache__") then
+ cleanup(full_path)
+ else
+ for _,bytecode_file in ipairs(pkg.readdir(full_path)) do
+ local file_origin = string.gsub(bytecode_file, "[.]cpython[-]%%PYTHON_SUFFIX%%[.].*pyc", ".py")
+ if file_origin then
+ local origin_path = directory .. "/" .. file_origin
+ if (not pkg.stat(origin_path)) then
+ --print(" >=> removed stale bytecode " .. bytecode_file)
+ os.remove(full_path .. "/" .. bytecode_file)
+ end
+ end
+ end
+ end
+ local res = pkg.readdir(full_path)
+ if #res == 0 then
+ --print(" >=> removed empty directory " .. full_path )
+ os.remove(full_path)
+ end
+ end
+ end
+end
+
+print(">=> Cleaning stale bytecode files...")
+cleanup("%%PYTHON_SITELIBDIR%%")
+
+print(">=> Byte-compiling Python source files...")
+pkg.exec({"%%PYTHON_VERSION%%", "-m", "compileall", "-q", "-o", "0", "-o", "1", "-o", "2", "%%PYTHON_SITELIBDIR%%"})
+EOS
+}
diff --git a/lang/python37/Makefile b/lang/python37/Makefile
index ba87a69cb89e..29abf7366ba1 100644
--- a/lang/python37/Makefile
+++ b/lang/python37/Makefile
@@ -1,5 +1,6 @@
PORTNAME= python
DISTVERSION= ${PYTHON_DISTVERSION}
+PORTREVISION= 1
CATEGORIES= lang python
MASTER_SITES= PYTHON/ftp/python/${DISTVERSION}
PKGNAMESUFFIX= ${PYTHON_SUFFIX}
@@ -18,17 +19,14 @@ EXPIRATION_DATE= 2023-06-27
LIB_DEPENDS= libffi.so:devel/libffi \
libmpdec.so:math/mpdecimal
-USES= cpe ncurses pathfix pkgconfig readline shebangfix ssl tar:xz
+USES= cpe ncurses pathfix pkgconfig python:${PYTHON_DISTVERSION:R},env readline \
+ shebangfix ssl tar:xz trigger
PATHFIX_MAKEFILEIN= Makefile.pre.in
USE_LDCONFIG= yes
GNU_CONFIGURE= yes
python_CMD= ${PREFIX}/bin/python${PYTHON_DISTVERSION:R}
SHEBANG_FILES= Lib/*.py Lib/*/*.py Lib/*/*/*.py Lib/*/*/*/*.py
-
-# Duplicate python.mk variables. TODO: Let lang/python?? ports use python.mk bits.
-PYTHON_VER= ${PYTHON_DISTVERSION:R}
-PYTHON_VERSION= python${PYTHON_VER}
-PYTHON_SUFFIX= ${PYTHON_VER:S/.//g}
+TRIGGERS= ${PYTHON_VERSION}
DISABLED_EXTENSIONS= _sqlite3 _tkinter _gdbm
CONFIGURE_ARGS+= --enable-shared --with-system-ffi --with-system-libmpdec --without-ensurepip
diff --git a/lang/python37/files/python3.7.ucl.in b/lang/python37/files/python3.7.ucl.in
new file mode 100644
index 000000000000..a9ebb18f9c27
--- /dev/null
+++ b/lang/python37/files/python3.7.ucl.in
@@ -0,0 +1,42 @@
+path_glob: "%%PYTHON_SITELIBDIR%%/*"
+trigger: {
+ type: lua
+ sandbox: false
+ script: <<EOS
+function cleanup(directory)
+ for _,d in ipairs(pkg.readdir(directory)) do
+ local full_path = directory .. "/" .. d
+ local stat = pkg.stat(full_path)
+ if stat["type"] == "dir" then
+ if (d ~= "__pycache__") then
+ cleanup(full_path)
+ else
+ for _,bytecode_file in ipairs(pkg.readdir(full_path)) do
+ local file_origin = string.gsub(bytecode_file, "[.]cpython[-]%%PYTHON_SUFFIX%%[.].*pyc", ".py")
+ if file_origin then
+ local origin_path = directory .. "/" .. file_origin
+ if (not pkg.stat(origin_path)) then
+ --print(" >=> removed stale bytecode " .. bytecode_file)
+ os.remove(full_path .. "/" .. bytecode_file)
+ end
+ end
+ end
+ end
+ local res = pkg.readdir(full_path)
+ if #res == 0 then
+ --print(" >=> removed empty directory " .. full_path )
+ os.remove(full_path)
+ end
+ end
+ end
+end
+
+print(">=> Cleaning stale bytecode files...")
+cleanup("%%PYTHON_SITELIBDIR%%")
+
+print(">=> Byte-compiling Python source files...")
+pkg.exec({"%%PYTHON_VERSION%%", "-m", "compileall", "-q", "%%PYTHON_SITELIBDIR%%"})
+pkg.exec({"%%PYTHON_VERSION%%", "-O", "-m", "compileall", "-q", "%%PYTHON_SITELIBDIR%%"})
+pkg.exec({"%%PYTHON_VERSION%%", "-OO", "-m", "compileall", "-q", "%%PYTHON_SITELIBDIR%%"})
+EOS
+}
diff --git a/lang/python38/Makefile b/lang/python38/Makefile
index fd476d48aecf..07a565977f73 100644
--- a/lang/python38/Makefile
+++ b/lang/python38/Makefile
@@ -1,5 +1,6 @@
PORTNAME= python
DISTVERSION= ${PYTHON_DISTVERSION}
+PORTREVISION= 1
CATEGORIES= lang python
MASTER_SITES= PYTHON/ftp/python/${DISTVERSION}
PKGNAMESUFFIX= ${PYTHON_SUFFIX}
@@ -14,7 +15,8 @@ LICENSE= PSFL
LIB_DEPENDS= libffi.so:devel/libffi
-USES= cpe ncurses pathfix pkgconfig readline shebangfix ssl tar:xz
+USES= cpe ncurses pathfix pkgconfig python:${PYTHON_DISTVERSION:R},env readline \
+ shebangfix ssl tar:xz trigger
PATHFIX_MAKEFILEIN= Makefile.pre.in
USE_LDCONFIG= yes
GNU_CONFIGURE= yes
@@ -23,11 +25,7 @@ SHEBANG_FILES= Lib/*.py Lib/*/*.py Lib/*/*/*.py Lib/*/*/*/*.py
SHEBANG_FILES+= Lib/test/ziptestdata/exe_with_z64 \
Lib/test/ziptestdata/exe_with_zip \
Lib/test/ziptestdata/header.sh
-
-# Duplicate python.mk variables. TODO: Let lang/python?? ports use python.mk bits.
-PYTHON_VER= ${PYTHON_DISTVERSION:R}
-PYTHON_VERSION= python${PYTHON_VER}
-PYTHON_SUFFIX= ${PYTHON_VER:S/.//g}
+TRIGGERS= ${PYTHON_VERSION}
DISABLED_EXTENSIONS= _sqlite3 _tkinter _gdbm
CONFIGURE_ARGS+= --enable-shared --without-ensurepip \
diff --git a/lang/python38/files/python3.8.ucl.in b/lang/python38/files/python3.8.ucl.in
new file mode 100644
index 000000000000..a9ebb18f9c27
--- /dev/null
+++ b/lang/python38/files/python3.8.ucl.in
@@ -0,0 +1,42 @@
+path_glob: "%%PYTHON_SITELIBDIR%%/*"
+trigger: {
+ type: lua
+ sandbox: false
+ script: <<EOS
+function cleanup(directory)
+ for _,d in ipairs(pkg.readdir(directory)) do
+ local full_path = directory .. "/" .. d
+ local stat = pkg.stat(full_path)
+ if stat["type"] == "dir" then
+ if (d ~= "__pycache__") then
+ cleanup(full_path)
+ else
+ for _,bytecode_file in ipairs(pkg.readdir(full_path)) do
+ local file_origin = string.gsub(bytecode_file, "[.]cpython[-]%%PYTHON_SUFFIX%%[.].*pyc", ".py")
+ if file_origin then
+ local origin_path = directory .. "/" .. file_origin
+ if (not pkg.stat(origin_path)) then
+ --print(" >=> removed stale bytecode " .. bytecode_file)
+ os.remove(full_path .. "/" .. bytecode_file)
+ end
+ end
+ end
+ end
+ local res = pkg.readdir(full_path)
+ if #res == 0 then
+ --print(" >=> removed empty directory " .. full_path )
+ os.remove(full_path)
+ end
+ end
+ end
+end
+
+print(">=> Cleaning stale bytecode files...")
+cleanup("%%PYTHON_SITELIBDIR%%")
+
+print(">=> Byte-compiling Python source files...")
+pkg.exec({"%%PYTHON_VERSION%%", "-m", "compileall", "-q", "%%PYTHON_SITELIBDIR%%"})
+pkg.exec({"%%PYTHON_VERSION%%", "-O", "-m", "compileall", "-q", "%%PYTHON_SITELIBDIR%%"})
+pkg.exec({"%%PYTHON_VERSION%%", "-OO", "-m", "compileall", "-q", "%%PYTHON_SITELIBDIR%%"})
+EOS
+}
diff --git a/lang/python39/Makefile b/lang/python39/Makefile
index 58d7f7372ab2..178b0bc8b070 100644
--- a/lang/python39/Makefile
+++ b/lang/python39/Makefile
@@ -1,5 +1,6 @@
PORTNAME= python
DISTVERSION= ${PYTHON_DISTVERSION}
+PORTREVISION= 1
CATEGORIES= lang python
MASTER_SITES= PYTHON/ftp/python/${DISTVERSION}
PKGNAMESUFFIX= ${PYTHON_SUFFIX}
@@ -14,8 +15,8 @@ LICENSE= PSFL
LIB_DEPENDS= libffi.so:devel/libffi
-USES= compiler:c11 cpe ncurses pathfix pkgconfig readline \
- shebangfix ssl tar:xz
+USES= compiler:c11 cpe ncurses pathfix pkgconfig \
+ python:${PYTHON_DISTVERSION:R},env readline shebangfix ssl tar:xz trigger
PATHFIX_MAKEFILEIN= Makefile.pre.in
USE_LDCONFIG= yes
GNU_CONFIGURE= yes
@@ -24,11 +25,7 @@ SHEBANG_FILES= Lib/*.py Lib/*/*.py Lib/*/*/*.py Lib/*/*/*/*.py
SHEBANG_FILES+= Lib/test/ziptestdata/exe_with_z64 \
Lib/test/ziptestdata/exe_with_zip \
Lib/test/ziptestdata/header.sh
-
-# Duplicate python.mk variables. TODO: Let lang/python?? ports use python.mk bits.
-PYTHON_VER= ${PYTHON_DISTVERSION:R}
-PYTHON_VERSION= python${PYTHON_VER}
-PYTHON_SUFFIX= ${PYTHON_VER:S/.//g}
+TRIGGERS= ${PYTHON_VERSION}
DISABLED_EXTENSIONS= _sqlite3 _tkinter _gdbm
CONFIGURE_ARGS+= --enable-shared --without-ensurepip \
diff --git a/lang/python39/files/python3.9.ucl.in b/lang/python39/files/python3.9.ucl.in
new file mode 100644
index 000000000000..63d455839549
--- /dev/null
+++ b/lang/python39/files/python3.9.ucl.in
@@ -0,0 +1,40 @@
+path_glob: "%%PYTHON_SITELIBDIR%%/*"
+trigger: {
+ type: lua
+ sandbox: false
+ script: <<EOS
+function cleanup(directory)
+ for _,d in ipairs(pkg.readdir(directory)) do
+ local full_path = directory .. "/" .. d
+ local stat = pkg.stat(full_path)
+ if stat["type"] == "dir" then
+ if (d ~= "__pycache__") then
+ cleanup(full_path)
+ else
+ for _,bytecode_file in ipairs(pkg.readdir(full_path)) do
+ local file_origin = string.gsub(bytecode_file, "[.]cpython[-]%%PYTHON_SUFFIX%%[.].*pyc", ".py")
+ if file_origin then
+ local origin_path = directory .. "/" .. file_origin
+ if (not pkg.stat(origin_path)) then
+ --print(" >=> removed stale bytecode " .. bytecode_file)
+ os.remove(full_path .. "/" .. bytecode_file)
+ end
+ end
+ end
+ end
+ local res = pkg.readdir(full_path)
+ if #res == 0 then
+ --print(" >=> removed empty directory " .. full_path )
+ os.remove(full_path)
+ end
+ end
+ end
+end
+
+print(">=> Cleaning stale bytecode files...")
+cleanup("%%PYTHON_SITELIBDIR%%")
+
+print(">=> Byte-compiling Python source files...")
+pkg.exec({"%%PYTHON_VERSION%%", "-m", "compileall", "-q", "-o", "0", "-o", "1", "-o", "2", "%%PYTHON_SITELIBDIR%%"})
+EOS
+}