---
layout: default
---
# Spack
[Spack ](https://spack.io/ ) rappresenta uno strumento avanzato di gestione dei pacchetti, mirato a supportare simultaneamente diverse versioni e configurazioni di software su una vasta gamma di piattaforme e ambienti. In particolare, è stato appositamente progettato per rispondere alle esigenze dei grandi centri di supercalcolo, in cui numerosi utenti e team applicativi condividono installazioni comuni di software su cluster caratterizzati da architetture non convenzionali e l'utilizzo di librerie prive di un'ABI standardizzata. Un aspetto distintivo di Spack è la sua natura non distruttiva: l'installazione di una nuova versione non interferisce con le installazioni preesistenti, consentendo così la coesistenza di molteplici configurazioni sullo stesso sistema.
## Amministrazione
L'ambiente Spack può essere ottenuto via *git*
```bash
git clone --depth=100 --branch=releases/v0.21 https://github.com/spack/spack.git spack
```
Una volta clonato, è possibile caricare l'ambiente con
```bash
cd spack
. share/spack/setup-env.sh
```
Adesso possiamo visualizzare quali sono i compilatori già installti sul sistema
e quelli disponibili:
```bash
spack compiler find
spack compilers
```
Impieghiamo Spack sul cluster per l'installazione del software e la generazione
di *module file* per [Environment Modules ](https://modules.readthedocs.io/en/latest/ ).
Nello specifico, configuriamo la generazione dei moduli tramite il file di configurazione
dei moduli in `/mnt/raid/software/spack/etc/spack/modules.yaml`
```yaml
modules:
default:
enable:
- tcl
tcl:
hash_length: 0
include:
- gcc
exclude_implicits: true
projections:
all: '{name}/{version}-{compiler.name}-{compiler.version}'
gcc: '{name}/{version}'
all:
conflict:
- '{name}'
```
Per aggiornare i moduli si può usare il comando
```bash
spack module tcl refresh --delete-tree -y
```
Per rendere disponibili i file di modulo su tutti i nodi è necessario aggiungere
il path alla configurazione di sistema. Questo può essere fatto creando il file
`addspackmodulepath.sh` :
```bash
#!/bin/bash
apt-get install -y environment-modules
echo '/mnt/raid/software/spack/share/spack/modules/linux-ubuntu20.04-aarch64/ # Spack Modules' >> /etc/environment-modules/modulespath
```
ed eseguendo
```bash
./runsetup.sh addspackmodulepath.sh
```
## Utenza
Per l'utenza la presenza di Spack è *virtualmente invisibile* , ciò a cui gli utenti
hanno accesso sono i file di modulo per il caricamento nell'ambiente del software
installato.
Si possono investigare i moduli disponibili con il comando
```bash
module avail
```
e caricare nell'ambiente con il comando
```bash
module load programma/versione-compilatore
```
o rimuovere con
```bash
module unload programma/versione-compilatore
```
Un ambiente pulito può essere ottenuto con il comando
```bash
module purge
```
È importante che si faccia uso sempre di catene di moduli compatibili, ovvero
di moduli (software) generato/compilato con il medesimo compilatore. Altrimenti
si rischia la creazione di ambienti inconsistenti e impossibili da usare.
**Esempio:** carichiamo un diverso compilatore, al *login* la richiesta
```bash
gcc --version
```
risponderà
```
gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```
Eseguiamo il comando
```bash
module load gcc/12.3.0
```
seguito da
```bash
gcc --version
```
che ora ci risponderà
```
gcc (Spack GCC) 12.3.0
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```