MAC Homebrew

La gestione degli aggiornamenti su MAC e' semplice ed efficiente ma se si vogliono utilizzare pacchetti Open Source su MAC OSX la Apple non fornisce un analogo dell'RPM (Red Hat Package Manager). Homebrew o, piu' semplicemente brew, e' il piu' recente, il piu' completo e sopratutto piu' il piu' semplice gestore di pacchetti per macOS.
Quanto segue sono alcune note, personali e senza pretese, su Homebrew.

Ho fretta!

Iniziare ad utilizzare Homebrew e' molto semplice:

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" $ brew install lynx

Il primo comando installa Homebrew (semplicemente brew per gli amici), il secondo installa lynx che e' uno dei migliaia dei pacchetti disponibili [NdE lynx e' un browser a caratteri].

Quali sono i pacchetti disponibili? Basta cercarli: brew search XXX indicando parte del nome del pacchetto desiderato.
Come si installa un pacchetto? Allora non sei stato attento! L'abbiamo gia' detto: brew install rogue
Quali sono i pacchetti installati? Basta chiederlo: brew list
Come aggiorno? Facile: brew update (solo Homebrew) brew upgrade XXX (solo la formula XXX) brew upgrade (tutto)
Come disinstallo un pacchetto? Basta la parola: brew uninstall rogue
Ho qualche problema, cosa faccio? Basta chiamare il dottore: brew doctor

In qualche caso puo' essere necessario aggiornare qualche tool da linea di comando, ma brew lo dice e basta lanciare il comando: softwareupdate --all --install --force

Homebrew e' davvero molto semplice e non richiede alcun prerequisito, se non quello di saper lanciare qualche comando dal Terminal.
I miei pacchetti preferiti installati o reinstallati con brew? wget mtr logstalgia gource arping iftop jmeter node exif lynx ...

NdE: in precedenza il comando per l'installazione era: ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)".

Introduzione

La maggioranza dei pacchetti open source vengono distribuiti con un tarball che si configura, compila ed installa con tre semplici comandi:

./configure
make
make install

La difficolta' e' pero' nei prerequisiti che richiedono ricerche e controlli manuali... Homebrew li risolve con ricette (o formule) scritte in Ruby ed una gestione delle versioni basata su Git.

Homebrew installa i pacchetti in /usr/local/Cellar e, quando compilati crea un link simbolico su /usr/local. Le formule per installare i singoli pacchetti sono mantenute nella directory /usr/local/Library/Formula ed aggiornate quasi quotidianamente.
I singoli passi previsti dalla ricetta (o formula per essere precisi) vengono riportati in modo chiaro sul terminale. Ecco qualche esempio:

$ brew install wget ==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/wget-1.15_1.mavericks.bottle.tar.gz ######################################################################## 100.0% ==> Pouring wget-1.15_1.mavericks.bottle.tar.gz 🍺 /usr/local/Cellar/wget/1.15_1: 9 files, 908K $ brew install gource ==> Downloading https://github.com/acaudwell/Gource/releases/download/gource-0.42/gource-0.42.tar.gz Already downloaded: /Library/Caches/Homebrew/gource-0.42.tar.gz ==> ./configure --prefix=/usr/local/Cellar/gource/0.42 --without-x ==> make install 🍺 /usr/local/Cellar/gource/0.42: 20 files, 2.0M, built in 70 seconds $ brew install rogue ==> Downloading http://rogue.rogueforge.net/files/rogue5.4/rogue5.4.4-src.tar.gz ######################################################################## 100.0% ==> ./configure --prefix=/usr/local/Cellar/rogue/5.4.4 ==> make install 🍺 /usr/local/Cellar/rogue/5.4.4: 9 files, 280K, built in 22 seconds

Come semplice esempio di formula usiamo un famoso browser a carattere: lynx. Ecco il contenuto del file /usr/local/Library/Formula/lynx.rb :

require 'formula'

class Lynx < Formula
  homepage 'http://lynx.isc.org/release/'
  url 'http://lynx.isc.org/current/lynx2.8.8rel.2.tar.bz2'
  version '2.8.8rel.2'
  sha1 '65bbf95627c88723bbb5880155e5fe01c2753d0c'

  depends_on "openssl"

  def install
    system "./configure", "--disable-debug", "--disable-dependency-tracking",
                          "--prefix=#{prefix}",
                          "--mandir=#{man}",
                          "--disable-echo",
                          "--enable-default-colors",
                          "--with-zlib",
                          "--with-bzlib",
                          "--with-ssl=#{Formula["openssl"].opt_prefix}",
                          "--enable-ipv6"
    system "make install"
  end

  test do
    system "#{bin}/lynx", '-dump', 'http://checkip.dyndns.org'
  end
end

Tutto abbastanza chiaro e leggibile...

Brew legge le formule e le esegue: scarica i pacchetti e svolge tutti i necessari passi per la compilazione e l'installazione del pacchetto.

Services

Una volta installato un pacchetto e' potenzialmente utilizzabile come servizio, cosa tipica se si tratta di un database o di un demone di servizio. Pero' per integrarlo con launchctl serve creare i link ai .plist... ma c'e' un modo piu' semplice!

Installata la gestione dei servizi con brew tap homebrew/services, per attivare un servizio basta il nuovo comando: brew services start mysql e naturalmente per fermare un servizio: brew services stop postgresql
Per controllare cosa e' attivo:

meo$ brew services list Name Status User Plist postgresql started meo /Users/meo/Library/LaunchAgents/homebrew.mxcl.postgresql.plist mysql started meo /Users/meo/Library/LaunchAgents/homebrew.mxcl.mysql.plist

Tutti i dettagli dei servizi sono riportati nel file XML .plist. Le configurazioni sono comunque semplici: i file di configurazione tipicamente in /usr/local/etc/xxx, la working directory tipicamente in /usr/local/var/lib/xxx, i file di log tipicamente in /usr/local/var/log/xxx, ...

Facile vero?

APP

E le APPS grafiche?
Semplicissimo, si chiamano cask (barile):

brew cask install docker


Come aggiorno? Facile: dopo il brew update basta brew cask upgrade XXX (solo la formula XXX) oppure brew cask upgrade (tutte le APP) [NdA ora questa sintassi e' deprecata e si utilizza ad esempio brew upgrade --cask]

Varie ed eventuali

Ci sono diversi comandi che si possono utilizzare con brew... in generale sono tutti molto semplici e diretti. Vediamo qualche esempio:

brew search     # cerca una formula
brew list       # elenca le formule installate
brew update     # aggiorna brew
brew upgrade    # aggiorna i pacchetti delle formule installate
brew pin XXX    # fissa la versione della formula XXX	
brew link XXX   # aggiunge i link per la formula XXX, utile per le reinstallazioni
brew help
brew doctor
brew update && brew upgrade && brew cleanup; brew doctor; brew info
brew deps --tree --installed

brew uninstall --force --ignore-dependencies postgresql 
brew postgresql-upgrade-database
brew services list
brew services start postgresql
...
psql postgres

Aggiunti di recente:

brew cask install adoptopenjdk

Silicon

L'uscita dei nuovi processori Apple Silicon M1/M2/M3 ha comportato alcuni cambiamenti per Homebrew. Il supporto ufficiale e' dalla versione 3.0 del 2021-03.

La directory di installazione e' /opt/homebrew per Apple Silicon, mentre era /usr/local per macOS Intel.

La cosa piu' curiosa e' che... anche con l'installazione sbagliata comunque funziona quasi tutto! Infatti grazie a Rosetta gli eseguibili per Intel di Homebrew vengono comunque eseguiti anche su Silicon. Tuttavia l'utilizzo di eseguibili nativi e' fortemente consigliato e risolve qualche problema di ricompilazione di componenti aggiuntivi.

Non e' disponibile una procedura di upgrade o migrazione: semplicemente basta reinstallare Homebrew e con Silicon verra' installato su /opt/homebrew. Ricaricare tutti i pacchetti per ARM richiede un po' di tempo e c'e' il rischio di dimenticare qualcosa... ma si puo' fare automaticamente avendo l'avvertenza di eseguire un cd /tmp; brew bundle dump e quindi, dopo aver scaricato la versione ARM di Homebrew e corretto i PATH [NdA ~/.zshrc], lanciando brew bundle install --file /tmp/Brewfile

Attenzione! Se ci sono database, configurazioni specifiche, ... e' opportuno salvarle prima perche' con questa procedura i pacchetti vengono tutti reinstallati.
E' poi opportuno eseguire un po' di controlli/pulizie sui link /usr/local/var /usr/local/bin /usr/local/Cellar ... (eg. su Intel /usr/local/var/postgresql@15 mentre su Silicon /opt/homebrew/var/postgresql@15)

Open Source

Da anni faccio uso e, quando riesco, contribuisco alla comunita' Open Source. Su MAC e' un piacere: e' quasi come su Linux. Su MAC c'e' praticamente tutto e la comunita' e' molto attiva. Molti programmi Open Source sono gia' presenti nel software fornito da Apple: Apache PHP Python Perl Ruby...

Ottimi punti di partenza per cercare programmi ed utility per MAC sono: Apple Developer, MAC Ports, Open Source MAC, MAC OS Forge, MAC Update, Best Mac Software ...

Tra gli altri MAC Ports e' un gestore di pacchetti con funzionalita' simili ad Homebrew:

$ sudo port install putty

Attualmente su MAC Ports si trovano piu' programmi che su Homebrew ma quest'ultimo e' molto attivo e piu' semplice da utilizzare.


Titolo: Homebrew
Livello: Medio (2/5)
Data: 21 Giugno 2014
Versione: 1.0.4 - 1 Aprile 2023
Autore: mail [AT] meo.bogliolo.name