저는 매우 간단한 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/rules
dh_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
로 설정하여 설치를 시도했습니다. 위와 같이 변경하면 재정의를 완전히 중단할 수 있습니다./usr
dh_auto_install
prefix
/usr
Makefile
dh_auto_install
(귀하의 에 약간의 오타가 있습니다 . 대신 Makefile
이어야 합니다 .)$(LDFLAGS)
$(LDCFLAGS)
당신은 찾을 수 있습니다데비안 업스트림 가이드효과가있다.