diff --git a/bin/setup-dunepy.py b/bin/setup-dunepy.py index c9bcc44820255af074698c45a05f6fbc4d21e7a9..96e2997ca0e7c07f918b7e9eda152800ab672554 100755 --- a/bin/setup-dunepy.py +++ b/bin/setup-dunepy.py @@ -62,18 +62,7 @@ def main(argv): command = ['bash', '-c', 'source ' + optsfile + ' && echo "$CMAKE_FLAGS"'] proc = subprocess.Popen(command, stdout = subprocess.PIPE) stdout, _ = proc.communicate() - for arg in shlex.split(buffer_to_str(stdout)): - arg = arg.split('=', 1) - key = arg[0] - if len(arg)==2: - value = arg[1] - elif len(arg)==1: - value = "" - else: - raise ValueError("Failed to parse $CMAKE_FLAGS from opts file") - if key.startswith('-D'): - key = key[2:] - definitions[key] = value + cmake_args = shlex.split(buffer_to_str(stdout)) if builddir is None: # get the build dir (check for BUILDDIR, DUNE_BUILDDIR in opts file # and then DUNE_BUILDDIR in environment variable @@ -89,7 +78,7 @@ def main(argv): if not builddir: builddir = os.environ.get('DUNE_BUILDDIR', 'build-cmake') else: - definitions = None + cmake_args = None if builddir is None: builddir = os.environ.get('DUNE_BUILDDIR', 'build-cmake') @@ -112,7 +101,7 @@ def main(argv): foundModule = make_dune_py_module(dunepy, deps) - output = build_dune_py_module(dunepy, definitions, None, builddir, deps) + output = build_dune_py_module(dunepy, cmake_args, None, builddir, deps) print("CMake output") print(output) diff --git a/python/dune/common/module.py b/python/dune/common/module.py index bfce94c24b5a53fdb1ef786acba21a74363d6e47..21deb7df04997be776d5576f2376504b24b9fa2d 100644 --- a/python/dune/common/module.py +++ b/python/dune/common/module.py @@ -16,12 +16,12 @@ if __name__ == "dune.common.module": from dune.common.utility import buffer_to_str from dune.common import project from dune.packagemetadata import Version, VersionRequirement,\ - Description, cmakeFlags + Description, cmakeFlags, cmakeArguments else: from utility import buffer_to_str import project from packagemetadata import Version, VersionRequirement,\ - Description, cmakeFlags + Description, cmakeFlags, cmakeArguments logger = logging.getLogger(__name__) @@ -209,12 +209,13 @@ def get_module_path(): return path -def select_modules(modules=None): +def select_modules(modules=None, module=None): """choose one version of each module from a list of modules Args: modules (optional): List of (description, dir) pairs If not given, the find_modules(get_module_path()) is used + module (optional): Returns: pair of dictionaries mapping module name to unique description and directory respectively @@ -254,26 +255,20 @@ def default_build_dir(srcdir, module=None, builddir=None): return os.path.join(srcdir, builddir) -def configure_module(srcdir, builddir, prefix_dirs, definitions=None): +def configure_module(srcdir, builddir, prefix_dirs, cmake_args=None): """configure a given module by running CMake Args: srcdir: source directory of module builddir: build directory for module (may equal srcdir for in-source builds) prefix_dirs: dictionary mapping dependent modules to their prefix - definitions (optional): dictionary of additional CMake definitions + cmake_args (optional): list of additional CMake flags Returns: Output of CMake command """ args = [ get_cmake_command() ] - if definitions is None: - pass - elif isinstance(definitions, dict): - args += ['-D' + key + '=' + value + '' for key, value in definitions.items() if value] - args += [key + '' for key, value in definitions.items() if not value] - else: - raise ValueError('definitions must be a dictionary.') + args += cmakeArguments(cmake_args) args += ['-D' + module + '_DIR=' + dir for module, dir in prefix_dirs.items()] args.append(srcdir) if not os.path.isdir(builddir): @@ -397,11 +392,11 @@ def make_dune_py_module(dune_py_dir=None, deps=None): raise RuntimeError('"' + dune_py_dir + '" contains a different version of the dune-py module.') logger.info('Using dune-py module in ' + dune_py_dir) -def build_dune_py_module(dune_py_dir=None, definitions=None, build_args=None, builddir=None, deps=None): +def build_dune_py_module(dune_py_dir=None, cmake_args=None, build_args=None, builddir=None, deps=None): if dune_py_dir is None: dune_py_dir = get_dune_py_dir() - if definitions is None: - definitions = cmakeFlags() + if cmake_args is None: + cmake_args = cmakeFlags() modules, dirs = select_modules() if deps is None: @@ -425,7 +420,7 @@ def build_dune_py_module(dune_py_dir=None, definitions=None, build_args=None, bu else: prefix[name] = default_build_dir(dir, name, builddir) - output = configure_module(dune_py_dir, dune_py_dir, {d: prefix[d] for d in deps}, definitions) + output = configure_module(dune_py_dir, dune_py_dir, {d: prefix[d] for d in deps}, cmake_args) output += build_module(dune_py_dir, build_args) return output diff --git a/python/dune/packagemetadata.py b/python/dune/packagemetadata.py index b68a267b1c3cb237c78e458ee2d75e6a617569c8..fd1ca813b6a65a7088df843b5728d72e2daa48be 100755 --- a/python/dune/packagemetadata.py +++ b/python/dune/packagemetadata.py @@ -239,9 +239,21 @@ class Data: def asPythonRequirementString(self, requirements): return [(r[0]+str(r[1])).replace("("," ").replace(")","").replace(" ","") for r in requirements] +def cmakeArguments(cmakeArgs): + if cmakeArgs is None: + return [] + elif isinstance(cmakeArgs, list): + return cmakeArgs + elif isinstance(cmakeArgs, dict): + args = ['-D' + key + '=' + value + '' for key, value in cmakeArgs.items() if value] + args += [key + '' for key, value in cmakeArgs.items() if not value] + return args + else: + raise ValueError('definitions must be a list or a dictionary.') + def cmakeFlags(): # defaults - flags = dict([ + flags = cmakeArguments(dict([ ('CMAKE_BUILD_TYPE','Release'), ('CMAKE_INSTALL_RPATH_USE_LINK_PATH','TRUE'), ('DUNE_ENABLE_PYTHONBINDINGS','TRUE'), @@ -250,31 +262,20 @@ def cmakeFlags(): ('CMAKE_DISABLE_FIND_PACKAGE_LATEX','TRUE'), ('CMAKE_DISABLE_FIND_PACKAGE_Doxygen','TRUE'), ('INKSCAPE','FALSE') - ]) + ])) # test environment for additional flags cmakeFlags = os.environ.get('DUNE_CMAKE_FLAGS') if cmakeFlags is None: cmakeFlags = os.environ.get('CMAKE_FLAGS') - # split flags and store in dict - add = {} + # split cmakeFlags and add them to flags if cmakeFlags is not None: - for arg in shlex.split(cmakeFlags): - try: - key, value = arg.split('=', 1) - if key.startswith('-D'): - key = key[2:] - except ValueError: - key, value = arg, None - add[key] = value - flags.update(add) + flags += shlex.split(cmakeFlags) return flags def metaData(version=None, dependencyCheck=True): data = Data(version) - flags = cmakeFlags() - cmake_flags = ['-D' + key + '=' + value + '' for key, value in flags.items() if value] - cmake_flags += [key + '' for key, value in flags.items() if not value] + cmake_flags = cmakeFlags() # check if all dependencies are listed in pyproject.toml if dependencyCheck: