From 39f37ede700a3df05fd79f099a3d2c0dc1726141 Mon Sep 17 00:00:00 2001 From: Gagandeep Singh Date: Mon, 7 Oct 2024 22:39:07 +0530 Subject: [PATCH 01/10] DEV: Add compile, setup, and install under meson_args --- spin/cmds/meson.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/spin/cmds/meson.py b/spin/cmds/meson.py index b5a2fe9..6f1b0a1 100644 --- a/spin/cmds/meson.py +++ b/spin/cmds/meson.py @@ -319,12 +319,12 @@ def build( ) return - meson_args = list(meson_args) + meson_args_setup = list(meson_args["setup"]) if gcov: - meson_args = meson_args + ["-Db_coverage=true"] + meson_args_setup = meson_args_setup + ["-Db_coverage=true"] - setup_cmd = _meson_cli() + ["setup", build_dir, f"--prefix={prefix}"] + meson_args + setup_cmd = _meson_cli() + ["setup", build_dir, "--prefix=/usr"] + meson_args_setup if clean: print(f"Removing `{build_dir}`") @@ -351,15 +351,19 @@ def build( # Any other conditions that warrant a reconfigure? + meson_args_compile = list(meson_args["compile"]) compile_flags = ["-v"] if verbose else [] - if jobs: - compile_flags += ["-j", str(jobs)] + if "jobs" in meson_args: + jobs = meson_args["jobs"] + compile_flags += ["-j", str(jobs)] p = _run( - _meson_cli() + ["compile"] + compile_flags + ["-C", build_dir], + _meson_cli() + ["compile"] + compile_flags + ["-C", build_dir] , sys_exit=True, output=not quiet, ) + + meson_args_install = list(meson_args["install"]) p = _run( _meson_cli() + [ @@ -371,7 +375,7 @@ def build( install_dir if os.path.isabs(install_dir) else os.path.relpath(abs_install_dir, abs_build_dir), - ], + ] + meson_args_install, output=(not quiet) and verbose, ) From 02dd2d4ba9ad0fea3e2837dfb02033a58880885e Mon Sep 17 00:00:00 2001 From: Gagandeep Singh Date: Wed, 16 Oct 2024 23:22:42 +0530 Subject: [PATCH 02/10] DEV: Fixes in paths passed to meson commands --- spin/cmds/meson.py | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/spin/cmds/meson.py b/spin/cmds/meson.py index 6f1b0a1..0a65754 100644 --- a/spin/cmds/meson.py +++ b/spin/cmds/meson.py @@ -319,12 +319,19 @@ def build( ) return - meson_args_setup = list(meson_args["setup"]) + if isinstance(meson_args, tuple): + meson_args_ = {} + meson_args_["setup"] = meson_args + meson_args_["compile"] = tuple() + meson_args_["install"] = tuple() + meson_args = meson_args_ + + meson_args_setup = list(meson_args.get("setup", tuple())) if gcov: meson_args_setup = meson_args_setup + ["-Db_coverage=true"] - setup_cmd = _meson_cli() + ["setup", build_dir, "--prefix=/usr"] + meson_args_setup + setup_cmd = _meson_cli() + ["setup", abs_build_dir, "--prefix={}".format(abs_install_dir)] + meson_args_setup if clean: print(f"Removing `{build_dir}`") @@ -351,30 +358,27 @@ def build( # Any other conditions that warrant a reconfigure? - meson_args_compile = list(meson_args["compile"]) + meson_args_compile = list(meson_args.get("compile", tuple())) compile_flags = ["-v"] if verbose else [] if "jobs" in meson_args: jobs = meson_args["jobs"] - compile_flags += ["-j", str(jobs)] + if jobs is not None: + compile_flags += ["-j", str(jobs)] p = _run( - _meson_cli() + ["compile"] + compile_flags + ["-C", build_dir] , + _meson_cli() + ["compile"] + compile_flags + ["-C", abs_build_dir] + meson_args_compile, sys_exit=True, output=not quiet, ) - meson_args_install = list(meson_args["install"]) + meson_args_install = list(meson_args.get("install", tuple())) p = _run( _meson_cli() + [ "install", "--only-changed", "-C", - build_dir, - "--destdir", - install_dir - if os.path.isabs(install_dir) - else os.path.relpath(abs_install_dir, abs_build_dir), + build_dir ] + meson_args_install, output=(not quiet) and verbose, ) From 0dda8c4e231a4ab1e2bb20325462ea936c595457 Mon Sep 17 00:00:00 2001 From: Gagandeep Singh Date: Mon, 21 Oct 2024 13:24:32 +0530 Subject: [PATCH 03/10] DEV: Add support for --show-build-log in SciPy --- spin/cmds/meson.py | 57 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 51 insertions(+), 6 deletions(-) diff --git a/spin/cmds/meson.py b/spin/cmds/meson.py index 0a65754..08de010 100644 --- a/spin/cmds/meson.py +++ b/spin/cmds/meson.py @@ -1,5 +1,6 @@ import contextlib import copy +import datetime import json import os import re @@ -7,6 +8,8 @@ import sys from enum import Enum from pathlib import Path +import subprocess +import time import click @@ -372,16 +375,58 @@ def build( ) meson_args_install = list(meson_args.get("install", tuple())) - p = _run( - _meson_cli() - + [ + cmd = _meson_cli() + [ "install", "--only-changed", "-C", build_dir - ] + meson_args_install, - output=(not quiet) and verbose, - ) + ] + meson_args_install + + if "root" not in meson_args: + raise KeyError("Project root not specified.") + + dirs_root = meson_args["root"] + log_filename = dirs_root / 'meson-install.log' + start_time = datetime.datetime.now() + cmd_str = ' '.join([str(p) for p in cmd]) + if meson_args.get("show_build_log", False): + ret = subprocess.call(cmd, cwd=dirs_root) + else: + print("Installing, see meson-install.log...") + with open(log_filename, 'w') as log: + p = subprocess.Popen(cmd, stdout=log, stderr=log, + cwd=dirs_root) + + try: + # Wait for it to finish, and print something to indicate the + # process is alive, but only if the log file has grown (to + # allow continuous integration environments kill a hanging + # process accurately if it produces no output) + last_blip = time.time() + last_log_size = os.stat(log_filename).st_size + while p.poll() is None: + time.sleep(0.5) + if time.time() - last_blip > 60: + log_size = os.stat(log_filename).st_size + if log_size > last_log_size: + elapsed = datetime.datetime.now() - start_time + print(f" ... installation in progress ({elapsed} " + "elapsed)") + last_blip = time.time() + last_log_size = log_size + + ret = p.wait() + except: # noqa: E722 + p.terminate() + raise + elapsed = datetime.datetime.now() - start_time + + if ret != 0: + if meson_args.get("show_build_log", False): + with open(log_filename) as f: + print(f.read()) + print(f"Installation failed! ({elapsed} elapsed)") + sys.exit(1) def _get_configured_command(command_name): From 1bf888e615f98030f2da2a7e1947a77f9cd7f323 Mon Sep 17 00:00:00 2001 From: Gagandeep Singh Date: Mon, 21 Oct 2024 17:06:53 +0530 Subject: [PATCH 04/10] DEV: Remove special handling of tuple typed meson_args --- spin/cmds/meson.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/spin/cmds/meson.py b/spin/cmds/meson.py index 08de010..08aec77 100644 --- a/spin/cmds/meson.py +++ b/spin/cmds/meson.py @@ -322,13 +322,6 @@ def build( ) return - if isinstance(meson_args, tuple): - meson_args_ = {} - meson_args_["setup"] = meson_args - meson_args_["compile"] = tuple() - meson_args_["install"] = tuple() - meson_args = meson_args_ - meson_args_setup = list(meson_args.get("setup", tuple())) if gcov: From 3a166f376a8831d86a1f0b9ef591c576805ca226 Mon Sep 17 00:00:00 2001 From: Gagandeep Singh Date: Tue, 22 Oct 2024 19:11:35 +0530 Subject: [PATCH 05/10] DEV: Improvise docs support in spin --- spin/cmds/meson.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/spin/cmds/meson.py b/spin/cmds/meson.py index 08aec77..5b9dffc 100644 --- a/spin/cmds/meson.py +++ b/spin/cmds/meson.py @@ -992,7 +992,11 @@ def docs( make_bat_exists = (Path(doc_dir) / "make.bat").exists() make_cmd = "make.bat" if sys.platform == "win32" and make_bat_exists else "make" - _run([make_cmd, sphinx_target], cwd=doc_dir, replace=True) + cmds = [make_cmd, "-j", str(jobs), sphinx_target] + if jobs == "auto": + cmds = [make_cmd, "-j", sphinx_target] + + _run(cmds, cwd=doc_dir, replace=True) @click.command() From 6cc63f039b96d22194b2ce38309b60885351368a Mon Sep 17 00:00:00 2001 From: Gagandeep Singh Date: Thu, 24 Oct 2024 19:19:20 +0530 Subject: [PATCH 06/10] DEV: Restore installation command --- spin/cmds/meson.py | 56 +++++++++------------------------------------- 1 file changed, 10 insertions(+), 46 deletions(-) diff --git a/spin/cmds/meson.py b/spin/cmds/meson.py index 5b9dffc..fc3bee8 100644 --- a/spin/cmds/meson.py +++ b/spin/cmds/meson.py @@ -375,52 +375,16 @@ def build( build_dir ] + meson_args_install - if "root" not in meson_args: - raise KeyError("Project root not specified.") - - dirs_root = meson_args["root"] - log_filename = dirs_root / 'meson-install.log' - start_time = datetime.datetime.now() - cmd_str = ' '.join([str(p) for p in cmd]) - if meson_args.get("show_build_log", False): - ret = subprocess.call(cmd, cwd=dirs_root) - else: - print("Installing, see meson-install.log...") - with open(log_filename, 'w') as log: - p = subprocess.Popen(cmd, stdout=log, stderr=log, - cwd=dirs_root) - - try: - # Wait for it to finish, and print something to indicate the - # process is alive, but only if the log file has grown (to - # allow continuous integration environments kill a hanging - # process accurately if it produces no output) - last_blip = time.time() - last_log_size = os.stat(log_filename).st_size - while p.poll() is None: - time.sleep(0.5) - if time.time() - last_blip > 60: - log_size = os.stat(log_filename).st_size - if log_size > last_log_size: - elapsed = datetime.datetime.now() - start_time - print(f" ... installation in progress ({elapsed} " - "elapsed)") - last_blip = time.time() - last_log_size = log_size - - ret = p.wait() - except: # noqa: E722 - p.terminate() - raise - elapsed = datetime.datetime.now() - start_time - - if ret != 0: - if meson_args.get("show_build_log", False): - with open(log_filename) as f: - print(f.read()) - print(f"Installation failed! ({elapsed} elapsed)") - sys.exit(1) - + p = _run( + _meson_cli() + + [ + "install", + "--only-changed", + "-C", + build_dir, + ] + meson_args_install, + output=(not quiet) and verbose, + ) def _get_configured_command(command_name): command_groups = get_commands() From 4b6393cb1423d259b9050e011365e193370372b6 Mon Sep 17 00:00:00 2001 From: Gagandeep Singh Date: Thu, 24 Oct 2024 19:44:56 +0530 Subject: [PATCH 07/10] DEV: Added backwards compatibility support in meson.py --- spin/cmds/meson.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/spin/cmds/meson.py b/spin/cmds/meson.py index fc3bee8..51299e8 100644 --- a/spin/cmds/meson.py +++ b/spin/cmds/meson.py @@ -322,6 +322,17 @@ def build( ) return + if isinstance(meson_args, tuple): + # for backwards compatibility because + # previously meson_args was a tuple. + # all the members of the meson_args tuple + # were passed to meson setup subcommand. + meson_args_ = {} + meson_args_["setup"] = meson_args + meson_args_["compile"] = tuple() + meson_args_["install"] = tuple() + meson_args = meson_args_ + meson_args_setup = list(meson_args.get("setup", tuple())) if gcov: From 54befb3939483dd82e0d7644a8970840b6bb28fa Mon Sep 17 00:00:00 2001 From: Gagandeep Singh Date: Fri, 8 Nov 2024 19:03:01 +0530 Subject: [PATCH 08/10] DEV: Remove unused imports from spin --- spin/cmds/meson.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/spin/cmds/meson.py b/spin/cmds/meson.py index 51299e8..86b450c 100644 --- a/spin/cmds/meson.py +++ b/spin/cmds/meson.py @@ -1,6 +1,5 @@ import contextlib import copy -import datetime import json import os import re @@ -8,8 +7,6 @@ import sys from enum import Enum from pathlib import Path -import subprocess -import time import click From 8d2103fe1676e4568efce92836c62957cfd52603 Mon Sep 17 00:00:00 2001 From: Gagandeep Singh Date: Fri, 8 Nov 2024 20:21:49 +0530 Subject: [PATCH 09/10] DEV: Use cmd instead of repeating --- spin/cmds/meson.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/spin/cmds/meson.py b/spin/cmds/meson.py index 86b450c..88497d5 100644 --- a/spin/cmds/meson.py +++ b/spin/cmds/meson.py @@ -384,13 +384,7 @@ def build( ] + meson_args_install p = _run( - _meson_cli() - + [ - "install", - "--only-changed", - "-C", - build_dir, - ] + meson_args_install, + cmd, output=(not quiet) and verbose, ) From 0cfd90823f35000ff708e01c7589ce3444c0967e Mon Sep 17 00:00:00 2001 From: Gagandeep Singh Date: Wed, 27 Nov 2024 15:14:36 +0530 Subject: [PATCH 10/10] DEV: Use keyword arguments for meson compile and meson install --- spin/cmds/meson.py | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/spin/cmds/meson.py b/spin/cmds/meson.py index 88497d5..da8a637 100644 --- a/spin/cmds/meson.py +++ b/spin/cmds/meson.py @@ -274,6 +274,8 @@ def build( quiet=False, build_dir=None, prefix=None, + meson_compile_args=tuple(), + meson_install_args=tuple(), ): """🔧 Build package with Meson/ninja @@ -319,18 +321,7 @@ def build( ) return - if isinstance(meson_args, tuple): - # for backwards compatibility because - # previously meson_args was a tuple. - # all the members of the meson_args tuple - # were passed to meson setup subcommand. - meson_args_ = {} - meson_args_["setup"] = meson_args - meson_args_["compile"] = tuple() - meson_args_["install"] = tuple() - meson_args = meson_args_ - - meson_args_setup = list(meson_args.get("setup", tuple())) + meson_args_setup = list(meson_args) if gcov: meson_args_setup = meson_args_setup + ["-Db_coverage=true"] @@ -362,26 +353,24 @@ def build( # Any other conditions that warrant a reconfigure? - meson_args_compile = list(meson_args.get("compile", tuple())) + meson_compile_args = list(meson_compile_args) compile_flags = ["-v"] if verbose else [] - if "jobs" in meson_args: - jobs = meson_args["jobs"] if jobs is not None: compile_flags += ["-j", str(jobs)] p = _run( - _meson_cli() + ["compile"] + compile_flags + ["-C", abs_build_dir] + meson_args_compile, + _meson_cli() + ["compile"] + compile_flags + ["-C", abs_build_dir] + meson_compile_args, sys_exit=True, output=not quiet, ) - meson_args_install = list(meson_args.get("install", tuple())) + meson_install_args = list(meson_install_args) cmd = _meson_cli() + [ "install", "--only-changed", "-C", build_dir - ] + meson_args_install + ] + meson_install_args p = _run( cmd,