MinGW 包指南

MinGW 包指南

Arch 软件包指南

32位 – CLR – CMake – 交叉编译工具 – DKMS – Eclipse 插件 – Electron – 字体 – Free Pascal – GNOME – Go – Haskell – Java – KDE – 内核模块 – Lisp – Meson – MinGW – Node.js – 非自由应用 – OCaml – Perl – PHP – Python – R – Ruby – Rust - 安全 – Shell – VCS – Web 应用 – Wine

本页介绍如何为在 Windows 上运行的软件编写 PKGBUILD。

要在 Linux 上为 Windows 构建软件,你需要

Windows 头文件和 WinAPI 及 C 标准库的导入库。有两种方式获取这些:mingw-w64:提供 32 位和 64 位工具链,具有安全 crt、Vista+ API、DDK (ReactOS) 和 DirectX (WINE) 支持。有关支持功能的完整列表以及与旧 MinGW.org 的区别,请参见此处。可通过安装 mingw-w64-headers 和 mingw-w64-crt 从官方仓库获取。提供其他库的 AUR 包依赖于这些包。

MinGW:提供 32 位工具链,具有有限的 DirectX 支持。它还存在线程本地存储和浮点库支持实现方面的长期故障。它已被从官方仓库和 AUR 中移除。

编译器及其运行时库。对于 C/C++,可以使用 GCC 和 Clang。要使用 GCC,需要安装 mingw-w64-gcc,因为不能使用普通的 gcc 包。要使用 Clang,只需使用 clang 并指定 `*-w64-mingw32` 平台三元组作为目标。由于普通的 clang 包不包含 Windows 目标的编译器运行时库,因此需要单独编译它们,或者使用 mingw-w64-gcc 提供的运行时。提供其他库的 AUR 包依赖于 mingw-w64-gcc。

对于 Rust,可以使用 mingw-w64-rustAUR。普通的 rust 包不是为了能够交叉编译到 Windows 而构建的。如果使用 rustup 包安装了 Rust,则应添加 Windows 目标:rustup target add x86_64-pc-windows-gnu。

对于 Go,只需使用普通的 go 包。

C/C++ 标准库。可以使用 mingw-w64-gcc 提供的 libstdc++ 或 LLVM 项目的 libc++。提供其他库的 AUR 包依赖于 libstdc++。

链接器和其他工具。可以使用 mingw-w64-binutils 提供的 GNU binutils,或者 llvm 和 lld 提供的 LLVM/lld。还有一个 mingw-w64-toolsAUR,提供了一些额外的 Windows 特定工具。

对于 ix86/x86_64,典型选择是使用 mingw-w64- 与 GCC/libstdc++ 和 binutils。因此,遵循 `mingw-w64-pkgname` 包命名约定的 AUR 包就是这样使用的。本 Wiki 页面的其余部分将重点介绍这些包。

还有名为 `llvm-mingw-w64-pkgname` 的 AUR 包,它们使用 LLVM/Clang/libc++,并且除了 i686 和 x86_64 外还支持 aarch64。这些包依赖于 https://github.com/mstorsjo/llvm-mingw 的构建,并且不使用 Arch Linux 提供的 LLVM/Clang。只有少数核心包存在。

还有由 https://github.com/Martchus/PKGBUILDs 提供的名为 `mingw-w64-clang-arch-pkgname` 的包。这些包使用 Arch Linux 提供的 llvm、lld 和 clang,并且仅在之上提供 mingw-w64、LLVM 编译器运行时库和 libc++。这些包目前只存在于 aarch64 目标。它们主要是通过转换脚本从 `mingw-w64-pkgname` AUR 包生成而来,以便能够提供比核心工具链更多的内容,而无需太多额外的努力。到目前为止,已将 100 多个 `mingw-w64-pkgname` 包转换为 `mingw-w64-clang-aarch64-pkgname` 包。由于它们是自动生成的,因此尚未上传到 AUR,但生成器和二进制仓库可以在上述 GitHub 仓库中找到。

包命名

mingw-w64 包应命名为 `mingw-w64-pkgname`。如果正在构建包的静态版本,则在包名后附加 `-static`(如果需要,请参见下文)。

打包

跨平台包的打包可能相当棘手,因为存在许多不同的构建系统和底层细微差别。但请注意以下几点:

始终将 mingw-w64-crt 添加到 depends,除非它依赖于另一个隐式依赖于它的包。

始终将 mingw-w64-gcc 添加到 makedepends,除非使用 mingw-w64-configureAUR 或 mingw-w64-cmakeAUR。

始终在 options 中添加 !strip、staticlibs 和 !buildflags。

始终使用原始的 pkgdesc,并在 pkgdesc 的末尾附加 (mingw-w64)。

始终使用并遵循官方包的原始 pkgver。

始终构建库的 32 位和 64 位版本。

始终将所有内容置于 /usr/i686-w64-mingw32 和 /usr/x86_64-w64-mingw32 前缀下。

始终使用 any 作为架构(除非包包含必须在构建系统上运行的可执行文件)。

始终构建共享库和静态库。使用 autotools 的项目通常可以一次性构建两者,使用 mingw-w64-configureAUR 时,会同时启用共享库和静态库。

如果构建系统或项目不支持此功能,则分别构建两者。

如果共享库和静态库构建发生冲突(例如,因为头文件或 CMake 配置文件不同),则考虑将静态库安装到 /usr/i686-w64-mingw32/static 和 /usr/x86_64-w64-mingw32/static。

对于较大的项目,请考虑创建单独的 -static 包。

考虑移除不需要的文档(rm -r $pkgdir/usr/i686-w64-mingw32/share/{doc,info,man}, rm -r $pkgdir/usr/x86_64-w64-mingw32/share/{doc,info,man})。

使用 mingw-w64-configureAUR 来构建带有 configure 脚本的项目。

使用 mingw-w64-cmakeAUR 来构建带有 CMake 的项目。

使用 mingw-w64-mesonAUR 来构建带有 Meson 的项目。

使用 mingw-w64-makeAUR 来构建带有原始 Makefiles 的项目。

使用 mingw-w64-qt5-baseAUR 来构建带有 QMake 的项目。

在 package() 的 for 循环中,考虑使用 ${_arch}-strip 显式剥离符号,如下面的 PKGBUILD 示例所示。考虑使用 find 命令来迭代 $pkgdir,因为并非所有 DLL、静态库或可执行文件都可能位于其应有的位置。如果二进制文件是 DLL,请使用 ${_arch}-strip --strip-unneeded *.dll。

如果二进制文件是静态库,请使用 ${_arch}-strip -g *.a。

如果一个包是模块化的(需要某些构建依赖项,但这些依赖项对最终用户是可选的),请将它们添加到 makedepends 和 optdepends。更新现有包时,请务必将其从 depends 中减去。使用示例:mingw-w64-qt6-baseAUR。

如果一个包安装了 $pkgdir/usr/${_arch}/bin/*-config 脚本,请将其符号链接到 $pkgdir/usr/bin/${_arch}-*-config。

如果一个包使用 autoconf,请明确设置 configure 的 --build="$CHOST" 来解决 autoconf bug #108405,或使用 mingw-w64-configureAUR。

如上所述,所有文件都应安装到 /usr/i686-w64-mingw32 和 /usr/x86_64-w64-mingw32。具体来说,所有 DLL 都应放在 /usr/*-w64-mingw32/bin 中,因为它们是运行时所需的动态库。它们对应的 .dll.a 文件应放在 /usr/*-w64-mingw32/lib。请删除 /usr/share 中任何不必要的文档以及其他文件。交叉编译包不是为用户准备的,仅供编译器和二进制分发使用,因此您应该尽量使它们体积最小。

始终尝试使您的 mingw-w64 包的 pkgver 与官方 Arch Linux 仓库(非测试仓库)中相应普通包的 pkgver 匹配。这可以确保交叉编译的软件在 Windows 上运行方式完全相同,没有意外的 bug。如果 Arch 中的包已过时,通常有其原因,您仍应遵循 Arch 的版本,而不是使用最新的上游发布版本。如果相应的本地包在 AUR 中,则不必遵循此版本策略,因为许多 AUR 包经常被弃用或无人维护。

示例

以下示例将尝试涵盖一些最常见的约定和构建系统。

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 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 "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 foo-$pkgver

for _arch in ${_architectures}; do

${_arch}-cmake -B build-${_arch} .

make -C build-${_arch}

done

}

package() {

for _arch in ${_architectures}; do

cd "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

}

更多创意

原神圣水在哪买
365沙巴体育注册

原神圣水在哪买

📅 10-15 🔥 6884
南京九五至尊2025价目表 最新南京九五至尊价格一览表
77365bet体育在线投注

南京九五至尊2025价目表 最新南京九五至尊价格一览表

📅 06-30 🔥 4839
47分钟等于多少小时?
77365bet体育在线投注

47分钟等于多少小时?

📅 07-14 🔥 8956