저는 현재 C, C++, Python 등 여러 언어로 작성된 소스 코드가 포함된 대규모 프로젝트를 구축하고 있습니다. 나는 최근 적절한 설치를 위해 자동 도구를 처리하는 데 (고통스럽게) 관리했습니다. 다음 단계는 우리 프로젝트가 debianstretch에서 실행되도록 설계되었으므로 .deb를 생성하는 것입니다.
이 작업을 수행하기 위해 여러 가지 방법을 시도했지만 제대로 작동하지 않습니다.
checkinstall에 의해 생성된 Tree.deb:
unpack/
├── etc
│ └── nina
│ ├── auto_blacklist.txt
│ ├── blacklist.txt
│ ├── conf
│ ├── keywords.txt
│ ├── rubbish_links.txt
│ └── whitelist.txt
└── usr
├── local
│ ├── bin
│ │ ├── geckodriver
│ │ └── nina
│ ├── lib
│ │ └── python2.7
│ │ └── dist-packages
│ │ ├── nina.py
│ │ ├── nina_py_installed_files.txt
│ │ ├── Uinput_wrapping_module-2.0.egg-info
│ │ └── uinput_wrapping_module.so
│ └── share
│ └── man
│ └── man1
│ └── nina.1.gz
└── share
└── doc
└── nina
├── COPYING
├── doc
│ ├── Doxyfile
│ └── nina.1
├── README
└── README.md
debhelper(v9)에 의해 생성된 Tree.deb:
unpack/
├── etc
│ └── nina
│ ├── auto_blacklist.txt
│ ├── blacklist.txt
│ ├── conf
│ ├── keywords.txt
│ ├── rubbish_links.txt
│ └── whitelist.txt
└── usr
├── bin
│ └── nina
├── lib
│ └── python2.7
│ └── dist-packages
│ └── nina.py
└── share
├── doc
│ └── nina
│ ├── changelog.Debian.gz
│ └── copyright
└── man
└── man1
└── nina.1.gz
보시다시피, 완전히 동일하지는 않습니다(sic). 나는 그것이 무엇인지 어느 정도 이해합니다 checkinstall
. make install 명령을 실행하고 파일 출력을 가져와 설치 위치에 배치합니다.내 거기계. debhelper
여기에 더 적합한 도구인 것 같습니다. ( install /usr/lib
대신 Install 을 /usr/local/lib
사용하면 패키지에 서명할 수 있습니다.) 이 방법을 선호하지만 예상대로 작동하지 않습니다.
계속하다거대한debhelper 방식의 또 다른 장점은 debian/control 등에 지정된 종속성을 실제로 처리한다는 것입니다. 그러나 checkinstall은 그렇지 않습니다.
debhelper가 수행하지 않는 작업:
인터넷 소스에서 일부 바이너리(geckodriver)를 가져와서 /usr/bin에 넣습니다.
직접 만든 Python 모듈 설치
install-exec-local:
uninstall-local:
이러한 작업은 Makefile.am에서 (각각 & ) 메서드를 재정의 하고 일부 bash 명령을 실행하여 수행됩니다.
---
그래서 내 질문은: 두 포장 옵션의 가장 좋은 부분을 어떻게 유지하여 "완벽"하게 만들 수 있습니까?
답변1
인터넷에서 물건을 다운로드하는 것은 데비안 패키지 구축에서 해서는 안 되는 일입니다. "내장된 clean chroot" 도우미를 사용하는 경우에는 그렇게 하지 못할 수도 있습니다. 그러나 Plain은 dpkg-buildpackage
이를 수행할 수 있어야 합니다. 자동화된 도구 빌드 시스템이 올바른 작업을 수행하면 아무 것도 필요하지 않습니다. 그렇지 않으면 필요한 명령을 override_dh_foo
명령줄에 추가해야 합니다("man dh" 참조).
Python 모듈의 경우 빌드 시스템에서 .py 파일을 설치하고 $DESTDIR을 준수해야 합니다. 이렇게 하면 dh
모드의 debhelper는 DTRT여야 합니다.
이들 중 어느 것도 작동하지 않으면 문제를 보여주는 최소 버전의 패키지를 만드십시오. 그렇지 않으면 수정 구슬 문제입니다.
답변2
Makefile.am
당신에 대한 고마움을 다시 생각해 봅니다 . 그리고 마침내 뭔가를 얻었습니다.
- 게코드라이버 받기
./configure
단계별로 가져오기 위해 스크립트를 실행하고 있으며 , 그것이 패키징 시스템에 있다고 가정하고 다음과 같이 .deb 패키지에 파일 종속성으로 배치합니다.
bindeptsdir = \
$(prefix)/bin
bindepts_DATA = \
/usr/local/bin/geckodriver
- Python 모듈 설치
$(DESTDIR) 이 실제로 해결책입니다. 이제 Python 모듈이 다음과 같이 설치됩니다.
$(PYTHON) setup.py install \
--root $(DESTDIR)
잘 작동합니다. 단, 데비안/규칙에 넣어야 한다는 점만 빼면요. override_dh_usrlocal:
그렇지 않으면 파일을 설치하는 중이라 소리지릅니다./usr/local
그러고 싶지 않은데 Python이 자체적으로 설치를 처리하고 있어서 설치 경로를 지정할 수 없습니다. 또 다른 해결책은 설치 --prefix $(DESTDIR)$(prefix)
대신 지정하는 것이지만 --root...
설치하는 파일은 /usr/lib/python2.7/site-packages
pythonpath에 없습니다.
---
Python 문제의 Appart 최종 결과는 dpkg-buildpackage에서 잘 작동합니다.