264 lines
8.5 KiB
Nix
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 ];
|
|
};
|
|
})
|