From f54380ce0c1f80f1a152135c07d41d3b5ea6d4da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20=C3=96hman?= Date: Fri, 20 Sep 2024 19:20:38 +0200 Subject: [PATCH 1/7] Make mesonninja easyblock respect toolchainopts --- easybuild/easyblocks/generic/mesonninja.py | 34 +++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/easybuild/easyblocks/generic/mesonninja.py b/easybuild/easyblocks/generic/mesonninja.py index 17f61afded..0459a37c8e 100644 --- a/easybuild/easyblocks/generic/mesonninja.py +++ b/easybuild/easyblocks/generic/mesonninja.py @@ -53,12 +53,40 @@ def extra_options(extra_vars=None): extra_vars.update({ 'build_dir': [None, "build_dir to pass to meson", CUSTOM], 'build_cmd': [DEFAULT_BUILD_CMD, "Build command to use", CUSTOM], + 'build_type': [None, "Build type for meson, e.g. release." + "Defaults to 'release', 'debugoptimized' or 'debug' depending on " + "toolchainopts[debug,noopt]", CUSTOM], 'configure_cmd': [DEFAULT_CONFIGURE_CMD, "Configure command to use", CUSTOM], 'install_cmd': [DEFAULT_INSTALL_CMD, "Install command to use", CUSTOM], 'separate_build_dir': [True, "Perform build in a separate directory", CUSTOM], }) return extra_vars + @property + def build_type(self): + """Build type set in the EasyConfig with default determined by toolchainopts""" + build_type = self.cfg.get('build_type') + # While we do set optimization and debug flag separately, build scripts may be adding additional + # defines and flags based on the build_type as well so we pick the closest match. + if build_type is None: + if self.toolchain.options.get('noopt', None): # also implies debug but is the closest match + build_type = 'debug' + elif self.toolchain.options.get('debug', None): + build_type = 'debugoptimized' + else: + build_type = 'release' + return build_type + + @property + def optimization(self): + """Optimization level""" + if self.toolchain.options.get('noopt', False): + return 0 + elif self.toolchain.options.get('lowopt', False): + return 1 + else: + return 2 + def configure_step(self, cmd_prefix=''): """ Configure with Meson. @@ -92,12 +120,16 @@ def configure_step(self, cmd_prefix=''): build_dir = self.cfg.get('build_dir') or self.start_dir - cmd = "%(preconfigopts)s %(configure_cmd)s --prefix %(installdir)s %(configopts)s %(source_dir)s" % { + cmd = ("%(preconfigopts)s %(configure_cmd)s --prefix %(installdir)s --buildtype %(buildtype)s %(configopts)s " + "--optimization %(optimization)s --debug %(debug)s %(source_dir)s") % { 'configopts': self.cfg['configopts'], 'configure_cmd': configure_cmd, 'installdir': self.installdir, 'preconfigopts': self.cfg['preconfigopts'], 'source_dir': build_dir, + 'buildtype': self.build_type(), + 'optimization': self.optimizatoin(), + 'debug': self.toolchain.options.get('debug', False), } res = run_shell_cmd(cmd) return res.output From a75f53deeb52d36b3f648152a4bee8d7bd135c24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20=C3=96hman?= Date: Fri, 27 Sep 2024 18:28:12 +0200 Subject: [PATCH 2/7] Update easybuild/easyblocks/generic/mesonninja.py Fix typo Co-authored-by: Kenneth Hoste --- easybuild/easyblocks/generic/mesonninja.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/easybuild/easyblocks/generic/mesonninja.py b/easybuild/easyblocks/generic/mesonninja.py index 0459a37c8e..94b076beb5 100644 --- a/easybuild/easyblocks/generic/mesonninja.py +++ b/easybuild/easyblocks/generic/mesonninja.py @@ -128,7 +128,7 @@ def configure_step(self, cmd_prefix=''): 'preconfigopts': self.cfg['preconfigopts'], 'source_dir': build_dir, 'buildtype': self.build_type(), - 'optimization': self.optimizatoin(), + 'optimization': self.optimization(), 'debug': self.toolchain.options.get('debug', False), } res = run_shell_cmd(cmd) From 23d8254addb6919eab8a87593a8a568abbb14bad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20=C3=96hman?= Date: Fri, 27 Sep 2024 18:33:05 +0200 Subject: [PATCH 3/7] Fix use of property correctly, removing extra paranthesis --- easybuild/easyblocks/generic/mesonninja.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/easybuild/easyblocks/generic/mesonninja.py b/easybuild/easyblocks/generic/mesonninja.py index 94b076beb5..863991828b 100644 --- a/easybuild/easyblocks/generic/mesonninja.py +++ b/easybuild/easyblocks/generic/mesonninja.py @@ -127,8 +127,8 @@ def configure_step(self, cmd_prefix=''): 'installdir': self.installdir, 'preconfigopts': self.cfg['preconfigopts'], 'source_dir': build_dir, - 'buildtype': self.build_type(), - 'optimization': self.optimization(), + 'buildtype': self.build_type, + 'optimization': self.optimization, 'debug': self.toolchain.options.get('debug', False), } res = run_shell_cmd(cmd) From 17909f2bea3e272533b1eb69fb28d527fa2f75a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20=C3=96hman?= Date: Fri, 27 Sep 2024 19:09:12 +0200 Subject: [PATCH 4/7] Fix --debug flag. --- easybuild/easyblocks/generic/mesonninja.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/easybuild/easyblocks/generic/mesonninja.py b/easybuild/easyblocks/generic/mesonninja.py index 863991828b..03b4f2c86d 100644 --- a/easybuild/easyblocks/generic/mesonninja.py +++ b/easybuild/easyblocks/generic/mesonninja.py @@ -121,7 +121,7 @@ def configure_step(self, cmd_prefix=''): build_dir = self.cfg.get('build_dir') or self.start_dir cmd = ("%(preconfigopts)s %(configure_cmd)s --prefix %(installdir)s --buildtype %(buildtype)s %(configopts)s " - "--optimization %(optimization)s --debug %(debug)s %(source_dir)s") % { + "--optimization %(optimization)s %(debug)s %(source_dir)s") % { 'configopts': self.cfg['configopts'], 'configure_cmd': configure_cmd, 'installdir': self.installdir, @@ -129,7 +129,7 @@ def configure_step(self, cmd_prefix=''): 'source_dir': build_dir, 'buildtype': self.build_type, 'optimization': self.optimization, - 'debug': self.toolchain.options.get('debug', False), + 'debug': '--debug' if self.toolchain.options.get('debug', False) else '', } res = run_shell_cmd(cmd) return res.output From 100cbb6d45411ae386a5b3a38214d589b3d41ba9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20=C3=96hman?= Date: Tue, 1 Oct 2024 15:38:37 +0000 Subject: [PATCH 5/7] Add NDEBUG flag to meson builds --- easybuild/easyblocks/generic/mesonninja.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/easybuild/easyblocks/generic/mesonninja.py b/easybuild/easyblocks/generic/mesonninja.py index 03b4f2c86d..82797d09e1 100644 --- a/easybuild/easyblocks/generic/mesonninja.py +++ b/easybuild/easyblocks/generic/mesonninja.py @@ -56,6 +56,8 @@ def extra_options(extra_vars=None): 'build_type': [None, "Build type for meson, e.g. release." "Defaults to 'release', 'debugoptimized' or 'debug' depending on " "toolchainopts[debug,noopt]", CUSTOM], + 'ndebug': [True, "Sets -Db_ndebug which in turn defines NDEBUG for C/C++ builds." + "This disabled costly asserts in code, typical for production.", CUSTOM], 'configure_cmd': [DEFAULT_CONFIGURE_CMD, "Configure command to use", CUSTOM], 'install_cmd': [DEFAULT_INSTALL_CMD, "Install command to use", CUSTOM], 'separate_build_dir': [True, "Perform build in a separate directory", CUSTOM], @@ -69,9 +71,9 @@ def build_type(self): # While we do set optimization and debug flag separately, build scripts may be adding additional # defines and flags based on the build_type as well so we pick the closest match. if build_type is None: - if self.toolchain.options.get('noopt', None): # also implies debug but is the closest match + if self.toolchain.options.get('noopt', False): # also implies debug but is the closest match build_type = 'debug' - elif self.toolchain.options.get('debug', None): + elif self.toolchain.options.get('debug', False): build_type = 'debugoptimized' else: build_type = 'release' @@ -121,15 +123,16 @@ def configure_step(self, cmd_prefix=''): build_dir = self.cfg.get('build_dir') or self.start_dir cmd = ("%(preconfigopts)s %(configure_cmd)s --prefix %(installdir)s --buildtype %(buildtype)s %(configopts)s " - "--optimization %(optimization)s %(debug)s %(source_dir)s") % { + "--optimization %(optimization)s %(debug)s -Db_ndebug=%(ndebug)s %(source_dir)s") % { 'configopts': self.cfg['configopts'], 'configure_cmd': configure_cmd, 'installdir': self.installdir, 'preconfigopts': self.cfg['preconfigopts'], - 'source_dir': build_dir, 'buildtype': self.build_type, 'optimization': self.optimization, 'debug': '--debug' if self.toolchain.options.get('debug', False) else '', + 'ndebug': str(self.cfg.get('ndebug')).lower(), + 'source_dir': build_dir, } res = run_shell_cmd(cmd) return res.output @@ -144,7 +147,7 @@ def build_step(self, verbose=False, path=None): if self.cfg['parallel']: parallel = "-j %s" % self.cfg['parallel'] - cmd = "%(prebuildopts)s %(build_cmd)s %(parallel)s %(buildopts)s" % { + cmd = "%(prebuildopts)s %(build_cmd)s -v %(parallel)s %(buildopts)s" % { 'buildopts': self.cfg['buildopts'], 'build_cmd': build_cmd, 'parallel': parallel, From ec8642e069535ca18a6d77d97bffdec0ce8ef38c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20=C3=96hman?= Date: Thu, 10 Oct 2024 15:11:59 +0000 Subject: [PATCH 6/7] Make mesons optimization/debug flags mutually exclusive with buildtype --- easybuild/easyblocks/generic/mesonninja.py | 35 ++++++++-------------- 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/easybuild/easyblocks/generic/mesonninja.py b/easybuild/easyblocks/generic/mesonninja.py index 82797d09e1..3853138c96 100644 --- a/easybuild/easyblocks/generic/mesonninja.py +++ b/easybuild/easyblocks/generic/mesonninja.py @@ -54,8 +54,7 @@ def extra_options(extra_vars=None): 'build_dir': [None, "build_dir to pass to meson", CUSTOM], 'build_cmd': [DEFAULT_BUILD_CMD, "Build command to use", CUSTOM], 'build_type': [None, "Build type for meson, e.g. release." - "Defaults to 'release', 'debugoptimized' or 'debug' depending on " - "toolchainopts[debug,noopt]", CUSTOM], + "Replaces use of toolchain options debug, noopt, lowopt", CUSTOM], 'ndebug': [True, "Sets -Db_ndebug which in turn defines NDEBUG for C/C++ builds." "This disabled costly asserts in code, typical for production.", CUSTOM], 'configure_cmd': [DEFAULT_CONFIGURE_CMD, "Configure command to use", CUSTOM], @@ -64,21 +63,6 @@ def extra_options(extra_vars=None): }) return extra_vars - @property - def build_type(self): - """Build type set in the EasyConfig with default determined by toolchainopts""" - build_type = self.cfg.get('build_type') - # While we do set optimization and debug flag separately, build scripts may be adding additional - # defines and flags based on the build_type as well so we pick the closest match. - if build_type is None: - if self.toolchain.options.get('noopt', False): # also implies debug but is the closest match - build_type = 'debug' - elif self.toolchain.options.get('debug', False): - build_type = 'debugoptimized' - else: - build_type = 'release' - return build_type - @property def optimization(self): """Optimization level""" @@ -122,15 +106,22 @@ def configure_step(self, cmd_prefix=''): build_dir = self.cfg.get('build_dir') or self.start_dir - cmd = ("%(preconfigopts)s %(configure_cmd)s --prefix %(installdir)s --buildtype %(buildtype)s %(configopts)s " - "--optimization %(optimization)s %(debug)s -Db_ndebug=%(ndebug)s %(source_dir)s") % { + # Build type is either specified directly or via --optimization and --debug flags. + if self.cfg['build_type'] is not None: + build_type = '--buildtype=' + self.cfg['build_type'] + else: + build_type = '--optimization=%(optimization)s %(debug)s' % { + 'optimization': self.optimization, + 'debug': '--debug' if self.toolchain.options.get('debug', False) else '', + } + + cmd = ("%(preconfigopts)s %(configure_cmd)s --prefix %(installdir)s %(build_type)s %(configopts)s " + "-Db_ndebug=%(ndebug)s %(source_dir)s") % { + 'build_type': build_type, 'configopts': self.cfg['configopts'], 'configure_cmd': configure_cmd, 'installdir': self.installdir, 'preconfigopts': self.cfg['preconfigopts'], - 'buildtype': self.build_type, - 'optimization': self.optimization, - 'debug': '--debug' if self.toolchain.options.get('debug', False) else '', 'ndebug': str(self.cfg.get('ndebug')).lower(), 'source_dir': build_dir, } From 97429346d728188481746a354145f9b52f6dbb84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20=C3=96hman?= Date: Fri, 11 Oct 2024 15:13:45 +0000 Subject: [PATCH 7/7] Add opt variant to optimization levels --- easybuild/easyblocks/generic/mesonninja.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/easybuild/easyblocks/generic/mesonninja.py b/easybuild/easyblocks/generic/mesonninja.py index 3853138c96..d1b95cf9c6 100644 --- a/easybuild/easyblocks/generic/mesonninja.py +++ b/easybuild/easyblocks/generic/mesonninja.py @@ -54,7 +54,7 @@ def extra_options(extra_vars=None): 'build_dir': [None, "build_dir to pass to meson", CUSTOM], 'build_cmd': [DEFAULT_BUILD_CMD, "Build command to use", CUSTOM], 'build_type': [None, "Build type for meson, e.g. release." - "Replaces use of toolchain options debug, noopt, lowopt", CUSTOM], + "Replaces use of toolchain options debug, noopt, lowopt, opt", CUSTOM], 'ndebug': [True, "Sets -Db_ndebug which in turn defines NDEBUG for C/C++ builds." "This disabled costly asserts in code, typical for production.", CUSTOM], 'configure_cmd': [DEFAULT_CONFIGURE_CMD, "Configure command to use", CUSTOM], @@ -70,6 +70,8 @@ def optimization(self): return 0 elif self.toolchain.options.get('lowopt', False): return 1 + elif self.toolchain.options.get('opt', False): + return 3 else: return 2