Skip to content

Commit

Permalink
dev-lang/zig: slotting, initial support for setting ZIG_{MCPU,TARGET}
Browse files Browse the repository at this point in the history
  * Install Zig to "/usr/$(get_libdir)/zig/${PV}", handle
    /usr/bin/zig via eselect-zig
  * Add functions for getting ZIG_TARGET and ZIG_MCPU (user-provided or
    defaults) and use them for building/testing
  * Add "doc" USE flag for installing language reference and stdlib
    documentation

Closes: https://bugs.gentoo.org/885861
Bug: https://bugs.gentoo.org/890234
Signed-off-by: Eric Joldasov <[email protected]>
Signed-off-by: Florian Schmaus <[email protected]>
  • Loading branch information
BratishkaErik authored and Flowdalic committed Mar 9, 2023
1 parent 0c82beb commit 8fadfe4
Show file tree
Hide file tree
Showing 2 changed files with 241 additions and 6 deletions.
165 changes: 165 additions & 0 deletions dev-lang/zig/zig-0.10.1-r1.ebuild
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
# Copyright 2019-2023 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

LLVM_MAX_SLOT=15
inherit edo cmake llvm check-reqs toolchain-funcs

DESCRIPTION="A robust, optimal, and maintainable programming language"
HOMEPAGE="https://ziglang.org/"
if [[ ${PV} == 9999 ]]; then
EGIT_REPO_URI="https://github.com/ziglang/zig.git"
inherit git-r3
else
SRC_URI="https://ziglang.org/download/${PV}/${P}.tar.xz"
KEYWORDS="~amd64 ~arm ~arm64"
fi

LICENSE="MIT"
SLOT="$(ver_cut 1-2)"
IUSE="doc"

BUILD_DIR="${S}/build"
# Zig requires zstd and zlib compression support in LLVM, if using LLVM backend.
# (non-LLVM backends don't require these)
# They are not required "on their own", so please don't add them here.
# You can check https://github.com/ziglang/zig-bootstrap in future, to see
# options that are passed to LLVM CMake building (excluding "static" ofc).
DEPEND="
sys-devel/clang:${LLVM_MAX_SLOT}=
sys-devel/lld:${LLVM_MAX_SLOT}=
sys-devel/llvm:${LLVM_MAX_SLOT}=[zstd]
"

RDEPEND="
${DEPEND}
app-eselect/eselect-zig
"

# see https://github.com/ziglang/zig/issues/3382
# For now, Zig Build System doesn't support enviromental CFLAGS/LDFLAGS/etc.
QA_FLAGS_IGNORED="usr/bin/zig"

# see https://ziglang.org/download/0.10.0/release-notes.html#Self-Hosted-Compiler
# 0.10.0 release - ~9.6 GiB, since we use compiler written in C++ for bootstrapping
# 0.11.0 release - ~2.8 GiB, since we will (at least according to roadmap) use self-hosted compiler
# (transpiled to C via C backend) for bootstrapping
CHECKREQS_MEMORY="10G"

PATCHES=(
"${FILESDIR}/zig-0.10.0-build-dir-install-stage3.patch"
)

llvm_check_deps() {
has_version "sys-devel/clang:${LLVM_SLOT}"
}

ctarget_to_zigtarget() {
# Zig's Target Format: arch-os-abi
local CTARGET="${CTARGET:-${CHOST}}"

local ZIG_ARCH
case "${CTARGET%%-*}" in
i?86) ZIG_ARCH=x86;;
sparcv9) ZIG_ARCH=sparc64;;
*) ZIG_ARCH="${CTARGET%%-*}";; # Same as in CHOST
esac

local ZIG_OS
case "${CTARGET}" in
*linux*) ZIG_OS=linux;;
*apple*) ZIG_OS=macos;;
esac

local ZIG_ABI
case "${CTARGET##*-}" in
gnu) ZIG_ABI=gnu;;
solaris*) ZIG_OS=solaris ZIG_ABI=none;;
darwin*) ZIG_ABI=none;;
*) ZIG_ABI="${CTARGET##*-}";; # Same as in CHOST
esac

echo "${ZIG_ARCH}-${ZIG_OS}-${ZIG_ABI}"
}

get_zig_mcpu() {
local ZIG_DEFAULT_MCPU=native
tc-is-cross-compiler && ZIG_DEFAULT_MCPU=baseline
echo "${ZIG_MCPU:-${ZIG_DEFAULT_MCPU}}"
}

get_zig_target() {
local ZIG_DEFAULT_TARGET=native
tc-is-cross-compiler && ZIG_DEFAULT_TARGET="$(ctarget_to_zigtarget)"
echo "${ZIG_TARGET:-${ZIG_DEFAULT_TARGET}}"
}

pkg_setup() {
llvm_pkg_setup
ewarn "This version requires 10G of memory for building compiler."
ewarn "If you don't have enough memory, you can wait until 0.11.0 release"
ewarn "or (if you are risky) use 9999 version (currently requires only 4GB)"
check-reqs_pkg_setup
}

src_configure() {
local mycmakeargs=(
-DZIG_USE_CCACHE=OFF
-DZIG_SHARED_LLVM=ON
-DZIG_TARGET_TRIPLE="$(get_zig_target)"
-DZIG_TARGET_MCPU="$(get_zig_mcpu)"
-DZIG_USE_LLVM_CONFIG=ON
-DCMAKE_PREFIX_PATH="$(get_llvm_prefix ${LLVM_MAX_SLOT})"
-DCMAKE_INSTALL_PREFIX="${EPREFIX}/usr/$(get_libdir)/zig/${PV}"
)

cmake_src_configure
}

src_compile() {
cmake_src_compile

if use doc; then
cd "${BUILD_DIR}" || die
edo ./zig2 run ../doc/docgen.zig -- ./zig2 ../doc/langref.html.in "${S}/langref.html"
edo ./zig2 test ../lib/std/std.zig --zig-lib-dir ../lib -fno-emit-bin -femit-docs="${S}/std"
fi
}

src_test() {
cd "${BUILD_DIR}" || die
local ZIG_TEST_ARGS="-Dstatic-llvm=false -Denable-llvm -Dskip-non-native \
-Drelease -Dtarget=$(get_zig_target) -Dcpu=$(get_zig_mcpu)"
local ZIG_TEST_STEPS=(
test-cases test-fmt test-behavior test-compiler-rt test-universal-libc test-compare-output
test-standalone test-c-abi test-link test-stack-traces test-cli test-asm-link test-translate-c
test-run-translated-c test-std
)

local step
for step in "${ZIG_TEST_STEPS[@]}" ; do
edob ./stage3/bin/zig build ${step} ${ZIG_TEST_ARGS}
done
}

src_install() {
use doc && local HTML_DOCS=( "langref.html" "std" )
cmake_src_install
cd "${ED}/usr/$(get_libdir)/zig/${PV}/" || die
mv lib/zig/ lib2/ || die
rm -rf lib/ || die
mv lib2/ lib/ || die

dosym -r "/usr/$(get_libdir)/zig/${PV}/bin/zig" "/usr/bin/zig-${PV}"
}

pkg_postinst() {
elog "0.10.1 release uses self-hosted compiler by default and fixes some bugs from 0.10.0"
elog "But your code still can be un-compilable since some features still not implemented or bugs not fixed"
elog "Upstream recommends:"
elog " * Using old compiler if experiencing such breakage (flag '-fstage1')"
elog " * Waiting for release 0.11.0 with old compiler removed (these changes are already merged in 9999)"
elog "Also see: https://ziglang.org/download/0.10.0/release-notes.html#Self-Hosted-Compiler"
elog "and https://ziglang.org/download/0.10.0/release-notes.html#How-to-Upgrade"
}
82 changes: 76 additions & 6 deletions dev-lang/zig/zig-9999.ebuild
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
# Copyright 2019-2022 Gentoo Authors
# Copyright 2019-2023 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

LLVM_MAX_SLOT=15
inherit cmake llvm check-reqs
inherit edo cmake llvm check-reqs toolchain-funcs

DESCRIPTION="A robust, optimal, and maintainable programming language"
HOMEPAGE="https://ziglang.org/"
Expand All @@ -17,7 +17,8 @@ else
fi

LICENSE="MIT"
SLOT="0"
SLOT="$(ver_cut 1-2)"
IUSE="doc"

BUILD_DIR="${S}/build"

Expand All @@ -34,10 +35,11 @@ DEPEND="

RDEPEND="
${DEPEND}
!dev-lang/zig-bin
app-eselect/eselect-zig
"

# see https://github.com/ziglang/zig/issues/3382
# For now, Zig Build System doesn't support enviromental CFLAGS/LDFLAGS/etc.
QA_FLAGS_IGNORED="usr/bin/zig"

# Since commit https://github.com/ziglang/zig/commit/e7d28344fa3ee81d6ad7ca5ce1f83d50d8502118
Expand All @@ -48,6 +50,46 @@ llvm_check_deps() {
has_version "sys-devel/clang:${LLVM_SLOT}"
}

ctarget_to_zigtarget() {
# Zig's Target Format: arch-os-abi
local CTARGET="${CTARGET:-${CHOST}}"

local ZIG_ARCH
case "${CTARGET%%-*}" in
i?86) ZIG_ARCH=x86;;
sparcv9) ZIG_ARCH=sparc64;;
*) ZIG_ARCH="${CTARGET%%-*}";; # Same as in CHOST
esac

local ZIG_OS
case "${CTARGET}" in
*linux*) ZIG_OS=linux;;
*apple*) ZIG_OS=macos;;
esac

local ZIG_ABI
case "${CTARGET##*-}" in
gnu) ZIG_ABI=gnu;;
solaris*) ZIG_OS=solaris ZIG_ABI=none;;
darwin*) ZIG_ABI=none;;
*) ZIG_ABI="${CTARGET##*-}";; # Same as in CHOST
esac

echo "${ZIG_ARCH}-${ZIG_OS}-${ZIG_ABI}"
}

get_zig_mcpu() {
local ZIG_DEFAULT_MCPU=native
tc-is-cross-compiler && ZIG_DEFAULT_MCPU=baseline
echo "${ZIG_MCPU:-${ZIG_DEFAULT_MCPU}}"
}

get_zig_target() {
local ZIG_DEFAULT_TARGET=native
tc-is-cross-compiler && ZIG_DEFAULT_TARGET="$(ctarget_to_zigtarget)"
echo "${ZIG_TARGET:-${ZIG_DEFAULT_TARGET}}"
}

pkg_setup() {
llvm_pkg_setup
check-reqs_pkg_setup
Expand All @@ -57,13 +99,41 @@ src_configure() {
local mycmakeargs=(
-DZIG_USE_CCACHE=OFF
-DZIG_SHARED_LLVM=ON
-DCMAKE_PREFIX_PATH=$(get_llvm_prefix ${LLVM_MAX_SLOT})
-DZIG_TARGET_TRIPLE="$(get_zig_target)"
-DZIG_TARGET_MCPU="$(get_zig_mcpu)"
-DZIG_USE_LLVM_CONFIG=ON
-DCMAKE_PREFIX_PATH="$(get_llvm_prefix ${LLVM_MAX_SLOT})"
-DCMAKE_INSTALL_PREFIX="${EPREFIX}/usr/$(get_libdir)/zig/${PV}"
)

cmake_src_configure
}

src_compile() {
cmake_src_compile

if use doc; then
cd "${BUILD_DIR}" || die
edo ./zig2 run ../doc/docgen.zig -- --zig ./zig2 ../doc/langref.html.in "${S}/langref.html"
edo ./zig2 test ../lib/std/std.zig --zig-lib-dir ../lib -fno-emit-bin -femit-docs="${S}/std"
fi
}

src_test() {
cd "${BUILD_DIR}" || die
./zig2 build test -Dstatic-llvm=false -Denable-llvm=true -Dskip-non-native=true || die
local ZIG_TEST_ARGS="-Dstatic-llvm=false -Denable-llvm -Dskip-non-native \
-Drelease -Dtarget=$(get_zig_target) -Dcpu=$(get_zig_mcpu)"
# TBF zig2 -> stage3/bin/zig when (if) https://github.com/ziglang/zig/pull/14255 will be merged
edo ./zig2 build test ${ZIG_TEST_ARGS}
}

src_install() {
use doc && local HTML_DOCS=( "langref.html" "std" )
cmake_src_install

cd "${ED}/usr/$(get_libdir)/zig/${PV}/" || die
mv lib/zig/ lib2/ || die
rm -rf lib/ || die
mv lib2/ lib/ || die
dosym -r "/usr/$(get_libdir)/zig/${PV}/bin/zig" "/usr/bin/zig-${PV}"
}

0 comments on commit 8fadfe4

Please sign in to comment.