Files
2026-04-12 20:41:26 +10:00

264 lines
8.5 KiB
Nix

{
bintools,
buildPackages,
callPackage,
cacert,
curlMinimal,
dart-bin,
debug ? false,
fetchurl,
gn,
gitMinimal,
gitSetupHook,
icu,
jq,
lib,
nix-update,
pax-utils,
pkg-config,
python312,
ripgrep,
runCommand,
samurai,
stdenv,
versionCheckHook,
writeShellScript,
writeText,
zlib,
}:
let
version = "3.11.4";
tools = callPackage ../../flutter/engine/tools.nix { inherit (stdenv) hostPlatform buildPlatform; };
getArchInfo =
platform:
let
arch = if platform.isx86_64 then "x64" else platform.linuxArch;
in
{
inherit arch;
outSuffix = lib.strings.toUpper arch;
};
targetArchInfo = getArchInfo stdenv.hostPlatform;
buildArchInfo = getArchInfo stdenv.buildPlatform;
python3 = python312.withPackages (
ps: with ps; [
httplib2
six
]
);
src =
runCommand "dart-source-deps"
{
pname = "dart-source-deps";
inherit version;
nativeBuildInputs = [
cacert
curlMinimal
gitMinimal
pax-utils
python3
tools.cipd
];
env = {
NIX_SSL_CERT_FILE = "${cacert}/etc/ssl/certs/ca-bundle.crt";
GIT_SSL_CAINFO = "${cacert}/etc/ssl/certs/ca-bundle.crt";
SSL_CERT_FILE = "${cacert}/etc/ssl/certs/ca-bundle.crt";
DEPOT_TOOLS_UPDATE = "0";
DEPOT_TOOLS_COLLECT_METRICS = "0";
PYTHONDONTWRITEBYTECODE = "1";
CIPD_HTTP_USER_AGENT = "standard-nix-build";
};
outputHashAlgo = "sha256";
outputHashMode = "recursive";
outputHash = "sha256-y2F+wB0M5dq6koxGpCs9BExGU7p8tFOIiRqfdf8ip+8=";
}
''
mkdir source
cd source
source ${../../../../build-support/fetchgit/deterministic-git}
export -f clean_git
export -f make_deterministic_repo
cp ${writeText ".gclient" ''
solutions = [{
'name': 'sdk',
'url': 'https://dart.googlesource.com/sdk.git@${version}',
}]
target_os = ['linux']
target_cpu = ['x64', 'arm64', 'riscv64']
target_cpu_only = True
''} .gclient
export PATH=${python3}/bin:$PATH:${tools.depot_tools}
python3 ${tools.depot_tools}/gclient.py sync --no-history --nohooks --noprehooks
find sdk -name ".versions" -type d -exec rm -rf {} +
rm --recursive --force sdk/buildtools/sysroot
rm --recursive --force sdk/buildtools/linux-arm64
rm --recursive --force sdk/buildtools/reclient
rm --recursive --force sdk/buildtools/*/clang
find sdk -type f \( -name "*.snapshot" -o -name "*.dill" -o -name "*.sym" \) -delete
rm --recursive --force sdk/tools/sdks/dart-sdk
find . -type l ! -exec test -e {} \; -delete
find . -name "ChangeLog*" -delete
rm --force .gclient .gclient_entries .gclient_previous_sync_commits .last_sync_hashes
rm --recursive --force .cipd .cipd_cache
find . -name ".git" -type d -prune -exec rm --recursive --force {} +
find . -name ".git*" -exec rm --recursive --force {} +
find . \( \
-name ".build-id" -o \
-name ".svn" -o \
-name "*~" -o \
-name "#*#" \
\) -exec rm --recursive --force {} +
for elf in $(scanelf --recursive --all --format "%F" sdk | sort); do
rm --force "$elf"
done
find . -name "__pycache__" -type d -exec rm --recursive --force {} +
find . -name "*.pyc" -delete
cp --recursive sdk $out
'';
in
dart-bin.overrideAttrs (oldAttrs: {
inherit version src;
nativeBuildInputs = [
gitMinimal
gitSetupHook
python312
ripgrep
pkg-config
];
buildInputs = lib.optionals (stdenv.hostPlatform == stdenv.buildPlatform) [
icu
zlib
];
patches = [
./gcc13.patch
./zlib-not-found.patch
./custom-flags.patch
]
++ lib.optionals (stdenv.hostPlatform == stdenv.buildPlatform) [
./unbundle.patch
./unbundle-icu.patch
];
postPatch = ''
sed --in-place 's/"-fsanitize=memory"//g' build/config/compiler/BUILD.gn
patchShebangs runtime/tools/
sed --in-place 's/ldflags = pkgresult\[4\]/ldflags = []/' build/config/linux/pkg_config.gni
cp ${
fetchurl {
url = "https://raw.githubusercontent.com/chromium/chromium/631a813125b886a52274653144019fd1681a0e97/build/config/linux/pkg-config.py";
hash = "sha256-9coRpgCewlkFXSGrMVkudaZUll0IFc9jDRBP+2PloOI=";
}
} build/config/linux/pkg-config.py
''
+ lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) ''
sed --in-place "s/default='pkg-config'/default='${stdenv.cc.targetPrefix}pkg-config'/g" build/config/linux/pkg-config.py
mkdir --parents .bin-tools
ln --symbolic $(command -v ${buildPackages.stdenv.cc.targetPrefix}g++) .bin-tools/${stdenv.buildPlatform.parsed.cpu.name}-linux-gnu-g++
ln --symbolic $(command -v ${buildPackages.stdenv.cc.targetPrefix}gcc) .bin-tools/${stdenv.buildPlatform.parsed.cpu.name}-linux-gnu-gcc
ln --symbolic $(command -v ${buildPackages.stdenv.cc.targetPrefix}ar) .bin-tools/${stdenv.buildPlatform.parsed.cpu.name}-linux-gnu-ar
export PATH=$PWD/.bin-tools:$PATH
''
+ ''
ln --symbolic ${buildPackages.dart-bin} tools/sdks/dart-sdk
ln --symbolic --force ${lib.getExe buildPackages.gn} buildtools/gn
mkdir --parents buildtools/ninja
ln --symbolic --force ${lib.getExe buildPackages.samurai} buildtools/ninja/ninja
python3 tools/generate_package_config.py
python3 tools/generate_sdk_version_file.py
echo "" > tools/bots/dartdoc_footer.html
rm third_party/devtools/web/devtools_analytics.js
JOBS_COUNT=''${NIX_BUILD_CORES:-2}
rg --no-ignore -l 'google-analytics\.com' . \
| rg -v "\.map\$" \
| xargs --no-run-if-empty -t -n 1 -P "$JOBS_COUNT" \
sed --in-place --regexp-extended 's|([^/]+\.)?google-analytics\.com|0\.0\.0\.0|g'
rg --no-ignore -l 'UA-[0-9]+-[0-9]+' . \
| xargs --no-run-if-empty -t -n 1 -P "$JOBS_COUNT" \
sed --in-place --regexp-extended 's|UA-[0-9]+-[0-9]+|UA-2137-0|g'
''
+ lib.optionalString (stdenv.hostPlatform == stdenv.buildPlatform) ''
for _lib in icu zlib; do
find . -type f -path "*third_party/$_lib/*" \
\! -path "*third_party/$_lib/chromium/*" \
\! -path "*third_party/$_lib/google/*" \
\! -regex '.*\.\(gn\|gni\|isolate\|py\)' \
-delete
done
python3 build/linux/unbundle/replace_gn_files.py --system-libraries icu zlib
''
+ ''
git init
git add .
git commit --message="stub" --quiet
'';
buildPhase = ''
runHook preBuild
python3 ./tools/build.py \
--no-clang \
--mode=${if debug then "debug" else "release"} \
--arch=${targetArchInfo.arch} \
--gn-args="${targetArchInfo.arch}_toolchain_prefix=\"${stdenv.cc}/bin/${stdenv.cc.targetPrefix}\"" \
''
+ lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) ''
--gn-args="dart_target_arch=\"${targetArchInfo.arch}\"" \
--gn-args="dart_host_arch=\"${buildArchInfo.arch}\"" \
--gn-args="${buildArchInfo.arch}_toolchain_prefix=\"${buildPackages.stdenv.cc}/bin/${buildPackages.stdenv.cc.targetPrefix}\"" \
--gn-args="host_cpu=\"${buildArchInfo.arch}\"" \
--gn-args="dart_force_runtime_snapshot_deps=true" \
--gn-args="host_toolchain_prefix=\"${buildPackages.stdenv.cc}/bin/${buildPackages.stdenv.cc.targetPrefix}\"" \
--gn-args="target_cpu=\"${targetArchInfo.arch}\"" \
''
+ lib.optionalString (stdenv.hostPlatform == stdenv.buildPlatform) ''
--gn-args="dart_embed_icu_data=false dart_snapshot_kind=\"app-jit\"" \
''
+ ''
--gn-args="dart_sysroot=\"\"" \
--no-verify-sdk-hash \
create_sdk runtime
runHook postBuild
'';
installPhase = ''
runHook preInstall
pushd out/${if debug then "Debug" else "Release"}${
if (stdenv.hostPlatform == stdenv.buildPlatform) then targetArchInfo.outSuffix else "*"
}/dart-sdk
rm LICENSE README revision
cp --recursive . $out
popd
runHook postInstall
'';
passthru = oldAttrs.passthru // {
updateScript = writeShellScript "update-dart" ''
${lib.getExe nix-update} --version=$(${lib.getExe curlMinimal} --fail --location --silent https://storage.googleapis.com/dart-archive/channels/stable/release/latest/VERSION | ${lib.getExe jq} --raw-output .version)
'';
};
meta = oldAttrs.meta // {
platforms = [
"aarch64-linux"
"x86_64-linux"
];
sourceProvenance = [ lib.sourceTypes.fromSource ];
};
})