Emita com "make distcheck" no projeto GNU autotools relativo à geração de um manual

3

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
    
por Kusalananda 01.04.2018 / 21:53

2 respostas

0

Solução: Para obter corretamente a fonte do manual ao executar uma compilação de VPATH, a regra para isso na parte relevante do arquivo Makefile.am deve ser semelhante a

shell.man:      $(srcdir)/shell.mdoc
        $(mandoc) -T man $(srcdir)/shell.mdoc >shell.man

Ao especificar $(srcdir)/shell.mdoc , make encontrará o arquivo na árvore de distribuição mesmo quando a árvore de construção estiver em um local diferente da árvore de distribuição.

    
por 02.04.2018 / 14:16
0
As regras

automake suportam -local e -hook que são executadas antes e depois de alguns dos vários destinos. Aparentemente, não há distcheck-local , então outra ideia seria em seu Makefile.am usar o dist-hook para executar algo após o dist :

dist-hook:
        cp something $(distdir)/somewhere
    
por 01.04.2018 / 22:22