MinGW package guidelines (Português)

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.
Diretrizes de pacotes do Arch
32-bit
–
CLR
–
CMake
–
Cross
–
DKMS
–
Eclipse
–
Electron
–
Fonte
–
Free Pascal
–
GNOME
–
Go
–
Haskell
–
Java
–
KDE
–
Kernel
–
Lisp
–
Meson
–
MinGW
–
Node.js
–
Nonfree
–
OCaml
–
Perl
–
PHP
–
Python
–
R
–
Ruby
–
Rust
–
Shell
–
VCS
–
Web
–
Wine
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-configure
AUR
ou
mingw-w64-cmake
AUR
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-configure
AUR
para compilação com scripts de configuração
considere usar
mingw-w64-cmake
AUR
para compilação com CMake
considere usar
mingw-w64-qt5-base
AUR
ou
mingw-w64-qt4
AUR
[
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-ruby
AUR
[
link quebrado
: package not found]
,
mingw-w64-allegro
AUR
[
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-configure
AUR
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
}