{ target-os, stdenv, buildGoPackage, go, pkgs, fetchFromGitHub, openjdk, androidPkgs, composeXcodeWrapper, xcodewrapperArgs ? {} }: with stdenv; let platform = pkgs.callPackage ../platform.nix { inherit target-os; }; gomobile = pkgs.callPackage ./gomobile { inherit (androidPkgs) platform-tools; inherit composeXcodeWrapper xcodewrapperArgs; }; buildStatusGoDesktopLib = pkgs.callPackage ./build-desktop-status-go.nix { inherit buildGoPackage go pkgs xcodeWrapper; }; buildStatusGoMobileLib = pkgs.callPackage ./build-mobile-status-go.nix { inherit buildGoPackage go gomobile pkgs xcodeWrapper; }; extractStatusGoConfig = f: lib.last (lib.splitString "\n" (lib.fileContents f)); owner = lib.fileContents ../../STATUS_GO_OWNER; version = extractStatusGoConfig ../../STATUS_GO_VERSION; # TODO: Simplify this path search with lib.locateDominatingFile sha256 = extractStatusGoConfig ../../STATUS_GO_SHA256; repo = "status-go"; rev = version; goPackagePath = "github.com/${owner}/${repo}"; src = fetchFromGitHub { inherit rev owner repo sha256; }; mobileConfigs = { android = { name = "android"; outputFileName = "status-go-${version}.aar"; envVars = [ "ANDROID_HOME=${androidPkgs.androidsdk}/libexec/android-sdk" "ANDROID_NDK_HOME=${androidPkgs.ndk-bundle}/libexec/android-sdk/ndk-bundle" "PATH=${lib.makeBinPath [ openjdk ]}:$PATH" ]; gomobileExtraFlags = []; }; ios = { name = "ios"; outputFileName = "Statusgo.framework"; envVars = []; gomobileExtraFlags = [ "-iosversion=8.0" ]; }; }; 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 isDarwin then hostConfigs.darwin else hostConfigs.linux; goBuildFlags = "-v"; goBuildLdFlags = "-ldflags=-s"; xcodeWrapper = composeXcodeWrapper xcodewrapperArgs; statusGoArgs = { inherit owner repo rev version goPackagePath src goBuildFlags goBuildLdFlags; }; status-go-packages = { desktop = buildStatusGoDesktopLib (statusGoArgs // { outputFileName = "libstatus.a"; hostSystem = hostPlatform.system; host = currentHostConfig.name; }); android = buildStatusGoMobileLib (statusGoArgs // { host = mobileConfigs.android.name; config = mobileConfigs.android; }); ios = buildStatusGoMobileLib (statusGoArgs // { host = mobileConfigs.ios.name; config = mobileConfigs.ios; }); }; packages = if target-os == "android" then [ status-go-packages.android ] else if target-os == "ios" then [ status-go-packages.ios ] else if target-os == "all" then currentHostConfig.allTargets else if platform.targetDesktop then [ status-go-packages.desktop ] else throw "Unexpected target platform ${target-os}"; in { inherit packages; shellHook = lib.optionalString platform.targetIOS '' # These variables are used by the iOS build preparation section in scripts/prepare-for-platform.sh export RCTSTATUS_FILEPATH=${status-go-packages.ios}/lib/Statusgo.framework '' + lib.optionalString platform.targetAndroid '' # 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 '' + lib.optionalString platform.targetDesktop '' # 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 ''; }