0
0
Fork 0
mirror of https://github.com/NixOS/nixpkgs.git synced 2025-07-13 21:50:33 +03:00

zig: commonify

This commit is contained in:
Tristan Ross 2024-07-29 20:31:21 -07:00
parent d73ab2f142
commit 3fc45e16ab
No known key found for this signature in database
GPG key ID: B09C422035669AF8
21 changed files with 162 additions and 1173 deletions

View file

@ -1,111 +0,0 @@
{
lib,
callPackage,
cmake,
coreutils,
fetchFromGitHub,
libxml2,
llvmPackages,
stdenv,
testers,
zlib,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "zig";
version = "0.10.1";
src = fetchFromGitHub {
owner = "ziglang";
repo = "zig";
rev = finalAttrs.version;
hash = "sha256-69QIkkKzApOGfrBdgtmxFMDytRkSh+0YiaJQPbXsBeo=";
};
patches = [
# Backport alignment related panics from zig-master to 0.10.
# Upstream issue: https://github.com/ziglang/zig/issues/14559
./001-0.10-macho-fixes.patch
];
nativeBuildInputs = [
cmake
(lib.getDev llvmPackages.llvm)
];
buildInputs =
[
libxml2
zlib
]
++ (with llvmPackages; [
libclang
lld
llvm
]);
outputs = [
"out"
"doc"
];
cmakeFlags = [
# file RPATH_CHANGE could not write new RPATH
(lib.cmakeBool "CMAKE_SKIP_BUILD_RPATH" true)
# always link against static build of LLVM
(lib.cmakeBool "ZIG_STATIC_LLVM" true)
# ensure determinism in the compiler build
(lib.cmakeFeature "ZIG_TARGET_MCPU" "baseline")
];
env.ZIG_GLOBAL_CACHE_DIR = "$TMPDIR/zig-cache";
doInstallCheck = true;
strictDeps = true;
# Zig's build looks at /usr/bin/env to find dynamic linking info. This doesn't
# work in Nix's sandbox. Use env from our coreutils instead.
postPatch = ''
substituteInPlace lib/std/zig/system/NativeTargetInfo.zig \
--replace "/usr/bin/env" "${lib.getExe' coreutils "env"}"
'';
postBuild = ''
./zig2 run ../doc/docgen.zig -- ./zig2 ../doc/langref.html.in langref.html
'';
postInstall = ''
install -Dm644 -t $doc/share/doc/zig-$version/html ./langref.html
'';
installCheckPhase = ''
runHook preInstallCheck
$out/bin/zig test --cache-dir "$TMPDIR/zig-test-cache" -I $src/test $src/test/behavior.zig
runHook postInstallCheck
'';
passthru = {
hook = callPackage ./hook.nix { zig = finalAttrs.finalPackage; };
cc = callPackage ../cc.nix { zig = finalAttrs.finalPackage; };
stdenv = callPackage ../stdenv.nix { zig = finalAttrs.finalPackage; };
tests = {
version = testers.testVersion {
package = finalAttrs.finalPackage;
command = "zig version";
};
};
};
meta = {
description = "General-purpose programming language and toolchain for maintaining robust, optimal, and reusable software";
homepage = "https://ziglang.org/";
changelog = "https://ziglang.org/download/${finalAttrs.version}/release-notes.html";
license = lib.licenses.mit;
mainProgram = "zig";
maintainers = with lib.maintainers; [ andrewrk ] ++ lib.teams.zig.members;
platforms = lib.platforms.unix;
};
})

View file

@ -1,43 +0,0 @@
{ makeSetupHook, zig }:
makeSetupHook {
name = "zig-hook";
propagatedBuildInputs = [ zig ];
substitutions = {
# This zig_default_flags below is meant to avoid CPU feature impurity in
# Nixpkgs. However, this flagset is "unstable": it is specifically meant to
# be controlled by the upstream development team - being up to that team
# exposing or not that flags to the outside (especially the package manager
# teams).
# Because of this hurdle, @andrewrk from Zig Software Foundation proposed
# some solutions for this issue. Hopefully they will be implemented in
# future releases of Zig. When this happens, this flagset should be
# revisited accordingly.
# Below are some useful links describing the discovery process of this 'bug'
# in Nixpkgs:
# https://github.com/NixOS/nixpkgs/issues/169461
# https://github.com/NixOS/nixpkgs/issues/185644
# https://github.com/NixOS/nixpkgs/pull/197046
# https://github.com/NixOS/nixpkgs/pull/241741#issuecomment-1624227485
# https://github.com/ziglang/zig/issues/14281#issuecomment-1624220653
zig_default_flags = [
"-Dcpu=baseline"
"-Drelease-safe=true"
];
};
passthru = {
inherit zig;
};
meta = {
description = "Setup hook for using the Zig compiler in Nixpkgs";
inherit (zig.meta) maintainers platforms broken;
};
} ./setup-hook.sh

View file

@ -1,69 +0,0 @@
# shellcheck shell=bash
# shellcheck disable=SC2034
readonly zigDefaultFlagsArray=(@zig_default_flags@)
function zigSetGlobalCacheDir {
ZIG_GLOBAL_CACHE_DIR=$(mktemp -d)
export ZIG_GLOBAL_CACHE_DIR
}
function zigBuildPhase {
runHook preBuild
local flagsArray=()
concatTo flagsArray zigDefaultFlagsArray \
zigBuildFlags zigBuildFlagsArray
echoCmd 'zig build flags' "${flagsArray[@]}"
zig build "${flagsArray[@]}"
runHook postBuild
}
function zigCheckPhase {
runHook preCheck
local flagsArray=()
concatTo flagsArray zigDefaultFlagsArray \
zigCheckFlags zigCheckFlagsArray
echoCmd 'zig check flags' "${flagsArray[@]}"
zig build test "${flagsArray[@]}"
runHook postCheck
}
function zigInstallPhase {
runHook preInstall
local flagsArray=()
concatTo flagsArray zigDefaultFlagsArray \
zigBuildFlags zigBuildFlagsArray \
zigInstallFlags zigInstallFlagsArray
if [ -z "${dontAddPrefix-}" ]; then
# Zig does not recognize `--prefix=/dir/`, only `--prefix /dir/`
flagsArray+=("${prefixKey:---prefix}" "$prefix")
fi
echoCmd 'zig install flags' "${flagsArray[@]}"
zig build install "${flagsArray[@]}"
runHook postInstall
}
# shellcheck disable=SC2154
addEnvHooks "$targetOffset" zigSetGlobalCacheDir
if [ -z "${dontUseZigBuild-}" ] && [ -z "${buildPhase-}" ]; then
buildPhase=zigBuildPhase
fi
if [ -z "${dontUseZigCheck-}" ] && [ -z "${checkPhase-}" ]; then
checkPhase=zigCheckPhase
fi
if [ -z "${dontUseZigInstall-}" ] && [ -z "${installPhase-}" ]; then
installPhase=zigInstallPhase
fi

View file

@ -1,105 +0,0 @@
{
lib,
callPackage,
cmake,
coreutils,
fetchFromGitHub,
libxml2,
llvmPackages,
stdenv,
testers,
zlib,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "zig";
version = "0.11.0";
src = fetchFromGitHub {
owner = "ziglang";
repo = "zig";
rev = finalAttrs.version;
hash = "sha256-iuU1fzkbJxI+0N1PiLQM013Pd1bzrgqkbIyTxo5gB2I=";
};
nativeBuildInputs = [
cmake
(lib.getDev llvmPackages.llvm)
];
buildInputs =
[
libxml2
zlib
]
++ (with llvmPackages; [
libclang
lld
llvm
]);
outputs = [
"out"
"doc"
];
cmakeFlags = [
# file RPATH_CHANGE could not write new RPATH
(lib.cmakeBool "CMAKE_SKIP_BUILD_RPATH" true)
# ensure determinism in the compiler build
(lib.cmakeFeature "ZIG_TARGET_MCPU" "baseline")
# always link against static build of LLVM
(lib.cmakeBool "ZIG_STATIC_LLVM" true)
];
env.ZIG_GLOBAL_CACHE_DIR = "$TMPDIR/zig-cache";
doInstallCheck = true;
strictDeps = true;
# Zig's build looks at /usr/bin/env to find dynamic linking info. This doesn't
# work in Nix's sandbox. Use env from our coreutils instead.
postPatch = ''
substituteInPlace lib/std/zig/system/NativeTargetInfo.zig \
--replace "/usr/bin/env" "${lib.getExe' coreutils "env"}"
'';
postBuild = ''
stage3/bin/zig run ../tools/docgen.zig -- ../doc/langref.html.in langref.html --zig $PWD/stage3/bin/zig
'';
postInstall = ''
install -Dm444 -t $doc/share/doc/zig-$version/html langref.html
'';
installCheckPhase = ''
runHook preInstallCheck
$out/bin/zig test --cache-dir "$TMPDIR/zig-test-cache" -I $src/test $src/test/behavior.zig
runHook postInstallCheck
'';
passthru = {
hook = callPackage ./hook.nix { zig = finalAttrs.finalPackage; };
cc = callPackage ../cc.nix { zig = finalAttrs.finalPackage; };
stdenv = callPackage ../stdenv.nix { zig = finalAttrs.finalPackage; };
tests = {
version = testers.testVersion {
package = finalAttrs.finalPackage;
command = "zig version";
};
};
};
meta = {
description = "General-purpose programming language and toolchain for maintaining robust, optimal, and reusable software";
homepage = "https://ziglang.org/";
changelog = "https://ziglang.org/download/${finalAttrs.version}/release-notes.html";
license = lib.licenses.mit;
mainProgram = "zig";
maintainers = with lib.maintainers; [ andrewrk ] ++ lib.teams.zig.members;
platforms = lib.platforms.unix;
};
})

View file

@ -1,43 +0,0 @@
{ makeSetupHook, zig }:
makeSetupHook {
name = "zig-hook";
propagatedBuildInputs = [ zig ];
substitutions = {
# This zig_default_flags below is meant to avoid CPU feature impurity in
# Nixpkgs. However, this flagset is "unstable": it is specifically meant to
# be controlled by the upstream development team - being up to that team
# exposing or not that flags to the outside (especially the package manager
# teams).
# Because of this hurdle, @andrewrk from Zig Software Foundation proposed
# some solutions for this issue. Hopefully they will be implemented in
# future releases of Zig. When this happens, this flagset should be
# revisited accordingly.
# Below are some useful links describing the discovery process of this 'bug'
# in Nixpkgs:
# https://github.com/NixOS/nixpkgs/issues/169461
# https://github.com/NixOS/nixpkgs/issues/185644
# https://github.com/NixOS/nixpkgs/pull/197046
# https://github.com/NixOS/nixpkgs/pull/241741#issuecomment-1624227485
# https://github.com/ziglang/zig/issues/14281#issuecomment-1624220653
zig_default_flags = [
"-Dcpu=baseline"
"-Doptimize=ReleaseSafe"
];
};
passthru = {
inherit zig;
};
meta = {
description = "Setup hook for using the Zig compiler in Nixpkgs";
inherit (zig.meta) maintainers platforms broken;
};
} ./setup-hook.sh

View file

@ -1,69 +0,0 @@
# shellcheck shell=bash
# shellcheck disable=SC2034
readonly zigDefaultFlagsArray=(@zig_default_flags@)
function zigSetGlobalCacheDir {
ZIG_GLOBAL_CACHE_DIR=$(mktemp -d)
export ZIG_GLOBAL_CACHE_DIR
}
function zigBuildPhase {
runHook preBuild
local flagsArray=()
concatTo flagsArray zigDefaultFlagsArray \
zigBuildFlags zigBuildFlagsArray
echoCmd 'zig build flags' "${flagsArray[@]}"
zig build "${flagsArray[@]}"
runHook postBuild
}
function zigCheckPhase {
runHook preCheck
local flagsArray=()
concatTo flagsArray zigDefaultFlagsArray \
zigCheckFlags zigCheckFlagsArray
echoCmd 'zig check flags' "${flagsArray[@]}"
zig build test "${flagsArray[@]}"
runHook postCheck
}
function zigInstallPhase {
runHook preInstall
local flagsArray=()
concatTo flagsArray zigDefaultFlagsArray \
zigBuildFlags zigBuildFlagsArray \
zigInstallFlags zigInstallFlagsArray
if [ -z "${dontAddPrefix-}" ]; then
# Zig does not recognize `--prefix=/dir/`, only `--prefix /dir/`
flagsArray+=("${prefixKey:---prefix}" "$prefix")
fi
echoCmd 'zig install flags' "${flagsArray[@]}"
zig build install "${flagsArray[@]}"
runHook postInstall
}
# shellcheck disable=SC2154
addEnvHooks "$targetOffset" zigSetGlobalCacheDir
if [ -z "${dontUseZigBuild-}" ] && [ -z "${buildPhase-}" ]; then
buildPhase=zigBuildPhase
fi
if [ -z "${dontUseZigCheck-}" ] && [ -z "${checkPhase-}" ]; then
checkPhase=zigCheckPhase
fi
if [ -z "${dontUseZigInstall-}" ] && [ -z "${installPhase-}" ]; then
installPhase=zigInstallPhase
fi

View file

@ -1,117 +0,0 @@
{
lib,
callPackage,
cmake,
coreutils,
fetchFromGitHub,
libxml2,
llvmPackages,
stdenv,
testers,
zlib,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "zig";
version = "0.12.1";
src = fetchFromGitHub {
owner = "ziglang";
repo = "zig";
rev = finalAttrs.version;
hash = "sha256-C56jyVf16Co/XCloMLSRsbG9r/gBc8mzCdeEMHV2T2s=";
};
nativeBuildInputs = [
cmake
(lib.getDev llvmPackages.llvm)
];
buildInputs =
[
libxml2
zlib
]
++ (with llvmPackages; [
libclang
lld
llvm
]);
# On Darwin, Zig calls std.zig.system.darwin.macos.detect during the build,
# which parses /System/Library/CoreServices/SystemVersion.plist and
# /System/Library/CoreServices/.SystemVersionPlatform.plist to determine the
# OS version. This causes the build to fail during stage 3 with
# OSVersionDetectionFail when the sandbox is enabled.
__impureHostDeps = lib.optionals stdenv.hostPlatform.isDarwin [
"/System/Library/CoreServices/.SystemVersionPlatform.plist"
"/System/Library/CoreServices/SystemVersion.plist"
];
outputs = [
"out"
"doc"
];
cmakeFlags = [
# file RPATH_CHANGE could not write new RPATH
(lib.cmakeBool "CMAKE_SKIP_BUILD_RPATH" true)
# ensure determinism in the compiler build
(lib.cmakeFeature "ZIG_TARGET_MCPU" "baseline")
# always link against static build of LLVM
(lib.cmakeBool "ZIG_STATIC_LLVM" true)
];
env.ZIG_GLOBAL_CACHE_DIR = "$TMPDIR/zig-cache";
doInstallCheck = true;
# strictDeps breaks zig when clang is being used.
# https://github.com/NixOS/nixpkgs/issues/317055#issuecomment-2148438395
strictDeps = !stdenv.cc.isClang;
# Zig's build looks at /usr/bin/env to find dynamic linking info. This doesn't
# work in Nix's sandbox. Use env from our coreutils instead.
postPatch = ''
substituteInPlace lib/std/zig/system.zig \
--replace "/usr/bin/env" "${lib.getExe' coreutils "env"}"
'';
postBuild = ''
stage3/bin/zig run ../tools/docgen.zig -- ../doc/langref.html.in langref.html --zig $PWD/stage3/bin/zig
'';
postInstall = ''
install -Dm444 langref.html -t $doc/share/doc/zig-${finalAttrs.version}/html
'';
installCheckPhase = ''
runHook preInstallCheck
$out/bin/zig test --cache-dir "$TMPDIR/zig-test-cache" -I $src/test $src/test/behavior.zig
runHook postInstallCheck
'';
passthru = {
hook = callPackage ./hook.nix { zig = finalAttrs.finalPackage; };
cc = callPackage ../cc.nix { zig = finalAttrs.finalPackage; };
stdenv = callPackage ../stdenv.nix { zig = finalAttrs.finalPackage; };
tests = {
version = testers.testVersion {
package = finalAttrs.finalPackage;
command = "zig version";
};
};
};
meta = {
description = "General-purpose programming language and toolchain for maintaining robust, optimal, and reusable software";
changelog = "https://ziglang.org/download/${finalAttrs.version}/release-notes.html";
homepage = "https://ziglang.org/";
license = lib.licenses.mit;
mainProgram = "zig";
maintainers = with lib.maintainers; [ andrewrk ] ++ lib.teams.zig.members;
platforms = lib.platforms.unix;
};
})

View file

@ -1,43 +0,0 @@
{ makeSetupHook, zig }:
makeSetupHook {
name = "zig-hook";
propagatedBuildInputs = [ zig ];
substitutions = {
# This zig_default_flags below is meant to avoid CPU feature impurity in
# Nixpkgs. However, this flagset is "unstable": it is specifically meant to
# be controlled by the upstream development team - being up to that team
# exposing or not that flags to the outside (especially the package manager
# teams).
# Because of this hurdle, @andrewrk from Zig Software Foundation proposed
# some solutions for this issue. Hopefully they will be implemented in
# future releases of Zig. When this happens, this flagset should be
# revisited accordingly.
# Below are some useful links describing the discovery process of this 'bug'
# in Nixpkgs:
# https://github.com/NixOS/nixpkgs/issues/169461
# https://github.com/NixOS/nixpkgs/issues/185644
# https://github.com/NixOS/nixpkgs/pull/197046
# https://github.com/NixOS/nixpkgs/pull/241741#issuecomment-1624227485
# https://github.com/ziglang/zig/issues/14281#issuecomment-1624220653
zig_default_flags = [
"-Dcpu=baseline"
"--release=safe"
];
};
passthru = {
inherit zig;
};
meta = {
description = "Setup hook for using the Zig compiler in Nixpkgs";
inherit (zig.meta) maintainers platforms broken;
};
} ./setup-hook.sh

View file

@ -1,69 +0,0 @@
# shellcheck shell=bash
# shellcheck disable=SC2034
readonly zigDefaultFlagsArray=(@zig_default_flags@)
function zigSetGlobalCacheDir {
ZIG_GLOBAL_CACHE_DIR=$(mktemp -d)
export ZIG_GLOBAL_CACHE_DIR
}
function zigBuildPhase {
runHook preBuild
local flagsArray=()
concatTo flagsArray zigDefaultFlagsArray \
zigBuildFlags zigBuildFlagsArray
echoCmd 'zig build flags' "${flagsArray[@]}"
zig build "${flagsArray[@]}"
runHook postBuild
}
function zigCheckPhase {
runHook preCheck
local flagsArray=()
concatTo flagsArray zigDefaultFlagsArray \
zigCheckFlags zigCheckFlagsArray
echoCmd 'zig check flags' "${flagsArray[@]}"
zig build test "${flagsArray[@]}"
runHook postCheck
}
function zigInstallPhase {
runHook preInstall
local flagsArray=()
concatTo flagsArray zigDefaultFlagsArray \
zigBuildFlags zigBuildFlagsArray \
zigInstallFlags zigInstallFlagsArray
if [ -z "${dontAddPrefix-}" ]; then
# Zig does not recognize `--prefix=/dir/`, only `--prefix /dir/`
flagsArray+=("${prefixKey:---prefix}" "$prefix")
fi
echoCmd 'zig install flags' "${flagsArray[@]}"
zig build install "${flagsArray[@]}"
runHook postInstall
}
# shellcheck disable=SC2154
addEnvHooks "$targetOffset" zigSetGlobalCacheDir
if [ -z "${dontUseZigBuild-}" ] && [ -z "${buildPhase-}" ]; then
buildPhase=zigBuildPhase
fi
if [ -z "${dontUseZigCheck-}" ] && [ -z "${checkPhase-}" ]; then
checkPhase=zigCheckPhase
fi
if [ -z "${dontUseZigInstall-}" ] && [ -z "${installPhase-}" ]; then
installPhase=zigInstallPhase
fi

View file

@ -1,117 +0,0 @@
{
lib,
callPackage,
cmake,
coreutils,
fetchFromGitHub,
libxml2,
llvmPackages,
stdenv,
testers,
zlib,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "zig";
version = "0.13.0";
src = fetchFromGitHub {
owner = "ziglang";
repo = "zig";
rev = finalAttrs.version;
hash = "sha256-5qSiTq+UWGOwjDVZMIrAt2cDKHkyNPBSAEjpRQUByFM=";
};
nativeBuildInputs = [
cmake
(lib.getDev llvmPackages.llvm)
];
buildInputs =
[
libxml2
zlib
]
++ (with llvmPackages; [
libclang
lld
llvm
]);
# On Darwin, Zig calls std.zig.system.darwin.macos.detect during the build,
# which parses /System/Library/CoreServices/SystemVersion.plist and
# /System/Library/CoreServices/.SystemVersionPlatform.plist to determine the
# OS version. This causes the build to fail during stage 3 with
# OSVersionDetectionFail when the sandbox is enabled.
__impureHostDeps = lib.optionals stdenv.hostPlatform.isDarwin [
"/System/Library/CoreServices/.SystemVersionPlatform.plist"
"/System/Library/CoreServices/SystemVersion.plist"
];
outputs = [
"out"
"doc"
];
cmakeFlags = [
# file RPATH_CHANGE could not write new RPATH
(lib.cmakeBool "CMAKE_SKIP_BUILD_RPATH" true)
# ensure determinism in the compiler build
(lib.cmakeFeature "ZIG_TARGET_MCPU" "baseline")
# always link against static build of LLVM
(lib.cmakeBool "ZIG_STATIC_LLVM" true)
];
env.ZIG_GLOBAL_CACHE_DIR = "$TMPDIR/zig-cache";
doInstallCheck = true;
# strictDeps breaks zig when clang is being used.
# https://github.com/NixOS/nixpkgs/issues/317055#issuecomment-2148438395
strictDeps = !stdenv.cc.isClang;
# Zig's build looks at /usr/bin/env to find dynamic linking info. This doesn't
# work in Nix's sandbox. Use env from our coreutils instead.
postPatch = ''
substituteInPlace lib/std/zig/system.zig \
--replace "/usr/bin/env" "${lib.getExe' coreutils "env"}"
'';
postBuild = ''
stage3/bin/zig build langref
'';
postInstall = ''
install -Dm444 ../zig-out/doc/langref.html -t $doc/share/doc/zig-${finalAttrs.version}/html
'';
installCheckPhase = ''
runHook preInstallCheck
$out/bin/zig test --cache-dir "$TMPDIR/zig-test-cache" -I $src/test $src/test/behavior.zig
runHook postInstallCheck
'';
passthru = {
hook = callPackage ./hook.nix { zig = finalAttrs.finalPackage; };
cc = callPackage ../cc.nix { zig = finalAttrs.finalPackage; };
stdenv = callPackage ../stdenv.nix { zig = finalAttrs.finalPackage; };
tests = {
version = testers.testVersion {
package = finalAttrs.finalPackage;
command = "zig version";
};
};
};
meta = {
description = "General-purpose programming language and toolchain for maintaining robust, optimal, and reusable software";
changelog = "https://ziglang.org/download/${finalAttrs.version}/release-notes.html";
homepage = "https://ziglang.org/";
license = lib.licenses.mit;
mainProgram = "zig";
maintainers = with lib.maintainers; [ andrewrk ] ++ lib.teams.zig.members;
platforms = lib.platforms.unix;
};
})

View file

@ -1,29 +0,0 @@
{ makeSetupHook, zig }:
makeSetupHook {
name = "zig-hook";
propagatedBuildInputs = [ zig ];
substitutions = {
# This zig_default_flags below is meant to avoid CPU feature impurity in
# Nixpkgs. However, this flagset is "unstable": it is specifically meant to
# be controlled by the upstream development team - being up to that team
# exposing or not that flags to the outside (especially the package manager
# teams).
zig_default_flags = [
"-Dcpu=baseline"
"--release=safe"
"--color off" # Turn off progress output
];
};
passthru = {
inherit zig;
};
meta = {
description = "A setup hook for using the Zig compiler in Nixpkgs";
inherit (zig.meta) maintainers platforms broken;
};
} ./setup-hook.sh

View file

@ -1,69 +0,0 @@
# shellcheck shell=bash
# shellcheck disable=SC2034
readonly zigDefaultFlagsArray=(@zig_default_flags@)
function zigSetGlobalCacheDir {
ZIG_GLOBAL_CACHE_DIR=$(mktemp -d)
export ZIG_GLOBAL_CACHE_DIR
}
function zigBuildPhase {
runHook preBuild
local flagsArray=()
concatTo flagsArray zigDefaultFlagsArray \
zigBuildFlags zigBuildFlagsArray
echoCmd 'zig build flags' "${flagsArray[@]}"
zig build "${flagsArray[@]}"
runHook postBuild
}
function zigCheckPhase {
runHook preCheck
local flagsArray=()
concatTo flagsArray zigDefaultFlagsArray \
zigCheckFlags zigCheckFlagsArray
echoCmd 'zig check flags' "${flagsArray[@]}"
zig build test "${flagsArray[@]}"
runHook postCheck
}
function zigInstallPhase {
runHook preInstall
local flagsArray=()
concatTo flagsArray zigDefaultFlagsArray \
zigBuildFlags zigBuildFlagsArray \
zigInstallFlags zigInstallFlagsArray
if [ -z "${dontAddPrefix-}" ]; then
# Zig does not recognize `--prefix=/dir/`, only `--prefix /dir/`
flagsArray+=("${prefixKey:---prefix}" "$prefix")
fi
echoCmd 'zig install flags' "${flagsArray[@]}"
zig build install "${flagsArray[@]}"
runHook postInstall
}
# shellcheck disable=SC2154
addEnvHooks "$targetOffset" zigSetGlobalCacheDir
if [ -z "${dontUseZigBuild-}" ] && [ -z "${buildPhase-}" ]; then
buildPhase=zigBuildPhase
fi
if [ -z "${dontUseZigCheck-}" ] && [ -z "${checkPhase-}" ]; then
checkPhase=zigCheckPhase
fi
if [ -z "${dontUseZigInstall-}" ] && [ -z "${installPhase-}" ]; then
installPhase=zigInstallPhase
fi

View file

@ -1,113 +0,0 @@
{
lib,
callPackage,
cmake,
coreutils,
fetchFromGitHub,
libxml2,
llvmPackages,
stdenv,
testers,
zlib,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "zig";
version = "0.9.1";
src = fetchFromGitHub {
owner = "ziglang";
repo = "zig";
rev = finalAttrs.version;
hash = "sha256-x2c4c9RSrNWGqEngio4ArW7dJjW0gg+8nqBwPcR721k=";
};
patches = [
# Fix index out of bounds reading RPATH (cherry-picked from 0.10-dev)
./000-0.9-read-dynstr-at-rpath-offset.patch
# Fix build on macOS 13 (cherry-picked from 0.10-dev)
./001-0.9-bump-macos-supported-version.patch
];
nativeBuildInputs = [
cmake
(lib.getDev llvmPackages.llvm)
];
buildInputs =
[
libxml2
zlib
]
++ (with llvmPackages; [
libclang
lld
llvm
]);
cmakeFlags = [
# file RPATH_CHANGE could not write new RPATH
(lib.cmakeBool "CMAKE_SKIP_BUILD_RPATH" true)
# ensure determinism in the compiler build
(lib.cmakeFeature "ZIG_TARGET_MCPU" "baseline")
];
env.ZIG_GLOBAL_CACHE_DIR = "$TMPDIR/zig-cache";
doInstallCheck = true;
strictDeps = true;
prePatch =
let
zig_0_10_0 = fetchFromGitHub {
owner = "ziglang";
repo = "zig";
rev = "0.10.0";
hash = "sha256-DNs937N7PLQimuM2anya4npYXcj6cyH+dRS7AiOX7tw=";
};
in
''
cp -R ${zig_0_10_0}/lib/libc/include/any-macos.13-any lib/libc/include/any-macos.13-any
cp -R ${zig_0_10_0}/lib/libc/include/aarch64-macos.13-none lib/libc/include/aarch64-macos.13-gnu
cp -R ${zig_0_10_0}/lib/libc/include/x86_64-macos.13-none lib/libc/include/x86_64-macos.13-gnu
cp ${zig_0_10_0}/lib/libc/darwin/libSystem.13.tbd lib/libc/darwin/
'';
# Zig's build looks at /usr/bin/env to find dynamic linking info. This doesn't
# work in Nix's sandbox. Use env from our coreutils instead.
postPatch = ''
substituteInPlace lib/std/zig/system/NativeTargetInfo.zig \
--replace "/usr/bin/env" "${lib.getExe' coreutils "env"}"
'';
installCheckPhase = ''
runHook preInstallCheck
$out/bin/zig test --cache-dir "$TMPDIR/zig-test-cache" -I $src/test $src/test/behavior.zig
runHook postInstallCheck
'';
passthru = {
hook = callPackage ./hook.nix { zig = finalAttrs.finalPackage; };
cc = callPackage ../cc.nix { zig = finalAttrs.finalPackage; };
stdenv = callPackage ../stdenv.nix { zig = finalAttrs.finalPackage; };
tests = {
version = testers.testVersion {
package = finalAttrs.finalPackage;
command = "zig version";
};
};
};
meta = {
description = "General-purpose programming language and toolchain for maintaining robust, optimal, and reusable software";
homepage = "https://ziglang.org/";
changelog = "https://ziglang.org/download/${finalAttrs.version}/release-notes.html";
license = lib.licenses.mit;
mainProgram = "zig";
maintainers = with lib.maintainers; [ andrewrk ] ++ lib.teams.zig.members;
platforms = lib.platforms.unix;
};
})

View file

@ -1,43 +0,0 @@
{ makeSetupHook, zig }:
makeSetupHook {
name = "zig-hook";
propagatedBuildInputs = [ zig ];
substitutions = {
# This zig_default_flags below is meant to avoid CPU feature impurity in
# Nixpkgs. However, this flagset is "unstable": it is specifically meant to
# be controlled by the upstream development team - being up to that team
# exposing or not that flags to the outside (especially the package manager
# teams).
# Because of this hurdle, @andrewrk from Zig Software Foundation proposed
# some solutions for this issue. Hopefully they will be implemented in
# future releases of Zig. When this happens, this flagset should be
# revisited accordingly.
# Below are some useful links describing the discovery process of this 'bug'
# in Nixpkgs:
# https://github.com/NixOS/nixpkgs/issues/169461
# https://github.com/NixOS/nixpkgs/issues/185644
# https://github.com/NixOS/nixpkgs/pull/197046
# https://github.com/NixOS/nixpkgs/pull/241741#issuecomment-1624227485
# https://github.com/ziglang/zig/issues/14281#issuecomment-1624220653
zig_default_flags = [
"-Dcpu=baseline"
"-Drelease-safe=true"
];
};
passthru = {
inherit zig;
};
meta = {
description = "Setup hook for using the Zig compiler in Nixpkgs";
inherit (zig.meta) maintainers platforms broken;
};
} ./setup-hook.sh

View file

@ -1,69 +0,0 @@
# shellcheck shell=bash
# shellcheck disable=SC2034
readonly zigDefaultFlagsArray=(@zig_default_flags@)
function zigSetGlobalCacheDir {
ZIG_GLOBAL_CACHE_DIR=$(mktemp -d)
export ZIG_GLOBAL_CACHE_DIR
}
function zigBuildPhase {
runHook preBuild
local flagsArray=()
concatTo flagsArray zigDefaultFlagsArray \
zigBuildFlags zigBuildFlagsArray
echoCmd 'zig build flags' "${flagsArray[@]}"
zig build "${flagsArray[@]}"
runHook postBuild
}
function zigCheckPhase {
runHook preCheck
local flagsArray=()
concatTo flagsArray zigDefaultFlagsArray \
zigCheckFlags zigCheckFlagsArray
echoCmd 'zig check flags' "${flagsArray[@]}"
zig build test "${flagsArray[@]}"
runHook postCheck
}
function zigInstallPhase {
runHook preInstall
local flagsArray=()
concatTo flagsArray zigDefaultFlagsArray \
zigBuildFlags zigBuildFlagsArray \
zigInstallFlags zigInstallFlagsArray
if [ -z "${dontAddPrefix-}" ]; then
# Zig does not recognize `--prefix=/dir/`, only `--prefix /dir/`
flagsArray+=("${prefixKey:---prefix}" "$prefix")
fi
echoCmd 'zig install flags' "${flagsArray[@]}"
zig build install "${flagsArray[@]}"
runHook postInstall
}
# shellcheck disable=SC2154
addEnvHooks "$targetOffset" zigSetGlobalCacheDir
if [ -z "${dontUseZigBuild-}" ] && [ -z "${buildPhase-}" ]; then
buildPhase=zigBuildPhase
fi
if [ -z "${dontUseZigCheck-}" ] && [ -z "${checkPhase-}" ]; then
checkPhase=zigCheckPhase
fi
if [ -z "${dontUseZigInstall-}" ] && [ -z "${installPhase-}" ]; then
installPhase=zigInstallPhase
fi

View file

@ -0,0 +1,48 @@
{
lib,
callPackage,
llvmPackages_13,
llvmPackages_15,
llvmPackages_16,
llvmPackages_17,
llvmPackages_18,
zigVersions ? { },
}:
let
versions = {
"0.9.1" = {
llvmPackages = llvmPackages_13;
hash = "sha256-x2c4c9RSrNWGqEngio4ArW7dJjW0gg+8nqBwPcR721k=";
};
"0.10.1" = {
llvmPackages = llvmPackages_15;
hash = "sha256-69QIkkKzApOGfrBdgtmxFMDytRkSh+0YiaJQPbXsBeo=";
};
"0.11.0" = {
llvmPackages = llvmPackages_16;
hash = "sha256-iuU1fzkbJxI+0N1PiLQM013Pd1bzrgqkbIyTxo5gB2I=";
};
"0.12.1" = {
llvmPackages = llvmPackages_17;
hash = "sha256-C56jyVf16Co/XCloMLSRsbG9r/gBc8mzCdeEMHV2T2s=";
};
"0.13.0" = {
llvmPackages = llvmPackages_18;
hash = "sha256-5qSiTq+UWGOwjDVZMIrAt2cDKHkyNPBSAEjpRQUByFM=";
};
} // zigVersions;
mkPackage =
{
version,
hash,
llvmPackages,
}@args:
callPackage ./generic.nix args;
zigPackages = lib.mapAttrs' (
version: args:
lib.nameValuePair (lib.versions.majorMinor version) (mkPackage (args // { inherit version; }))
) versions;
in
zigPackages

View file

@ -1,40 +1,75 @@
{ lib
, stdenv
, fetchFromGitHub
, cmake
, llvmPackages
, libxml2
, zlib
, coreutils
, callPackage
, ...
}:
args:
{
lib,
stdenv,
fetchFromGitHub,
cmake,
llvmPackages,
libxml2,
zlib,
coreutils,
callPackage,
version,
hash,
patches ? [ ],
}@args:
stdenv.mkDerivation (finalAttrs: {
pname = "zig";
inherit version;
src = fetchFromGitHub {
owner = "ziglang";
repo = "zig";
rev = finalAttrs.version;
inherit (args) hash;
inherit hash;
};
patches =
args.patches or [ ]
++ lib.optionals (lib.versions.majorMinor finalAttrs.version == "0.9") [
# Fix index out of bounds reading RPATH (cherry-picked from 0.10-dev)
./patches/0.9-read-dynstr-at-rpath-offset.patch
# Fix build on macOS 13 (cherry-picked from 0.10-dev)
./patches/0.9-bump-macos-supported-version.patch
]
++
lib.optional (lib.versions.majorMinor finalAttrs.version == "0.10")
# Backport alignment related panics from zig-master to 0.10.
# Upstream issue: https://github.com/ziglang/zig/issues/14559
./patches/0.10-macho-fixes.patch;
nativeBuildInputs = [
cmake
llvmPackages.llvm.dev
(lib.getDev llvmPackages.llvm.dev)
];
buildInputs = [
libxml2
zlib
] ++ (with llvmPackages; [
libclang
lld
llvm
]);
buildInputs =
[
libxml2
zlib
]
++ (with llvmPackages; [
libclang
lld
llvm
]);
cmakeFlags = [
# file RPATH_CHANGE could not write new RPATH
(lib.cmakeBool "CMAKE_SKIP_BUILD_RPATH" true)
# ensure determinism in the compiler build
(lib.cmakeFeature "ZIG_TARGET_MCPU" "baseline")
# always link against static build of LLVM
(lib.cmakeBool "ZIG_STATIC_LLVM" true)
];
outputs = [
"out"
] ++ lib.optional (lib.versionAtLeast finalAttrs.version "0.10") "doc";
# strictDeps breaks zig when clang is being used.
# https://github.com/NixOS/nixpkgs/issues/317055#issuecomment-2148438395
strictDeps = !stdenv.cc.isClang;
# On Darwin, Zig calls std.zig.system.darwin.macos.detect during the build,
# which parses /System/Library/CoreServices/SystemVersion.plist and
@ -52,35 +87,55 @@ stdenv.mkDerivation (finalAttrs: {
# Zig's build looks at /usr/bin/env to find dynamic linking info. This doesn't
# work in Nix's sandbox. Use env from our coreutils instead.
postPatch = if lib.versionAtLeast args.version "0.12" then ''
substituteInPlace lib/std/zig/system.zig \
--replace "/usr/bin/env" "${coreutils}/bin/env"
'' else ''
substituteInPlace lib/std/zig/system/NativeTargetInfo.zig \
--replace-fail "/usr/bin/env" "${coreutils}/bin/env"
'';
postPatch =
if lib.versionAtLeast finalAttrs.version "0.12" then
''
substituteInPlace lib/std/zig/system.zig \
--replace-fail "/usr/bin/env" "${coreutils}/bin/env"
''
else
''
substituteInPlace lib/std/zig/system/NativeTargetInfo.zig \
--replace-fail "/usr/bin/env" "${coreutils}/bin/env"
'';
postBuild =
if lib.versionAtLeast finalAttrs.version "0.13" then
''
stage3/bin/zig build langref
''
else if lib.versionAtLeast finalAttrs.version "0.11" then
''
stage3/bin/zig run ../tools/docgen.zig -- ../doc/langref.html.in langref.html --zig $PWD/stage3/bin/zig
''
else if lib.versionAtLeast finalAttrs.version "0.10" then
''
./zig2 run ../doc/docgen.zig -- ./zig2 ../doc/langref.html.in langref.html
''
else
null;
postInstall =
if lib.versionAtLeast finalAttrs.version "0.13" then
''
install -Dm444 ../zig-out/doc/langref.html -t $doc/share/doc/zig-${finalAttrs.version}/html
''
else if lib.versionAtLeast finalAttrs.version "0.10" then
''
install -Dm444 langref.html -t $doc/share/doc/zig-${finalAttrs.version}/html
''
else
null;
doInstallCheck = true;
installCheckPhase = ''
runHook preInstallCheck
$out/bin/zig test -I $src/test $src/test/behavior.zig
$out/bin/zig test --cache-dir "$TMPDIR/zig-test-cache" -I $src/test $src/test/behavior.zig
runHook postInstallCheck
'';
passthru = {
hook = callPackage ./hook.nix {
zig = finalAttrs.finalPackage;
};
cc = callPackage ./cc.nix {
zig = finalAttrs.finalPackage;
};
stdenv = callPackage ./stdenv.nix {
zig = finalAttrs.finalPackage;
};
};
meta = {
description = "General-purpose programming language and toolchain for maintaining robust, optimal, and reusable software";
homepage = "https://ziglang.org/";
@ -90,4 +145,4 @@ stdenv.mkDerivation (finalAttrs: {
mainProgram = "zig";
platforms = lib.platforms.unix;
};
} // removeAttrs args [ "hash" ])
})

View file

@ -10875,26 +10875,21 @@ with pkgs;
stdenv;
};
# requires a newer Apple SDK
zig_0_9 = darwin.apple_sdk_11_0.callPackage ../development/compilers/zig/0.9 {
llvmPackages = llvmPackages_13;
};
# requires a newer Apple SDK
zig_0_10 = darwin.apple_sdk_11_0.callPackage ../development/compilers/zig/0.10 {
llvmPackages = llvmPackages_15;
};
# requires a newer Apple SDK
zig_0_11 = darwin.apple_sdk_11_0.callPackage ../development/compilers/zig/0.11 {
llvmPackages = llvmPackages_16;
};
# requires a newer Apple SDK
zig_0_12 = darwin.apple_sdk_11_0.callPackage ../development/compilers/zig/0.12 {
llvmPackages = llvmPackages_17;
};
# requires a newer Apple SDK
zig_0_13 = darwin.apple_sdk_11_0.callPackage ../development/compilers/zig/0.13 {
llvmPackages = llvmPackages_18;
};
inherit (rec {
zigPackages = recurseIntoAttrs (callPackage ../development/compilers/zig {});
zig_0_9 = zigPackages."0.9";
zig_0_10 = zigPackages."0.10";
zig_0_11 = zigPackages."0.11";
zig_0_12 = zigPackages."0.12";
zig_0_13 = zigPackages."0.13";
}) zigPackages
zig_0_9
zig_0_10
zig_0_11
zig_0_12
zig_0_13;
zig = zig_0_13;
zigStdenv = if stdenv.cc.isZig then stdenv else lowPrio zig.passthru.stdenv;