Use --hardlink-dupes in %py_byte_compile and brp-python-bytecompile
(for Python 3.9+) Resolves: rhbz#1977895
This commit is contained in:
parent
76209d7bf3
commit
37bf640f37
@ -29,7 +29,6 @@ fi
|
|||||||
# Python < 3.4 (inc. Python 2) uses compileall module from stdlib with some hacks
|
# Python < 3.4 (inc. Python 2) uses compileall module from stdlib with some hacks
|
||||||
# When we drop support for Python 2, we'd be able to use all compileall2 features like:
|
# When we drop support for Python 2, we'd be able to use all compileall2 features like:
|
||||||
# - -s and -p options to manipulate with a path baked into pyc files instead of $real_libdir
|
# - -s and -p options to manipulate with a path baked into pyc files instead of $real_libdir
|
||||||
# - -o 0 -o 1 to produce multiple files in one run - each with a different optimization level - instead of $options
|
|
||||||
# - removed useless $depth - both compileall and compileall2 are limited by sys.getrecursionlimit()
|
# - removed useless $depth - both compileall and compileall2 are limited by sys.getrecursionlimit()
|
||||||
# These changes will make this script much simpler
|
# These changes will make this script much simpler
|
||||||
# In Python >= 3.9, compileall2 was merged back to standard library (compileall) so we can use it directly again.
|
# In Python >= 3.9, compileall2 was merged back to standard library (compileall) so we can use it directly again.
|
||||||
@ -49,6 +48,12 @@ function python_bytecompile()
|
|||||||
#
|
#
|
||||||
if [ "$python_version" -ge 39 ]; then
|
if [ "$python_version" -ge 39 ]; then
|
||||||
|
|
||||||
|
# For Python 3.9+, we compile all opt levels in one go: only
|
||||||
|
# when $options is empty.
|
||||||
|
if [ -n "$options" ]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
[ ! -z $exclude ] && exclude="-x '$exclude'"
|
[ ! -z $exclude ] && exclude="-x '$exclude'"
|
||||||
# -q disables verbose output
|
# -q disables verbose output
|
||||||
# -f forces the process to overwrite existing compiled files
|
# -f forces the process to overwrite existing compiled files
|
||||||
@ -57,7 +62,7 @@ function python_bytecompile()
|
|||||||
# -x and -e together implements the same functionality as the Filter class below
|
# -x and -e together implements the same functionality as the Filter class below
|
||||||
# -s strips $RPM_BUILD_ROOT from the path
|
# -s strips $RPM_BUILD_ROOT from the path
|
||||||
# -p prepends the leading slash to the path to make it absolute
|
# -p prepends the leading slash to the path to make it absolute
|
||||||
$python_binary -B $options -m compileall -q -f $exclude -s "$RPM_BUILD_ROOT" -p / -e "$RPM_BUILD_ROOT" "$python_libdir"
|
$python_binary -B -m compileall -o 0 -o 1 -q -f $exclude -s "$RPM_BUILD_ROOT" -p / --hardlink-dupes -e "$RPM_BUILD_ROOT" "$python_libdir"
|
||||||
|
|
||||||
#
|
#
|
||||||
# Python 3.4 and higher
|
# Python 3.4 and higher
|
||||||
@ -133,6 +138,7 @@ do
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Generate optimized (.pyo) byte-compiled files.
|
# Generate optimized (.pyo) byte-compiled files.
|
||||||
|
# N.B. For Python 3.9+, this call does nothing
|
||||||
python_bytecompile "-O" "$python_binary" "" "$python_libdir" "$depth" "$real_libdir"
|
python_bytecompile "-O" "$python_binary" "" "$python_libdir" "$depth" "$real_libdir"
|
||||||
if [ $? -ne 0 -a 0$errors_terminate -ne 0 ]; then
|
if [ $? -ne 0 -a 0$errors_terminate -ne 0 ]; then
|
||||||
# One or more of the files had a syntax error
|
# One or more of the files had a syntax error
|
||||||
|
@ -34,7 +34,7 @@ py3_byte_compile () {\
|
|||||||
py39_byte_compile () {\
|
py39_byte_compile () {\
|
||||||
python_binary="env PYTHONHASHSEED=0 %1"\
|
python_binary="env PYTHONHASHSEED=0 %1"\
|
||||||
bytecode_compilation_path="%2"\
|
bytecode_compilation_path="%2"\
|
||||||
$python_binary -s -B -m compileall -o 0 -o 1 -s $RPM_BUILD_ROOT -p / $bytecode_compilation_path \
|
$python_binary -s -B -m compileall -o 0 -o 1 -s $RPM_BUILD_ROOT -p / --hardlink-dupes $bytecode_compilation_path \
|
||||||
}\
|
}\
|
||||||
\
|
\
|
||||||
# Path to intepreter should not contain any arguments \
|
# Path to intepreter should not contain any arguments \
|
||||||
|
@ -47,7 +47,7 @@ elseif posix.stat('macros.python-srpm') then
|
|||||||
end
|
end
|
||||||
}
|
}
|
||||||
Version: %{__default_python3_version}
|
Version: %{__default_python3_version}
|
||||||
Release: 7%{?dist}
|
Release: 8%{?dist}
|
||||||
|
|
||||||
BuildArch: noarch
|
BuildArch: noarch
|
||||||
|
|
||||||
@ -141,6 +141,11 @@ install -m 755 brp-* %{buildroot}%{_rpmconfigdir}/redhat/
|
|||||||
|
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Thu Sep 09 2021 Petr Viktorin <pviktori@redhat.com> - 3.10-8
|
||||||
|
- Use --hardlink-dupes in %%py_byte_compile and brp-python-bytecompile
|
||||||
|
(for Python 3.9+)
|
||||||
|
- Resolves: rhbz#1977895
|
||||||
|
|
||||||
* Fri Jul 23 2021 Fedora Release Engineering <releng@fedoraproject.org> - 3.9-7
|
* Fri Jul 23 2021 Fedora Release Engineering <releng@fedoraproject.org> - 3.9-7
|
||||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
|
||||||
|
|
||||||
|
@ -19,15 +19,35 @@ echo "print()" > %{buildroot}%{basedir}/directory/to/test/recursion/file_in_dir.
|
|||||||
%py_byte_compile %{python3} %{buildroot}%{basedir}/file.py
|
%py_byte_compile %{python3} %{buildroot}%{basedir}/file.py
|
||||||
%py_byte_compile %{python3} %{buildroot}%{basedir}/directory
|
%py_byte_compile %{python3} %{buildroot}%{basedir}/directory
|
||||||
|
|
||||||
|
# Files in sitelib are compiled automatically by brp-python-bytecompile
|
||||||
|
mkdir -p %{buildroot}%{python3_sitelib}/directory/
|
||||||
|
echo "print()" > %{buildroot}%{python3_sitelib}/directory/file.py
|
||||||
|
|
||||||
%check
|
%check
|
||||||
|
LOCATIONS="%{buildroot}%{basedir} %{buildroot}%{python3_sitelib}/directory/"
|
||||||
|
|
||||||
# Count .py and .pyc files
|
# Count .py and .pyc files
|
||||||
PY=$(find %{buildroot}%{basedir} -name "*.py" | wc -l)
|
PY=$(find $LOCATIONS -name "*.py" | wc -l)
|
||||||
PYC=$(find %{buildroot}%{basedir} -name "*.pyc" | wc -l)
|
PYC=$(find $LOCATIONS -name "*.pyc" | wc -l)
|
||||||
|
|
||||||
|
# We should have 3 .py files
|
||||||
|
test $PY -eq 3
|
||||||
|
|
||||||
# Every .py file should be byte-compiled to two .pyc files (optimization level 0 and 1)
|
# Every .py file should be byte-compiled to two .pyc files (optimization level 0 and 1)
|
||||||
# so we should have two times more .pyc files than .py files
|
# so we should have two times more .pyc files than .py files
|
||||||
test $(expr $PY \* 2) -eq $PYC
|
test $(expr $PY \* 2) -eq $PYC
|
||||||
|
|
||||||
|
# In this case the .pyc files should be identical across omtimization levels
|
||||||
|
# (they don't use docstrings and assert staements)
|
||||||
|
# So they should be hardlinked; the number of distinct inodes should match the
|
||||||
|
# number of source files. (Or be smaller, if the dupe detection is done
|
||||||
|
# across all files.)
|
||||||
|
|
||||||
|
INODES=$(stat --format %i $(find $LOCATIONS -name "*.pyc") | sort -u | wc -l)
|
||||||
|
test $PY -ge $INODES
|
||||||
|
|
||||||
|
|
||||||
%files
|
%files
|
||||||
%pycached %{basedir}/file.py
|
%pycached %{basedir}/file.py
|
||||||
%pycached %{basedir}/directory/to/test/recursion/file_in_dir.py
|
%pycached %{basedir}/directory/to/test/recursion/file_in_dir.py
|
||||||
|
%pycached %{python3_sitelib}/directory/file.py
|
||||||
|
Loading…
Reference in New Issue
Block a user