Repository: easybuilders/easybuild-framework

Issue:
Problem running bootstrap.py: name 'sys_platform' is not defined.
I want to install easybuild via the bootstrap.py script. But it is failing on me. What am I doing wrong?

I got modules and python ready:

```
$ module --version
VERSION=3.2.10
[...]
$ python -V
Python 2.7.8

$ curl -O -L https://raw.githubusercontent.com/hpcugent/easybuild-framework/master/easybuild/scripts/bootstrap_eb.py  
```

I edited bootstrap_eb.py to turn on debug printing.

This is the result.

```
$ python bootstrap_eb.py ~/.local/easybuild
[[DEBUG]] Going to use /tmp/tmplt02Gt as temporary directory
[[DEBUG]] Output from modulecmd python help:
  Modules Release 3.2.10 2012-12-21 (Copyright GNU GPL v2 1991):

  Usage: module [ switches ] [ subcommand ] [subcommand-args ]

Switches:
        -H|--help               this usage info
        -V|--version            modules version & configuration options
        -f|--force              force active dependency resolution
        -t|--terse              terse    format avail and list format
        -l|--long               long     format avail and list format
        -h|--human              readable format avail and list format
        -v|--verbose            enable  verbose messages
        -s|--silent             disable verbose messages
        -c|--create             create caches for avail and apropos
        -i|--icase              case insensitive
        -u|--userlvl <lvl>      set user level to (nov[ice],exp[ert],adv[anced])
  Available SubCommands and Args:
        + add|load              modulefile [modulefile ...]
        + rm|unload             modulefile [modulefile ...]
        + switch|swap           [modulefile1] modulefile2
        + display|show          modulefile [modulefile ...]
        + avail                 [modulefile [modulefile ...]]
        + use [-a|--append]     dir [dir ...]
        + unuse                 dir [dir ...]
        + update
        + refresh
        + purge
        + list
        + clear
        + help                  [modulefile [modulefile ...]]
        + whatis                [modulefile [modulefile ...]]
        + apropos|keyword       string
        + initadd               modulefile [modulefile ...]
        + initprepend           modulefile [modulefile ...]
        + initrm                modulefile [modulefile ...]
        + initswitch            modulefile1 modulefile2
        + initlist
        + initclear


[[INFO]] Found module command 'modulecmd' (EnvironmentModulesC), so using it.
[[DEBUG]] Excluding /home/ITER/vandell/Soft/Installers/easybuild-master from sys.path
[[DEBUG]] sys.path after cleaning: ['/work/imas/opt/python/2.7.8/lib/python27.zip', '/work/imas/opt/python/2.7.8/lib/python2.7', '/work/imas/opt/python/2.7.8/lib/python2.7/plat-linux2', '/work/imas/opt/python/2.7.8/lib/python2.7/lib-tk', '/work/imas/opt/python/2.7.8/lib/python2.7/lib-old', '/work/imas/opt/python/2.7.8/lib/python2.7/lib-dynload', '/work/imas/opt/python/2.7.8/lib/python2.7/site-packages']
[[INFO]]

+++ STAGE 0: installing distribute via included (patched) distribute_setup.py...


[[DEBUG]] preparing environment...
[[DEBUG]] Preparing for path /tmp/tmplt02Gt
[[DEBUG]] os.environ['PYTHONPATH'] after reset:
[[DEBUG]] $EASYBUILD_MODULES_TOOL set to EnvironmentModulesC
[[DEBUG]] distribute_setup.__file__: /tmp/tmplt02Gt/distribute_setup.py
Downloading http://pypi.python.org/packages/source/d/distribute/distribute-0.6.34.tar.gz
Extracting in /tmp/tmplP35TH
Now working in /tmp/tmplP35TH/distribute-0.6.34
Installing Distribute
Before install bootstrap.
Scanning installed packages
Setuptools installation detected at /work/imas/opt/python/2.7.8/lib/python2.7/site-packages
Not patching, --root or --prefix is installing Distribute in another location
Traceback (most recent call last):
  File "setup.py", line 248, in <module>
    scripts = scripts,
  File "/work/imas/opt/python/2.7.8/lib/python2.7/distutils/core.py", line 111, in setup
    _setup_distribution = dist = klass(attrs)
  File "/tmp/tmplP35TH/distribute-0.6.34/setuptools/dist.py", line 225, in __init__
    _Distribution.__init__(self,attrs)
  File "/work/imas/opt/python/2.7.8/lib/python2.7/distutils/dist.py", line 287, in __init__
    self.finalize_options()
  File "/tmp/tmplP35TH/distribute-0.6.34/setuptools/dist.py", line 257, in finalize_options
    ep.require(installer=self.fetch_build_egg)
  File "/tmp/tmplP35TH/distribute-0.6.34/pkg_resources.py", line 2025, in require
    working_set.resolve(self.dist.requires(self.extras),env,installer))
  File "/tmp/tmplP35TH/distribute-0.6.34/pkg_resources.py", line 2235, in requires
    dm = self._dep_map
  File "/tmp/tmplP35TH/distribute-0.6.34/pkg_resources.py", line 2464, in _dep_map
    self.__dep_map = self._compute_dependencies()
  File "/tmp/tmplP35TH/distribute-0.6.34/pkg_resources.py", line 2497, in _compute_dependencies
    common = frozenset(reqs_for_extra(None))
  File "/tmp/tmplP35TH/distribute-0.6.34/pkg_resources.py", line 2494, in reqs_for_extra
    if req.marker_fn(override={'extra':extra}):
  File "/tmp/tmplP35TH/distribute-0.6.34/_markerlib/markers.py", line 109, in marker_fn
    return eval(compiled_marker, environment)
  File "<environment marker>", line 1, in <module>
NameError: name 'sys_platform' is not defined
Something went wrong during the installation.
See the error message above.
[[ERROR]] Installing distribute which should deliver easy_install failed?
```

I don't know where to continue from here. Can you help? What output do you need?



Discussion:
Hmm, never seen this before.

@Louwrensth: what kind of system is this?

Similar issues at https://github.com/glastopf/glastopf/issues/200.

@Louwrensth: any more specific information on this? Is this the system Python? What type of system?

@boegel : Thanks for your replies

Bottom line so far: I suspect my python installation is faulty. I can't look into to the matter very much right now, but I'll come back to in a week or two. I will look into the glastopf case you mentioned.

Details:
- I've tried running the bootstrap script from within a virtualenv, that seems to work better, but then there is a http_proxy problem:

```
== 2014-12-10 09:21:35,693 bootstrap_eb.EB_EasyBuildMeta DEBUG Trying to download file easybuild-framework-1.15.2.tar.gz from http://pypi.python.org/packages/source/e/easybuild-framework/easybuild-framework-1.15.2.tar.gz to /tmp/tmpsYM2pD/sources/e/EasyBuild/easybuild-framework-1.15.2.tar.gz ...
== 2014-12-10 09:21:35,694 bootstrap_eb.filetools DEBUG Downloading easybuild-framework-1.15.2.tar.gz from http://pypi.python.org/packages/source/e/easybuild-framework/easybuild-framework-1.15.2.tar.gz to /tmp/tmpsYM2pD/sources/e/EasyBuild/easybuild-framework-1.15.2.tar.gz
== 2014-12-10 09:21:35,694 bootstrap_eb.filetools DEBUG Not creating existing path /tmp/tmpsYM2pD/sources/e/EasyBuild
== 2014-12-10 09:21:35,695 bootstrap_eb.EB_EasyBuildMeta DEBUG Failed to download easybuild-framework-1.15.2.tar.gz from http://pypi.python.org/packages/source/e/easybuild-framework/: [Errno url error] invalid proxy for http: '10.10.240.146:8080'
```

Which is weird because the same proxy was used by the bootstrap script a couple of lines before:

```
Downloading https://pypi.python.org/packages/source/e/easybuild-framework/easybuild-framework-1.15.2.tar.gz#md5=be9f5b6f22033c0834e13916034541c5
```

Anyway, I prefer not to use virtualenv at all, so I gave up on the bootstrap script, for now.
- I am making some progress installing easybuild components with setup.py directly, however. Following http://easybuild.readthedocs.org/en/latest/Installation_Alternative.html#installation-from-downloaded-sources

Below you'll find script I'm using to install easybuild in my home directory. I want to install without using root first. It seems to work fine until near the end, where I get these errors:

```
module use /home/ITER/vandell/Soft/opt/easybuild-1.15.2/modules/all
ModuleCmd_Use.c(231):ERROR:64: Directory '/home/ITER/vandell/Soft/opt/easybuild-1.15.2/modules/all' not found
module load EasyBuild
ModuleCmd_Load.c(208):ERROR:105: Unable to locate a modulefile for 'EasyBuild'
eb --version
This is EasyBuild 1.15.2 (framework: 1.15.2, easyblocks: 1.15.2) on host hpc-login4.iter.org.
mkdir -p /home/ITER/vandell/Soft/etc/easybuild
eb --confighelp > /home/ITER/vandell/Soft/etc/easybuild/config.cfg
```

And here is the INSTALL.sh script I wrote to record my attempts:

```
#!/bin/bash

THIS_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
pushd $THIS_PATH

PREFIX="/home/ITER/vandell/Soft"
PROXY="10.10.240.146:8080"
MODULES_VERSION=3.2.10
MODULES_INSTALL="$PREFIX/opt/Modules/$MODULES_VERSION"
MODULES_MODULEFILES="$PREFIX/etc/modulefiles"
EASYBUILD_VERSION=1.15.2
EASYBUILD_INSTALL="$PREFIX/opt/easybuild-$EASYBUILD_VERSION"
#VIRTUALENV="$PREFIX/opt/Python-2.7.8-eb"
VERBOSE=true

errorstop() {
  echo "$*"
  exit 1
}
echoeval() {
  $VERBOSE && echo "$*"
  eval "$*"
}

#
# Load modules for easybuild (see Installer for modules)
#
MODULES_INIT="$MODULES_INSTALL/init/$(basename $SHELL)"
echoeval mkdir -p $MODULES_MODULEFILES
if test -f "$MODULES_INIT" ;then
  echo . $MODULES_INIT || errorstop "Failed modules init"
  . $MODULES_INIT || errorstop "Failed modules init"
  echoeval module load $MODULES_INSTALL/modulefiles/modules || errorstop "Failed to load modules-module"
  echoeval module use $MODULES_INSTALL/modulefiles || errorstop "Failed to load modulefiles of modules"
  echoeval module use $MODULES_MODULEFILES || errorstop "Failed to load $MODULES_MODULEFILES"
else
  errorstop "Could not find $MODULES_INIT."
fi

#
# Require Python for easybuild
#
test_python_version() {
  which python 2>&1 >/dev/null || return 1
  PYVER="`python -V 2>&1 |cut -d' ' -f2`"
  PYVER="`echo -e "$PYVER\n2.7" |sort -t. -n |head -n1`"
  test "$PYVER" = "2.7"
}
if ! test_python_version ;then
  echoeval module load python/2.7 || "Failed loading module python"
fi
if ! test_python_version ;then
  errorstop "Your Python is out of date or not installed."
fi

###
## Setup virtual env
##
## Prefer not to install easybuild inside virtualenv
#if ! test -d "$VIRTUALENV" ;then
#  virtualenv $VIRTUALENV || errorstop "Abort."
#fi
#echoeval source $VIRTUALENV/bin/activate || errorstop "Abort."
#

##
## Install Easybuild with pip install
##
#if ! test -d "$PREFIX/opt" ;then
#  #pip install easybuild==1.15.2 --target=$EASYBUILD_INSTALL || errorstop "Installing Easybuild failed."
#  #pip install --prefix $PREFIX/opt easybuild==1.15.2 || errorstop "Installing Easybuild failed."
#  #pip install --prefix $EASYBUILD_INSTALL https://github.com/hpcugent/easybuild-framework/archive/easybuild-framework-v1.15.2.tar.gz
#else
#  echo "Skipping installation of easybuild (pre-existing) dir: $EASYBUILD_INSTALL"
#fi
#

#
# Try the bootstap_eb.py (NOT FUNCTIONING)
#
#echo ==================
#echoeval curl -L -O https://raw.githubusercontent.com/hpcugent/easybuild-framework/develop/easybuild/scripts/bootstrap_eb.py || errorstop "Coudn't curl get bootstrap_eb.py"
#echoeval python bootstrap_eb.py $EASYBUILD_INSTALL
## DOES NOT WORK...how to debug:
## uncomment print_debug = True in bootstrap_eb.py,
## distribute_setup.py gives NameError: name 'sys_platform' is not defined
## HOW TO edit the /tmp/tmpO2oZ4n/distribute-0.6.34 files for debugging? the tmp dir disappears.



#
# Fetch easybuild
#
mkdir -p $THIS_PATH/build && pushd $THIS_PATH/build || errorstop "Couldn't change dir to $THIS_PATH/build"

if ! test -f easybuild-framework-v1.15.2.tar.gz ;then
  echoeval curl -L -O https://github.com/hpcugent/easybuild-framework/archive/easybuild-framework-v1.15.2.tar.gz || errorstop "Coudn't curl get easybuild-framework. "
else
  echo "Skipping curl getting easybuild-framework-v1.15.2.tar.gz"
fi
if ! test -f easybuild-easyblocks-v1.15.2.tar.gz ;then
  echoeval curl -L -O https://github.com/hpcugent/easybuild-easyblocks/archive/easybuild-easyblocks-v1.15.2.tar.gz || errorstop "Coudn't curl get easybuild-easyblocks. "
else
  echo "Skipping curl getting easybuild-easyblocks-v1.15.2.tar.gz"
fi
if ! test -f easybuild-easyconfigs-v1.15.2.0.tar.gz ;then
  echoeval curl -L -O https://github.com/hpcugent/easybuild-easyconfigs/archive/easybuild-easyconfigs-v1.15.2.0.tar.gz || errorstop "Coudn't curl get easybuild-easyconfigs. "
else
  echo "Skipping curl getting easybuild-easyconfigs-v1.15.2.0.tar.gz"
fi
popd

# Variables needed by setup.py build and install
export EASYBUILDPREFIX=$EASYBUILD_INSTALL
export EASYBUILD_INSTALL
export PYTHONPATH="$EASYBUILD_INSTALL/lib/python2.7/site-packages:$PYTHONPATH"
export PATH="$EASYBUILD_INSTALL/bin:$PATH"
echoeval mkdir -p $EASYBUILD_INSTALL/lib/python2.7/site-packages # setup.py install needs presence of this dir

#
# Untar & Build & Install easybuild-framework
#
echo ================== easybuild-framework
if ! test -d "$EASYBUILD_INSTALL/lib/python2.7/site-packages/easybuild_framework-1.15.2-py2.7.egg" ;then
  pushd $THIS_PATH/build
  echoeval tar xf easybuild-framework-v1.15.2.tar.gz || errorstop "Couldn't extract easybuild-framework."
  popd
  pushd $THIS_PATH/build/easybuild-framework-easybuild-framework-v1.15.2
  echoeval python setup.py build
  echoeval python setup.py install --prefix=$EASYBUILD_INSTALL
  popd
else
  echo "Skipping easybuild-framework." "Dir exists: $EASYBUILD_INSTALL/lib/python2.7/site-packages/easybuild_framework-1.15.2-py2.7.egg"
fi
#
# Untar & Build & Install easybuild-easyblocks
#
echo ================== easybuild-easyblocks
if ! test -d "$EASYBUILD_INSTALL/lib/python2.7/site-packages/easybuild_easyblocks-1.15.2-py2.7.egg" ;then
  pushd $THIS_PATH/build
  echoeval tar xf easybuild-easyblocks-v1.15.2.tar.gz || errorstop "Couldn't extract easybuild-easyblocks."
  popd
  pushd $THIS_PATH/build/easybuild-easyblocks-easybuild-easyblocks-v1.15.2
  echoeval python setup.py build
  echoeval python setup.py install --prefix=$EASYBUILD_INSTALL
  popd
else
  echo "Skipping easybuild-easyblocks." "Dir exists: $EASYBUILD_INSTALL/lib/python2.7/site-packages/easybuild_easyblocks-1.15.2-py2.7.egg"
fi
#
# Untar & Build & Install easybuild-easyconfigs
#
echo ================== easybuild-easyconfigs
if ! test -d "$EASYBUILD_INSTALL/lib/python2.7/site-packages/easybuild_easyconfigs-1.15.2.0-py2.7.egg" ;then
  pushd $THIS_PATH/build
  echoeval tar xf easybuild-easyconfigs-v1.15.2.0.tar.gz || errorstop "Couldn't extract easybuild-easyconfigs."
  popd
  pushd $THIS_PATH/build/easybuild-easyconfigs-easybuild-easyconfigs-v1.15.2.0
  echoeval python setup.py build
  echoeval python setup.py install --prefix=$EASYBUILD_INSTALL
  popd
else
  echo "Skipping easybuild-easyconfigs." "Dir exists: $EASYBUILD_INSTALL/lib/python2.7/site-packages/easybuild_easyconfigs-1.15.2.0-py2.7.egg"
fi


#
# Sanity checks
#
echoeval module use $EASYBUILD_INSTALL/modules/all || errorstop "Failed Sanity check."
echoeval module load EasyBuild || errorstop "Failed Sanity check."
echoeval eb --version || errorstop "Failed Sanity check."



#
# Generate config files
#
echoeval mkdir -p $PREFIX/etc/easybuild
echoeval "eb --confighelp > $PREFIX/etc/easybuild/config.cfg"

sh
```

Hi again,

Update: I gave up and tried again. The system that I'm using seems unreliable (the more reason for deploying easybuild here!). 

I tried again from scratch, with a local installation of a statically built python 2.7.9 and an installation of environment modules (Tcl 1.578 version). I was able to run the bootstrap_eb.py script. 

But it was picking up an outdated modulecmd installation (3.2.8<3.2.10 required) instead of the new modulecmd.tcl I installed. 

I patched the bootstap_eb.py script to make it work:

```
# replace order of discovery: first modulecmd.tcl
sed -i "s@'modulecmd', 'lmod', 'modulecmd.tcl'@'modulecmd.tcl', 'lmod', 'modulecmd'@" bootstrap_eb.py
# change the match pattern to discover successful output of modulecmd.tcl
sed -i "s@modcmd_re = re.compile(.*)@modcmd_re = re.compile('Usage: module ')@" bootstrap_eb.py
```

The output of modulecmd.tcl wasn't matched by the original pattern. Compare the output for reference:

```
bash-3.2$ modulecmd python help 2>&1 |head -n4

  Modules Release 3.2.8 2010-10-01 (Copyright GNU GPL v2 1991):

  Usage: module [ switches ] [ subcommand ] [subcommand-args ]
bash-3.2$ modulecmd.tcl python help 2>&1 |head -n2
Modules Release Tcl 1.578         Copyright GNU GPL v2 1991
Usage: module [options] [command] [args ...]
```

@Louwrensth: if you tell EasyBuild to use the Tcl-only version of environment modules, it will not pick up `modulecmd` automatically when installing EasyBuild with EasyBuild, so it shouldn't complain about v3.2.10: `export EASYBUILD_MODULES_TOOL=EnvironmentModulesTcl` (see http://easybuild.readthedocs.org/en/latest/Configuration.html#modules-tool-modules-tool)

the original regex `module\s.*command\s` should also match the output of your `modulecmd.tcl`, right? so there's no need to change the regex?

EasyBuild has support for Tcl-only environment modules (i.e. `modulecmd.tcl`), but it's certainly not tested as well as support for `modulecmd` or `lmod` is, so I'd love to hear more details to fix the issues you may be having...

Unless you're stuck to Tcl-only environment modules, I would warmly recommend looking into Lmod.

@boegel Thanks for you reply. I will try the EnvironmentModulesTcl option next time for installing EasyBuild with EasyBuild. I got two but's:

But note, here I was installing EasyBuild using the bootstrap_eb.py script, which I believe will ignore this environment variable.

But also I'm quite sure that the original regex did not work for modulecmd.tcl, as it was not picked after changing the order of disovering modulecmd from the $PATH. The offending bit is the one \s at the end of the regex, the Tcl version has a slightly different output:

```
$ modulecmd.tcl python help 2>&1 | sed '/module\s.*command\s/!d'
$ modulecmd.tcl python help 2>&1 | sed '/module\s.*command/!d'
Usage: module [options] [command] [args ...]
```

Testing that the new regex also works for the C/Tcl version: (I don't  know about Lmod)

```
$ modulecmd python help 2>&1 | sed '/module\s.*command/!d'
  Usage: module [ switches ] [ subcommand ] [subcommand-args ]
```

I'll take a look into Lmod

@Louwrensth: during the bootstrap, a 'manually' installed EasyBuild is used to install the final EasyBuild (stage 2), and that one will listen to `$EASYBUILD_MODULES_TOOL`

I'll recheck the regex, thanks for the details.

Here's what I see, on a Fedora 22 system:

```
[adam@hostname ~]$ python bootstrap_eb.py ~/.local/easybuild/
[[DEBUG]] Going to use /tmp/tmpaJofLg as temporary directory
[[DEBUG]] Output from modulecmd python help: sh: modulecmd: command not found

[[DEBUG]] Output from lmod python help: Usage: module [options] sub-command [args ...]

Options:
  -h -? -H --help                   This help message
  -s availStyle --style=availStyle  Site controlled avail style: system
                                    (default: system)
  -D                                Program tracing written to stderr
  --debug=dbglvl                    Program tracing written to stderr
  --pin_versions=pinVersions        When doing a restore use specified
                                    version, do not follow defaults
  -d --default                      List default modules only when used with
                                    avail
  -q --quiet                        Do not print out warnings
  --topic=topic                     help topics: modfuncs envvars
  --expert                          Expert mode
  -t --terse                        Write out in machine readable format for
                                    commands: list, avail, spider, savelist
  --initial_load                    loading Lmod for first time in a user
                                    shell
  --latest                          Load latest (ignore default)
  --ignore_cache                    Treat the cache file(s) as out-of-date
  --novice                          Turn off expert and quiet flag
  --raw                             Print modulefile in raw output when used
                                    with show
  -w twidth --width=twidth          Use this as max term width
  -v --version                      Print version info and quit
  -r --regexp                       use regular expression match
  --gitversion                      Dump git version in a machine readable
                                    way and quit
  --dumpversion                     Dump version in a machine readable way
                                    and quit
  --localvar=localvarA              local variables needed to be set after
                                    this commands execution
  --check_syntax --checkSyntax      Checking module command syntax: do not
                                    load
  --config                          Report Lmod Configuration
  --mt                              Report Module Table State
  --timer                           report run times
  --force                           force removal of a sticky module or save
                                    an empty collection
  --redirect                        Send the output of list, avail, spider
                                    to stdout (not stderr)
  --no_redirect                     Force output of list, avail and spider
                                    to stderr
  --show_hidden                     Avail and spider will report hidden
                                    modules
  --spider_timeout=timeout          a timeout for spider


module [options] sub-command [args ...]

Help sub-commands:
------------------
  help                              prints this message
  help                module [...]  print help message from module(s)

Loading/Unloading sub-commands:
-------------------------------
  load | add          module [...]  load module(s)
  try-load | try-add  module [...]  Add module(s), do not complain if not
                                    found
  del | unload        module [...]  Remove module(s), do not complain if not
                                    found
  swap | sw | switch  m1 m2         unload m1 and load m2
  purge                             unload all modules
  refresh                           reload aliases from current list of
                                    modules.
  update                            reload all currently loaded modules.

Listing / Searching sub-commands:
---------------------------------
  list                              List loaded modules
  list                s1 s2 ...     List loaded modules that match the
                                    pattern
  avail | av                        List available modules
  avail | av          string        List available modules that contain
                                    "string".
  spider                            List all possible modules
  spider              module        List all possible version of that module
                                    file
  spider              string        List all module that contain the
                                    "string".
  spider              name/version  Detailed information about that version
                                    of the module.
  whatis              module        Print whatis information about module
  keyword | key       string        Search all name and whatis that contain
                                    "string".

Searching with Lmod:
--------------------
  All searching (spider, list, avail, keyword) support regular expressions:

  spider -r           '^p'          Finds all the modules that start with
                                    `p' or `P'
  spider -r           mpi           Finds all modules that have "mpi" in
                                    their name.
  spider -r           'mpi$         Finds all modules that end with "mpi" in
                                    their name.

Handling a collection of modules:
--------------------------------
  save | s                          Save the current list of modules to a
                                    user defined "default".
  save | s            name          Save the current list of modules to
                                    "name" collection.
  restore | r                       Restore modules from the user's
                                    "default" or system default.
  restore | r         name          Restore modules from "name" collection.
  restore             system        Restore module state to system defaults.
  savelist                          List of saved collections.

Deprecated commands:
--------------------
  reset                             The same as "restore system"
  getdefault          [name]        load name collection of modules or
                                    user's "default" if no name given.
                                    ===> Use "restore" instead <====
  setdefault          [name]        Save current list of modules to name if
                                    given, otherwise save as the default
                                    list for you the user.
                                    ===> Use "save" instead. <====

Miscellaneous sub-commands:
---------------------------
  show                modulefile    show the commands in the module file.
  use [-a]            path          Prepend or Append path to MODULEPATH.
  unuse               path          remove path from MODULEPATH.
  tablelist                         output list of active modules as a lua
                                    table.

Important Environment Variables:
--------------------------------
  LMOD_COLORIZE                     If defined to be "YES" then Lmod prints
                                    properties and warning in color.

    --------------------------------------------------------------------------

The following guides are at http://www.tacc.utexas.edu/tacc-projects/lmod

  User Guide                 - How to use.
  Advance User Guide         - How to create you own modules.
  System Administrator Guide - How to install Lmod on your own system.
    --------------------------------------------------------------------------



Modules based on Lua: Version 5.9.4.2  2015-05-18 16:35
    by Robert McLay mclay@tacc.utexas.edu

os.environ["LMOD_DEFAULT_MODULEPATH"] = "/etc/modulefiles:/usr/share/modulefiles:/usr/share/Modules/modulefiles";
os.environ["MODULEPATH"] = "/etc/modulefiles:/usr/share/modulefiles:/usr/share/Modules/modulefiles";
os.environ["LMOD_DEFAULT_MODULEPATH"] = "/etc/modulefiles:/usr/share/modulefiles:/usr/share/Modules/modulefiles";
os.environ["MODULEPATH"] = "/etc/modulefiles:/usr/share/modulefiles:/usr/share/Modules/modulefiles";
os.environ["_ModuleTable001_"] = "X01vZHVsZVRhYmxlXz17WyJhY3RpdmVTaXplIl09MCxiYXNlTXBhdGhBPXsiL2V0Yy9tb2R1bGVmaWxlcyIsIi91c3Ivc2hhcmUvbW9kdWxlZmlsZXMiLCIvdXNyL3NoYXJlL01vZHVsZXMvbW9kdWxlZmlsZXMiLH0sWyJjX3JlYnVpbGRUaW1lIl09ZmFsc2UsWyJjX3Nob3J0VGltZSJdPWZhbHNlLGZhbWlseT17fSxpbmFjdGl2ZT17fSxtVD17fSxtcGF0aEE9eyIvZXRjL21vZHVsZWZpbGVzIiwiL3Vzci9zaGFyZS9tb2R1bGVmaWxlcyIsIi91c3Ivc2hhcmUvTW9kdWxlcy9tb2R1bGVmaWxlcyIsfSxbInN5c3RlbUJhc2VNUEFUSCJdPSIvZXRjL21vZHVsZWZpbGVzOi91c3Ivc2hhcmUvbW9kdWxlZmlsZXM6L3Vzci9zaGFyZS9Nb2R1bGVzL21vZHVsZWZpbGVzIixbInZlcnNp";
os.environ["_ModuleTable002_"] = "b24iXT0yLH0=";
os.environ["_ModuleTable_Sz_"] = "2";

[[INFO]] Found module command 'lmod' (Lmod), so using it.
[[DEBUG]] sys.path after cleaning: ['/home/adam', '/usr/lib64/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7/plat-linux2', '/usr/lib64/python2.7/lib-tk', '/usr/lib64/python2.7/lib-old', '/usr/lib64/python2.7/lib-dynload', '/usr/lib64/python2.7/site-packages', '/usr/lib64/python2.7/site-packages/gtk-2.0', '/usr/lib/python2.7/site-packages']
[[INFO]] 

+++ STAGE 0: installing distribute via included (patched) distribute_setup.py...


[[DEBUG]] preparing environment...
[[DEBUG]] Preparing for path /tmp/tmpaJofLg
[[DEBUG]] os.environ['PYTHONPATH'] after reset: 
[[DEBUG]] $EASYBUILD_MODULES_TOOL set to Lmod
[[DEBUG]] distribute_setup.__file__: /tmp/tmpaJofLg/distribute_setup.py
Downloading http://pypi.python.org/packages/source/d/distribute/distribute-0.6.34.tar.gz
Extracting in /tmp/tmprcb6GL
Now working in /tmp/tmprcb6GL/distribute-0.6.34
Installing Distribute
Before install bootstrap.
Scanning installed packages
Setuptools installation detected at /usr/lib/python2.7/site-packages
Not patching, --root or --prefix is installing Distribute in another location
Traceback (most recent call last):
  File "setup.py", line 248, in <module>
    scripts = scripts,
  File "/usr/lib64/python2.7/distutils/core.py", line 111, in setup
    _setup_distribution = dist = klass(attrs)
  File "/tmp/tmprcb6GL/distribute-0.6.34/setuptools/dist.py", line 225, in __init__
    _Distribution.__init__(self,attrs)
  File "/usr/lib64/python2.7/distutils/dist.py", line 287, in __init__
    self.finalize_options()
  File "/tmp/tmprcb6GL/distribute-0.6.34/setuptools/dist.py", line 257, in finalize_options
    ep.require(installer=self.fetch_build_egg)
  File "/tmp/tmprcb6GL/distribute-0.6.34/pkg_resources.py", line 2025, in require
    working_set.resolve(self.dist.requires(self.extras),env,installer))
  File "/tmp/tmprcb6GL/distribute-0.6.34/pkg_resources.py", line 2235, in requires
    dm = self._dep_map
  File "/tmp/tmprcb6GL/distribute-0.6.34/pkg_resources.py", line 2464, in _dep_map
    self.__dep_map = self._compute_dependencies()
  File "/tmp/tmprcb6GL/distribute-0.6.34/pkg_resources.py", line 2497, in _compute_dependencies
    common = frozenset(reqs_for_extra(None))
  File "/tmp/tmprcb6GL/distribute-0.6.34/pkg_resources.py", line 2494, in reqs_for_extra
    if req.marker_fn(override={'extra':extra}):
  File "/tmp/tmprcb6GL/distribute-0.6.34/_markerlib/markers.py", line 109, in marker_fn
    return eval(compiled_marker, environment)
  File "<environment marker>", line 1, in <module>
NameError: name 'sys_platform' is not defined
Something went wrong during the installation.
See the error message above.
[[ERROR]] Installing distribute which should deliver easy_install failed?

[adam@hostname ~]$ rpm -q python python-setuptools
python-2.7.10-4.fc22.x86_64
python-setuptools-17.1.1-3.fc22.noarch


```

@wpoely86: since you have Fedora 22 too, can you see if you can reproduce this?
Maybe installing/using an old distribute (like the bootstrap does in stage 0) is just a non-go on very recent systems for some reason...

I got:

```
$ python bootstrap_eb.py ~/.local/easybuild-test/
[[INFO]] Found module command 'modulecmd' (EnvironmentModulesC), so using it.
[[INFO]] 

+++ STAGE 0: installing distribute via included (patched) distribute_setup.py...


Downloading http://pypi.python.org/packages/source/d/distribute/distribute-0.6.34.tar.gz
Extracting in /tmp/tmp_ShC53
Now working in /tmp/tmp_ShC53/distribute-0.6.34
Installing Distribute
Something went wrong during the installation.
See the error message above.
[[ERROR]] Installing distribute which should deliver easy_install failed?
```

Now with the actual debug logs:

```
$ python bootstrap_eb.py ~/.local/easybuild-test/
[[DEBUG]] Going to use /tmp/tmppjk2RG as temporary directory
[[DEBUG]] Output from modulecmd python help: 
  Modules Release 3.2.10 2012-12-21 (Copyright GNU GPL v2 1991):

  Usage: module [ switches ] [ subcommand ] [subcommand-args ]

Switches:
    -H|--help       this usage info
    -V|--version        modules version & configuration options
    -f|--force      force active dependency resolution
    -t|--terse      terse    format avail and list format
    -l|--long       long     format avail and list format
    -h|--human      readable format avail and list format
    -v|--verbose        enable  verbose messages
    -s|--silent     disable verbose messages
    -c|--create     create caches for avail and apropos
    -i|--icase      case insensitive
    -u|--userlvl <lvl>  set user level to (nov[ice],exp[ert],adv[anced])
  Available SubCommands and Args:
    + add|load      modulefile [modulefile ...]
    + rm|unload     modulefile [modulefile ...]
    + switch|swap       [modulefile1] modulefile2
    + display|show      modulefile [modulefile ...]
    + avail         [modulefile [modulefile ...]]
    + use [-a|--append] dir [dir ...]
    + unuse         dir [dir ...]
    + update
    + refresh
    + purge
    + list
    + clear
    + help          [modulefile [modulefile ...]]
    + whatis        [modulefile [modulefile ...]]
    + apropos|keyword   string
    + initadd       modulefile [modulefile ...]
    + initprepend       modulefile [modulefile ...]
    + initrm        modulefile [modulefile ...]
    + initswitch        modulefile1 modulefile2
    + initlist
    + initclear


[[INFO]] Found module command 'modulecmd' (EnvironmentModulesC), so using it.
[[DEBUG]] sys.path after cleaning: ['/home/ward/tmp/easybuild-framework/easybuild/scripts', '/usr/lib64/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7/plat-linux2', '/usr/lib64/python2.7/lib-tk', '/usr/lib64/python2.7/lib-old', '/usr/lib64/python2.7/lib-dynload', '/usr/lib64/python2.7/site-packages', '/usr/lib64/python2.7/site-packages/gst-0.10', '/usr/lib64/python2.7/site-packages/gtk-2.0', '/usr/lib/python2.7/site-packages']
[[INFO]] 

+++ STAGE 0: installing distribute via included (patched) distribute_setup.py...


[[DEBUG]] preparing environment...
[[DEBUG]] Preparing for path /tmp/tmppjk2RG
[[DEBUG]] os.environ['PYTHONPATH'] after reset: 
[[DEBUG]] $EASYBUILD_MODULES_TOOL set to EnvironmentModulesC
[[DEBUG]] distribute_setup.__file__: /tmp/tmppjk2RG/distribute_setup.py
Downloading http://pypi.python.org/packages/source/d/distribute/distribute-0.6.34.tar.gz
Extracting in /tmp/tmpqwoKTu
Now working in /tmp/tmpqwoKTu/distribute-0.6.34
Installing Distribute
Before install bootstrap.
Scanning installed packages
Setuptools installation detected at /usr/lib/python2.7/site-packages
Not patching, --root or --prefix is installing Distribute in another location
Traceback (most recent call last):
  File "setup.py", line 248, in <module>
    scripts = scripts,
  File "/usr/lib64/python2.7/distutils/core.py", line 111, in setup
    _setup_distribution = dist = klass(attrs)
  File "/tmp/tmpqwoKTu/distribute-0.6.34/setuptools/dist.py", line 225, in __init__
    _Distribution.__init__(self,attrs)
  File "/usr/lib64/python2.7/distutils/dist.py", line 287, in __init__
    self.finalize_options()
  File "/tmp/tmpqwoKTu/distribute-0.6.34/setuptools/dist.py", line 257, in finalize_options
    ep.require(installer=self.fetch_build_egg)
  File "/tmp/tmpqwoKTu/distribute-0.6.34/pkg_resources.py", line 2025, in require
    working_set.resolve(self.dist.requires(self.extras),env,installer))
  File "/tmp/tmpqwoKTu/distribute-0.6.34/pkg_resources.py", line 2235, in requires
    dm = self._dep_map
  File "/tmp/tmpqwoKTu/distribute-0.6.34/pkg_resources.py", line 2464, in _dep_map
    self.__dep_map = self._compute_dependencies()
  File "/tmp/tmpqwoKTu/distribute-0.6.34/pkg_resources.py", line 2497, in _compute_dependencies
    common = frozenset(reqs_for_extra(None))
  File "/tmp/tmpqwoKTu/distribute-0.6.34/pkg_resources.py", line 2494, in reqs_for_extra
    if req.marker_fn(override={'extra':extra}):
  File "/tmp/tmpqwoKTu/distribute-0.6.34/_markerlib/markers.py", line 109, in marker_fn
    return eval(compiled_marker, environment)
  File "<environment marker>", line 1, in <module>
NameError: name 'sys_platform' is not defined
Something went wrong during the installation.
See the error message above.
[[ERROR]] Installing distribute which should deliver easy_install failed?
```

OK, so the problem is easily reproducible...

We'll need to figure out a fix for this.

Maybe we should try falling back to the system's `easy_install` if stage 0 fails?

A proper solution for this is probably to bump the version of distribute being installed by the bootstrap in stage 0 to something more recent...

Up for giving that a try @wpoely86 (not super urgent imho, moving this to the 2.5.0 milestone).


Resolving patch:
diff --git a/easybuild/scripts/bootstrap_eb.py b/easybuild/scripts/bootstrap_eb.py
--- a/easybuild/scripts/bootstrap_eb.py
+++ b/easybuild/scripts/bootstrap_eb.py
@@ -34,7 +34,7 @@
  * stage 3: install EasyBuild with EasyBuild from stage 2 to intended install directory
    (default or $EASYBUILD_INSTALLPATH)
 
-Authors: Kenneth Hoste (UGent), Stijn Deweirdt (UGent)
+Authors: Kenneth Hoste (UGent), Stijn Deweirdt (UGent), Ward Poelmans (UGent)
 License: GPLv2
 
 inspired by https://bitbucket.org/pdubroy/pip/raw/tip/getpip.py
@@ -52,8 +52,8 @@
 from distutils.version import LooseVersion
 
 # argparse preferrred, optparse deprecated >=2.7
-HAVE_ARGPARSE=False
-try: 
+HAVE_ARGPARSE = False
+try:
     import argparse
     HAVE_ARGPARSE = True
 except ImportError:
@@ -80,7 +80,9 @@
 # keep track of original environment (after clearing PYTHONPATH)
 orig_os_environ = copy.deepcopy(os.environ)
 
-easybuild_modules_tool = None
+# If the modules tool is specified, use it
+easybuild_modules_tool = os.environ.get('EASYBUILD_MODULES_TOOL', None)
+
 
 #
 # Utility functions
@@ -91,17 +93,20 @@ def debug(msg):
     if print_debug:
         print "[[DEBUG]]", msg
 
+
 def info(msg):
     """Print info message."""
 
     print "[[INFO]]", msg
 
+
 def error(msg, exit=True):
     """Print error message and exit."""
 
     print "[[ERROR]]", msg
     sys.exit(1)
 
+
 def det_lib_path(libdir):
     """Determine relative path of Python library dir."""
     if libdir is None:
@@ -109,6 +114,7 @@ def det_lib_path(libdir):
     pyver = '.'.join([str(x) for x in sys.version_info[:2]])
     return os.path.join(libdir, 'python%s' % pyver, 'site-packages')
 
+
 def find_egg_dir_for(path, pkg):
     """Find full path of egg dir for given package."""
 
@@ -126,6 +132,7 @@ def find_egg_dir_for(path, pkg):
     debug("Failed to determine egg dir path for %s in %s (subdirs: %s)" % (pkg, path, subdirs))
     return None
 
+
 def prep(path):
     """Prepare for installing a Python package in the specified path."""
 
@@ -154,8 +161,14 @@ def prep(path):
     os.environ['EASYBUILD_MODULES_TOOL'] = easybuild_modules_tool
     debug("$EASYBUILD_MODULES_TOOL set to %s" % os.environ['EASYBUILD_MODULES_TOOL'])
 
+
 def check_module_command(tmpdir):
     """Check which module command is available, and prepare for using it."""
+    global easybuild_modules_tool
+
+    if easybuild_modules_tool is not None:
+        debug("Using modules tools specified by $EASYBUILD_MODULES_TOOL: %s" % easybuild_modules_tool)
+        return easybuild_modules_tool
 
     # order matters, so we can't use the keys from modules_tools which are unordered
     known_module_commands = ['modulecmd', 'lmod', 'modulecmd.tcl']
@@ -174,7 +187,6 @@ def check_module_command(tmpdir):
         debug("Output from %s: %s" % (cmd, txt))
         if modcmd_re.search(txt):
             modtool = modules_tools[modcmd]
-            global easybuild_modules_tool
             easybuild_modules_tool = modtool
             info("Found module command '%s' (%s), so using it." % (modcmd, modtool))
             break
@@ -189,10 +201,10 @@ def check_module_command(tmpdir):
 
     return modtool
 
+
 #
 # Stage functions
 #
-
 def stage0(tmpdir):
     """STAGE 0: Prepare and install distribute via included (patched) distribute_setup.py script."""
 
@@ -224,7 +236,11 @@ def stage0(tmpdir):
     from distribute_setup import main as distribute_setup_main
     orig_sys_argv = sys.argv[:]  # make a copy
     sys.argv.append('--prefix=%s' % tmpdir)
-    distribute_setup_main()
+    # We download a custom version of distribute: it uses a newer version of markerlib to avoid a bug (#1099)
+    # It's is the source of distribute 0.6.49 with the file _markerlib/markers.py replaced by the 0.6 version of
+    # markerlib which can be found at https://pypi.python.org/pypi/markerlib/0.6.0
+    sys.argv.append('--download-base=http://hpcugent.github.io/easybuild/files/')
+    distribute_setup_main(version="0.6.49-patched1")
     sys.argv = orig_sys_argv
 
     # sanity check
@@ -242,7 +258,7 @@ def stage0(tmpdir):
 
     # make sure we're getting the setuptools we expect
     import setuptools
-    if not tmpdir in setuptools.__file__:
+    if tmpdir not in setuptools.__file__:
         error("Found another setuptools than expected: %s" % setuptools.__file__)
     else:
         debug("Found setuptools in expected path, good!")
@@ -359,13 +375,13 @@ def stage1(tmpdir, sourcepath):
 
     # make sure we're getting the expected EasyBuild packages
     import easybuild.framework
-    if not tmpdir in easybuild.framework.__file__:
+    if tmpdir not in easybuild.framework.__file__:
         error("Found another easybuild-framework than expected: %s" % easybuild.framework.__file__)
     else:
         debug("Found easybuild-framework in expected path, good!")
 
     import easybuild.easyblocks
-    if not tmpdir in easybuild.easyblocks.__file__:
+    if tmpdir not in easybuild.easyblocks.__file__:
         error("Found another easybuild-easyblocks than expected: %s" % easybuild.easyblocks.__file__)
     else:
         debug("Found easybuild-easyblocks in expected path, good!")
@@ -373,6 +389,7 @@ def stage1(tmpdir, sourcepath):
     debug("templates: %s" % templates)
     return templates
 
+
 def stage2(tmpdir, templates, install_path, distribute_egg_dir, sourcepath):
     """STAGE 2: install EasyBuild to temporary dir with EasyBuild from stage 1."""
 
@@ -437,6 +454,7 @@ def stage2(tmpdir, templates, install_path, distribute_egg_dir, sourcepath):
     from easybuild.main import main as easybuild_main
     easybuild_main()
 
+
 def main():
     """Main script: bootstrap EasyBuild in stages."""
 
@@ -448,25 +466,24 @@ def main():
     # general option/argument parser
     if HAVE_ARGPARSE:
         bs_argparser = argparse.ArgumentParser()
-        bs_argparser.add_argument(
-          "prefix", help="Installation prefix directory",
-          type=str)
+        bs_argparser.add_argument("prefix", help="Installation prefix directory",
+                                  type=str)
         bs_args = bs_argparser.parse_args()
 
         # prefix specification
         install_path = os.path.abspath(bs_args.prefix)
     else:
         bs_argparser = optparse.OptionParser(usage="usage: %prog [options] prefix")
-        (bs_opts,bs_args) = bs_argparser.parse_args()
+        (bs_opts, bs_args) = bs_argparser.parse_args()
 
         # poor method, but should prefer argparse module for better pos arg support.
         if len(bs_args) < 1:
             error("Too few arguments\n" + bs_argparser.get_usage())
         elif len(bs_args) > 1:
             error("Too many arguments\n" + bs_argparser.get_usage())
-        
-        # prefix specification	
-	install_path = os.path.abspath(str(bs_args[0]))
+
+        # prefix specification
+        install_path = os.path.abspath(str(bs_args[0]))
 
     info("Installation prefix %s" % install_path)
 
@@ -527,10 +544,10 @@ def main():
 
     info('')
     if install_path is not None:
-        info('EasyBuild v%s was installed to %s, so make sure your $MODULEPATH includes %s' % \
+        info('EasyBuild v%s was installed to %s, so make sure your $MODULEPATH includes %s' %
              (templates['version'], install_path, os.path.join(install_path, 'modules', 'all')))
     else:
-        info('EasyBuild v%s was installed to configured install path, make sure your $MODULEPATH is set correctly.' % \
+        info('EasyBuild v%s was installed to configured install path, make sure your $MODULEPATH is set correctly.' %
              templates['version'])
         info('(default config => add "$HOME/.local/easybuild/modules/all" in $MODULEPATH)')
 
@@ -576,117 +593,133 @@ def main():
 
 # distribute_setup.py script (https://pypi.python.org/pypi/distribute)
 #
-# A compressed copy of a patched distribute_setup.py (version 0.6.34), generated like so:
+# A compressed copy of a patched distribute_setup.py (version 0.6.49), generated like so:
 # >>> import base64
 # >>> import zlib
 # >>> base64.b64encode(zlib.compress(open("distribute_setup.py").read()))
 # compressed copy below is for setuptools 0.6c11, after applying patch:
-#$ diff -u distribute_setup.py.orig distribute_setup.py
-#--- distribute_setup.py.orig    2013-02-07 23:27:01.000000000 +0100
-#+++ distribute_setup.py 2013-02-07 23:27:32.000000000 +0100
-#@@ -518,6 +518,8 @@
-#             log.warn("--user requires Python 2.6 or later")
-#             raise SystemExit(1)
-#         install_args.append('--user')
-#+    if options.prefix_install:
-#+        install_args.append('--prefix=%s' % options.prefix_install)
-#     return install_args
 #
-# def _parse_args():
-#@@ -529,6 +531,8 @@
-#         '--user', dest='user_install', action='store_true', default=False,
-#         help='install in user site package (requires Python 2.6 or later)')
-#     parser.add_option(
-#+        '--prefix', dest='prefix_install', metavar="PATH", help='install in prefix')
-#+    parser.add_option(
-#         '--download-base', dest='download_base', metavar="URL",
-#         default=DEFAULT_URL,
-#         help='alternative URL from where to download the distribute package')
+# --- distribute_setup.py.orig	2013-07-05 03:50:13.000000000 +0200
+# +++ distribute_setup.py	2015-11-27 12:20:12.040032041 +0100
+# @@ -528,6 +528,8 @@
+#              log.warn("--user requires Python 2.6 or later")
+#              raise SystemExit(1)
+#          install_args.append('--user')
+# +    if options.prefix_install:
+# +        install_args.append('--prefix=%s' % options.prefix_install)
+#      return install_args
+#
+#  def _parse_args():
+# @@ -539,6 +541,8 @@
+#          '--user', dest='user_install', action='store_true', default=False,
+#          help='install in user site package (requires Python 2.6 or later)')
+#      parser.add_option(
+# +        '--prefix', dest='prefix_install', metavar="PATH", help='install in prefix')
+# +    parser.add_option(
+#          '--download-base', dest='download_base', metavar="URL",
+#          default=DEFAULT_URL,
+#          help='alternative URL from where to download the distribute package')
+# @@ -549,7 +553,7 @@
+#  def main(version=DEFAULT_VERSION):
+#      """Install or upgrade setuptools and EasyInstall"""
+#      options = _parse_args()
+# -    tarball = download_setuptools(download_base=options.download_base)
+# +    tarball = download_setuptools(version=version, download_base=options.download_base)
+#      return _install(tarball, _build_install_args(options))
+#
+#  if __name__ == '__main__':
+#
 DISTRIBUTE_SETUP_PY = """
-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
-7wKYhF5wByb8D1XCC1U=
+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
+7lwukTHLpfpLDH2GT+yCCf8D2cp1xw==
 
 """.decode("base64").decode("zlib")
 


Test patch: