AgentSkillsCN

archlinux-pkgbuild/cross-platform

适用于在 Wine 下打包 Windows 应用程序、使用 MinGW 交叉编译 Windows 应用程序、打包基于 Electron 的应用程序,或 .NET/Mono 应用程序时使用。

SKILL.md
--- frontmatter
name: archlinux-pkgbuild/cross-platform
description: Use when packaging Windows applications under Wine, cross-compiling for Windows with MinGW, packaging Electron-based applications, or .NET/Mono applications

Cross-Platform Compatibility Packages

For core PKGBUILD workflow, use archlinux-pkgbuild

This sub-skill covers packaging software that bridges platforms: Windows apps via Wine, Windows binaries via MinGW, web apps via Electron, and .NET apps via Mono/CLR.

Quick Reference

PlatformUse CaseKey DependencyInstall LocationArchitecture
WineWindows apps on Linuxwine/opt/appname/x86_64
MinGWCross-compile for Windowsmingw-w64-gcc/usr/{i686,x86_64}-w64-mingw32/any
ElectronWeb apps as desktop appselectron*/usr/lib/appname/x86_64/any
CLR/Mono.NET apps on Linuxmono/usr/lib/appname/any

Wine Packages

Wine packages provide Windows software that runs via Wine compatibility layer.

Wine Key Rules

RuleDescription
Package namingUse application name (no wine- prefix unless conflicts)
Architecturex86_64 (even if 32-bit Windows app - wine provides multilib)
Wine dependencyDepend on wine or wine-staging
Install location/opt/appname/ or /usr/share/appname/
Wrapper scriptRequired in /usr/bin/ to launch via wine
WINEPREFIXUse per-application prefix in user's home
Desktop integrationProvide .desktop file with correct Exec line

Wine Template

bash
pkgname=example-app
pkgver=1.0.0
pkgrel=1
pkgdesc="Example Windows application (Wine)"
arch=('x86_64')
url="https://example.com"
license=('custom')
depends=('wine')
optdepends=('wine-gecko: HTML rendering'
            'wine-mono: .NET support')
source=("https://example.com/download/Example-$pkgver.exe")
sha256sums=('...')

package() {
    # Install Windows executable and files
    install -dm755 "$pkgdir/opt/$pkgname"
    install -Dm755 Example-$pkgver.exe "$pkgdir/opt/$pkgname/example.exe"
    
    # Install wrapper script
    install -Dm755 /dev/stdin "$pkgdir/usr/bin/$pkgname" << 'EOF'
#!/bin/bash
export WINEPREFIX="$HOME/.wine-example"
export WINEARCH=win32  # or win64

# Initialize prefix if needed
if [ ! -d "$WINEPREFIX" ]; then
    wineboot -u
fi

# Launch application
exec wine /opt/example-app/example.exe "$@"
EOF
    
    # Desktop file
    install -Dm644 /dev/stdin "$pkgdir/usr/share/applications/$pkgname.desktop" << EOF
[Desktop Entry]
Name=Example Application
Comment=Example Windows app via Wine
Exec=/usr/bin/$pkgname
Icon=$pkgname
Type=Application
Categories=Utility;
EOF
    
    # Install icon
    install -Dm644 icon.png "$pkgdir/usr/share/pixmaps/$pkgname.png"
    
    # Install license
    install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
}

Wine Common Issues

IssueCauseFix
Shared WINEPREFIXMultiple apps using default prefixUse dedicated WINEPREFIX per app
Wrong architecture32-bit app with win64 prefixSet WINEARCH=win32
Missing DLLsNative Windows DLLs neededBundle DLLs or use winetricks
Installer won't extractWrong extraction methodUse cabextract or innoextract
Desktop file won't launchWrong Exec pathUse absolute path to wrapper script
Icon not showingWrong icon formatExtract .ico with wrestool/icotool

MinGW Packages

MinGW packages cross-compile software to run on Windows using mingw-w64 toolchain.

MinGW Key Rules

RuleDescription
Package namingmingw-w64-pkgname (static: mingw-w64-pkgname-static)
ArchitectureAlways any (unless executables run on build system)
Prefixes/usr/i686-w64-mingw32/ and /usr/x86_64-w64-mingw32/
DependenciesAlways depend on mingw-w64-crt
makedependsAlways include mingw-w64-gcc
optionsAlways: !strip, staticlibs, !buildflags
Build both32-bit (i686) AND 64-bit (x86_64) versions

MinGW Template

bash
pkgname=mingw-w64-example
pkgver=1.0.0
pkgrel=1
pkgdesc="Example library (mingw-w64)"
arch=('any')
url="https://example.com"
license=('GPL')
makedepends=('mingw-w64-configure')
depends=('mingw-w64-crt')
options=('!strip' '!buildflags' 'staticlibs')
source=("https://example.com/example-$pkgver.tar.gz")
sha256sums=('...')

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

build() {
  cd example-$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 "example-$pkgver/build-${_arch}"
    make DESTDIR="${pkgdir}" install
    ${_arch}-strip --strip-unneeded "$pkgdir"/usr/${_arch}/bin/*.dll
    ${_arch}-strip -g "$pkgdir"/usr/${_arch}/lib/*.a
    rm -r "$pkgdir"/usr/${_arch}/share/{doc,man,info}
  done
}

MinGW Common Issues

IssueCauseFix
Files in /usr/localWrong prefixSet --prefix=/usr/${_arch}
Missing DLLsNot in bin/ directoryInstall DLLs to /usr/${_arch}/bin/
Only 32-bit or 64-bitMissing architectureBuild for both i686 and x86_64
No static librariesOnly shared builtBuild both shared and static

Electron Packages

Electron packages bundle web applications with Chromium and Node.js runtime. Use system electron when possible.

Electron Key Rules

RuleDescription
Use system electronPrefer electron package over bundled runtime
Package namingNo special suffix (use upstream name)
electron dependencyAdd versioned electron* (e.g., electron34) to depends
Architectureany if no native extensions, x86_64 if compiled modules
Wrapper scriptRequired to launch app with system electron
Resources location/usr/lib/appname/ (arch-dependent) or /usr/share/appname/ (any)

Electron Template

bash
pkgname=example-app
pkgver=1.0.0
pkgrel=1
pkgdesc="Example Electron application"
arch=('x86_64')
url="https://example.com"
license=('MIT')
depends=('electron34')
makedepends=('npm' 'nodejs')
source=("https://example.com/$pkgname-$pkgver.tar.gz")
sha256sums=('...')

build() {
    cd "$pkgname-$pkgver"
    
    # Update electron version
    npm pkg set devDependencies.electron=$(cat /usr/lib/electron34/version)
    
    # Install dependencies
    npm install
    
    # Build with electron-builder
    ./node_modules/.bin/electron-builder --linux --x64 --dir \
        -c.electronDist=/usr/lib/electron34 \
        -c.electronVersion=$(cat /usr/lib/electron34/version)
}

package() {
    cd "$pkgname-$pkgver"
    
    # Install app resources (not electron runtime)
    install -dm755 "$pkgdir/usr/lib/$pkgname"
    cp -r dist/linux-unpacked/resources/app "$pkgdir/usr/lib/$pkgname/"
    
    # Create wrapper script
    install -Dm755 /dev/stdin "$pkgdir/usr/bin/$pkgname" << EOF
#!/bin/sh
exec /usr/bin/electron34 /usr/lib/$pkgname/app "\$@"
EOF
    
    # Desktop file
    install -Dm644 "$pkgname.desktop" "$pkgdir/usr/share/applications/$pkgname.desktop"
    
    # Icon
    install -Dm644 icon.png "$pkgdir/usr/share/pixmaps/$pkgname.png"
    
    # License
    install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
}

Electron Common Issues

IssueCauseFix
Bundled electronNot using system electronUse electron dependency + wrapper
Wrong electron versionVersion mismatchMatch electron version in package.json
Missing app.asarWrong build outputCheck electron-builder config
Wrapper doesn't workWrong path to appVerify /usr/lib/$pkgname/app exists

CLR Packages (.NET/Mono)

CLR packages use Mono runtime for .NET applications. Mono provides CLR runtime on Linux.

CLR Key Rules

RuleDescription
Package namingAppend -mono suffix (e.g., example-mono)
archAlways any (Mono doesn't support 64-bit compilation yet)
optionsAlways include !strip
mono dependencyAlways add mono to depends
Signed assembliesGAC installation requires signed DLLs
Debug databaseConvert .pdb to .mdb: pdb2mdb Foo.dll
ExecutablesInstall shell wrapper to /usr/bin

CLR Template

bash
pkgname=foo-mono
_pkgname=foo
pkgver=1.0.0
pkgrel=1
pkgdesc=".NET library for Foo"
arch=('any')
url="https://example.com"
license=('GPL')
depends=('mono')
makedepends=('mono')
options=('!strip')
source=("https://example.com/$_pkgname-$pkgver.tar.gz")
sha256sums=('...')

build() {
    cd "$_pkgname-$pkgver"
    xbuild Foo.sln
}

package() {
    cd "$_pkgname-$pkgver/bin/Release"
    
    # For libraries: install DLL
    install -Dm644 Foo.dll "$pkgdir/usr/lib/$_pkgname/Foo.dll"
    
    # For executables: install wrapper script
    install -dm755 "$pkgdir/usr/bin"
    cat > "$pkgdir/usr/bin/$_pkgname" << 'EOF'
#!/bin/sh
exec mono /usr/lib/$_pkgname/Foo.exe "$@"
EOF
    chmod 755 "$pkgdir/usr/bin/$_pkgname"
}

CLR Common Issues

IssueCauseFix
Assembly not foundWrong DLL locationInstall to /usr/lib/appname/
Strip breaks DLLmakepkg strips .NET assembliesAdd !strip to options
Missing mono runtimeNot in dependsAdd mono to depends
GAC install failsUnsigned assemblySign assembly or skip GAC