Jump to content
From ArchWiki

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.

Category:

- Arch package guidelines (Português)