Eu pensei que talvez o problema veio da minha versão zsh, então eu purgou o pacote zsh
e compilou da fonte:
% sudo aptitude install git-core gcc make autoconf yodl libncursesw5-dev texinfo
% git clone git://zsh.git.sf.net/gitroot/zsh/zsh
% cd zsh
% git checkout zsh-5.3.1
% ./Util/preconfig
% ./configure --build=x86_64-linux-gnu \
--prefix=/usr \
--includedir=/usr/include \
--mandir=/usr/share/man \
--infodir=/usr/share/info \
--sysconfdir=/etc \
--localstatedir=/var \
--libdir=/usr/lib/x86_64-linux-gnu \
--libexecdir=/usr/lib/x86_64-linux-gnu \
--bindir=/bin \
LDFLAGS="-Wl,--as-needed -g" \
--enable-maildir-support \
--enable-etcdir=/etc/zsh \
--enable-function-subdirs \
--enable-site-fndir=/usr/local/share/zsh/site-functions \
--enable-fndir=/usr/share/zsh/functions \
--with-tcsetpgrp \
--with-term-lib="ncursesw tinfo" \
--enable-cap \
--enable-pcre \
--enable-readnullcmd=pager \
--enable-custom-patchlevel=Debian \
--enable-additional-fpath=/usr/share/zsh/vendor-functions,/usr/share/zsh/vendor-completions \
--disable-ansi2knr
Encontrei as dependências e as opções de configuração lendo o arquivo INSTALL
, bem como a essência encontrada no Google:
https://gist.github.com/nicoulaj/715855
… e observando como o Ubuntu desenvolve os pacotes zsh
mais recentes:
https://launchpadlibrarian.net/280509421/buildlog_ubuntu-yakkety-amd64.zsh_5.2-5ubuntu1_BUILDING.txt.gz
Havia algumas opções que foram escritas duas vezes ou não foram reconhecidas pelo zsh, então eu as removi.
O valor que o Ubuntu deu para o LDFLAGS
não funcionou na minha máquina, então eu copiei
o da essência no Github. As opções que mantive são descritas por ./configure --help
:
--build=BUILD configure for building on BUILD [guessed]
--prefix=PREFIX install architecture-independent files in PREFIX
[/usr/local]
--includedir=DIR C header files [PREFIX/include]
--mandir=DIR man documentation [DATAROOTDIR/man]
--infodir=DIR info documentation [DATAROOTDIR/info]
--sysconfdir=DIR read-only single-machine data [PREFIX/etc]
--localstatedir=DIR modifiable single-machine data [PREFIX/var]
--libdir=DIR object code libraries [EPREFIX/lib]
--libexecdir=DIR program executables [EPREFIX/libexec]
--bindir=DIR user executables [EPREFIX/bin]
LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
nonstandard directory <lib dir>
--enable-maildir-support
enable maildir support in MAIL and MAILPATH
--enable-etcdir=DIR the default directory for global zsh scripts
--enable-function-subdirs
install functions in subdirectories
--enable-site-fndir=DIR same for site functions (not version specific)
--enable-fndir=DIR the directory in which to install functions
--with-tcsetpgrp assumes that tcsetpgrp() exists and works correctly
--with-term-lib=LIBS search space-separated LIBS for terminal handling
--enable-cap enable the search for POSIX capabilities (may
require additional headers to be added by hand)
--enable-pcre enable the search for the pcre library (may create
run-time library dependencies)
--enable-readnullcmd=PAGER
pager used when READNULLCMD is not set
--enable-custom-patchlevel
set a custom ZSH_PATCHLEVEL value
--enable-additional-fpath=DIR
add directories to default function path
--enable-ansi2knr translate source to K&R C before compiling
A compilação funcionou, mas houve 2 falhas entre os 48 testes realizados pelo comando make check
:
% make
% make check
…
**************************************
46 successful test scripts, 2 failures, 0 skipped
**************************************
Makefile:187: recipe for target 'check' failed
make[1]: *** [check] Error 1
make[1]: Leaving directory '/home/user/GitRepos/zsh/Test'
Makefile:263: recipe for target 'check' failed
make: *** [check] Error 2
Eu não consegui me livrar deles.
Por fim, em vez de usar make install
para instalar o binário, usei checkinstall
para ter um .deb
que eu possa
remove se eu precisar mudar o shell no futuro (com dpkg -r zsh
):
% sudo checkinstall
Durante a instalação, tive que dar uma breve descrição (usei shell with lots of features
),
e mais importante eu tive que dar uma versão. Sem uma versão compatível com a política do Debian,
checkinstall
não geraria .deb
. Eu olhei para a saída de apt-cache policy zsh
para verificar
qual é o esquema de nomes usado pelo Debian, e escolheu 5.3.1-1ubuntu2
.
% echo /bin/zsh >> /etc/shells
% chsh → /bin/zsh
Essas duas linhas foram necessárias para fazer o Ubuntu reconhecer /bin/zsh
como um shell de login válido e torná-lo meu shell padrão.
Agora, a versão do shell é 5.3.1
(em vez de 5.1.1
):
% zsh --version
zsh 5.3.1 (x86_64-pc-linux-gnu)
E o shell é iniciado rapidamente (em torno de 0.04s
):
% repeat 10 =time zsh -i -c exit
0.06user 0.03system 0:00.12elapsed 80%CPU (0avgtext+0avgdata 5592maxresident)k
0inputs+0outputs (0major+5668minor)pagefaults 0swaps
0.06user 0.01system 0:00.09elapsed 77%CPU (0avgtext+0avgdata 5480maxresident)k
0inputs+0outputs (0major+5634minor)pagefaults 0swaps
0.04user 0.01system 0:00.07elapsed 82%CPU (0avgtext+0avgdata 5736maxresident)k
0inputs+0outputs (0major+5641minor)pagefaults 0swaps
0.04user 0.01system 0:00.07elapsed 77%CPU (0avgtext+0avgdata 5652maxresident)k
0inputs+0outputs (0major+5645minor)pagefaults 0swaps
0.03user 0.03system 0:00.07elapsed 82%CPU (0avgtext+0avgdata 5736maxresident)k
0inputs+0outputs (0major+5634minor)pagefaults 0swaps
0.04user 0.01system 0:00.07elapsed 78%CPU (0avgtext+0avgdata 5548maxresident)k
0inputs+0outputs (0major+5624minor)pagefaults 0swaps
0.04user 0.02system 0:00.07elapsed 78%CPU (0avgtext+0avgdata 5612maxresident)k
0inputs+0outputs (0major+5655minor)pagefaults 0swaps
0.04user 0.01system 0:00.07elapsed 77%CPU (0avgtext+0avgdata 5780maxresident)k
0inputs+0outputs (0major+5624minor)pagefaults 0swaps
0.03user 0.02system 0:00.07elapsed 78%CPU (0avgtext+0avgdata 5584maxresident)k
0inputs+0outputs (0major+5641minor)pagefaults 0swaps
0.03user 0.02system 0:00.07elapsed 78%CPU (0avgtext+0avgdata 5668maxresident)k
Na primeira vez que compilei, esqueci de mudar para o ramo de lançamento mais recente, então estava em master
.
Esta versão de desenvolvimento de zsh
teve um tempo de partida ainda pior do que a versão dos repositórios do Ubuntu.
Em torno de 0.42s
para iniciar um shell. Mas, novamente, somente se eu adicionasse um diretório a fpath
em zshrc
e criasse um arquivo dentro do último (um simples touch file
era suficiente).
Então, pergunto-me se o problema veio das opções de compilação ou da versão de lançamento. Espero que a versão que eu compile permaneça rápida…
Obrigado @ thrigh e @ Stéphane Chazelas por me ajudar nos comentários.