Jump to content

# OCaml package guidelines (Português)

4 languages

- English
- Italiano
- 日本語
- 中文（简体）

From ArchWiki
Status de tradução: Esse artigo é uma tradução de OCaml package guidelines. Data da última tradução: 2020-02-23. Você pode ajudar a sincronizar a tradução, se houver alterações na versão em inglês.

Escrita de PKGBUILDs para softwares escritos em OCaml.

## Nomenclatura de pacote

Para bibliotecas, use `ocaml-nomemodulo`. Para aplicativos, use o nome do programa. Em ambos casos, o nome deve ser totalmente minúsculo.

## Colocação de arquivos

### Bibliotecas

As bibliotecas OCaml devem ser instaladas sob `/usr/lib/ocaml`. A instalação em `/usr/lib/ocaml/site-lib` está obsoleto.

As bibliotecas OCaml devem ser instaladas usando ocaml-findlib. `ocaml-findlib` inclui metadados de biblioteca no pacote que facilita a gerência fr bibliotecas. Esse é um padrão de fato e muitos softwares OCaml agora precisam dele.

`ocaml-findlib` extrai dados necessários de um arquivo chamado `META` que deve ser incluído no arquivo de origem. Se este arquivo não estiver incluído, um deve ser obtido do pacote Debian, Ubuntu ou Fedora correspondente, ou criado para o pacote pelo mantenedor. Uma solicitação para incluir o arquivo também deve ser feita para os desenvolvedores upstream do pacote.

A variável `OCAMLFIND_DESTDIR` deve ser usada ao instalar pacotes com `ocaml-findlib`. Veja o exemplo de PKGBUILD abaixo para detalhes.

### OASIS

Os pacotes OCaml que instalam executáveis usando OASIS ignoram `DESTDIR`. Essa é uma limitação conhecida do OASIS (issue #493). Uma forma de habilitar funcionalidade do `DESTDIR` é executar o script `configure` com o argumento `--destdir`, dessa forma:

    build() {
        cd "${srcdir}/${srcname}-${pkgver}"
        ./configure --prefix /usr --destdir "$pkgdir"

        # build commands
    }

## Níveis e bytecode OCaml

O OCaml pode executar código em múltiplos "níveis", o nível superior interpreta o Código OCaml sem compilar, o nível de bytecode cria bytecode independente de máquina e o nível nativo cria binários de código de máquina (assim como C/C++).

Ao compilar Pacotes OCaml, você precisa estar ciente de que o processo de compilação está compilando código de máquina nativo, bytecode ou, como em muitos casos, ambos. Isso cria várias situações que podem causar problemas com as opções de pacote e as dependências corretas.

Se o bytecode for produzido, o PKGBUILD deverá conter o seguinte para proteger o bytecode:

    options=('!strip')

Se o pacote não contiver bytecode e apenas distribuir um binário, então `ocaml` não é necessário como uma dependência, mas é claro que é necessário como um makedepends desde que o pacote `ocaml` fornece o OCaml compilador. Se o pacote contiver código nativo e bytecode, `ocaml` deve ser uma dependência e um makedepends.

O código OCaml é raramente (ou nunca) distribuído apenas como bytecode e quase sempre incluirá código nativo: o único caso em que usar any como o arch é aconselhável é quando apenas código-fonte não compilado é distribuído, geralmente com uma biblioteca, embora muitas bibliotecas ainda distribuam código nativo.

A moral da história aqui é estar ciente do que você está distribuindo, as chances são de que o seu pacote contenha código nativo de máquina e bytecode.

## Exemplo de PKGBUILD usando Dune

Dune é um novo sistema de compilação que está se tornando cada vez mais usado por projetos de OCaml.

Uma coisa a estar ciente é que um único projeto pode criar vários "pacotes" no sentido do OPAM/findlib, cada um com seu próprio diretório em `/usr/lib/ocaml/`. Veja ocaml-cairo para um exemplo. Para compilações de versão, todos os "pacotes" precisam ser listados explicitamente.

    # Contributor: Seu nome <seuemail@domínio.com>
    pkgname=ocaml-<nome_do_pacote>
    pkgver=4.2
    pkgrel=1
    license=()
    arch=('x86_64')
    pkgdesc="Um pacote OCaml"
    url=""
    depends=('ocaml')
    makedepends=('dune')
    source=()
    options=('!strip')
    sha256sums=()

    build() {
      cd "${srcdir}/${pkgname}-${pkgver}"
      # A flag "-p" é necessária para compilações de lançamento, veja a página man do Dune. Dune vai reclamar se você esquecer alguns pacotes.
      dune build -p pacote1,pacote1-extensão,pacote2
    }

    package() {
      cd "${srcdir}/${pkgname}-${pkgver}"
      DESTDIR="${pkgdir}" dune install --prefix "/usr" --libdir "lib/ocaml"
      # Dune instala documentação em /usr/doc, corrija isso.
      install -dm755 "${pkgdir}/usr/share/"
      mv "${pkgdir}/usr/doc" "${pkgdir}/usr/share/"
    }

## Exemplo de PKGBUILD usando findlib simples

    # Contributor: Seu Nome <seuemail@dominio.com.br>

    pkgname=ocaml-<nome_pacote>
    pkgver=4.2
    pkgrel=1
    license=()
    arch=('i686' 'x86_64')
    pkgdesc="An OCaml Package"
    url=""
    depends=('ocaml')
    makedepends=('ocaml-findlib')
    source=()
    options=('!strip')
    md5sums=()

    OCAMLFIND_DESTDIR="${pkgdir}$(ocamlfind printconf destdir)"

    build() {
      cd "${srcdir}/${pkgname}-${pkgver}"
      mkdir -p "$OCAMLFIND_DESTDIR"
      ./configure --prefix=/usr
      make
    }

    package() {
      cd "${srcdir}/${pkgname}-${pkgver}"
      env DESTDIR="${pkgdir}" \
        OCAMLFIND_DESTDIR="$OCAMLFIND_DESTDIR" \
        make install
    }

Tenha em mente que muitos pacotes OCaml frequentemente precisarão de parâmetros extras para o `make` e `make install`. Lembre-se também de remover a opção `!strip` e alterar a arquitetura se o pacote não produzir bytecode.

Category:

- Arch package guidelines (Português)