You are not logged in.
This is my first Arch package. I made a split package for my favorite toolkit. Feedback is welcome.
Here's the PKGBUILD:
# Maintainer: Frank Mertens <frank at cyblogic dot de>
pkgbase=corecomponents
pkgname=(
'corecomponents_core'
'corecomponents_core_tools'
'corecomponents_syntax'
'corecomponents_glob'
'corecomponents_meta'
'corecomponents_testing'
'corecomponents_crypto'
'corecomponents_crypto_tools'
'corecomponents_network'
'corecomponents_network_tools'
'corecomponents_http'
'corecomponents_http_plugins'
'corecomponents_http_tools'
'corecomponents_toki'
'corecomponents_toki_tools'
'corecomponents_ux'
'corecomponents_ux_plugins'
'corecomponents_tools'
)
pkgver=2.2.0
pkgrel=1
pkgdesc="Toolkit for C++ application development"
url="https://www.corecomponents.io"
arch=('x86_64')
license=('GPL3')
source=(
"https://www.corecomponents.io/download/CoreComponents-$pkgver.tar.gz"
)
md5sums=(
'8c82fc143b17bd0bb905e8d8f4aab07d'
)
sha1sums=(
'7ba060f9edf88eba6e553984fd764ff40ed31421'
)
makedepends=(
'gcc>=10.0.0'
'readline'
'gnutls>=3.3.5'
'cairo'
'freetype2'
'libwebp'
'sdl2>=2.0.10'
)
prepare() {
rm -rf CoreComponents
ln -s CoreComponents-$pkgver CoreComponents
rm -rf bootstrap
mkdir bootstrap
cd bootstrap
../CoreComponents-$pkgver/bootstrap
}
build() {
rm -rf core_release
mkdir core_release
cd core_release
../bootstrap/ccbuild -prefix=/usr -release -test ../CoreComponents/tools
./ccbuild -prefix=/usr -release -test ../CoreComponents
}
package_corecomponents_core() {
pkgdesc="$pkgdesc: system abstraction and language primitives"
cd core_release
../bootstrap/ccbuild -root=$pkgdir -install -release -test ../CoreComponents/Core/src
}
package_corecomponents_core_tools() {
pkgdesc="$pkgdesc: misc. command line utilities"
depends=('corecomponents_core')
cd core_release
../bootstrap/ccbuild -root=$pkgdir -install -release -test ../CoreComponents/Core/tools
}
package_corecomponents_syntax() {
pkgdesc="$pkgdesc: building blocks for building recursive descent parsers"
depends=('corecomponents_core')
cd core_release
./ccbuild -root=$pkgdir -install -release -test ../CoreComponents/Syntax/src
}
package_corecomponents_glob() {
pkgdesc="$pkgdesc: string and file name pattern matching"
depends=('corecomponents_syntax')
cd core_release
./ccbuild -root=$pkgdir -install -release -test ../CoreComponents/Glob/src
}
package_corecomponents_meta() {
pkgdesc="$pkgdesc: object serialization, deserialization and validation"
depends=('corecomponents_syntax')
cd core_release
./ccbuild -root=$pkgdir -install -release -test ../CoreComponents/Meta/src
}
package_corecomponents_testing() {
pkgdesc="$pkgdesc: unit testing and test automation"
depends=('corecomponents_testing')
cd core_release
./ccbuild -root=$pkgdir -install -release -test ../CoreComponents/Testing/src
}
package_corecomponents_crypto() {
pkgdesc="$pkgdesc: cryptographic primitives"
depends=('corecomponents_core')
cd core_release
./ccbuild -root=$pkgdir -install -release -test ../CoreComponents/Crypto/src
}
package_corecomponents_crypto_tools() {
pkgdesc="$pkgdesc: cryptographic tools"
depends=('corecomponents_crypto' 'readline')
cd core_release
./ccbuild -root=$pkgdir -install -release -test ../CoreComponents/Crypto/tools
}
package_corecomponents_network() {
pkgdesc="$pkgdesc: network sockets, interface status and routing information"
depends=('corecomponents_glob')
cd core_release
./ccbuild -root=$pkgdir -install -release -test ../CoreComponents/Network/src
}
package_corecomponents_network_tools() {
pkgdesc="$pkgdesc: networking tools"
depends=('corecomponents_network')
cd core_release
./ccbuild -root=$pkgdir -install -release -test ../CoreComponents/Network/tools
}
package_corecomponents_http() {
pkgdesc="$pkgdesc: http(s) client/server classes"
depends=('corecomponents_meta' 'corecomponents_glob' 'corecomponents_network' 'gnutls>=3.3.5')
cd core_release
./ccbuild -root=$pkgdir -install -release -test ../CoreComponents/HTTP/src
}
package_corecomponents_http_plugins() {
pkgdesc="$pkgdesc: http(s) server plugins"
depends=('corecomponents_http')
cd core_release
./ccbuild -root=$pkgdir -install -release -test ../CoreComponents/HTTP/plugins
}
package_corecomponents_http_tools() {
pkgdesc="$pkgdesc: http(s) tools"
depends=('corecomponents_http_plugins')
cd core_release
./ccbuild -root=$pkgdir -install -release -test ../CoreComponents/HTTP/tools
}
package_corecomponents_toki() {
pkgdesc="$pkgdesc: syntax highlighting library"
depends=('corecomponents_meta' 'corecomponents_glob')
cd core_release
./ccbuild -root=$pkgdir -install -release -test ../CoreComponents/Toki/src
}
package_corecomponents_toki_tools() {
pkgdesc="$pkgdesc: syntax highlighting tools"
depends=('corecomponents_toki')
cd core_release
./ccbuild -root=$pkgdir -install -release -test ../CoreComponents/Toki/tools
}
package_corecomponents_ux() {
pkgdesc="$pkgdesc: graphical user interfaces"
depends=('corecomponents_core' 'corecomponents_ux_plugins' 'cairo' 'freetype2' 'libwebp')
cd core_release
./ccbuild -root=$pkgdir -install -release -test ../CoreComponents/UX/src
}
package_corecomponents_ux_plugins() {
pkgdesc="$pkgdesc: graphical user interface style and platform plugins"
depends=('sdl2>=2.0.10')
cd core_release
./ccbuild -root=$pkgdir -install -release -test ../CoreComponents/UX/plugins
}
package_corecomponents_tools() {
pkgdesc="$pkgdesc: common developer tools (build system, etc.)"
depends=('corecomponents_tools')
cd core_release
./ccbuild -root=$pkgdir -install -release -test ../CoreComponents/tools
}
Offline
Looks fine to me. Note the deleting, resymlinking etc that is done prevents reusing built files in the event of no changes to the source, but I don't know how much that matters.
Offline
$pkgdir should be double-quoted.
Offline
@willemw: You are right. Added the quotes.
@Allan: I cleaned it up a bit. I'm not sure what the common workflows with "makepkg" are. From the manual I guess that 'makepkg -ef' could be a thing and I made sure it does not rebuild if the source didn't change. Otherwise the build system of course depends on file times...
The changed PKGBUILD:
# Maintainer: Frank Mertens <frank at cyblogic dot de>
pkgbase=corecomponents
pkgname=(
'corecomponents_core'
'corecomponents_core_tools'
'corecomponents_syntax'
'corecomponents_glob'
'corecomponents_meta'
'corecomponents_testing'
'corecomponents_crypto'
'corecomponents_crypto_tools'
'corecomponents_network'
'corecomponents_network_tools'
'corecomponents_http'
'corecomponents_http_plugins'
'corecomponents_http_tools'
'corecomponents_toki'
'corecomponents_toki_tools'
'corecomponents_ux'
'corecomponents_ux_plugins'
'corecomponents_tools'
)
pkgver=2.2.0
pkgrel=1
pkgdesc="Toolkit for C++ application development"
url="https://www.corecomponents.io"
arch=('x86_64')
license=('GPL3')
source=(
"https://www.corecomponents.io/download/CoreComponents-$pkgver.tar.gz"
)
md5sums=(
'8c82fc143b17bd0bb905e8d8f4aab07d'
)
sha1sums=(
'7ba060f9edf88eba6e553984fd764ff40ed31421'
)
makedepends=(
'gcc>=10.0.0'
'readline'
'gnutls>=3.3.5'
'cairo'
'freetype2'
'libwebp'
'sdl2>=2.0.10'
)
prepare() {
rm -rf CoreComponents
ln -s CoreComponents-$pkgver CoreComponents
if [ ! -x bootstrap/ccbuild ]; then
mkdir -p bootstrap
pushd bootstrap
../CoreComponents-$pkgver/bootstrap
popd
fi
if [ ! -x build/ccbuild ]; then
mkdir -p build
pushd build
ln -s ../bootstrap/ccbuild
popd
fi
}
build() {
cd build
./ccbuild -prefix=/usr -release -test ../CoreComponents
}
package_corecomponents_core() {
pkgdesc="$pkgdesc: system abstraction and language primitives"
cd build
./ccbuild -root="$pkgdir" -install -release ../CoreComponents/Core/src
}
package_corecomponents_core_tools() {
pkgdesc="$pkgdesc: misc. command line utilities"
depends=('corecomponents_core')
cd build
./ccbuild -root="$pkgdir" -install -release ../CoreComponents/Core/tools
}
package_corecomponents_syntax() {
pkgdesc="$pkgdesc: building blocks for building recursive descent parsers"
depends=('corecomponents_core')
cd build
./ccbuild -root="$pkgdir" -install -release ../CoreComponents/Syntax/src
}
package_corecomponents_glob() {
pkgdesc="$pkgdesc: string and file name pattern matching"
depends=('corecomponents_syntax')
cd build
./ccbuild -root="$pkgdir" -install -release ../CoreComponents/Glob/src
}
package_corecomponents_meta() {
pkgdesc="$pkgdesc: object serialization, deserialization and validation"
depends=('corecomponents_syntax')
cd build
./ccbuild -root="$pkgdir" -install -release ../CoreComponents/Meta/src
}
package_corecomponents_testing() {
pkgdesc="$pkgdesc: unit testing and test automation"
depends=('corecomponents_testing')
cd build
./ccbuild -root="$pkgdir" -install -release ../CoreComponents/Testing/src
}
package_corecomponents_crypto() {
pkgdesc="$pkgdesc: cryptographic primitives"
depends=('corecomponents_core')
cd build
./ccbuild -root="$pkgdir" -install -release ../CoreComponents/Crypto/src
}
package_corecomponents_crypto_tools() {
pkgdesc="$pkgdesc: cryptographic tools"
depends=('corecomponents_crypto' 'readline')
cd build
./ccbuild -root="$pkgdir" -install -release ../CoreComponents/Crypto/tools
}
package_corecomponents_network() {
pkgdesc="$pkgdesc: network sockets, interface status and routing information"
depends=('corecomponents_glob')
cd build
./ccbuild -root="$pkgdir" -install -release ../CoreComponents/Network/src
}
package_corecomponents_network_tools() {
pkgdesc="$pkgdesc: networking tools"
depends=('corecomponents_network')
cd build
./ccbuild -root="$pkgdir" -install -release ../CoreComponents/Network/tools
}
package_corecomponents_http() {
pkgdesc="$pkgdesc: http(s) client/server classes"
depends=('corecomponents_meta' 'corecomponents_glob' 'corecomponents_network' 'gnutls>=3.3.5')
cd build
./ccbuild -root="$pkgdir" -install -release ../CoreComponents/HTTP/src
}
package_corecomponents_http_plugins() {
pkgdesc="$pkgdesc: http(s) server plugins"
depends=('corecomponents_http')
cd build
./ccbuild -root="$pkgdir" -install -release ../CoreComponents/HTTP/plugins
}
package_corecomponents_http_tools() {
pkgdesc="$pkgdesc: http(s) tools"
depends=('corecomponents_http_plugins')
cd build
./ccbuild -root="$pkgdir" -install -release ../CoreComponents/HTTP/tools
}
package_corecomponents_toki() {
pkgdesc="$pkgdesc: syntax highlighting library"
depends=('corecomponents_meta' 'corecomponents_glob')
cd build
./ccbuild -root="$pkgdir" -install -release ../CoreComponents/Toki/src
}
package_corecomponents_toki_tools() {
pkgdesc="$pkgdesc: syntax highlighting tools"
depends=('corecomponents_toki')
cd build
./ccbuild -root="$pkgdir" -install -release ../CoreComponents/Toki/tools
}
package_corecomponents_ux() {
pkgdesc="$pkgdesc: graphical user interfaces"
depends=('corecomponents_core' 'corecomponents_ux_plugins' 'cairo' 'freetype2' 'libwebp')
cd build
./ccbuild -root="$pkgdir" -install -release ../CoreComponents/UX/src
}
package_corecomponents_ux_plugins() {
pkgdesc="$pkgdesc: graphical user interface style and platform plugins"
depends=('sdl2>=2.0.10')
cd build
./ccbuild -root="$pkgdir" -install -release ../CoreComponents/UX/plugins
}
package_corecomponents_tools() {
pkgdesc="$pkgdesc: common developer tools (build system, etc.)"
depends=('corecomponents_tools')
cd build
./ccbuild -root="$pkgdir" -install -release ../CoreComponents/tools
}
One thing I was wondering: Can I get the number of CPU cores the user wishes to use? Otherwise I'm scaling to max and I fear it might kill some smaller boards...
Offline
If a small SBC board can overheat, then the user can set the maximum number of CPU cores used system-wide, for example:
MAKEFLAGS="-j1"
in /etc/makepkg.conf.
Offline
That setting is useful , but only affects software using autotools build system .
CoreComponents appears to use a custom build system.
Checking it indicates the shellscript at tools/build/bootstrap does the work and that calls g++ directly .
g++ -o ccbuild -pthread .modules-46002B89-$MACHINE-tools_build/.lump.o -fPIC -pie -O0 -L. -lCoreComponentsCore -lCoreComponentsGlob -lCoreComponentsMeta -Wl,--enable-new-dtags,-rpath='$ORIGIN',-rpath='$ORIGIN'/../lib,-rpath-link='$ORIGIN'
There are some references that adding -pipe will keep more cores busy, but you want the reverse.
Disliking systemd intensely, but not satisfied with alternatives so focusing on taming systemd.
clean chroot building not flexible enough ?
Try clean chroot manager by graysky
Online
An alternatvie prepare(), without if-statements, pushd/popd:
prepare() {
rm -rf CoreComponents
ln -s CoreComponents-$pkgver CoreComponents
mkdir -p bootstrap build
ln -sf "$srcdir"/{bootstrap,build}/ccbuild
cd bootstrap
../CoreComponents-$pkgver/bootstrap
}
Offline
@Lone_Wolf, @willemw: Thanks for pointing me to the right place. YES, MAKEFLAGS is used by many meta build systems. I simply added support to respect this environment variable to ccbuild.
@willemw: Thanks for simplifying my script magic. Actually the esoteric logic was there for an esoteric reason! First I didn't like to rerun bootstrap if there is already a bootstrapped version of ccbuild (4s is a lifetime!-). Secondly ccbuild actually builds itself afterwards and the build continues with optimized version of ccbuild. That is very non-obvious, but faster that way!
Besides that I'm really astonished how well that split package logic fits my needs. Arch really has something going for it (dead old Debian user saying this...).
Offline
@Lone_Wolf, @willemw: Thanks for pointing me to the right place. YES, MAKEFLAGS is used by many meta build systems. I simply added support to respect this environment variable to ccbuild.
CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions \
-Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security \
-fstack-clash-protection -fcf-protection"
CXXFLAGS="$CFLAGS -Wp,-D_GLIBCXX_ASSERTIONS"
LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now"
LTOFLAGS="-flto=auto"
Does ccbuild honor those flags ?
(they are copied from latest makepkg.conf as distributed with pacman 6.0.1-5 )
Disliking systemd intensely, but not satisfied with alternatives so focusing on taming systemd.
clean chroot building not flexible enough ?
Try clean chroot manager by graysky
Online
That's a good point. Currently it only makes used of CFLAGS/CXXFLAGS. I will make sure it also handles LDFLAGS correctly in the next patch release...
Offline
I pushed a new version 2.2.1 to make ccbuild handle LDFLAGS properly.
See:
https://aur.archlinux.org/packages/corecomponents_tools
The only issue I usually have with these linker flags used by the distributions is "-Wl,--no-as-needed" which messes up automatic library initialization in C++.
The library linked might not be needed, because non of its exported symbols are used, yet the library initialization created with anonymous C++ namespaces might still do smth. that is needed.
Anyways, otherwise it is great to have everything linked the same way...
Offline
Maybe add some tests by running "ccbuild -test-run ..." in check().
Offline
@willemw: Yes, I was thinking about that already. I've added a "check()" method, see the last AUR commit.
Offline