Commit 33c711cb authored by kyehn's avatar kyehn
Browse files

dart-source: init

parent 0298fc50
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -3,7 +3,6 @@
  stdenv,
  fetchurl,
  unzip,
  bintools,
  versionCheckHook,
  runCommand,
  cctools,
@@ -48,7 +47,12 @@ stdenv.mkDerivation (finalAttrs: {
    cp -R . $out
  ''
  + lib.optionalString (stdenv.hostPlatform.isLinux) ''
    find $out/bin -executable -type f -exec patchelf --set-interpreter ${bintools.dynamicLinker} {} \;
    find $out/bin -type f -executable | while read f; do
      if patchelf --print-interpreter "$f" >/dev/null 2>&1; then
        patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" \
                 --set-rpath "${lib.makeLibraryPath [ (lib.getLib stdenv.cc.cc) ]}" "$f"
      fi
    done
  ''
  + ''
    runHook postInstall
+15 −0
Original line number Diff line number Diff line
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index b041a075..27dc22ed 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -430,6 +430,10 @@ config("compiler") {
     }
   }
 
+  cflags_c += string_split(getenv("CFLAGS"), " ")
+  cflags_cc += string_split(getenv("CXXFLAGS"), " ")
+  ldflags += string_split(getenv("LDFLAGS"), " ")
+
   # Assign any flags set for the C compiler to asmflags so that they are sent
   # to the assembler. The Windows assembler takes different types of flags
   # so only do so for posix platforms.
+261 −0
Original line number Diff line number Diff line
{
  bintools,
  buildPackages,
  callPackage,
  cacert,
  curlMinimal,
  dart,
  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.0";

  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-7y6kNpjWpc8+4Rhv+GuMnV5xHCQ5om2/3woZOJ8wYSc=";
      }
      ''
        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.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} 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.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 ];
  };
})
+20 −0
Original line number Diff line number Diff line
--- a/runtime/bin/ffi_test/ffi_test_functions_generated.cc
+++ b/runtime/bin/ffi_test/ffi_test_functions_generated.cc
@@ -11,6 +11,7 @@
 #include <sys/types.h>
 
 #include <cmath>
+#include <cstdint>
 #include <iostream>
 #include <limits>
 
--- a/runtime/bin/ffi_test/ffi_test_functions.cc
+++ b/runtime/bin/ffi_test/ffi_test_functions.cc
@@ -13,6 +13,7 @@
 #include <sys/types.h>
 
 #include <cmath>
+#include <cstdint>
 #include <iostream>
 #include <limits>
 
+64 −0
Original line number Diff line number Diff line
From 0d936b3e64e1e629bd29fa4dd84240f5c5344092 Mon Sep 17 00:00:00 2001
From: LN Liberda <lauren@selfisekai.rocks>
Date: Tue, 26 Nov 2024 19:28:59 +0100
Subject: [PATCH] build: option to not embed icu data

Bug: none
---
 runtime/bin/BUILD.gn     | 11 ++++++++---
 runtime/runtime_args.gni |  3 +++
 2 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/runtime/bin/BUILD.gn b/runtime/bin/BUILD.gn
index 90dc09a0c02..8f88873dc18 100644
--- a/runtime/bin/BUILD.gn
+++ b/runtime/bin/BUILD.gn
@@ -795,7 +795,6 @@ template("dart_executable") {
     }
     deps = [
       ":crashpad",
-      ":icudtl_cc",
       "//third_party/boringssl",
       "//third_party/icu:icui18n",
       "//third_party/icu:icuuc",
@@ -804,7 +803,11 @@ template("dart_executable") {
     if (is_fuchsia) {
       deps += [ "$fuchsia_sdk/pkg/fdio" ]
     }
-    defines = [ "DART_EMBED_ICU_DATA" ] + extra_defines
+    defines = extra_defines
+    if (dart_embed_icu_data) {
+      defines += [ "DART_EMBED_ICU_DATA" ]
+      deps += [ ":icudtl_cc" ]
+    }
     if (exclude_kernel_service) {
       defines += [ "EXCLUDE_CFE_AND_KERNEL_PLATFORM" ]
     }
@@ -1004,10 +1004,12 @@
     "..:add_empty_macho_section_config",
   ]
   extra_deps = [
-    ":icudtl_cc",
     "..:libdart_aotruntime",
     "../platform:libdart_platform_aotruntime",
   ]
+  if (dart_embed_icu_data) {
+    extra_deps += [":icudtl_cc"]
+  }
   extra_sources = [
     "builtin.cc",
     "gzip.cc",
diff --git a/runtime/runtime_args.gni b/runtime/runtime_args.gni
index fbcfeb157fb..061e8f74a5c 100644
--- a/runtime/runtime_args.gni
+++ b/runtime/runtime_args.gni
@@ -77,6 +77,9 @@ declare_args() {
 
   # Whether to support dynamic loading and interpretation of Dart bytecode.
   dart_dynamic_modules = false
+
+  # Whether to embed ICU data inside the runtime binary.
+  dart_embed_icu_data = true
 }
 
 declare_args() {
Loading