aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/scripts/dist.py
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild/scripts/dist.py')
-rw-r--r--mesonbuild/scripts/dist.py85
1 files changed, 63 insertions, 22 deletions
diff --git a/mesonbuild/scripts/dist.py b/mesonbuild/scripts/dist.py
index 1b50655..64335d1 100644
--- a/mesonbuild/scripts/dist.py
+++ b/mesonbuild/scripts/dist.py
@@ -13,14 +13,16 @@
# limitations under the License.
-import os
+import os, sys
import shutil
import argparse
import subprocess
import pickle
import hashlib
import tarfile, zipfile
+import tempfile
from glob import glob
+from mesonbuild.environment import detect_ninja
def create_hash(fname):
hashname = fname + '.sha256sum'
@@ -31,18 +33,19 @@ def create_hash(fname):
def create_zip(zipfilename, packaging_dir):
prefix = os.path.split(packaging_dir)[0]
- removelen = len(prefix)+1
- zf = zipfile.ZipFile(zipfilename, 'w', compression=zipfile.ZIP_DEFLATED,
- allowZip64=True)
- zf.write(packaging_dir, packaging_dir[removelen:])
- for root, dirs, files in os.walk(packaging_dir):
- for d in dirs:
- dname = os.path.join(root, d)
- zf.write(dname, dname[removelen:])
- for f in files:
- fname = os.path.join(root, f)
- zf.write(fname, fname[removelen:])
- zf.close()
+ removelen = len(prefix) + 1
+ with zipfile.ZipFile(zipfilename,
+ 'w',
+ compression=zipfile.ZIP_DEFLATED,
+ allowZip64=True) as zf:
+ zf.write(packaging_dir, packaging_dir[removelen:])
+ for root, dirs, files in os.walk(packaging_dir):
+ for d in dirs:
+ dname = os.path.join(root, d)
+ zf.write(dname, dname[removelen:])
+ for f in files:
+ fname = os.path.join(root, f)
+ zf.write(fname, fname[removelen:])
def create_dist(dist_name, src_root, bld_root, dist_sub):
distdir = os.path.join(dist_sub, dist_name)
@@ -58,28 +61,66 @@ def create_dist(dist_name, src_root, bld_root, dist_sub):
os.unlink(f)
xzname = distdir + '.tar.xz'
zipname = distdir + '.zip'
- tf = tarfile.open(xzname, 'w:xz')
- tf.add(distdir, os.path.split(distdir)[1])
- tf.close()
- create_hash(xzname)
+ # Should use shutil but it got xz support only in 3.5.
+ with tarfile.open(xzname, 'w:xz') as tf:
+ tf.add(distdir, os.path.split(distdir)[1])
create_zip(zipname, distdir)
- create_hash(zipname)
+ shutil.rmtree(distdir)
+ return (xzname, zipname)
+
+def check_dist(packagename, meson_command):
+ print('Testing distribution package %s.' % packagename)
+ unpackdir = tempfile.mkdtemp()
+ builddir = tempfile.mkdtemp()
+ installdir = tempfile.mkdtemp()
+ ninja_bin = detect_ninja()
+ try:
+ tf = tarfile.open(packagename)
+ tf.extractall(unpackdir)
+ srcdir = glob(os.path.join(unpackdir, '*'))[0]
+ if subprocess.call(meson_command + [srcdir, builddir]) != 0:
+ print('Running Meson on distribution package failed')
+ return 1
+ if subprocess.call([ninja_bin], cwd=builddir) != 0:
+ print('Compiling the distribution package failed.')
+ return 1
+ if subprocess.call([ninja_bin, 'test'], cwd=builddir) != 0:
+ print('Running unit tests on the distribution package failed.')
+ return 1
+ myenv = os.environ.copy()
+ myenv['DESTDIR'] = installdir
+ if subprocess.call([ninja_bin, 'install'], cwd=builddir, env=myenv) != 0:
+ print('Installing the distribution package failed.')
+ return 1
+ finally:
+ shutil.rmtree(srcdir)
+ shutil.rmtree(builddir)
+ shutil.rmtree(installdir)
+ print('Distribution package %s tested.' % packagename)
+ return 0
def run(args):
src_root = args[0]
bld_root = args[1]
+ meson_command = args[2:]
priv_dir = os.path.join(bld_root, 'meson-private')
dist_sub = os.path.join(bld_root, 'meson-dist')
buildfile = os.path.join(priv_dir, 'build.dat')
build = pickle.load(open(buildfile, 'rb'))
-
+
dist_name = build.project_name + '-' + build.project_version
if not os.path.isdir(os.path.join(src_root, '.git')):
print('Dist currently only works with Git repos.')
return 1
- create_dist(dist_name, src_root, bld_root, dist_sub)
-
- return 0
+ names = create_dist(dist_name, src_root, bld_root, dist_sub)
+ if names is None:
+ return 1
+ rc = check_dist(names[0], meson_command) # Check only one.
+ if rc == 0:
+ # Only create the hash if the build is successfull.
+ for n in names:
+ create_hash(n)
+ return rc