Índice
Existe um velho ditado Latino que diz: “Longum iter est per praecepta, breve et efficax per exempla” (“É um longo caminho pelas regras, mas curto e eficiente com exemplos”).
Aqui está um exemplo de criar um pacote Debian simples a partir duma fonte C simples usando o Makefile como seu sistema de compilação.
Vamos assumir que o tarball do autor seja debhello-0.0.tar.gz.
Este tipo de fonte destina-se a ser instalado como ficheiro não-sistema como:
Bases para a instalação a partir do tarball do autor.
$ tar -xzmf debhello-0.0.tar.gz $ cd debhello-0.0 $ make $ make install
O empacotamento Debian requer alterar este processo “make install” para instalar ficheiros na localização imagem do sistema alvo em vez de na localização normal sob /usr/local.
![]() | Nota |
---|---|
Exemplos de criar um pacote Debian a partir de outros sistemas de compilação complicados estão descritos em “Capítulo 14, Mais Exemplos”. |
O grande panorama para compilar um pacote Debian não-nativo singular a partir do tarball de autor debhello-0.0.tar.gz pode ser resumido como:
O comando debmake debianiza a árvore fonte do autor ao adicionar ficheiros modelo apenas no directório debian.
O comando debuild compila o pacote binário a partir da árvore fonte debianizada.
O grande panorama de compilação de pacote.
$ tar -xzmf debhello-0.0.tar.gz $ cd debhello-0.0 $ debmake ... manual customization $ debuild ...
![]() | Dica |
---|---|
O comando debuild neste e nos exemplos seguintes pode ser substituído por comandos equivalentes tais como o comando sbuild. |
![]() | Dica |
---|---|
Se o tarball de autor estiver disponível em formato .tar.xzm use-o em vez dos que têm formatos em .tar.gz e .tar.bz2. O formato de compressão xz oferece melhor compressão que a compressão do gzip e bzip2. |
![]() | Nota |
---|---|
As atividades de empacotamento actuais são muitas vezes executadas manualmente sem se usar o debmake enquanto se referencia apenas pacotes existentes semelhantes e o “Manual de Política Debian”. |
O comando debmake é o script de ajuda para o empacotamento Debian. (“Capítulo 15, manual do debmake(1)”)
Estas funcionalidades tornam o empacotamento Debian com debmake simples e moderno.
Em retrospetiva, Eu criei o debmake para simplificar esta documentação. Eu considero o debmake sendo mais ou menos um gerador de sessão de demonstração para objectivos de tutorial.
O comando debmake não é o único script ajudante para criar um pacote Debian. Se você está interessado em ferramentas de ajuda de empacotamento alternativas, por favor veja:
Aqui está um sumário de comandos semelhantes ao comando debuild.
O comando dpkg-buildpackage é o comando oficial para compilar o pacote binário Debian. Para compilação binária normal, ele executa aproximadamente:
“debsign” (assina os ficheiros *.dsc e *.changes)
![]() | Nota |
---|---|
Veja dpkg-buildpackage(1) para detalhes exactos. |
Vamos obter a fonte do autor.
Download debhello-0.0.tar.gz.
$ wget http://www.example.org/download/debhello-0.0.tar.gz ... $ tar -xzmf debhello-0.0.tar.gz $ tree . ├── debhello-0.0 │ ├── Makefile │ ├── README.md │ └── src │ └── hello.c └── debhello-0.0.tar.gz 3 directories, 4 files
Aqui, a fonte C hello.c é uma muito simples.
hello.c.
$ cat debhello-0.0/src/hello.c #include <stdio.h> int main() { printf("Hello, world!\n"); return 0; }
Aqui, o Makefile suporta “GNU Coding Standards” e “FHS”. Notavelmente:
Makefile.
$ cat debhello-0.0/Makefile prefix = /usr/local all: src/hello src/hello: src/hello.c @echo "CFLAGS=$(CFLAGS)" | \ fold -s -w 70 | \ sed -e 's/^/# /' $(CC) $(CPPFLAGS) $(CFLAGS) $(LDCFLAGS) -o $@ $^ install: src/hello install -D src/hello \ $(DESTDIR)$(prefix)/bin/hello clean: -rm -f src/hello distclean: clean uninstall: -rm -f $(DESTDIR)$(prefix)/bin/hello .PHONY: all install clean distclean uninstall
![]() | Nota |
---|---|
O echo da variável $(CFLAGS) é usado para verificar a definição apropriada da bandeira de compilação no exemplo seguinte: |
Os resultados do comando debmake é muito detalhado e explica o que faz como se segue.
O resultado do comando debmake.
$ cd /path/to/debhello-0.0 $ debmake -x1 I: set parameters I: sanity check of parameters I: pkg="debhello", ver="0.0", rev="1" I: *** start packaging in "debhello-0.0". *** I: provide debhello_0.0.orig.tar.?z for non-native Debian package I: pwd = "/path/to" I: $ ln -sf debhello-0.0.tar.gz debhello_0.0.orig.tar.gz I: pwd = "/path/to/debhello-0.0" I: parse binary package settings: I: binary package=debhello Type=bin / Arch=any M-A=foreign I: analyze the source tree I: build_type = make I: scan source for copyright+license text and file extensions I: 50 %, ext = md I: 50 %, ext = c I: check_all_licenses I: ... I: check_all_licenses completed for 3 files. I: bunch_all_licenses I: format_all_licenses I: make debian/* template files I: debmake -x "1" ... I: creating => debian/control I: creating => debian/copyright I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra0_changel... I: creating => debian/changelog I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra0_rules.t... I: creating => debian/rules I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra0source_f... I: creating => debian/source/format I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra1_README.... I: creating => debian/README.Debian I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra1_README.... I: creating => debian/README.source I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra1_clean.t... I: creating => debian/clean I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra1_gbp.con... I: creating => debian/gbp.conf I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra1_salsa-c... I: creating => debian/salsa-ci.yml I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra1_watch.t... I: creating => debian/watch I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra1tests_co... I: creating => debian/tests/control I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra1upstream... I: creating => debian/upstream/metadata I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra1patches_... I: creating => debian/patches/series I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra1source.n... I: creating => debian/source/local-options.ex I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra1source.n... I: creating => debian/source/local-patch-header.ex I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra1single_d... I: creating => debian/dirs I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra1single_i... I: creating => debian/install I: substituting => /usr/lib/python3/dist-packages/debmake/data/extra1single_l... I: creating => debian/links I: $ wrap-and-sort -vast debian/control debian/tests/control debian/copyright debian/dirs debian/install debian/links --- Modified files --- debian/control debian/dirs debian/install debian/links I: $ wrap-and-sort -vast complete. Now, debian/* may have a blank line at th...
O comando debmake gera todos estes ficheiros modelo baseado nas opções da linha de comandos. Como nenhuma opção é especificada, o comando debmake escolhe valores predefinidos razoáveis por si:
![]() | Nota |
---|---|
Aqui, o comando debmake é invocado com a opção -x1 para manter este tutorial simples. O uso da opção predefinida -x3 é altamente recomendado. |
Vamos inspecionar os ficheiros modelo gerados.
A árvore fonte após a execução básica do debmake.
$ cd /path/to $ tree . ├── debhello-0.0 │ ├── Makefile │ ├── README.md │ ├── debian │ │ ├── README.Debian │ │ ├── README.source │ │ ├── changelog │ │ ├── clean │ │ ├── control │ │ ├── copyright │ │ ├── dirs │ │ ├── gbp.conf │ │ ├── install │ │ ├── links │ │ ├── patches │ │ │ └── series │ │ ├── rules │ │ ├── salsa-ci.yml │ │ ├── source │ │ │ ├── format │ │ │ ├── local-options.ex │ │ │ └── local-patch-header.ex │ │ ├── tests │ │ │ └── control │ │ ├── upstream │ │ │ └── metadata │ │ └── watch │ └── src │ └── hello.c ├── debhello-0.0.tar.gz └── debhello_0.0.orig.tar.gz -> debhello-0.0.tar.gz 8 directories, 24 files
O ficheiro debian/rules é o script de compilação fornecido pelo maintainer do pacote. Aqui está o seu ficheiro modelo gerado pelo comando debmake.
debian/rules (ficheiro modelo):
$ cd /path/to/debhello-0.0 $ cat debian/rules #!/usr/bin/make -f # You must remove unused comment lines for the released package. #export DH_VERBOSE = 1 #export DEB_BUILD_MAINT_OPTIONS = hardening=+all #export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic #export DEB_LDFLAGS_MAINT_APPEND = -Wl,-O1 %: dh $@ #override_dh_auto_install: # dh_auto_install -- prefix=/usr #override_dh_install: # dh_install --list-missing -X.pyc -X.pyo
Isto é essencialmente o ficheiro debian/rules standard com o comando dh. (Existem alguns conteúdos comentados para você personalizar.)
O ficheiro debian/control fornece os meta-dados principais para o pacote Debian. Aqui está o seu ficheiro modelo gerado pelo comando debmake.
debian/control (ficheiro modelo):
$ cat debian/control Source: debhello Section: unknown Priority: optional Maintainer: "Osamu Aoki" <osamu@debian.org> Build-Depends: debhelper-compat (= 13), Standards-Version: 4.7.0 Homepage: <insert the upstream URL, if relevant> Rules-Requires-Root: no #Vcs-Git: https://salsa.debian.org/debian/debhello.git #Vcs-Browser: https://salsa.debian.org/debian/debhello Package: debhello Architecture: any Multi-Arch: foreign Depends: ${misc:Depends}, ${shlibs:Depends}, Description: auto-generated package by debmake This Debian binary package was auto-generated by the debmake(1) command provided by the debmake package.
![]() | Atenção |
---|---|
Se você deixar “Section: unknown” no ficheiro modelo debian/control não modificado, o erro do lintian pode fazer a compilação falhar. |
Como este é o pacote executável binário ELF, o comando debmake define “Architecture: any” e “Multi-Arch: foreign”. Também, define parâmetros requeridos substvar como “Depends: ${shlibs:Depends}, ${misc:Depends}”. Estes estão explicados em “Capítulo 6, Bases para empacotamento”.
![]() | Nota |
---|---|
Por favor note que este ficheiro debian/control usa o estilo RFC-822 como documentado em “5.2 Ficheiros de controle de pacote fonte — debian/control” do “manual de Política Debian”. O uso da linha vazia e do espaço inicial tem significado. |
O ficheiro debian/copyright fornece os dados de sumário de copyright do pacote Debian. Aqui está o seu ficheiro modelo gerado pelo comando debmake.
debian/copyright (ficheiro modelo):
$ cat debian/copyright Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: debhello Upstream-Contact: <preferred name and address to reach the upstream project> Source: <url://example.com> # # Please double check copyright with the licensecheck(1) command. Files: Makefile README.md src/hello.c Copyright: __NO_COPYRIGHT_NOR_LICENSE__ License: __NO_COPYRIGHT_NOR_LICENSE__ #----------------------------------------------------------------------------... # Files marked as NO_LICENSE_TEXT_FOUND may be covered by the following # license/copyright files.
É requerida alguma modificação manual para fazer o pacote Debian apropriado como um maintainer.
De modo a instalar ficheiros como parte dos ficheiros do sistema, o valor $(prefix) de /usr/local em Makefile deve ser sobreposto para ser /usr. Isto pode ser acomodado no ficheiro debian/rules com o alvo override_dh_auto_install a definir “prefix=/usr”.
debian/rules (versão do maintainer):
$ cd /path/to/debhello-0.0 $ vim debian/rules ... hack, hack, hack, ... $ cat debian/rules #!/usr/bin/make -f export DH_VERBOSE = 1 export DEB_BUILD_MAINT_OPTIONS = hardening=+all export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed %: dh $@ override_dh_auto_install: dh_auto_install -- prefix=/usr
Exportar a variável de ambiente DH_VERBOSE no ficheiro debian/rules como em cima força a ferramenta debhelper a fazer um relatório de compilação afinado.
Exportar DEB_BUILD_MAINT_OPTION como em cima define as opções de endurecimento descritas em “AREAS DE FUNCIONALIDADE/AMBIENTE” em dpkg-buildflags(1). [9]
Exportar DEB_CFLAGS_MAINT_APPEND como em cima força o compilador C a emitir todos os avisos.
Exportar DEB_LDFLAGS_MAINT_APPEND como em cima força o vinculador a vincular apenas quando a biblioteca é mesmo necessária. [10]
O comando dh_auto_install para o sistema de compilação baseado no Makefile essencialmente corre “$(MAKE) install DESTDIR=debian/debhello”. A criação deste alvo override_dh_auto_install muda o seu comportamento para “$(MAKE) install DESTDIR=debian/debhello prefix=/usr”.
Aqui estão as versões de maintainer dos ficheiros debian/control e debian/copyright.
debian/control (versão de maintainer):
$ vim debian/control ... hack, hack, hack, ... $ cat debian/control Source: debhello Section: devel Priority: optional Maintainer: Osamu Aoki <osamu@debian.org> Build-Depends: debhelper-compat (= 13), Standards-Version: 4.6.2 Homepage: https://salsa.debian.org/debian/debmake-doc Rules-Requires-Root: no Package: debhello Architecture: any Multi-Arch: foreign Depends: ${misc:Depends}, ${shlibs:Depends}, Description: Simple packaging example for debmake This Debian binary package is an example package. (This is an example only)
debian/copyright (versão de maintainer):
$ vim debian/copyright ... hack, hack, hack, ... $ cat debian/copyright Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: debhello Upstream-Contact: Osamu Aoki <osamu@debian.org> Source: https://salsa.debian.org/debian/debmake-doc Files: * Copyright: 2015-2021 Osamu Aoki <osamu@debian.org> License: Expat Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: . The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. . THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Vamos remover os ficheiros modelo não usados e editar os restantes ficheiros modelo:
Ficheiros modelo sob debian/. (v=0.0):
$ rm -f debian/clean debian/dirs debian/install debian/links $ rm -f debian/README.source debian/source/*.ex $ rm -rf debian/patches $ tree -F debian debian/ ├── README.Debian ├── changelog ├── control ├── copyright ├── gbp.conf ├── rules* ├── salsa-ci.yml ├── source/ │ └── format ├── tests/ │ └── control ├── upstream/ │ └── metadata └── watch 4 directories, 11 files
![]() | Dica |
---|---|
Os ficheiros de configuração usados pelos comandos dh_* do pacote debhelper geralmente tratam # como o inicio de uma linha comentário. |
Você pode criar um pacote Debian não-nativo usando o comando debuild ou os seus equivalentes (veja “Secção 5.4, “O que é debuild?””) nesta árvore fonte. O texto resultante do comando é muito detalhado e explica o que ele faz como se segue.
Compilando pacote com debuild.
$ cd /path/to/debhello-0.0 $ debuild dpkg-buildpackage -us -uc -ui -i dpkg-buildpackage: info: source package debhello dpkg-buildpackage: info: source version 0.0-1 dpkg-buildpackage: info: source distribution unstable dpkg-buildpackage: info: source changed by Osamu Aoki <osamu@debian.org> dpkg-source -i --before-build . dpkg-buildpackage: info: host architecture amd64 debian/rules clean dh clean dh_auto_clean make -j12 distclean ... debian/rules binary dh binary dh_update_autotools_config dh_autoreconf dh_auto_configure dh_auto_build make -j12 "INSTALL=install --strip-program=true" make[1]: Entering directory '/path/to/debhello-0.0' # CFLAGS=-g -O2 -Werror=implicit-function-declaration ... Finished running lintian.
Você pode verificar que CFLAGS é atualizado apropriadamente com -Wall e -pedantic pela variável DEB_CFLAGS_MAINT_APPEND.
O manual deve ser adicionado ao pacote como reportado pelo pacote lintian, como mostrado em exemplos posteriores (veja “Capítulo 14, Mais Exemplos”). Vamos seguir por agora.
Vamos inspecionar o resultado.
Os ficheiros gerados de debhello versão 0.0 pelo comando debuild:
$ cd /path/to $ tree -FL 1 ./ ├── debhello-0.0/ ├── debhello-0.0.tar.gz ├── debhello-dbgsym_0.0-1_amd64.deb ├── debhello_0.0-1.debian.tar.xz ├── debhello_0.0-1.dsc ├── debhello_0.0-1_amd64.build ├── debhello_0.0-1_amd64.buildinfo ├── debhello_0.0-1_amd64.changes ├── debhello_0.0-1_amd64.deb └── debhello_0.0.orig.tar.gz -> debhello-0.0.tar.gz 2 directories, 9 files
Você vê todos os ficheiros gerados.
O debhello_0.0-1.debian.tar.xz contém as alterações Debian feitas à fonte do autor como se segue.
O conteúdo do arquivo comprimido de debhello_0.0-1.debian.tar.xz:
$ tar -tzf debhello-0.0.tar.gz debhello-0.0/ debhello-0.0/src/ debhello-0.0/src/hello.c debhello-0.0/Makefile debhello-0.0/README.md $ tar --xz -tf debhello_0.0-1.debian.tar.xz debian/ debian/README.Debian debian/changelog debian/control debian/copyright debian/gbp.conf debian/rules debian/salsa-ci.yml debian/source/ debian/source/format debian/tests/ debian/tests/control debian/upstream/ debian/upstream/metadata debian/watch
O debhello_0.0-1_amd64.deb contém os ficheiros binário a serem instalados no sistema alvo.
O debhello-debsym_0.0-1_amd64.deb contém os ficheiros de símbolos de depuração a serem instalados no sistema alvo.
O conteúdo de pacote binário de todos os pacotes binário:
$ dpkg -c debhello-dbgsym_0.0-1_amd64.deb drwxr-xr-x root/root ... ./ drwxr-xr-x root/root ... ./usr/ drwxr-xr-x root/root ... ./usr/lib/ drwxr-xr-x root/root ... ./usr/lib/debug/ drwxr-xr-x root/root ... ./usr/lib/debug/.build-id/ drwxr-xr-x root/root ... ./usr/lib/debug/.build-id/c4/ -rw-r--r-- root/root ... ./usr/lib/debug/.build-id/c4/cec6427d45de48efc7f263... drwxr-xr-x root/root ... ./usr/share/ drwxr-xr-x root/root ... ./usr/share/doc/ lrwxrwxrwx root/root ... ./usr/share/doc/debhello-dbgsym -> debhello $ dpkg -c debhello_0.0-1_amd64.deb drwxr-xr-x root/root ... ./ drwxr-xr-x root/root ... ./usr/ drwxr-xr-x root/root ... ./usr/bin/ -rwxr-xr-x root/root ... ./usr/bin/hello drwxr-xr-x root/root ... ./usr/share/ drwxr-xr-x root/root ... ./usr/share/doc/ drwxr-xr-x root/root ... ./usr/share/doc/debhello/ -rw-r--r-- root/root ... ./usr/share/doc/debhello/README.Debian -rw-r--r-- root/root ... ./usr/share/doc/debhello/changelog.Debian.gz -rw-r--r-- root/root ... ./usr/share/doc/debhello/copyright
A lista de dependências gerada de todos os pacotes binário.
A lista de dependências gerada de todos os pacotes binários (v=0.0):
$ dpkg -f debhello-dbgsym_0.0-1_amd64.deb pre-depends \ depends recommends conflicts breaks Depends: debhello (= 0.0-1) $ dpkg -f debhello_0.0-1_amd64.deb pre-depends \ depends recommends conflicts breaks Depends: libc6 (>= 2.34)
![]() | Cuidado |
---|---|
Muitos mais detalhes precisam ser observados antes de se enviar o pacote para o arquivo Debian. |
![]() | Nota |
---|---|
Se forem saltados ajustes manuais nos ficheiros de configuração auto-gerados pelo comando debmake, o pacote binário gerado pode ficar com falta duma descrição de pacote significativa e alguns dos requerimentos de política podem ficar a faltar. Este pacote desleixado vai funcionar bem sob o comando dpkg, e pode ser suficiente bom para a sua implantação local. |
O exemplo de cima não tocou na fonte do autor para criar o próprio pacote Debian. Uma abordagem alternativa como maintainer é modificar os ficheiros na fonte do autor. Por exemplo, o Makefile pode ser modificado para definir o valor $(prefix) para /usr.
![]() | Nota |
---|---|
O “Secção 5.7, “Passo 3: Modificação dos ficheiros modelo”” em cima usando o ficheiro debian/rules é a melhor abordagem para empacotamento para este exemplo. Mas vamos continuar com estas abordagens alternativas como inclinação à experiência. |
No seguinte, vamos considerar 3 variantes simples desta abordagem alternativa para gerar ficheiros debian/patches/* representando modificações à fonte do autor no formato fonte Debian “3.0 (quilt)”. Estas substituem “Secção 5.7, “Passo 3: Modificação dos ficheiros modelo”” no exemplo passo-a-passo em cima:
Por favor note que o ficheiro debian/rules usado para estes exemplos não tem o alvo override_dh_auto_install como se segue:
debian/rules (versão alternativa de maintainer):
$ cd /path/to/debhello-0.0 $ vim debian/rules ... hack, hack, hack, ... $ cat debian/rules #!/usr/bin/make -f export DH_VERBOSE = 1 export DEB_BUILD_MAINT_OPTIONS = hardening=+all export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed %: dh $@
Aqui, o ficheiro patch 000-prefix-usr.patch é criado usando o comando diff.
Patch por “diff -u”.
$ cp -a debhello-0.0 debhello-0.0.orig $ vim debhello-0.0/Makefile ... hack, hack, hack, ... $ diff -Nru debhello-0.0.orig debhello-0.0 >000-prefix-usr.patch $ cat 000-prefix-usr.patch diff -Nru debhello-0.0.orig/Makefile debhello-0.0/Makefile --- debhello-0.0.orig/Makefile 2024-11-29 07:57:10.299591959 +0000 +++ debhello-0.0/Makefile 2024-11-29 07:57:10.391593434 +0000 @@ -1,4 +1,4 @@ -prefix = /usr/local +prefix = /usr all: src/hello $ rm -rf debhello-0.0 $ mv -f debhello-0.0.orig debhello-0.0
Por favor note que a árvore fonte do autor é restaurada ao seu estado original após de gerar um ficheiro patch 000-prefix-usr.patch.
Este 000-prefix-usr.patch é editado para estar em conformidade com DEP-3 e movido para a localização correta como em baixo.
000-prefix-usr.patch (DEP-3):
$ echo '000-prefix-usr.patch' >debian/patches/series $ vim ../000-prefix-usr.patch ... hack, hack, hack, ... $ mv -f ../000-prefix-usr.patch debian/patches/000-prefix-usr.patch $ cat debian/patches/000-prefix-usr.patch From: Osamu Aoki <osamu@debian.org> Description: set prefix=/usr patch diff -Nru debhello-0.0.orig/Makefile debhello-0.0/Makefile --- debhello-0.0.orig/Makefile +++ debhello-0.0/Makefile @@ -1,4 +1,4 @@ -prefix = /usr/local +prefix = /usr all: src/hello
![]() | Nota |
---|---|
Quando se gera o pacote fonte Debian por dpkg-source via dpkg-buildpackage no passo seguinte de “Secção 5.8, “Passo 4: Compilar pacote com debuild””, o comando dpkg-source assume que nenhuma patch foi aplicada à fonte do autor, pois o .pc/applied-patches está em falta. |
Aqui, o ficheiro patch 000-prefix-usr.patch é criado usando o comando dquilt.
dquilt é um invólucro simples do programa quilt. A sintaxe e função do comando dquilt é a mesma que do comando quilt(1), excepto para o facto que a patch gerada é guardada no directório debian/patches/.
Patch por dquilt.
$ dquilt new 000-prefix-usr.patch Patch debian/patches/000-prefix-usr.patch is now on top $ dquilt add Makefile File Makefile added to patch debian/patches/000-prefix-usr.patch ... hack, hack, hack, ... $ head -1 Makefile prefix = /usr $ dquilt refresh Refreshed patch debian/patches/000-prefix-usr.patch $ dquilt header -e --dep3 ... edit the DEP-3 patch header with editor $ tree -a . ├── .pc │ ├── .quilt_patches │ ├── .quilt_series │ ├── .version │ ├── 000-prefix-usr.patch │ │ ├── .timestamp │ │ └── Makefile │ └── applied-patches ├── Makefile ├── README.md ├── debian │ ├── README.Debian │ ├── README.source │ ├── changelog │ ├── clean │ ├── control │ ├── copyright │ ├── dirs │ ├── gbp.conf │ ├── install │ ├── links │ ├── patches │ │ ├── 000-prefix-usr.patch │ │ └── series │ ├── rules │ ├── salsa-ci.yml │ ├── source │ │ ├── format │ │ ├── local-options.ex │ │ └── local-patch-header.ex │ ├── tests │ │ └── control │ ├── upstream │ │ └── metadata │ └── watch └── src └── hello.c 9 directories, 29 files $ cat debian/patches/series 000-prefix-usr.patch $ cat debian/patches/000-prefix-usr.patch Description: set prefix=/usr patch Author: Osamu Aoki <osamu@debian.org> Index: debhello-0.0/Makefile =================================================================== --- debhello-0.0.orig/Makefile +++ debhello-0.0/Makefile @@ -1,4 +1,4 @@ -prefix = /usr/local +prefix = /usr all: src/hello
Aqui, Makefile na árvore fonte do autor não precisa de ser restaurada para o estado original para o empacotamento.
![]() | Nota |
---|---|
Quando se gera o pacote fonte Debian por dpkg-source via dpkg-buildpackage no passo seguinte de “Secção 5.8, “Passo 4: Compilar pacote com debuild””, o comando dpkg-source assume que patches foram aplicadas à fonte do autor, pois o .pc/applied-patches existe. |
A árvore fonte do autor pode ser restaurada para o estado original para o empacotamento.
A árvore fonte do autor (restaurada):
$ dquilt pop -a Removing patch debian/patches/000-prefix-usr.patch Restoring Makefile No patches applied $ head -1 Makefile prefix = /usr/local $ tree -a .pc .pc ├── .quilt_patches ├── .quilt_series └── .version 1 directory, 3 files
Aqui, Makefile é restaurado e o .pc/applied-patches está em falta.
Aqui, o ficheiro patch não é criado neste passo mas os ficheiros fonte estão configurados para criar ficheiros debian/patches/* no passo seguinte de “Secção 5.8, “Passo 4: Compilar pacote com debuild””.
Vamos editar a fonte do autor.
Makefile modificado.
$ vim Makefile ... hack, hack, hack, ... $ head -n1 Makefile prefix = /usr
Vamos editar debian/source/local-options:
debian/source/local-options para auto-commit.
$ mv debian/source/local-options.ex debian/source/local-options $ vim debian/source/local-options ... hack, hack, hack, ... $ cat debian/source/local-options # == Patch applied strategy (merge) == # # The source outside of debian/ directory is modified by maintainer and # different from the upstream one: # * Workflow using dpkg-source commit (commit all to VCS after dpkg-source ... # https://www.debian.org/doc/manuals/debmake-doc/ch04.en.html#dpkg-sour... # * Workflow described in dgit-maint-merge(7) # single-debian-patch auto-commit
Vamos editar o debian/source/local-patch-header:
debian/source/local-patch-header para auto-commit.
$ mv debian/source/local-patch-header.ex debian/source/local-patch-header $ vim debian/source/local-patch-header ... hack, hack, hack, ... $ cat debian/source/local-patch-header Description: debian-changes Author: Osamu Aoki <osamu@debian.org>
Vamos remover ficheiros debian/patches/* e outros ficheiros modelo não usados
Remove ficheiros modelo não utilizados.
$ rm -f debian/clean debian/dirs debian/install debian/links $ rm -f debian/README.source debian/source/*.ex $ rm -rf debian/patches $ tree debian debian ├── README.Debian ├── changelog ├── control ├── copyright ├── gbp.conf ├── rules ├── salsa-ci.yml ├── source │ ├── format │ ├── local-options │ └── local-patch-header ├── tests │ └── control ├── upstream │ └── metadata └── watch 4 directories, 13 files
Não existem ficheiros debian/patches/* no final deste passo.
![]() | Nota |
---|---|
Quando se gera o pacote fonte Debian por dpkg-source via dpkg-buildpackage no passo seguinte de “Secção 5.8, “Passo 4: Compilar pacote com debuild””, o comando dpkg-source usa opções especificadas em debian/source/local-options para auto-cometer a modificação aplicada à fonte do autor como patches/debian-changes. |
Vamos inspecionar o pacote fonte Debian gerado após o passo seguinte “Secção 5.8, “Passo 4: Compilar pacote com debuild”” e extrair os ficheiros de debhello-0.0.debian.tar.xz.
Inspecione debhello-0.0.debian.tar.xz após debuild.
$ tar --xz -xvf debhello_0.0-1.debian.tar.xz debian/ debian/README.Debian debian/changelog debian/control debian/copyright debian/gbp.conf debian/patches/ debian/patches/debian-changes debian/patches/series debian/rules debian/salsa-ci.yml debian/source/ debian/source/format debian/tests/ debian/tests/control debian/upstream/ debian/upstream/metadata debian/watch
Vamos verificar os ficheiros gerados debian/patches/*.
Inspecione debian/patches/* após debuild.
$ cat debian/patches/series debian-changes $ cat debian/patches/debian-changes Description: debian-changes Author: Osamu Aoki <osamu@debian.org> --- debhello-0.0.orig/Makefile +++ debhello-0.0/Makefile @@ -1,4 +1,4 @@ -prefix = /usr/local +prefix = /usr all: src/hello
Confirma-se que o pacote fonte Debian debhello-0.0.debian.tar.xz é gerado apropriadamente com ficheiros debian/patches/* para a modificação Debian.
[9] Isto é um cliché para forçar uma ligação de re-alocação só-leitura para o endurecimento e para prevenir o aviso do lintian “W: debhello: hardening-no-relro usr/bin/hello”. Isto não é realmente preciso para este exemplo mas deve ser inofensivo. A ferramenta lintian parece produzir um aviso de falso positivo para este caso que não tem biblioteca vinculada.
[10] Isto é um cliché para prevenir a sobre-vinculação para casos de dependências complexas de biblioteca como os programas de Gnome. Isto não é realmente preciso para este exemplo simples mas deve ser inofensivo.