Example #1
0
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
Example #2
0
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()
Example #3
0
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)
Example #4
0
 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())
Example #5
0
def get_dune_py_dir():
    return getDunePyDir()
Example #6
0
    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()