2022-02-12 12:34:06 +01:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
|
|
|
import argparse
|
|
|
|
import glob
|
package/pkg-python: clean conflicting pep517 packages before install
The python installer package isn't able to overwrite files of packges
that already exist, this causes problems when doing a rebuild or
update without a full clean.
To fix this we can use functionality from importlib to identify and
remove any conflicting python package files before installation.
We also need to use internals from python-installer, as we want to use
the same logic as pyinstaller uses internally for getting the scheme so
that we ensure we clean the correct package scheme (we want it to be the
same as the one we're installing)
Fixes:
Traceback (most recent call last):
File "/home/buildroot/buildroot/support/scripts/pyinstaller.py", line 69, in <module>
main()
File "/home/buildroot/buildroot/support/scripts/pyinstaller.py", line 61, in main
install(
File "/home/buildroot/buildroot/output/host/lib/python3.10/site-packages/installer/_core.py", line 109, in install
record = destination.write_file(
File "/home/buildroot/buildroot/output/host/lib/python3.10/site-packages/installer/destinations.py", line 207, in write_file
return self.write_to_fs(scheme, path_, stream, is_executable)
File "/home/buildroot/buildroot/output/host/lib/python3.10/site-packages/installer/destinations.py", line 167, in write_to_fs
raise FileExistsError(message)
FileExistsError: File already exists: /home/buildroot/buildroot/output/target/usr/lib/python3.10/site-packages/tinycss2/__init__.py
Signed-off-by: James Hilliard <james.hilliard1@gmail.com>
Tested-by: Marcus Hoffmann <marcus.hoffmann@othermo.de>
[yann.morin.1998@free.fr:
- extend commit log about the use of the installer internals (the
symbols prefixed with '_')
- check path.files against explicitly None
]
Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
2022-08-22 09:54:18 +02:00
|
|
|
import pathlib
|
|
|
|
|
|
|
|
from importlib.machinery import PathFinder
|
|
|
|
from importlib.metadata import DistributionFinder
|
2022-02-12 12:34:06 +01:00
|
|
|
|
|
|
|
from installer import install
|
package/pkg-python: clean conflicting pep517 packages before install
The python installer package isn't able to overwrite files of packges
that already exist, this causes problems when doing a rebuild or
update without a full clean.
To fix this we can use functionality from importlib to identify and
remove any conflicting python package files before installation.
We also need to use internals from python-installer, as we want to use
the same logic as pyinstaller uses internally for getting the scheme so
that we ensure we clean the correct package scheme (we want it to be the
same as the one we're installing)
Fixes:
Traceback (most recent call last):
File "/home/buildroot/buildroot/support/scripts/pyinstaller.py", line 69, in <module>
main()
File "/home/buildroot/buildroot/support/scripts/pyinstaller.py", line 61, in main
install(
File "/home/buildroot/buildroot/output/host/lib/python3.10/site-packages/installer/_core.py", line 109, in install
record = destination.write_file(
File "/home/buildroot/buildroot/output/host/lib/python3.10/site-packages/installer/destinations.py", line 207, in write_file
return self.write_to_fs(scheme, path_, stream, is_executable)
File "/home/buildroot/buildroot/output/host/lib/python3.10/site-packages/installer/destinations.py", line 167, in write_to_fs
raise FileExistsError(message)
FileExistsError: File already exists: /home/buildroot/buildroot/output/target/usr/lib/python3.10/site-packages/tinycss2/__init__.py
Signed-off-by: James Hilliard <james.hilliard1@gmail.com>
Tested-by: Marcus Hoffmann <marcus.hoffmann@othermo.de>
[yann.morin.1998@free.fr:
- extend commit log about the use of the installer internals (the
symbols prefixed with '_')
- check path.files against explicitly None
]
Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
2022-08-22 09:54:18 +02:00
|
|
|
from installer._core import _process_WHEEL_file
|
2022-02-12 12:34:06 +01:00
|
|
|
from installer.destinations import SchemeDictionaryDestination
|
|
|
|
from installer.sources import WheelFile
|
|
|
|
|
|
|
|
|
package/pkg-python: clean conflicting pep517 packages before install
The python installer package isn't able to overwrite files of packges
that already exist, this causes problems when doing a rebuild or
update without a full clean.
To fix this we can use functionality from importlib to identify and
remove any conflicting python package files before installation.
We also need to use internals from python-installer, as we want to use
the same logic as pyinstaller uses internally for getting the scheme so
that we ensure we clean the correct package scheme (we want it to be the
same as the one we're installing)
Fixes:
Traceback (most recent call last):
File "/home/buildroot/buildroot/support/scripts/pyinstaller.py", line 69, in <module>
main()
File "/home/buildroot/buildroot/support/scripts/pyinstaller.py", line 61, in main
install(
File "/home/buildroot/buildroot/output/host/lib/python3.10/site-packages/installer/_core.py", line 109, in install
record = destination.write_file(
File "/home/buildroot/buildroot/output/host/lib/python3.10/site-packages/installer/destinations.py", line 207, in write_file
return self.write_to_fs(scheme, path_, stream, is_executable)
File "/home/buildroot/buildroot/output/host/lib/python3.10/site-packages/installer/destinations.py", line 167, in write_to_fs
raise FileExistsError(message)
FileExistsError: File already exists: /home/buildroot/buildroot/output/target/usr/lib/python3.10/site-packages/tinycss2/__init__.py
Signed-off-by: James Hilliard <james.hilliard1@gmail.com>
Tested-by: Marcus Hoffmann <marcus.hoffmann@othermo.de>
[yann.morin.1998@free.fr:
- extend commit log about the use of the installer internals (the
symbols prefixed with '_')
- check path.files against explicitly None
]
Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
2022-08-22 09:54:18 +02:00
|
|
|
def clean(source, destination):
|
|
|
|
scheme = _process_WHEEL_file(source)
|
|
|
|
scheme_path = destination.scheme_dict[scheme]
|
|
|
|
context = DistributionFinder.Context(
|
|
|
|
name=source.distribution,
|
|
|
|
path=[scheme_path],
|
|
|
|
)
|
|
|
|
for path in PathFinder.find_distributions(context=context):
|
|
|
|
# path.files is either an iterable, or None
|
|
|
|
if path.files is None:
|
|
|
|
continue
|
|
|
|
for file in path.files:
|
|
|
|
file_path = pathlib.Path(file.locate())
|
|
|
|
if file_path.exists():
|
|
|
|
file_path.unlink()
|
|
|
|
|
|
|
|
|
2022-02-12 12:34:06 +01:00
|
|
|
def main():
|
|
|
|
"""Entry point for CLI."""
|
|
|
|
ap = argparse.ArgumentParser("python pyinstaller.py")
|
|
|
|
ap.add_argument("wheel_file", help="Path to a .whl file to install")
|
|
|
|
|
|
|
|
ap.add_argument(
|
|
|
|
"--interpreter", required=True, help="Interpreter path to be used in scripts"
|
|
|
|
)
|
|
|
|
ap.add_argument(
|
|
|
|
"--script-kind",
|
|
|
|
required=True,
|
|
|
|
choices=["posix", "win-ia32", "win-amd64", "win-arm", "win-arm64"],
|
|
|
|
help="Kind of launcher to create for each script",
|
|
|
|
)
|
|
|
|
|
|
|
|
dest_args = ap.add_argument_group("Destination directories")
|
|
|
|
dest_args.add_argument(
|
|
|
|
"--purelib",
|
|
|
|
required=True,
|
|
|
|
help="Directory for platform-independent Python modules",
|
|
|
|
)
|
|
|
|
dest_args.add_argument(
|
|
|
|
"--platlib",
|
|
|
|
help="Directory for platform-dependent Python modules (same as purelib "
|
|
|
|
"if not specified)",
|
|
|
|
)
|
|
|
|
dest_args.add_argument(
|
|
|
|
"--headers", required=True, help="Directory for C header files"
|
|
|
|
)
|
|
|
|
dest_args.add_argument(
|
|
|
|
"--scripts", required=True, help="Directory for executable scripts"
|
|
|
|
)
|
|
|
|
dest_args.add_argument(
|
|
|
|
"--data", required=True, help="Directory for external data files"
|
|
|
|
)
|
|
|
|
args = ap.parse_args()
|
|
|
|
|
|
|
|
destination = SchemeDictionaryDestination(
|
|
|
|
{
|
|
|
|
"purelib": args.purelib,
|
|
|
|
"platlib": args.platlib if args.platlib is not None else args.purelib,
|
|
|
|
"headers": args.headers,
|
|
|
|
"scripts": args.scripts,
|
|
|
|
"data": args.data,
|
|
|
|
},
|
|
|
|
interpreter=args.interpreter,
|
|
|
|
script_kind=args.script_kind,
|
|
|
|
)
|
|
|
|
|
|
|
|
with WheelFile.open(glob.glob(args.wheel_file)[0]) as source:
|
package/pkg-python: clean conflicting pep517 packages before install
The python installer package isn't able to overwrite files of packges
that already exist, this causes problems when doing a rebuild or
update without a full clean.
To fix this we can use functionality from importlib to identify and
remove any conflicting python package files before installation.
We also need to use internals from python-installer, as we want to use
the same logic as pyinstaller uses internally for getting the scheme so
that we ensure we clean the correct package scheme (we want it to be the
same as the one we're installing)
Fixes:
Traceback (most recent call last):
File "/home/buildroot/buildroot/support/scripts/pyinstaller.py", line 69, in <module>
main()
File "/home/buildroot/buildroot/support/scripts/pyinstaller.py", line 61, in main
install(
File "/home/buildroot/buildroot/output/host/lib/python3.10/site-packages/installer/_core.py", line 109, in install
record = destination.write_file(
File "/home/buildroot/buildroot/output/host/lib/python3.10/site-packages/installer/destinations.py", line 207, in write_file
return self.write_to_fs(scheme, path_, stream, is_executable)
File "/home/buildroot/buildroot/output/host/lib/python3.10/site-packages/installer/destinations.py", line 167, in write_to_fs
raise FileExistsError(message)
FileExistsError: File already exists: /home/buildroot/buildroot/output/target/usr/lib/python3.10/site-packages/tinycss2/__init__.py
Signed-off-by: James Hilliard <james.hilliard1@gmail.com>
Tested-by: Marcus Hoffmann <marcus.hoffmann@othermo.de>
[yann.morin.1998@free.fr:
- extend commit log about the use of the installer internals (the
symbols prefixed with '_')
- check path.files against explicitly None
]
Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
2022-08-22 09:54:18 +02:00
|
|
|
clean(source, destination)
|
2022-02-12 12:34:06 +01:00
|
|
|
install(
|
|
|
|
source=source,
|
|
|
|
destination=destination,
|
|
|
|
additional_metadata={},
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
main()
|