python-package/setup.py (150 lines of code) (raw):
#!/usr/bin/python
import os
import platform
from setuptools import Extension
from setuptools import setup, find_packages
kn_platform_build_dir = {
('Linux', 'x86_64'): 'linuxX64',
('Linux', 'aarch64'): 'linuxArm64',
('Darwin', 'x86_64'): 'macosX64',
('Darwin', 'arm64'): 'macosArm64',
('Windows', 'AMD64'): 'mingwX64',
}
this_dir = os.path.dirname(os.path.abspath(__file__))
root_dir = os.path.dirname(this_dir)
this_system = platform.system()
kotlin_bridge_src = os.path.join(this_dir, 'kotlin-bridge', 'lets_plot_kotlin_bridge.c')
binaries_build_path = os.path.join(root_dir, 'python-extension', 'build', 'bin',
kn_platform_build_dir[(platform.system(), platform.machine())], 'releaseStatic')
imagemagick_lib_path = os.environ.get('LP_IMAGEMAGICK_PATH')
python_package = 'lets_plot'
def update_js():
js_relative_path = ['js-package', 'build', 'dist', 'js', 'productionExecutable']
js_libs = [
'lets-plot',
]
from shutil import copy
for lib in js_libs:
js_path = os.path.join(root_dir, *js_relative_path, lib + '.js')
dst_dir = os.path.join(this_dir, python_package, 'package_data')
if not os.path.isdir(dst_dir):
os.mkdir(dst_dir)
dst_path = os.path.join(dst_dir, lib + '.min.js')
copy(js_path, dst_path)
version_locals = {}
with open(os.path.join(this_dir, python_package, '_version.py')) as f:
exec(f.read(), {}, version_locals)
with open(os.path.join(root_dir, 'README.md'), encoding='utf-8') as f:
long_description = f.read()
static_link_libraries_list = ['lets_plot_python_extension']
extra_link = []
if this_system == 'Darwin':
static_link_libraries_list += ['c++']
extra_link += [
'-Wl,-rpath,/usr/lib',
'-framework', 'Foundation',
'-lz'
]
if imagemagick_lib_path is not None:
extra_link += [
'-Wl,-rpath,@loader_path/../lib',
f'-L{imagemagick_lib_path}/lib',
'-lMagickWand-7.Q16HDRI',
'-lMagickCore-7.Q16HDRI',
'-lfontconfig',
'-lfreetype',
'-lexpat'
]
elif this_system == 'Windows':
static_link_libraries_list += ['stdc++']
# fix python package build with Kotlin v1.7.20 (and later) on Windows.
extra_link += [
'-static-libgcc',
'-static',
'-lbcrypt',
'-lpthread',
'-lz'
]
if imagemagick_lib_path is not None:
extra_link += [
f'-L{imagemagick_lib_path}/lib',
'-lMagickWand-7.Q16HDRI',
'-lMagickCore-7.Q16HDRI',
'-lfontconfig',
'-lfreetype',
'-lexpat',
'-lurlmon',
'-lgdi32',
'-lz'
]
# fix for "cannot find -lmsvcr140: No such file or directory" compiler error on Windows.
import distutils.cygwinccompiler
distutils.cygwinccompiler.get_msvcr = lambda: []
elif this_system == 'Linux':
static_link_libraries_list += ['stdc++']
extra_link += ['-lz']
if imagemagick_lib_path is not None:
extra_link += [
f'-L{imagemagick_lib_path}/lib',
'-lMagickWand-7.Q16HDRI',
'-lMagickCore-7.Q16HDRI',
'-lfontconfig',
'-lfreetype',
'-lexpat'
]
else:
raise ValueError("Unsupported platform.")
# Adds JS package to Python wheel:
update_js()
setup(name='lets-plot',
license="MIT",
license_files=('LICENSE', 'licenses/*'),
version=version_locals['__version__'],
maintainer='JetBrains',
maintainer_email='lets-plot@jetbrains.com',
author='JetBrains',
author_email='lets-plot@jetbrains.com',
project_urls={
"Github": "https://github.com/JetBrains/lets-plot",
"Documentation": 'https://lets-plot.org',
},
url='https://lets-plot.org',
description='An open source library for statistical plotting',
long_description=long_description,
long_description_content_type='text/markdown',
keywords=["ggplot", "ggplot2", "geospatial", "geopandas", "geocoding"],
classifiers=[
"Development Status :: 5 - Production/Stable",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Framework :: IPython",
"Framework :: Jupyter",
"Operating System :: MacOS",
"Operating System :: POSIX :: Linux",
"Operating System :: Microsoft :: Windows",
"Programming Language :: Python :: Implementation :: CPython",
"Topic :: Scientific/Engineering :: Visualization",
"Intended Audience :: Science/Research",
"Intended Audience :: Developers",
],
packages=find_packages(exclude=('test',)),
package_data={
python_package: [
"package_data/*",
],
},
ext_modules=[
Extension('lets_plot_kotlin_bridge',
include_dirs=[binaries_build_path],
libraries=static_link_libraries_list,
library_dirs=[binaries_build_path],
depends=['liblets_plot_python_extension_api.h'],
sources=[kotlin_bridge_src],
extra_link_args=extra_link
)
],
install_requires=[
'pypng', # for geom_imshow
'palettable', # for geom_imshow
'pillow' # for ggsave() to PDF
],
)