def build_dune_py_module(dune_py_dir=None, cmake_args=None, build_args=None, builddir=None, deps=None, writetagfile=False): if dune_py_dir is None: dune_py_dir = getDunePyDir() if cmake_args is None: cmake_args = defaultCMakeFlags() modules, dirs = select_modules() if deps is None: deps = resolve_dependencies(modules) desc = Description(module='dune-py', version=get_dune_py_version(), maintainer='*****@*****.**', depends=list(deps)) with open(os.path.join(dune_py_dir, 'dune.module'), 'w') as file: file.write(repr(desc)) # remove cache try: os.remove(os.path.join(dune_py_dir, 'CMakeCache.txt')) except FileNotFoundError: pass prefix = {} for name, dir in dirs.items(): if is_installed(dir, name): found = False # switch prefix to location of name-config.cmake for l in ['lib','lib32','lib64']: substr = l + '/cmake' newpath = dir.replace('lib/dunecontrol', substr) for _, _, files in os.walk(newpath): # if name-config.cmake is found # then this is the correct folder if name+'-config.cmake' in files: found = True prefix[name] = newpath break if found: break assert found # store new module path else: prefix[name] = default_build_dir(dir, name, builddir) logger.info('Configuring dune-py module in ' + dune_py_dir) 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) if writetagfile: # set a tag file to avoid automatic reconfiguration in builder tagfile = os.path.join(dune_py_dir, ".noconfigure") f = open(tagfile, 'w') f.close() return output
def getCXXFlags(): '''Return the CXXFLAGS used during configuration of dune-py. These are extracted from the CMackeCache.txt file. ''' cache = os.path.join(getDunePyDir(), "CMakeCache.txt") matches = [match for match in [re.match('DEFAULT_CXXFLAGS:STRING=', line) for line in open(cache)] if match is not None] if not matches: return '' if matches.__len__() > 1: # TODO move this function to the generator import generator raise generator.ConfigurationError("found multiple entries for CXXFLAGS in CMakeCache.txt") return matches[0].string.partition('=')[2].rstrip()
def make_dune_py_module(dune_py_dir=None, deps=None): if dune_py_dir is None: dune_py_dir = getDunePyDir() os.makedirs(dune_py_dir, exist_ok=True) descFile = os.path.join(dune_py_dir, 'dune.module') if not os.path.isfile(descFile): logger.info('Creating new dune-py module in ' + dune_py_dir) # create python/dune/generated generated_dir_rel = os.path.join('python','dune', 'generated') generated_dir = os.path.join(dune_py_dir, generated_dir_rel) if not os.path.isdir(generated_dir): os.makedirs(generated_dir) cmake_content = ['add_executable(generated_test EXCLUDE_FROM_ALL generated_test.cc)', 'add_dune_mpi_flags(generated_test)', 'target_compile_definitions(generated_test PRIVATE USING_DUNE_PYTHON)', 'target_link_libraries(generated_test PUBLIC ${DUNE_LIBS})', 'file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/__init__.py")', '', '# The builder will append rules for dynamically generated modules, here'] project.write_cmake_file(generated_dir, cmake_content) with open(os.path.join(generated_dir, 'generated_test.cc'), 'w') as file: file.write('#include <config.h>\n\n') file.write('#define USING_DUNE_PYTHON 1\n\n') file.write('\n#include "generated_module.hh"\n') if deps is None: modules, _ = select_modules() deps = modules.keys() description = Description(module='dune-py', version=get_dune_py_version(), maintainer='*****@*****.**', depends=list(deps)) logger.debug('dune-py will depend on ' + ' '.join([m + (' ' + str(c) if c else '') for m, c in description.depends])) project.make_project(dune_py_dir, description, subdirs=[generated_dir_rel], is_dunepy=True) else: description = Description(descFile) if description.name != 'dune-py': raise RuntimeError('"' + dune_py_dir + '" already contains a different dune module.') if description.version != get_dune_py_version(): logger.error('"' + dune_py_dir + '" contains version ' + str(description.version) + ' of the dune-py module, ' + str(get_dune_py_version()) + ' required.') logger.error('If you upgraded dune-python, you can safely remove "' + dune_py_dir + '" and retry.') raise RuntimeError('"' + dune_py_dir + '" contains a different version of the dune-py module.') logger.debug('Using dune-py module in ' + dune_py_dir)
def __init__(self, force=False, saveOutput=False): self.force = force self.skipTargetAll = False if saveOutput is True or saveOutput.lower() == "write": self.savedOutput = [open("generatorCompiler.out","w+"), open("generatorCompiler.err","w+")] elif saveOutput.lower() == "append": self.savedOutput = [open("generatorCompiler.out","a+"), open("generatorCompiler.err","a+")] elif saveOutput.lower() == "console" or \ saveOutput.lower() == "terminal" or \ saveOutput.lower() == "console_nocmake": self.savedOutput = [sys.stdout, sys.stderr] if saveOutput.lower() == "console_nocmake": self.skipTargetAll = True else: self.savedOutput = None self.dune_py_dir = getDunePyDir() self.build_args = getDefaultBuildArgs() self.generated_dir = os.path.join(self.dune_py_dir, 'python', 'dune', 'generated') self.initialized = False self.externalPythonModules = copy.deepcopy(getExternalPythonModules())
def get_dune_py_dir(): return getDunePyDir()
x = array([0.] * 100) run("run", StringIO(runVec), x) for i in range(len(x)): assert x[i] == float(i) def test_class_export(): from dune.generator.importclass import load from dune.generator.algorithm import run from dune.typeregistry import generateTypeName a = 2. x = array([2.] * 10) cls = load("MyClassA", StringIO(classACode), 10, 20) assert run("run", StringIO(runCode), cls) == 10 * 20 clsName, _ = generateTypeName("MyClassB", cls) cls = load(clsName, StringIO(classBCode), cls, 2, x) assert run("run", StringIO(runCode), cls) == 10**2 * 10 * a x[:] = array([3.] * 10)[:] assert run("run", StringIO(runCode), cls) == 10**2 * 10 * 3 # the following does not work x = array([4.] * 10) # the 'B' class still keeps the old vector 'x' alive assert run("run", StringIO(runCode), cls) == 10**2 * 10 * 3 if __name__ == "__main__": from dune.packagemetadata import getDunePyDir _ = getDunePyDir() test_class_export() test_numpyvector()