From 42fb40476cacbc6947887c9e1f33511a9f249372 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Soko=C5=82owski?= Date: Thu, 23 Apr 2020 20:19:12 +0200 Subject: [PATCH] nix: reafactoring of status-go builds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Changes: - Fixed `nix/status-go/desktop` builds - Dropped nimbus wrapper for `status-go` for now - Split `status-go` builds into subfolders: `mobile`, `desktop` - Fixed shells for desktop builds: `linux`,`macos`,`windows` - Added `make status-go-*` targets for building them - Moved source management to `nix/status-go/source.nix` - Moved `nix/status-go/build.nix` into `nix/status-go/mobile` - Moved `nix/desktop/cmake/qtkeychain` to `nix/pkgs/qtkeychain-src` - Moved `nix/desktop/linux/linuxdeployqt` to `nix/pkgs` - Moved `nix/desktop/linux/appimagekit` to `nix/pkgs` - Dropped `nix/tools/mkShell.nix` since it did almost nothing - Dropped `nix/desktop/cmake/snorenotify` since it's broken - Moved setup from `nix/tools/mkShell.nix` to `nix/shells.nix` - Simplified `nix/mobile/ios/status-go-shell.nix` - Simplified `nix/status-go/default.nix` - Updated the `nix/DETAILS.md` and `nix/README.md` - Moved known issues to `nix/KNOWN_ISSUES.md` - Improved output of `nix/scripts/build.sh` Signed-off-by: Jakub SokoĊ‚owski --- Makefile | 25 ++- default.nix | 3 +- nix/DETAILS.md | 8 +- nix/KNOWN_ISSUES.md | 47 +++++ nix/README.md | 83 ++------ nix/desktop/cmake/qtkeychain/default.nix | 43 ---- nix/desktop/cmake/snorenotify/default.nix | 52 ----- nix/desktop/default.nix | 64 +++--- nix/desktop/linux/default.nix | 26 +-- nix/desktop/macos/default.nix | 40 ++-- nix/desktop/windows/default.nix | 6 +- nix/lib/default.nix | 7 + nix/lib/getConfig.nix | 12 ++ nix/{tools => lib}/mergeSh.nix | 0 nix/{tools => lib}/mkFilter.nix | 4 +- nix/{tools => lib}/mkFilter_test.nix | 0 nix/mobile/android/default.nix | 6 +- .../android/targets/release-android.nix | 45 ++-- nix/mobile/default.nix | 8 +- nix/mobile/ios/default.nix | 2 +- nix/mobile/ios/status-go-shell.nix | 51 +++-- nix/overlay.nix | 16 +- .../linux => pkgs}/appimagekit/default.nix | 0 .../linux => pkgs}/appimagekit/nix.patch | 0 .../linux => pkgs}/linuxdeployqt/default.nix | 0 .../linuxdeployqt/linuxdeployqt.patch | 0 nix/pkgs/qt5custom/default.nix | 11 + nix/pkgs/qtkeychain-src/default.nix | 40 ++++ nix/scripts/build.sh | 11 +- nix/scripts/shell.sh | 4 +- nix/shells.nix | 13 +- nix/status-go/build.nix | 76 ------- nix/status-go/default.nix | 193 ++---------------- nix/status-go/desktop/default.nix | 88 ++++---- nix/status-go/desktop/shell.nix | 15 ++ nix/status-go/mobile/build.nix | 91 +++++++++ nix/status-go/mobile/default.nix | 116 ++--------- nix/status-go/nimbus/default.nix | 61 +++--- nix/status-go/source.nix | 59 ++++++ nix/targets.nix | 10 +- nix/tools/mkShell.nix | 40 ---- nix/tools/utils.nix | 7 + scripts/prepare-for-desktop-platform.sh | 14 +- 43 files changed, 615 insertions(+), 782 deletions(-) create mode 100644 nix/KNOWN_ISSUES.md delete mode 100644 nix/desktop/cmake/qtkeychain/default.nix delete mode 100644 nix/desktop/cmake/snorenotify/default.nix create mode 100644 nix/lib/default.nix create mode 100644 nix/lib/getConfig.nix rename nix/{tools => lib}/mergeSh.nix (100%) rename nix/{tools => lib}/mkFilter.nix (100%) rename nix/{tools => lib}/mkFilter_test.nix (100%) rename nix/{desktop/linux => pkgs}/appimagekit/default.nix (100%) rename nix/{desktop/linux => pkgs}/appimagekit/nix.patch (100%) rename nix/{desktop/linux => pkgs}/linuxdeployqt/default.nix (100%) rename nix/{desktop/linux => pkgs}/linuxdeployqt/linuxdeployqt.patch (100%) create mode 100644 nix/pkgs/qt5custom/default.nix create mode 100644 nix/pkgs/qtkeychain-src/default.nix delete mode 100644 nix/status-go/build.nix create mode 100644 nix/status-go/desktop/shell.nix create mode 100644 nix/status-go/mobile/build.nix create mode 100644 nix/status-go/source.nix delete mode 100644 nix/tools/mkShell.nix diff --git a/Makefile b/Makefile index 854c37edf2..f18dab0b6d 100644 --- a/Makefile +++ b/Makefile @@ -201,6 +201,22 @@ jsbundle-ios: export BUILD_ENV ?= prod jsbundle-ios: ##@jsbundle Compile JavaScript and Clojure into index.ios.js yarn shadow-cljs release ios +#-------------- +# status-go lib +# ------------- + +status-go-desktop: SHELL := /bin/sh +status-go-desktop: ##@status-go Compile status-go for desktop app + nix/scripts/build.sh targets.status-go.desktop + +status-go-android: SHELL := /bin/sh +status-go-android: ##@status-go Compile status-go for Android app + nix/scripts/build.sh targets.status-go.mobile.android + +status-go-ios: SHELL := /bin/sh +status-go-ios: ##@status-go Compile status-go for iOS app + nix/scripts/build.sh targets.status-go.mobile.ios + #-------------- # Clojure REPL # ------------- @@ -259,16 +275,15 @@ endif lint: export TARGET := clojure lint: ##@test Run code style checks - # yarn clj-kondo --confg .clj-kondo/config.edn --lint src clojure -Sdeps '{:deps {cljfmt {:mvn/version "0.6.7"}}}' \ - -m cljfmt.main check src \ - --indents indentation.edn + -m cljfmt.main check src \ + --indents indentation.edn lint-fix: export TARGET := clojure lint-fix: ##@test Run code style checks and fix issues clojure -Sdeps '{:deps {cljfmt {:mvn/version "0.6.7"}}}' \ - -m cljfmt.main fix src \ - --indents indentation.edn + -m cljfmt.main fix src \ + --indents indentation.edn test: export TARGET := clojure test: ##@test Run tests once in NodeJS diff --git a/default.nix b/default.nix index 0d44f5e58e..66742e2cfb 100644 --- a/default.nix +++ b/default.nix @@ -1,9 +1,10 @@ # for passing build options, see nix/README.md -{ config ? { status-im = { build-type = ""; }; } }: +{ config ? { status-im = { }; } }: let main = import ./nix/default.nix { inherit config; }; in { # this is where the --attr argument selects the shell or target inherit (main) pkgs targets shells; + inherit config; } diff --git a/nix/DETAILS.md b/nix/DETAILS.md index a18454ec4e..9769160236 100644 --- a/nix/DETAILS.md +++ b/nix/DETAILS.md @@ -9,6 +9,7 @@ There are four main folders in the `nix` directory: * `nix/scripts` - Bash scripts for easier usage of Nix * `nix/pkgs` - Packages we add to or modify in `nixpkgs` * `nix/deps` - Project dependencies managed by Nix +* `nix/lib` - Our tools we merge into `pkgs.lib` * `nix/tools` - Various tools used by our derivations and shells * `nix/status-go` - Derivations for building [`status-go`](https://github.com/status-im/status-go) repo @@ -16,12 +17,15 @@ There are four main folders in the `nix` directory: There are a few main files that define the whole build environment: +* `nix/nix.conf` - Binary cache configuration * `nix/default.nix` - Entrypoint for both shells and targets * `nix/shells.nix` - Definition of Nix shells used in builds * `nix/targets.nix` - Hierarchy of main build targets * `nix/pkgs.nix` - Definition of a custom `nixpkgs` repo * `nix/overlay.nix` - Overrides for `nixpkgs`, custom packages +The `default.nix` and `shell.nix` files at th repo root are just a gateway into the `nix` subfolder. + # Start The starting point for using our Nix shells and targets is the [`default.nix`](/default.nix) file. @@ -49,11 +53,11 @@ nix-build \ --show-trace \ --attr targets.mobile.android.release \ --argstr secrets-file '/tmp/tmp-status-react-559a3a441/tmp.xAnrPuNtAP' \ - --option extra-sandbox-paths '/home/sochan/.gradle/status-im.keystore /tmp/tmp-status-react-559a3a441/tmp.xAnrPuNtAP' \ + --option extra-sandbox-paths '/home/joe/.gradle/status-im.keystore /tmp/tmp-status-react-559a3a441/tmp.xAnrPuNtAP' \ --arg config '{ \ status-im.build-type="nightly"; status-im.build-number="2020022418"; - status-im.android.keystore-file="/home/sochan/.gradle/status-im.keystore"; + status-im.android.keystore-path="/home/joe/.gradle/status-im.keystore"; status-im.android.abi-split="false"; status-im.android.abi-include="armeabi-v7a;arm64-v8a;x86"; }' \ diff --git a/nix/KNOWN_ISSUES.md b/nix/KNOWN_ISSUES.md new file mode 100644 index 0000000000..bccf9d5a78 --- /dev/null +++ b/nix/KNOWN_ISSUES.md @@ -0,0 +1,47 @@ +# Known Issues + +## MacOS 10.15 "Catalina" + +There is an unsolved issue with the root(`/`) file system in `10.15` being read-only: +https://github.com/NixOS/nix/issues/2925 + +Our current recommended workaround is putting `/nix` under `/opt/nix` and symlinking it via `/etc/synthetic.conf`: + +```bash +sudo mkdir /opt/nix +sudo chown ${USER} /opt/nix +sudo sh -c "echo 'nix\t/opt/nix' >> /etc/synthetic.conf" +reboot +``` + +After the system reboots you should see the `/nix` symlink in place: + +```bash + % ls -l /nix +lrwxr-xr-x 1 root wheel 8 Oct 11 13:53 /nix -> /opt/nix +``` + +In order to be able to use Nix with a symlinked `/nix` you need to include this in your shell: + +```bash +export NIX_IGNORE_SYMLINK_STORE=1 +``` + +Add it to your `.bashrc` or any other shell config file. + +__NOTE__: Your old `/nix` directory will end up in `/Users/Shared/Relocated Items/Security/nix` after OS upgrade. + +## Cache Downloads Timing Out + +If copying from Nix Cache times out you can adjust the timeout by changing [`nix/nix.conf`](/nix/nix.conf): +```conf +stalled-download-timeout = 9001 +``` + +## `extra-sandbox-paths` Is a Restricted Setting + +When building Android on NixOS you might encounter the following error: +``` +ignoring the user-specified setting 'extra-sandbox-paths', because it is a restricted setting and you are not a trusted user +``` +You can mitigate this by setting the [`nix.trustedUsers`](https://nixos.org/nixos/options.html#nix.trustedusers) property. diff --git a/nix/README.md b/nix/README.md index b00c37152c..0643f57386 100644 --- a/nix/README.md +++ b/nix/README.md @@ -10,19 +10,23 @@ __NOTE:__ If you are in Asia you might want to add the `https://nix-cache-cn.sta ## Build arguments -We leverage the standard nixpkgs `config` argument for our own parameterization of the builds (e.g. to pass a build number or build type). Here is a sample structure of the `config` attribute set: +We leverage the standard nixpkgs `config` argument for our own parameterization of the builds (e.g. to pass a build number or build type). + +Here is a sample structure of the `config` attribute set: ```nix config = { status-im = { - ci = "1"; # This flag is present when running in a CI environment - build-type = "pr"; # Build type (influences which .env file gets used for feature flags) - status-go = { - src-override = "$GOPATH/src/github.com/status-im/status-go"; + build-type = "pr"; # Build type (influences which .env file gets used for feature flags) + build-number = 9999; # Used for versionCode and CFBundleVersion in Android and iOS respectively + android = { + gradle-opts = ""; # Gradle options passed for Android builds + keystore-path = ""; # Path to keystore for signing the APK + abi-split = false; # If APKs should be split based on architectures + abi-include = "x86"; # Android architectures to build for }; - status-react = { - build-number = "9999"; # Build number to be assigned to the app bundle - gradle-opts = ""; # Gradle options passed for Android builds + status-go = { + src-override = "$HOME/my/source/status-go"; # local source override }; }; }; @@ -46,71 +50,14 @@ For valid values you can check the [`nix/shells.nix`](/nix/shells.nix) file. ## Using a local status-go repository -If you need to use a locally checked-out status-go repository as a dependency of status-react, you can achieve that by defining the `STATUS_GO_SRC_OVERRIDE` -environment variable. +If you need to use a locally checked-out status-go repository, you can achieve that by defining the `STATUS_GO_SRC_OVERRIDE` +environment variable: ```sh export STATUS_GO_SRC_OVERRIDE=$GOPATH/src/github.com/status-im/status-go -# Any command that you run from now on -# will use the specified status-go location make release-android ``` -or for a one-off build: - -```sh -make release-android STATUS_GO_SRC_OVERRIDE=$GOPATH/src/github.com/status-im/status-go -``` - -## Using a local Nimbus repository - -If you need to use a locally checked-out Nimbus repository as a dependency of status-go, you can achieve that by defining the `NIMBUS_SRC_OVERRIDE` -environment variable, in the same way as the previous point for local status-go repositories. - ## Known Issues -### MacOS 10.15 "Catalina" - -There is an unsolved issue with the root(`/`) file system in `10.15` being read-only: -https://github.com/NixOS/nix/issues/2925 - -Our current recommended workaround is putting `/nix` under `/opt/nix` and symlinking it via `/etc/synthetic.conf`: - -```bash -sudo mkdir /opt/nix -sudo chown ${USER} /opt/nix -sudo sh -c "echo 'nix\t/opt/nix' >> /etc/synthetic.conf" -reboot -``` - -After the system reboots you should see the `/nix` symlink in place: - -```bash - % ls -l /nix -lrwxr-xr-x 1 root wheel 8 Oct 11 13:53 /nix -> /opt/nix -``` - -In order to be able to use Nix with a symlinked `/nix` you need to include this in your shell: - -```bash -export NIX_IGNORE_SYMLINK_STORE=1 -``` - -Add it to your `.bashrc` or any other shell config file. - -__NOTE__: Your old `/nix` directory will end up in `/Users/Shared/Relocated Items/Security/nix` after OS upgrade. - -### Cache Downloads Timing Out - -If copying from Nix Cache times out you can adjust the timeout by changing [`nix/nix.conf`](/nix/nix.conf): -```conf -stalled-download-timeout = 9001 -``` - -### `extra-sandbox-paths` Is a Restricted Setting - -When building Android on NixOS you might encounter the following error: -``` -ignoring the user-specified setting 'extra-sandbox-paths', because it is a restricted setting and you are not a trusted user -``` -You can mitigate this by setting the [`nix.trustedUsers`](https://nixos.org/nixos/options.html#nix.trustedusers) property. +See [`KNOWN_ISSUES.md`](./KNOWN_ISSUES.md). diff --git a/nix/desktop/cmake/qtkeychain/default.nix b/nix/desktop/cmake/qtkeychain/default.nix deleted file mode 100644 index c3541ad178..0000000000 --- a/nix/desktop/cmake/qtkeychain/default.nix +++ /dev/null @@ -1,43 +0,0 @@ -{ pkgs, stdenv, fetchFromGitHub }: - -let - version = "0.8.90"; - rev = "d3c606c55adf8c2c2747556055652b3469f6c4c2"; # This revision will get used in https://github.com/status-im/react-native-keychain/blob/master/desktop/CMakeLists.txt#L45 - sha256 = "1gqw3g0j46aswncm8fgy419lp1fp2y2nild82hs18xra5albvf3i"; - package = stdenv.mkDerivation { - name = "qtkeychain-patched-source"; - version = "${version}-${stdenv.lib.strings.substring 0 7 rev}"; - - src = fetchFromGitHub { - inherit rev sha256; - owner = "status-im"; - repo = "qtkeychain"; - name = "qtkeychain-source-${version}"; - }; - - phases = [ "unpackPhase" ]; - unpackPhase = '' - mkdir -p $out/src - cp -r $src/* $out/src/ - substituteInPlace $out/src/CMakeLists.txt \ - --replace "cmake_minimum_required(VERSION 2.8.11)" "cmake_minimum_required(VERSION 3.12.1)" \ - --replace "project(qtkeychain)" "project(qtkeychain VERSION ${version})" \ - --replace "set(QTKEYCHAIN_VERSION 0.8.90)" "set(QTKEYCHAIN_VERSION ${version})" \ - --replace "{QTKEYCHAIN_VERSION}\" VARIABLE_PREFIX SNORE" "QTKEYCHAIN_VERSION VARIABLE_PREFIX SNORE" \ - --replace "\"\$QTKEYCHAIN_VERSION" qtkeychain - ''; - - meta = with stdenv.lib; { - description = "Patched sources for qtkeychain, a platform-independent Qt API for storing passwords securely"; - homepage = https://github.com/status-im/qtkeychain; - license = licenses.bsd3; - maintainers = [ maintainers.pombeirp ]; - platforms = with platforms; darwin ++ linux; - }; - }; - -in package // { - shellHook = (package.shellHook or "") + '' - export QTKEYCHAIN_SOURCES="${package}/src" - ''; -} diff --git a/nix/desktop/cmake/snorenotify/default.nix b/nix/desktop/cmake/snorenotify/default.nix deleted file mode 100644 index 0a3b0eceea..0000000000 --- a/nix/desktop/cmake/snorenotify/default.nix +++ /dev/null @@ -1,52 +0,0 @@ -{ pkgs, stdenv, fetchFromGitHub }: - -let - version = "0.7.1"; - rev = "9d54904e4896ab6c3c3a52f97381e5948b455970"; # This revision will get used in modules/react-native-desktop-notification/desktop/CMakeLists.txt#L71 - sha256 = "0ix1qgx877nw9mlbbqsgkis4phkkf4ax2ambziy2w48hg6ai0x4d"; - package = stdenv.mkDerivation { - name = "snorenotify-patched-source"; - version = "${version}-${stdenv.lib.strings.substring 0 7 rev}"; - - src = fetchFromGitHub { - inherit rev sha256; - owner = "status-im"; - repo = "snorenotify"; - name = "snorenotify-source-${version}"; - }; - - phases = [ "unpackPhase" ]; - unpackPhase = - let - inherit (stdenv.lib) versions; - in '' - mkdir -p $out/src - cp -r $src/* $out/src/ - substituteInPlace $out/src/CMakeLists.txt \ - --replace "cmake_minimum_required( VERSION 2.8.12 )" "" \ - --replace "project( SnoreNotify )" "cmake_minimum_required( VERSION 3.12.1 ) -project( SnoreNotify VERSION ${version} )" \ - --replace "set(SNORE_VERSION_MAJOR 0)" "set(SNORE_VERSION_MAJOR ${versions.major version} )" \ - --replace "set(SNORE_VERSION_MINOR 7)" "set(SNORE_VERSION_MINOR ${versions.minor version} )" \ - --replace "set(SNORE_VERSION_PATCH 1)" "set(SNORE_VERSION_PATCH ${versions.patch version} )" - substituteInPlace $out/src/src/libsnore/CMakeLists.txt \ - --replace "{SNORE_VERSION_MAJOR}" "SNORE_VERSION_MAJOR" \ - --replace "{SNORE_VERSION_MINOR}" "SNORE_VERSION_MINOR" \ - --replace "{SNORE_VERSION_PATCH}" "SNORE_VERSION_PATCH" \ - --replace "ecm_setup_version(\"\$SNORE_VERSION_MAJOR.\$SNORE_VERSION_MINOR.\$SNORE_VERSION_PATCH\"" "ecm_setup_version(SnoreNotify" - ''; - - meta = { - description = "Patched sources for Snorenotify, a multi platform Qt notification framework. Using a plugin system it is possible to create notifications with many different notification systems on Windows, Mac OS and Unix and mobile Devices"; - homepage = https://github.com/status-im/snorenotify; - license = stdenv.lib.licenses.lgpl3; - maintainers = with stdenv.lib.maintainers; [ pombeirp ]; - platforms = with stdenv.lib.platforms; darwin ++ linux; - }; - }; - -in package // { - shellHook = (package.shellHook or "") + '' - export SNORENOTIFY_SOURCES="${package}/src" - ''; -} diff --git a/nix/desktop/default.nix b/nix/desktop/default.nix index 4958b176a9..8000aef741 100644 --- a/nix/desktop/default.nix +++ b/nix/desktop/default.nix @@ -1,39 +1,49 @@ -{ stdenv, mkShell, callPackage, status-go, - cmake, extra-cmake-modules, file, moreutils, go, darwin, nodejs }: +{ stdenv, lib, pkgs, mkShell, callPackage +, status-go, qtkeychain-src }: let - inherit (stdenv.lib) catAttrs concatStrings optional unique; + inherit (stdenv) isLinux isDarwin; + inherit (lib) mapAttrs catAttrs optional unique mergeSh; - baseImageFactory = callPackage ./base-image { inherit stdenv; }; - snoreNotifySources = callPackage ./cmake/snorenotify { }; - qtkeychainSources = callPackage ./cmake/qtkeychain { }; + # utilities + baseImageFactory = callPackage ./base-image { }; # main targets - linux = callPackage ./linux { inherit stdenv status-go baseImageFactory; }; - macos = callPackage ./macos { inherit stdenv status-go darwin baseImageFactory; }; - windows = callPackage ./windows { inherit stdenv go baseImageFactory; }; + linux = callPackage ./linux { inherit status-go baseImageFactory; }; + macos = callPackage ./macos { inherit status-go baseImageFactory; }; + windows = callPackage ./windows { inherit baseImageFactory; }; selectedSources = - optional stdenv.isLinux linux ++ - optional stdenv.isLinux windows ++ - optional stdenv.isDarwin macos; + optional isLinux linux ++ + optional isLinux windows ++ + optional isDarwin macos; -in rec { - inherit linux macos windows; + # default shell for desktop builds + default = mkShell { + buildInputs = with pkgs; unique ([ + file moreutils cmake + extra-cmake-modules + qtkeychain-src + ] ++ (catAttrs "buildInputs" selectedSources)); - buildInputs = unique ([ - cmake - extra-cmake-modules - file - moreutils - snoreNotifySources - qtkeychainSources - ] ++ catAttrs "buildInputs" selectedSources); + inputsFrom = [ status-go.desktop ] + ++ (catAttrs "shell" selectedSources); - shell = mkShell { - inherit buildInputs; - shellHook = concatStrings (catAttrs "shellHook" ( - selectedSources ++ [ snoreNotifySources qtkeychainSources ] - )); + # These variables are used by the Status Desktop CMake build script in: + # - modules/react-native-status/desktop/CMakeLists.txt + shellHook = '' + export STATUS_GO_DESKTOP_INCLUDEDIR=${status-go.desktop}/include + export STATUS_GO_DESKTOP_LIBDIR=${status-go.desktop}/lib + # QT Keychain library sources + export QTKEYCHAIN_SOURCES="${qtkeychain-src}/src" + ''; }; + + # for merging default shell + mergeDefaultShell = (key: val: { shell = mergeSh default [ val.shell ]; }); + +in { + shell = default; } + # merge default shell with platform sub-shells + // mapAttrs mergeDefaultShell { inherit linux windows macos; } diff --git a/nix/desktop/linux/default.nix b/nix/desktop/linux/default.nix index 4408459947..3e73cddeb8 100644 --- a/nix/desktop/linux/default.nix +++ b/nix/desktop/linux/default.nix @@ -1,30 +1,30 @@ -{ stdenv, mkShell, callPackage, - appimagekit, patchelf, qt5, status-go, baseImageFactory }: +{ lib, stdenv, mkShell, callPackage +# pkgs +, appimagekit, linuxdeployqt, patchelf, qt5custom +# custom arguments +, status-go, baseImageFactory }: -with stdenv; - -assert isLinux; +assert lib.assertMsg stdenv.isLinux "Building Linux app can work only on Linux!"; let inherit (lib) concatStrings catAttrs; baseImage = baseImageFactory "linux"; - appimagekit = callPackage ./appimagekit { }; - linuxdeployqt = callPackage ./linuxdeployqt { inherit appimagekit; }; in rec { buildInputs = [ appimagekit linuxdeployqt patchelf - qt5.full - ] ++ status-go.buildInputs; + qt5custom + ]; shell = mkShell { inherit buildInputs; - shellHook = concatStrings (catAttrs "shellHook" [ baseImage status-go ]) + '' - export QT_PATH="${qt5.full}" - export QT_BASEBIN_PATH="${qt5.qtbase.bin}" - export PATH="${qt5.full}/bin:$PATH" + inputsFrom = [ baseImage status-go ]; + shellHook = '' + export QT_PATH="${qt5custom}" + export QT_BASEBIN_PATH="${qt5custom}/bin" + export PATH="$QT_BASEBIN_PATH:$PATH" ''; }; } diff --git a/nix/desktop/macos/default.nix b/nix/desktop/macos/default.nix index aa70151a90..365475bcd8 100644 --- a/nix/desktop/macos/default.nix +++ b/nix/desktop/macos/default.nix @@ -1,32 +1,32 @@ { stdenv, lib, callPackage, mkShell, - gnupg22, darwin, qt5, status-go, baseImageFactory }: + gnupg22, darwin, qt5custom, status-go, baseImageFactory }: -with darwin.apple_sdk.frameworks; +assert lib.assertMsg stdenv.isDarwin "Building MacOS app can work only on MacOS!"; -assert stdenv.isDarwin; let inherit (lib) concatStrings catAttrs; + inherit (darwin.apple_sdk.frameworks) + AppKit Cocoa Foundation OpenGL CoreFoundation; + baseImage = baseImageFactory "macos"; -in rec { - buildInputs = [ - gnupg22 - baseImage - qt5.full - AppKit - Cocoa - darwin.cf-private - Foundation - OpenGL - ] ++ status-go.buildInputs; - +in { shell = mkShell { - inherit buildInputs; - shellHook = baseImage.shellHook + '' + buildInputs = [ + gnupg22 baseImage qt5custom + darwin.cf-private + AppKit Cocoa Foundation OpenGL + ]; + + inputsFrom = [ + status-go baseImage + ]; + + shellHook = '' export NIX_TARGET_LDFLAGS="-F${CoreFoundation}/Library/Frameworks -framework CoreFoundation $NIX_TARGET_LDFLAGS" - export QT_PATH="${qt5.full}" - export QT_BASEBIN_PATH="${qt5.qtbase.bin}" - export PATH="${qt5.full}/bin:$PATH" + export QT_PATH="${qt5custom}" + export QT_BASEBIN_PATH="${qt5custom}/bin" + export PATH="$QT_BASEBIN_PATH/bin:$PATH" ''; }; } diff --git a/nix/desktop/windows/default.nix b/nix/desktop/windows/default.nix index 2b73f06309..d6f5e96201 100644 --- a/nix/desktop/windows/default.nix +++ b/nix/desktop/windows/default.nix @@ -1,12 +1,12 @@ -{ stdenv, mkShell, conan, nsis, go, baseImageFactory }: +{ stdenv, lib, mkShell, conan, nsis, go, baseImageFactory }: -assert stdenv.isLinux; +assert lib.assertMsg stdenv.isLinux "Building Windows app can work only on Linux!"; let baseImage = baseImageFactory "windows"; in rec { - buildInputs = stdenv.lib.optionals stdenv.isLinux [ + buildInputs = lib.optionals stdenv.isLinux [ conan nsis baseImage diff --git a/nix/lib/default.nix b/nix/lib/default.nix new file mode 100644 index 0000000000..57543587c5 --- /dev/null +++ b/nix/lib/default.nix @@ -0,0 +1,7 @@ +{ lib, config }: + +{ + getConfig = import ./getConfig.nix { inherit lib config; }; + mkFilter = import ./mkFilter.nix { inherit lib; }; + mergeSh = import ./mergeSh.nix { inherit lib; }; +} diff --git a/nix/lib/getConfig.nix b/nix/lib/getConfig.nix new file mode 100644 index 0000000000..73d6a1e5b2 --- /dev/null +++ b/nix/lib/getConfig.nix @@ -0,0 +1,12 @@ +# +# helper for getting status-im config values in a safe way +# + +{ lib, config }: + +let + inherit (lib) splitString attrByPath; +in + name: default: + let path = [ "status-im" ] ++ (splitString "." name); + in attrByPath path default config diff --git a/nix/tools/mergeSh.nix b/nix/lib/mergeSh.nix similarity index 100% rename from nix/tools/mergeSh.nix rename to nix/lib/mergeSh.nix diff --git a/nix/tools/mkFilter.nix b/nix/lib/mkFilter.nix similarity index 100% rename from nix/tools/mkFilter.nix rename to nix/lib/mkFilter.nix index 36b95de831..0097e4ddaf 100644 --- a/nix/tools/mkFilter.nix +++ b/nix/lib/mkFilter.nix @@ -1,10 +1,10 @@ -{ lib }: - # This Nix expression allows filtering a local directory by # specifying dirRootsToInclude, dirsToExclude and filesToInclude. # It also filters out symlinks to result folders created by nix-build, # as well as backup/swap/generated files. +{ lib }: + let inherit (lib) any range flatten length sublist cleanSourceFilter diff --git a/nix/tools/mkFilter_test.nix b/nix/lib/mkFilter_test.nix similarity index 100% rename from nix/tools/mkFilter_test.nix rename to nix/lib/mkFilter_test.nix diff --git a/nix/mobile/android/default.nix b/nix/mobile/android/default.nix index c0420bdcec..0f57b93bfc 100644 --- a/nix/mobile/android/default.nix +++ b/nix/mobile/android/default.nix @@ -50,9 +50,5 @@ in { "${mavenAndNpmDeps.drv}/project" ''; }) - [ status-go.shell mavenAndNpmDeps.shell androidShell ]; - - env = { - shell = androidShell; - }; + [ mavenAndNpmDeps.shell androidShell ]; } diff --git a/nix/mobile/android/targets/release-android.nix b/nix/mobile/android/targets/release-android.nix index 6c48e9a7cc..a3c945b2c2 100644 --- a/nix/mobile/android/targets/release-android.nix +++ b/nix/mobile/android/targets/release-android.nix @@ -1,5 +1,7 @@ -{ stdenv, lib, config, callPackage, bash, file, gnumake, watchmanFactory, gradle -, androidPkgs, mavenAndNpmDeps, nodejs, openjdk, jsbundle, status-go, unzip, zlib }: +{ stdenv, lib, config, callPackage, + bash, file, gnumake, watchmanFactory, gradle, + androidPkgs, mavenAndNpmDeps, + nodejs, openjdk, jsbundle, status-go, unzip, zlib }: { buildEnv ? "prod", # Value for BUILD_ENV checked by Clojure code at compile time @@ -10,26 +12,20 @@ assert (lib.stringLength watchmanSockPath) > 0 -> stdenv.isDarwin; let - inherit (lib) - toLower splitString optionalString - attrByPath hasAttrByPath optionalAttrs; - - # helper for getting config values - safeGetConfig = name: default: - let path = [ "status-im" ] ++ (splitString "." name); - in attrByPath path default config; + inherit (lib) toLower optionalString getConfig; # custom env variables derived from config env = { - ANDROID_ABI_SPLIT = safeGetConfig "android.abi-split" false; - ANDROID_ABI_INCLUDE = safeGetConfig "android.abi-include" "armeabi-v7a;arm64-v8a;x86"; - STATUS_GO_SRC_OVERRIDE = safeGetConfig "nimbus.src-override" null; + ANDROID_ABI_SPLIT = getConfig "android.abi-split" "false"; + ANDROID_ABI_INCLUDE = getConfig "android.abi-include" "armeabi-v7a;arm64-v8a;x86"; + STATUS_GO_SRC_OVERRIDE = getConfig "nimbus.src-override" null; }; - buildType = safeGetConfig "build-type" "prod"; - buildNumber = safeGetConfig "build-number" "9999"; - gradleOpts = safeGetConfig "android.gradle-opts" ""; - keystorePath = safeGetConfig "android.keystore-path" ""; + buildType = getConfig "build-type" "prod"; + buildNumber = getConfig "build-number" 9999; + gradleOpts = getConfig "android.gradle-opts" null; + keystorePath = getConfig "android.keystore-path" null; + # Keep the same keystore path for determinism keystoreLocal = "${gradleHome}/status-im.keystore"; @@ -90,7 +86,7 @@ in stdenv.mkDerivation rec { runHook postUnpack ''; - postUnpack = assert lib.assertMsg (keystorePath != "") "keystore-file has to be set!"; '' + postUnpack = assert lib.assertMsg (keystorePath != null) "keystore-file has to be set!"; '' mkdir -p ${gradleHome} # WARNING: Renaming the keystore will cause 'Keystore was tampered with' error @@ -123,14 +119,14 @@ in stdenv.mkDerivation rec { substituteInPlace $sourceRoot/android/gradlew \ --replace \ 'exec gradle' \ - "exec gradle -Dmaven.repo.local='${localMavenRepo}' --offline ${gradleOpts}" + "exec gradle -Dmaven.repo.local='${localMavenRepo}' --offline ${toString gradleOpts}" set $prevSet ''; buildPhase = let inherit (lib) stringLength optionalString substring - concatStrings concatStringsSep + toInt concatStrings concatStringsSep catAttrs mapAttrsToList makeLibraryPath; # Take the env attribute set and build a couple of scripts @@ -140,7 +136,7 @@ in stdenv.mkDerivation rec { adhocEnvVars = optionalString stdenv.isLinux "LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${makeLibraryPath [ zlib ]}"; in - assert stringLength env.ANDROID_ABI_SPLIT > 0; + assert env.ANDROID_ABI_SPLIT != null && env.ANDROID_ABI_SPLIT != ""; assert stringLength env.ANDROID_ABI_INCLUDE > 0; '' export ANDROID_SDK_ROOT="${androidPkgs}" @@ -151,16 +147,19 @@ in stdenv.mkDerivation rec { export STATUS_REACT_HOME=$PWD export HOME=$sourceRoot + # Used by the Android Gradle build script in android/build.gradle + export STATUS_GO_ANDROID_LIBDIR=${status-go} + ${exportEnvVars} ${optionalString (secretsFile != "") "source ${secretsFile}"} - ${concatStrings (catAttrs "shellHook" [ mavenAndNpmDeps.shell status-go.shell ])} + ${concatStrings (catAttrs "shellHook" [ mavenAndNpmDeps.shell ])} # fix permissions so gradle can create directories chmod -R +w $sourceRoot/android pushd $sourceRoot/android - ${adhocEnvVars} ./gradlew -PversionCode=${buildNumber} assemble${gradleBuildType} || exit + ${adhocEnvVars} ./gradlew -PversionCode=${toString buildNumber} assemble${gradleBuildType} || exit popd > /dev/null ''; doCheck = true; diff --git a/nix/mobile/default.nix b/nix/mobile/default.nix index 68c8fa1858..e5f958f28f 100644 --- a/nix/mobile/default.nix +++ b/nix/mobile/default.nix @@ -12,17 +12,17 @@ let android = callPackage ./android { inherit localMavenRepoBuilder projectNodePackage; - status-go = status-go.android; + status-go = status-go.mobile.android; }; ios = callPackage ./ios { inherit xcodeWrapper projectNodePackage fastlane; - status-go = status-go.ios; + status-go = status-go.mobile.ios; }; selectedSources = [ - status-go.android - status-go.ios + status-go.mobile.android + status-go.mobile.ios fastlane android ios diff --git a/nix/mobile/ios/default.nix b/nix/mobile/ios/default.nix index b4da58e693..bc8d45a825 100644 --- a/nix/mobile/ios/default.nix +++ b/nix/mobile/ios/default.nix @@ -33,7 +33,7 @@ let }; in { - inherit buildInputs pod-shell; + inherit buildInputs pod-shell status-go-shell; shell = lib.mergeSh localShell [ fastlane.shell status-go-shell pod-shell diff --git a/nix/mobile/ios/status-go-shell.nix b/nix/mobile/ios/status-go-shell.nix index 5cf5f5e0c6..4b4691b62d 100644 --- a/nix/mobile/ios/status-go-shell.nix +++ b/nix/mobile/ios/status-go-shell.nix @@ -1,31 +1,30 @@ +# +# This prepares status-go build file called Statusgo.framework for XCode. +# It copies the status-go build result to 'modules/react-native-status/ios/RCTStatus'. +# + { lib, mkShell, status-go }: -let - shell = mkShell { - shellHook = '' - if [ -z "$STATUS_GO_IOS_LIBDIR" ]; then - echo "STATUS_GO_IOS_LIBDIR is not defined! Aborting." - exit 1 - fi +mkShell { + shellHook = '' + export STATUS_GO_IOS_LIBDIR=${status-go}/Statusgo.framework - RCTSTATUS_DIR="$STATUS_REACT_HOME/modules/react-native-status/ios/RCTStatus" - targetBasename='Statusgo.framework' + RCTSTATUS_DIR="$STATUS_REACT_HOME/modules/react-native-status/ios/RCTStatus" + targetBasename='Statusgo.framework' - # Compare target folder with source to see if copying is required - if [ -d "$RCTSTATUS_DIR/$targetBasename" ] && [ -d $STATUS_REACT_HOME/ios/Pods/ ] && \ - diff -q --no-dereference --recursive $RCTSTATUS_DIR/$targetBasename/ $STATUS_GO_IOS_LIBDIR/ > /dev/null; then - echo "$RCTSTATUS_DIR/$targetBasename already in place" - else - sourceBasename="$(basename $STATUS_GO_IOS_LIBDIR)" - echo "Copying $sourceBasename from Nix store to $RCTSTATUS_DIR" - rm -rf "$RCTSTATUS_DIR/$targetBasename/" - cp -a $STATUS_GO_IOS_LIBDIR $RCTSTATUS_DIR - chmod -R 755 "$RCTSTATUS_DIR/$targetBasename" - if [ "$sourceBasename" != "$targetBasename" ]; then - mv "$RCTSTATUS_DIR/$sourceBasename" "$RCTSTATUS_DIR/$targetBasename" - fi + # Compare target folder with source to see if copying is required + if [ -d "$RCTSTATUS_DIR/$targetBasename" ] && [ -d $STATUS_REACT_HOME/ios/Pods/ ] && \ + diff -qr --no-dereference $RCTSTATUS_DIR/$targetBasename/ $STATUS_GO_IOS_LIBDIR/ > /dev/null; then + echo "$RCTSTATUS_DIR/$targetBasename already in place" + else + sourceBasename="$(basename $STATUS_GO_IOS_LIBDIR)" + echo "Copying $sourceBasename from Nix store to $RCTSTATUS_DIR" + rm -rf "$RCTSTATUS_DIR/$targetBasename/" + cp -a $STATUS_GO_IOS_LIBDIR $RCTSTATUS_DIR + chmod -R 755 "$RCTSTATUS_DIR/$targetBasename" + if [ "$sourceBasename" != "$targetBasename" ]; then + mv "$RCTSTATUS_DIR/$sourceBasename" "$RCTSTATUS_DIR/$targetBasename" fi - ''; - }; -in - lib.mergeSh status-go.shell [ shell ] + fi + ''; +} diff --git a/nix/overlay.nix b/nix/overlay.nix index c26c6497db..da6cec3ab9 100644 --- a/nix/overlay.nix +++ b/nix/overlay.nix @@ -1,4 +1,3 @@ -# # Override some packages and utilities in 'pkgs' # and make them available globally via callPackage. # @@ -9,18 +8,17 @@ self: super: -let - inherit (super) stdenv stdenvNoCC callPackage; +let inherit (super) stdenv stdenvNoCC callPackage; in { # Fix for MacOS mkShell = super.mkShell.override { stdenv = stdenvNoCC; }; # Various utilities utils = callPackage ./tools/utils.nix { }; - lib = (super.lib or {}) // { - mkFilter = callPackage ./tools/mkFilter.nix { }; - mergeSh = callPackage ./tools/mergeSh.nix { }; - }; + lib = (super.lib or { }) // (import ./lib { + inherit (super) lib; + inherit (self) config; + }); # Android environement androidEnvCustom = callPackage ./mobile/android/sdk { }; @@ -34,4 +32,8 @@ in { # Custom packages gomobile = callPackage ./pkgs/gomobile { }; + qt5custom = callPackage ./pkgs/qt5custom { }; + qtkeychain-src = callPackage ./pkgs/qtkeychain-src { }; + appimagekit = callPackage ./pkgs/appimagekit { }; + linuxdeployqt = callPackage ./pkgs/linuxdeployqt { inherit (self) appimagekit; }; } diff --git a/nix/desktop/linux/appimagekit/default.nix b/nix/pkgs/appimagekit/default.nix similarity index 100% rename from nix/desktop/linux/appimagekit/default.nix rename to nix/pkgs/appimagekit/default.nix diff --git a/nix/desktop/linux/appimagekit/nix.patch b/nix/pkgs/appimagekit/nix.patch similarity index 100% rename from nix/desktop/linux/appimagekit/nix.patch rename to nix/pkgs/appimagekit/nix.patch diff --git a/nix/desktop/linux/linuxdeployqt/default.nix b/nix/pkgs/linuxdeployqt/default.nix similarity index 100% rename from nix/desktop/linux/linuxdeployqt/default.nix rename to nix/pkgs/linuxdeployqt/default.nix diff --git a/nix/desktop/linux/linuxdeployqt/linuxdeployqt.patch b/nix/pkgs/linuxdeployqt/linuxdeployqt.patch similarity index 100% rename from nix/desktop/linux/linuxdeployqt/linuxdeployqt.patch rename to nix/pkgs/linuxdeployqt/linuxdeployqt.patch diff --git a/nix/pkgs/qt5custom/default.nix b/nix/pkgs/qt5custom/default.nix new file mode 100644 index 0000000000..ccf711329a --- /dev/null +++ b/nix/pkgs/qt5custom/default.nix @@ -0,0 +1,11 @@ +{ qt5 }: + +# Custom collection of QT libraries for Status desktop App +qt5.env "qt-status-${qt5.qtbase.version}" (with qt5; [ + qtbase + qtsvg + qtwebengine + qtwebview + qtdeclarative + qtquickcontrols2 +]) diff --git a/nix/pkgs/qtkeychain-src/default.nix b/nix/pkgs/qtkeychain-src/default.nix new file mode 100644 index 0000000000..1ef48b7fcb --- /dev/null +++ b/nix/pkgs/qtkeychain-src/default.nix @@ -0,0 +1,40 @@ +{ pkgs, stdenv, fetchFromGitHub }: + +let + version = "0.8.90"; + # This revision will get used in: + # https://github.com/status-im/react-native-keychain/blob/master/desktop/CMakeLists.txt#L45 + rev = "d3c606c55adf8c2c2747556055652b3469f6c4c2"; + sha256 = "1gqw3g0j46aswncm8fgy419lp1fp2y2nild82hs18xra5albvf3i"; + +in stdenv.mkDerivation { + name = "qtkeychain-patched-source"; + version = "${version}-${stdenv.lib.strings.substring 0 7 rev}"; + + src = fetchFromGitHub { + inherit rev sha256; + owner = "status-im"; + repo = "qtkeychain"; + name = "qtkeychain-source-${version}"; + }; + + phases = [ "unpackPhase" ]; + unpackPhase = '' + mkdir -p $out/src + cp -r $src/* $out/src/ + substituteInPlace $out/src/CMakeLists.txt \ + --replace "cmake_minimum_required(VERSION 2.8.11)" "cmake_minimum_required(VERSION 3.12.1)" \ + --replace "project(qtkeychain)" "project(qtkeychain VERSION ${version})" \ + --replace "set(QTKEYCHAIN_VERSION 0.8.90)" "set(QTKEYCHAIN_VERSION ${version})" \ + --replace "{QTKEYCHAIN_VERSION}\" VARIABLE_PREFIX SNORE" "QTKEYCHAIN_VERSION VARIABLE_PREFIX SNORE" \ + --replace "\"\$QTKEYCHAIN_VERSION" qtkeychain + ''; + + meta = with stdenv.lib; { + description = "Patched sources for qtkeychain, a platform-independent Qt API for storing passwords securely"; + homepage = https://github.com/status-im/qtkeychain; + license = licenses.bsd3; + maintainers = [ maintainers.pombeirp ]; + platforms = with platforms; darwin ++ linux; + }; +} diff --git a/nix/scripts/build.sh b/nix/scripts/build.sh index 4fbc96e491..4ea46c48b1 100755 --- a/nix/scripts/build.sh +++ b/nix/scripts/build.sh @@ -23,7 +23,8 @@ function cleanup() { fi } -if [[ -z "${_NIX_NO_CLEAN}" ]]; then +# If you want to clean after every build set _NIX_CLEAN=true +if [[ -n "${_NIX_CLEAN}" ]]; then trap cleanup EXIT ERR INT QUIT fi @@ -31,9 +32,8 @@ fi function extractResults() { local nixResultPath="$1" mkdir -p "${resultPath}" - cp -vfr ${nixResultPath}/* "${resultPath}" + cp -vfr ${nixResultPath}/* "${resultPath}" | sed 's#'${PWD}'#.#' chmod -R u+w "${resultPath}" - ls -l "${resultPath}" } targetAttr="${1}" @@ -58,7 +58,8 @@ nixOpts=( echo "Running: nix-build "${nixOpts[@]}" "${@}" default.nix" nixResultPath=$(nix-build "${nixOpts[@]}" "${@}" default.nix) -echo "Extracting result: ${nixResultPath}" +echo -e "\n${YLW}Extracting result${RST}: ${BLD}${nixResultPath}${RST}" + extractResults "${nixResultPath}" -echo -e "${GRN}SUCCESS${RST}" +echo -e "\n${GRN}SUCCESS${RST}" diff --git a/nix/scripts/shell.sh b/nix/scripts/shell.sh index 45ece7e3ce..ec2f79e3eb 100755 --- a/nix/scripts/shell.sh +++ b/nix/scripts/shell.sh @@ -26,12 +26,12 @@ fi entryPoint="default.nix" nixArgs+=("--attr shells.${TARGET}") - if [[ "$TARGET" =~ (linux|windows|darwin|macos) ]]; then # This is a dirty workaround because 'yarn install' is an impure operation, # so we need to call it from an impure shell. # Hopefully we'll be able to fix this later on with something like yarn2nix - nix-shell ${nixArgs[@]} --run "scripts/prepare-for-desktop-platform.sh" || exit + # TODO: Manage node dependencies for desktop with yarn2nix + nix-shell ${nixArgs[@]} --run "scripts/prepare-for-desktop-platform.sh" default.nix || exit fi config='' diff --git a/nix/shells.nix b/nix/shells.nix index 707ce48e96..0972e3836c 100644 --- a/nix/shells.nix +++ b/nix/shells.nix @@ -65,19 +65,20 @@ let buildInputs = [ pkgs.openjdk8 ]; }; - # for targets that need 'adb' - android-env = targets.mobile.android.env.shell; + # for targets that need 'adb' and other SDK/NDK tools + android-env = pkgs.androidShell; # helpers for use with target argument + ios = targets.mobile.ios.shell; + android = targets.mobile.android.shell; + desktop = targets.desktop.shell; linux = targets.desktop.linux.shell; macos = targets.desktop.macos.shell; - windows = targets.desktop.windows.shell; - android = targets.mobile.android.shell; - ios = targets.mobile.ios.shell; + windows = targets.desktop.macos.shell; }; # for merging the default shell with others - mergeDefaultShell = (name: value: lib.mergeSh default [ value ]); + mergeDefaultShell = (key: val: lib.mergeSh default [ val ]); # values here can be selected using `nix-shell --attr shells.$TARGET default.nix` # the nix/scripts/shell.sh wrapper does this for us and expects TARGET to be set diff --git a/nix/status-go/build.nix b/nix/status-go/build.nix deleted file mode 100644 index 3390707e82..0000000000 --- a/nix/status-go/build.nix +++ /dev/null @@ -1,76 +0,0 @@ -{ buildGoPackage, go, xcodeWrapper, stdenv, utils }: - -{ owner, repo, rev, cleanVersion, goPackagePath, src, host, - nativeBuildInputs ? [], - buildInputs ? [], - buildPhase, buildMessage, - installPhase ? "", - postInstall ? "", - preFixup ? "", - outputs, meta } @ args': - -with stdenv; - -let - inherit (stdenv.lib) strings; - - removeReferences = [ go ]; - removeExpr = refs: ''remove-references-to ${lib.concatMapStrings (ref: " -t ${ref}") refs}''; - - args = removeAttrs args' [ "buildMessage" ]; # Remove our arguments from args before passing them on to buildGoPackage - buildStatusGo = buildGoPackage (args // { - pname = repo; - version = "${cleanVersion}-${strings.substring 0 7 rev}-${host}"; - - nativeBuildInputs = - nativeBuildInputs ++ - lib.optional isDarwin xcodeWrapper; - inherit buildInputs; - - # Fixes Cgo related build failures (see https://github.com/NixOS/nixpkgs/issues/25959 ) - hardeningDisable = [ "fortify" ]; - - # Ensure XCode is present, instead of failing at the end of the build - preConfigure = lib.optionalString isDarwin utils.enforceXCodeAvailable; - - buildPhase = '' - runHook preBuild - - runHook renameImports - - echo - echo "${buildMessage}" - echo - ${buildPhase} - - runHook postBuild - ''; - - installPhase = '' - runHook preInstall - - ${installPhase} - - runHook postInstall - ''; - - # replace hardcoded paths to go package in /nix/store, otherwise Nix will fail the build - preFixup = preFixup + '' - find $out -type f -exec ${removeExpr removeReferences} '{}' + || true - return # make sure we stop fixup so as to not allow the host preFixup script to proceed - ''; - - passthru = { inherit owner repo version rev; }; - - meta = { - # Add default meta information - inherit (meta) platforms; - description = meta.description or "The Status module that consumes go-ethereum."; - license = lib.licenses.mpl20; - } // meta // { - # add an extra maintainer to every package - maintainers = (meta.maintainers or [ ]) ++ [ lib.maintainers.pombeirp ]; - }; - }); - -in buildStatusGo diff --git a/nix/status-go/default.nix b/nix/status-go/default.nix index ceb5377b9d..52298d256f 100644 --- a/nix/status-go/default.nix +++ b/nix/status-go/default.nix @@ -1,128 +1,26 @@ -{ config, lib, utils, stdenv, callPackage, mkShell, - fetchFromGitHub, openjdk, androidPkgs }: +{ lib, callPackage, mkShell, openjdk, androidPkgs }: let - inherit (stdenv.lib) - catAttrs concatStrings concatStringsSep fileContents importJSON makeBinPath - optional optionalString strings attrValues mapAttrs attrByPath - traceValFn; + inherit (lib) + catAttrs concatStrings concatStringsSep fileContents makeBinPath + getConfig optional attrValues mapAttrs attrByPath; - envFlags = callPackage ../tools/envParser.nix { }; - enableNimbus = (attrByPath ["STATUS_GO_ENABLE_NIMBUS"] "0" envFlags) != "0"; - - nimbus = - if enableNimbus then callPackage ./nimbus { } - else { wrappers-android = { }; }; - - buildStatusGoDesktopLib = callPackage ./desktop { }; - buildStatusGoMobileLib = callPackage ./mobile { }; - - srcData = - # If config.status-im.status-go.src-override is defined, instruct Nix to use that path to build status-go - if (attrByPath ["status-im" "status-go" "src-override"] "" config) != "" then rec { - owner = "status-im"; - repo = "status-go"; - rev = "unknown"; - shortRev = "unknown"; - rawVersion = "develop"; - cleanVersion = rawVersion; - goPackagePath = "github.com/${owner}/${repo}"; - src = - let path = traceValFn (path: "Using local ${repo} sources from ${path}\n") config.status-im.status-go.src-override; - in builtins.path { # We use builtins.path so that we can name the resulting derivation, otherwise the name would be taken from the checkout directory, which is outside of our control - inherit path; - name = "${repo}-source-${shortRev}"; - filter = - # Keep this filter as restrictive as possible in order to avoid unnecessary rebuilds and limit closure size - lib.mkFilter { - root = path; - include = [ ".*" ]; - exclude = [ - ".*/[.]git.*" ".*[.]md" ".*[.]yml" - ".*/.*_test.go$" "_assets/.*" "build/.*" - ".*/.*LICENSE.*" ".*/CONTRIB.*" ".*/AUTHOR.*" - ]; - }; - }; - } else - # Otherwise grab it from the location defined by status-go-version.json - let - versionJSON = importJSON ../../status-go-version.json; # TODO: Simplify this path search with lib.locateDominatingFile - sha256 = versionJSON.src-sha256; - in rec { - inherit (versionJSON) owner repo version; - rev = versionJSON.commit-sha1; - shortRev = strings.substring 0 7 rev; - rawVersion = versionJSON.version; - cleanVersion = utils.sanitizeVersion versionJSON.version; - goPackagePath = "github.com/${owner}/${repo}"; - src = fetchFromGitHub { inherit rev owner repo sha256; name = "${repo}-${srcData.shortRev}-source"; }; - }; - - mobileConfigs = { - android = rec { - name = "android"; - envVars = [ - "ANDROID_HOME=${androidPkgs}" - "ANDROID_NDK_HOME=${androidPkgs}/ndk-bundle" - "PATH=${makeBinPath [ openjdk ]}:$PATH" - ]; - gomobileExtraFlags = [ "-androidapi 23" ]; - outputFileName = "status-go-${srcData.shortRev}.aar"; - platforms = { - arm64 = { - linkNimbus = enableNimbus; - nimbus = assert enableNimbus; nimbus.wrappers-android.arm64; - gomobileTarget = "${name}/arm64"; - outputFileName = "status-go-${srcData.shortRev}-arm64.aar"; - }; - arm = { - linkNimbus = enableNimbus; - nimbus = assert enableNimbus; nimbus.wrappers-android.arm; - gomobileTarget = "${name}/arm"; - outputFileName = "status-go-${srcData.shortRev}-arm.aar"; - }; - x86 = { - linkNimbus = enableNimbus; - nimbus = assert enableNimbus; nimbus.wrappers-android.x86; - gomobileTarget = "${name}/386"; - outputFileName = "status-go-${srcData.shortRev}-386.aar"; - }; - }; - }; - ios = rec { - name = "ios"; - envVars = []; - gomobileExtraFlags = [ "-iosversion=8.0" ]; - outputFileName = "Statusgo.framework"; - platforms = { - ios = { - linkNimbus = enableNimbus; - nimbus = assert false; null; # TODO: Currently we don't support Nimbus on iOS - gomobileTarget = name; - inherit outputFileName; - }; - }; - }; + # Metadata common to all builds of status-go + meta = { + description = "The Status Go module that consumes go-ethereum."; + license = lib.licenses.mpl20; + platforms = with lib.platforms; linux ++ darwin; }; - hostConfigs = { - darwin = { - name = "macos"; - allTargets = [ status-go-packages.desktop status-go-packages.ios status-go-packages.android ]; - }; - linux = { - name = "linux"; - allTargets = [ status-go-packages.desktop status-go-packages.android ]; - }; - }; - currentHostConfig = if stdenv.isDarwin then hostConfigs.darwin else hostConfigs.linux; - goBuildFlags = concatStringsSep " " [ "-v" (optionalString enableNimbus "-tags='nimbus'") ]; - # status-go params to be set at build time, important for About section and metrics + # Source can be changed with a local override from config + source = callPackage ./source.nix { }; + + # Params to be set at build time, important for About section and metrics goBuildParams = { - GitCommit = srcData.rev; - Version = srcData.cleanVersion; + GitCommit = source.rev; + Version = source.cleanVersion; }; + # These are necessary for status-go to show correct version paramsLdFlags = attrValues (mapAttrs (name: value: "-X github.com/status-im/status-go/params.${name}=${value}" @@ -133,61 +31,14 @@ let "-w" # -w disables DWARF debugging information ]; - statusGoArgs = { inherit (srcData) src owner repo rev cleanVersion goPackagePath; inherit goBuildFlags goBuildLdFlags; }; - status-go-packages = { - desktop = buildStatusGoDesktopLib (statusGoArgs // { - outputFileName = "libstatus.a"; - hostSystem = stdenv.hostPlatform.system; - host = currentHostConfig.name; - }); + goBuildFlags = [ "-v" ]; - android = buildStatusGoMobileLib (statusGoArgs // { - host = mobileConfigs.android.name; - targetConfig = mobileConfigs.android; - }); - - ios = buildStatusGoMobileLib (statusGoArgs // { - host = mobileConfigs.ios.name; - targetConfig = mobileConfigs.ios; - }); +in rec { + mobile = callPackage ./mobile { + inherit meta source goBuildFlags goBuildLdFlags; }; - android = rec { - buildInputs = [ status-go-packages.android ]; - shell = mkShell { - inherit buildInputs; - shellHook = '' - # These variables are used by the Status Android Gradle build script in android/build.gradle - export STATUS_GO_ANDROID_LIBDIR=${status-go-packages.android}/lib - ''; - }; + desktop = callPackage ./desktop { + inherit meta source goBuildFlags goBuildLdFlags; }; - ios = rec { - buildInputs = [ status-go-packages.ios ]; - shell = mkShell { - inherit buildInputs; - shellHook = '' - # These variables are used by the iOS build preparation section in nix/mobile/ios/default.nix - export STATUS_GO_IOS_LIBDIR=${status-go-packages.ios}/lib/Statusgo.framework - ''; - }; - }; - desktop = rec { - buildInputs = [ status-go-packages.desktop ]; - shell = mkShell { - inherit buildInputs; - shellHook = '' - # These variables are used by the Status Desktop CMake build script in modules/react-native-status/desktop/CMakeLists.txt - export STATUS_GO_DESKTOP_INCLUDEDIR=${status-go-packages.desktop}/include - export STATUS_GO_DESKTOP_LIBDIR=${status-go-packages.desktop}/lib - ''; - }; - }; - platforms = [ android ios desktop ]; - -in { - shell = lib.mergeSh mkShell {} (catAttrs "shell" platforms); - - # CHILD DERIVATIONS - inherit android ios desktop; } diff --git a/nix/status-go/desktop/default.nix b/nix/status-go/desktop/default.nix index 3a6ffa8e52..d9b6955e25 100644 --- a/nix/status-go/desktop/default.nix +++ b/nix/status-go/desktop/default.nix @@ -1,50 +1,60 @@ -{ stdenv, utils, callPackage, buildGoPackage, go, xcodeWrapper }: - -{ owner, repo, rev, cleanVersion, goPackagePath, src, host, - # desktop-only arguments - goBuildFlags, goBuildLdFlags, - outputFileName, - hostSystem } @ args': +{ lib, stdenv, utils, go, buildGoPackage +# object with source attributes +, meta , source +, goBuildFlags +, goBuildLdFlags +, outputFileName ? "libstatus.a" }: let - buildStatusGo = callPackage ../build.nix { - inherit buildGoPackage go xcodeWrapper utils; - }; + inherit (lib) concatStringsSep optionalString concatMapStrings; - # Remove desktop-only arguments from args - args = removeAttrs args' [ - "goBuildFlags" "goBuildLdFlags" "outputFileName" "hostSystem" - ]; + removeReferences = [ go ]; + removeExpr = refs: ''remove-references-to ${concatMapStrings (ref: " -t ${ref}") refs}''; - buildStatusGoDesktopLib = buildStatusGo (args // { - buildMessage = "Building desktop library"; - #GOOS=windows GOARCH=amd64 CGO_ENABLED=1 go build ${goBuildFlags} -buildmode=c-archive -o $out/${outputFileName} ./lib - buildPhase = - let - CGO_LDFLAGS = stdenv.lib.concatStringsSep " " goBuildLdFlags; - in '' - pushd "$NIX_BUILD_TOP/go/src/${goPackagePath}" >/dev/null + hostSystem = stdenv.hostPlatform.system; - export GO111MODULE=off +in buildGoPackage { + pname = source.repo; + version = "${source.cleanVersion}-${source.shortRev}"; - go build -o $out/${outputFileName} \ - ${goBuildFlags} \ - -buildmode=c-archive \ - -ldflags='${CGO_LDFLAGS}' \ - ./lib + inherit meta; + inherit (source) src goPackagePath; - popd >/dev/null - ''; + # Fixes Cgo related build failures (see https://github.com/NixOS/nixpkgs/issues/25959 ) + hardeningDisable = [ "fortify" ]; - installPhase = '' - mkdir -p $out/lib/${hostSystem} $out/include - mv $out/${outputFileName} $out/lib/${hostSystem} - mv $out/libstatus.h $out/include - ''; + # Ensure XCode is present, instead of failing at the end of the build + preConfigure = optionalString stdenv.isDarwin utils.enforceXCodeAvailable; - outputs = [ "out" ]; + buildMessage = "Building desktop library"; - meta = { platforms = with stdenv.lib.platforms; linux ++ darwin; }; - }); + #GOOS=windows GOARCH=amd64 CGO_ENABLED=1 go build ${goBuildFlags} -buildmode=c-archive -o $out/${outputFileName} ./lib + buildPhase = let + CGO_LDFLAGS = concatStringsSep " " goBuildLdFlags; + in '' + pushd "$NIX_BUILD_TOP/go/src/${source.goPackagePath}" >/dev/null -in buildStatusGoDesktopLib + export GO111MODULE=off + + go build -o $out/${outputFileName} \ + ${concatStringsSep " " goBuildFlags} \ + -buildmode=c-archive \ + -ldflags='${CGO_LDFLAGS}' \ + ./lib + + popd >/dev/null + ''; + + # replace hardcoded paths to go package in /nix/store, otherwise Nix will fail the build + fixupPhase = '' + find $out -type f -exec ${removeExpr removeReferences} '{}' + || true + ''; + + installPhase = '' + mkdir -p $out/lib/${hostSystem} $out/include + mv $out/${outputFileName} $out/lib/${hostSystem} + mv $out/libstatus.h $out/include + ''; + + outputs = [ "out" ]; +} diff --git a/nix/status-go/desktop/shell.nix b/nix/status-go/desktop/shell.nix new file mode 100644 index 0000000000..e0fb972019 --- /dev/null +++ b/nix/status-go/desktop/shell.nix @@ -0,0 +1,15 @@ +# +# This is currently unused but is a reminder of how we used to build desktop app +# + +{ mkShell, status-go-desktop }: + +mkShell { + buildInputs = [ status-go-desktop ]; + # These variables are used by the Status Desktop CMake build script in: + # - modules/react-native-status/desktop/CMakeLists.txt + shellHook = '' + export STATUS_GO_DESKTOP_INCLUDEDIR=${status-go-desktop}/include + export STATUS_GO_DESKTOP_LIBDIR=${status-go-desktop}/lib + ''; +} diff --git a/nix/status-go/mobile/build.nix b/nix/status-go/mobile/build.nix new file mode 100644 index 0000000000..81b4fa0a2b --- /dev/null +++ b/nix/status-go/mobile/build.nix @@ -0,0 +1,91 @@ +{ lib, stdenv, utils, callPackage, buildGoPackage +, go, androidPkgs, openjdk, gomobile, xcodeWrapper +# object with source attributes +, meta, source +, platform ? "android" +, architectures ? [ "arm64" "arm" "x86" ] +, goBuildFlags ? [ ] +, goBuildLdFlags ? [ ] +, outputFileName ? "status-go-${source.shortRev}-${platform}.aar" }: + +let + inherit (lib) + concatStrings concatStringsSep concatMapStrings optionalString + getAttr attrValues makeBinPath optional; + + removeReferences = [ go ]; + removeExpr = refs: ''remove-references-to ${concatMapStrings (ref: " -t ${ref}") refs}''; + + # formatted for use with -target + targetArchs = map (a: "${platform}/${a}") architectures; + +in buildGoPackage { + pname = source.repo; + version = "${source.cleanVersion}-${source.shortRev}-${platform}"; + + inherit meta; + inherit (source) src goPackagePath; + + nativeBuildInputs = [ gomobile ] + ++ optional (platform == "android") openjdk + ++ optional stdenv.isDarwin xcodeWrapper; + + # Fixes Cgo related build failures (see https://github.com/NixOS/nixpkgs/issues/25959 ) + hardeningDisable = [ "fortify" ]; + + # Ensure XCode is present, instead of failing at the end of the build + preConfigure = optionalString stdenv.isDarwin utils.enforceXCodeAvailable; + + # Build mobile libraries + preBuild = let + NIX_GOWORKDIR = "$NIX_BUILD_TOP/go-build"; + in '' + + mkdir ${NIX_GOWORKDIR} + + export GO111MODULE=off + export GOPATH=${gomobile.dev}:$GOPATH + export NIX_GOWORKDIR=${NIX_GOWORKDIR} + + '' + optionalString (platform == "android") '' + export ANDROID_HOME=${androidPkgs} + export ANDROID_NDK_HOME=${androidPkgs}/ndk-bundle + export PATH="${makeBinPath [ openjdk ]}:$PATH" + ''; + + # Build the Go library using gomobile for each of the configured platforms + buildPhase = let + ldFlags = [ "-extldflags=-Wl,--allow-multiple-definition" ] ++ goBuildLdFlags; + CGO_LDFLAGS = concatStringsSep " " ldFlags; + in '' + runHook preBuild + runHook renameImports + + echo -e "\nBuilding for targets: ${concatStringsSep "," targetArchs}\n" + + ${gomobile}/bin/gomobile bind \ + -target=${concatStringsSep "," targetArchs} \ + -ldflags="${CGO_LDFLAGS}" \ + ${optionalString (platform == "android") "-androidapi 23"} \ + ${optionalString (platform == "ios") "-iosversion=8.0"} \ + ${concatStringsSep " " goBuildFlags} \ + -o ${outputFileName} \ + ${source.goPackagePath}/mobile + + rm -rf $NIX_GOWORKDIR + + runHook postBuild + ''; + + # replace hardcoded paths to go package in /nix/store, otherwise Nix will fail the build + fixupPhase = '' + find $out -type f -exec ${removeExpr removeReferences} '{}' + || true + ''; + + installPhase = '' + mkdir -p $out + mv ${outputFileName} $out/ + ''; + + outputs = [ "out" ]; +} diff --git a/nix/status-go/mobile/default.nix b/nix/status-go/mobile/default.nix index 1f2fb9f363..6c2f89427d 100644 --- a/nix/status-go/mobile/default.nix +++ b/nix/status-go/mobile/default.nix @@ -1,102 +1,20 @@ -{ stdenv, utils, callPackage, - buildGoPackage, go, gomobile, androidPkgs, - openjdk, unzip, zip, xcodeWrapper }: +{ callPackage +, meta, source +, goBuildFlags +, goBuildLdFlags }: -{ owner, repo, rev, cleanVersion, goPackagePath, src, host, - - # mobile-only arguments - goBuildFlags, goBuildLdFlags, - targetConfig } @ args': - -let - inherit (stdenv.lib) concatStringsSep makeBinPath optional optionals; - - buildStatusGo = callPackage ../build.nix { - inherit buildGoPackage go xcodeWrapper utils; +{ + android = callPackage ./build.nix { + platform = "android"; + architectures = [ "arm" "arm64" "386" ]; + outputFileName = "status-go-${source.shortRev}.aar"; + inherit meta source goBuildFlags goBuildLdFlags; }; - # Remove mobile-only arguments from args - args = removeAttrs args' [ - "targetConfig" "goBuildFlags" "goBuildLdFlags" - ]; - - buildStatusGoMobileLib = - let - inherit (stdenv.lib) concatStrings mapAttrsToList optionalString; - in buildStatusGo (args // { - nativeBuildInputs = [ gomobile unzip zip ] ++ optional (targetConfig.name == "android") openjdk; - - buildMessage = "Building mobile library for ${targetConfig.name}"; - # Build mobile libraries - buildPhase = - let - NIX_GOWORKDIR = "$NIX_BUILD_TOP/go-build"; - CGO_LDFLAGS = concatStringsSep " " (goBuildLdFlags ++ [ "-extldflags=-Wl,--allow-multiple-definition" ]); - nimbusBridgeVendorDir = "$NIX_BUILD_TOP/go/src/${goPackagePath}/vendor/${goPackagePath}/eth-node/bridge/nimbus"; - in '' - mkdir ${NIX_GOWORKDIR} - - export GO111MODULE=off - export GOPATH=${gomobile.dev}:$GOPATH - export PATH=${makeBinPath [ gomobile.bin ]}:$PATH - export NIX_GOWORKDIR=${NIX_GOWORKDIR} - export ${concatStringsSep " " targetConfig.envVars} - - # Build the Go library using gomobile for each of the configured platforms - ${concatStrings (mapAttrsToList (_: platformConfig: '' - - ${optionalString platformConfig.linkNimbus '' - # Copy the Nimbus API artifacts to the expected vendor location - cp ${platformConfig.nimbus}/{include/*,lib/libnimbus.a} ${nimbusBridgeVendorDir} - chmod +w ${nimbusBridgeVendorDir}/libnimbus.{a,h} - ''} - - echo - echo "Building for target ${platformConfig.gomobileTarget}" - gomobile bind \ - -target=${platformConfig.gomobileTarget} \ - -ldflags="${CGO_LDFLAGS}" \ - ${concatStringsSep " " targetConfig.gomobileExtraFlags} \ - ${goBuildFlags} \ - -o ${platformConfig.outputFileName} \ - ${goPackagePath}/mobile - - ${optionalString platformConfig.linkNimbus '' - rm ${nimbusBridgeVendorDir}/libnimbus.{a,h} - ''} - '') targetConfig.platforms) - } - - if [ "${targetConfig.name}" = 'android' ]; then - # Merge the platform-specific .aar files into a single one - local mergeDir='.aar' - mkdir $mergeDir - ${concatStrings (mapAttrsToList (_: platformConfig: '' - unzip -d $mergeDir -q -n -u ${platformConfig.outputFileName} - rm ${platformConfig.outputFileName} - '') targetConfig.platforms)} - pushd $mergeDir > /dev/null - zip -r -o ../${targetConfig.outputFileName} * - popd > /dev/null - rm -rf $mergeDir - unzip -l ${targetConfig.outputFileName} - fi - - # TODO: Merge iOS packages when linking with libnimbus.a - - rm -rf ${NIX_GOWORKDIR} - ''; - - installPhase = '' - mkdir -p $out/lib - mv ${targetConfig.outputFileName} $out/lib/ - ''; - - outputs = [ "out" ]; - - meta = { - platforms = with stdenv.lib.platforms; linux ++ darwin; - }; - }); - -in buildStatusGoMobileLib + ios = callPackage ./build.nix { + platform = "ios"; + architectures = [ "arm" "arm64" "386" ]; + outputFileName = "Statusgo.framework"; + inherit meta source goBuildFlags goBuildLdFlags; + }; +} diff --git a/nix/status-go/nimbus/default.nix b/nix/status-go/nimbus/default.nix index da3be6a545..99615aeb7f 100644 --- a/nix/status-go/nimbus/default.nix +++ b/nix/status-go/nimbus/default.nix @@ -1,34 +1,47 @@ -{ config, stdenv, callPackage, fetchFromGitHub, mkFilter }: +# +# This fetches nimbus source from local folder or GitHub and +# loads the derivation defined in the `nix/default.nix` in the repo. +# + +{ config, lib, stdenv, callPackage, fetchFromGitHub }: let - inherit (stdenv.lib) attrByPath strings traceValFn; + inherit (lib) getConfig attrByPath strings traceValFn; repo = "nimbus"; - localPath = attrByPath ["status-im" "nimbus" "src-override"] "" config; - localSrc = builtins.path rec { # We use builtins.path so that we can name the resulting derivation, otherwise the name would be taken from the checkout directory, which is outside of our control - path = traceValFn (path: "Using local ${repo} sources from ${path}\n") localPath; - name = "${repo}-source-local"; - filter = - # Keep this filter as restrictive as possible in order to avoid unnecessary rebuilds and limit closure size - mkFilter { - root = path; - include = [ - "nix.*" "wrappers.*" "vendor.*" - "Makefile" "nim.cfg" "nimbus.nimble" "default.nix" - ]; - }; + localPath = getConfig "nimbus.src-override" ""; + localSrc = + # We use builtins.path so that we can name the resulting derivation. + # Name would be taken from the checkout directory, and wouldn't be deterministic. + builtins.path rec { + path = traceValFn (path: '' + Using local ${repo} sources from ${path} + '') localPath; + name = "${repo}-source-local"; + filter = + # Keep this filter as restrictive as possible in order to + # avoid unnecessary rebuilds and limit closure size + lib.mkFilter { + root = path; + include = [ + "nix.*" "wrappers.*" "vendor.*" + "Makefile" "nim.cfg" "nimbus.nimble" "default.nix" + ]; + }; + }; + + ghSrc = fetchFromGitHub rec { + inherit repo; + name = "${repo}-source-${strings.substring 0 7 rev}"; + rev = "73278f20d0bf27fb7c6c331b515abb765814f1cc"; + owner = "status-im"; + sha256 = "0myq234zqnpmqsc2452xygnyc6sjs8x1blyrpa4bi9v2cwbyap5c"; + fetchSubmodules = true; }; - src = if localPath != "" then localSrc - else fetchFromGitHub rec { - inherit repo; - name = "${repo}-source-${strings.substring 0 7 rev}"; - rev = "73278f20d0bf27fb7c6c331b515abb765814f1cc"; - owner = "status-im"; - sha256 = "0myq234zqnpmqsc2452xygnyc6sjs8x1blyrpa4bi9v2cwbyap5c"; - fetchSubmodules = true; - }; + src = if localPath != "" then localSrc else ghSrc; + nimbusDeriv = import "${src}/nix/default.nix"; in nimbusDeriv diff --git a/nix/status-go/source.nix b/nix/status-go/source.nix new file mode 100644 index 0000000000..9d72ba858f --- /dev/null +++ b/nix/status-go/source.nix @@ -0,0 +1,59 @@ +{ config, utils, lib, callPackage, fetchFromGitHub }: + +let + inherit (lib) strings traceValFn attrByPath importJSON; + + srcOverride = attrByPath [ "status-im" "status-go" "src-override" ] null config; + # Warning message about using local sources + localSrcWarn = (path: "Using local status-go sources from ${path}"); + + localSrc = rec { + owner = "status-im"; + repo = "status-go"; + rev = "unknown"; + shortRev = rev; + rawVersion = "develop"; + cleanVersion = rawVersion; + goPackagePath = "github.com/${owner}/${repo}"; + # We use builtins.path so that we can name the resulting derivation, + # Normally the name would not be deterministic, taken from the checkout directory. + src = builtins.path rec { + path = traceValFn localSrcWarn srcOverride; + name = "${repo}-source-${shortRev}"; + # Keep this filter as restrictive as possible in order + # to avoid unnecessary rebuilds and limit closure size + filter = lib.mkFilter { + root = path; + include = [ ".*" ]; + exclude = [ + ".*/[.]git.*" ".*[.]md" ".*[.]yml" ".*/.*_test.go$" + "_assets/.*" "build/.*" + ".*/.*LICENSE.*" ".*/CONTRIB.*" ".*/AUTHOR.*" + ]; + }; + }; + }; + + githubSrc = let + # TODO: Simplify this path search with lib.locateDominatingFile + versionJSON = importJSON ../../status-go-version.json; + sha256 = versionJSON.src-sha256; + in rec { + inherit (versionJSON) owner repo version; + rev = versionJSON.commit-sha1; + shortRev = strings.substring 0 7 rev; + rawVersion = versionJSON.version; + cleanVersion = utils.sanitizeVersion versionJSON.version; + goPackagePath = "github.com/${owner}/${repo}"; + src = fetchFromGitHub { + inherit rev owner repo sha256; + name = "${repo}-${shortRev}-source"; + }; + }; +in + if srcOverride != null + # If config.status-im.status-go.src-override is defined, + # instruct Nix to use that path to build status-go + then localSrc + # Otherwise grab it from the location defined by status-go-version.json + else githubSrc diff --git a/nix/targets.nix b/nix/targets.nix index 500e393b0a..193d07f169 100644 --- a/nix/targets.nix +++ b/nix/targets.nix @@ -7,14 +7,8 @@ let inherit (pkgs) stdenv callPackage; status-go = callPackage ./status-go { }; - - desktop = callPackage ./desktop { - status-go = status-go.desktop; - }; - - mobile = callPackage ./mobile { - inherit status-go; - }; + desktop = callPackage ./desktop { inherit status-go; }; + mobile = callPackage ./mobile { inherit status-go; }; in { inherit mobile desktop status-go; } diff --git a/nix/tools/mkShell.nix b/nix/tools/mkShell.nix deleted file mode 100644 index 059080ce06..0000000000 --- a/nix/tools/mkShell.nix +++ /dev/null @@ -1,40 +0,0 @@ -# This Nix expression appends/modifies an existing attribute set -# in order to define STATUS_REACT_HOME for use multiple derivations and scripts - -{ pkgs, stdenv ? pkgs.stdenv }: - -# Declare a specialized mkShell function which adds some bootstrapping -# so that e.g. STATUS_REACT_HOME is automatically available in the shell -attrs: - (pkgs.mkShell.override({ inherit stdenv; }) attrs) - .overrideAttrs(super: rec { - nativeBuildInputs = (super.nativeBuildInputs or [ ]) ++ [ pkgs.git ]; - - # avoid terinal issues - TERM="xterm"; - - # default locale - LANG="en_US.UTF-8"; - LANGUAGE="en_US.UTF-8"; - - shellSetup = '' - set -e - - if [ -z "$STATUS_REACT_HOME" ]; then - export STATUS_REACT_HOME=$(git rev-parse --show-toplevel) - fi - - export SHELL_SETUP=done - - set +e - ''; - - shellHook = '' - if [ -z "$SHELL_SETUP" ]; then - ${shellSetup} - fi - - ${super.shellHook or ""} - ''; - } - ) diff --git a/nix/tools/utils.nix b/nix/tools/utils.nix index b54f302c7d..a003eb6d0a 100644 --- a/nix/tools/utils.nix +++ b/nix/tools/utils.nix @@ -1,9 +1,14 @@ { xcodeWrapper, lib }: +# +# This is a collection of various utilities used throught this repo. +# + let RED = "\\033[0;31m"; GREEN = "\\033[0;32m"; NC = "\\033[0m"; + _xcodeToolsTest = '' xcode=0 iPhoneSDK=0 @@ -18,6 +23,7 @@ let export SELECTED=$iPhoneSDK; ${_xcodeToolReportScript "iPhone SDK"} ''; _xcodeVersion = builtins.replaceStrings ["xcode-wrapper-"] [""] xcodeWrapper.name; + enforceXCodeAvailable = '' ${_xcodeToolsTest} if [ $xcode -eq 0 ]; then @@ -26,6 +32,7 @@ let exit 1 fi ''; + enforceiPhoneSDKAvailable = '' ${_xcodeToolsTest} if [ $iPhoneSDK -eq 0 ]; then diff --git a/scripts/prepare-for-desktop-platform.sh b/scripts/prepare-for-desktop-platform.sh index 9e61ee02e3..89d8d60bd5 100755 --- a/scripts/prepare-for-desktop-platform.sh +++ b/scripts/prepare-for-desktop-platform.sh @@ -1,19 +1,13 @@ #!/usr/bin/env bash -################################################################################################### -# -# Impure setup (any setup here should be minimized and instead be moved to Nix for a pure setup) -# -################################################################################################### +# WARNING: Impure setup, should be minimized. +# TODO: Replace this with yarn2nix. set -e GIT_ROOT=$(cd "${BASH_SOURCE%/*}" && git rev-parse --show-toplevel) +source "${GIT_ROOT}/scripts/colors.sh" -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -NC='\033[0m' PLATFORM_FOLDER="desktop/js_files" if [ ! -f package.json ] || [ $(readlink package.json) != "${PLATFORM_FOLDER}/package.json" ]; then @@ -33,4 +27,4 @@ mkdir -p "$GIT_ROOT/node_modules/" # Leverage flock (file lock) utility to create an exclusive lock on node_modules/ while running 'yarn install' flock "$GIT_ROOT/node_modules/" yarn install --frozen-lockfile -echo -e "${GREEN}Finished!${NC}" +echo -e "${GRN}Finished!${RST}"