mirror of
https://gitlab.alpinelinux.org/alpine/abuild.git
synced 2025-01-11 17:29:52 +00:00
75b8cacaf0
unpack will no longer unpack without a checksum, even with -f. This means that newapkbuild will not be able to deduce what kind of build system is contained within, so the templates for CMake, Perl, etc are never used. This patch ensures checksumming is done right after fetch, so that unpack works properly.
391 lines
7.9 KiB
Bash
391 lines
7.9 KiB
Bash
#!/bin/sh
|
|
#
|
|
# newapkbuild - generate a new APKBUILD
|
|
# Copyright (c) 2009 Natanael Copa <natanael.copa@gmail.com>
|
|
#
|
|
# Distributed under GPL-2
|
|
#
|
|
|
|
program_version=@VERSION@
|
|
datadir=@datadir@
|
|
|
|
if ! [ -f "$datadir/functions.sh" ]; then
|
|
echo "$datadir/functions.sh: not found" >&2
|
|
exit 1
|
|
fi
|
|
. "$datadir/functions.sh"
|
|
|
|
|
|
is_url() {
|
|
case "$1" in
|
|
http://*|https://*|ftp://*) return 0;;
|
|
esac
|
|
return 1
|
|
}
|
|
|
|
is_github_url() {
|
|
case $1 in
|
|
https://github.com/*/*/archive/*.tar.gz) return 0;;
|
|
esac
|
|
return 1
|
|
}
|
|
|
|
# Build sections
|
|
build_make() {
|
|
cat >>APKBUILD<<__EOF__
|
|
make
|
|
__EOF__
|
|
}
|
|
|
|
build_autotools() {
|
|
cat >>APKBUILD<<__EOF__
|
|
./configure \\
|
|
--build=\$CBUILD \\
|
|
--host=\$CHOST \\
|
|
--prefix=/usr \\
|
|
--sysconfdir=/etc \\
|
|
--mandir=/usr/share/man \\
|
|
--localstatedir=/var
|
|
make
|
|
__EOF__
|
|
}
|
|
|
|
build_cmake() {
|
|
# References:
|
|
# http://www.cmake.org/Wiki/CMake_Useful_Variables
|
|
# http://www.vtk.org/Wiki/CMake_Cross_Compiling
|
|
# This is incomplete: CMAKE_{HOST_,}SYSTEM_PROCESSOR needs to be set,
|
|
# and likewise CMAKE_FIND_ROOT_PATH and a few other details.
|
|
|
|
cat >>APKBUILD<<__EOF__
|
|
if [ "\$CBUILD" != "\$CHOST" ]; then
|
|
CMAKE_CROSSOPTS="-DCMAKE_SYSTEM_NAME=Linux -DCMAKE_HOST_SYSTEM_NAME=Linux"
|
|
fi
|
|
cmake \\
|
|
-DCMAKE_INSTALL_PREFIX=/usr \\
|
|
-DCMAKE_INSTALL_LIBDIR=lib \\
|
|
-DBUILD_SHARED_LIBS=True \\
|
|
-DCMAKE_BUILD_TYPE=Release \\
|
|
-DCMAKE_CXX_FLAGS="\$CXXFLAGS" \\
|
|
-DCMAKE_C_FLAGS="\$CFLAGS" \\
|
|
\${CMAKE_CROSSOPTS}
|
|
make
|
|
__EOF__
|
|
}
|
|
|
|
build_meson() {
|
|
# References:
|
|
# http://mesonbuild.com/Reference-manual.html
|
|
# http://mesonbuild.com/Cross-compilation.html
|
|
# TODO For cross compilation a cross_file needs to be created.
|
|
|
|
cat >>APKBUILD<<__EOF__
|
|
meson \\
|
|
--prefix=/usr \\
|
|
--sysconfdir=/etc \\
|
|
--mandir=/usr/share/man \\
|
|
--localstatedir=/var \\
|
|
--buildtype=release \\
|
|
. output
|
|
ninja -C output
|
|
__EOF__
|
|
}
|
|
|
|
build_perl() {
|
|
cat >>APKBUILD<<__EOF__
|
|
PERL_MM_USE_DEFAULT=1 perl Makefile.PL INSTALLDIRS=vendor
|
|
make
|
|
__EOF__
|
|
}
|
|
|
|
build_python() {
|
|
cat >>APKBUILD<<__EOF__
|
|
python3 setup.py build
|
|
__EOF__
|
|
}
|
|
|
|
check_make() {
|
|
cat >>APKBUILD<<__EOF__
|
|
make check
|
|
__EOF__
|
|
}
|
|
|
|
check_python() {
|
|
cat >>APKBUILD<<__EOF__
|
|
python3 setup.py check
|
|
__EOF__
|
|
}
|
|
|
|
# Package sections
|
|
package_make() {
|
|
cat >>APKBUILD<<__EOF__
|
|
make DESTDIR="\$pkgdir" install
|
|
__EOF__
|
|
}
|
|
|
|
package_autotools() {
|
|
package_make
|
|
}
|
|
|
|
package_meson() {
|
|
cat >>APKBUILD<<__EOF__
|
|
DESTDIR="\$pkgdir" ninja -C output install
|
|
__EOF__
|
|
}
|
|
|
|
package_perl() {
|
|
cat >>APKBUILD<<__EOF__
|
|
make DESTDIR="\$pkgdir" install
|
|
find "\$pkgdir" \\( -name perllocal.pod -o -name .packlist \\) -delete
|
|
__EOF__
|
|
}
|
|
|
|
package_python() {
|
|
cat >>APKBUILD<<__EOF__
|
|
python3 setup.py install --prefix=/usr --root="\$pkgdir"
|
|
__EOF__
|
|
}
|
|
|
|
# Create new aport from templates
|
|
newaport() {
|
|
local newname="${1##*/}"
|
|
local pn=${newname%-[0-9]*}
|
|
local pv
|
|
local source=
|
|
is_url "$1" && source="$1"
|
|
|
|
if is_github_url $source; then
|
|
if [ -z "$pkgname" ]; then
|
|
pkgname=${source%/archive/*}
|
|
pkgname=${pkgname##*/}
|
|
fi
|
|
pv=${newname%.t*} #strip .tar.gz .tgz .tar.bz2 etc
|
|
pv=${pv#*[a-z]}
|
|
source="$pkgname-$pv.tar.gz::$source"
|
|
elif [ "$pn" != "$newname" ]; then
|
|
pv=${newname#$pn-}
|
|
pv=${pv%.t*} #strip .tar.gz .tgz .tar.bz2 etc
|
|
fi
|
|
if [ -z "$pkgname" ]; then
|
|
pkgname=$pn
|
|
fi
|
|
if [ -e "$pkgname"/APKBUILD ] && [ -z "$force" ]; then
|
|
error "$pkgname/APKBUILD already exists"
|
|
return 1
|
|
fi
|
|
mkdir -p "$pkgname"
|
|
cd "$pkgname"
|
|
|
|
if [ -z "$source" ] && [ -n "$sourceforge" ]; then
|
|
source="http://downloads.sourceforge.net/$pn/$pn-$pv.tar.gz"
|
|
fi
|
|
|
|
if [ -z "$depends" ] &&[ "$buildtype" = "python" ]; then
|
|
depends="python3"
|
|
fi
|
|
|
|
case "$buildtype" in
|
|
python) makedepends="python3-dev";;
|
|
cmake) makedepends="cmake";;
|
|
meson) makedepends="meson";;
|
|
*) makedepends="\$depends_dev";;
|
|
esac
|
|
|
|
# Replace pkgver in $source
|
|
if [ -n "$source" ]; then
|
|
source=$(echo "$source" | sed "s/$pv/\$pkgver/g")
|
|
fi
|
|
|
|
# Copy init.d scripts if requested
|
|
if [ -n "$cpinitd" ]; then
|
|
cp "$datadir"/sample.initd $pkgname.initd
|
|
cp "$datadir"/sample.confd $pkgname.confd
|
|
cp "$datadir"/sample.pre-install $pkgname.pre-install
|
|
cp "$datadir"/sample.post-install $pkgname.post-install
|
|
install="\$pkgname.pre-install \$pkgname.post-install"
|
|
source="$source
|
|
$pkgname.initd
|
|
$pkgname.confd
|
|
"
|
|
fi
|
|
|
|
# Generate header with standard variables
|
|
cat >APKBUILD<<__EOF__
|
|
# Contributor:${PACKAGER:+" "}${PACKAGER}
|
|
# Maintainer:${MAINTAINER:+" "}${MAINTAINER}
|
|
pkgname=$pkgname
|
|
pkgver=$pv
|
|
pkgrel=0
|
|
pkgdesc="$pkgdesc"
|
|
url="$url"
|
|
arch="all"
|
|
license="$license"
|
|
depends="$depends"
|
|
depends_dev=""
|
|
makedepends="$makedepends"
|
|
install="$install"
|
|
subpackages="\$pkgname-dev \$pkgname-doc"
|
|
source="$source"
|
|
__EOF__
|
|
|
|
abuild -f fetch checksum unpack
|
|
# Figure out the builddir
|
|
for i in src/*; do
|
|
if [ -d "$i" ]; then
|
|
sdir=$i
|
|
builddir=$(echo ${i#*/} | sed "s/$pv/\$pkgver/g")
|
|
fi
|
|
done
|
|
printf 'builddir="$srcdir/%s"\n\n' "$builddir" >> APKBUILD
|
|
|
|
# Subpackage -dev is usually required only for C/C++. Since depends_dev
|
|
# confuses a lot people, remove it if there's no .h or .hpp file.
|
|
find "$sdir" -name "*.h" -o -name "*.hpp" -maxdepth 3 2>/dev/null \
|
|
| head -n 1 | grep -q ".*" \
|
|
|| sed -i -e '/^depends_dev=.*/d' -e 's/\$depends_dev\s*//' APKBUILD
|
|
|
|
# Try to autodetect the buildtype
|
|
if [ -z "$buildtype" ]; then
|
|
if [ -x "$sdir"/configure ]; then
|
|
buildtype="autotools"
|
|
elif [ -r "$sdir"/Makefile.PL ] || [ "${pn#perl-}" != "$pn" ]; then
|
|
buildtype="perl"
|
|
elif [ -r "$sdir"/waf ]; then
|
|
buildtype="waf"
|
|
elif [ -r "$sdir"/meson.build ]; then
|
|
buildtype="meson"
|
|
elif [ -d "$sdir"/cmake ] || [ -r "$sdir/CMakeLists.txt" ]; then
|
|
buildtype="cmake"
|
|
elif [ -r "$sdir"/Makefile ]; then
|
|
buildtype="make"
|
|
elif [ -r "$sdir"/setup.py ]; then
|
|
buildtype="python"
|
|
fi
|
|
fi
|
|
|
|
# Create build() function
|
|
cat >>APKBUILD<<__EOF__
|
|
build() {
|
|
cd "\$builddir"
|
|
__EOF__
|
|
|
|
case "$buildtype" in
|
|
make)
|
|
build_make;;
|
|
cmake)
|
|
build_cmake;;
|
|
meson)
|
|
build_meson;;
|
|
autotools)
|
|
build_autotools;;
|
|
perl)
|
|
build_perl;;
|
|
python)
|
|
build_python;;
|
|
esac
|
|
|
|
cat >>APKBUILD<<__EOF__
|
|
}
|
|
|
|
__EOF__
|
|
|
|
# Create check() function
|
|
cat >>APKBUILD<<__EOF__
|
|
check() {
|
|
cd "\$builddir"
|
|
__EOF__
|
|
|
|
case "$buildtype" in
|
|
make|cmake|autotools|perl)
|
|
check_make;;
|
|
python)
|
|
check_python;;
|
|
esac
|
|
|
|
cat >>APKBUILD<<__EOF__
|
|
}
|
|
|
|
__EOF__
|
|
|
|
# Create package() function
|
|
cat >>APKBUILD<<__EOF__
|
|
package() {
|
|
cd "\$builddir"
|
|
__EOF__
|
|
|
|
case "$buildtype" in
|
|
make|cmake)
|
|
package_make;;
|
|
autotools)
|
|
package_autotools;;
|
|
meson)
|
|
package_meson;;
|
|
perl)
|
|
package_perl;;
|
|
python)
|
|
package_python;;
|
|
esac
|
|
|
|
if [ -n "$cpinitd" ]; then
|
|
cat >>APKBUILD<<__EOF__
|
|
|
|
install -m755 -D "\$srcdir"/\$pkgname.initd \\
|
|
"\$pkgdir"/etc/init.d/\$pkgname
|
|
install -m644 -D "\$srcdir"/\$pkgname.confd \\
|
|
"\$pkgdir"/etc/conf.d/\$pkgname
|
|
__EOF__
|
|
fi
|
|
cat >>APKBUILD<<__EOF__
|
|
}
|
|
|
|
__EOF__
|
|
}
|
|
|
|
usage() {
|
|
cat >&2 <<-__EOF__
|
|
$program $program_version - generate a new APKBUILD
|
|
Usage: $program [-n NAME] [-d DESC] [-l LICENSE] [-u URL]
|
|
[-aCpy] [-s] [-cfh]
|
|
PKGNAME[-PKGVER]|SRCURL
|
|
Options:
|
|
-n Set package name to NAME
|
|
-d Set package description (pkgdesc) to DESC
|
|
-l Set package license to LICENSE
|
|
-u Set package URL
|
|
-a Create autotools package (use ./configure ...)
|
|
-C Create CMake package (Assume cmake/ is there)
|
|
-m Create meson package (Assume meson.build is there)
|
|
-p Create perl package (Assume Makefile.PL is there)
|
|
-y Create python package (Assume setup.py is there)
|
|
-s Use sourceforge source URL
|
|
-c Copy a sample init.d, conf.d, and install script to new directory
|
|
-f Force even if directory already exist
|
|
-h Show this help
|
|
|
|
__EOF__
|
|
}
|
|
|
|
while getopts "acCmd:fhl:n:pyu:s" opt; do
|
|
case $opt in
|
|
'a') buildtype="autotools";;
|
|
'c') cpinitd=1;;
|
|
'C') buildtype="cmake";;
|
|
'm') buildtype="meson";;
|
|
'd') pkgdesc="$OPTARG";;
|
|
'f') force=1;;
|
|
'h') usage; exit;;
|
|
'l') license="$OPTARG";;
|
|
'n') pkgname="$OPTARG";;
|
|
'p') buildtype="perl";;
|
|
'y') buildtype="python";;
|
|
'u') url="$OPTARG";;
|
|
's') sourceforge=1;;
|
|
esac
|
|
done
|
|
shift $(( $OPTIND - 1 ))
|
|
|
|
while [ $# -gt 0 ]; do
|
|
newaport $1 || exit 1
|
|
shift
|
|
done
|