diff --git a/Makefile b/Makefile index d89dbc0..20332e3 100644 --- a/Makefile +++ b/Makefile @@ -25,7 +25,8 @@ SHARED_BASE = \ data/pacman-multilib.conf \ data/pacman-mirrors-stable.conf \ data/pacman-mirrors-testing.conf \ - data/pacman-mirrors-unstable.conf + data/pacman-mirrors-unstable.conf \ + data/pacman-arm.conf SETS_PKG = \ data/pkg.d/default.set @@ -47,7 +48,8 @@ LIBS_PKG = \ SHARED_PKG = \ data/makepkg-i686.conf \ data/base-devel-udev \ - data/makepkg-x86_64.conf + data/makepkg-x86_64.conf \ + data/makepkg-arm.conf SETS_ISO = \ data/iso.d/default.set \ diff --git a/bin/buildpkg.in b/bin/buildpkg.in index bb0ccf4..d51024b 100644 --- a/bin/buildpkg.in +++ b/bin/buildpkg.in @@ -128,22 +128,7 @@ while getopts "${opts}" arg; do esac done -if [[ "${target_arch}" == 'multilib' ]]; then - pacman_conf_arch=${target_arch} - work_dir=${chroots_pkg}/${target_branch}/${target_arch} - pkg_dir=${cache_dir_pkg}/${target_branch}/${target_arch} - arch='x86_64' - is_multilib=true -else - pacman_conf_arch='default' - work_dir=${chroots_pkg}/${target_branch}/${target_arch} - pkg_dir=${cache_dir_pkg}/${target_branch}/${target_arch} - is_multilib=false -fi - -pacman_conf="${DATADIR}/pacman-${pacman_conf_arch}.conf" -makepkg_conf="${DATADIR}/makepkg-${target_arch}.conf" -mirrors_conf="${DATADIR}/pacman-mirrors-${target_branch}.conf" +configure_chroot_arch "${target_arch}" mkchroot_args+=(-C ${pacman_conf} -M ${makepkg_conf} -S ${mirrors_conf} -B "${build_mirror}/${target_branch}") diff --git a/data/makepkg-arm.conf b/data/makepkg-arm.conf new file mode 100644 index 0000000..7a75cdd --- /dev/null +++ b/data/makepkg-arm.conf @@ -0,0 +1,147 @@ +# +# /etc/makepkg.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 -fLC - --retry 3 --retry-delay 3 -o %o %u' + 'https::/usr/bin/curl -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') + +######################################################################### +# ARCHITECTURE, COMPILE FLAGS +######################################################################### +# +CARCH="@CARCH@" +CHOST="@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" +CFLAGS="@CARCHFLAGS@-O2 -pipe -fstack-protector --param=ssp-buffer-size=4" +CXXFLAGS="@CARCHFLAGS@-O2 -pipe -fstack-protector --param=ssp-buffer-size=4" +LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro" +#-- Make Flags: change this for DistCC/SMP systems +#MAKEFLAGS="-j2" +#-- Debugging flags +DEBUG_CFLAGS="-g -fvar-tracking-assignments" +DEBUG_CXXFLAGS="-g -fvar-tracking-assignments" + +######################################################################### +# BUILD ENVIRONMENT +######################################################################### +# +# Defaults: BUILDENV=(fakeroot !distcc color !ccache check !sign) +# A negated environment option will do the opposite of the comments below. +# +#-- fakeroot: Allow building packages as a non-root user +#-- 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 !optipng !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 !optipng !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=({usr{,/local}{,/share},opt/*}/{man,info}) +#-- Doc directories to remove (if !docs is specified) +DOC_DIRS=(usr/{,local/}{,share/}{doc,gtk-doc} opt/*/{doc,gtk-doc}) +#-- Files to be removed from all packages (if purge is specified) +PURGE_TARGETS=(usr/{,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=/home/packages +#-- Source cache: specify a fixed directory where source files will be cached +#SRCDEST=/home/sources +#-- Source packages: specify a fixed directory where all src packages will be placed +#SRCPKGDEST=/home/srcpackages +#-- Log files: specify a fixed directory where all log files will be placed +#LOGDEST=/home/makepkglogs +#-- Packager: name/email of the person or organization building packages +#PACKAGER="John Doe " +#-- Specify a key to use for package signing +#GPGKEY="" + +######################################################################### +# COMPRESSION DEFAULTS +######################################################################### +# +COMPRESSGZ=(gzip -c -f -n) +COMPRESSBZ2=(bzip2 -c -f) +COMPRESSXZ=(xz -c -z -) +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: diff --git a/data/pacman-arm.conf b/data/pacman-arm.conf new file mode 100644 index 0000000..4edcc14 --- /dev/null +++ b/data/pacman-arm.conf @@ -0,0 +1,96 @@ +# +# /etc/pacman.conf +# +# See the pacman.conf(5) manpage for option and repository directives + +# +# GENERAL OPTIONS +# +[options] +# The following paths are commented out with their default values listed. +# If you wish to use different paths, uncomment and update the paths. +#RootDir = / +#DBPath = /var/lib/pacman/ +#CacheDir = /var/cache/pacman/pkg/ +#LogFile = /var/log/pacman.log +#GPGDir = /etc/pacman.d/gnupg/ +#HookDir = /etc/pacman.d/hooks/ +HoldPkg = pacman glibc +# If upgrades are available for these packages they will be asked for first +SyncFirst = manjaro-system archlinux-keyring manjaro-keyring +#XferCommand = /usr/bin/curl -C - -f %u > %o +#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u +#CleanMethod = KeepInstalled +#UseDelta = 0.7 +Architecture = @CARCH@ + +# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup +#IgnorePkg = +#IgnoreGroup = + +#NoUpgrade = +#NoExtract = + +# Misc options +#UseSyslog +#Color +#TotalDownload +# We cannot check disk space from within a chroot environment +#CheckSpace +#VerbosePkgLists + +# By default, pacman accepts packages signed by keys that its local keyring +# trusts (see pacman-key and its man page), as well as unsigned packages. +SigLevel = Required DatabaseOptional +LocalFileSigLevel = Optional +#RemoteFileSigLevel = Required + +# NOTE: You must run `pacman-key --init` before first using pacman; the local +# keyring can then be populated with the keys of all official Manjaro Linux +# packagers with `pacman-key --populate archlinux manjaro`. + +# +# REPOSITORIES +# - can be defined here or included from another file +# - pacman will search repositories in the order defined here +# - local/custom mirrors can be added here or in separate files +# - repositories listed first will take precedence when packages +# have identical names, regardless of version number +# - URLs will have $repo replaced by the name of the current repo +# - URLs will have $arch replaced by the name of the architecture +# +# Repository entries are of the format: +# [repo-name] +# Server = ServerName +# Include = IncludePath +# +# The header [repo-name] is crucial - it must be present and +# uncommented to enable the repo. +# + +# The testing repositories are disabled by default. To enable, uncomment the +# repo name header and Include lines. You can add preferred servers immediately +# after the header, and they will be used before the default mirrors. + +[core] +SigLevel = PackageRequired +Include = /etc/pacman.d/mirrorlist + +[extra] +SigLevel = PackageRequired +Include = /etc/pacman.d/mirrorlist + +[community] +SigLevel = PackageRequired +Include = /etc/pacman.d/mirrorlist + +[arm-example] +SigLevel = PackageRequired +Include = /etc/pacman.d/mirrorlist + +# An example of a custom package repository. See the pacman manpage for +# tips on creating your own repositories. +#[custom] +#SigLevel = Optional TrustAll +#Server = file:///home/custompkgs + diff --git a/lib/util-pkg.sh b/lib/util-pkg.sh index 561a127..8dfadce 100644 --- a/lib/util-pkg.sh +++ b/lib/util-pkg.sh @@ -9,6 +9,76 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. +preconf_arm(){ + local conf_dir=/tmp + cp "${DATADIR}/pacman-arm.conf" "$conf_dir/pacman-$1.conf" + cp "${DATADIR}/makepkg-arm.conf" "$conf_dir/makepkg-$1.conf" + sed -i "$conf_dir/makepkg-$1.conf" \ + -e "s|@CARCH[@]|$1|g" \ + -e "s|@CHOST[@]|$2|g" \ + -e "s|@CARCHFLAGS[@]|$3|g" + sed -i "$conf_dir/pacman-$1.conf" -e "s|@CARCH[@]|$1|g" + + work_dir="${chroots_pkg}/${target_branch}/$1" + pkg_dir="${cache_dir_pkg}/${target_branch}/$1" + + makepkg_conf="$conf_dir/makepkg-$1.conf" + pacman_conf="$conf_dir/pacman-$1.conf" +} + +preconf(){ + work_dir="${chroots_pkg}/${target_branch}/$1" + pkg_dir="${cache_dir_pkg}/${target_branch}/$1" + if [[ "$1" == 'multilib' ]];then + target_arch='x86_64' + is_multilib=true + else + is_multilib=false + fi + makepkg_conf="${DATADIR}/makepkg-${target_arch}.conf" + pacman_conf="${DATADIR}/pacman-$1.conf" +} + +configure_chroot_arch(){ + local conf_arch chost_desc cflags + case "$1" in + 'arm') + conf_arch="$1" + chost_desc="armv5tel-unknown-linux-gnueabi" + cflags="-march=armv5te " + preconf_arm "$conf_arch" "$chost_desc" "$cflags" + ;; + 'armv6h') + conf_arch="$1" + chost_desc="armv6l-unknown-linux-gnueabihf" + cflags="-march=armv6 -mfloat-abi=hard -mfpu=vfp " + preconf_arm "$conf_arch" "$chost_desc" "$cflags" + ;; + 'armv7h') + conf_arch="$1" + chost_desc="armv7l-unknown-linux-gnueabihf" + cflags="-march=armv7-a -mfloat-abi=hard -mfpu=vfpv3-d16 " + preconf_arm "$conf_arch" "$chost_desc" "$cflags" + ;; + 'aarch64') + conf_arch="$1" + chost_desc="aarch64-unknown-linux-gnu" + cflags="-march=armv8-a " + preconf_arm "$conf_arch" "$chost_desc" "$cflags" + ;; + 'multilib') + conf_arch="multilib" + preconf "$conf_arch" + ;; + *) + conf_arch='default' + preconf "$conf_arch" + ;; + esac + + mirrors_conf="${DATADIR}/pacman-mirrors-${target_branch}.conf" +} + pkgver_equal() { local left right