Trabalhando com o ports no OpenBSD

E ai galera, aqui eu vou abordar um pouco do trabalho com o ports no OpenBSD, são coisas simples que nós ajudam no dia-a-dia.

Vamos obter o ports, eu vou utilizar o ports do OpenBSD 5.4 que é a current no momento dia 04/12/2013

cd /usr
ftp ftp://openbsd.locaweb.com.br/pub/OpenBSD/5.4/ports.tar.gz
tar xzvf ports.tar.gz
rm -rf ports.tar.gz

Agora vamos alterar alguns caminhos padrões que o sistema ports utiliza por ex:

  • WRKOBJDIR: Este é o diretório de trabalho do nosso ports, geralmente ele fica em /usr/ports/pobj
  • DISTDIR: Este diretório contem os arquivos fontes depois de obtidos de um ftp, http ou afins
  • PACKAGE_REPOSITORY: Este diretório vai conter os novos pacotes binários depois de preparados.

Vamos colocar estes diretórios fora do ports, vamos deixar eles no /usr

vim /etc/mk.conf
WRKOBJDIR=/usr/obj/ports
DISTDIR=/usr/distfiles
PACKAGE_REPOSITORY=/usr/packages

Agora vamos verificar como fazemos uma pesquisa na arvore do ports

Vamos primeiro acessar o diretório do ports

cd /usr/ports

Agora vamos procurar o seguinte pacote rsnapshot

make search key=rsnapshot
Port:   rsnapshot-1.3.1p2
Path:   net/rsnapshot
Info:   remote filesystem snapshot utility
Maint:  Antoine Jacoutot <ajacoutot@openbsd.org>
Index:  net sysutils
L-deps:
B-deps: STEM->=1.21:textproc/groff net/rsync
R-deps: devel/p5-Lchown net/rsync
Archs:  any

A nossa pesquisa nos trouxe um overview da aplicação que foi encontrada com a palavra chave rsnapshot, caso tenhamos mais de uma aplicação com essa palavra chave, vamos ter vários resultados por pesquisa.

Aqui nos temos o nome do ports, o caminho dele dentro de /usr/ports, temos uma descrição do ports, temos quem é o mantenedor do ports e mais algumas informações úteis.

Podemos também fazer uma pesquisa no arquivo de INDEX que fica em /usr/ports

make key=rsnapshot describe
===> net/rsnapshot
rsnapshot-1.3.1p2|net/rsnapshot||remote filesystem snapshot utility|net/rsnapshot/pkg/DESCR|Antoine Jacoutot <ajacoutot@openbsd.org>|net sysutils||STEM->=1.21:textproc/groff net/rsync|devel/p5-Lchown net/rsync|any|y|y|y

Note que temos a mesma saída porém com uma formação diferente.

Para instalarmos um ports precisamos acessar o seu diretório

cd /usr/ports/net/rsnapshot

Agora precisamos mandar compilar ele e manda instalar

make install
===>  Checking files for rsnapshot-1.3.1p2
>> Fetch http://www.rsnapshot.org/downloads/rsnapshot-1.3.1.tar.gz
rsnapshot-1.3.1.tar.gz 100% |***************************|   210 KB    00:02
>> (SHA256) rsnapshot-1.3.1.tar.gz: OK
===> rsnapshot-1.3.1p2 depends on: rsync-* -> rsync-3.0.9p3
===> rsnapshot-1.3.1p2 depends on: groff->=1.21 -> groff-1.22.2p1
===>  Extracting for rsnapshot-1.3.1p2
===>  Patching for rsnapshot-1.3.1p2
===>  Configuring for rsnapshot-1.3.1p2
checking for a BSD-compatible install... /usr/bin/install -c -o root -g bin
checking whether build environment is sane... yes
checking for gawk... no
checking for mawk... no
checking for nawk... no
checking for awk... awk
checking whether make sets $(MAKE)... yes
checking whether make sets $(MAKE)... (cached) yes
checking for a BSD-compatible install... /usr/bin/install -c -o root -g bin
checking for perl... /usr/bin/perl
checking for rsync... /usr/local/bin/rsync
checking for cp... /bin/cp
checking for rm... /bin/rm
checking for ssh... /usr/bin/ssh
checking for logger... /usr/bin/logger
checking for du... /usr/bin/du
configure: creating ./config.status
config.status: creating Makefile
config.status: creating rsnapshot
config.status: creating rsnapshot-diff
config.status: creating rsnapshot.conf.default
config.status: creating t/support/etc/configtest.conf
config.status: creating t/support/etc/rsync.conf
config.status: creating t/support/etc/gnu_cp.conf
config.status: creating t/support/etc/relative_delete_bugfix.conf
config.status: creating t/configtest.t
config.status: creating t/rsync.t
config.status: creating t/gnu_cp.t
config.status: creating t/relative_delete_bugfix.t
===>  Building for rsnapshot-1.3.1p2
perl /usr/ports/infrastructure/bin/pkg_subst -DSAMPLES_DIR=/usr/local/share/examples/rsnapshot -DMACHINE_ARCH=amd64 -DARCH=amd64 -DHOMEPAGE=http://www.rsnapshot.org/ -D^PREFIX=/usr/local -D^SYSCONFDIR=/etc -DFLAVOR_EXT= -DFULLPKGNAME=rsnapshot-1.3.1p2 -DMAINTAINER=Antoine\ Jacoutot\ \<ajacoutot@openbsd.org\> -D^BASE_PKGPATH=net/rsnapshot -D^LOCALBASE=/usr/local -D^X11BASE=/usr/X11R6 -D^TRUEPREFIX=/usr/local -D^RCDIR=/etc/rc.d /usr/obj/ports/rsnapshot-1.3.1/rsnapshot-1.3.1/rsnapshot.1 /usr/obj/ports/rsnapshot-1.3.1/rsnapshot-1.3.1/README  /usr/obj/ports/rsnapshot-1.3.1/rsnapshot-1.3.1/rsnapshot-program.pl
cd . && /bin/sh ./config.status rsnapshot
config.status: creating rsnapshot
/usr/bin/pod2man -c '' -n 'rsnapshot' -r '' rsnapshot > rsnapshot.1
/usr/bin/pod2man -c '' -n 'rsnapshot-diff' -r '' rsnapshot-diff > rsnapshot-diff.1
===>  Faking installation for rsnapshot-1.3.1p2
test -z "/usr/local/bin" || /bin/sh ./mkinstalldirs "/usr/obj/ports/rsnapshot-1.3.1/fake-amd64/usr/local/bin"
 install -c -o root -g bin -m 555 'rsnapshot' '/usr/obj/ports/rsnapshot-1.3.1/fake-amd64/usr/local/bin/rsnapshot'
 install -c -o root -g bin -m 555 'rsnapshot-diff' '/usr/obj/ports/rsnapshot-1.3.1/fake-amd64/usr/local/bin/rsnapshot-diff'
test -z "/usr/local/share/examples/rsnapshot" || /bin/sh ./mkinstalldirs "/usr/obj/ports/rsnapshot-1.3.1/fake-amd64/usr/local/share/examples/rsnapshot"
mkdir /usr/obj/ports/rsnapshot-1.3.1/fake-amd64/usr/local/share/examples/rsnapshot
 install -c -o root -g bin -m 444 'rsnapshot.conf.default' '/usr/obj/ports/rsnapshot-1.3.1/fake-amd64/usr/local/share/examples/rsnapshot/rsnapshot.conf.default'
test -z "/usr/local/man/man1" || /bin/sh ./mkinstalldirs "/usr/obj/ports/rsnapshot-1.3.1/fake-amd64/usr/local/man/man1"
 install -c -o root -g bin -m 444 './rsnapshot.1' '/usr/obj/ports/rsnapshot-1.3.1/fake-amd64/usr/local/man/man1/rsnapshot.1'
 install -c -o root -g bin -m 444 './rsnapshot-diff.1' '/usr/obj/ports/rsnapshot-1.3.1/fake-amd64/usr/local/man/man1/rsnapshot-diff.1'
install -d -o root -g bin -m 755 /usr/obj/ports/rsnapshot-1.3.1/fake-amd64/usr/local/share/examples/rsnapshot/utils
systrace: deny user: root, prog: /usr/bin/install, pid: 22950(0)[15143], policy: /usr/bin/make, filters: 244, syscall: native-fswrite(136), filename: /usr
systrace: deny user: root, prog: /usr/bin/install, pid: 22950(0)[15143], policy: /usr/bin/make, filters: 244, syscall: native-fswrite(136), filename: /usr/obj
systrace: deny user: root, prog: /usr/bin/install, pid: 22950(0)[15143], policy: /usr/bin/make, filters: 244, syscall: native-fswrite(136), filename: /usr/obj/ports
install -d -o root -g bin -m 755 /usr/obj/ports/rsnapshot-1.3.1/fake-amd64/usr/local/share/examples/rsnapshot/utils/rsnapshotdb
systrace: deny user: root, prog: /usr/bin/install, pid: 28300(0)[15143], policy: /usr/bin/make, filters: 244, syscall: native-fswrite(136), filename: /usr
systrace: deny user: root, prog: /usr/bin/install, pid: 28300(0)[15143], policy: /usr/bin/make, filters: 244, syscall: native-fswrite(136), filename: /usr/obj
systrace: deny user: root, prog: /usr/bin/install, pid: 28300(0)[15143], policy: /usr/bin/make, filters: 244, syscall: native-fswrite(136), filename: /usr/obj/ports
install -c -o root -g bin -m 444 /usr/obj/ports/rsnapshot-1.3.1/rsnapshot-1.3.1/README /usr/obj/ports/rsnapshot-1.3.1/fake-amd64/usr/local/share/examples/rsnapshot
install -c -o root -g bin -m 444 /usr/obj/ports/rsnapshot-1.3.1/rsnapshot-1.3.1/utils/README /usr/obj/ports/rsnapshot-1.3.1/fake-amd64/usr/local/share/examples/rsnapshot/utils
install -c -o root -g bin -m 444 /usr/obj/ports/rsnapshot-1.3.1/rsnapshot-1.3.1/utils/rsnapshot-copy /usr/obj/ports/rsnapshot-1.3.1/fake-amd64/usr/local/share/examples/rsnapshot/utils
install -c -o root -g bin -m 444 /usr/obj/ports/rsnapshot-1.3.1/rsnapshot-1.3.1/utils/rsnaptar /usr/obj/ports/rsnapshot-1.3.1/fake-amd64/usr/local/share/examples/rsnapshot/utils
install -c -o root -g bin -m 444 /usr/obj/ports/rsnapshot-1.3.1/rsnapshot-1.3.1/utils/*.pl /usr/obj/ports/rsnapshot-1.3.1/fake-amd64/usr/local/share/examples/rsnapshot/utils
install -c -o root -g bin -m 444 /usr/obj/ports/rsnapshot-1.3.1/rsnapshot-1.3.1/utils/*.sh /usr/obj/ports/rsnapshot-1.3.1/fake-amd64/usr/local/share/examples/rsnapshot/utils
install -c -o root -g bin -m 444 /usr/obj/ports/rsnapshot-1.3.1/rsnapshot-1.3.1/utils/rsnapshotdb/* /usr/obj/ports/rsnapshot-1.3.1/fake-amd64/usr/local/share/examples/rsnapshot/utils/rsnapshotdb
===>  Building package for rsnapshot-1.3.1p2
Create /usr/packages/amd64/no-arch/rsnapshot-1.3.1p2.tgz
Link to /usr/packages/amd64/all/rsnapshot-1.3.1p2.tgz
Link to /usr/packages/amd64/ftp/rsnapshot-1.3.1p2.tgz
Link to /usr/packages/amd64/cdrom/rsnapshot-1.3.1p2.tgz
===> rsnapshot-1.3.1p2 depends on: p5-Lchown-* - not found
===>  Verifying install for p5-Lchown-* in devel/p5-Lchown
===>  Checking files for p5-Lchown-1.01p2
>> Fetch http://mirror.sov.uk.goscomb.net/CPAN/modules/by-module/../by-authors/id/N/NC/NCLEATON/Lchown-1.01.tar.gz
Lchown-1.01.tar.gz 100% |*******************************|  4018       00:00
>> (SHA256) Lchown-1.01.tar.gz: OK
===> p5-Lchown-1.01p2 depends on: groff->=1.21 -> groff-1.22.2p1
===>  Verifying specs: c perl c perl
===>  found c.69.0 perl.13.0
===>  Extracting for p5-Lchown-1.01p2
===>  Patching for p5-Lchown-1.01p2
===>  Configuring for p5-Lchown-1.01p2
Created MYMETA.yml and MYMETA.json
Creating new 'Build' script for 'Lchown' version '1.01'
Created MYMETA.yml and MYMETA.json
Creating new 'Build' script for 'Lchown' version '1.01'
===>  Building for p5-Lchown-1.01p2
Building Lchown
cc -I/usr/libdata/perl5/amd64-openbsd/5.16.3/CORE -DXS_VERSION="1.01" -DVERSION="1.01" -DPIC -fPIC -c -DNO_LOCALE_NUMERIC -DNO_LOCALE_COLLATE -fno-strict-aliasing -fno-delete-null-pointer-checks -pipe -fstack-protector -I/usr/local/include -O2 -pipe -O2 -o lib/Lchown.o lib/Lchown.c
ExtUtils::Mkbootstrap::Mkbootstrap('blib/arch/auto/Lchown/Lchown.bs')
cc -shared -fPIC -fstack-protector -o blib/arch/auto/Lchown/Lchown.so lib/Lchown.o
===>  Faking installation for p5-Lchown-1.01p2
Building Lchown
Files found in blib/arch: installing files in blib/lib into architecture dependent library tree
Installing /usr/obj/ports/p5-Lchown-1.01/fake-amd64/usr/local/libdata/perl5/site_perl/amd64-openbsd/auto/Lchown/Lchown.bs
Installing /usr/obj/ports/p5-Lchown-1.01/fake-amd64/usr/local/libdata/perl5/site_perl/amd64-openbsd/auto/Lchown/Lchown.so
Installing /usr/obj/ports/p5-Lchown-1.01/fake-amd64/usr/local/libdata/perl5/site_perl/amd64-openbsd/Lchown.pm
Installing /usr/obj/ports/p5-Lchown-1.01/fake-amd64/usr/local/man/man3p/Lchown.3p
===>  Building package for p5-Lchown-1.01p2
Create /usr/packages/amd64/all/p5-Lchown-1.01p2.tgz
Link to /usr/packages/amd64/ftp/p5-Lchown-1.01p2.tgz
Link to /usr/packages/amd64/cdrom/p5-Lchown-1.01p2.tgz
===>  Cleaning for p5-Lchown-1.01p2
===> p5-Lchown-1.01p2 depends on: groff->=1.21 -> groff-1.22.2p1
===>  Verifying specs: c perl
===>  found c.69.0 perl.13.0
===>  Installing p5-Lchown-1.01p2 from /usr/packages/amd64/all/
p5-Lchown-1.01p2: ok
===> Returning to build of rsnapshot-1.3.1p2
===> rsnapshot-1.3.1p2 depends on: p5-Lchown-* -> p5-Lchown-1.01p2
===>  Installing rsnapshot-1.3.1p2 from /usr/packages/amd64/all/
rsnapshot-1.3.1p2: ok

Temos o nosso ports compilado e instalado e pronto para utilizar, agora temos o seguinte ele acabou gerando vários arquivo temporários isso ocupa espaço então vamos mandar limpar

make clean
===>  Cleaning for rsnapshot-1.3.1p2

Agora podemos mandar limpar o arquivo que foi obtido via ftp

make clean=packages
===>  Cleaning for rsnapshot-1.3.1p2
rm -f /usr/packages/amd64/all/rsnapshot-1.3.1p2.tgz /usr/packages/amd64/no-arch/rsnapshot-1.3.1p2.tgz /usr/packages/amd64/ftp/rsnapshot-1.3.1p2.tgz /usr/packages/amd64/cdrom/rsnapshot-1.3.1p2.tgz  /usr/ports/update/amd64/rsnapshot-1.3.1p2

Se eu precisar limpar os pacotes dependência podemos fazer da seguinte forma

make clean=depends
===>  Cleaning for groff-1.22.2p1
===>  Cleaning for p5-Lchown-1.01p2
===>  Cleaning for rsync-3.0.9p3
===>  Cleaning for rsnapshot-1.3.1p2

Agora vamos ver algo muito importando os flavors que são como versões de um ports, vamos analisar o ports do vim

cd /usr/ports/editors/vim

Agora vamos listar os seus flavors

make show=FLAVORS
huge gtk2 athena motif no_x11 perl python ruby

Note que temos várias opções para o nosso vim, eu sempre utilizo o no_x11 pois não utilizo ambiente gráfico, para instalarmos o ports com está opção podemos fazer da seguinte forma

env FLAVOR=no_x11 make install

Agora imagine que você precisa instalar o python e com isso precisamos saber quais versões eu tenho disponível no meu ports podemos fazer da seguinte forma

cd /usr/ports/lang/python && make show=PACKAGES

===> lang/python/2.7

===> lang/python/3.3

Note que temos múltiplas versões do python com isso temos um subdiretório para cada uma.

Agora vamos verificar o que cada versão aceita de subpacotes

cd /usr/ports/lang/python && make show=MULTI_PACKAGES
===> lang/python/2.7
-main -tests -tools -gdbm -idle -tkinter -bsddb
===> lang/python/3.3
-main -tests -gdbm -idle -tkinter

Note que agora temos vários subpacotes do nosso python para mandarmos instalar um subpacote podemos fazer da seguinte forma

cd /usr/ports/lang/python/3.3 && env SUBPACKAGE="-tests" make install

Agora se eu quiser instalar todos os subpacotes de um ports podemos fazer da seguinte forma.

cd /usr/ports/lang/python/3.3 && make install-all

Para mandarmos deinstalar um ports podemos fazer da seguinte forma

cd /usr/ports/lang/python/3.3 && make unistall

Para mandarmos reinstalar um ports podemos fazer da seguinte forma

cd /usr/ports/lang/python/3.3 && make reinstall

Para atualizar o ports podemos fazer o seguinte

Vamos exportar a variável do CVSROOT

export CVSROOT=anoncvs@anoncvs.openbsd.org.ar:/cvs 

Agora vamos acessar o usr que é o local do ports

cd /usr

Agora vamos obter o ports só precisamos aceitar a chave do cvs

cvs -d$CVSROOT checkout -P ports

Agora temos o nosso ports atualizado.

Referências