Open mboisson opened 7 years ago
modaltsoftname
is intended to only affect the module name, but I understand that the side effect of silently overwriting an existing installation isn't exactly desirable...
So, I think we have a couple of options:
--force
Right now, EasyBuild solely relies on the presence of modules to determine whether or not an installation is already present, and it happily trashes and recreates an install directory that it happens to find (although, I think it creates a backup rather than actually fully trashing it, does it not?).
So, we need a separate --force-cleanup-existing-installdir
or something like that (along with an appropriate check)?
A third option might be to have an "installaltsoftname" which changes the name of the installation folder.
Note that the current behaviour is actually to use the "det_module_short_name" to figure out the installdir path. So, one could argue that "det_module_short_name" should actually give the alternative name, and the behaviour of the install dir just happens to follows from that.
Also supporting installaltsoftname
is certainly doable, but we still need the check on the install dir.
The name of the install directory is determined via det_install_subdir
, which indeed relies on det_full_module_name
, but that method is aware of modaltsoftname
...
Am I missing something? Also because you mention det_module_short_name
rather than ...full...
?
det_full_module_name is not aware of modaltsoftname, it just calls det_short_module_name to get the last part, and this one is not aware of modaltsoftname.
At least, they are not in hierarchical_mns.py
None of the MNS - except our custom one - are aware of modaltsoftname directly:
[mboisson@build-node easybuild-framework]$ grep -r modaltsoftname ./easybuild/tools/module_naming_scheme/
Fichier binaire ./easybuild/tools/module_naming_scheme/SoftCCHierarchicalMNS.pyo correspondant
./easybuild/tools/module_naming_scheme/SoftCCHierarchicalMNS.py: return os.path.join((ec['modaltsoftname'] or ec['name']).lower(), self.det_full_version(ec))
The module naming scheme being used is not called directly, but via the ActiveMNS
mechanism, see https://github.com/hpcugent/easybuild-framework/blob/master/easybuild/framework/easyconfig/easyconfig.py#L1636, which calls _det_module_name_with
, which is aware of modaltsoftname
.
So, that makes me wonder why you're hitting this at all, since the intention indeed seems to be that the installdir follows the module name (instead when --fixed-installdir-naming-scheme
is used, see https://github.com/hpcugent/easybuild-framework/blob/master/easybuild/framework/easyconfig/easyconfig.py#L1648)
Mmmm
Looking at my installation logs, I do see that at some point it creates a directory and replace the software name with "petsc-64bits":
3043 == 2017-02-23 20:58:27,916 module_generator.py:662 INFO Not including statement to define environment variable $LD_LIBRARY_PATH, as specified
3044 == 2017-02-23 20:58:27,917 filetools.py:988 INFO Creating directory /home/mboisson/easybuild/software/2017/avx2/MPI/intel2016.4/openmpi2.0/petsc-64bits/3.7.5/easybuild (parents: True, set_gid: False, sticky: False)
3045 == 2017-02-23 20:58:27,917 easyconfig.py:1616 INFO Replaced software name 'PETSc' with 'petsc-64bits' when determining module name
3046 == 2017-02-23 20:58:28,011 environment.py:97 INFO Environment variable LD_LIBRARY_PATH set to /cvmfs/soft.computecanada.ca/nix/lib (previous value: '/cvmfs/soft.computecanada.ca/nix/lib')
However, I do not see the same message when make_installdir is called:
2434 == 2017-02-23 20:58:22,921 easyblock.py:2292 INFO Starting install step
2435 == 2017-02-23 20:58:22,921 easyblock.py:2295 INFO Running method stage_install_step part of step install
2436 == 2017-02-23 20:58:22,921 easyblock.py:2295 INFO Running method make_installdir part of step install
2437 == 2017-02-23 20:58:22,921 easyblock.py:818 INFO Found old directory /home/mboisson/easybuild/software/2017/avx2/MPI/intel2016.4/openmpi2.0/petsc-64bits/3.7.5
here, it finds the petsc-64bits directory because this is a log obtained with my patch.
Some more logs after reverting my local patch:
== 2017-02-23 21:32:04,059 easyconfig.py:1616 INFO Replaced software name 'PETSc' with 'petsc-64bits' when determining module name
== 2017-02-23 21:32:04,059 easyconfig.py:616 INFO filtered out dependency {'external_module_metadata': {}, 'full_mod_name': None, 'toolchain': {'version': '2016.4', 'name': 'iomkl'}, 'name': 'CMake', 'dummy': False, 'short_mod_name': None, 'external_module': False, 'versionsuffix': '', 'version': '3.5.2', 'toolchain_inherited': True, 'hidden': False, 'build_only': True}
--
== 2017-02-23 21:32:04,208 tools.py:256 WARNING 'eb' not found in $PATH, failed to determine installation prefix
== 2017-02-23 21:32:04,209 filetools.py:988 INFO Creating directory /home/mboisson/easybuild2/sources/p/PETSc (parents: True, set_gid: False, sticky: False)
== 2017-02-23 21:32:08,032 filetools.py:357 INFO Downloaded file petsc-3.7.5.tar.gz from url http://ftp.mcs.anl.gov/pub/petsc/release-snapshots/petsc-3.7.5.tar.gz to /home/mboisson/easybuild2/sources/p/PETSc/petsc-3.7.5.tar.gz
--
== 2017-02-23 21:32:08,082 easyblock.py:1534 INFO Checking dirs that need to be created: ['/home/mboisson/easybuild2/software/2017/avx2/MPI/intel2016.4/openmpi2.0/petsc/3.7.5', '/home/mboisson/easybuild2/modules/2017/avx2/MPI/intel2016.4/openmpi2.0/petsc']
== 2017-02-23 21:32:08,083 filetools.py:988 INFO Creating directory /home/mboisson/easybuild2/software/2017/avx2/MPI/intel2016.4/openmpi2.0/petsc/3.7.5 (parents: True, set_gid: False, sticky: False)
== 2017-02-23 21:32:08,083 filetools.py:988 INFO Creating directory /home/mboisson/easybuild2/modules/2017/avx2/MPI/intel2016.4/openmpi2.0/petsc (parents: True, set_gid: False, sticky: False)
== 2017-02-23 21:32:08,083 build_log.py:217 INFO creating build dir, resetting environment...
--
== 2017-02-23 21:32:08,192 easyblock.py:2295 INFO Running method make_builddir part of step ready
== 2017-02-23 21:32:08,193 filetools.py:988 INFO Creating directory /dev/shm/mboisson/PETSc/3.7.5/iomkl-2016.4 (parents: True, set_gid: False, sticky: False)
== 2017-02-23 21:32:08,193 easyblock.py:2295 INFO Running method env_reset_changes part of step ready
--
== 2017-02-23 21:32:09,182 easyblock.py:2295 INFO Running method prepare_step part of step prepare
== 2017-02-23 21:32:09,247 filetools.py:988 INFO Creating directory /home/mboisson/easybuild2/modules/2017/Core (parents: True, set_gid: False, sticky: False)
== 2017-02-23 21:32:09,310 environment.py:97 INFO Environment variable LD_LIBRARY_PATH set to /cvmfs/soft.computecanada.ca/nix/lib (previous value: '/cvmfs/soft.computecanada.ca/nix/lib')
--
== 2017-02-23 21:32:09,647 easyblock.py:825 INFO Removed old directory /home/mboisson/easybuild2/software/2017/avx2/MPI/intel2016.4/openmpi2.0/petsc/3.7.5
== 2017-02-23 21:32:09,647 filetools.py:988 INFO Creating directory /home/mboisson/easybuild2/software/2017/avx2/MPI/intel2016.4/openmpi2.0/petsc/3.7.5 (parents: True, set_gid: False, sticky: False)
I'm using
name = 'PETSc'
version = '3.7.5'
modaltsoftname = 'petsc-64bits'
homepage = 'http://www.mcs.anl.gov/petsc'
description = """PETSc, pronounced PET-see (the S is silent), is a suite of data structures and routines for the
scalable (parallel) solution of scientific applications modeled by partial differential equations."""
toolchain = {'name': 'iomkl', 'version': '2016.4'}
toolchainopts = {'usempi': True, 'pic': True}
source_urls = ['http://ftp.mcs.anl.gov/pub/petsc/release-snapshots']
sources = [SOURCELOWER_TAR_GZ]
shared_libs = 1
pic = 1
downloadinstall = True
dependencies = [('HDF5','1.8.18','', ('iompi',toolchain['version']))]
configopts = ""
# compiles PETSc shared
configopts += "--with-mkl_pardiso=1 --with-mkl_pardiso-dir=$MKLROOT "
configopts += "--with-hdf5=1 --with-hdf5-dir=$EBROOTHDF5 "
configopts += "--with-64-bit-indices=1 "
# external packages that are downloaded
#external_packages = ['mumps', 'ptscotch', 'superlu', 'superlu_dist', 'parmetis', 'metis', 'ml', 'suitesparse', 'hypre', 'prometheus']
external_packages = ['ptscotch', 'superlu_dist', 'parmetis', 'metis', 'suitesparse', 'prometheus']
# compiles the external dependencies non-shared
external_packages_shared = "no"
for p in external_packages:
configopts += "--download-%s=yes --download-%s-shared=%s " % (p,p,external_packages_shared)
builddependencies = [('CMake', '3.5.2')]
moduleclass = 'numlib'
modluafooter = """
family("petsc")
"""
(the downloadinstall thing requires the other PR I opened yesterday, but I doubt it affects anything).
@boegel I'm not using --fixed-installdir-naming-scheme
and see the same behavior: modaltsoftname
only affects the module name, but the install directory still uses the "original" name. I believe this is the originally intended behavior as modaltsoftname
is defined as a modulefile easyconfig parameter. If it would affect both the modulefile and the install path, altsoftname
would IMHO be the better name...
Hi, I am trying to install a 64bit version of PETSc. I use modaltsoftname to change the module name to "petsc-64bits"
I would have expected EB to install the software under a directory of the same name, but it instead overwrote the existing petsc directory.
I believe this is a bug in hierarchical_mns (I have not checked other MNS).
I have modified our own MNS here. https://github.com/ComputeCanada/easybuild-framework/commit/b4b03bc225ca2b5d64d1c7bb9144d0935c41ece9
I also have a branch to fix it into hierarchical_mns and I am ready to open a PR if you consider this a bug, but I know you might not since it changes the behaviour. Let me know if you want me to open a PR for this change: https://github.com/ComputeCanada/easybuild-framework/commit/1ea92d8b3171cf6d88ea81b933d23e13f7f8c951