autotools에서 .deb를 패키징하는 데 문제가 있습니다. (설치, debhelper 확인,...)

autotools에서 .deb를 패키징하는 데 문제가 있습니다. (설치, debhelper 확인,...)

저는 현재 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-packagespythonpath에 없습니다.

---

Python 문제의 Appart 최종 결과는 dpkg-buildpackage에서 잘 작동합니다.

관련 정보