|  |  |  | @@ -10,8 +10,8 @@ Package Creation Tutorial | 
		
	
		
			
				|  |  |  |  | ========================= | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | This tutorial will walk you through the steps behind building a simple | 
		
	
		
			
				|  |  |  |  | package installation script.  We'll focus building an mpileaks package, | 
		
	
		
			
				|  |  |  |  | which is a MPI debugging tool.  By creating a package file we're | 
		
	
		
			
				|  |  |  |  | package installation script.  We'll focus on writing a package for | 
		
	
		
			
				|  |  |  |  | mpileaks, an MPI debugging tool.  By creating a package file we're | 
		
	
		
			
				|  |  |  |  | essentially giving Spack a recipe for how to build a particular piece of | 
		
	
		
			
				|  |  |  |  | software.  We're describing some of the software's dependencies, where to | 
		
	
		
			
				|  |  |  |  | find the package, what commands and options are used to build the package | 
		
	
	
		
			
				
					
					|  |  |  | @@ -20,7 +20,7 @@ ask Spack to build that package in many different ways. | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | This tutorial assumes you have a basic familiarity with some of the Spack | 
		
	
		
			
				|  |  |  |  | commands, and that you have a working version of Spack installed.  If | 
		
	
		
			
				|  |  |  |  | not, we suggest looking at Spack's *Getting Started* guide.  This | 
		
	
		
			
				|  |  |  |  | not, we suggest looking at Spack's :ref:`getting_started` guide.  This | 
		
	
		
			
				|  |  |  |  | tutorial also assumes you have at least a beginner's-level familiarity | 
		
	
		
			
				|  |  |  |  | with Python. | 
		
	
		
			
				|  |  |  |  |  | 
		
	
	
		
			
				
					
					|  |  |  | @@ -38,8 +38,8 @@ A few things before we get started: | 
		
	
		
			
				|  |  |  |  |   variable ``SPACK_ROOT``.  You should point ``SPACK_ROOT`` at wherever | 
		
	
		
			
				|  |  |  |  |   you have Spack installed. | 
		
	
		
			
				|  |  |  |  | - Add ``$SPACK_ROOT/bin`` to your ``PATH`` before you start. | 
		
	
		
			
				|  |  |  |  | - Make sure your ``EDITOR`` environment variable is set to some text | 
		
	
		
			
				|  |  |  |  |   editor you like. | 
		
	
		
			
				|  |  |  |  | - Make sure your ``EDITOR`` environment variable is set to your | 
		
	
		
			
				|  |  |  |  |   preferred text editor. | 
		
	
		
			
				|  |  |  |  | - We'll be writing Python code as part of this tutorial.  You can find | 
		
	
		
			
				|  |  |  |  |   successive versions of the Python code in | 
		
	
		
			
				|  |  |  |  |   ``$SPACK_ROOT/lib/spack/docs/tutorial/examples``. | 
		
	
	
		
			
				
					
					|  |  |  | @@ -55,8 +55,8 @@ with Spack to avoid breaking the builtin Spack packages. | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | .. code-block:: console | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   $ spack repo add $SPACK_ROOT/var/spack/repos/tutorial/ | 
		
	
		
			
				|  |  |  |  |   ==> Added repo with namespace 'tutorial'. | 
		
	
		
			
				|  |  |  |  |    $ spack repo add $SPACK_ROOT/var/spack/repos/tutorial/ | 
		
	
		
			
				|  |  |  |  |    ==> Added repo with namespace 'tutorial'. | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | Spack comes with a handy command to create a new package: ``spack create``. | 
		
	
		
			
				|  |  |  |  |  | 
		
	
	
		
			
				
					
					|  |  |  | @@ -67,28 +67,28 @@ we run ``spack create`` on it: | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | .. code-block:: console | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   $ spack create -t generic -f https://github.com/hpc/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz | 
		
	
		
			
				|  |  |  |  |   ==> This looks like a URL for mpileaks | 
		
	
		
			
				|  |  |  |  |   ==> Found 1 version of mpileaks: | 
		
	
		
			
				|  |  |  |  |    $ spack create -t generic https://github.com/LLNL/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz | 
		
	
		
			
				|  |  |  |  |    ==> This looks like a URL for mpileaks | 
		
	
		
			
				|  |  |  |  |    ==> Found 1 version of mpileaks: | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |     1.0  https://github.com/LLNL/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz | 
		
	
		
			
				|  |  |  |  |      1.0  https://github.com/LLNL/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   ==> How many would you like to checksum? (default is 1, q to abort) 1 | 
		
	
		
			
				|  |  |  |  |   ==> Downloading... | 
		
	
		
			
				|  |  |  |  |   ==> Fetching https://github.com/LLNL/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz | 
		
	
		
			
				|  |  |  |  |   ############################################################################# 100.0% | 
		
	
		
			
				|  |  |  |  |   ==> Checksummed 1 version of mpileaks | 
		
	
		
			
				|  |  |  |  |   ==> Using specified package template: 'generic' | 
		
	
		
			
				|  |  |  |  |   ==> Created template for mpileaks package | 
		
	
		
			
				|  |  |  |  |   ==> Created package file: /home/spack1/spack/var/spack/repos/builtin/packages/mpileaks/package.py | 
		
	
		
			
				|  |  |  |  |    ==> How many would you like to checksum? (default is 1, q to abort) 1 | 
		
	
		
			
				|  |  |  |  |    ==> Downloading... | 
		
	
		
			
				|  |  |  |  |    ==> Fetching https://github.com/LLNL/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz | 
		
	
		
			
				|  |  |  |  |    ############################################################################# 100.0% | 
		
	
		
			
				|  |  |  |  |    ==> Checksummed 1 version of mpileaks | 
		
	
		
			
				|  |  |  |  |    ==> Using specified package template: 'generic' | 
		
	
		
			
				|  |  |  |  |    ==> Created template for mpileaks package | 
		
	
		
			
				|  |  |  |  |    ==> Created package file: ~/spack/var/spack/repos/tutorial/packages/mpileaks/package.py | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | And Spack should spawn a text editor with this file: | 
		
	
		
			
				|  |  |  |  | Spack should spawn a text editor with this file: | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | .. literalinclude:: tutorial/examples/0.package.py | 
		
	
		
			
				|  |  |  |  |    :language: python | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | Spack has created this file in | 
		
	
		
			
				|  |  |  |  | ``/home/spack1/spack/var/spack/repos/builtin/packages/mpileaks/package.py``.  Take a | 
		
	
		
			
				|  |  |  |  | ``$SPACK_ROOT/var/spack/repos/tutorial/packages/mpileaks/package.py``.  Take a | 
		
	
		
			
				|  |  |  |  | moment to look over the file.  There's a few placeholders that Spack has | 
		
	
		
			
				|  |  |  |  | created, which we'll fill in as part of this tutorial: | 
		
	
		
			
				|  |  |  |  |  | 
		
	
	
		
			
				
					
					|  |  |  | @@ -102,33 +102,33 @@ to build this package: | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | .. code-block:: console | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   $ spack install mpileaks | 
		
	
		
			
				|  |  |  |  |   ==> No binary for mpileaks found: installing from source | 
		
	
		
			
				|  |  |  |  |   ==> Fetching file:///mirror/mpileaks/mpileaks-1.0.tar.gz | 
		
	
		
			
				|  |  |  |  |   curl: (37) Couldn't open file /mirror/mpileaks/mpileaks-1.0.tar.gz | 
		
	
		
			
				|  |  |  |  |   ==> Fetching from file:///mirror/mpileaks/mpileaks-1.0.tar.gz failed. | 
		
	
		
			
				|  |  |  |  |   ==> Fetching https://github.com/hpc/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz | 
		
	
		
			
				|  |  |  |  |   ######################################################################## 100.0% | 
		
	
		
			
				|  |  |  |  |   ==> Staging archive: /home/ubuntu/packaging/spack/var/spack/stage/mpileaks-1.0-sv75n3u5ev6mljwcezisz3slooozbbxu/mpileaks-1.0.tar.gz | 
		
	
		
			
				|  |  |  |  |   ==> Created stage in /home/ubuntu/packaging/spack/var/spack/stage/mpileaks-1.0-sv75n3u5ev6mljwcezisz3slooozbbxu | 
		
	
		
			
				|  |  |  |  |   ==> No patches needed for mpileaks | 
		
	
		
			
				|  |  |  |  |   ==> Building mpileaks [Package] | 
		
	
		
			
				|  |  |  |  |   ==> Executing phase: 'install' | 
		
	
		
			
				|  |  |  |  |   ==> Error: ProcessError: Command exited with status 2: | 
		
	
		
			
				|  |  |  |  |       'make' '-j16' | 
		
	
		
			
				|  |  |  |  |    $ spack install mpileaks | 
		
	
		
			
				|  |  |  |  |    ==> Installing mpileaks | 
		
	
		
			
				|  |  |  |  |    ==> Searching for binary cache of mpileaks | 
		
	
		
			
				|  |  |  |  |    ==> Warning: No Spack mirrors are currently configured | 
		
	
		
			
				|  |  |  |  |    ==> No binary for mpileaks found: installing from source | 
		
	
		
			
				|  |  |  |  |    ==> Fetching https://github.com/LLNL/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz | 
		
	
		
			
				|  |  |  |  |    ############################################################################# 100.0% | 
		
	
		
			
				|  |  |  |  |    ==> Staging archive: ~/spack/var/spack/stage/mpileaks-1.0-sv75n3u5ev6mljwcezisz3slooozbbxu/mpileaks-1.0.tar.gz | 
		
	
		
			
				|  |  |  |  |    ==> Created stage in ~/spack/var/spack/stage/mpileaks-1.0-sv75n3u5ev6mljwcezisz3slooozbbxu | 
		
	
		
			
				|  |  |  |  |    ==> No patches needed for mpileaks | 
		
	
		
			
				|  |  |  |  |    ==> Building mpileaks [Package] | 
		
	
		
			
				|  |  |  |  |    ==> Executing phase: 'install' | 
		
	
		
			
				|  |  |  |  |    ==> Error: ProcessError: Command exited with status 2: | 
		
	
		
			
				|  |  |  |  |        'make' '-j16' | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   1 error found in build log: | 
		
	
		
			
				|  |  |  |  |        1    ==> Executing phase: 'install' | 
		
	
		
			
				|  |  |  |  |        2    ==> 'make' '-j16' | 
		
	
		
			
				|  |  |  |  |     >> 3    make: *** No targets specified and no makefile found.  Stop. | 
		
	
		
			
				|  |  |  |  |    1 error found in build log: | 
		
	
		
			
				|  |  |  |  |         1    ==> Executing phase: 'install' | 
		
	
		
			
				|  |  |  |  |         2    ==> 'make' '-j16' | 
		
	
		
			
				|  |  |  |  |      >> 3    make: *** No targets specified and no makefile found.  Stop. | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   See build log for details: | 
		
	
		
			
				|  |  |  |  |     /home/ubuntu/packaging/spack/var/spack/stage/mpileaks-1.0-sv75n3u5ev6mljwcezisz3slooozbbxu/mpileaks-1.0/spack-build-out.txt | 
		
	
		
			
				|  |  |  |  |    See build log for details: | 
		
	
		
			
				|  |  |  |  |      ~/spack/var/spack/stage/mpileaks-1.0-sv75n3u5ev6mljwcezisz3slooozbbxu/spack-build-out.txt | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | This obviously didn't work; we need to fill in the package-specific | 
		
	
		
			
				|  |  |  |  | information.  Specifically, Spack didn't try to build any of mpileaks' | 
		
	
		
			
				|  |  |  |  | dependencies, nor did it use the proper configure arguments.  Let's start | 
		
	
		
			
				|  |  |  |  | fixing things | 
		
	
		
			
				|  |  |  |  | fixing things. | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | --------------------- | 
		
	
		
			
				|  |  |  |  | Package Documentation | 
		
	
	
		
			
				
					
					|  |  |  | @@ -139,60 +139,60 @@ We can bring the ``package.py`` file back into our ``EDITOR`` with the | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | .. code-block:: console | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   $ spack edit mpileaks | 
		
	
		
			
				|  |  |  |  |    $ spack edit mpileaks | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | Let's remove some of the ``FIXME`` comments, and add links to the mpileaks | 
		
	
		
			
				|  |  |  |  | homepage and document what mpileaks does.  I'm also going to cut out the | 
		
	
		
			
				|  |  |  |  | Let's remove some of the ``FIXME`` comments, add links to the mpileaks | 
		
	
		
			
				|  |  |  |  | homepage, and document what mpileaks does.  I'm also going to cut out the | 
		
	
		
			
				|  |  |  |  | Copyright clause at this point to keep this tutorial document shorter, | 
		
	
		
			
				|  |  |  |  | but you shouldn't do that normally.  The results of these changes can be | 
		
	
		
			
				|  |  |  |  | found in ``$SPACK_ROOT/lib/spack/docs/tutorial/examples/1.package.py`` | 
		
	
		
			
				|  |  |  |  | and are below.  Make these changes to your ``package.py``: | 
		
	
		
			
				|  |  |  |  | and are displayed below.  Make these changes to your ``package.py``: | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | .. literalinclude:: tutorial/examples/1.package.py | 
		
	
		
			
				|  |  |  |  |    :lines: 6- | 
		
	
		
			
				|  |  |  |  |    :language: python | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | We've filled in the comment that describes what this package does and | 
		
	
		
			
				|  |  |  |  | added a link to the web site.  That won't help us build yet, but it will | 
		
	
		
			
				|  |  |  |  | added a link to its website.  That won't help us build yet, but it will | 
		
	
		
			
				|  |  |  |  | allow Spack to provide some documentation on this package to other users: | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | .. code-block:: console | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   $ spack info mpileaks | 
		
	
		
			
				|  |  |  |  |   Package:   mpileaks | 
		
	
		
			
				|  |  |  |  |    $ spack info mpileaks | 
		
	
		
			
				|  |  |  |  |    Package:   mpileaks | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   Description: | 
		
	
		
			
				|  |  |  |  |       Tool to detect and report MPI objects like MPI_Requests and | 
		
	
		
			
				|  |  |  |  |       MPI_Datatypes. | 
		
	
		
			
				|  |  |  |  |    Description: | 
		
	
		
			
				|  |  |  |  |        Tool to detect and report MPI objects like MPI_Requests and | 
		
	
		
			
				|  |  |  |  |        MPI_Datatypes. | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   Homepage: https://github.com/hpc/mpileaks | 
		
	
		
			
				|  |  |  |  |    Homepage: https://github.com/LLNL/mpileaks | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   Tags: | 
		
	
		
			
				|  |  |  |  |       None | 
		
	
		
			
				|  |  |  |  |    Tags: | 
		
	
		
			
				|  |  |  |  |        None | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   Preferred version: | 
		
	
		
			
				|  |  |  |  |       1.0    https://github.com/hpc/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz | 
		
	
		
			
				|  |  |  |  |    Preferred version: | 
		
	
		
			
				|  |  |  |  |        1.0    https://github.com/LLNL/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   Safe versions: | 
		
	
		
			
				|  |  |  |  |       1.0    https://github.com/hpc/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz | 
		
	
		
			
				|  |  |  |  |    Safe versions: | 
		
	
		
			
				|  |  |  |  |        1.0    https://github.com/LLNL/mpileaks/releases/download/v1.0/mpileaks-1.0.tar.gz | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   Variants: | 
		
	
		
			
				|  |  |  |  |       None | 
		
	
		
			
				|  |  |  |  |    Variants: | 
		
	
		
			
				|  |  |  |  |        None | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   Installation Phases: | 
		
	
		
			
				|  |  |  |  |       install | 
		
	
		
			
				|  |  |  |  |    Installation Phases: | 
		
	
		
			
				|  |  |  |  |        install | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   Build Dependencies: | 
		
	
		
			
				|  |  |  |  |       None | 
		
	
		
			
				|  |  |  |  |    Build Dependencies: | 
		
	
		
			
				|  |  |  |  |        None | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   Link Dependencies: | 
		
	
		
			
				|  |  |  |  |       None | 
		
	
		
			
				|  |  |  |  |    Link Dependencies: | 
		
	
		
			
				|  |  |  |  |        None | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   Run Dependencies: | 
		
	
		
			
				|  |  |  |  |       None | 
		
	
		
			
				|  |  |  |  |    Run Dependencies: | 
		
	
		
			
				|  |  |  |  |        None | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   Virtual Packages: | 
		
	
		
			
				|  |  |  |  |       None | 
		
	
		
			
				|  |  |  |  |    Virtual Packages: | 
		
	
		
			
				|  |  |  |  |        None | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | As we fill in more information about this package the ``spack info`` command | 
		
	
		
			
				|  |  |  |  | will become more informative.  Now let's start making this package build. | 
		
	
	
		
			
				
					
					|  |  |  | @@ -201,7 +201,7 @@ will become more informative.  Now let's start making this package build. | 
		
	
		
			
				|  |  |  |  | Dependencies | 
		
	
		
			
				|  |  |  |  | ------------ | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | The mpileaks packages depends on three other package: ``MPI``, | 
		
	
		
			
				|  |  |  |  | The mpileaks package depends on three other packages: ``mpi``, | 
		
	
		
			
				|  |  |  |  | ``adept-utils``, and ``callpath``.  Let's add those via the | 
		
	
		
			
				|  |  |  |  | ``depends_on`` command in our ``package.py`` (this version is in | 
		
	
		
			
				|  |  |  |  | ``$SPACK_ROOT/lib/spack/docs/tutorial/examples/2.package.py``): | 
		
	
	
		
			
				
					
					|  |  |  | @@ -213,50 +213,45 @@ The mpileaks packages depends on three other package: ``MPI``, | 
		
	
		
			
				|  |  |  |  | Now when we go to build mpileaks, Spack will fetch and build these | 
		
	
		
			
				|  |  |  |  | dependencies before building mpileaks.  Note that the mpi dependency is a | 
		
	
		
			
				|  |  |  |  | different kind of beast than the adept-utils and callpath dependencies; | 
		
	
		
			
				|  |  |  |  | there is no mpi package available in Spack.  Instead mpi is a virtual | 
		
	
		
			
				|  |  |  |  | dependency.  Spack may satisfy that dependency by installing packages | 
		
	
		
			
				|  |  |  |  | such as ``openmpi`` or ``mvapich``.  See the :ref:`packaging-guide` for more | 
		
	
		
			
				|  |  |  |  | there is no mpi package available in Spack.  Instead mpi is a *virtual | 
		
	
		
			
				|  |  |  |  | dependency*.  Spack may satisfy that dependency by installing packages | 
		
	
		
			
				|  |  |  |  | such as ``openmpi`` or ``mvapich2``.  See the :ref:`packaging-guide` for more | 
		
	
		
			
				|  |  |  |  | information on virtual dependencies. | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | Now when we try to install this package a lot more happens: | 
		
	
		
			
				|  |  |  |  | Now when we try to install this package, a lot more happens: | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | .. code-block:: console | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   $ spack install mpileaks | 
		
	
		
			
				|  |  |  |  |   ... | 
		
	
		
			
				|  |  |  |  |   ==> Successfully installed libdwarf from binary cache | 
		
	
		
			
				|  |  |  |  |   [+] /home/ubuntu/packaging/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/libdwarf-20180129-p4jeflorwlnkoq2vpuyocwrbcht2ayak | 
		
	
		
			
				|  |  |  |  |   ==> Installing callpath | 
		
	
		
			
				|  |  |  |  |   ==> Searching for binary cache of callpath | 
		
	
		
			
				|  |  |  |  |   ==> Installing callpath from binary cache | 
		
	
		
			
				|  |  |  |  |   ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/callpath-1.0.4/linux-ubuntu16.04-x86_64-gcc-5.4.0-callpath-1.0.4-empvyxdkc4j4pwg7gznwhbiumruey66x.spack | 
		
	
		
			
				|  |  |  |  |   ######################################################################## 100.0% | 
		
	
		
			
				|  |  |  |  |   gpg: Signature made Sat 10 Nov 2018 05:30:21 AM UTC using RSA key ID 3B7C69B2 | 
		
	
		
			
				|  |  |  |  |   gpg: Good signature from "sc-tutorial (GPG created for Spack) <becker33@llnl.gov>" [unknown] | 
		
	
		
			
				|  |  |  |  |   gpg: WARNING: This key is not certified with a trusted signature! | 
		
	
		
			
				|  |  |  |  |   gpg:          There is no indication that the signature belongs to the owner. | 
		
	
		
			
				|  |  |  |  |   Primary key fingerprint: 95C7 1787 7AC0 0FFD AA8F  D6E9 9CFA 4A45 3B7C 69B2 | 
		
	
		
			
				|  |  |  |  |   ==> Successfully installed callpath from binary cache | 
		
	
		
			
				|  |  |  |  |   [+] /home/ubuntu/packaging/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/callpath-1.0.4-empvyxdkc4j4pwg7gznwhbiumruey66x | 
		
	
		
			
				|  |  |  |  |   ==> Installing mpileaks | 
		
	
		
			
				|  |  |  |  |   ==> Searching for binary cache of mpileaks | 
		
	
		
			
				|  |  |  |  |   ==> No binary for mpileaks found: installing from source | 
		
	
		
			
				|  |  |  |  |   ==> Using cached archive: /home/ubuntu/packaging/spack/var/spack/cache/mpileaks/mpileaks-1.0.tar.gz | 
		
	
		
			
				|  |  |  |  |   ==> Staging archive: /home/ubuntu/packaging/spack/var/spack/stage/mpileaks-1.0-csoikctsalli4cdkkdk377gprkc472rb/mpileaks-1.0.tar.gz | 
		
	
		
			
				|  |  |  |  |   ==> Created stage in /home/ubuntu/packaging/spack/var/spack/stage/mpileaks-1.0-csoikctsalli4cdkkdk377gprkc472rb | 
		
	
		
			
				|  |  |  |  |   ==> No patches needed for mpileaks | 
		
	
		
			
				|  |  |  |  |   ==> Building mpileaks [Package] | 
		
	
		
			
				|  |  |  |  |   ==> Executing phase: 'install' | 
		
	
		
			
				|  |  |  |  |   ==> Error: ProcessError: Command exited with status 2: | 
		
	
		
			
				|  |  |  |  |       'make' '-j16' | 
		
	
		
			
				|  |  |  |  |    $ spack install mpileaks | 
		
	
		
			
				|  |  |  |  |    ... | 
		
	
		
			
				|  |  |  |  |    ==> Successfully installed libdwarf from binary cache | 
		
	
		
			
				|  |  |  |  |    [+] ~/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/libdwarf-20180129-p4jeflorwlnkoq2vpuyocwrbcht2ayak | 
		
	
		
			
				|  |  |  |  |    ==> Installing callpath | 
		
	
		
			
				|  |  |  |  |    ==> Searching for binary cache of callpath | 
		
	
		
			
				|  |  |  |  |    ==> Installing callpath from binary cache | 
		
	
		
			
				|  |  |  |  |    ==> Fetching file:///mirror/build_cache/linux-ubuntu16.04-x86_64/gcc-5.4.0/callpath-1.0.4/linux-ubuntu16.04-x86_64-gcc-5.4.0-callpath-1.0.4-empvyxdkc4j4pwg7gznwhbiumruey66x.spack | 
		
	
		
			
				|  |  |  |  |    ######################################################################## 100.0% | 
		
	
		
			
				|  |  |  |  |    ==> Successfully installed callpath from binary cache | 
		
	
		
			
				|  |  |  |  |    [+] ~/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/callpath-1.0.4-empvyxdkc4j4pwg7gznwhbiumruey66x | 
		
	
		
			
				|  |  |  |  |    ==> Installing mpileaks | 
		
	
		
			
				|  |  |  |  |    ==> Searching for binary cache of mpileaks | 
		
	
		
			
				|  |  |  |  |    ==> No binary for mpileaks found: installing from source | 
		
	
		
			
				|  |  |  |  |    ==> Using cached archive: ~/spack/var/spack/cache/mpileaks/mpileaks-1.0.tar.gz | 
		
	
		
			
				|  |  |  |  |    ==> Staging archive: ~/spack/var/spack/stage/mpileaks-1.0-csoikctsalli4cdkkdk377gprkc472rb/mpileaks-1.0.tar.gz | 
		
	
		
			
				|  |  |  |  |    ==> Created stage in ~/spack/var/spack/stage/mpileaks-1.0-csoikctsalli4cdkkdk377gprkc472rb | 
		
	
		
			
				|  |  |  |  |    ==> No patches needed for mpileaks | 
		
	
		
			
				|  |  |  |  |    ==> Building mpileaks [Package] | 
		
	
		
			
				|  |  |  |  |    ==> Executing phase: 'install' | 
		
	
		
			
				|  |  |  |  |    ==> Error: ProcessError: Command exited with status 2: | 
		
	
		
			
				|  |  |  |  |        'make' '-j16' | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   1 error found in build log: | 
		
	
		
			
				|  |  |  |  |        1    ==> Executing phase: 'install' | 
		
	
		
			
				|  |  |  |  |        2    ==> 'make' '-j16' | 
		
	
		
			
				|  |  |  |  |     >> 3    make: *** No targets specified and no makefile found.  Stop. | 
		
	
		
			
				|  |  |  |  |    1 error found in build log: | 
		
	
		
			
				|  |  |  |  |         1    ==> Executing phase: 'install' | 
		
	
		
			
				|  |  |  |  |         2    ==> 'make' '-j16' | 
		
	
		
			
				|  |  |  |  |      >> 3    make: *** No targets specified and no makefile found.  Stop. | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   See build log for details: | 
		
	
		
			
				|  |  |  |  |     /home/ubuntu/packaging/spack/var/spack/stage/mpileaks-1.0-csoikctsalli4cdkkdk377gprkc472rb/mpileaks-1.0/spack-build-out.txt | 
		
	
		
			
				|  |  |  |  |    See build log for details: | 
		
	
		
			
				|  |  |  |  |      ~/spack/var/spack/stage/mpileaks-1.0-csoikctsalli4cdkkdk377gprkc472rb/mpileaks-1.0/spack-build-out.txt | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | Note that this command may take a while to run and produce more output if | 
		
	
		
			
				|  |  |  |  | you don't have an MPI already installed or configured in Spack. | 
		
	
	
		
			
				
					
					|  |  |  | @@ -273,7 +268,7 @@ Debugging Package Builds | 
		
	
		
			
				|  |  |  |  | Our ``mpileaks`` package is still not building.  It may be obvious to | 
		
	
		
			
				|  |  |  |  | many of you that we never ran the configure script.  Let's add a | 
		
	
		
			
				|  |  |  |  | call to ``configure()`` to the top of the install routine. The resulting | 
		
	
		
			
				|  |  |  |  | package.py is in ``$SPACK_ROOT/lib/spack/docs/tutorial/examples/3.package.py``: | 
		
	
		
			
				|  |  |  |  | ``package.py`` is in ``$SPACK_ROOT/lib/spack/docs/tutorial/examples/3.package.py``: | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | .. literalinclude:: tutorial/examples/3.package.py | 
		
	
		
			
				|  |  |  |  |   :lines: 6- | 
		
	
	
		
			
				
					
					|  |  |  | @@ -283,46 +278,41 @@ If we re-run we still get errors: | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | .. code-block:: console | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   $ spack install mpileask | 
		
	
		
			
				|  |  |  |  |   ... | 
		
	
		
			
				|  |  |  |  |   ==> Installing mpileaks | 
		
	
		
			
				|  |  |  |  |   ==> Searching for binary cache of mpileaks | 
		
	
		
			
				|  |  |  |  |   ==> Finding buildcaches in /mirror/build_cache | 
		
	
		
			
				|  |  |  |  |   ==> No binary for mpileaks found: installing from source | 
		
	
		
			
				|  |  |  |  |   ==> Using cached archive: /home/ubuntu/packaging/spack/var/spack/cache/mpileaks/mpileaks-1.0.tar.gz | 
		
	
		
			
				|  |  |  |  |   ==> Staging archive: /home/ubuntu/packaging/spack/var/spack/stage/mpileaks-1.0-csoikctsalli4cdkkdk377gprkc472rb/mpileaks-1.0.tar.gz | 
		
	
		
			
				|  |  |  |  |   ==> Created stage in /home/ubuntu/packaging/spack/var/spack/stage/mpileaks-1.0-csoikctsalli4cdkkdk377gprkc472rb | 
		
	
		
			
				|  |  |  |  |   ==> No patches needed for mpileaks | 
		
	
		
			
				|  |  |  |  |   ==> Building mpileaks [Package] | 
		
	
		
			
				|  |  |  |  |   ==> Executing phase: 'install' | 
		
	
		
			
				|  |  |  |  |   ==> Error: ProcessError: Command exited with status 1: | 
		
	
		
			
				|  |  |  |  |       './configure' | 
		
	
		
			
				|  |  |  |  |    $ spack install mpileaks | 
		
	
		
			
				|  |  |  |  |    ... | 
		
	
		
			
				|  |  |  |  |    ==> Installing mpileaks | 
		
	
		
			
				|  |  |  |  |    ==> Searching for binary cache of mpileaks | 
		
	
		
			
				|  |  |  |  |    ==> Finding buildcaches in /mirror/build_cache | 
		
	
		
			
				|  |  |  |  |    ==> No binary for mpileaks found: installing from source | 
		
	
		
			
				|  |  |  |  |    ==> Using cached archive: ~/spack/var/spack/cache/mpileaks/mpileaks-1.0.tar.gz | 
		
	
		
			
				|  |  |  |  |    ==> Staging archive: ~/spack/var/spack/stage/mpileaks-1.0-csoikctsalli4cdkkdk377gprkc472rb/mpileaks-1.0.tar.gz | 
		
	
		
			
				|  |  |  |  |    ==> Created stage in ~/spack/var/spack/stage/mpileaks-1.0-csoikctsalli4cdkkdk377gprkc472rb | 
		
	
		
			
				|  |  |  |  |    ==> No patches needed for mpileaks | 
		
	
		
			
				|  |  |  |  |    ==> Building mpileaks [Package] | 
		
	
		
			
				|  |  |  |  |    ==> Executing phase: 'install' | 
		
	
		
			
				|  |  |  |  |    ==> Error: ProcessError: Command exited with status 1: | 
		
	
		
			
				|  |  |  |  |        './configure' | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   1 error found in build log: | 
		
	
		
			
				|  |  |  |  |        25    checking for /home/ubuntu/packaging/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc- | 
		
	
		
			
				|  |  |  |  |              5.4.0/openmpi-3.1.3-3njc4q5pqdpptq6jvqjrezkffwokv2sx/bin/mpicc... /home/ubuntu/pa | 
		
	
		
			
				|  |  |  |  |              ckaging/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/openmpi-3.1.3-3njc4q5p | 
		
	
		
			
				|  |  |  |  |              qdpptq6jvqjrezkffwokv2sx/bin/mpicc | 
		
	
		
			
				|  |  |  |  |        26    Checking whether /home/ubuntu/packaging/spack/opt/spack/linux-ubuntu16.04-x86_64/ | 
		
	
		
			
				|  |  |  |  |              gcc-5.4.0/openmpi-3.1.3-3njc4q5pqdpptq6jvqjrezkffwokv2sx/bin/mpicc responds to '- | 
		
	
		
			
				|  |  |  |  |              showme:compile'... no | 
		
	
		
			
				|  |  |  |  |        27    Checking whether /home/ubuntu/packaging/spack/opt/spack/linux-ubuntu16.04-x86_64/ | 
		
	
		
			
				|  |  |  |  |              gcc-5.4.0/openmpi-3.1.3-3njc4q5pqdpptq6jvqjrezkffwokv2sx/bin/mpicc responds to '- | 
		
	
		
			
				|  |  |  |  |              showme'... no | 
		
	
		
			
				|  |  |  |  |        28    Checking whether /home/ubuntu/packaging/spack/opt/spack/linux-ubuntu16.04-x86_64/ | 
		
	
		
			
				|  |  |  |  |              gcc-5.4.0/openmpi-3.1.3-3njc4q5pqdpptq6jvqjrezkffwokv2sx/bin/mpicc responds to '- | 
		
	
		
			
				|  |  |  |  |              compile-info'... no | 
		
	
		
			
				|  |  |  |  |        29    Checking whether /home/ubuntu/packaging/spack/opt/spack/linux-ubuntu16.04-x86_64/ | 
		
	
		
			
				|  |  |  |  |              gcc-5.4.0/openmpi-3.1.3-3njc4q5pqdpptq6jvqjrezkffwokv2sx/bin/mpicc responds to '- | 
		
	
		
			
				|  |  |  |  |              show'... no | 
		
	
		
			
				|  |  |  |  |        30    ./configure: line 4809: Echo: command not found | 
		
	
		
			
				|  |  |  |  |     >> 31    configure: error: unable to locate adept-utils installation | 
		
	
		
			
				|  |  |  |  |    1 error found in build log: | 
		
	
		
			
				|  |  |  |  |         25    checking for ~/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/openmpi-3.1.3-3 | 
		
	
		
			
				|  |  |  |  |               njc4q5pqdpptq6jvqjrezkffwokv2sx/bin/mpicc... ~/spack/opt/spack/linux-ubuntu16.04- | 
		
	
		
			
				|  |  |  |  |               x86_64/gcc-5.4.0/openmpi-3.1.3-3njc4q5pqdpptq6jvqjrezkffwokv2sx/bin/mpicc | 
		
	
		
			
				|  |  |  |  |         26    Checking whether ~/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/openmpi-3.1 | 
		
	
		
			
				|  |  |  |  |               .3-3njc4q5pqdpptq6jvqjrezkffwokv2sx/bin/mpicc responds to '-showme:compile'... no | 
		
	
		
			
				|  |  |  |  |         27    Checking whether ~/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/openmpi-3.1 | 
		
	
		
			
				|  |  |  |  |               .3-3njc4q5pqdpptq6jvqjrezkffwokv2sx/bin/mpicc responds to '-showme'... no | 
		
	
		
			
				|  |  |  |  |         28    Checking whether ~/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/openmpi-3.1 | 
		
	
		
			
				|  |  |  |  |               .3-3njc4q5pqdpptq6jvqjrezkffwokv2sx/bin/mpicc responds to '-compile-info'... no | 
		
	
		
			
				|  |  |  |  |         29    Checking whether ~/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/openmpi-3.1 | 
		
	
		
			
				|  |  |  |  |               .3-3njc4q5pqdpptq6jvqjrezkffwokv2sx/bin/mpicc responds to '-show'... no | 
		
	
		
			
				|  |  |  |  |         30    ./configure: line 4809: Echo: command not found | 
		
	
		
			
				|  |  |  |  |      >> 31    configure: error: unable to locate adept-utils installation | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   See build log for details: | 
		
	
		
			
				|  |  |  |  |     /home/ubuntu/packaging/spack/var/spack/stage/mpileaks-1.0-csoikctsalli4cdkkdk377gprkc472rb/mpileaks-1.0/spack-build-out.txt | 
		
	
		
			
				|  |  |  |  |    See build log for details: | 
		
	
		
			
				|  |  |  |  |      ~/spack/var/spack/stage/mpileaks-1.0-csoikctsalli4cdkkdk377gprkc472rb/mpileaks-1.0/spack-build-out.txt | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | Again, the problem may be obvious.  But let's pretend we're not | 
		
	
		
			
				|  |  |  |  | all intelligent developers and use this opportunity spend some | 
		
	
		
			
				|  |  |  |  | all experienced Autotools developers and use this opportunity to spend some | 
		
	
		
			
				|  |  |  |  | time debugging.  We have a few options that can tell us about | 
		
	
		
			
				|  |  |  |  | what's going wrong: | 
		
	
		
			
				|  |  |  |  |  | 
		
	
	
		
			
				
					
					|  |  |  | @@ -364,7 +354,7 @@ finding its ``adept-utils`` package.  Spack has | 
		
	
		
			
				|  |  |  |  | automatically added the include and library directories of | 
		
	
		
			
				|  |  |  |  | ``adept-utils`` to the compiler's search path, but some packages like | 
		
	
		
			
				|  |  |  |  | mpileaks can sometimes be picky and still want things spelled out on | 
		
	
		
			
				|  |  |  |  | their command line.  But let's continue to pretend we're not brilliant | 
		
	
		
			
				|  |  |  |  | their command line.  But let's continue to pretend we're not experienced | 
		
	
		
			
				|  |  |  |  | developers, and explore some other debugging paths: | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | We can also enter the build area and try to manually run the build: | 
		
	
	
		
			
				
					
					|  |  |  | @@ -374,7 +364,7 @@ We can also enter the build area and try to manually run the build: | 
		
	
		
			
				|  |  |  |  |   $ spack build-env mpileaks bash | 
		
	
		
			
				|  |  |  |  |   $ spack cd mpileaks | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | The ``spack env`` command spawned a new shell that contains the same | 
		
	
		
			
				|  |  |  |  | The ``spack build-env`` command spawned a new shell that contains the same | 
		
	
		
			
				|  |  |  |  | environment that Spack used to build the mpileaks package (you can | 
		
	
		
			
				|  |  |  |  | substitute bash for your favorite shell).  The ``spack cd`` command | 
		
	
		
			
				|  |  |  |  | changed our working dirctory to the last attempted build for mpileaks. | 
		
	
	
		
			
				
					
					|  |  |  | @@ -415,7 +405,7 @@ the command ourselves and debug as needed.  We could, for example, run | 
		
	
		
			
				|  |  |  |  | dependencies. | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | We can use the ``exit`` command to leave the shell spawned by ``spack | 
		
	
		
			
				|  |  |  |  | env``. | 
		
	
		
			
				|  |  |  |  | build-env``. | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | ------------------------------ | 
		
	
		
			
				|  |  |  |  | Specifying Configure Arguments | 
		
	
	
		
			
				
					
					|  |  |  | @@ -429,37 +419,39 @@ version can be found in | 
		
	
		
			
				|  |  |  |  |    :lines: 6- | 
		
	
		
			
				|  |  |  |  |    :language: python | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | This is all we need for working mpileaks!  If we install now we'll see: | 
		
	
		
			
				|  |  |  |  | This is all we need for a working mpileaks package!  If we install now we'll see: | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | .. code-block:: console | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   $ spack install mpileaks | 
		
	
		
			
				|  |  |  |  |   ... | 
		
	
		
			
				|  |  |  |  |   ==> Installing mpileaks | 
		
	
		
			
				|  |  |  |  |   ==> Searching for binary cache of mpileaks | 
		
	
		
			
				|  |  |  |  |   ==> Finding buildcaches in /mirror/build_cache | 
		
	
		
			
				|  |  |  |  |   ==> No binary for mpileaks found: installing from source | 
		
	
		
			
				|  |  |  |  |   ==> Using cached archive: /home/ubuntu/packaging/spack/var/spack/cache/mpileaks/mpileaks-1.0.tar.gz | 
		
	
		
			
				|  |  |  |  |   ==> Staging archive: /home/ubuntu/packaging/spack/var/spack/stage/mpileaks-1.0-csoikctsalli4cdkkdk377gprkc472rb/mpileaks-1.0.tar.gz | 
		
	
		
			
				|  |  |  |  |   ==> Created stage in /home/ubuntu/packaging/spack/var/spack/stage/mpileaks-1.0-csoikctsalli4cdkkdk377gprkc472rb | 
		
	
		
			
				|  |  |  |  |   ==> No patches needed for mpileaks | 
		
	
		
			
				|  |  |  |  |   ==> Building mpileaks [Package] | 
		
	
		
			
				|  |  |  |  |   ==> Executing phase: 'install' | 
		
	
		
			
				|  |  |  |  |   ==> Successfully installed mpileaks | 
		
	
		
			
				|  |  |  |  |     Fetch: 0.00s.  Build: 9.41s.  Total: 9.41s. | 
		
	
		
			
				|  |  |  |  |   [+] /home/ubuntu/packaging/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/mpileaks-1.0-csoikctsalli4cdkkdk377gprkc472rb | 
		
	
		
			
				|  |  |  |  |    $ spack install mpileaks | 
		
	
		
			
				|  |  |  |  |    ... | 
		
	
		
			
				|  |  |  |  |    ==> Installing mpileaks | 
		
	
		
			
				|  |  |  |  |    ==> Searching for binary cache of mpileaks | 
		
	
		
			
				|  |  |  |  |    ==> Finding buildcaches in /mirror/build_cache | 
		
	
		
			
				|  |  |  |  |    ==> No binary for mpileaks found: installing from source | 
		
	
		
			
				|  |  |  |  |    ==> Using cached archive: ~/spack/var/spack/cache/mpileaks/mpileaks-1.0.tar.gz | 
		
	
		
			
				|  |  |  |  |    ==> Staging archive: ~/spack/var/spack/stage/mpileaks-1.0-csoikctsalli4cdkkdk377gprkc472rb/mpileaks-1.0.tar.gz | 
		
	
		
			
				|  |  |  |  |    ==> Created stage in ~/spack/var/spack/stage/mpileaks-1.0-csoikctsalli4cdkkdk377gprkc472rb | 
		
	
		
			
				|  |  |  |  |    ==> No patches needed for mpileaks | 
		
	
		
			
				|  |  |  |  |    ==> Building mpileaks [Package] | 
		
	
		
			
				|  |  |  |  |    ==> Executing phase: 'install' | 
		
	
		
			
				|  |  |  |  |    ==> Successfully installed mpileaks | 
		
	
		
			
				|  |  |  |  |      Fetch: 0.00s.  Build: 9.41s.  Total: 9.41s. | 
		
	
		
			
				|  |  |  |  |    [+] ~/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/mpileaks-1.0-csoikctsalli4cdkkdk377gprkc472rb | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | There are some special circumstances in package that are worth highlighting. | 
		
	
		
			
				|  |  |  |  | Normally spack would have automatically detected that mpileaks was an | 
		
	
		
			
				|  |  |  |  | Autotools-based package when we ran ``spack create`` and made it an ``AutoToolsPackage`` class (except we added the ``-t generic`` option to skip this).  Instead of | 
		
	
		
			
				|  |  |  |  | There are some special circumstances in this package that are worth highlighting. | 
		
	
		
			
				|  |  |  |  | Normally, Spack would have automatically detected that mpileaks was an | 
		
	
		
			
				|  |  |  |  | Autotools-based package when we ran ``spack create`` and made it an ``AutoToolsPackage`` | 
		
	
		
			
				|  |  |  |  | class (except we added the ``-t generic`` option to skip this).  Instead of | 
		
	
		
			
				|  |  |  |  | a full install routine we would have just written: | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | .. code-block:: python | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |     def configure_args(self): | 
		
	
		
			
				|  |  |  |  |         args = ['--with-adept-utils=%s' % self.spec['adept-utils'].prefix, | 
		
	
		
			
				|  |  |  |  |                 '--with-callpath=%s' % self.spec['callpath'].prefix] | 
		
	
		
			
				|  |  |  |  |         return args | 
		
	
		
			
				|  |  |  |  |    def configure_args(self): | 
		
	
		
			
				|  |  |  |  |        return [ | 
		
	
		
			
				|  |  |  |  |            '--with-adept-utils={0}'.format(self.spec['adept-utils'].prefix), | 
		
	
		
			
				|  |  |  |  |            '--with-callpath={0}'.format(self.spec['callpath'].prefix) | 
		
	
		
			
				|  |  |  |  |        ] | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | Similarly, if this had been a CMake-based package we | 
		
	
		
			
				|  |  |  |  | would have been filling in a ``cmake_args`` function instead of | 
		
	
	
		
			
				
					
					|  |  |  | @@ -473,7 +465,7 @@ Variants | 
		
	
		
			
				|  |  |  |  | We have a successful mpileaks build, but let's take some time to improve | 
		
	
		
			
				|  |  |  |  | it.  ``mpileaks`` has a build-time option to truncate parts of the stack | 
		
	
		
			
				|  |  |  |  | that it walks.  Let's add a variant to allow users to set this when they | 
		
	
		
			
				|  |  |  |  | build in Spack. | 
		
	
		
			
				|  |  |  |  | build mpileaks with Spack. | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | To do this, we'll add a variant to our package, as per the following (see | 
		
	
		
			
				|  |  |  |  | ``$SPACK_ROOT/lib/spack/docs/tutorial/examples/5.package.py``): | 
		
	
	
		
			
				
					
					|  |  |  | @@ -488,19 +480,19 @@ configure line (output truncated for length): | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | .. code-block:: console | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   $ spack install --verbose mpileaks stackstart=4 | 
		
	
		
			
				|  |  |  |  |   ... | 
		
	
		
			
				|  |  |  |  |   ==> Installing mpileaks | 
		
	
		
			
				|  |  |  |  |   ==> Searching for binary cache of mpileaks | 
		
	
		
			
				|  |  |  |  |   ==> Finding buildcaches in /mirror/build_cache | 
		
	
		
			
				|  |  |  |  |   ==> No binary for mpileaks found: installing from source | 
		
	
		
			
				|  |  |  |  |   ==> Using cached archive: /home/ubuntu/packaging/spack/var/spack/cache/mpileaks/mpileaks-1.0.tar.gz | 
		
	
		
			
				|  |  |  |  |   ==> Staging archive: /home/ubuntu/packaging/spack/var/spack/stage/mpileaks-1.0-meufjojkxve3l7rci2mbud3faidgplto/mpileaks-1.0.tar.gz | 
		
	
		
			
				|  |  |  |  |   ==> Created stage in /home/ubuntu/packaging/spack/var/spack/stage/mpileaks-1.0-meufjojkxve3l7rci2mbud3faidgplto | 
		
	
		
			
				|  |  |  |  |   ==> No patches needed for mpileaks | 
		
	
		
			
				|  |  |  |  |   ==> Building mpileaks [Package] | 
		
	
		
			
				|  |  |  |  |   ==> Executing phase: 'install' | 
		
	
		
			
				|  |  |  |  |   ==> './configure' '--with-adept-utils=/home/ubuntu/packaging/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/adept-utils-1.0.1-7tippnvo5g76wpijk7x5kwfpr3iqiaen' '--with-callpath=/home/ubuntu/packaging/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/callpath-1.0.4-empvyxdkc4j4pwg7gznwhbiumruey66x' '--prefix=/home/ubuntu/packaging/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/mpileaks-1.0-meufjojkxve3l7rci2mbud3faidgplto' '--with-stack-start-c=4' '--with-stack-start-fortran=4' | 
		
	
		
			
				|  |  |  |  |    $ spack install --verbose mpileaks stackstart=4 | 
		
	
		
			
				|  |  |  |  |    ... | 
		
	
		
			
				|  |  |  |  |    ==> Installing mpileaks | 
		
	
		
			
				|  |  |  |  |    ==> Searching for binary cache of mpileaks | 
		
	
		
			
				|  |  |  |  |    ==> Finding buildcaches in /mirror/build_cache | 
		
	
		
			
				|  |  |  |  |    ==> No binary for mpileaks found: installing from source | 
		
	
		
			
				|  |  |  |  |    ==> Using cached archive: ~/spack/var/spack/cache/mpileaks/mpileaks-1.0.tar.gz | 
		
	
		
			
				|  |  |  |  |    ==> Staging archive: ~/spack/var/spack/stage/mpileaks-1.0-meufjojkxve3l7rci2mbud3faidgplto/mpileaks-1.0.tar.gz | 
		
	
		
			
				|  |  |  |  |    ==> Created stage in ~/spack/var/spack/stage/mpileaks-1.0-meufjojkxve3l7rci2mbud3faidgplto | 
		
	
		
			
				|  |  |  |  |    ==> No patches needed for mpileaks | 
		
	
		
			
				|  |  |  |  |    ==> Building mpileaks [Package] | 
		
	
		
			
				|  |  |  |  |    ==> Executing phase: 'install' | 
		
	
		
			
				|  |  |  |  |    ==> './configure' '--prefix=~/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/mpileaks-1.0-meufjojkxve3l7rci2mbud3faidgplto' '--with-adept-utils=~/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/adept-utils-1.0.1-7tippnvo5g76wpijk7x5kwfpr3iqiaen' '--with-callpath=~/spack/opt/spack/linux-ubuntu16.04-x86_64/gcc-5.4.0/callpath-1.0.4-empvyxdkc4j4pwg7gznwhbiumruey66x' '--with-stack-start-c=4' '--with-stack-start-fortran=4' | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | --------------- | 
		
	
		
			
				|  |  |  |  | The Spec Object | 
		
	
	
		
			
				
					
					|  |  |  | @@ -508,7 +500,7 @@ The Spec Object | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | This tutorial has glossed over a few important features, which weren't | 
		
	
		
			
				|  |  |  |  | too relevant for mpileaks but may be useful for other packages.  There | 
		
	
		
			
				|  |  |  |  | were several places we references the ``self.spec`` object.  This is a | 
		
	
		
			
				|  |  |  |  | were several places we reference the ``self.spec`` object.  This is a | 
		
	
		
			
				|  |  |  |  | powerful class for querying information about what we're building.  For | 
		
	
		
			
				|  |  |  |  | example, you could use the spec to query information about how a | 
		
	
		
			
				|  |  |  |  | package's dependencies were built, or what compiler was being used, or | 
		
	
	
		
			
				
					
					|  |  |  | @@ -520,36 +512,36 @@ common queries: | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | .. code-block:: python | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   if self.spec.satisfies('@1.1:'): | 
		
	
		
			
				|  |  |  |  |     # Do things needed for 1.1+ | 
		
	
		
			
				|  |  |  |  |    if self.spec.satisfies('@1.1:'): | 
		
	
		
			
				|  |  |  |  |        # Do things needed for 1.1+ | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | - Is ``openmpi`` the MPI I'm building with? | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | .. code-block:: python | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   if self.spec['mpi'].name == 'openmpi': | 
		
	
		
			
				|  |  |  |  |     # Do openmpi things | 
		
	
		
			
				|  |  |  |  |    if self.spec['mpi'].name == 'openmpi': | 
		
	
		
			
				|  |  |  |  |        # Do openmpi things | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | - Am I building with ``gcc`` version less than ``5.0.0``: | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | .. code-block:: python | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   if self.spec.satisfies('%gcc@:5.0.0'): | 
		
	
		
			
				|  |  |  |  |     # Add arguments specific to gcc's earlier than 5.0.0 | 
		
	
		
			
				|  |  |  |  |    if self.spec.satisfies('%gcc@:5.0.0'): | 
		
	
		
			
				|  |  |  |  |        # Add arguments specific to gcc's earlier than 5.0.0 | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | - Am I built with the ``debug`` variant: | 
		
	
		
			
				|  |  |  |  | - Am I building with the ``debug`` variant: | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | .. code-block:: python | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |   if self.spec.satisfies('+debug'): | 
		
	
		
			
				|  |  |  |  |     # Add -g option to configure flags | 
		
	
		
			
				|  |  |  |  |    if self.spec.satisfies('+debug'): | 
		
	
		
			
				|  |  |  |  |        # Add -g option to configure flags | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | - Is my ``dyninst`` dependency greater than version ``8.0``? | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | .. code-block:: python | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |    if self.spec['dyninst'].satisfies('@8.0:'): | 
		
	
		
			
				|  |  |  |  |     # Use newest dyninst options | 
		
	
		
			
				|  |  |  |  |        # Use newest dyninst options | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | More examples can be found in the thousands of packages already added to | 
		
	
		
			
				|  |  |  |  | Spack in ``$SPACK_ROOT/var/spack/repos/builtin/packages``. | 
		
	
	
		
			
				
					
					|  |  |  | @@ -560,7 +552,8 @@ To ensure that future sections of the tutorial run properly, please | 
		
	
		
			
				|  |  |  |  | uninstall mpileaks and remove the tutorial repo from your | 
		
	
		
			
				|  |  |  |  | configuration. | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | .. code-block: console | 
		
	
		
			
				|  |  |  |  | .. code-block:: console | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |    $ spack uninstall -ay mpileaks | 
		
	
		
			
				|  |  |  |  |    $ spack repo remove tutorial | 
		
	
		
			
				|  |  |  |  |    $ rm -rf $SPACK_ROOT/var/spack/repos/tutorial/packages/mpileaks | 
		
	
	
		
			
				
					
					| 
							
							
							
						 |  |  |   |