DKMS package guidelines (Português)

From ArchWiki
Diretrizes de pacotes do Arch

32-bitCLRCMakeCrossDKMSEclipseElectronFonteFree PascalGNOMEGoHaskellJavaKDEKernelLispMesonMinGWNode.jsNonfreeOCamlPerlPHPPythonRRubyRustVCSWebWine

Aqui estão algumas diretrizes para seguir ao criar um pacote DKMS.

Nome de pacote

Os pacotes DKMS são nomeados anexando "-dkms" ao nome do pacote original.

A variável $_pkgname é frequentemente usada abaixo de $pkgname para descrever o nome do pacote menos o sufixo "-dkms" "(por exemplo, _pkgname=${pkgname%-*}). Isso é útil para ajudar a manter semelhanças entre o pacote original PKGBUILD e a variante DKMS.

Dependências

As dependências devem ser herdadas da versão original com o dkms adicionado e o linux-headers removidos (como listado no pacote dkms como opcional).

Local de fontes de compilação

As fontes de compilação devem entrar (este é o diretório de compilação padrão do DKMS):

/usr/src/NOME_PACOTE-VERSÃO_PACOTE

No diretório do pacote, uma configuração de DKMS informa ao DKMS como compilar o módulo (dkms.conf), incluindo as variáveis NOME_PACOTE e VERSÃO_PACOTE.

  • NOME_PACOTE - o nome real do projeto (geralmente $_pkgname ou $_pkgbase).
  • VERSÃO_PACOTE - por convenção, este também deve ser o $pkgver.

Correções

Pode-se aplicar patches corrigindo os fontes diretamente no PKGBUILD ou através de dkms.conf.

Carregamento de módulos automaticamente em .install

Carregar ou descarregar os módulos devem ser deixados para o usuário. Considere a possibilidade de um módulo travar ao ser carregado.

Além disso, observe que você não precisa chamar depmod explicitamente para atualizar as dependências do seu módulo do kernel. Agora, o pacman está chamando o dkms install e o dkms remove do DKMS automaticamente como ganchos (hooks). dkms install está certificando-se de que depmod seja chamado no final de seu processo. O dkms install depende do dkms build (para compilar o fonte no kernel atual), que depende do dkms add (para adicionar um link simbólico de /var/lib/dkms/<pacote>/<versão>/fonte para /usr/src/<pacote>).

Exemplo

Aqui está um exemplo de pacote que edita dkms.conf de acordo com o nome e a versão do pacote.

PKGBUILD

PKGBUILD
# Maintainer: foo <foo(at)example(dot)org>
# Contributor: bar <bar(at)example(dot)org>

_pkgbase=example
pkgname=example-dkms
pkgver=1
pkgrel=1
pkgdesc="The Example kernel modules (DKMS)"
arch=('i686' 'x86_64')
url="https://www.example.org/"
license=('GPL2')
depends=('dkms')
conflicts=("${_pkgbase}")
install=${pkgname}.install
source=("${url}/files/tarball.tar.gz"
        'dkms.conf'
        'linux-3.14.patch')
md5sums=(use 'updpkgsums')

prepare() {
  cd ${_pkgbase}-${pkgver}

  # Patch
  patch -p1 -i "${srcdir}"/linux-3.14.patch

}

package() {
  # Install
  make DESTDIR="${pkgdir}" install

  # Copy dkms.conf
  install -Dm644 dkms.conf "${pkgdir}"/usr/src/${_pkgbase}-${pkgver}/dkms.conf

  # Set name and version
  sed -e "s/@_PKGBASE@/${_pkgbase}/" \
      -e "s/@PKGVER@/${pkgver}/" \
      -i "${pkgdir}"/usr/src/${_pkgbase}-${pkgver}/dkms.conf

  # Copy sources (including Makefile)
  cp -r ${_pkgbase}/* "${pkgdir}"/usr/src/${_pkgbase}-${pkgver}/
}

dkms.conf

dkms.conf
PACKAGE_NAME="@_PKGBASE@"
PACKAGE_VERSION="@PKGVER@"
MAKE[0]="make --uname_r=$kernelver"
CLEAN="make clean"
BUILT_MODULE_NAME[0]="@_PKGBASE@"
DEST_MODULE_LOCATION[0]="/kernel/drivers/misc"
AUTOINSTALL="yes"

.install

Agora, o pacman possui hooks de DKMS implementados. Você não precisa especificar a configuração específica do DKMS no seu arquivo .install. As chamadas para dkms install e dkms remove serão automáticas.