Difference between revisions of "Makepkg (Italiano)"

From ArchWiki
Jump to: navigation, search
(rm temporary i18n template)
(Aggiunto titolo nuova sezione)
Line 131: Line 131:
  
 
Ciò è utile se più utenti compilano pacchetti su un sistema, o si stanno distribuendo i propri pacchetti ad altri utenti.
 
Ciò è utile se più utenti compilano pacchetti su un sistema, o si stanno distribuendo i propri pacchetti ad altri utenti.
 +
 +
=== Controllo firma ===
  
 
== Utilizzo ==
 
== Utilizzo ==

Revision as of 09:25, 29 November 2012

Template:Article summary start Template:Article summary text Template:Article summary heading Template:Article summary text Template:Article summary heading Template:Article summary wiki Template:Article summary heading Template:Article summary link Template:Article summary link Template:Article summary end

makepkg è utilizzato per compilare e creare pacchetti installabili da Pacman, il gestore pacchetti di Arch Linux. makepkg è uno script che automatizza la creazione dei pacchetti; esso può scaricare e verificare i sorgenti dei file, controllare le dipendenze, configurare le impostazioni, compilare i sorgenti, installare in una directory temporanea, personalizzare i pacchetti, generare meta-informazioni e pacchettizzare il tutto.

makepkg è incluso nel pacchetto pacman.

Configurazione

/etc/makepkg.conf è il principale file di configurazione di makepkg. La maggior parte degli utenti vorrà personalizzare il file di configurazione di makepkg prima di iniziare a compilare qualsiasi pacchetto.

Flag di compilazione e architettura

Le variabili MAKEFLAGS, CFLAGS e CXXFLAGS vengono usate da make, gcc, e g++ mentre eseguono la compilazione del software con makepkg. Per impostazione predefinita, queste opzioni creano pacchetti generici che possono essere poi installati su una vasta gamma di macchine. Un miglioramento delle prestazioni può essere ottenuto mediante l'ottimizzazione della opzioni di compilazione per il computer host. Il rovescio della medaglia è che i pacchetti compilati appositamente per il processore host potrebbero non funzionare su altre macchine.

Nota: Tenere a mente che non tutti i sistemi di compilazione utilizzeranno le variabili esportate. Alcune di esse potrebbero essere sovrascritte nei Makefiles originali o nel PKGBUILD.
/etc/makepkg.conf
...

#########################################################################
# ARCHITECTURE, COMPILE FLAGS
#########################################################################
#
CARCH="x86_64"
CHOST="x86_64-unknown-linux-gnu"

#-- Exclusive: will only run on x86_64
# -march (or -mcpu) builds exclusively for an architecture
# -mtune optimizes for an architecture, but builds for whole processor family
CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2"
CXXFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2"
LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro,--hash-style=gnu"
#-- Make Flags: change this for DistCC/SMP systems
#MAKEFLAGS="-j2"

...

I CFLAGS e i CXXFLAGS predefiniti di makepkg.conf sono compatibili con tutte le macchine e le loro rispettive architetture.

Su machcine x86_64, raramente ci sono vantaggi in termini di prestazioni che giustifichino il tempo di ricompilazione dei pacchetti ufficiali.

A partire dalla versione 4.3.0, GCC offre lo switch -march=native che abilita l'autorilevamento della CPU e seleziona automaticamente le ottimizzazioni supportate dalla macchina locale in fase di runtime GCC. Per utilizzarlo, è sufficiente modificare le impostazioni di default modificando le linee CFLAGS e CXXFLAGS come segue:

# -march=native also sets the correct -mtune=
CFLAGS="-march=native -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2"
CXXFLAGS="${CFLAGS}"

Le opzioni CFLAGS and CXXFLAGS di default su makepkg.conf, sono compatibili con tutte le macchine delle loro rispettive architetture.

Ulteriori ottimizzazioni per tipo di CPU, possono teoricamente migliorare le prestazioni -march= abilitando tutti i set di istruzioni disponibili e migliorando lo scheduling per particolari CPU. Ciò è evidente specialmente quando si creano pacchetti (ad esempio strumenti di codifica audio/video, applicazioni scientifiche, semplici programmi matematici, ecc..) che potrebbero sfruttare pesantemente i nuovi set di istruzioni, non abilitati quando si utilizzano le opzioni predefinite (o i pacchetti) forniti da Arch Linux.

E' molto facile ridurre le prestazioni utilizzando CFLAGS fuori standard, perchè GCC il più delle volte manderà in loop codice di grande dimensioni, vettorizzandolo in maniera errata, ecc.., a seconda delle opzioni del compilatore. Finchè non si verificherà/misurerà che qualcosa è più veloce, c'è una buona possibilità che non lo sia!

Vedere la pagina man di GCC per una lista completa delle opzioni disponibili. LaCompilation Optimization Guide di Gentoo e l'articolo wiki Safe Cflags forniscono informazioni più dettagliate.

MAKEFLAGS

L'opzione MAKEFLAGS può essere utilizzata per specificare delle opzioni aggiuntive a "make". Gli utenti con sistemi multi-core/multi-processore possono specificare il numero di operazioni da eseguire simultaneamente. Generalmente -j2, più 1 per ogni core/processore aggiuntivo, è una scelta ragionevole. Alcuni PKGBUILD sono specificatamente contraddistinti con -j1, richiesto da alcune versioni, o semplicemente perchè non supportati. I pacchetti che, a causa di questo, non si riescono a compilare, vanno segnalati tramite il bug tracker, dopo essersi assicurati che l'errore non è causato dal proprio MAKEFLAGS.

Consultare man make per un elenco completo delle opzioni disponibili.

Output del pacchetto

Si può quindi impostare dove mettere i sorgenti ed i pacchetti per farli riconoscere dal packager. Questo passaggio è opzionale; i pacchetti verranno creati nella directory di lavoro dove makepkg viene eseguito di default.

/etc/makepkg.conf
...

#########################################################################
# PACKAGE OUTPUT
#########################################################################
#
# Default: put built package and cached source in build directory
#
#-- Destination: specify a fixed directory where all packages will be placed
#PKGDEST=/home/packages
#-- Source cache: specify a fixed directory where source files will be cached
#SRCDEST=/home/sources
#-- Source packages: specify a fixed directory where all src packages will be placed
#SRCPKGDEST=/home/srcpackages
#-- Packager: name/email of the person or organization building packages
#PACKAGER="John Doe <john@doe.com>"

...

Ad esempio, creare la directory:

$ mkdir /home/$USER/packages

Poi modificare di conseguenza la variabile PKGDEST in /etc/makepkg.conf.

La variabile PACKAGER imposterà il valore del packager all'interno del file metadata dei pacchetti compilati .PKGINFO. Per impostazione predefinita, i pacchetti compilati dagli utenti indicheranno:

pacman -Qi package
...
Packager       : Unknown Packager
...

Poi:

pacman -Qi package
...
Packager       : John Doe <john@doe.com>
...

Ciò è utile se più utenti compilano pacchetti su un sistema, o si stanno distribuendo i propri pacchetti ad altri utenti.

Controllo firma

Utilizzo

Prima di continuare, assicurarsi che sia installato il gruppo di strumenti base-devel siano installati. I pacchetti appartenenti a questo gruppo non sono tenuti ad essere elencati come dipendenze nei file PKGBUILD. Installare "base-devel" con il comando (da root):

# pacman -S base-devel
Nota: Prima di lamentarsi di eventuali mancanze di (make)dipendenze, ricordare che si assume che il gruppo di pacchetti base sia correttamente installato sul sistema Arch Linux. Il gruppo "base-devel" è fondamentale per poter compilare e creare pacchetti con makepkg.

Per creare un pacchetto, si deve innanzitutto creare un PKGBUILD, o creare uno script, così come descritto in Creating Packages, oppure ottenerne uno da ABS, da AUR, o da altre fonti.

Attenzione: Compilare e/o installare pacchetti solo da fonti sicure.

Una volta in possesso di un PKGBUILD, spostarsi nella cartella nel quale è posizionato e digitare il seguente comando per creare il pacchetto descritto nel PKGBUILD stesso:

$ makepkg

Per pulire makepkg da file e cartelle, come ad esempio i file estratti in $srcdir, aggiungere l'opzione che segue. Ciò è utile per molteplici compilazioni dello stesso pacchetto o per l'aggiornamento di versione, utilizzando la stessa cartella di compilazione. Esso impedisce che i file residui ed obsoleti vengano riportati nel nuovo processo di compilazione.

$ makepkg -c

Se non verranno rilevate tutte le dipendenze richieste, makepkg darà un avviso, prima di fallire la compilazione. Per compilare il pacchetto a installare automaticamente le dipendenze necessarie, utilizzare il comando:

$ makepkg -s

Si noti che queste dipendenze devono essere disponibili nei repository configurati; vedere pacman#Repositories per i dettagli. Altrimenti, si si possono installare manualmente le dipendenze prima della compilazione (pacman -S --asdeps dep1 dep2).

Quando tutte le dipendenze sono soddisfatte ed il pacchetto compilato correttamente, verrà creato, nella directory di lavoro, il file del pacchetto (pkgname-pkgver.pkg.tar.gz). Per installarlo, eseguire (da root):

# pacman -U pkgname-pkgver.pkg.tar.gz

In alternativa, un metodo più semplice è utilizzare il flag -i, anzichè pacman -U pkgname-pkgver.pkg.tar.xz, come riportato di seguito:

$ makepkg -i

Trucchi e consigli

Sostituzione automatica checksums nel PKGBUILD

Opzione 1

Di seguito uno script molto utile che genererà nuovi checksum per i file aggiornati e li sosituirà dentro il PKGBUILD in un'unica fase.

#!/bin/bash
# Script by Falconindy
# https://bbs.archlinux.org/viewtopic.php?id=131666

awk -v newsums="$(makepkg -g)" '
BEGIN {
  if (!newsums) exit 1
}

/^[[:blank:]]*(md|sha)[[:digit:]]+sums=/,/\)[[:blank:]]*$/ {
  if (!i) print newsums; i++
  next
}

1
' PKGBUILD > PKGBUILD.new && mv PKGBUILD{.new,}

Opzione 2

setconf PKGBUILD $(makepkg -g 2>/dev/null | pee "head -1 | cut -d= -f1" "cut -d= -f2") ')'

Questo funziona bene, ma ha lo svantaggio di richiedere il paccketto setconf (appena 364 KiB) e non funziona con sum multipli (ad esempio, sia md5sums che sha256sums nello stesso PKGBUILD).

La velocità è buona o migliore rispetto agli script che utilizzano awk, anche se makepkg viene chiamato due volte.

ATTENZIONE:Riferimento $srcdir in PKGBUILD

In qualche modo, $srcdir di $pkgdir è finito in uno dei file installati nel pacchetto.

Per individuare tale file, eseguire il seguente comando nella cartella di compilazione del makepkg:

grep -R "$(pwd)/src" pkg/

[Link] al thread della discussione.