dh_usrlocal:… não é um diretório

1

Estou trabalhando em uma configuração do Makefile para criar um pacote debian:

.PHONY: package
package: $(PACKAGE_TARGETS)

build/%.changes: ../%.changes
        mkdir -p build
        for f in '<$< awk 'BEGIN { files = 0; } { if (files) print $$5; } /^Files:/ { files = 1; }''; do \
            test -f build/$$f || mv ../$$f build/; \
        done
        mv $< $@

../%.changes:
        dpkg-buildpackage -rfakeroot -b -uc

Tudo estava funcionando bem com a compilação até que eu fiz um commit muito pequeno. Que adiciona um arquivo executável em /src/bin/app-cli . Em seguida, referencia esse executável no arquivo de instalação do debian debian/app.install :

src/bin/app-cli usr/local/bin

Por algum motivo, fazer essa alteração fez com que o sistema de compilação gerasse o erro:

dh_usrlocal: debian/app/usr/local/bin/app-cli is not a directory
rmdir: failed to remove 'debian/app/usr/local/bin': Directory not empty
dh_usrlocal: rmdir debian/app/usr/local/bin returned exit code 1
make[1]: *** [binary] Error 1
make[1]: Leaving directory '/var/lib/jenkins/data/workspace/app-VBJPWWOTACEEMDGNNWMFS4QU6K4EPG5PJRESMEIZPZL4GAUCKWVQ'
dpkg-buildpackage: error: fakeroot debian/rules binary gave error exit status 2
make: *** [../app_0.0.1-13-master_amd64.changes] Error 2

Alguém sabe que este novo arquivo está sendo tratado como diretório pelo Debian Helper?

    
por Philip Kirkbride 08.12.2017 / 20:03

2 respostas

1

A dh_usrlocal manpage pode ajudar você a entender o que está acontecendo.

Pacotes Debian têm permissão para instalar diretórios sob /usr/local , mas a melhor maneira de fazer isso é usar scripts de mantenedor. dh_usrlocal automatiza isso transformando diretórios em /usr/local em trechos de script do mantenedor. Ele assume que esses diretórios estão vazios, já que os pacotes Debian não têm permissão para instalar arquivos em /usr/local .

Em seu pacote, dh_install segue suas instruções e copia app-cli para /usr/local/bin (dentro do seu pacote). dh_usrlocal é executado, vê o diretório, cria o script de mantenedor apropriado e tenta excluir o diretório (por isso, ele não é fornecido como tal no pacote) - e falha, pois contém um arquivo.

    
por 08.12.2017 / 21:26
0

Não sei por que, mas a instalação do executável em /usr/app-cli resolveu o problema.

Eu acho que algo a ver com pacotes Debian não tendo acesso a usr/local/bin/ .

    
por 08.12.2017 / 20:18