freebsd-ports/lang/python38/files/python3.8.ucl.in
Charlie Li c17ddfbf66
lang/python: add bytecode trigger
Facilitates compiling, writing and removing bytecode files (.pyc)
in site-packages after all pkg transactions have been completed.

Technical details: https://wiki.freebsd.org/Python/CompiledPackages

Fixes reports of Python port builds as root failing on filesystem
violations due to bytecode file writes where the port did not include
them in the package.

For those ports/packages that currently package bytecode, some
checksum mismatches on those files may occur. This is harmless and
will be rectified, in large as part of a USE_PYTHON=distutils
overhaul to reduce churn.

While here, implement a long-standing todo item of letting lang/python
ports use python.mk bits. Not only does this obviate duplicate
variables in each Makefile, but SUB_LIST (also added) is used for
these triggers.

Co-authored by: tcberner
Approved by: tcberner (mentor)
Differential Revision: https://reviews.freebsd.org/D34739
2023-02-15 16:35:07 -05:00

42 lines
1.4 KiB
Text

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
}