summaryrefslogtreecommitdiffstats
path: root/flit/build.py
diff options
context:
space:
mode:
Diffstat (limited to 'flit/build.py')
-rw-r--r--flit/build.py60
1 files changed, 60 insertions, 0 deletions
diff --git a/flit/build.py b/flit/build.py
new file mode 100644
index 0000000..2917b18
--- /dev/null
+++ b/flit/build.py
@@ -0,0 +1,60 @@
+"""flit build - build both wheel and sdist"""
+
+from contextlib import contextmanager
+import logging
+import os
+from pathlib import Path
+import tarfile
+from tempfile import TemporaryDirectory
+from types import SimpleNamespace
+import sys
+
+from .config import read_flit_config, ConfigError
+from .sdist import SdistBuilder
+from .wheel import make_wheel_in
+
+log = logging.getLogger(__name__)
+
+ALL_FORMATS = {'wheel', 'sdist'}
+
+@contextmanager
+def unpacked_tarball(path):
+ tf = tarfile.open(str(path))
+ with TemporaryDirectory() as tmpdir:
+ tf.extractall(tmpdir)
+ files = os.listdir(tmpdir)
+ assert len(files) == 1, files
+ yield os.path.join(tmpdir, files[0])
+
+def main(ini_file: Path, formats=None, gen_setup_py=True):
+ """Build wheel and sdist"""
+ if not formats:
+ formats = ALL_FORMATS
+ elif not formats.issubset(ALL_FORMATS):
+ raise ValueError("Unknown package formats: {}".format(formats - ALL_FORMATS))
+
+ sdist_info = wheel_info = None
+ dist_dir = ini_file.parent / 'dist'
+ dist_dir.mkdir(parents=True, exist_ok=True)
+
+ try:
+ # Load the config file to make sure it gets validated
+ read_flit_config(ini_file)
+
+ if 'sdist' in formats:
+ sb = SdistBuilder.from_ini_path(ini_file)
+ sdist_file = sb.build(dist_dir, gen_setup_py=gen_setup_py)
+ sdist_info = SimpleNamespace(builder=sb, file=sdist_file)
+ # When we're building both, build the wheel from the unpacked sdist.
+ # This helps ensure that the sdist contains all the necessary files.
+ if 'wheel' in formats:
+ with unpacked_tarball(sdist_file) as tmpdir:
+ log.debug('Building wheel from unpacked sdist %s', tmpdir)
+ tmp_ini_file = Path(tmpdir, ini_file.name)
+ wheel_info = make_wheel_in(tmp_ini_file, dist_dir)
+ elif 'wheel' in formats:
+ wheel_info = make_wheel_in(ini_file, dist_dir)
+ except ConfigError as e:
+ sys.exit('Config error: {}'.format(e))
+
+ return SimpleNamespace(wheel=wheel_info, sdist=sdist_info)