MinGW package guidelines (Português) - ArchWiki

Jump to content
From ArchWiki
Status de tradução: Esse artigo é uma tradução de MinGW package guidelines. Data da última tradução: 2019-10-13. Você pode ajudar a sincronizar a tradução, se houver alterações na versão em inglês.

Esta página explica como escrever PKGBUILDs para software em execução no Windows usando o GCC. Existem duas opções para criar software para o Windows no Linux:

- mingw-w64: fornece cadeia de ferramentas de 32 e 64 bits com suporte a secure crt, Vista+ API, DDK (ReactOS) e DirectX (WINE). Para uma lista completa dos recursos e diferenças suportados com o antigo MinGW.org, veja aqui. Disponível em mingw-w64-gcc.
- MinGW: fornece cadeia de ferramentas de 32 bits com suporte limitado a DirectX. Ele também sofre com a quebra de longa duração na implementação do armazenamento local de encadeamento e no suporte à biblioteca de ponto flutuante. Foi removido dos repositórios oficiais e do AUR.

## Nomenclatura de pacote

Um pacote para mingw-w64 deve ser nomeado `mingw-w64-pkgname`. Se uma variante estática do pacote está sendo compilado, acrescente o sufixo de nome de pacote com `-static` (veja abaixo para os casos nos quais isso é necessário).

## Empacotamento

O empacotamento para pacotes de plataforma cruzada pode ser bastante complicada, pois há muitos sistemas de construção diferentes e peculiaridades de baixo nível. Tome nota das seguintes coisas:

- sempre adicione mingw-w64-crt ao `depends`, a menos que ele dependa de outro pacote que implicitamente depende dele
- sempre adicione mingw-w64-gcc ao `makedepends`, a menos que esteja usando mingw-w64-configureAUR ou mingw-w64-cmakeAUR
- sempre adicione `!strip`, `staticlibs` e `!buildflags` ao `options`
- sempre use o `pkgdesc` original e adicione `(mingw-w64)` ao fim do `pkgdesc`
- sempre use e siga o `pkgver` original do pacote oficial
- sempre compile as versões 32 bit e 64 bit das bibliotecas
- sempre coloque todas as coisas sob o prefixo `/usr/i686-w64-mingw32` e `/usr/x86_64-w64-mingw32`
- sempre use `any` como a arquitetura (exceto que o pacote contém executáveis que devem ser executados no sistema de compilação)
- sempre compile os binários compartilhados e estáticos, a menos que eles conflitem
- considere a remoção de documentação desnecessária (`rm -r $pkgdir/usr/i686-w64-mingw32/share/{doc,info,man}`, `rm -r $pkgdir/usr/x86_64-w64-mingw32/share/{doc,info,man}`)
- considere usar mingw-w64-configureAUR para compilação com scripts de configuração
- considere usar mingw-w64-cmakeAUR para compilação com CMake
- considere usar mingw-w64-qt5-baseAUR ou mingw-w64-qt4AUR[link quebrado: package not found] para compilação com QMake
- considere usar opções de compilação `-D_FORTIFY_SOURCE=2 -O2 -pipe -fno-plt -fexceptions --param=ssp-buffer-size=4` (geralmente nomeadas com CFLAGS, CXXFLAGS) quando nenhum sistema de compilação adequado foi fornecido
- considere remover símbolos explicitamente com `${_arch}-strip` em loop for `package()` como demonstrado nos exemplos de PKGBUILD abaixo.
  - considere usar o comando find para interagir com `$pkgdir` já que todas DLLs, bibliotecas estáticas ou executáveis podem residir em localizações apropriadas.
    - se o binário é uma DLL, use `${_arch}-strip --strip-unneeded *.dll`
    - se o binário é uma biblioteca estática, use `${_arch}-strip -g *.a`
- se um pacote é modular (requer certas dependências de compilação, mas tais dependências são opcionais para o usuário final) adicione essas ao `makedepends` e `optdepends`. Certifique-se de subtrai-los do `depends` se estiver atualizando um pacote existente. Exemplo disto em uso: mingw-w64-rubyAUR[link quebrado: package not found], mingw-w64-allegroAUR[link quebrado: package not found]
- se um pacote instala um script `$pkgdir/usr/${_arch}/bin/*-config`, crie um link simbólico para `$pkgdir/usr/bin/${_arch}-*-config`
- se um pacote usa autoconf, defina explicitamente `--build="$CHOST"` no `configure` para contornar o bug #108405 do autoconf ou usar mingw-w64-configureAUR

Como mencionado acima, os arquivos devem ser todos instalados em `/usr/i686-w64-mingw32` e `/usr/x86_64-w64-mingw32`. Especificamente, todas as DLLs devem ser colocadas em `/usr/*-w64-mingw32/bin`, pois são bibliotecas dinâmicas necessárias no tempo de execução. Seus arquivos `.dll.a` correspondentes devem ir para `/usr/*-w64-mingw32/lib`. Por favor, exclua qualquer documentação desnecessária e talvez outros arquivos de `/usr/share`. Os pacotes de compilações cruzadas não são destinados ao usuário, mas apenas ao compilador e à distribuição binária, e, como tal, você deve tentar torná-los o menor possível.

Sempre tente combinar o `pkgver` em seus pacotes mingw-w64 com o `pkgver` dos pacotes comuns correspondentes nas repositórios oficiais do Arch Linux (e não nos repos de teste). Isso garante que o software de compilação cruzada funcione exatamente da mesma maneira no Windows, sem nenhum erro inesperado. Se os pacotes no Arch estão desatualizados, geralmente há uma boa razão e você ainda deve seguir a versão do Arch em vez de usar o release upstream mais recente. Se o pacote nativo correspondente estiver no AUR, não será necessário seguir esta política de versão, pois muitos pacotes do AUR são muitas vezes órfãos ou não são mantidos.

## Exemplos

Os exemplos a seguir tentarão cobrir algumas das convenções e sistemas de compilação mais comuns.

### Autotools

    pkgname=mingw-w64-foo
    pkgver=1.0
    pkgrel=1
    pkgdesc="Foo bar (mingw-w64)"
    arch=('any')
    url="http://www.foo.bar"
    license=('GPL')
    makedepends=('mingw-w64-configure')
    depends=('mingw-w64-crt')
    options=('!strip' '!buildflags' 'staticlibs')
    source=("http://www.foo.bar/foobar.tar.gz")
    sha256sums=('8f32d4617390d1c2d16f26a27ab60d97807b35440d45891fa340fc2648b04406')

    _architectures="i686-w64-mingw32 x86_64-w64-mingw32"

    build() {
      cd "${srcdir}/foo-$pkgver/"
      for _arch in ${_architectures}; do
        mkdir -p build-${_arch} && pushd build-${_arch}
        ${_arch}-configure ..
        make
        popd
      done
    }

    package() {
      for _arch in ${_architectures}; do
        cd "${srcdir}/foo-$pkgver/build-${_arch}"
        make DESTDIR="${pkgdir}" install
        ${_arch}-strip --strip-unneeded "$pkgdir"/usr/${_arch}/bin/*.dll
        ${_arch}-strip -g "$pkgdir"/usr/${_arch}/lib/*.a
      done
    }

### CMake

    pkgname=mingw-w64-foo
    pkgver=1.0
    pkgrel=1
    pkgdesc="Foo bar (mingw-w64)"
    arch=('any')
    url="http://www.foo.bar"
    license=('GPL')
    makedepends=('mingw-w64-cmake')
    depends=('mingw-w64-crt')
    options=('!strip' '!buildflags' 'staticlibs')
    source=("http://www.foo.bar/foobar.tar.gz")
    sha256sums=('8f32d4617390d1c2d16f26a27ab60d97807b35440d45891fa340fc2648b04406')
    _architectures="i686-w64-mingw32 x86_64-w64-mingw32"

    build() {
      cd "$srcdir/foo-$pkgver/"
      for _arch in ${_architectures}; do
        mkdir -p build-${_arch} && pushd build-${_arch}
        ${_arch}-cmake ..
        make
        popd
      done
    }

    package() {
      for _arch in ${_architectures}; do
        cd "${srcdir}/foo-$pkgver/build-${_arch}"
        make DESTDIR="${pkgdir}" install
        ${_arch}-strip --strip-unneeded "$pkgdir"/usr/${_arch}/bin/*.dll
        ${_arch}-strip -g "$pkgdir"/usr/${_arch}/lib/*.a
      done
    }

Category:

- Arch package guidelines (Português)

Hidden category:

- Pages with broken package links