Estou usando autoconf
e automake
para criar um projeto minúsculo.
Para o manual do projeto, eu usei o mdoc
format nativo do OpenBSD, e o manual man
-formatted que pode ser instalado é gerado a partir disso usando o utilitário mandoc
. O manual man
-formatted será instalado como o manual real com make install
, já que alguns sistemas não geram mdoc
corretamente, ou de forma alguma.
No diretório doc
do projeto, tenho um arquivo Makefile.am
que atualmente se parece com o seguinte (o manual é para um utilitário chamado shell
):
dist_man1_MANS= shell.man
EXTRA_DIST= shell.mdoc
shell.man: shell.mdoc
$(mandoc) -T man shell.mdoc >shell.man
$(mandoc)
será expandido adequadamente para o caminho completo do formatador mandoc
(essa variável é definida pelo script configure
).
Isso permite que eu execute make dist
, que cria shell.man
e, em seguida, cria um arquivo compactado tar
contendo o manual de origem mdoc
e o manual man
gerado juntamente com o restante dos arquivos de distribuição do projeto:
$ tar tzf shell-toolbox-20180401.tar.gz
...
shell-toolbox-20180401/doc/Makefile.am
shell-toolbox-20180401/doc/shell.man
shell-toolbox-20180401/doc/Makefile.in
shell-toolbox-20180401/doc/shell.mdoc
Esse tar
archive pode ser usado posteriormente para criar e instalar com êxito o projeto e seu manual. Até aí tudo bem.
No entanto, se eu correr make distcheck
(porque eu gostaria de ter certeza de que funciona de forma absolutamente positiva):
$ make distcheck
...
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /usr/local/bin/gmkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for mandoc... /usr/bin/mandoc
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating doc/Makefile
config.status: creating src/shell
Making all in src
Making all in doc
/usr/bin/mandoc -T man shell.mdoc >shell.man
mandoc: shell.mdoc: ERROR: No such file or directory
*** Error 3 in shell-toolbox-20180401/_build/sub/doc (Makefile:459 'shell.man')
*** Error 1 in shell-toolbox-20180401/_build/sub (Makefile:345 'all-recursive')
*** Error 1 in /home/myself/local/build/shell-toolbox (Makefile:576 'distcheck')
Parece que o arquivo de origem mdoc
não está disponível no diretório de criação quando o manual precisa ser criado:
$ ls shell-toolbox-20180401/_build/sub/doc
total 32
-rw-r--r-- 1 myself myself 14989 Apr 1 21:35 Makefile
-rw-r--r-- 1 myself myself 0 Apr 1 21:35 shell.man
O arquivo shell.man
com comprimento zero vem da falha mandoc
da execução.
A origem está disponível no arquivo descompactado, mas não é copiada para o diretório _build/sub/doc
:
$ ls -l shell-toolbox-20180401/doc
total 48
-r--r--r-- 1 myself myself 178 Apr 1 21:23 Makefile.am
-r--r--r-- 1 myself myself 13925 Apr 1 21:23 Makefile.in
-r--r--r-- 1 myself myself 3443 Apr 1 21:27 shell.man
-r--r--r-- 1 myself myself 3319 Apr 1 18:54 shell.mdoc
Pergunta : Qual automake
magic eu preciso aplicar para obter make distcheck
para copiar corretamente a mdoc
source para o diretório de criação antes de tentar gerar o man
-formatted manual? Eu estou procurando uma maneira "adequada" de fazer isso, não um hack.
Eu tentei usar
man1_SOURCES= shell.mdoc
mas isso faz com que automake
reclame com
doc/Makefile.am:2: warning: variable 'man1_SOURCES' is defined but no program or
doc/Makefile.am:2: library has 'man1' as canonical name (possible typo)
Outra maneira de provocar esse erro é fazer manualmente uma compilação do VPATH (que é basicamente o que está acontecendo quando fazendo make distcheck
):
$ make distclean
$ mkdir t
$ cd t
$ ../configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /usr/local/bin/gmkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for mandoc... /usr/bin/mandoc
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating doc/Makefile
config.status: creating src/shell
$ make
Making all in src
Making all in doc
/usr/bin/mandoc -T man shell.mdoc >shell.man
mandoc: shell.mdoc: ERROR: No such file or directory
*** Error 3 in doc (Makefile:459 'shell.man')
*** Error 1 in /home/myself/local/build/shell-toolbox/t (Makefile:345 'all-recursive')
$ ls -l doc
total 32
-rw-r--r-- 1 myself myself 14589 Apr 1 22:42 Makefile
-rw-r--r-- 1 myself myself 0 Apr 1 22:42 shell.man