Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add arm64 cross compilation support to makepkg-mingw (experimental) #2283

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions pacman/PKGBUILD
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,16 @@ makedepends=('asciidoc'
backup=("etc/pacman.conf"
"etc/makepkg.conf"
"etc/makepkg_mingw32.conf"
"etc/makepkg_mingw64.conf")
"etc/makepkg_mingw64.conf"
"etc/makepkg_arm64.conf")
source=(https://sources.archlinux.org/other/pacman/${pkgname}-${pkgver}.tar.gz{,.sig}
"pacman.conf"
"makepkg.conf"
"makepkg_clang32.conf"
"makepkg_clang64.conf"
"makepkg_mingw32.conf"
"makepkg_mingw64.conf"
"makepkg_arm64.conf"
"makepkg-clang"
"makepkg-mingw"
"0000-pacman-msysize.patch"
Expand Down Expand Up @@ -74,8 +76,9 @@ sha256sums=('bb201a9f2fb53c28d011f661d50028efce6eef2c1d2a36728bdd0130189349a0'
'13b20f6833df76a34ca38376469e275f93552ef9063d9ca06fc3c9ef5e87aa0b'
'0e484f00a427f030c95f7ebcab3e0de1e637e55d01531438de9165d1f520cf81'
'c26dba8f9ac285efa33708e58ca29b4ad0fd9a1d6f4e82cbe433782b180799ee'
'73a9af3845902f8bfdeac54a3e745cb2c5957e606a494eb5d25d752302013cb7'
'b50166ba89277459dcf4c18603e57b387b931e5252068fefcb3d2579ebe2dfa4'
'501c38b95fcb6938c79a4cff11913fa257d1751d1f6ea6c482ce95999c3fd3b3'
'8e47b8727b76cdd77991bae65227e0a32e2d87982d5031a0b68e8c42bca02c25'
'2e2dde573b971011abad5340cb2cd5a4b9a0e8470a2ed94d7a969525e0bed0c1'
'24ea2c8dca37847e04894ebfd05d1cf5df49dc0c8089f5581c99caa19b77a7ef'
'ee65a0087af1cb7778836855f8b417b4bf2cf9a2141589ca0adff1e57b53af61'
Expand Down Expand Up @@ -170,6 +173,7 @@ package() {
install -m644 ${srcdir}/makepkg_clang64.conf ${pkgdir}/etc/
install -m644 ${srcdir}/makepkg_mingw32.conf ${pkgdir}/etc/
install -m644 ${srcdir}/makepkg_mingw64.conf ${pkgdir}/etc/
install -m644 ${srcdir}/makepkg_arm64.conf ${pkgdir}/etc/
install -m755 ${srcdir}/makepkg-clang ${pkgdir}/usr/bin/
install -m755 ${srcdir}/makepkg-mingw ${pkgdir}/usr/bin/

Expand Down
15 changes: 12 additions & 3 deletions pacman/makepkg-mingw
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,8 @@ MINGW_INSTALLS="${MINGW_INSTALLS,,}"
MINGW_INSTALLS="${MINGW_INSTALLS:-mingw64 mingw32}"

for _mingw in ${MINGW_INSTALLS}; do
if [ ! "${_mingw}" = 'mingw32' -a ! "${_mingw}" = 'mingw64' ]; then
print_error "Requested mingw installation '${_mingw}', but only 'mingw32' and 'mingw64' are allowed."
if [ ! "${_mingw}" = 'mingw32' -a ! "${_mingw}" = 'mingw64' -a ! "${_mingw}" = 'arm64' ]; then
print_error "Requested mingw installation '${_mingw}', but only 'mingw32', 'mingw64' and 'arm64' are allowed."
exit 1
fi
done
Expand All @@ -86,9 +86,18 @@ for _mingw in ${MINGW_INSTALLS}; do
_arch=x86_64
_msystem=MINGW64
;;
arm64)
_arch=arm64
_msystem=ARM64
;;
esac

if [ -f "/${_mingw}/bin/gcc.exe" ]; then
# Currently, arm64 is only supported through cross-compilation from mingw32
if [ "${_mingw}" = "arm64" -a -f "/mingw32/bin/gcc.exe" ]; then
MSYSTEM=${_msystem} \
PATH=/mingw32/bin:$(echo $PATH | tr ':' '\n' | awk '$0 != "/opt/bin"' | paste -sd:) \
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Something like PATH=/arm64/bin:mingw32/bin:$(echo .... might also work, but I'm currently not sure what the implications of this would be. I assume it would first look for a native binary in /arm64/bin, and if that fails, look at /mingw32/bin instead.

/usr/bin/makepkg --config /etc/makepkg_${_mingw}.conf $@ || exit 1
elif [ -f "/${_mingw}/bin/gcc.exe" ]; then
MSYSTEM=${_msystem} \
PATH=/${_mingw}/bin:$(echo $PATH | tr ':' '\n' | awk '$0 != "/opt/bin"' | paste -sd:) \
/usr/bin/makepkg --config /etc/makepkg_${_mingw}.conf $@ || exit 1
Expand Down
171 changes: 171 additions & 0 deletions pacman/makepkg_arm64.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
#
# /etc/makepkg_mingw64.conf
#

#########################################################################
# SOURCE ACQUISITION
#########################################################################
#
#-- The download utilities that makepkg should use to acquire sources
# Format: 'protocol::agent'
DLAGENTS=('ftp::/usr/bin/curl -fC - --ftp-pasv --retry 3 --retry-delay 3 -o %o %u'
'http::/usr/bin/curl -qb "" -fLC - --retry 3 --retry-delay 3 -o %o %u'
'https::/usr/bin/curl -qb "" -fLC - --retry 3 --retry-delay 3 -o %o %u'
'rsync::/usr/bin/rsync --no-motd -z %u %o'
'scp::/usr/bin/scp -C %u %o')

# Other common tools:
# /usr/bin/snarf
# /usr/bin/lftpget -c
# /usr/bin/wget

#-- The package required by makepkg to download VCS sources
# Format: 'protocol::package'
VCSCLIENTS=('bzr::bzr'
'git::git'
'hg::mercurial'
'svn::subversion')

#-- Using git am to apply patches has benefits, but also downsides
# one being that people without their .gitconfig set get prompts
# and the other being that the sha1s vary each time, so fix them
GIT_COMMITTER_NAME="makepkg"
GIT_COMMITTER_EMAIL="makepkg@msys2.org"
function gitam_mkpkg() {
git am --committer-date-is-author-date "$@"
}

#########################################################################
# ARCHITECTURE, COMPILE FLAGS
#########################################################################
#
CARCH="arm64"
CHOST="x86_64-w64-mingw32"

#########################################################################
# Mingw toolchains stuff
#########################################################################
#
MINGW_CHOST="x86_64-w64-mingw32"
MINGW_PREFIX="/arm64"
MINGW_PACKAGE_PREFIX="mingw-w64-arm64"

# DirectX compatibility environment variable
DXSDK_DIR=${MINGW_PREFIX}/${MINGW_CHOST}

#-- Compiler and Linker Flags
# -march (or -mcpu) builds exclusively for an architecture
# -mtune optimizes for an architecture, but builds for whole processor family
CPPFLAGS="-D_FORTIFY_SOURCE=2 -D__USE_MINGW_ANSI_STDIO=1"
CFLAGS="-march=arm64 -mtune=generic -O2 -pipe"
CXXFLAGS="-march=arm64 -mtune=generic -O2 -pipe"
LDFLAGS="-pipe"
# Uncomment to enable hardening (ASLR, High entropy ASLR, DEP)
#LDFLAGS="-pipe -Wl,--dynamicbase,--high-entropy-va,--nxcompat"
#-- Make Flags: change this for DistCC/SMP systems
MAKEFLAGS="-j$(($(nproc)+1))"
#-- Debugging flags
DEBUG_CFLAGS="-ggdb -Og"
DEBUG_CXXFLAGS="-ggdb -Og"

ACLOCAL_PATH="${MINGW_PREFIX}/share/aclocal:/usr/share/aclocal"
PKG_CONFIG_PATH="${MINGW_PREFIX}/lib/pkgconfig:${MINGW_PREFIX}/share/pkgconfig"

#########################################################################
# BUILD ENVIRONMENT
#########################################################################
#
# Defaults: BUILDENV=(fakeroot !distcc color !ccache check !sign)
# A negated environment option will do the opposite of the comments below.
#
#-- distcc: Use the Distributed C/C++/ObjC compiler
#-- color: Colorize output messages
#-- ccache: Use ccache to cache compilation
#-- check: Run the check() function if present in the PKGBUILD
#-- sign: Generate PGP signature file
#
BUILDENV=(!distcc color !ccache check !sign)
#
#-- If using DistCC, your MAKEFLAGS will also need modification. In addition,
#-- specify a space-delimited list of hosts running in the DistCC cluster.
#DISTCC_HOSTS=""
#
#-- Specify a directory for package building.
#BUILDDIR=/tmp/makepkg

#########################################################################
# GLOBAL PACKAGE OPTIONS
# These are default values for the options=() settings
#########################################################################
#
# Default: OPTIONS=(strip docs !libtool staticlibs emptydirs zipman purge !upx !debug)
# A negated option will do the opposite of the comments below.
#
#-- strip: Strip symbols from binaries/libraries
#-- docs: Save doc directories specified by DOC_DIRS
#-- libtool: Leave libtool (.la) files in packages
#-- staticlibs: Leave static library (.a) files in packages
#-- emptydirs: Leave empty directories in packages
#-- zipman: Compress manual (man and info) pages in MAN_DIRS with gzip
#-- purge: Remove files specified by PURGE_TARGETS
#-- upx: Compress binary executable files using UPX
#-- debug: Add debugging flags as specified in DEBUG_* variables
#
OPTIONS=(strip docs !libtool staticlibs emptydirs zipman purge !upx !debug)

#-- File integrity checks to use. Valid: md5, sha1, sha256, sha384, sha512
INTEGRITY_CHECK=(md5)
#-- Options to be used when stripping binaries. See `man strip' for details.
STRIP_BINARIES="--strip-all"
#-- Options to be used when stripping shared libraries. See `man strip' for details.
STRIP_SHARED="--strip-unneeded"
#-- Options to be used when stripping static libraries. See `man strip' for details.
STRIP_STATIC="--strip-debug"
#-- Manual (man and info) directories to compress (if zipman is specified)
MAN_DIRS=(arm64{{,/local}{,/share},/opt/*}/{man,info})
#-- Doc directories to remove (if !docs is specified)
DOC_DIRS=(arm64/{,local/}{,share/}{doc,gtk-doc})
#-- Files to be removed from all packages (if purge is specified)
PURGE_TARGETS=(arm64/{,share}/info/dir .packlist *.pod)

#########################################################################
# PACKAGE OUTPUT
#########################################################################
#
# Default: put built package and cached source in build directory
#
#-- Destination: specify a fixed directory where all packages will be placed
#PKGDEST=/var/packages-mingw64
#-- Source cache: specify a fixed directory where source files will be cached
#SRCDEST=/var/sources
#-- Source packages: specify a fixed directory where all src packages will be placed
#SRCPKGDEST=/var/srcpackages-mingw64
#-- Log files: specify a fixed directory where all log files will be placed
#LOGDEST=/var/makepkglogs
#-- Packager: name/email of the person or organization building packages
#PACKAGER="John Doe <john@doe.com>"
#-- Specify a key to use for package signing
#GPGKEY=""

#########################################################################
# COMPRESSION DEFAULTS
#########################################################################
#
COMPRESSGZ=(gzip -c -f -n)
COMPRESSBZ2=(bzip2 -c -f)
COMPRESSXZ=(xz -c -z -T0 -)
COMPRESSLRZ=(lrzip -q)
COMPRESSLZO=(lzop -q)
COMPRESSZ=(compress -c -f)

#########################################################################
# EXTENSION DEFAULTS
#########################################################################
#
# WARNING: Do NOT modify these variables unless you know what you are
# doing.
#
PKGEXT='.pkg.tar.xz'
SRCEXT='.src.tar.gz'

# vim: set ft=sh ts=2 sw=2 et: