O arquivo de configuração do
makepkg,
GCC e do
make é o
makepkg.conf. Podemos configurá-lo para atender nossos objetivos, como por exemplo, uma maior otimização da compilação.
nano /etc/makepkg.conf
Exemplo:
#
# /etc/makepkg.conf
#
#############################
# SOURCE ACQUISITION
#############################
#
#-- The download utilities that makepkg should use to acquire sources
# Format: 'protocol::agent'
DLAGENTS=('ftp::/usr/bin/wget -c --passive-ftp -t 3 --waitretry=3 -O %o %u'
'http::/usr/bin/wget -c -t 3 --waitretry=3 -O %o %u'
'https::/usr/bin/wget -c -t 3 --waitretry=3 --no-check-certificate -O %o %u'
'rsync::/usr/bin/rsync -z %u %o'
'scp::/usr/bin/scp -C %u %o')
# Other common tools:
# /usr/bin/snarf
# /usr/bin/lftpget -c
# /usr/bin/curl
#############################
# ARCHITECTURE, COMPILE FLAGS
#############################
#
CARCH="i686"
CHOST="i686-pc-linux-gnu"
#-- Exclusive: will only run on i686
# -march (or -mcpu) builds exclusively for an architecture
# -mtune optimizes for an architecture, but builds for whole processor family
CFLAGS="-march=i686 -mtune=generic -O2 -pipe"
CXXFLAGS="-march=i686 -mtune=generic -O2 -pipe"
#LDFLAGS=""
#-- Make Flags: change this for DistCC/SMP systems
#MAKEFLAGS="-j2"
#############################
# BUILD ENVIRONMENT
#############################
#
# Defaults: BUILDENV=(fakeroot !distcc color !ccache)
# A negated environment option will do the opposite of the comments below.
#
#-- fakeroot: Allow building packages as a non-root user
#-- distcc: Use the Distributed C/C++/ObjC compiler
#-- color: Colorize output messages
#-- ccache: Use ccache to cache compilation
#
BUILDENV=(fakeroot !distcc color !ccache)
#
#-- If using DistCC, your MAKEFLAGS will also need modification. In addition,
#-- specify a space-delimited list of hosts running in the DistCC cluster.
#DISTCC_HOSTS=""
#############################
# GLOBAL PACKAGE OPTIONS
# These are default values for the options=() settings
#############################
#
# Default: OPTIONS=(strip docs libtool emptydirs zipman purge)
# A negated option will do the opposite of the comments below.
#
#-- strip: Strip symbols from binaries/libraries in STRIP_DIRS
#-- docs: Save doc directories specified by DOC_DIRS
#-- libtool: Leave libtool (.la) files in packages
#-- emptydirs: Leave empty directories in packages
#-- zipman: Compress manual (man and info) pages in MAN_DIRS with gzip
#-- purge: Remove files specified by PURGE_TARGETS
#
OPTIONS=(strip docs libtool emptydirs zipman purge)
#-- File integrity checks to use. Valid: md5, sha1, sha256, sha384, sha512
INTEGRITY_CHECK=(md5)
#-- Manual (man and info) directories to compress (if zipman is specified)
MAN_DIRS=({usr{,/local}{,/share},opt/*}/{man,info})
#-- Doc directories to remove (if !docs is specified)
DOC_DIRS=(usr/{,local/}{,share/}{doc,gtk-doc} opt/*/{doc,gtk-doc})
#-- Directories to be searched for the strip option (if strip is specified)
STRIP_DIRS=(bin lib sbin usr/{bin,lib,sbin,local/{bin,lib,sbin}} opt/*/{bin,lib,sbin})
#-- Files to be removed from all packages (if purge is specified)
PURGE_TARGETS=(usr/{,share}/info/dir .packlist *.pod)
#############################
# 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
#-- Packager: name/email of the person or organization building packages
#PACKAGER="John Doe <john@doe.com>"
#############################
# EXTENSION DEFAULTS
#############################
#
# WARNING: Do NOT modify these variables unless you know what you are
# doing.
#
PKGEXT='.pkg.tar.gz'
SRCEXT='.src.tar.gz'
# vim: set ft=sh ts=2 sw=2 et:
Obs.: O manual do
Arch Linux diz que o usuário mediano muito provavelmente não precisará mudar os valores de CARCH, CHOST e USE_FAKEROOT, no entanto, na condição de usuário iniciante, sinto-me a vontade para alterar as variáveis CFLAGS, CXXFLAGS, e MAKEFLAGS.
Para quem não sabe:
- CFLAGS: se refere às FLAGS de compilação na linguagem C;
- CXXFLAGS se refere às FLAGS de compilação na linguagem C++;
- MAKEFLAGS: configura o número de "jobs" executados simultaneamente. Depende da quantidade de núcleos do processador.
MAKEFLAGS
Para reduzir o tempo de compilação, aproveitando melhor os recursos do processador, configure esse parâmetro para o número 2 acrescido de 1 para cada núcleo extra de processador. Exemplo para um Dual Core:
MAKEFLAGS="-j3"
CFLAGS e CXXFLAGS
Por padrão esses são os valores dos parâmetros no Arch Linux:
- CFLAGS="-march=i686 -O2 -pipe"
- CXXFLAGS="-march=i686 -O2 -pipe"
Isso fornece os parâmetros de compilação para o GCC baseado na arquitetura e modelo do seu processador. Atribuir valores específicos a esses parâmetros pode, teoricamente, aumentar o desempenho dos processos.
Para usar uma "flag segura" acesse a página wiki do
Gentoo e consulte a FLAG específica para o seu modelo:
Safe_Cflags
Exemplo, para PC Intel Celeron existe:
- CFLAGS="-march=pentium2 -O2 -pipe -fomit-frame-pointer"
- CXXFLAGS="${CFLAGS}"
Para ver as informações do seu processador, execute:
cat /proc/cpuinfo
Aqui resultou no seguinte (apenas a parte que interessa):
vendor_id : AuthenticAMD
cpu family : 15
model : 44
model name : AMD Sempron(tm) Processor 2800+
Procurei no site e vi que o parâmetro para o meu caso é:
CFLAGS="-march=athlon-xp -O2 -pipe -fomit-frame-pointer"
CXXFLAGS="${CFLAGS}"
Após ter aplicado as suas modificações a compilação com o makepkg será mais eficiente.
Simples assim.
Obs.: Com certeza todo o trabalho seria mais fácil se o sistema tivesse sido construído dessa forma desde o início, após a instalação, antes de instalar o ambiente gráfico etc.
Sobre o artigo
Devido minha falta de conhecimento é possível que existam maneiras mais eficientes de se fazer o que foi exposto. Os usuários mais experientes poderiam dar dicas e sugestões para corrigir o artigo ou torná-lo mais econômico.
Esse simples guia introdutório, embora forneça o suficiente para executar o objetivo proposto de recompilar todos os pacotes do Arch Linux, serve mais para atiçar a curiosidade do usuário iniciante, pois o assunto está longe de ser esgotado. Cabe ao leitor pesquisar e se aprofundar no universo Arch Linux. Eis os links de referência para o artigo: