Differences between revisions 1 and 16 (spanning 15 versions)
Revision 1 as of 2017-06-01 21:33:49
Size: 6436
Editor: TunayDurmaz
Comment: build documentation savepoint
Revision 16 as of 2022-11-07 04:45:52
Size: 0
Editor: TunayDurmaz
Comment:
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
= Under Construction =

EMAN2 is built with `conda-build` using binaries from https://anaconda.org, packaged into an installer with [[https://github.com/cryoem/constructor.git|constructor]] as of '''v2.2'''.

 1. [[https://github.com/conda/conda|conda]] is the package manager.
 1. https://anaconda.org is the online repository of binaries.
 1. [[https://github.com/conda/conda-build|conda-build]] is the tool to build from source.
 1. [[https://github.com/cryoem/constructor.git|constructor]] is the tool to package eman2 and dependency binaries into a single installer file.

EMAN2 is distributed as a single installer which includes all its dependencies. However, EMAN2 is not available as a conda-package on https://anaconda.org. In other words it is not possible to install EMAN2 by typing {{{conda install eman2}}}.

== Conda ==

Packages that are available on https://anaconda.org can be installed into any conda environment by issuing the command {{{conda install <package>}}}. Conda installs the package along with its dependencies. In order for packages to benefit from this automation, they need to be packaged in a specific way. That can be done with {{{conda-build}}}. {{{conda-build}}} builds packages according to instructions provided in a {{{recipe}}}. A recipe consists of a file with package metadata, {{{meta.yaml}}}, and any other necessary resources like build scripts, ({{{build.sh}}}, {{{bld.bat}}}), patches and so on.

== Recipes, Feedstocks and anaconda.org channel: cryoem ==

Most of EMAN2 dependencies can be found on anaconda's channels, {{{defaults}}} and {{{conda-forge}}}. A few that do not exist or need to be customized have been built and uploaded to channel [[https://anaconda.org/cryoem/dashboard|cryoem]]. The recipes are hosted in separate repositories on [[https://github.com/cryoem/|GitHub]]. Every recipe repository follows the feedstock approach of [[http://conda-forge.github.io/|conda-forge]]. See [[https://github.com/cryoem?utf8=%E2%9C%93&q=-feedstock&type=&language=|here]] for a complete list.

== Build Strategies ==
**:TODO:** Advantages/disadvantages/comparison of the strategies.

**:TODO:** Resulting file hierarchies, EMAN2DIR

It is possible to utilize conda for building and installing EMAN2 in a few ways. One way is to just install binaries with conda and point to the right locations of dependencies during cmake configuration. Another way is to make use of the newly added features in EMAN2's cmake which find the dependencies automatically. These features are activated only when the build is performed by `conda-build`. Cmake knows the build is a `conda-build` build only through an environment variable. So, it is possible to set the specific environment variable manually and still activate those features without actually using `conda-build`. Third way is to use a recipe to run `conda-build`. Basic instructions for all three strategies follow.

=== 1. Use conda for binaries only ===
1. Install dependencies with `conda install`. 2. Build and install EMAN2 manually into **root/home directory** with `cmake`, `make` and `make install`.

This is detailed on [EMAN WIKI](http://blake.bcm.edu/emanwiki/EMAN2/COMPILE_EMAN2_MAC_OS_X). Also, see [build_no_envars.sh](https://github.com/cryoem/eman2/blob/master/ci_support/build_no_envars.sh).

=== 2. Use conda to install EMAN2 into a conda environment ===
1. Install dependencies with `conda install`. 2. Set environment variables, `shell export CONDA_BUILD_STATE=BUILD export PREFIX=<path-to-anaconda-installation-directory> # $HOME/miniconda2/ or $HOME/anaconda2/ export SP_DIR=$PREFIX/lib/python2.7/site-packages ` 3. Build and install EMAN2 manually into **conda environment** with `cmake`, `make` and `make install`. See [build_with_envars.sh](https://github.com/cryoem/eman2/blob/master/ci_support/build_with_envars.sh).

=== 3. Use recipe for a fully automated conda build ===
1. `conda build <path-to-eman-recipe-directory>`

== Tests ==
The build strategies described in [section Build Strategies](#build-strategies) are tested on CI (Continuous Integration) servers for MacOSX ([TravisCI](https://travis-ci.org/cryoem/eman2/builds)) and Linux ([CircleCI](https://circleci.com/gh/cryoem/eman2)). For Windows (Appveyor), only the recipe strategy is tested. The tests are triggered for every commit that is pushed to GitHub.

:TODO: Jenkins.

== Binary Distribution ==
=== Constructor ===
Packaging is done with `constructor`, a tool for making installers from conda packages. In order to slighltly customize the installers the project was forked. The customized project is at https://github.com/cryoem/constructor. The input files for `constructor` are maintained at https://github.com/cryoem/docker-images.

The installer includes additional tools such as `conda`, `conda-build`, `pip`. The installer is setup so that the packages are kept in the installed EMAN2 conda environment cache for convenience.

=== Build Machines ===
The binary packages are built on three physical machines. The operating systems are `Mac OSX 10.10`, `CentOS 7` and `Windows 10`. `CentOS 6` binaries are built in a `CentOS 6` docker container on the `CentOS 7` machine.

https://github.com/cryoem/buils-scripts

==== Cron ====
:TODO:

==== Windows ====
[[Windows]]

==== Docker ====
Docker images and helper scripts are at https://github.com/cryoem/docker-images.

Runs as root on Linux. `chown` doesn't work, the resulting installer has root ownership.

:TODO: More explanation.

=== Pydusa, OpenMPI and Fftw-mpi ===
The version of `OpenMPI` provided with EMAN2 installer may not work with user's batch queueing system, meaning they would not be able to run jobs on more than one node at a time. In that case, installer-provided `OpenMPI` needs to be removed, `pydusa` and `fftw-mpi` need to be installed against `OpenMPI` that is present in the system. Two scripts, one that uninstalls installer provided `OpenMPI`~~, `pydusa` and `fftw-mpi`,~~ and another that builds `fftw-mpi` and `pydusa` against the system `OpenMPI` are provided. The installer prints a detailed message regarding this issue.

Only OpenMPI is force-removed. 1. So the system or newly installed version is used 1. Force-removing fftw-mpi and, specifically, pydusa leaves the system broken. 1. Even if not removed, later installations overwrite, so there isn't any need to uninstall anyways.