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: