mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2024-12-17 17:20:21 +01:00
Compare commits
6 Commits
v6.2.1
...
av/node-addon
| Author | SHA1 | Date | |
|---|---|---|---|
| 4c4794fe33 | |||
| f179db9545 | |||
| 52160f2602 | |||
| 2a99a5235b | |||
| 4fe7b674e6 | |||
| a5e7fa2f9f |
@@ -79,3 +79,6 @@ website/package-lock.json
|
|||||||
website/.cache
|
website/.cache
|
||||||
website/test/stubs-layout-cache/_includes/*.js
|
website/test/stubs-layout-cache/_includes/*.js
|
||||||
apps/android/app/release
|
apps/android/app/release
|
||||||
|
packages/simplex-chat-nodejs/build
|
||||||
|
packages/simplex-chat-nodejs/.vscode
|
||||||
|
packages/simplex-chat-nodejs/libs
|
||||||
|
|||||||
@@ -54,11 +54,10 @@ add_library( # Sets the name of the library.
|
|||||||
simplex-api.c)
|
simplex-api.c)
|
||||||
|
|
||||||
add_library( simplex SHARED IMPORTED )
|
add_library( simplex SHARED IMPORTED )
|
||||||
|
FILE(GLOB SIMPLEXLIB ${CMAKE_SOURCE_DIR}/libs/${OS_LIB_PATH}-${OS_LIB_ARCH}/libsimplex.${OS_LIB_EXT})
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
FILE(GLOB SIMPLEXLIB ${CMAKE_SOURCE_DIR}/libs/${OS_LIB_PATH}-${OS_LIB_ARCH}/lib*simplex*.${OS_LIB_EXT})
|
|
||||||
set_target_properties( simplex PROPERTIES IMPORTED_IMPLIB ${SIMPLEXLIB})
|
set_target_properties( simplex PROPERTIES IMPORTED_IMPLIB ${SIMPLEXLIB})
|
||||||
else()
|
else()
|
||||||
FILE(GLOB SIMPLEXLIB ${CMAKE_SOURCE_DIR}/libs/${OS_LIB_PATH}-${OS_LIB_ARCH}/lib*simplex-chat*.${OS_LIB_EXT})
|
|
||||||
set_target_properties( simplex PROPERTIES IMPORTED_LOCATION ${SIMPLEXLIB})
|
set_target_properties( simplex PROPERTIES IMPORTED_LOCATION ${SIMPLEXLIB})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"target_name": "addon",
|
||||||
|
"sources": [ "cpp/simplex.cc" ],
|
||||||
|
"libraries": [
|
||||||
|
"-Wl,-rpath,libs",
|
||||||
|
"-L<(module_root_dir)/build/Release/",
|
||||||
|
"-L<(module_root_dir)/libs",
|
||||||
|
"-lsimplex"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,188 @@
|
|||||||
|
#include <sstream>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include <node.h>
|
||||||
|
#include "simplex.h"
|
||||||
|
|
||||||
|
namespace simplex
|
||||||
|
{
|
||||||
|
|
||||||
|
using v8::Array;
|
||||||
|
using v8::ArrayBuffer;
|
||||||
|
using v8::Context;
|
||||||
|
using v8::FunctionCallbackInfo;
|
||||||
|
using v8::Isolate;
|
||||||
|
using v8::Local;
|
||||||
|
using v8::Maybe;
|
||||||
|
using v8::Number;
|
||||||
|
using v8::Object;
|
||||||
|
using v8::String;
|
||||||
|
using v8::Value;
|
||||||
|
|
||||||
|
void haskell_init()
|
||||||
|
{
|
||||||
|
int argc = 5;
|
||||||
|
char *argv[] = {
|
||||||
|
"simplex",
|
||||||
|
"+RTS", // requires `hs_init_with_rtsopts`
|
||||||
|
"-A64m", // chunk size for new allocations
|
||||||
|
"-H64m", // initial heap size
|
||||||
|
"-xn", // non-moving GC
|
||||||
|
0};
|
||||||
|
char **pargv = argv;
|
||||||
|
hs_init_with_rtsopts(&argc, &pargv);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatMigrateInit(const FunctionCallbackInfo<Value> &args)
|
||||||
|
{
|
||||||
|
Isolate *isolate = args.GetIsolate();
|
||||||
|
Local<Context> context = isolate->GetCurrentContext();
|
||||||
|
|
||||||
|
std::string path(*(v8::String::Utf8Value(isolate, args[0])));
|
||||||
|
std::string key(*(v8::String::Utf8Value(isolate, args[1])));
|
||||||
|
std::string confirm(*(v8::String::Utf8Value(isolate, args[2])));
|
||||||
|
|
||||||
|
long *ctrl(0);
|
||||||
|
|
||||||
|
std::string res = chat_migrate_init(path.c_str(), key.c_str(), confirm.c_str(), &ctrl);
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << ctrl
|
||||||
|
<< "\n"
|
||||||
|
<< res;
|
||||||
|
// printf("ChatCtrl after init %d", cChatCtrl);
|
||||||
|
// v8::Local<v8::String> ctrl = v8::String::NewFromUtf8(isolate, cppChatCtrl.c_str(), v8::String::kNormalString);
|
||||||
|
|
||||||
|
args.GetReturnValue().Set(
|
||||||
|
String::NewFromUtf8(
|
||||||
|
isolate, ss.str().c_str())
|
||||||
|
.ToLocalChecked());
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatCloseStore(const FunctionCallbackInfo<Value> &args)
|
||||||
|
{
|
||||||
|
Isolate *isolate = args.GetIsolate();
|
||||||
|
Local<Context> context = isolate->GetCurrentContext();
|
||||||
|
|
||||||
|
long *ctrl = (long *)((long)args[0].As<Number>()->Value());
|
||||||
|
|
||||||
|
args.GetReturnValue().Set(
|
||||||
|
String::NewFromUtf8(
|
||||||
|
isolate, chat_close_store(ctrl))
|
||||||
|
.ToLocalChecked());
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatSendCmd(const FunctionCallbackInfo<Value> &args)
|
||||||
|
{
|
||||||
|
Isolate *isolate = args.GetIsolate();
|
||||||
|
Local<Context> context = isolate->GetCurrentContext();
|
||||||
|
|
||||||
|
long *ctrl = (long *)((long)args[0].As<Number>()->Value());
|
||||||
|
std::string cmd(*(v8::String::Utf8Value(isolate, args[1])));
|
||||||
|
|
||||||
|
args.GetReturnValue().Set(
|
||||||
|
String::NewFromUtf8(
|
||||||
|
isolate, chat_send_cmd(ctrl, cmd.c_str()))
|
||||||
|
.ToLocalChecked());
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatRecvMsgWait(const FunctionCallbackInfo<Value> &args)
|
||||||
|
{
|
||||||
|
Isolate *isolate = args.GetIsolate();
|
||||||
|
Local<Context> context = isolate->GetCurrentContext();
|
||||||
|
|
||||||
|
long *ctrl = (long *)((long)args[0].As<Number>()->Value());
|
||||||
|
long wait = ((long)args[1].As<Number>()->Value());
|
||||||
|
|
||||||
|
args.GetReturnValue().Set(
|
||||||
|
String::NewFromUtf8(
|
||||||
|
isolate, chat_recv_msg_wait(ctrl, wait))
|
||||||
|
.ToLocalChecked());
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatWriteFile(const FunctionCallbackInfo<Value> &args)
|
||||||
|
{
|
||||||
|
Isolate *isolate = args.GetIsolate();
|
||||||
|
Local<Context> context = isolate->GetCurrentContext();
|
||||||
|
|
||||||
|
long *ctrl = (long *)((long)args[0].As<Number>()->Value());
|
||||||
|
std::string path(*(v8::String::Utf8Value(isolate, args[1])));
|
||||||
|
|
||||||
|
Local<v8::ArrayBuffer> arr = args[2].As<ArrayBuffer>();
|
||||||
|
char *buffer = (char *)arr->Data();
|
||||||
|
int len(arr->ByteLength());
|
||||||
|
// std::array address(*arr);
|
||||||
|
|
||||||
|
// v8::Array a = *buffer;
|
||||||
|
// std::string data(*((isolate, args[1])));
|
||||||
|
|
||||||
|
args.GetReturnValue().Set(
|
||||||
|
String::NewFromUtf8(
|
||||||
|
isolate, chat_write_file(ctrl, path.c_str(), buffer, len))
|
||||||
|
.ToLocalChecked());
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatReadFile(const FunctionCallbackInfo<Value> &args)
|
||||||
|
{
|
||||||
|
Isolate *isolate = args.GetIsolate();
|
||||||
|
Local<Context> context = isolate->GetCurrentContext();
|
||||||
|
|
||||||
|
long *ctrl = (long *)((long)args[0].As<Number>()->Value());
|
||||||
|
std::string path(*(v8::String::Utf8Value(isolate, args[1])));
|
||||||
|
|
||||||
|
Local<v8::ArrayBuffer> arr = args[2].As<ArrayBuffer>();
|
||||||
|
char *buffer = (char *)arr->Data();
|
||||||
|
int len(arr->ByteLength());
|
||||||
|
|
||||||
|
args.GetReturnValue().Set(
|
||||||
|
String::NewFromUtf8(
|
||||||
|
isolate, chat_write_file(ctrl, path.c_str(), buffer, len))
|
||||||
|
.ToLocalChecked());
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatEncryptFile(const FunctionCallbackInfo<Value> &args)
|
||||||
|
{
|
||||||
|
Isolate *isolate = args.GetIsolate();
|
||||||
|
Local<Context> context = isolate->GetCurrentContext();
|
||||||
|
|
||||||
|
long *ctrl = (long *)((long)args[0].As<Number>()->Value());
|
||||||
|
std::string fromPath(*(v8::String::Utf8Value(isolate, args[1])));
|
||||||
|
std::string toPath(*(v8::String::Utf8Value(isolate, args[2])));
|
||||||
|
|
||||||
|
args.GetReturnValue().Set(
|
||||||
|
String::NewFromUtf8(
|
||||||
|
isolate, chat_encrypt_file(ctrl, fromPath.c_str(), toPath.c_str()))
|
||||||
|
.ToLocalChecked());
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatDecryptFile(const FunctionCallbackInfo<Value> &args)
|
||||||
|
{
|
||||||
|
Isolate *isolate = args.GetIsolate();
|
||||||
|
Local<Context> context = isolate->GetCurrentContext();
|
||||||
|
|
||||||
|
std::string fromPath(*(v8::String::Utf8Value(isolate, args[0])));
|
||||||
|
std::string key(*(v8::String::Utf8Value(isolate, args[1])));
|
||||||
|
std::string nonce(*(v8::String::Utf8Value(isolate, args[2])));
|
||||||
|
std::string toPath(*(v8::String::Utf8Value(isolate, args[3])));
|
||||||
|
|
||||||
|
args.GetReturnValue().Set(
|
||||||
|
String::NewFromUtf8(
|
||||||
|
isolate, chat_decrypt_file(fromPath.c_str(), key.c_str(), nonce.c_str(), toPath.c_str()))
|
||||||
|
.ToLocalChecked());
|
||||||
|
}
|
||||||
|
|
||||||
|
void Initialize(Local<Object> exports)
|
||||||
|
{
|
||||||
|
haskell_init();
|
||||||
|
NODE_SET_METHOD(exports, "chat_migrate_init", ChatMigrateInit);
|
||||||
|
NODE_SET_METHOD(exports, "chat_close_store", ChatCloseStore);
|
||||||
|
NODE_SET_METHOD(exports, "chat_send_cmd", ChatSendCmd);
|
||||||
|
NODE_SET_METHOD(exports, "chat_recv_msg_wait", ChatRecvMsgWait);
|
||||||
|
NODE_SET_METHOD(exports, "chat_write_file", ChatWriteFile);
|
||||||
|
NODE_SET_METHOD(exports, "chat_read_file", ChatReadFile);
|
||||||
|
NODE_SET_METHOD(exports, "chat_encrypt_file", ChatEncryptFile);
|
||||||
|
NODE_SET_METHOD(exports, "chat_decrypt_file", ChatDecryptFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
NODE_MODULE(NODE_GYP_MODULE_NAME, Initialize)
|
||||||
|
|
||||||
|
} // namespace simplex
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
//
|
||||||
|
// simplex.h
|
||||||
|
// SimpleX
|
||||||
|
//
|
||||||
|
// Created by Evgeny on 30/05/2022.
|
||||||
|
// Copyright © 2022 SimpleX Chat. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef SimpleX_h
|
||||||
|
#define SimpleX_h
|
||||||
|
|
||||||
|
extern "C" void hs_init(int argc, char **argv[]);
|
||||||
|
extern "C" void hs_init_with_rtsopts(int * argc, char **argv[]);
|
||||||
|
|
||||||
|
typedef long* chat_ctrl;
|
||||||
|
|
||||||
|
// the last parameter is used to return the pointer to chat controller
|
||||||
|
extern "C" char *chat_migrate_init(const char *path, const char *key, const char *confirm, chat_ctrl *ctrl);
|
||||||
|
extern "C" char *chat_close_store(chat_ctrl ctrl);
|
||||||
|
extern "C" char *chat_reopen_store(chat_ctrl ctrl);
|
||||||
|
extern "C" char *chat_send_cmd(chat_ctrl ctrl, const char *cmd);
|
||||||
|
extern "C" char *chat_recv_msg_wait(chat_ctrl ctrl, const int wait);
|
||||||
|
extern "C" char *chat_parse_markdown(const char *str);
|
||||||
|
extern "C" char *chat_parse_server(const char *str);
|
||||||
|
extern "C" char *chat_password_hash(const char *pwd, const char *salt);
|
||||||
|
extern "C" char *chat_valid_name(const char *name);
|
||||||
|
extern "C" int chat_json_length(const char *str);
|
||||||
|
extern "C" char *chat_encrypt_media(chat_ctrl ctrl, const char *key, const char *frame, const int len);
|
||||||
|
extern "C" char *chat_decrypt_media(const char *key, const char *frame, const int len);
|
||||||
|
|
||||||
|
// chat_write_file returns null-terminated string with JSON of WriteFileResult
|
||||||
|
extern "C" char *chat_write_file(chat_ctrl ctrl, const char *path, const char *data, const int len);
|
||||||
|
|
||||||
|
// chat_read_file returns a buffer with:
|
||||||
|
// result status (1 byte), then if
|
||||||
|
// status == 0 (success): buffer length (uint32, 4 bytes), buffer of specified length.
|
||||||
|
// status == 1 (error): null-terminated error message string.
|
||||||
|
extern "C" char *chat_read_file(const char *path, const char *key, const char *nonce);
|
||||||
|
|
||||||
|
// chat_encrypt_file returns null-terminated string with JSON of WriteFileResult
|
||||||
|
extern "C" char *chat_encrypt_file(chat_ctrl ctrl, const char *fromPath, const char *toPath);
|
||||||
|
|
||||||
|
// chat_decrypt_file returns null-terminated string with the error message
|
||||||
|
extern "C" char *chat_decrypt_file(const char *fromPath, const char *key, const char *nonce, const char *toPath);
|
||||||
|
|
||||||
|
#endif /* simplex_h */
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
{
|
||||||
|
"name": "simplexjs",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"main": "src/index.js",
|
||||||
|
"scripts": {
|
||||||
|
"install-tools": "npm install -g node-gyp",
|
||||||
|
"configure": "node-gyp configure; mkdir libs 2> /dev/null | true",
|
||||||
|
"rebuild": "node-gyp rebuild",
|
||||||
|
"build": "node-gyp build",
|
||||||
|
"run": "node src/index.js",
|
||||||
|
"build-run": "node-gyp build && node src/index.js",
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/simplex-chat/simplex-chat.git"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"messenger",
|
||||||
|
"chat",
|
||||||
|
"privacy",
|
||||||
|
"security"
|
||||||
|
],
|
||||||
|
"author": "SimpleX Chat",
|
||||||
|
"license": "AGPL-3.0",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/simplex-chat/simplex-chat/issues"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/simplex-chat/simplex-chat/packages/simplex-chat-nodejs#readme",
|
||||||
|
"description": ""
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
const addon = require('../build/Release/addon');
|
||||||
|
const fs = require('fs');
|
||||||
|
|
||||||
|
const ctrlAndRes = addon.chat_migrate_init("db", "a", "yesUp")
|
||||||
|
const ctrl = Number(ctrlAndRes.split("\n")[0])
|
||||||
|
const res = ctrlAndRes.split("\n")[1]
|
||||||
|
console.log("Migrate ctrl:", ctrl, "res:", res)
|
||||||
|
console.log(addon.chat_send_cmd(ctrl, "/v"))
|
||||||
|
// const wait = 15_000_000
|
||||||
|
// console.log(ctrl, addon.chat_recv_msg_wait(ctrl, wait))
|
||||||
|
|
||||||
|
const path = "/tmp/write_file.txt"
|
||||||
|
const data = [0, 1, 2]
|
||||||
|
console.log(addon.chat_write_file(ctrl, path, new ArrayBuffer(data)))
|
||||||
|
|
||||||
|
|
||||||
|
fs.writeFileSync("/tmp/file_unencrypted.txt", "unencrypted")
|
||||||
|
const encRes = JSON.parse(addon.chat_encrypt_file(ctrl, "/tmp/file_unencrypted.txt", "/tmp/file_encrypted.txt"))
|
||||||
|
const key = encRes.cryptoArgs.fileKey
|
||||||
|
const nonce = encRes.cryptoArgs.fileNonce
|
||||||
|
console.log(encRes)
|
||||||
|
console.log(addon.chat_decrypt_file("/tmp/file_encrypted.txt", key, nonce, "/tmp/file_decrypted.txt"))
|
||||||
@@ -24,18 +24,19 @@ exports=( $(sed 's/foreign export ccall "chat_migrate_init_key"//' src/Simplex/C
|
|||||||
for elem in "${exports[@]}"; do count=$(grep -R "$elem$" libsimplex.dll.def | wc -l); if [ $count -ne 1 ]; then echo Wrong exports in libsimplex.dll.def. Add \"$elem\" to that file; exit 1; fi ; done
|
for elem in "${exports[@]}"; do count=$(grep -R "$elem$" libsimplex.dll.def | wc -l); if [ $count -ne 1 ]; then echo Wrong exports in libsimplex.dll.def. Add \"$elem\" to that file; exit 1; fi ; done
|
||||||
for elem in "${exports[@]}"; do count=$(grep -R "\"$elem\"" flake.nix | wc -l); if [ $count -ne 2 ]; then echo Wrong exports in flake.nix. Add \"$elem\" in two places of the file; exit 1; fi ; done
|
for elem in "${exports[@]}"; do count=$(grep -R "\"$elem\"" flake.nix | wc -l); if [ $count -ne 2 ]; then echo Wrong exports in flake.nix. Add \"$elem\" in two places of the file; exit 1; fi ; done
|
||||||
|
|
||||||
rm -rf $BUILD_DIR
|
#rm -rf $BUILD_DIR
|
||||||
cabal build lib:simplex-chat --ghc-options='-optl-Wl,-rpath,$ORIGIN -flink-rts -threaded' --constraint 'simplexmq +client_library'
|
cabal build lib:simplex-chat --ghc-options='-optl-Wl,-rpath,$ORIGIN -optl-Wl,-soname,libsimplex.so -flink-rts -threaded' --constraint 'simplexmq +client_library'
|
||||||
cd $BUILD_DIR/build
|
cd $BUILD_DIR/build
|
||||||
#patchelf --add-needed libHSrts_thr-ghc${GHC_VERSION}.so libHSsimplex-chat-*-inplace-ghc${GHC_VERSION}.so
|
mv libHSsimplex-chat-*-inplace-ghc${GHC_VERSION}.so libsimplex.so 2> /dev/null || true
|
||||||
#patchelf --add-rpath '$ORIGIN' libHSsimplex-chat-*-inplace-ghc${GHC_VERSION}.so
|
#patchelf --add-needed libHSrts_thr-ghc${GHC_VERSION}.so libsimplex.so
|
||||||
|
#patchelf --add-rpath '$ORIGIN' libsimplex.so
|
||||||
|
|
||||||
# GitHub's Ubuntu 20.04 runner started to set libffi.so.7 as a dependency while Ubuntu 20.04 on user's devices may not have it
|
# GitHub's Ubuntu 20.04 runner started to set libffi.so.7 as a dependency while Ubuntu 20.04 on user's devices may not have it
|
||||||
# but libffi.so.8 is shipped as an external library with other libs
|
# but libffi.so.8 is shipped as an external library with other libs
|
||||||
patchelf --replace-needed "libffi.so.7" "libffi.so.8" libHSsimplex-chat-*-inplace-ghc${GHC_VERSION}.so
|
patchelf --replace-needed "libffi.so.7" "libffi.so.8" libsimplex.so
|
||||||
|
|
||||||
mkdir deps 2> /dev/null || true
|
mkdir deps 2> /dev/null || true
|
||||||
ldd libHSsimplex-chat-*-inplace-ghc${GHC_VERSION}.so | grep "ghc" | cut -d' ' -f 3 | xargs -I {} cp {} ./deps/
|
ldd libsimplex.so | grep "ghc" | cut -d' ' -f 3 | xargs -I {} cp {} ./deps/
|
||||||
|
|
||||||
cd -
|
cd -
|
||||||
|
|
||||||
@@ -44,7 +45,7 @@ rm -rf apps/multiplatform/desktop/build/cmake
|
|||||||
|
|
||||||
mkdir -p apps/multiplatform/common/src/commonMain/cpp/desktop/libs/$OS-$ARCH/
|
mkdir -p apps/multiplatform/common/src/commonMain/cpp/desktop/libs/$OS-$ARCH/
|
||||||
cp -r $BUILD_DIR/build/deps/* apps/multiplatform/common/src/commonMain/cpp/desktop/libs/$OS-$ARCH/
|
cp -r $BUILD_DIR/build/deps/* apps/multiplatform/common/src/commonMain/cpp/desktop/libs/$OS-$ARCH/
|
||||||
cp $BUILD_DIR/build/libHSsimplex-chat-*-inplace-ghc${GHC_VERSION}.so apps/multiplatform/common/src/commonMain/cpp/desktop/libs/$OS-$ARCH/
|
cp $BUILD_DIR/build/libsimplex.so apps/multiplatform/common/src/commonMain/cpp/desktop/libs/$OS-$ARCH/
|
||||||
scripts/desktop/prepare-vlc-linux.sh
|
scripts/desktop/prepare-vlc-linux.sh
|
||||||
|
|
||||||
links_dir=apps/multiplatform/build/links
|
links_dir=apps/multiplatform/build/links
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
LIB_EXT=dylib
|
LIB_EXT=dylib
|
||||||
LIB=libHSsimplex-chat-*-inplace-ghc*.$LIB_EXT
|
LIB=libsimplex.$LIB_EXT
|
||||||
GHC_LIBS_DIR=$(ghc --print-libdir)
|
GHC_LIBS_DIR=$(ghc --print-libdir)
|
||||||
|
|
||||||
BUILD_DIR=dist-newstyle/build/$ARCH-*/ghc-*/simplex-chat-*
|
BUILD_DIR=dist-newstyle/build/$ARCH-*/ghc-*/simplex-chat-*
|
||||||
@@ -24,9 +24,10 @@ for elem in "${exports[@]}"; do count=$(grep -R "$elem$" libsimplex.dll.def | wc
|
|||||||
for elem in "${exports[@]}"; do count=$(grep -R "\"$elem\"" flake.nix | wc -l); if [ $count -ne 2 ]; then echo Wrong exports in flake.nix. Add \"$elem\" in two places of the file; exit 1; fi ; done
|
for elem in "${exports[@]}"; do count=$(grep -R "\"$elem\"" flake.nix | wc -l); if [ $count -ne 2 ]; then echo Wrong exports in flake.nix. Add \"$elem\" in two places of the file; exit 1; fi ; done
|
||||||
|
|
||||||
rm -rf $BUILD_DIR
|
rm -rf $BUILD_DIR
|
||||||
cabal build lib:simplex-chat lib:simplex-chat --ghc-options="-optl-Wl,-rpath,@loader_path -optl-Wl,-L$GHC_LIBS_DIR/$ARCH-osx-ghc-$GHC_VERSION -optl-lHSrts_thr-ghc$GHC_VERSION -optl-lffi" --constraint 'simplexmq +client_library'
|
cabal build lib:simplex-chat lib:simplex-chat --ghc-options="-optl-Wl,-rpath,@loader_path -optl-Wl,-install_name,@rpath/$LIB -optl-Wl,-L$GHC_LIBS_DIR/$ARCH-osx-ghc-$GHC_VERSION -optl-lHSrts_thr-ghc$GHC_VERSION -optl-lffi" --constraint 'simplexmq +client_library'
|
||||||
|
|
||||||
cd $BUILD_DIR/build
|
cd $BUILD_DIR/build
|
||||||
|
mv libHSsimplex-chat-*-inplace-ghc*.$LIB_EXT libsimplex.dylib 2> /dev/null || true
|
||||||
mkdir deps 2> /dev/null || true
|
mkdir deps 2> /dev/null || true
|
||||||
|
|
||||||
# It's not included by default for some reason. Compiled lib tries to find system one but it's not always available
|
# It's not included by default for some reason. Compiled lib tries to find system one but it's not always available
|
||||||
@@ -95,7 +96,7 @@ rm -rf apps/multiplatform/desktop/build/cmake
|
|||||||
|
|
||||||
mkdir -p apps/multiplatform/common/src/commonMain/cpp/desktop/libs/$OS-$ARCH/
|
mkdir -p apps/multiplatform/common/src/commonMain/cpp/desktop/libs/$OS-$ARCH/
|
||||||
cp -r $BUILD_DIR/build/deps/* apps/multiplatform/common/src/commonMain/cpp/desktop/libs/$OS-$ARCH/
|
cp -r $BUILD_DIR/build/deps/* apps/multiplatform/common/src/commonMain/cpp/desktop/libs/$OS-$ARCH/
|
||||||
cp $BUILD_DIR/build/libHSsimplex-chat-*-inplace-ghc*.$LIB_EXT apps/multiplatform/common/src/commonMain/cpp/desktop/libs/$OS-$ARCH/
|
cp $BUILD_DIR/build/$LIB apps/multiplatform/common/src/commonMain/cpp/desktop/libs/$OS-$ARCH/
|
||||||
|
|
||||||
cd apps/multiplatform/common/src/commonMain/cpp/desktop/libs/$OS-$ARCH/
|
cd apps/multiplatform/common/src/commonMain/cpp/desktop/libs/$OS-$ARCH/
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user