대상이 /usr/local/bin이면 Debian 패키지 빌드가 실패합니다.

대상이 /usr/local/bin이면 Debian 패키지 빌드가 실패합니다.

저는 매우 간단한 C 프로젝트를 만들었고 이 프로젝트에서 데비안 패키지를 만들고 싶습니다. Makefile을 통해 C 프로젝트를 수동으로 빌드하는 것은 예상대로 작동하며 바이너리를 빌드하고 /usr/local/bin에 설치할 수 있습니다. 그러나 데비안 패키지를 빌드하려고 하면 실패합니다. dh_usrlocal: error: debian/myhelloworld/usr/local/bin/myhelloworld is not a directory

Makefile은 다음과 같습니다.

prefix = /usr/local/bin

all: src/myhelloworld

src/hello: src/myhelloworld.c
    @echo "CFLAGS=$(CFLAGS)" | \
        fold -s -w 70 | \
        sed -e 's/^/# /'
    $(CC) $(CPPFLAGS) $(CFLAGS) $(LDCFLAGS) -o $@ $^

install: src/myhelloworld
    install -D src/myhelloworld \
        $(DESTDIR)$(prefix)/myhelloworld

clean:
    -rm -f src/myhelloworld

distclean: clean

uninstall:
    -rm -f $(DESTDIR)$(prefix)/myhelloworld

.PHONY: all install clean distclean uninstall

debian 디렉토리가 생성되고 이를 debmake사용 debuild하여 빌드합니다.

프로젝트 구조는 다음과 같습니다.

.
├── debian
│   ├── changelog
│   ├── control
│   ├── copyright
│   ├── debhelper-build-stamp
│   ├── files
│   ├── myhelloworld
│   │   ├── DEBIAN
│   │   │   ├── control
│   │   │   └── md5sums
│   │   └── usr
│   │       ├── myhelloworld
│   │       └── share
│   │           └── doc
│   │               └── myhelloworld
│   │                   ├── changelog.Debian.gz
│   │                   ├── copyright
│   │                   └── README.Debian
│   ├── myhelloworld.debhelper.log
│   ├── myhelloworld.substvars
│   ├── patches
│   │   └── series
│   ├── README.Debian
│   ├── rules
│   ├── source
│   │   ├── format
│   │   └── local-options
│   └── watch
├── LICENSE
├── Makefile
└── src
    ├── myhelloworld
    └── myhelloworld.c

debian/rulesdh_auto_install을 무시하도록 기본 파일을 변경해 보았습니다 .

%:
    dh $@  

override_dh_auto_install:
    dh_auto_install -- prefix=/usr/local/bin

이것도 실패했습니다. .dll 파일에 바이너리가 존재하는지 확인했습니다 debian/myhelloworld/usr/local/bin.

접두어 를 /usr/bin./usr/bin

오류 메시지를 보면 debuild가 myhelloworld디렉터리를 예상하고 있는 것 같지만 이는 바이너리 파일입니다. 그렇다면 목적지 /usr/local/bin에서 디빌드가 실패하는 이유는 무엇입니까?

빌드 로그:

ep@ep-xps:~/sandbox/myhelloworld-1.0$ debuild 
 dpkg-buildpackage -us -uc -ui
dpkg-buildpackage: info: source package myhelloworld
dpkg-buildpackage: info: source version 1.0-1
dpkg-buildpackage: info: source distribution UNRELEASED
dpkg-buildpackage: info: source changed by Erik <>
 dpkg-source --before-build .
dpkg-buildpackage: info: host architecture amd64
 fakeroot debian/rules clean
dh clean  
   dh_auto_clean
        make -j12 distclean
make[1]: Entering directory '/home/ep/sandbox/myhelloworld-1.0'
rm -f src/myhelloworld
make[1]: Leaving directory '/home/ep/sandbox/myhelloworld-1.0'
   dh_clean
 dpkg-source -b .
dpkg-source: warning: no source format specified in debian/source/format, see dpkg-source(1)
dpkg-source: info: using source format '1.0'
dpkg-source: info: building myhelloworld using existing myhelloworld_1.0.orig.tar.gz
dpkg-source: info: building myhelloworld in myhelloworld_1.0-1.diff.gz
dpkg-source: warning: newly created empty file 'LICENSE' will not be represented in diff
dpkg-source: warning: the diff modifies the following upstream files: 
 Makefile
 src/myhelloworld.c
dpkg-source: info: use the '3.0 (quilt)' format to have separate and documented changes to upstream files, see dpkg-source(1)
dpkg-source: info: building myhelloworld in myhelloworld_1.0-1.dsc
 debian/rules build
dh build  
   dh_update_autotools_config
   dh_autoreconf
   dh_auto_configure
   dh_auto_build
        make -j12 "INSTALL=install --strip-program=true"
make[1]: Entering directory '/home/ep/sandbox/myhelloworld-1.0'
cc -g -O2 -ffile-prefix-map=/home/ep/sandbox/myhelloworld-1.0=. -flto=auto -ffat-lto-objects -flto=auto -ffat-lto-objects -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -flto=auto -ffat-lto-objects -flto=auto -Wl,-z,relro  src/myhelloworld.c   -o src/myhelloworld
make[1]: Leaving directory '/home/ep/sandbox/myhelloworld-1.0'
   dh_auto_test
   create-stamp debian/debhelper-build-stamp
 fakeroot debian/rules binary
dh binary  
   dh_testroot
   dh_prep
   debian/rules override_dh_auto_install
make[1]: Entering directory '/home/ep/sandbox/myhelloworld-1.0'
dh_auto_install -- prefix=/usr/local/bin
        make -j12 install DESTDIR=/home/ep/sandbox/myhelloworld-1.0/debian/myhelloworld AM_UPDATE_INFO_DIR=no "INSTALL=install --strip-program=true" prefix=/usr/local/bin
make[2]: Entering directory '/home/ep/sandbox/myhelloworld-1.0'
install -D src/myhelloworld \
        /home/ep/sandbox/myhelloworld-1.0/debian/myhelloworld/usr/local/bin/myhelloworld
make[2]: Leaving directory '/home/ep/sandbox/myhelloworld-1.0'
make[1]: Leaving directory '/home/ep/sandbox/myhelloworld-1.0'
   dh_installdocs
   dh_installchangelogs
   dh_perl
   dh_usrlocal
dh_usrlocal: error: debian/myhelloworld/usr/local/bin/myhelloworld is not a directory
make: *** [debian/rules:9: binary] Error 25
dpkg-buildpackage: error: fakeroot debian/rules binary subprocess returned exit status 2
debuild: fatal error at line 1182:
dpkg-buildpackage -us -uc -ui failed


답변1

소포는 파일을 보낼 수 없습니다/usr/local, 디렉토리에만 적용되며 dh_usrlocal.

가장 좋은 해결책은 데비안 규칙을 따르고 다음에 설치하는 것입니다 /usr.

override_dh_auto_install:
        dh_auto_install -- prefix=/usr/bin

에 설치하려면 /usr/local/bin다음을 재정의하세요 dh_usrlocal.

override_dh_usrlocal:

접두사는 일반적으로 다양한 디렉토리가 배치되는 "루트"로 이해되므로 다음을 수행할 수 있습니다.

prefix = /usr/local


install: src/myhelloworld
        install -D src/myhelloworld \
            $(DESTDIR)$(prefix)/bin/myhelloworld

그래서 처음에 : 을 myhelloworld로 설정하여 설치를 시도했습니다. 위와 같이 변경하면 재정의를 완전히 중단할 수 있습니다./usrdh_auto_installprefix/usrMakefiledh_auto_install

(귀하의 에 약간의 오타가 있습니다 . 대신 Makefile이어야 합니다 .)$(LDFLAGS)$(LDCFLAGS)

당신은 찾을 수 있습니다데비안 업스트림 가이드효과가있다.

관련 정보