Unify desktop builds. Closes #5406

- Replace Linux and MacOS scripts in `ci/desktop.groovy` with calls to `scripts/create-desktop-package.sh`
- Replace use of `deployment/env` with `.env` to avoid confusion and be coherent with mobile platforms

Signed-off-by: Pedro Pombeiro <pombeirp@users.noreply.github.com>
This commit is contained in:
Pedro Pombeiro 2018-09-13 11:44:33 +02:00
parent 3b7d18594c
commit 17a8d3a9c9
No known key found for this signature in database
GPG Key ID: A65DEB11E4BBC647
15 changed files with 332 additions and 455 deletions

16
.gitignore vendored
View File

@ -122,3 +122,19 @@ fastlane/README.md
# Jenkins # Jenkins
pkg pkg
# Status Desktop
cmake_install.cmake
CMakeCache.txt
**/CMakeFiles/
/StatusImPackage/*
/desktop/bin/*
/desktop/lib/*
/desktop/modules/*
/desktop/Makefile
/desktop/run-app.sh
/desktop/CMakeFiles/
/desktop/reportApp/Makefile
/desktop/reportApp/reportApp
/desktop/reportApp/reportApp_autogen/
/linuxdeployqt-*.AppImage

View File

@ -29,24 +29,30 @@ HELP_FUN = \
# Main targets # Main targets
clean: ##@prepare Remove all output folders clean: ##@prepare Remove all output folders
git clean -qdxf -f android/ modules/react-native-status/ node_modules/ target/ desktop/modules/ desktop/node_modules/ git clean -qdxf -f android/ modules/react-native-status/ node_modules/ target/ desktop/ StatusImPackage/
setup: ##@prepare Install all the requirements for status-react setup: ##@prepare Install all the requirements for status-react
./scripts/setup ./scripts/setup
prepare: ##@prepare Install dependencies and prepare workspace prepare-desktop: ##@prepare Install desktop platform dependencies and prepare workspace
scripts/prepare-for-platform.sh desktop
npm install
_prepare-mobile: ##@prepare Install mobile platform dependencies and prepare workspace
scripts/prepare-for-platform.sh mobile scripts/prepare-for-platform.sh mobile
npm install npm install
prepare-ios: prepare ##@prepare Install iOS specific dependencies prepare-ios: _prepare-mobile ##@prepare Install and prepare iOS-specific dependencies
mvn -f modules/react-native-status/ios/RCTStatus dependency:unpack mvn -f modules/react-native-status/ios/RCTStatus dependency:unpack
ifeq ($(OS),Darwin) ifeq ($(OS),Darwin)
cd ios && pod install cd ios && pod install
endif endif
prepare-android: prepare ##@prepare Install Android specific dependencies prepare-android: _prepare-mobile ##@prepare Install and prepare Android-specific dependencies
cd android && ./gradlew react-native-android:installArchives cd android && ./gradlew react-native-android:installArchives
prepare-mobile: prepare-android prepare-ios ##@prepare Install and prepare mobile platform specific dependencies
#---------------- #----------------
# Release builds # Release builds
#---------------- #----------------
@ -58,6 +64,9 @@ release-android: prod-build-android ##@build build release for Android
release-ios: prod-build-ios ##@build build release for iOS release release-ios: prod-build-ios ##@build build release for iOS release
@echo "Build in XCode, see https://wiki.status.im/TBD for instructions" @echo "Build in XCode, see https://wiki.status.im/TBD for instructions"
release-desktop: prod-build-desktop ##@build build release for desktop release
scripts/build-desktop.sh
prod-build: prod-build:
lein prod-build lein prod-build
@ -75,6 +84,10 @@ full-prod-build: ##@build build prod for both Android and iOS
rm -r ./modules/react-native-status/ios/RCTStatus/Statusgo.framework/ 2> /dev/null || true rm -r ./modules/react-native-status/ios/RCTStatus/Statusgo.framework/ 2> /dev/null || true
rm ./modules/react-native-status/android/libs/status-im/status-go/local/status-go-local.aar 2> /dev/null rm ./modules/react-native-status/android/libs/status-im/status-go/local/status-go-local.aar 2> /dev/null
prod-build-desktop:
git clean -qdxf -f ./index.desktop.js desktop/
lein prod-build-desktop
#-------------- #--------------
# REPL # REPL
# ------------- # -------------

View File

@ -32,6 +32,8 @@ pipeline {
LC_ALL = 'en_US.UTF-8' LC_ALL = 'en_US.UTF-8'
NPM_CONFIG_CACHE = '/var/tmp/npm' NPM_CONFIG_CACHE = '/var/tmp/npm'
LEIN_HOME = '/var/tmp/lein' LEIN_HOME = '/var/tmp/lein'
QT_PATH = '/opt/qt59'
STATUSIM_APPIMAGE = '/opt/StatusImAppImage.zip'
} }
stages { stages {
@ -53,7 +55,7 @@ pipeline {
} }
stage('Compile') { stage('Compile') {
steps { steps {
script { desktop.compileLinux() } script { desktop.compile() }
} }
} }
stage('Bundle') { stage('Bundle') {

View File

@ -13,6 +13,8 @@ pipeline {
LANG = 'en_US.UTF-8' LANG = 'en_US.UTF-8'
LANGUAGE = 'en_US.UTF-8' LANGUAGE = 'en_US.UTF-8'
LC_ALL = 'en_US.UTF-8' LC_ALL = 'en_US.UTF-8'
QT_PATH = '/Users/administrator/qt/5.9.1'
PATH = "${env.QT_PATH}/clang_64/bin:${env.PATH}"
} }
stages { stages {
@ -33,7 +35,7 @@ pipeline {
} }
stage('Compile') { stage('Compile') {
steps { steps {
script { desktop.compileMacOS() } script { desktop.compile() }
} }
} }
stage('Bundle') { stage('Bundle') {

View File

@ -1,29 +1,8 @@
common = load 'ci/common.groovy' common = load 'ci/common.groovy'
qtBin = '/opt/qt59/bin'
packageFolder = './StatusImPackage' packageFolder = './StatusImPackage'
external_modules_dir = [
'node_modules/react-native-i18n/desktop',
'node_modules/react-native-config/desktop',
'node_modules/react-native-fs/desktop',
'node_modules/react-native-http-bridge/desktop',
'node_modules/react-native-webview-bridge/desktop',
'node_modules/react-native-keychain/desktop',
'node_modules/react-native-securerandom/desktop',
'modules/react-native-status/desktop',
'node_modules/google-breakpad',
]
external_fonts = [
'../../../../../resources/fonts/SF-Pro-Text-Regular.otf',
'../../../../../resources/fonts/SF-Pro-Text-Medium.otf',
'../../../../../resources/fonts/SF-Pro-Text-Light.otf',
]
def cleanupBuild() { def cleanupBuild() {
sh """
rm -rf ${packageFolder}
"""
sh 'make clean' sh 'make clean'
} }
@ -43,16 +22,8 @@ def slackNotify(message, color = 'good') {
} }
def buildClojureScript() { def buildClojureScript() {
sh 'rm -f index.desktop.js' sh 'make prod-build-desktop'
sh 'lein prod-build-desktop' sh './scripts/build-desktop.sh buildClojureScript'
sh "mkdir ${packageFolder}"
sh """
react-native bundle \\
--entry-file index.desktop.js \\
--dev false --platform desktop \\
--bundle-output ${packageFolder}/StatusIm.jsbundle \\
--assets-dest ${packageFolder}/assets
"""
} }
def uploadArtifact(filename) { def uploadArtifact(filename) {
@ -85,121 +56,25 @@ def prepDeps() {
cleanupAndDeps() cleanupAndDeps()
} }
def compileLinux() { def compile() {
dir('desktop') { sh './scripts/build-desktop.sh compile'
sh 'rm -rf CMakeFiles CMakeCache.txt cmake_install.cmake Makefile'
sh """
cmake -Wno-dev \\
-DCMAKE_BUILD_TYPE=Release \\
-DEXTERNAL_MODULES_DIR='${external_modules_dir.join(";")}' \\
-DDESKTOP_FONTS='${external_fonts.join(";")}' \\
-DJS_BUNDLE_PATH='${workspace}/${packageFolder}/StatusIm.jsbundle' \\
-DCMAKE_CXX_FLAGS:='-DBUILD_FOR_BUNDLE=1'
"""
sh 'make'
}
} }
def bundleLinux(type = 'nightly') { def bundleLinux(type = 'nightly') {
def pkg def pkg
sh './scripts/build-desktop.sh bundle'
dir(packageFolder) { dir(packageFolder) {
sh 'rm -rf StatusImAppImage'
/* TODO this needs to be fixed: status-react/issues/5378 */
sh 'cp /opt/StatusImAppImage.zip ./'
sh 'unzip ./StatusImAppImage.zip'
sh 'rm -rf AppDir'
sh 'mkdir AppDir'
}
sh "cp -r ./deployment/linux/usr ${packageFolder}/AppDir"
sh "cp ./deployment/env ${packageFolder}/AppDir/usr/bin"
sh "cp ./desktop/bin/StatusIm ${packageFolder}/AppDir/usr/bin"
sh "cp ./desktop/reportApp/reportApp ${packageFolder}/AppDir/usr/bin"
sh 'wget https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage'
sh 'chmod a+x ./linuxdeployqt-continuous-x86_64.AppImage'
sh 'rm -f Application-x86_64.AppImage'
sh 'rm -f StatusIm-x86_64.AppImage'
sh "ldd ${packageFolder}/AppDir/usr/bin/StatusIm"
sh """
./linuxdeployqt-continuous-x86_64.AppImage \\
${packageFolder}/AppDir/usr/bin/reportApp \\
-verbose=3 -always-overwrite -no-strip -no-translations -qmake=${qtBin}/qmake \\
-qmldir='${workspace}/desktop/reportApp'
"""
sh """
./linuxdeployqt-continuous-x86_64.AppImage \\
${packageFolder}/AppDir/usr/share/applications/StatusIm.desktop \\
-verbose=3 -always-overwrite -no-strip \\
-no-translations -bundle-non-qt-libs \\
-qmake=${qtBin}/qmake \\
-extra-plugins=imageformats/libqsvg.so \\
-qmldir='${workspace}/node_modules/react-native'
"""
dir(packageFolder) {
sh 'ldd AppDir/usr/bin/StatusIm'
sh 'cp -r assets/share/assets AppDir/usr/bin'
sh 'cp -rf StatusImAppImage/* AppDir/usr/bin'
sh 'rm -f AppDir/usr/bin/StatusIm.AppImage'
}
sh """
./linuxdeployqt-continuous-x86_64.AppImage \\
${packageFolder}/AppDir/usr/share/applications/StatusIm.desktop \\
-verbose=3 -appimage -qmake=${qtBin}/qmake
"""
dir(packageFolder) {
sh 'ldd AppDir/usr/bin/StatusIm'
sh 'rm -rf StatusIm.AppImage'
pkg = common.pkgFilename(type, 'AppImage') pkg = common.pkgFilename(type, 'AppImage')
sh "mv ../StatusIm-x86_64.AppImage ${pkg}" sh "mv ../StatusIm-x86_64.AppImage ${pkg}"
} }
return "${packageFolder}/${pkg}".drop(2) return "${packageFolder}/${pkg}".drop(2)
} }
def compileMacOS() {
/* add path for QT installation binaries */
env.PATH = "/Users/administrator/qt/5.9.1/clang_64/bin:${env.PATH}"
dir('desktop') {
sh 'rm -rf CMakeFiles CMakeCache.txt cmake_install.cmake Makefile'
sh """
cmake -Wno-dev \\
-DCMAKE_BUILD_TYPE=Release \\
-DEXTERNAL_MODULES_DIR='${external_modules_dir.join(";")}' \\
-DDESKTOP_FONTS='${external_fonts.join(";")}' \\
-DJS_BUNDLE_PATH='${workspace}/${packageFolder}/StatusIm.jsbundle' \\
-DCMAKE_CXX_FLAGS:='-DBUILD_FOR_BUNDLE=1'
"""
sh 'make'
}
}
def bundleMacOS(type = 'nightly') { def bundleMacOS(type = 'nightly') {
def pkg = common.pkgFilename(type, 'dmg') def pkg = common.pkgFilename(type, 'dmg')
sh './scripts/build-desktop.sh bundle'
dir(packageFolder) { dir(packageFolder) {
sh 'curl -L -O "https://github.com/status-im/StatusAppFiles/raw/PR5702/Status.app.zip"'
sh 'unzip Status.app.zip'
sh 'cp -r assets/share/assets Status.app/Contents/Resources'
sh 'ln -sf ../Resources/assets ../Resources/ubuntu-server ../Resources/node_modules ' +
'Status.app/Contents/MacOS'
sh 'chmod +x Status.app/Contents/Resources/ubuntu-server'
sh 'cp ../desktop/bin/StatusIm Status.app/Contents/MacOS/Status'
sh 'cp ../desktop/reportApp/reportApp Status.app/Contents/MacOS'
sh "cp ../deployment/env Status.app/Contents/Resources"
sh 'ln -sf ../Resources/env Status.app/Contents/MacOS/env'
sh 'cp -f ../deployment/macos/qt-reportApp.conf Status.app/Contents/Resources'
sh 'ln -sf ../Resources/qt-reportApp.conf Status.app/Contents/MacOS/qt.conf'
sh 'install_name_tool -add_rpath "@executable_path/../Frameworks" ' +
'-delete_rpath "/Users/administrator/qt/5.9.1/clang_64/lib" ' +
'Status.app/Contents/MacOS/reportApp'
sh 'cp -f ../deployment/macos/Info.plist Status.app/Contents'
sh 'cp -f ../deployment/macos/status-icon.icns Status.app/Contents/Resources'
sh """
macdeployqt Status.app -verbose=1 \\
-qmldir='${workspace}/node_modules/react-native/ReactQt/runtime/src/qml/'
"""
sh 'rm -f Status.app.zip'
withCredentials([ withCredentials([
string(credentialsId: 'desktop-gpg-outer-pass', variable: 'GPG_PASS_OUTER'), string(credentialsId: 'desktop-gpg-outer-pass', variable: 'GPG_PASS_OUTER'),
string(credentialsId: 'desktop-gpg-inner-pass', variable: 'GPG_PASS_INNER'), string(credentialsId: 'desktop-gpg-inner-pass', variable: 'GPG_PASS_INNER'),

View File

@ -1,20 +0,0 @@
TESTFAIRY_ENABLED=0
STUB_STATUS_GO=0
ETHEREUM_DEV_CLUSTER=1
MAINNET_NETWORKS_ENABLED=1
OFFLINE_INBOX_ENABLED=1
OFFLINE_INBOX_MANY_ENABLED=1
LOG_LEVEL=debug
LOG_LEVEL_STATUS_GO=info
FLEET=eth.beta
JSC_ENABLED=1
QUEUE_MESSAGE_ENABLED=1
MANY_WHISPER_TOPICS_ENABLED=0
RN_BRIDGE_THRESHOLD_WARNINGS=0
COMPILE_VIEWS_ENABLED=0
POW_TARGET=0.002
POW_TIME=1
MIXPANEL_TOKEN=3f2e1a8970f159aa2a3d5dc5d65eab38
DEFAULT_NETWORK=mainnet_rpc
TESTFAIRY_TOKEN=969f6c921cb435cea1d41d1ea3f5b247d6026d55
INSTABUG_TOKEN=758630ed52864cbad9c5eeeac596c60c

View File

@ -16,11 +16,7 @@ set(CMAKE_OSX_DEPLOYMENT_TARGET "10.9")
message(STATUS "EXTERNAL_MODULES_DIR: ${EXTERNAL_MODULES_DIR}") message(STATUS "EXTERNAL_MODULES_DIR: ${EXTERNAL_MODULES_DIR}")
string(REGEX MATCH "BUILD_FOR_BUNDLE" BUILD_FOR_BUNDLE "${CMAKE_CXX_FLAGS}") string(REGEX MATCH "BUILD_FOR_BUNDLE" BUILD_FOR_BUNDLE "${CMAKE_CXX_FLAGS}")
if(${BUILD_FOR_BUNDLE} MATCHES "BUILD_FOR_BUNDLE") set(ENVFILE "/.env")
set(ENVFILE "/env")
else()
set(ENVFILE "/../../.env")
endif()
foreach(external_module ${EXTERNAL_MODULES_DIR}) foreach(external_module ${EXTERNAL_MODULES_DIR})
message(STATUS "external_module: ${external_module}") message(STATUS "external_module: ${external_module}")

View File

@ -1,60 +0,0 @@
# Prerequisites:
lein, node.js v.8 , cmake, Qt 5.9.1 (with QtWebEngine components installed), Qt's qmake available in PATH
Note: add qmake to PATH via
`export PATH=<QT_PATH>/clang_64/bin:$PATH`
Caveats:
- if npm hangs at some step, check the version. If it's 5.6.0 or higher, try downgrading to 5.5.1 via `npm install -g npm@5.5.1`
# To install react-native-cli with desktop commands support:
1. git clone https://github.com/status-im/react-native-desktop.git
2. cd react-native-desktop/react-native-cli
3. npm update
4. npm install -g
# To setup re-natal dev builds of status-react for Desktop:
1. git clone https://github.com/status-im/status-react.git
2. cd status-react
3. scripts/prepare-for-platform.sh desktop
4. npm install
5. ln -sf './node_modules/re-natal/index.js' './re-natal'
6. ./re-natal use-figwheel
7. ./re-natal enable-source-maps
8. In separate terminal tab: `npm start` (note: it starts react-native packager )
9. In separate terminal tab: node ./ubuntu-server.js
10. In separate terminal tab: lein figwheel-repl desktop (note: wait until sources are compiled)
11. In separate terminal tab: react-native run-desktop
# Editor setup
Running `lein figwheel-repl desktop` will run a REPL on port 7888 by default. Some additional steps might be needed to connect to it.
## emacs-cider
In order to get REPL working, use the below elisp code:
```
(defun custom-cider-jack-in ()
(interactive)
(let ((status-desktop-params "with-profile +figwheel repl"))
(set-variable 'cider-lein-parameters status-desktop-params)
(message "setting 'cider-lein-parameters")
(cider-jack-in)))
(defun start-figwheel-cljs-repl ()
(interactive)
(set-buffer "*cider-repl status-react*")
(goto-char (point-max))
(insert "(do (use 'figwheel-api)
(start [:desktop])
(start-cljs-repl))")
(cider-repl-return))
```
`custom-cider-jack-in` sets the correct profile for leiningen, and can be run as soon as emacs is open.
run `start-figwheel-cljs-repl` once you already have a cider repl session from the jack-in
## vim-fireplace
For some reason there is no `.nrepl-port` file in project root, so `vim-fireplace` will not be able to connect automatically. You can either:
- run `:Connect` and answer a couple of interactive prompts
- create `.nrepl-port` file manually and add a single line containing `7888` (or whatever port REPL is running on)
After Figwheel has connected to the app, run `:Piggieback (figwheel-sidecar.repl-api/repl-env)` inside Vim, and you should be all set.

View File

@ -1,136 +0,0 @@
These are some common issues you may run into while setting up React Native Qt.
## Initial setup issues
### `npm install` hangs
Downgrade to version 5.5.1: `npm install -g npm@5.5.1`.
### `re-natal` missing
Create a link:
`ln -sf node_modules/re-natal/index.js re-natal`
### `react-native run desktop` complaining about missing `qmldir`:
```Command failed: ./build.sh -e "node_modules/react-native-i18n/desktop;node_modules/react-native-config/desktop;node_modules/react-native-fs/desktop;node_modules/react-native-http-bridge/desktop;node_modules/react-native-webview-bridge/desktop;modules/react-native-status/desktop"
Error copying directory from "/path-to-status-react/node_modules/react-native/ReactQt/runtime/src/qmldir" to "/path-to-status-react/desktop/lib/React".
make[2]: *** [lib/CMakeFiles/copy-qmldir] Error 1
make[1]: *** [lib/CMakeFiles/copy-qmldir.dir/all] Error 2
make: *** [all] Error 2
```
Can be solved by re-running `npm install react-native` which put the `ReactQt/runtime/src/qmldir` file back.
### Missing web3 package issue
After last upgrade of react-native-desktop to the v.0.53.3 of original react-native appeared some incompatibility between `react-native` and `web3` packages on npm install. Initially it installed usually fine, but after `react-native desktop` command execution `web3` package is get removed from `node_modules`. Manual install of web3 by `npm install web3` installs `web3` package, but removes `react-native` package. Workaround or solution?
### Go problem
```
panic: runloop has just unexpectedly stopped
goroutine 50 [running]:
github.com/status-im/status-go/vendor/github.com/rjeczalik/notify.init.0.func1()
/path-to-status-react/desktop/modules/react-native-status/desktop/StatusGo/src/github.com/status-im/status-go/vendor/github.com/rjeczalik/notify/watcher_fsevents_cgo.go:69 +0x79
created by github.com/status-im/status-go/vendor/github.com/rjeczalik/notify.init.0
/path-to-status-react/desktop/modules/react-native-status/desktop/StatusGo/src/github.com/status-im/status-go/vendor/github.com/rjeczalik/notify/watcher_fsevents_cgo.go:65 +0x4e
events.js:183
throw er; // Unhandled 'error' event
```
Related to https://github.com/rjeczalik/notify/issues/139. Solution: re-run.
## App issues
### Eth node crashing
`node ./ubuntu_server.js` log:
```
DEBUG [status-im.utils.handlers:36] - Handling re-frame event: :signal-event {"type":"node.crashed","event":{"error":"node is already running"}}
DEBUG [status-im.ui.screens.events:350] - :event-str {"type":"node.crashed","event":{"error":"node is already running"}}
DEBUG [status-im.utils.instabug:8] - Signal event: {"type":"node.crashed","event":{"error":"node is already running"}}
DEBUG [status-im.ui.screens.events:362] - Event node.crashed not handled
```
Solution: prevent starting Ethereum local node when there is an instance already running.
### Reload JS - blank screen
Console log for `react-native run-desktop` shows error 533.
Solution: reload again. Still, might hang at `Signing you in...` step (due to node attempted to be restarted). Re-run Figwheel and `react-native run-desktop`
### ReactButton.qml non-existent property "elide" error upon startup
```
qrc:/qml/ReactButton.qml:33: Error: Cannot assign to non-existent property "elide"
"Component for qrc:/qml/ReactWebView.qml is not loaded"
QQmlComponent: Component is not ready
"Unable to construct item from component qrc:/qml/ReactWebView.qml"
"Can't create QML item for componenet qrc:/qml/ReactWebView.qml"
"RCTWebViewView" has no view for inspecting!
```
Reload JS does not help, restarting Figwheel/react-native might not as well. Restarting Metro bundler solved it for me.
### After login when several contacts are available: realm errors
1. `attempting to create an object of type 'chat'...`
2. `attempting to create an object of type 'transport'...`
3. Error text containing only the public key.
The realm stack trace follows.
### Error: spawn gnome-terminal ENOENT
In node server log:
```
ignoring exception: Error: read ECONNRESET
```
In react-native log:
```
./run-app.sh: line 72: 56660 Segmentation fault: 11 /path-to-status-react/desktop/bin/StatusIm $args
events.js:183
throw er; // Unhandled 'error' event
^
Error: spawn gnome-terminal ENOENT
at _errnoException (util.js:992:11)
at Process.ChildProcess._handle.onexit (internal/child_process.js:190:19)
at onErrorNT (internal/child_process.js:372:16)
at _combinedTickCallback (internal/process/next_tick.js:138:11)
at process._tickCallback (internal/process/next_tick.js:180:9)
```
or
```
StatusIm(7924,0x70000c1cd000) malloc: *** error for object 0x7f8b1539bd10: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug
./run-app.sh: line 72: 7924 Abort trap: 6 /path-to-status-react/desktop/bin/StatusIm $args
events.js:183
throw er; // Unhandled 'error' event
^
Error: spawn gnome-terminal ENOENT
at _errnoException (util.js:992:11)
at Process.ChildProcess._handle.onexit (internal/child_process.js:190:19)
at onErrorNT (internal/child_process.js:372:16)
at _combinedTickCallback (internal/process/next_tick.js:138:11)
at process._tickCallback (internal/process/next_tick.js:180:9)
```
### statusgo error during `react-native run-desktop`
```
Command failed: build(.)sh -e "node_modules/react-native-i18n/desktop;node_modules/react-native-config/desktop;node_modules/react-native-fs/desktop;node_modules/react-native-http-bridge/desktop;node_modules/react-native-webview-bridge/desktop;modules/react-native-status/desktop"
# github.com/status-im/status-go/vendor/github.com/ethereum/go-ethereum/crypto/bn256
../vendor/github.com/ethereum/go-ethereum/crypto/bn256/bn256_fast.go:26: syntax error: unexpected = in type declaration
../vendor/github.com/ethereum/go-ethereum/crypto/bn256/bn256_fast.go:30: syntax error: unexpected = in type declaration
# github.com/status-im/status-go/vendor/github.com/ethereum/go-ethereum/crypto/bn256
vendor/github.com/ethereum/go-ethereum/crypto/bn256/bn256_fast.go:26: syntax error: unexpected = in type declaration
vendor/github.com/ethereum/go-ethereum/crypto/bn256/bn256_fast.go:30: syntax error: unexpected = in type declaration
make[3]: *** [statusgo-library] Error 2
make[2]: *** [modules/react-native-status/desktop/StatusGo/src/github.com/status-im/src/StatusGo_ep-stamp/StatusGo_ep-configure] Error 2
make[1]: *** [modules/react-native-status/desktop/CMakeFiles/StatusGo_ep(.)dir/all] Error 2
make: *** [all] Error 2
```
### inotify errors
upon running `npm start` on linux, watchman may indicate: "The user limit on the total number of inotify watches was reached"
This can be fixed by running the below command. Note, changes will only be as valid as the current terminal session.
```
echo 999999 | sudo tee -a /proc/sys/fs/inotify/max_user_watches && echo 999999 | sudo tee -a
/proc/sys/fs/inotify/max_queued_events && echo 999999 | sudo tee -a /proc/sys/fs/inotify/max_user_instances &&
watchman shutdown-server && sudo sysctl -p
```

269
scripts/build-desktop.sh Executable file
View File

@ -0,0 +1,269 @@
#!/bin/bash
set -e
VERBOSE_LEVEL=${VERBOSE_LEVEL:-1}
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )"
OS=$(uname -s)
external_modules_dir=( \
'node_modules/react-native-i18n/desktop' \
'node_modules/react-native-config/desktop' \
'node_modules/react-native-fs/desktop' \
'node_modules/react-native-http-bridge/desktop' \
'node_modules/react-native-webview-bridge/desktop' \
'node_modules/react-native-keychain/desktop' \
'node_modules/react-native-securerandom/desktop' \
'modules/react-native-status/desktop' \
'node_modules/google-breakpad' \
)
external_fonts=( \
'../../../../../resources/fonts/SF-Pro-Text-Regular.otf' \
'../../../../../resources/fonts/SF-Pro-Text-Medium.otf' \
'../../../../../resources/fonts/SF-Pro-Text-Light.otf' \
)
function is_macos() {
[[ "$OS" =~ Darwin ]]
}
function is_linux() {
[[ "$OS" =~ Linux ]]
}
function program_exists() {
local program=$1
command -v "$program" >/dev/null 2>&1
}
function joinPath() {
if program_exists 'realpath'; then
realpath -m "$1/$2"
else
echo "$1/$2" | tr -s /
fi
}
function joinExistingPath() {
if program_exists 'realpath'; then
realpath "$1/$2"
else
echo "$1/$2" | tr -s /
fi
}
STATUSREACTPATH="$(joinExistingPath "$SCRIPTPATH" '..')"
WORKFOLDER="$(joinExistingPath "$STATUSREACTPATH" 'StatusImPackage')"
DEPLOYQT="$(joinPath . 'linuxdeployqt-continuous-x86_64.AppImage')"
function init() {
if [ -z $QT_PATH ]; then
echo "${RED}QT_PATH environment variable is not defined!${NC}"
exit 1
fi
if is_macos; then
if [ -z $MACDEPLOYQT ]; then
set +e
MACDEPLOYQT=$(which macdeployqt)
if [ -z $MACDEPLOYQT ]; then
echo "${RED}MACDEPLOYQT environment variable is not defined and macdeployqt executable not found in path!${NC}"
exit 1
fi
set -e
fi
fi
if is_macos; then
DEPLOYQT="$MACDEPLOYQT"
fi
}
function joinStrings() {
local arr=("$@")
printf -v var "%s;" "${arr[@]}"
var=${var%?}
echo ${var[@]}
}
function buildClojureScript() {
# create directory for all work related to bundling
rm -rf $WORKFOLDER
mkdir -p $WORKFOLDER
echo -e "${GREEN}Work folder created: $WORKFOLDER${NC}"
echo ""
# from index.desktop.js create javascript bundle and resources folder
echo "Generating StatusIm.jsbundle and assets folder..."
react-native bundle --entry-file index.desktop.js --bundle-output "$WORKFOLDER/StatusIm.jsbundle" \
--dev false --platform desktop --assets-dest "$WORKFOLDER/assets"
echo -e "${GREEN}Generating done.${NC}"
echo ""
# Add path to javascript bundle to package.json
jsBundleLine="\"desktopJSBundlePath\": \"$WORKFOLDER/StatusIm.jsbundle\""
jsPackagePath=$(joinExistingPath "$STATUSREACTPATH" 'desktop_files/package.json')
if grep -Fq "$jsBundleLine" "$jsPackagePath"; then
echo -e "${GREEN}Found line in package.json.${NC}"
else
# Add line to package.json just before "dependencies" line
if is_macos; then
sed -i '' -e "/\"dependencies\":/i\\
\ $jsBundleLine," "$jsPackagePath"
else
sed -i -- "/\"dependencies\":/i\ $jsBundleLine," "$jsPackagePath"
fi
echo -e "${YELLOW}Added 'desktopJSBundlePath' line to $jsPackagePath:${NC}"
echo ""
fi
}
function compile() {
pushd desktop
rm -rf CMakeFiles CMakeCache.txt cmake_install.cmake Makefile
cmake -Wno-dev \
-DCMAKE_BUILD_TYPE=Release \
-DEXTERNAL_MODULES_DIR="$(joinStrings ${external_modules_dir[@]})" \
-DDESKTOP_FONTS="$(joinStrings ${external_fonts[@]})" \
-DJS_BUNDLE_PATH="$WORKFOLDER/StatusIm.jsbundle" \
-DCMAKE_CXX_FLAGS:='-DBUILD_FOR_BUNDLE=1 -std=c++11'
make
popd
}
function bundleLinux() {
local QTBIN=$(joinExistingPath "$QT_PATH" 'gcc_64/bin')
if [ ! -d "$QTBIN" ]; then
# CI environment doesn't contain gcc_64 path component
QTBIN=$(joinExistingPath "$QT_PATH" 'bin')
fi
# invoke linuxdeployqt to create StatusIm.AppImage
echo "Creating AppImage..."
pushd $WORKFOLDER
rm -rf StatusImAppImage
# TODO this needs to be fixed: status-react/issues/5378
if [ -z $STATUSIM_APPIMAGE ]; then
[ -f ./StatusImAppImage.zip ] || wget https://desktop-app-files.ams3.digitaloceanspaces.com/StatusImAppImage.zip
STATUSIM_APPIMAGE=./StatusImAppImage.zip
fi
unzip "$STATUSIM_APPIMAGE" -d .
rm -rf AppDir
mkdir AppDir
popd
qmakePath="$(joinExistingPath "${QTBIN}" 'qmake')"
usrBinPath=$(joinPath "$WORKFOLDER" "AppDir/usr/bin")
cp -r ./deployment/linux/usr $WORKFOLDER/AppDir
cp ./.env $usrBinPath
cp ./desktop/bin/StatusIm $usrBinPath
cp ./desktop/reportApp/reportApp $usrBinPath
if [ ! -f $DEPLOYQT ]; then
wget --output-document="$DEPLOYQT" --show-progress -q https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage
chmod a+x $DEPLOYQT
fi
rm -f Application-x86_64.AppImage
rm -f StatusIm-x86_64.AppImage
[ $VERBOSE_LEVEL -ge 1 ] && ldd $(joinExistingPath "$usrBinPath" 'StatusIm')
$DEPLOYQT \
$(joinExistingPath "$usrBinPath" 'reportApp') \
-verbose=$VERBOSE_LEVEL -always-overwrite -no-strip -no-translations -qmake="$(joinExistingPath "${QTBIN}" 'qmake')" \
-qmldir="$STATUSREACTPATH/desktop/reportApp"
desktopFilePath="$(joinExistingPath "$WORKFOLDER" 'AppDir/usr/share/applications/StatusIm.desktop')"
$DEPLOYQT \
$desktopFilePath \
-verbose=$VERBOSE_LEVEL -always-overwrite -no-strip \
-no-translations -bundle-non-qt-libs \
-qmake="$qmakePath" \
-extra-plugins=imageformats/libqsvg.so \
-qmldir="$(joinExistingPath "$STATUSREACTPATH" 'node_modules/react-native')"
pushd $WORKFOLDER
[ $VERBOSE_LEVEL -ge 1 ] && ldd AppDir/usr/bin/StatusIm
cp -r assets/share/assets AppDir/usr/bin
cp -rf StatusImAppImage/* AppDir/usr/bin
rm -f AppDir/usr/bin/StatusIm.AppImage
popd
$DEPLOYQT \
$desktopFilePath \
-verbose=$VERBOSE_LEVEL -appimage -qmake="$qmakePath"
pushd $WORKFOLDER
[ $VERBOSE_LEVEL -ge 1 ] && ldd AppDir/usr/bin/StatusIm
cp -r assets/share/assets AppDir/usr/bin
cp -rf StatusImAppImage/* AppDir/usr/bin
rm -f AppDir/usr/bin/StatusIm.AppImage
popd
$DEPLOYQT \
"$desktopFilePath" \
-verbose=$VERBOSE_LEVEL -appimage -qmake="$qmakePath"
pushd $WORKFOLDER
[ $VERBOSE_LEVEL -ge 1 ] && ldd AppDir/usr/bin/StatusIm
rm -rf StatusIm.AppImage
popd
echo -e "${GREEN}Package ready in ./StatusIm-x86_64.AppImage!${NC}"
echo ""
}
function bundleMacOS() {
# download prepared package with mac bundle files (it contains qt libraries, icon)
echo "Downloading skeleton of mac bundle..."
pushd $WORKFOLDER
rm -rf Status.app
# TODO this needs to be fixed: status-react/issues/5378
[ -f ./Status.app.zip ] || curl -L -o Status.app.zip https://desktop-app-files.ams3.digitaloceanspaces.com/Status.app.zip
echo -e "${GREEN}Downloading done.${NC}"
echo ""
unzip ./Status.app.zip
cp -r assets/share/assets Status.app/Contents/Resources
ln -sf ../Resources/assets ../Resources/ubuntu-server ../Resources/node_modules Status.app/Contents/MacOS
chmod +x Status.app/Contents/Resources/ubuntu-server
cp ../desktop/bin/StatusIm Status.app/Contents/MacOS/Status
cp ../desktop/reportApp/reportApp Status.app/Contents/MacOS
cp ../.env Status.app/Contents/Resources
ln -sf ../Resources/.env Status.app/Contents/MacOS/.env
cp -f ../deployment/macos/qt-reportApp.conf Status.app/Contents/Resources
ln -sf ../Resources/qt-reportApp.conf Status.app/Contents/MacOS/qt.conf
install_name_tool -add_rpath "@executable_path/../Frameworks" \
-delete_rpath "$(joinExistingPath "$QT_PATH" 'clang_64/lib')" \
'Status.app/Contents/MacOS/reportApp'
cp -f ../deployment/macos/Info.plist Status.app/Contents
cp -f ../deployment/macos/status-icon.icns Status.app/Contents/Resources
$DEPLOYQT Status.app -verbose=$VERBOSE_LEVEL \
-qmldir="$STATUSREACTPATH/node_modules/react-native/ReactQt/runtime/src/qml/"
rm -f Status.app.zip
popd
echo -e "${GREEN}Package ready in $WORKFOLDER/Status.app!${NC}"
echo ""
}
function bundle() {
if is_macos; then
bundleMacOS
else
bundleLinux
fi
}
init
if [ -z "$@" ]; then
buildClojureScript
compile
bundle
else
"$@"
fi

View File

@ -1,89 +0,0 @@
#!/bin/bash
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )"
STATUSREACTPATH="$SCRIPTPATH/.."
WORKFOLDER="$SCRIPTPATH/../mac_bundle"
MACDEPLOYQT=""
#if no arguments passed, inform user about possible ones (one for making script interactive, one for path to macdeployqt)
if [ $# -eq 0 ]
then
echo -e "${RED}You need to specify path to macdeployqt binary as an argument${NC}"
echo "Example: scripts/create-desktop-mac-bundle.sh /usr/bin/macdeployqt"
exit 1
else
MACDEPLOYQT=$1
fi
# check if gdrive installed
command -v gdrive >/dev/null 2>&1 || { echo -e "${RED}gdrive tool need to be installed. (brew install gdrive). Aborting.${NC}" >&2; exit 1; }
# inform user that define should be changed in "desktop/main.cpp"
echo ""
echo -e "${YELLOW}In desktop/main.cpp file please uncomment #define BULID_FOR_BUNDLE line.${NC}"
read -p "When ready, plese press enter to continue"
echo ""
# create directory for all work related to bundling
mkdir -p $WORKFOLDER
echo -e "${GREEN}Work folder created: $WORKFOLDER${NC}"
echo ""
# from index.desktop.js create javascript bundle and resources folder
echo "Generating StatusIm.bundle and assets folder..."
react-native bundle --entry-file index.desktop.js --bundle-output $WORKFOLDER/StatusIm.jsbundle --dev false --platform desktop --assets-dest $WORKFOLDER/assets
echo -e "${GREEN}Generating done.${NC}"
echo ""
# show path to javascript bundle and line that should be added to package.json
echo -e "${YELLOW}Please add the following line to package.json:${NC}"
echo "\"desktopJSBundlePath\": \"$WORKFOLDER/StatusIm.jsbundle\""
echo ""
read -p "When ready, plese press enter to continue"
echo ""
# build desktop app
echo "Building StatusIm desktop..."
react-native build-desktop
echo -e "${GREEN}Building done.${NC}"
echo ""
# download prepared package with mac bundle files (it contains qt libraries, icon)
echo "Downloading skeleton of mac bundle..."
echo -e "${YELLOW}First time gdrive can ask you for permissions to google drive${NC}"
gdrive download --path $WORKFOLDER 1fJbW9FzGGPvYkuJcSH5mCAcGdnyUeDSY
echo -e "${GREEN}Downloading done.${NC}"
echo ""
# Unpacking downloaded archive
echo "Unpacking bundle skeleton"
unzip $WORKFOLDER/StatusIm.app.zip -d $WORKFOLDER
chmod +x $WORKFOLDER/StatusIm.app/Contents/MacOs/ubuntu-server
echo -e "${GREEN}Unzipping done.${NC}"
echo ""
# copy binary and resources to mac bundle
echo "Copying resources and binary..."
cp -r $WORKFOLDER/assets/share/assets $WORKFOLDER/StatusIm.app/Contents/MacOs
cp $STATUSREACTPATH/desktop/bin/StatusIm $WORKFOLDER/StatusIm.app/Contents/MacOs
echo -e "${GREEN}Copying done.${NC}"
echo ""
# invoke macdeployqt to create StatusIm.dmg
echo "Creating bundle dmg..."
$MACDEPLOYQT $WORKFOLDER/StatusIm.app -verbose=3 -qmldir="$STATUSREACTPATH/node_modules/react-native/ReactQt/application/src/" -qmldir="$STATUSREACTPATH/node_modules/react-native/ReactQt/runtime/src/qml/" -dmg
echo -e "${GREEN}Bundle ready!${NC}"
echo ""

View File

@ -2,6 +2,14 @@
_localPropertiesPath=./android/local.properties _localPropertiesPath=./android/local.properties
function downloadUrl() {
if program_exists "aria2c"; then
aria2c --max-connection-per-server=16 --split=16 --dir="$1" -o "$2" "$3"
else
wget --show-progress --output-document="$1/$2" "$3"
fi
}
function install_node() { function install_node() {
if nvm_installed; then if nvm_installed; then
install_node_via_nvm install_node_via_nvm
@ -331,10 +339,10 @@ function install_android_ndk() {
PLATFORM="darwin" PLATFORM="darwin"
fi fi
wget --output-document=android-ndk.zip https://dl.google.com/android/repository/android-ndk-r10e-$PLATFORM-x86_64.zip && \ downloadUrl . android-ndk.zip https://dl.google.com/android/repository/android-ndk-r10e-$PLATFORM-x86_64.zip && \
cecho "@cyan[[Extracting Android NDK to $_ndkParentDir.]]" && \ cecho "@cyan[[Extracting Android NDK to $_ndkParentDir.]]" && \
unzip -q -o android-ndk.zip -d "$_ndkParentDir" && \ unzip -q -o ./android-ndk.zip -d "$_ndkParentDir" && \
rm -f android-ndk.zip && \ rm -f ./android-ndk.zip && \
_ndkTargetDir="$_ndkParentDir/$(ls $_ndkParentDir | head -n 1)" && \ _ndkTargetDir="$_ndkParentDir/$(ls $_ndkParentDir | head -n 1)" && \
echo "ndk.dir=$_ndkTargetDir" | tee -a $_localPropertiesPath && \ echo "ndk.dir=$_ndkTargetDir" | tee -a $_localPropertiesPath && \
cecho "@blue[[Android NDK installation completed in $_ndkTargetDir.]]" cecho "@blue[[Android NDK installation completed in $_ndkTargetDir.]]"

View File

@ -39,7 +39,6 @@ install_cocoapods
#### ####
echo && setup_header "Installing dependencies..." echo && setup_header "Installing dependencies..."
dependency_setup make prepare-android dependency_setup make prepare-mobile
dependency_setup make prepare-ios
setup_complete setup_complete

View File

@ -1,5 +1,6 @@
(ns status-im.node.core (ns status-im.node.core
(:require [re-frame.core :as re-frame] (:require [re-frame.core :as re-frame]
[status-im.constants :as constants]
[status-im.fleet.core :as fleet] [status-im.fleet.core :as fleet]
[status-im.native-module.core :as status] [status-im.native-module.core :as status]
[status-im.utils.config :as config] [status-im.utils.config :as config]
@ -109,8 +110,8 @@
(defn get-node-config [db network] (defn get-node-config [db network]
(-> (get-in (:networks/networks db) [network :config]) (-> (get-in (:networks/networks db) [network :config])
(get-base-node-config) (get-base-node-config)
(assoc :PFSEnabled false) (assoc :PFSEnabled false
(assoc :NoDiscovery true) :NoDiscovery true)
(add-log-level config/log-level-status-go))) (add-log-level config/log-level-status-go)))
(fx/defn start (fx/defn start

View File

@ -1,5 +1,6 @@
(ns status-im.utils.config (ns status-im.utils.config
(:require [status-im.react-native.js-dependencies :as rn-dependencies] (:require [status-im.react-native.js-dependencies :as rn-dependencies]
[status-im.utils.platform :as platform]
[clojure.string :as string])) [clojure.string :as string]))
(def config (js->clj (.-default rn-dependencies/config) :keywordize-keys true)) (def config (js->clj (.-default rn-dependencies/config) :keywordize-keys true))
@ -17,7 +18,7 @@
;; TESTFAIRY_ENABLED - indefinite ;; TESTFAIRY_ENABLED - indefinite
;; CONFIG FLAGS ;; CONFIG FLAGS
(def testfairy-enabled? (enabled? (get-config :TESTFAIRY_ENABLED))) (def testfairy-enabled? (when-not platform/desktop? (enabled? (get-config :TESTFAIRY_ENABLED))))
(def bootnodes-settings-enabled? (enabled? (get-config :BOOTNODES_SETTINGS_ENABLED "1"))) (def bootnodes-settings-enabled? (enabled? (get-config :BOOTNODES_SETTINGS_ENABLED "1")))
(def rpc-networks-only? (enabled? (get-config :RPC_NETWORKS_ONLY "1"))) (def rpc-networks-only? (enabled? (get-config :RPC_NETWORKS_ONLY "1")))