def test_generaloption_overrides_legacy(self): """Test whether generaloption overrides legacy configuration.""" self.purge_environment() # if both legacy and generaloption style configuration is mixed, generaloption wins legacy_prefix = os.path.join(self.tmpdir, 'legacy') go_prefix = os.path.join(self.tmpdir, 'generaloption') # legacy env vars os.environ['EASYBUILDPREFIX'] = legacy_prefix os.environ['EASYBUILDBUILDPATH'] = os.path.join(legacy_prefix, 'build') # generaloption env vars os.environ['EASYBUILD_INSTALLPATH'] = go_prefix init_config() self.assertEqual(build_path(), os.path.join(legacy_prefix, 'build')) self.assertEqual(install_path(), os.path.join(go_prefix, 'software')) repo = init_repository(get_repository(), get_repositorypath()) self.assertEqual(repo.repo, os.path.join(legacy_prefix, 'ebfiles_repo')) del os.environ['EASYBUILDPREFIX'] # legacy env vars os.environ['EASYBUILDBUILDPATH'] = os.path.join( legacy_prefix, 'buildagain') # generaloption env vars os.environ['EASYBUILD_PREFIX'] = go_prefix init_config() self.assertEqual(build_path(), os.path.join(go_prefix, 'build')) self.assertEqual(install_path(), os.path.join(go_prefix, 'software')) repo = init_repository(get_repository(), get_repositorypath()) self.assertEqual(repo.repo, os.path.join(go_prefix, 'ebfiles_repo')) del os.environ['EASYBUILDBUILDPATH']
def test_generaloption_config(self): """Test new-style configuration (based on generaloption).""" self.purge_environment() # check whether configuration via environment variables works as expected prefix = os.path.join(self.tmpdir, 'testprefix') buildpath_env_var = os.path.join(self.tmpdir, 'envvar', 'build', 'path') os.environ['EASYBUILD_PREFIX'] = prefix os.environ['EASYBUILD_BUILDPATH'] = buildpath_env_var options = init_config(args=[]) self.assertEqual(build_path(), buildpath_env_var) self.assertEqual(install_path(), os.path.join(prefix, 'software')) self.assertEqual(get_repositorypath(), [os.path.join(prefix, 'ebfiles_repo')]) del os.environ['EASYBUILD_PREFIX'] del os.environ['EASYBUILD_BUILDPATH'] # check whether configuration via command line arguments works prefix = os.path.join(self.tmpdir, 'test1') install = os.path.join(self.tmpdir, 'test2', 'install') repopath = os.path.join(self.tmpdir, 'test2', 'repo') config_file = os.path.join(self.tmpdir, 'nooldconfig.py') write_file(config_file, '') args = [ '--config', config_file, # force empty oldstyle config file '--prefix', prefix, '--installpath', install, '--repositorypath', repopath, ] options = init_config(args=args) self.assertEqual(build_path(), os.path.join(prefix, 'build')) self.assertEqual(install_path(), os.path.join(install, 'software')) self.assertEqual(install_path(typ='mod'), os.path.join(install, 'modules')) self.assertEqual(options.installpath, install) self.assertEqual(options.config, config_file) # check mixed command line/env var configuration prefix = os.path.join(self.tmpdir, 'test3') install = os.path.join(self.tmpdir, 'test4', 'install') subdir_software = 'eb-soft' args = [ '--config', config_file, # force empty oldstyle config file '--installpath', install, ] os.environ['EASYBUILD_PREFIX'] = prefix os.environ['EASYBUILD_SUBDIR_SOFTWARE'] = subdir_software options = init_config(args=args) self.assertEqual(build_path(), os.path.join(prefix, 'build')) self.assertEqual(install_path(), os.path.join(install, subdir_software)) del os.environ['EASYBUILD_PREFIX'] del os.environ['EASYBUILD_SUBDIR_SOFTWARE']
def test_generaloption_overrides_legacy(self): """Test whether generaloption overrides legacy configuration.""" self.purge_environment() # if both legacy and generaloption style configuration is mixed, generaloption wins legacy_prefix = os.path.join(self.tmpdir, 'legacy') go_prefix = os.path.join(self.tmpdir, 'generaloption') # legacy env vars os.environ['EASYBUILDPREFIX'] = legacy_prefix os.environ['EASYBUILDBUILDPATH'] = os.path.join(legacy_prefix, 'build') # generaloption env vars os.environ['EASYBUILD_INSTALLPATH'] = go_prefix init_config() self.assertEqual(build_path(), os.path.join(legacy_prefix, 'build')) self.assertEqual(install_path(), os.path.join(go_prefix, 'software')) repo = init_repository(get_repository(), get_repositorypath()) self.assertEqual(repo.repo, os.path.join(legacy_prefix, 'ebfiles_repo')) del os.environ['EASYBUILDPREFIX'] # legacy env vars os.environ['EASYBUILDBUILDPATH'] = os.path.join(legacy_prefix, 'buildagain') # generaloption env vars os.environ['EASYBUILD_PREFIX'] = go_prefix init_config() self.assertEqual(build_path(), os.path.join(go_prefix, 'build')) self.assertEqual(install_path(), os.path.join(go_prefix, 'software')) repo = init_repository(get_repository(), get_repositorypath()) self.assertEqual(repo.repo, os.path.join(go_prefix, 'ebfiles_repo')) del os.environ['EASYBUILDBUILDPATH']
def test_generaloption_config(self): """Test new-style configuration (based on generaloption).""" # check whether configuration via environment variables works as expected prefix = os.path.join(self.tmpdir, 'testprefix') buildpath_env_var = os.path.join(self.tmpdir, 'envvar', 'build', 'path') os.environ['EASYBUILD_PREFIX'] = prefix os.environ['EASYBUILD_BUILDPATH'] = buildpath_env_var options = self.configure_options(args=[]) self.assertEqual(build_path(), buildpath_env_var) del os.environ['EASYBUILD_PREFIX'] del os.environ['EASYBUILD_BUILDPATH'] # check whether configuration via command line arguments works prefix = os.path.join(self.tmpdir, 'test1') install = os.path.join(self.tmpdir, 'test2', 'install') repopath = os.path.join(self.tmpdir, 'test2', 'repo') config_file = os.path.join(self.tmpdir, 'nooldconfig.py') write_file(config_file, '') args = [ '--config', config_file, # force empty oldstyle config file '--prefix', prefix, '--installpath', install, '--repositorypath', repopath, ] options = self.configure_options(args=args) self.assertEqual(build_path(), os.path.join(prefix, 'build')) self.assertEqual(install_path(), os.path.join(install, 'software')) self.assertEqual(install_path(typ='mod'), os.path.join(install, 'modules')) self.assertEqual(options.installpath, install) self.assertEqual(options.config, config_file) # check mixed command line/env var configuration prefix = os.path.join(self.tmpdir, 'test3') install = os.path.join(self.tmpdir, 'test4', 'install') subdir_software = 'eb-soft' args = [ '--config', config_file, # force empty oldstyle config file '--installpath', install, ] os.environ['EASYBUILD_PREFIX'] = prefix os.environ['EASYBUILD_SUBDIR_SOFTWARE'] = subdir_software options = self.configure_options(args=args) self.assertEqual(build_path(), os.path.join(prefix, 'build')) self.assertEqual(install_path(), os.path.join(install, subdir_software)) del os.environ['EASYBUILD_PREFIX'] del os.environ['EASYBUILD_SUBDIR_SOFTWARE']
def test_generaloption_config(self): """Test new-style configuration (based on generaloption).""" prefix = os.path.join(self.tmpdir, 'test1') install = os.path.join(self.tmpdir, 'test2', 'install') repopath = os.path.join(self.tmpdir, 'test2', 'repo') config_file = os.path.join(self.tmpdir, 'nooldconfig.py') write_file(config_file, '') args = [ '--config', config_file, # force empty oldstyle config file '--prefix', prefix, '--installpath', install, '--repositorypath', repopath, ] options = self.configure_options(args=args) self.assertEqual(build_path(), os.path.join(prefix, 'build')) self.assertEqual(install_path(), os.path.join(install, 'software')) self.assertEqual(install_path(typ='mod'), os.path.join(install, 'modules')) self.assertEqual(options.installpath, install) self.assertEqual(options.config, config_file)
def test_skip_extensions_step(self): """Test the skip_extensions_step""" self.contents = '\n'.join([ 'easyblock = "ConfigureMake"', 'name = "pi"', 'version = "3.14"', 'homepage = "http://example.com"', 'description = "test easyconfig"', 'toolchain = {"name": "dummy", "version": "dummy"}', 'exts_list = ["ext1", "ext2"]', 'exts_filter = ("if [ %(ext_name)s == \'ext2\' ]; then exit 0; else exit 1; fi", "")', 'exts_defaultclass = "DummyExtension"', ]) # check if skip skips correct extensions self.writeEC() eb = EasyBlock(EasyConfig(self.eb_file)) eb.builddir = config.build_path() eb.installdir = config.install_path() eb.skip = True eb.extensions_step(fetch=True) # 'ext1' should be in eb.exts self.assertTrue('ext1' in [y for x in eb.exts for y in x.values()]) # 'ext2' should not self.assertFalse('ext2' in [y for x in eb.exts for y in x.values()]) # cleanup eb.close_log() os.remove(eb.logfile)
def test_extensions_step(self): """Test the extensions_step""" self.contents = '\n'.join([ 'easyblock = "ConfigureMake"', 'name = "pi"', 'version = "3.14"', 'homepage = "http://example.com"', 'description = "test easyconfig"', 'toolchain = {"name": "dummy", "version": "dummy"}', 'exts_list = ["ext1"]', ]) self.writeEC() """Testcase for extensions""" # test for proper error message without the exts_defaultclass set eb = EasyBlock(EasyConfig(self.eb_file)) eb.installdir = config.install_path() self.assertRaises(EasyBuildError, eb.extensions_step, fetch=True) self.assertErrorRegex(EasyBuildError, "No default extension class set", eb.extensions_step, fetch=True) # test if everything works fine if set self.contents += "\nexts_defaultclass = 'DummyExtension'" self.writeEC() eb = EasyBlock(EasyConfig(self.eb_file)) eb.builddir = config.build_path() eb.installdir = config.install_path() eb.extensions_step(fetch=True) # test for proper error message when skip is set, but no exts_filter is set self.assertRaises(EasyBuildError, eb.skip_extensions) self.assertErrorRegex(EasyBuildError, "no exts_filter set", eb.skip_extensions) # cleanup eb.close_log() os.remove(eb.logfile)
def sanity_check_step(self): """ Sanity check to run after installing extension """ try: os.chdir(build_path()) except OSError, err: raise EasyBuildError("Failed to change directory: %s", err)
def test_fake_module_load(self): """Testcase for fake module load""" self.contents = '\n'.join([ 'name = "pi"', 'version = "3.14"', 'homepage = "http://example.com"', 'description = "test easyconfig"', 'toolchain = {"name": "dummy", "version": "dummy"}', ]) self.writeEC() eb = EasyBlock(EasyConfig(self.eb_file)) eb.installdir = config.build_path() fake_mod_data = eb.load_fake_module() eb.clean_up_fake_module(fake_mod_data) # cleanup eb.close_log() os.remove(eb.logfile)
def test_generaloption_config_file(self): """Test use of new-style configuration file.""" self.purge_environment() config_file = os.path.join(self.tmpdir, 'testconfig.cfg') testpath1 = os.path.join(self.tmpdir, 'test1') testpath2 = os.path.join(self.tmpdir, 'testtwo') # test with config file passed via command line cfgtxt = '\n'.join([ '[config]', 'installpath = %s' % testpath2, ]) write_file(config_file, cfgtxt) installpath_software = tempfile.mkdtemp(prefix='installpath-software') args = [ '--configfiles', config_file, '--debug', '--buildpath', testpath1, '--installpath-software', installpath_software, ] options = init_config(args=args) self.assertEqual(build_path(), testpath1) # via command line self.assertEqual(source_paths(), [ os.path.join(os.getenv('HOME'), '.local', 'easybuild', 'sources') ]) # default self.assertEqual(install_path(), installpath_software) # via cmdline arg self.assertEqual(install_path('mod'), os.path.join(testpath2, 'modules')) # via config file # copy test easyconfigs to easybuild/easyconfigs subdirectory of temp directory # to check whether easyconfigs install path is auto-included in robot path tmpdir = tempfile.mkdtemp( prefix='easybuild-easyconfigs-pkg-install-path') mkdir(os.path.join(tmpdir, 'easybuild'), parents=True) test_ecs_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'easyconfigs') shutil.copytree(test_ecs_dir, os.path.join(tmpdir, 'easybuild', 'easyconfigs')) orig_sys_path = sys.path[:] sys.path.insert( 0, tmpdir ) # prepend to give it preference over possible other installed easyconfigs pkgs # test with config file passed via environment variable # also test for existence of HOME and USER by adding paths to robot-paths installpath_modules = tempfile.mkdtemp(prefix='installpath-modules') cfgtxt = '\n'.join([ '[config]', 'buildpath = %s' % testpath1, 'sourcepath = %(DEFAULT_REPOSITORYPATH)s', 'repositorypath = %(DEFAULT_REPOSITORYPATH)s,somesubdir', 'robot-paths=/tmp/foo:%(sourcepath)s:%(HOME)s:/tmp/%(USER)s:%(DEFAULT_ROBOT_PATHS)s', 'installpath-modules=%s' % installpath_modules, ]) write_file(config_file, cfgtxt) os.environ['EASYBUILD_CONFIGFILES'] = config_file args = [ '--debug', '--sourcepath', testpath2, ] options = init_config(args=args) topdir = os.path.join(os.getenv('HOME'), '.local', 'easybuild') self.assertEqual(install_path(), os.path.join(topdir, 'software')) # default self.assertEqual(install_path('mod'), installpath_modules), # via config file self.assertEqual(source_paths(), [testpath2]) # via command line self.assertEqual(build_path(), testpath1) # via config file self.assertEqual(get_repositorypath(), [os.path.join(topdir, 'ebfiles_repo'), 'somesubdir' ]) # via config file # hardcoded first entry self.assertEqual(options.robot_paths[0], '/tmp/foo') # resolved value for %(sourcepath)s template self.assertEqual( options.robot_paths[1], os.path.join(os.getenv('HOME'), '.local', 'easybuild', 'ebfiles_repo')) # resolved value for HOME constant self.assertEqual(options.robot_paths[2], os.getenv('HOME')) # resolved value that uses USER constant self.assertEqual(options.robot_paths[3], os.path.join('/tmp', os.getenv('USER'))) # first path in DEFAULT_ROBOT_PATHS self.assertEqual(options.robot_paths[4], os.path.join(tmpdir, 'easybuild', 'easyconfigs')) testpath3 = os.path.join(self.tmpdir, 'testTHREE') os.environ['EASYBUILD_SOURCEPATH'] = testpath2 args = [ '--debug', '--installpath', testpath3, ] options = init_config(args=args) self.assertEqual( source_paths(), [testpath2]) # via environment variable $EASYBUILD_SOURCEPATHS self.assertEqual(install_path(), os.path.join(testpath3, 'software')) # via command line self.assertEqual(install_path('mod'), installpath_modules), # via config file self.assertEqual(build_path(), testpath1) # via config file del os.environ['EASYBUILD_CONFIGFILES'] sys.path[:] = orig_sys_path
def test_generaloption_config(self): """Test new-style configuration (based on generaloption).""" self.purge_environment() # check whether configuration via environment variables works as expected prefix = os.path.join(self.tmpdir, 'testprefix') buildpath_env_var = os.path.join(self.tmpdir, 'envvar', 'build', 'path') os.environ['EASYBUILD_PREFIX'] = prefix os.environ['EASYBUILD_BUILDPATH'] = buildpath_env_var options = init_config(args=[]) self.assertEqual(build_path(), buildpath_env_var) self.assertEqual(install_path(), os.path.join(prefix, 'software')) self.assertEqual(get_repositorypath(), [os.path.join(prefix, 'ebfiles_repo')]) del os.environ['EASYBUILD_PREFIX'] del os.environ['EASYBUILD_BUILDPATH'] # check whether configuration via command line arguments works prefix = os.path.join(self.tmpdir, 'test1') install = os.path.join(self.tmpdir, 'test2', 'install') repopath = os.path.join(self.tmpdir, 'test2', 'repo') config_file = os.path.join(self.tmpdir, 'nooldconfig.py') write_file(config_file, '') args = [ '--configfiles', config_file, # force empty config file '--prefix', prefix, '--installpath', install, '--repositorypath', repopath, '--subdir-software', 'APPS', ] options = init_config(args=args) self.assertEqual(build_path(), os.path.join(prefix, 'build')) self.assertEqual(install_path(), os.path.join(install, 'APPS')) self.assertEqual(install_path(typ='mod'), os.path.join(install, 'modules')) self.assertEqual(options.installpath, install) self.assertTrue(config_file in options.configfiles) # check mixed command line/env var configuration prefix = os.path.join(self.tmpdir, 'test3') install = os.path.join(self.tmpdir, 'test4', 'install') subdir_software = 'eb-soft' args = [ '--configfiles', config_file, # force empty config file '--installpath', install, ] os.environ['EASYBUILD_PREFIX'] = prefix os.environ['EASYBUILD_SUBDIR_SOFTWARE'] = subdir_software installpath_modules = tempfile.mkdtemp(prefix='installpath-modules') os.environ['EASYBUILD_INSTALLPATH_MODULES'] = installpath_modules options = init_config(args=args) self.assertEqual(build_path(), os.path.join(prefix, 'build')) self.assertEqual(install_path(), os.path.join(install, subdir_software)) self.assertEqual(install_path('mod'), installpath_modules) # subdir options *must* be relative (to --installpath) installpath_software = tempfile.mkdtemp(prefix='installpath-software') os.environ['EASYBUILD_SUBDIR_SOFTWARE'] = installpath_software error_regex = r"Found problems validating the options.*'subdir_software' must specify a \*relative\* path" self.assertErrorRegex(EasyBuildError, error_regex, init_config) del os.environ['EASYBUILD_PREFIX'] del os.environ['EASYBUILD_SUBDIR_SOFTWARE']
def configure_step(self): """Set some extra environment variables before configuring.""" # enable verbose output if desired if self.cfg['verbose']: for x in ["CONFIGURE", "MAKEFILE"]: self.cfg.update('configopts', "-DTrilinos_VERBOSE_%s:BOOL=ON" % x) # compiler flags cflags = [os.getenv('CFLAGS')] cxxflags = [os.getenv('CXXFLAGS')] fflags = [os.getenv('FFLAGS')] ignore_cxx_seek_mpis = [toolchain.INTELMPI, toolchain.MPICH, toolchain.MPICH2, toolchain.MVAPICH2] #@UndefinedVariable ignore_cxx_seek_flag = "-DMPICH_IGNORE_CXX_SEEK" if self.toolchain.mpi_family() in ignore_cxx_seek_mpis: cflags.append(ignore_cxx_seek_flag) cxxflags.append(ignore_cxx_seek_flag) fflags.append(ignore_cxx_seek_flag) self.cfg.update('configopts', '-DCMAKE_C_FLAGS="%s"' % ' '.join(cflags)) self.cfg.update('configopts', '-DCMAKE_CXX_FLAGS="%s"' % ' '.join(cxxflags)) self.cfg.update('configopts', '-DCMAKE_Fortran_FLAGS="%s"' % ' '.join(fflags)) # OpenMP if self.cfg['openmp']: self.cfg.update('configopts', "-DTrilinos_ENABLE_OpenMP:BOOL=ON") # MPI if self.toolchain.options.get('usempi', None): self.cfg.update('configopts', "-DTPL_ENABLE_MPI:BOOL=ON") # shared libraries if self.cfg['shared_libs']: self.cfg.update('configopts', "-DBUILD_SHARED_LIBS:BOOL=ON") else: self.cfg.update('configopts', "-DBUILD_SHARED_LIBS:BOOL=OFF") # release or debug get_version if self.toolchain.options['debug']: self.cfg.update('configopts', "-DCMAKE_BUILD_TYPE:STRING=DEBUG") else: self.cfg.update('configopts', "-DCMAKE_BUILD_TYPE:STRING=RELEASE") # enable full testing self.cfg.update('configopts', "-DTrilinos_ENABLE_TESTS:BOOL=ON") self.cfg.update('configopts', "-DTrilinos_ENABLE_ALL_FORWARD_DEP_PACKAGES:BOOL=ON") lib_re = re.compile("^lib(.*).a$") # BLAS, LAPACK for dep in ["BLAS", "LAPACK"]: self.cfg.update('configopts', '-DTPL_ENABLE_%s:BOOL=ON' % dep) libdirs = os.getenv('%s_LIB_DIR' % dep) if self.toolchain.comp_family() == toolchain.GCC: #@UndefinedVariable libdirs += ";%s/lib64" % get_software_root('GCC') self.cfg.update('configopts', '-D%s_LIBRARY_DIRS="%s"' % (dep, libdirs)) libs = os.getenv('%s_MT_STATIC_LIBS' % dep).split(',') lib_names = ';'.join([lib_re.search(l).group(1) for l in libs]) if self.toolchain.comp_family() == toolchain.GCC: #@UndefinedVariable # explicitely specify static lib! lib_names += ";libgfortran.a" self.cfg.update('configopts', '-D%s_LIBRARY_NAMES="%s"' % (dep, lib_names)) # MKL if get_software_root('imkl') and LooseVersion(self.version) >= LooseVersion('12.12'): self.cfg.update('configopts', "-DTPL_ENABLE_MKL:BOOL=ON") self.cfg.update('configopts', '-DMKL_LIBRARY_DIRS:PATH="%s/lib/intel64"' % os.getenv('MKLROOT')) self.cfg.update('configopts', '-DMKL_INCLUDE_DIRS:PATH="%s/include"' % os.getenv('MKLROOT')) # UMFPACK is part of SuiteSparse suitesparse = get_software_root('SuiteSparse') if suitesparse: self.cfg.update('configopts', "-DTPL_ENABLE_UMFPACK:BOOL=ON") incdirs, libdirs, libnames = [], [], [] for lib in ["UMFPACK", "CHOLMOD", "COLAMD", "AMD", "CCOLAMD", "CAMD"]: incdirs.append(os.path.join(suitesparse, lib, "Include")) libdirs.append(os.path.join(suitesparse, lib, "Lib")) libnames.append(lib.lower()) # add SuiteSparse config lib, it is in recent versions of suitesparse libdirs.append(os.path.join(suitesparse, 'SuiteSparse_config')) libnames.append('suitesparseconfig') # because of "SuiteSparse_config.c:function SuiteSparse_tic: error: undefined reference to 'clock_gettime'" libnames.append('rt') # required to resolve METIS symbols in SuiteSparse's libcholmod.a # doesn't need to be full location, probably because it can be found via $LIBRARY_PATH # not easy to know whether it should come from METIS or ParMETIS... # see https://answers.launchpad.net/dorsal/+question/223167 libnames.append('libmetis.a') self.cfg.update('configopts', '-DUMFPACK_INCLUDE_DIRS:PATH="%s"' % ';'.join(incdirs)) self.cfg.update('configopts', '-DUMFPACK_LIBRARY_DIRS:PATH="%s"' % ';'.join(libdirs)) self.cfg.update('configopts', '-DUMFPACK_LIBRARY_NAMES:STRING="%s"' % ';'.join(libnames)) # BLACS if get_software_root('BLACS'): self.cfg.update('configopts', "-DTPL_ENABLE_BLACS:BOOL=ON") self.cfg.update('configopts', '-DBLACS_INCLUDE_DIRS:PATH="%s"' % os.getenv('BLACS_INC_DIR')) self.cfg.update('configopts', '-DBLACS_LIBRARY_DIRS:PATH="%s"' % os.getenv('BLACS_LIB_DIR')) blacs_lib_names = os.getenv('BLACS_STATIC_LIBS').split(',') blacs_lib_names = [lib_re.search(x).group(1) for x in blacs_lib_names] self.cfg.update('configopts', '-DBLACS_LIBRARY_NAMES:STRING="%s"' % (';'.join(blacs_lib_names))) # ScaLAPACK if get_software_root('ScaLAPACK'): self.cfg.update('configopts', "-DTPL_ENABLE_SCALAPACK:BOOL=ON") self.cfg.update('configopts', '-DSCALAPACK_INCLUDE_DIRS:PATH="%s"' % os.getenv('SCALAPACK_INC_DIR')) self.cfg.update('configopts', '-DSCALAPACK_LIBRARY_DIRS:PATH="%s;%s"' % (os.getenv('SCALAPACK_LIB_DIR'), os.getenv('BLACS_LIB_DIR'))) # PETSc petsc = get_software_root('PETSc') if petsc: self.cfg.update('configopts', "-DTPL_ENABLE_PETSC:BOOL=ON") incdirs = [os.path.join(petsc, "include")] self.cfg.update('configopts', '-DPETSC_INCLUDE_DIRS:PATH="%s"' % ';'.join(incdirs)) petsc_libdirs = [ os.path.join(petsc, "lib"), os.path.join(suitesparse, "UMFPACK", "Lib"), os.path.join(suitesparse, "CHOLMOD", "Lib"), os.path.join(suitesparse, "COLAMD", "Lib"), os.path.join(suitesparse, "AMD", "Lib"), os.getenv('FFTW_LIB_DIR'), os.path.join(get_software_root('ParMETIS'), "Lib") ] self.cfg.update('configopts', '-DPETSC_LIBRARY_DIRS:PATH="%s"' % ';'.join(petsc_libdirs)) petsc_libnames = ["petsc", "umfpack", "cholmod", "colamd", "amd", "parmetis", "metis"] petsc_libnames += [lib_re.search(x).group(1) for x in os.getenv('FFTW_STATIC_LIBS').split(',')] self.cfg.update('configopts', '-DPETSC_LIBRARY_NAMES:STRING="%s"' % ';'.join(petsc_libnames)) # other Third-Party Libraries (TPLs) deps = self.cfg.dependencies() builddeps = self.cfg.builddependencies() + ["SuiteSparse"] deps = [dep['name'] for dep in deps if not dep['name'] in builddeps] for dep in deps: deproot = get_software_root(dep) if deproot: depmap = { 'SCOTCH': 'Scotch', } dep = depmap.get(dep, dep) self.cfg.update('configopts', "-DTPL_ENABLE_%s:BOOL=ON" % dep) incdir = os.path.join(deproot, "include") self.cfg.update('configopts', '-D%s_INCLUDE_DIRS:PATH="%s"' % (dep, incdir)) libdir = os.path.join(deproot, "lib") self.cfg.update('configopts', '-D%s_LIBRARY_DIRS:PATH="%s"' % (dep, libdir)) # extensions_step if self.cfg['all_exts']: self.cfg.update('configopts', "-DTrilinos_ENABLE_ALL_PACKAGES:BOOL=ON") else: for ext in self.cfg['exts_list']: self.cfg.update('configopts', "-DTrilinos_ENABLE_%s=ON" % ext) # packages to skip skip_exts = self.cfg['skip_exts'] if skip_exts: for ext in skip_exts: self.cfg.update('configopts', "-DTrilinos_ENABLE_%s:BOOL=OFF" % ext) # building in source dir not supported # + if the build directory is a long path, problems like "Argument list too long" may occur # cfr. https://github.com/trilinos/Trilinos/issues/2434 # so, try to create build directory with shorter path length to build in salt = ''.join(random.choice(string.letters) for _ in range(5)) self.short_start_dir = os.path.join(build_path(), self.name + '-' + salt) if os.path.exists(self.short_start_dir): raise EasyBuildError("Short start directory %s for Trilinos already exists?!", self.short_start_dir) self.log.info("Length of path to original start directory: %s", len(self.start_dir)) self.log.info("Short start directory: %s (length: %d)", self.short_start_dir, len(self.short_start_dir)) mkdir(self.short_start_dir) short_src_dir = os.path.join(self.short_start_dir, 'src') symlink(self.start_dir, short_src_dir) short_build_dir = os.path.join(self.short_start_dir, 'obj') obj_dir = os.path.join(self.builddir, 'obj') mkdir(obj_dir) symlink(obj_dir, short_build_dir) # configure using cmake super(EB_Trilinos, self).configure_step(srcdir=short_src_dir, builddir=short_build_dir)
def test_legacy_config_file(self): """Test finding/using legacy configuration files.""" self.purge_environment() cfg_fn = self.configure(args=[]) self.assertTrue(cfg_fn.endswith('easybuild/easybuild_config.py')) configtxt = """ build_path = '%(buildpath)s' source_path = '%(sourcepath)s' install_path = '%(installpath)s' repository_path = '%(repopath)s' repository = FileRepository(repository_path) log_format = ('%(logdir)s', '%(logtmpl)s') log_dir = '%(tmplogdir)s' software_install_suffix = '%(softsuffix)s' modules_install_suffix = '%(modsuffix)s' """ buildpath = os.path.join(self.tmpdir, 'my', 'test', 'build', 'path') sourcepath = os.path.join(self.tmpdir, 'my', 'test', 'source', 'path') installpath = os.path.join(self.tmpdir, 'my', 'test', 'install', 'path') repopath = os.path.join(self.tmpdir, 'my', 'test', 'repo', 'path') logdir = 'somedir' logtmpl = 'test-eb-%(name)s%(version)s_date-%(date)s__time-%(time)s.log' tmplogdir = os.path.join(self.tmpdir, 'my', 'test', 'tmplogdir') softsuffix = 'myfavoritesoftware' modsuffix = 'modulesgohere' configdict = { 'buildpath': buildpath, 'sourcepath': sourcepath, 'installpath': installpath, 'repopath': repopath, 'logdir': logdir, 'logtmpl': logtmpl, 'tmplogdir': tmplogdir, 'softsuffix': softsuffix, 'modsuffix': modsuffix } # create user config file on default location myconfigfile = os.path.join(self.tmpdir, '.easybuild', 'config.py') if not os.path.exists(os.path.dirname(myconfigfile)): os.makedirs(os.path.dirname(myconfigfile)) write_file(myconfigfile, configtxt % configdict) # redefine home so we can test user config file on default location home = os.environ.get('HOME', None) os.environ['HOME'] = self.tmpdir init_config() cfg_fn = self.configure(args=[]) if home is not None: os.environ['HOME'] = home # check finding and use of config file self.assertEqual(cfg_fn, myconfigfile) self.assertEqual(build_path(), buildpath) self.assertEqual(source_paths()[0], sourcepath) self.assertEqual(install_path(), os.path.join(installpath, softsuffix)) self.assertEqual(install_path(typ='mod'), os.path.join(installpath, modsuffix)) repo = init_repository(get_repository(), get_repositorypath()) self.assertTrue(isinstance(repo, FileRepository)) self.assertEqual(repo.repo, repopath) self.assertEqual(log_file_format(return_directory=True), logdir) self.assertEqual(log_file_format(), logtmpl) self.assertEqual(get_build_log_path(), tmplogdir) # redefine config file entries for proper testing below buildpath = os.path.join(self.tmpdir, 'my', 'custom', 'test', 'build', 'path') sourcepath = os.path.join(self.tmpdir, 'my', 'custom', 'test', 'source', 'path') installpath = os.path.join(self.tmpdir, 'my', 'custom', 'test', 'install', 'path') repopath = os.path.join(self.tmpdir, 'my', 'custom', 'test', 'repo', 'path') logdir = 'somedir_custom' logtmpl = 'test-custom-eb-%(name)_%(date)s%(time)s__%(version)s.log' tmplogdir = os.path.join(self.tmpdir, 'my', 'custom', 'test', 'tmplogdir') softsuffix = 'myfavoritesoftware_custom' modsuffix = 'modulesgohere_custom' configdict = { 'buildpath': buildpath, 'sourcepath': sourcepath, 'installpath': installpath, 'repopath': repopath, 'logdir': logdir, 'logtmpl': logtmpl, 'tmplogdir': tmplogdir, 'softsuffix': softsuffix, 'modsuffix': modsuffix } # create custom config file, and point to it mycustomconfigfile = os.path.join(self.tmpdir, 'mycustomconfig.py') if not os.path.exists(os.path.dirname(mycustomconfigfile)): os.makedirs(os.path.dirname(mycustomconfigfile)) write_file(mycustomconfigfile, configtxt % configdict) os.environ['EASYBUILDCONFIG'] = mycustomconfigfile # reconfigure init_config() cfg_fn = self.configure(args=[]) # verify configuration self.assertEqual(cfg_fn, mycustomconfigfile) self.assertEqual(build_path(), buildpath) self.assertEqual(source_paths()[0], sourcepath) self.assertEqual(install_path(), os.path.join(installpath, softsuffix)) self.assertEqual(install_path(typ='mod'), os.path.join(installpath, modsuffix)) repo = init_repository(get_repository(), get_repositorypath()) self.assertTrue(isinstance(repo, FileRepository)) self.assertEqual(repo.repo, repopath) self.assertEqual(log_file_format(return_directory=True), logdir) self.assertEqual(log_file_format(), logtmpl) self.assertEqual(get_build_log_path(), tmplogdir)
def test_generaloption_config_file(self): """Test use of new-style configuration file.""" self.purge_environment() oldstyle_config_file = os.path.join(self.tmpdir, 'nooldconfig.py') config_file = os.path.join(self.tmpdir, 'testconfig.cfg') testpath1 = os.path.join(self.tmpdir, 'test1') testpath2 = os.path.join(self.tmpdir, 'testtwo') write_file(oldstyle_config_file, '') # test with config file passed via command line cfgtxt = '\n'.join([ '[config]', 'installpath = %s' % testpath2, ]) write_file(config_file, cfgtxt) args = [ '--configfiles', config_file, '--debug', '--buildpath', testpath1, ] options = init_config(args=args) self.assertEqual(build_path(), testpath1) # via command line self.assertEqual(source_paths(), [os.path.join(os.getenv('HOME'), '.local', 'easybuild', 'sources')]) # default self.assertEqual(install_path(), os.path.join(testpath2, 'software')) # via config file # test with config file passed via environment variable cfgtxt = '\n'.join([ '[config]', 'buildpath = %s' % testpath1, ]) write_file(config_file, cfgtxt) os.environ['EASYBUILD_CONFIGFILES'] = config_file args = [ '--debug', '--sourcepath', testpath2, ] options = init_config(args=args) self.assertEqual(install_path(), os.path.join(os.getenv('HOME'), '.local', 'easybuild', 'software')) # default self.assertEqual(source_paths(), [testpath2]) # via command line self.assertEqual(build_path(), testpath1) # via config file testpath3 = os.path.join(self.tmpdir, 'testTHREE') os.environ['EASYBUILD_SOURCEPATH'] = testpath2 args = [ '--debug', '--installpath', testpath3, ] options = init_config(args=args) self.assertEqual(source_paths(), [testpath2]) # via environment variable $EASYBUILD_SOURCEPATHS self.assertEqual(install_path(), os.path.join(testpath3, 'software')) # via command line self.assertEqual(build_path(), testpath1) # via config file del os.environ['EASYBUILD_CONFIGFILES']
def test_generaloption_config_file(self): """Test use of new-style configuration file.""" self.purge_environment() oldstyle_config_file = os.path.join(self.tmpdir, 'nooldconfig.py') config_file = os.path.join(self.tmpdir, 'testconfig.cfg') testpath1 = os.path.join(self.tmpdir, 'test1') testpath2 = os.path.join(self.tmpdir, 'testtwo') write_file(oldstyle_config_file, '') # test with config file passed via command line cfgtxt = '\n'.join([ '[config]', 'installpath = %s' % testpath2, ]) write_file(config_file, cfgtxt) args = [ '--configfiles', config_file, '--debug', '--buildpath', testpath1, ] options = init_config(args=args) self.assertEqual(build_path(), testpath1) # via command line self.assertEqual(source_paths(), [os.path.join(os.getenv('HOME'), '.local', 'easybuild', 'sources')]) # default self.assertEqual(install_path(), os.path.join(testpath2, 'software')) # via config file # copy test easyconfigs to easybuild/easyconfigs subdirectory of temp directory # to check whether easyconfigs install path is auto-included in robot path tmpdir = tempfile.mkdtemp(prefix='easybuild-easyconfigs-pkg-install-path') mkdir(os.path.join(tmpdir, 'easybuild'), parents=True) test_ecs_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'easyconfigs') shutil.copytree(test_ecs_dir, os.path.join(tmpdir, 'easybuild', 'easyconfigs')) orig_sys_path = sys.path[:] sys.path.insert(0, tmpdir) # prepend to give it preference over possible other installed easyconfigs pkgs # test with config file passed via environment variable cfgtxt = '\n'.join([ '[config]', 'buildpath = %s' % testpath1, 'robot-paths = /tmp/foo:%(DEFAULT_ROBOT_PATHS)s', ]) write_file(config_file, cfgtxt) os.environ['EASYBUILD_CONFIGFILES'] = config_file args = [ '--debug', '--sourcepath', testpath2, ] options = init_config(args=args) self.assertEqual(install_path(), os.path.join(os.getenv('HOME'), '.local', 'easybuild', 'software')) # default self.assertEqual(source_paths(), [testpath2]) # via command line self.assertEqual(build_path(), testpath1) # via config file self.assertTrue('/tmp/foo' in options.robot_paths) self.assertTrue(os.path.join(tmpdir, 'easybuild', 'easyconfigs') in options.robot_paths) testpath3 = os.path.join(self.tmpdir, 'testTHREE') os.environ['EASYBUILD_SOURCEPATH'] = testpath2 args = [ '--debug', '--installpath', testpath3, ] options = init_config(args=args) self.assertEqual(source_paths(), [testpath2]) # via environment variable $EASYBUILD_SOURCEPATHS self.assertEqual(install_path(), os.path.join(testpath3, 'software')) # via command line self.assertEqual(build_path(), testpath1) # via config file del os.environ['EASYBUILD_CONFIGFILES'] sys.path[:] = orig_sys_path
def test_legacy_env_vars(self): """Test legacy environment variables.""" self.purge_environment() # build path test_buildpath = os.path.join(self.tmpdir, 'build', 'path') os.environ['EASYBUILDBUILDPATH'] = test_buildpath self.configure(args=[]) self.assertEqual(build_path(), test_buildpath) del os.environ['EASYBUILDBUILDPATH'] # source path(s) test_sourcepaths = [ os.path.join(self.tmpdir, 'source', 'path'), ':'.join([ os.path.join(self.tmpdir, 'source', 'path1'), os.path.join(self.tmpdir, 'source', 'path2'), ]), ':'.join([ os.path.join(self.tmpdir, 'source', 'path1'), os.path.join(self.tmpdir, 'source', 'path2'), os.path.join(self.tmpdir, 'source', 'path3'), ]), ] for test_sourcepath in test_sourcepaths: init_config() os.environ['EASYBUILDSOURCEPATH'] = test_sourcepath self.configure(args=[]) self.assertEqual(build_path(), os.path.join(os.path.expanduser('~'), '.local', 'easybuild', DEFAULT_PATH_SUBDIRS['buildpath'])) self.assertEqual(source_paths(), test_sourcepath.split(':')) del os.environ['EASYBUILDSOURCEPATH'] test_sourcepath = os.path.join(self.tmpdir, 'source', 'path') # install path init_config() test_installpath = os.path.join(self.tmpdir, 'install', 'path') os.environ['EASYBUILDINSTALLPATH'] = test_installpath self.configure(args=[]) self.assertEqual(source_paths()[0], os.path.join(os.path.expanduser('~'), '.local', 'easybuild', DEFAULT_PATH_SUBDIRS['sourcepath'])) self.assertEqual(install_path(), os.path.join(test_installpath, DEFAULT_PATH_SUBDIRS['subdir_software'])) self.assertEqual(install_path(typ='mod'), os.path.join(test_installpath, DEFAULT_PATH_SUBDIRS['subdir_modules'])) del os.environ['EASYBUILDINSTALLPATH'] # prefix: should change build/install/source/repo paths init_config() test_prefixpath = os.path.join(self.tmpdir, 'prefix', 'path') os.environ['EASYBUILDPREFIX'] = test_prefixpath self.configure(args=[]) self.assertEqual(build_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['buildpath'])) self.assertEqual(source_paths()[0], os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['sourcepath'])) self.assertEqual(install_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_software'])) self.assertEqual(install_path(typ='mod'), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_modules'])) repo = init_repository(get_repository(), get_repositorypath()) self.assertTrue(isinstance(repo, FileRepository)) self.assertEqual(repo.repo, os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['repositorypath'])) # build/source/install path overrides prefix init_config() os.environ['EASYBUILDBUILDPATH'] = test_buildpath self.configure(args=[]) self.assertEqual(build_path(), test_buildpath) self.assertEqual(source_paths()[0], os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['sourcepath'])) self.assertEqual(install_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_software'])) self.assertEqual(install_path(typ='mod'), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_modules'])) repo = init_repository(get_repository(), get_repositorypath()) self.assertTrue(isinstance(repo, FileRepository)) self.assertEqual(repo.repo, os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['repositorypath'])) del os.environ['EASYBUILDBUILDPATH'] init_config() os.environ['EASYBUILDSOURCEPATH'] = test_sourcepath self.configure(args=[]) self.assertEqual(build_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['buildpath'])) self.assertEqual(source_paths()[0], test_sourcepath) self.assertEqual(install_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_software'])) self.assertEqual(install_path(typ='mod'), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_modules'])) repo = init_repository(get_repository(), get_repositorypath()) self.assertTrue(isinstance(repo, FileRepository)) self.assertEqual(repo.repo, os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['repositorypath'])) del os.environ['EASYBUILDSOURCEPATH'] init_config() os.environ['EASYBUILDINSTALLPATH'] = test_installpath self.configure(args=[]) self.assertEqual(build_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['buildpath'])) self.assertEqual(source_paths()[0], os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['sourcepath'])) self.assertEqual(install_path(), os.path.join(test_installpath, DEFAULT_PATH_SUBDIRS['subdir_software'])) self.assertEqual(install_path(typ='mod'), os.path.join(test_installpath, DEFAULT_PATH_SUBDIRS['subdir_modules'])) repo = init_repository(get_repository(), get_repositorypath()) self.assertTrue(isinstance(repo, FileRepository)) self.assertEqual(repo.repo, os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['repositorypath']))
def test_legacy_env_vars(self): """Test legacy environment variables.""" # build path test_buildpath = os.path.join(self.tmpdir, 'build', 'path') os.environ['EASYBUILDBUILDPATH'] = test_buildpath self.configure(args=[]) self.assertEqual(build_path(), test_buildpath) del os.environ['EASYBUILDBUILDPATH'] # source path config.variables = ConfigurationVariables() test_sourcepath = os.path.join(self.tmpdir, 'source', 'path') os.environ['EASYBUILDSOURCEPATH'] = test_sourcepath self.configure(args=[]) self.assertEqual( build_path(), os.path.join(os.path.expanduser('~'), '.local', 'easybuild', DEFAULT_PATH_SUBDIRS['buildpath'])) self.assertEqual(source_path(), test_sourcepath) del os.environ['EASYBUILDSOURCEPATH'] # install path config.variables = ConfigurationVariables() test_installpath = os.path.join(self.tmpdir, 'install', 'path') os.environ['EASYBUILDINSTALLPATH'] = test_installpath self.configure(args=[]) self.assertEqual( source_path(), os.path.join(os.path.expanduser('~'), '.local', 'easybuild', DEFAULT_PATH_SUBDIRS['sourcepath'])) self.assertEqual( install_path(), os.path.join(test_installpath, DEFAULT_PATH_SUBDIRS['subdir_software'])) self.assertEqual( install_path(typ='mod'), os.path.join(test_installpath, DEFAULT_PATH_SUBDIRS['subdir_modules'])) del os.environ['EASYBUILDINSTALLPATH'] # prefix: should change build/install/source/repo paths config.variables = ConfigurationVariables() test_prefixpath = os.path.join(self.tmpdir, 'prefix', 'path') os.environ['EASYBUILDPREFIX'] = test_prefixpath self.configure(args=[]) self.assertEqual( build_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['buildpath'])) self.assertEqual( source_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['sourcepath'])) self.assertEqual( install_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_software'])) self.assertEqual( install_path(typ='mod'), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_modules'])) repo = get_repository() self.assertTrue(isinstance(repo, FileRepository)) self.assertEqual( repo.repo, os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['repositorypath'])) # build/source/install path overrides prefix config.variables = ConfigurationVariables() os.environ['EASYBUILDBUILDPATH'] = test_buildpath self.configure(args=[]) self.assertEqual(build_path(), test_buildpath) self.assertEqual( source_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['sourcepath'])) self.assertEqual( install_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_software'])) self.assertEqual( install_path(typ='mod'), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_modules'])) repo = get_repository() self.assertTrue(isinstance(repo, FileRepository)) self.assertEqual( repo.repo, os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['repositorypath'])) # also check old style vs new style self.assertEqual(config.variables['build_path'], config.variables['buildpath']) self.assertEqual(config.variables['install_path'], config.variables['installpath']) del os.environ['EASYBUILDBUILDPATH'] config.variables = ConfigurationVariables() os.environ['EASYBUILDSOURCEPATH'] = test_sourcepath self.configure(args=[]) self.assertEqual( build_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['buildpath'])) self.assertEqual(source_path(), test_sourcepath) self.assertEqual( install_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_software'])) self.assertEqual( install_path(typ='mod'), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_modules'])) repo = get_repository() self.assertTrue(isinstance(repo, FileRepository)) self.assertEqual( repo.repo, os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['repositorypath'])) del os.environ['EASYBUILDSOURCEPATH'] config.variables = ConfigurationVariables() os.environ['EASYBUILDINSTALLPATH'] = test_installpath self.configure(args=[]) self.assertEqual( build_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['buildpath'])) self.assertEqual( source_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['sourcepath'])) self.assertEqual( install_path(), os.path.join(test_installpath, DEFAULT_PATH_SUBDIRS['subdir_software'])) self.assertEqual( install_path(typ='mod'), os.path.join(test_installpath, DEFAULT_PATH_SUBDIRS['subdir_modules'])) repo = get_repository() self.assertTrue(isinstance(repo, FileRepository)) self.assertEqual( repo.repo, os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['repositorypath'])) del os.environ['EASYBUILDINSTALLPATH'] del os.environ['EASYBUILDPREFIX']
def test_legacy_env_vars(self): """Test legacy environment variables.""" self.purge_environment() # build path test_buildpath = os.path.join(self.tmpdir, 'build', 'path') os.environ['EASYBUILDBUILDPATH'] = test_buildpath self.configure(args=[]) self.assertEqual(build_path(), test_buildpath) del os.environ['EASYBUILDBUILDPATH'] # source path(s) test_sourcepaths = [ os.path.join(self.tmpdir, 'source', 'path'), ':'.join([ os.path.join(self.tmpdir, 'source', 'path1'), os.path.join(self.tmpdir, 'source', 'path2'), ]), ':'.join([ os.path.join(self.tmpdir, 'source', 'path1'), os.path.join(self.tmpdir, 'source', 'path2'), os.path.join(self.tmpdir, 'source', 'path3'), ]), ] for test_sourcepath in test_sourcepaths: init_config() os.environ['EASYBUILDSOURCEPATH'] = test_sourcepath self.configure(args=[]) self.assertEqual( build_path(), os.path.join(os.path.expanduser('~'), '.local', 'easybuild', DEFAULT_PATH_SUBDIRS['buildpath'])) self.assertEqual(source_paths(), test_sourcepath.split(':')) del os.environ['EASYBUILDSOURCEPATH'] test_sourcepath = os.path.join(self.tmpdir, 'source', 'path') # install path init_config() test_installpath = os.path.join(self.tmpdir, 'install', 'path') os.environ['EASYBUILDINSTALLPATH'] = test_installpath self.configure(args=[]) self.assertEqual( source_paths()[0], os.path.join(os.path.expanduser('~'), '.local', 'easybuild', DEFAULT_PATH_SUBDIRS['sourcepath'])) self.assertEqual( install_path(), os.path.join(test_installpath, DEFAULT_PATH_SUBDIRS['subdir_software'])) self.assertEqual( install_path(typ='mod'), os.path.join(test_installpath, DEFAULT_PATH_SUBDIRS['subdir_modules'])) del os.environ['EASYBUILDINSTALLPATH'] # prefix: should change build/install/source/repo paths init_config() test_prefixpath = os.path.join(self.tmpdir, 'prefix', 'path') os.environ['EASYBUILDPREFIX'] = test_prefixpath self.configure(args=[]) self.assertEqual( build_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['buildpath'])) self.assertEqual( source_paths()[0], os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['sourcepath'])) self.assertEqual( install_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_software'])) self.assertEqual( install_path(typ='mod'), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_modules'])) repo = init_repository(get_repository(), get_repositorypath()) self.assertTrue(isinstance(repo, FileRepository)) self.assertEqual( repo.repo, os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['repositorypath'])) # build/source/install path overrides prefix init_config() os.environ['EASYBUILDBUILDPATH'] = test_buildpath self.configure(args=[]) self.assertEqual(build_path(), test_buildpath) self.assertEqual( source_paths()[0], os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['sourcepath'])) self.assertEqual( install_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_software'])) self.assertEqual( install_path(typ='mod'), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_modules'])) repo = init_repository(get_repository(), get_repositorypath()) self.assertTrue(isinstance(repo, FileRepository)) self.assertEqual( repo.repo, os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['repositorypath'])) del os.environ['EASYBUILDBUILDPATH'] init_config() os.environ['EASYBUILDSOURCEPATH'] = test_sourcepath self.configure(args=[]) self.assertEqual( build_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['buildpath'])) self.assertEqual(source_paths()[0], test_sourcepath) self.assertEqual( install_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_software'])) self.assertEqual( install_path(typ='mod'), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_modules'])) repo = init_repository(get_repository(), get_repositorypath()) self.assertTrue(isinstance(repo, FileRepository)) self.assertEqual( repo.repo, os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['repositorypath'])) del os.environ['EASYBUILDSOURCEPATH'] init_config() os.environ['EASYBUILDINSTALLPATH'] = test_installpath self.configure(args=[]) self.assertEqual( build_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['buildpath'])) self.assertEqual( source_paths()[0], os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['sourcepath'])) self.assertEqual( install_path(), os.path.join(test_installpath, DEFAULT_PATH_SUBDIRS['subdir_software'])) self.assertEqual( install_path(typ='mod'), os.path.join(test_installpath, DEFAULT_PATH_SUBDIRS['subdir_modules'])) repo = init_repository(get_repository(), get_repositorypath()) self.assertTrue(isinstance(repo, FileRepository)) self.assertEqual( repo.repo, os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['repositorypath']))
def test_generaloption_config_file(self): """Test use of new-style configuration file.""" self.purge_environment() oldstyle_config_file = os.path.join(self.tmpdir, 'nooldconfig.py') config_file = os.path.join(self.tmpdir, 'testconfig.cfg') testpath1 = os.path.join(self.tmpdir, 'test1') testpath2 = os.path.join(self.tmpdir, 'testtwo') write_file(oldstyle_config_file, '') # test with config file passed via command line cfgtxt = '\n'.join([ '[config]', 'installpath = %s' % testpath2, ]) write_file(config_file, cfgtxt) args = [ '--configfiles', config_file, '--debug', '--buildpath', testpath1, ] options = init_config(args=args) self.assertEqual(build_path(), testpath1) # via command line self.assertEqual(source_paths(), [ os.path.join(os.getenv('HOME'), '.local', 'easybuild', 'sources') ]) # default self.assertEqual(install_path(), os.path.join(testpath2, 'software')) # via config file # test with config file passed via environment variable cfgtxt = '\n'.join([ '[config]', 'buildpath = %s' % testpath1, ]) write_file(config_file, cfgtxt) os.environ['EASYBUILD_CONFIGFILES'] = config_file args = [ '--debug', '--sourcepath', testpath2, ] options = init_config(args=args) self.assertEqual(install_path(), os.path.join(os.getenv('HOME'), '.local', 'easybuild', 'software')) # default self.assertEqual(source_paths(), [testpath2]) # via command line self.assertEqual(build_path(), testpath1) # via config file testpath3 = os.path.join(self.tmpdir, 'testTHREE') os.environ['EASYBUILD_SOURCEPATH'] = testpath2 args = [ '--debug', '--installpath', testpath3, ] options = init_config(args=args) self.assertEqual( source_paths(), [testpath2]) # via environment variable $EASYBUILD_SOURCEPATHS self.assertEqual(install_path(), os.path.join(testpath3, 'software')) # via command line self.assertEqual(build_path(), testpath1) # via config file del os.environ['EASYBUILD_CONFIGFILES']
def test_generaloption_config_file(self): """Test use of new-style configuration file.""" self.purge_environment() config_file = os.path.join(self.tmpdir, 'testconfig.cfg') testpath1 = os.path.join(self.tmpdir, 'test1') testpath2 = os.path.join(self.tmpdir, 'testtwo') # test with config file passed via command line cfgtxt = '\n'.join([ '[config]', 'installpath = %s' % testpath2, ]) write_file(config_file, cfgtxt) installpath_software = tempfile.mkdtemp(prefix='installpath-software') args = [ '--configfiles', config_file, '--debug', '--buildpath', testpath1, '--installpath-software', installpath_software, ] options = init_config(args=args) self.assertEqual(build_path(), testpath1) # via command line self.assertEqual(source_paths(), [os.path.join(os.getenv('HOME'), '.local', 'easybuild', 'sources')]) # default self.assertEqual(install_path(), installpath_software) # via cmdline arg self.assertEqual(install_path('mod'), os.path.join(testpath2, 'modules')) # via config file # copy test easyconfigs to easybuild/easyconfigs subdirectory of temp directory # to check whether easyconfigs install path is auto-included in robot path tmpdir = tempfile.mkdtemp(prefix='easybuild-easyconfigs-pkg-install-path') mkdir(os.path.join(tmpdir, 'easybuild'), parents=True) test_ecs_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'easyconfigs') shutil.copytree(test_ecs_dir, os.path.join(tmpdir, 'easybuild', 'easyconfigs')) orig_sys_path = sys.path[:] sys.path.insert(0, tmpdir) # prepend to give it preference over possible other installed easyconfigs pkgs # test with config file passed via environment variable # also test for existence of HOME and USER by adding paths to robot-paths installpath_modules = tempfile.mkdtemp(prefix='installpath-modules') cfgtxt = '\n'.join([ '[config]', 'buildpath = %s' % testpath1, 'sourcepath = %(DEFAULT_REPOSITORYPATH)s', 'repositorypath = %(DEFAULT_REPOSITORYPATH)s,somesubdir', 'robot-paths=/tmp/foo:%(sourcepath)s:%(HOME)s:/tmp/%(USER)s:%(DEFAULT_ROBOT_PATHS)s', 'installpath-modules=%s' % installpath_modules, ]) write_file(config_file, cfgtxt) os.environ['EASYBUILD_CONFIGFILES'] = config_file args = [ '--debug', '--sourcepath', testpath2, ] options = init_config(args=args) topdir = os.path.join(os.getenv('HOME'), '.local', 'easybuild') self.assertEqual(install_path(), os.path.join(topdir, 'software')) # default self.assertEqual(install_path('mod'), installpath_modules), # via config file self.assertEqual(source_paths(), [testpath2]) # via command line self.assertEqual(build_path(), testpath1) # via config file self.assertEqual(get_repositorypath(), [os.path.join(topdir, 'ebfiles_repo'), 'somesubdir']) # via config file # hardcoded first entry self.assertEqual(options.robot_paths[0], '/tmp/foo') # resolved value for %(sourcepath)s template self.assertEqual(options.robot_paths[1], os.path.join(os.getenv('HOME'), '.local', 'easybuild', 'ebfiles_repo')) # resolved value for HOME constant self.assertEqual(options.robot_paths[2], os.getenv('HOME')) # resolved value that uses USER constant self.assertEqual(options.robot_paths[3], os.path.join('/tmp', os.getenv('USER'))) # first path in DEFAULT_ROBOT_PATHS self.assertEqual(options.robot_paths[4], os.path.join(tmpdir, 'easybuild', 'easyconfigs')) testpath3 = os.path.join(self.tmpdir, 'testTHREE') os.environ['EASYBUILD_SOURCEPATH'] = testpath2 args = [ '--debug', '--installpath', testpath3, ] options = init_config(args=args) self.assertEqual(source_paths(), [testpath2]) # via environment variable $EASYBUILD_SOURCEPATHS self.assertEqual(install_path(), os.path.join(testpath3, 'software')) # via command line self.assertEqual(install_path('mod'), installpath_modules), # via config file self.assertEqual(build_path(), testpath1) # via config file del os.environ['EASYBUILD_CONFIGFILES'] sys.path[:] = orig_sys_path
def test_legacy_env_vars(self): """Test legacy environment variables.""" # build path test_buildpath = os.path.join(self.tmpdir, 'build', 'path') os.environ['EASYBUILDBUILDPATH'] = test_buildpath self.configure(args=[]) self.assertEqual(build_path(), test_buildpath) del os.environ['EASYBUILDBUILDPATH'] # source path config.variables = ConfigurationVariables() test_sourcepath = os.path.join(self.tmpdir, 'source', 'path') os.environ['EASYBUILDSOURCEPATH'] = test_sourcepath self.configure(args=[]) self.assertEqual(build_path(), os.path.join(os.path.expanduser('~'), '.local', 'easybuild', DEFAULT_PATH_SUBDIRS['buildpath'])) self.assertEqual(source_path(), test_sourcepath) del os.environ['EASYBUILDSOURCEPATH'] # install path config.variables = ConfigurationVariables() test_installpath = os.path.join(self.tmpdir, 'install', 'path') os.environ['EASYBUILDINSTALLPATH'] = test_installpath self.configure(args=[]) self.assertEqual(source_path(), os.path.join(os.path.expanduser('~'), '.local', 'easybuild', DEFAULT_PATH_SUBDIRS['sourcepath'])) self.assertEqual(install_path(), os.path.join(test_installpath, DEFAULT_PATH_SUBDIRS['subdir_software'])) self.assertEqual(install_path(typ='mod'), os.path.join(test_installpath, DEFAULT_PATH_SUBDIRS['subdir_modules'])) del os.environ['EASYBUILDINSTALLPATH'] # prefix: should change build/install/source/repo paths config.variables = ConfigurationVariables() test_prefixpath = os.path.join(self.tmpdir, 'prefix', 'path') os.environ['EASYBUILDPREFIX'] = test_prefixpath self.configure(args=[]) self.assertEqual(build_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['buildpath'])) self.assertEqual(source_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['sourcepath'])) self.assertEqual(install_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_software'])) self.assertEqual(install_path(typ='mod'), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_modules'])) repo = get_repository() self.assertTrue(isinstance(repo, FileRepository)) self.assertEqual(repo.repo, os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['repositorypath'])) # build/source/install path overrides prefix config.variables = ConfigurationVariables() os.environ['EASYBUILDBUILDPATH'] = test_buildpath self.configure(args=[]) self.assertEqual(build_path(), test_buildpath) self.assertEqual(source_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['sourcepath'])) self.assertEqual(install_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_software'])) self.assertEqual(install_path(typ='mod'), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_modules'])) repo = get_repository() self.assertTrue(isinstance(repo, FileRepository)) self.assertEqual(repo.repo, os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['repositorypath'])) # also check old style vs new style self.assertEqual(config.variables['build_path'], config.variables['buildpath']) self.assertEqual(config.variables['install_path'], config.variables['installpath']) del os.environ['EASYBUILDBUILDPATH'] config.variables = ConfigurationVariables() os.environ['EASYBUILDSOURCEPATH'] = test_sourcepath self.configure(args=[]) self.assertEqual(build_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['buildpath'])) self.assertEqual(source_path(), test_sourcepath) self.assertEqual(install_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_software'])) self.assertEqual(install_path(typ='mod'), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['subdir_modules'])) repo = get_repository() self.assertTrue(isinstance(repo, FileRepository)) self.assertEqual(repo.repo, os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['repositorypath'])) del os.environ['EASYBUILDSOURCEPATH'] config.variables = ConfigurationVariables() os.environ['EASYBUILDINSTALLPATH'] = test_installpath self.configure(args=[]) self.assertEqual(build_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['buildpath'])) self.assertEqual(source_path(), os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['sourcepath'])) self.assertEqual(install_path(), os.path.join(test_installpath, DEFAULT_PATH_SUBDIRS['subdir_software'])) self.assertEqual(install_path(typ='mod'), os.path.join(test_installpath, DEFAULT_PATH_SUBDIRS['subdir_modules'])) repo = get_repository() self.assertTrue(isinstance(repo, FileRepository)) self.assertEqual(repo.repo, os.path.join(test_prefixpath, DEFAULT_PATH_SUBDIRS['repositorypath'])) del os.environ['EASYBUILDINSTALLPATH'] del os.environ['EASYBUILDPREFIX']