Description:[feature] add ejdb

Signed-off-by: stesen <stesen.ma@huawei.com>
Change-Id: Idd85e9f93d8c2fb983958db2c79c1cfdb6f75275
This commit is contained in:
stesen
2021-08-18 22:07:30 +08:00
parent 4f6d2ddd15
commit 86b1d0e7f3
410 changed files with 75812 additions and 68 deletions
+157
View File
@@ -0,0 +1,157 @@
# EJDB 2.0
[![Join Telegram](https://img.shields.io/badge/join-ejdb2%20telegram-0088cc.svg)](https://tlg.name/ejdb2)
[![license](https://img.shields.io/github/license/Softmotions/ejdb.svg)](https://github.com/Softmotions/ejdb/blob/master/LICENSE)
![maintained](https://img.shields.io/maintenance/yes/2021.svg)
EJDB2 is an embeddable JSON database engine published under MIT license.
[The Story of the IT-depression, birds and EJDB 2.0](https://medium.com/@adamansky/ejdb2-41670e80897c)
* C11 API
* Single file database
* Online backups support
* 500K library size for Android
* [iOS](https://github.com/Softmotions/EJDB2Swift) / [Android](https://github.com/Softmotions/ejdb/tree/master/src/bindings/ejdb2_android/test) / [React Native](https://github.com/Softmotions/ejdb/tree/master/src/bindings/ejdb2_react_native) / [Flutter](https://github.com/Softmotions/ejdb/tree/master/src/bindings/ejdb2_flutter) integration
* Simple but powerful query language (JQL) as well as support of the following standards:
* [rfc6902](https://tools.ietf.org/html/rfc6902) JSON Patch
* [rfc7386](https://tools.ietf.org/html/rfc7386) JSON Merge patch
* [rfc6901](https://tools.ietf.org/html/rfc6901) JSON Path
* [Support of collection joins](#jql-collection-joins)
* Powered by [iowow.io](http://iowow.io) - The persistent key/value storage engine
* Provides HTTP REST/Websockets network endpoints with help of [facil.io](http://facil.io)
* JSON documents are stored in using fast and compact [binn](https://github.com/liteserver/binn) binary format
---
* [Native language bindings](#native-language-bindings)
* Supported platforms
* [OSX](#osx)
* [iOS](https://github.com/Softmotions/EJDB2Swift)
* [Linux](#linux)
* [Android](#android)
* [Windows](#windows)
* **[JQL query language](#jql)**
* [Grammar](#jql-grammar)
* [Quick into](#jql-quick-introduction)
* [Data modification](#jql-data-modification)
* [Projections](#jql-projections)
* [Collection joins](#jql-collection-joins)
* [Sorting](#jql-sorting)
* [Query options](#jql-options)
* [Indexes and performance](#jql-indexes-and-performance-tips)
* [Network API](#http-restwebsocket-api-endpoint)
* [HTTP API](#http-api)
* [Websockets API](#websocket-api)
* [C API](#c-api)
* [License](#license)
---
## EJDB2 platforms matrix
| | Linux | macOS | iOS | Android | Windows |
| --- | --- | --- | --- | --- | --- |
| C library | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark:<sup>1</sup> |
| NodeJS | :heavy_check_mark: | :heavy_check_mark: | | | :x:<sup>3</sup> |
| DartVM | :heavy_check_mark: | :heavy_check_mark:<sup>2</sup> | | | :x:<sup>3</sup> |
| Flutter | | | :heavy_check_mark: | :heavy_check_mark: | |
| React Native | | | :x:<sup>4</sup> | :heavy_check_mark: | |
| Swift | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | | |
| Java | :heavy_check_mark: | :heavy_check_mark: | | :heavy_check_mark: | :heavy_check_mark:<sup>2</sup> |
<br> `[1]` No HTTP/Websocket support [#257](https://github.com/Softmotions/ejdb/issues/257)
<br> `[2]` Binaries are not distributed with dart `pub.` You can build it [manually](https://github.com/Softmotions/ejdb/tree/master/src/bindings/ejdb2_node#how-build-it-manually)
<br> `[3]` Can be build, but needed a linkage with windows node/dart `libs`.
<br> `[4]` Porting in progress [#273](https://github.com/Softmotions/ejdb/issues/273)
## Native language bindings
* [NodeJS](https://www.npmjs.com/package/ejdb2_node)
* [Dart](https://pub.dartlang.org/packages/ejdb2_dart)
* [Java](https://github.com/Softmotions/ejdb/blob/master/src/bindings/ejdb2_jni/README.md)
* [Android support](#android)
* [Swift | iOS](https://github.com/Softmotions/EJDB2Swift)
* [React Native](https://github.com/Softmotions/ejdb/tree/master/src/bindings/ejdb2_react_native)
* [Flutter](https://github.com/Softmotions/ejdb/tree/master/src/bindings/ejdb2_flutter)
### Unofficial EJDB2 language bindings
* .Net
* https://github.com/kmvi/ejdb2-csharp
* Haskell
* https://github.com/cescobaz/ejdb2haskell
* https://hackage.haskell.org/package/ejdb2-binding
* [Pharo](https://pharo.org)
* https://github.com/pharo-nosql/pharo-ejdb
* Lua
* https://github.com/chriku/ejdb-lua
## Status
* **EJDB 2.0 core engine is well tested and used in various heavily loaded deployments**
* Tested on `Linux` and `OSX` platforms. [Limited Windows support](./WINDOWS.md)
* Old EJDB 1.x version can be found in separate [ejdb_1.x](https://github.com/Softmotions/ejdb/tree/ejdb_1.x) branch.
We are not maintaining ejdb 1.x.
## Use cases
* Softmotions trading robots platform
* [Gimme - a social toy tokens exchange mobile application.](https://play.google.com/store/apps/details?id=com.softmotions.gimme) EJDB2 is used both on mobile and server sides.
Are you using EJDB? [Let me know!](mailto:info@softmotions.com)
## macOS / OSX
EJDB2 code ported and tested on `High Sierra` / `Mojave` / `Catalina`
See also [EJDB2 Swift binding](https://github.com/Softmotions/EJDB2Swift) for OSX, iOS and Linux
```
brew install ejdb
```
or
```
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make install
```
## Linux
### Ubuntu/Debian
#### PPA repository
```sh
sudo add-apt-repository ppa:adamansky/ejdb2
sudo apt-get update
sudo apt-get install ejdb2
```
#### Building debian packages
cmake v3.15 or higher required
```sh
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DPACKAGE_DEB=ON
make package
```
#### RPM based Linux distributions
```sh
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DPACKAGE_RPM=ON
make package
```
## Windows
EJDB2 can be cross-compiled for windows
**Note:** HTTP/Websocket network API is disabled and not supported
on Windows until port of http://facil.io library (#257)
Nodejs/Dart bindings not yet ported to Windows.
**[Cross-compilation Guide for Windows](./WINDOWS.md)**
+129
View File
@@ -0,0 +1,129 @@
#Copyright (c) 2019-2021 Huawei Device Co., Ltd.
#Licensed under the Apache License, Version 2.0 (the "License");
#you may not use this file except in compliance with the License.
#You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
#Unless required by applicable law or agreed to in writing, software
#distributed under the License is distributed on an "AS IS" BASIS,
#WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#See the License for the specific language governing permissions and
#limitations under the License.
import("//build/ohos.gni")
iowow_src_dir = "//third_party/iowow/src"
action("copy_iowow_header") {
visibility = [ ":*" ]
script = "copy_iowow_header.py"
inputs = []
outputs = [
"$target_gen_dir/ejdb2/iowow/basedefs.h",
"$target_gen_dir/ejdb2/iowow/iowow.h",
"$target_gen_dir/ejdb2/iowow/iwarr.h",
"$target_gen_dir/ejdb2/iowow/iwbits.h",
"$target_gen_dir/ejdb2/iowow/iwconv.h",
"$target_gen_dir/ejdb2/iowow/iwdlsnr.h",
"$target_gen_dir/ejdb2/iowow/iwexfile.h",
"$target_gen_dir/ejdb2/iowow/iwfile.h",
"$target_gen_dir/ejdb2/iowow/iwfsmfile.h",
"$target_gen_dir/ejdb2/iowow/iwhmap.h",
"$target_gen_dir/ejdb2/iowow/iwkv.h",
"$target_gen_dir/ejdb2/iowow/iwlog.h",
"$target_gen_dir/ejdb2/iowow/iwp.h",
"$target_gen_dir/ejdb2/iowow/iwpool.h",
"$target_gen_dir/ejdb2/iowow/iwrdb.h",
"$target_gen_dir/ejdb2/iowow/iwsha2.h",
"$target_gen_dir/ejdb2/iowow/iwstree.h",
"$target_gen_dir/ejdb2/iowow/iwstw.h",
"$target_gen_dir/ejdb2/iowow/iwth.h",
"$target_gen_dir/ejdb2/iowow/iwtp.h",
"$target_gen_dir/ejdb2/iowow/iwutils.h",
"$target_gen_dir/ejdb2/iowow/iwuuid.h",
"$target_gen_dir/ejdb2/iowow/iwxstr.h",
"$target_gen_dir/ejdb2/iowow/murmur3.h",
]
args = [
"--src-dir",
rebase_path(iowow_src_dir),
"--dst-dir",
rebase_path("$target_gen_dir/ejdb2/iowow"),
]
}
config("ejdb_config") {
include_dirs = [
"src",
"src/jbi",
"src/jbl",
"src/jql",
"src/util",
"$target_gen_dir",
]
cflags = [
"-DNDEBUG",
"-O3",
"-Wall",
"-Wextra",
"-Wfatal-errors",
"-Wno-implicit-fallthrough",
"-Wno-missing-braces",
"-Wno-missing-field-initializers",
"-Wno-shorten-64-to-32",
"-Wno-sign-compare",
"-Wno-unknown-pragmas",
"-Wno-unused-function",
"-Wno-unused-parameter",
"-fPIC",
"-fsigned-char",
"-pedantic",
"-std=gnu11",
]
defines = [
"IW_64",
"IW_API_EXPORTS",
#"JB_HAVE_QSORT_R",
"JB_PTHREADS",
"_DEFAULT_SOURCE",
"_FILE_OFFSET_BITS=64",
"_LARGEFILE_SOURCE",
"_XOPEN_SOURCE=600",
]
}
ohos_shared_library("ejdb") {
configs = [ ":ejdb_config" ]
public_configs = [ ":ejdb_config" ]
sources = [
"src/ejdb2.c",
"src/jbi/jbi_consumer.c",
"src/jbi/jbi_dup_scanner.c",
"src/jbi/jbi_full_scanner.c",
"src/jbi/jbi_pk_scanner.c",
"src/jbi/jbi_selection.c",
"src/jbi/jbi_sorter_consumer.c",
"src/jbi/jbi_uniq_scanner.c",
"src/jbi/jbi_util.c",
"src/jbl/binn.c",
"src/jbl/jbl.c",
"src/jbl/jbl_json.c",
"src/jql/jql.c",
"src/jql/jqp.c",
"src/util/lwre.c",
"src/util/utf8proc.c",
]
deps = [
":copy_iowow_header",
"//third_party/iowow:iowow",
]
part_name = "hiview"
subsystem_name = "hiviewdfx"
}
+98
View File
@@ -0,0 +1,98 @@
# C API
EJDB can be embedded into any `C/C++` application.
`C API` documented in the following headers:
* [ejdb.h](https://github.com/Softmotions/ejdb/blob/master/src/ejdb2.h) Main API functions
* [jbl.h](https://github.com/Softmotions/ejdb/blob/master/src/jbl/jbl.h) JSON documents management API
* [jql.h](https://github.com/Softmotions/ejdb/blob/master/src/jql/jql.h) Query building API
Example application:
```c
#include <ejdb2/ejdb2.h>
#define CHECK(rc_) \
if (rc_) { \
iwlog_ecode_error3(rc_); \
return 1; \
}
static iwrc documents_visitor(EJDB_EXEC *ctx, const EJDB_DOC doc, int64_t *step) {
// Print document to stderr
return jbl_as_json(doc->raw, jbl_fstream_json_printer, stderr, JBL_PRINT_PRETTY);
}
int main() {
EJDB_OPTS opts = {
.kv = {
.path = "example.db",
.oflags = IWKV_TRUNC
}
};
EJDB db; // EJDB2 storage handle
int64_t id; // Document id placeholder
JQL q = 0; // Query instance
JBL jbl = 0; // Json document
iwrc rc = ejdb_init();
CHECK(rc);
rc = ejdb_open(&opts, &db);
CHECK(rc);
// First record
rc = jbl_from_json(&jbl, "{\"name\":\"Bianca\", \"age\":4}");
RCGO(rc, finish);
rc = ejdb_put_new(db, "parrots", jbl, &id);
RCGO(rc, finish);
jbl_destroy(&jbl);
// Second record
rc = jbl_from_json(&jbl, "{\"name\":\"Darko\", \"age\":8}");
RCGO(rc, finish);
rc = ejdb_put_new(db, "parrots", jbl, &id);
RCGO(rc, finish);
jbl_destroy(&jbl);
// Now execute a query
rc = jql_create(&q, "parrots", "/[age > :age]");
RCGO(rc, finish);
EJDB_EXEC ux = {
.db = db,
.q = q,
.visitor = documents_visitor
};
// Set query placeholder value.
// Actual query will be /[age > 3]
rc = jql_set_i64(q, "age", 0, 3);
RCGO(rc, finish);
// Now execute the query
rc = ejdb_exec(&ux);
finish:
jql_destroy(&q);
jbl_destroy(&jbl);
ejdb_close(&db);
CHECK(rc);
return 0;
}
```
Compile and run:
```
gcc -std=gnu11 -Wall -pedantic -c -o example1.o example1.c
gcc -o example1 example1.o -lejdb2
./example1
{
"name": "Darko",
"age": 8
}{
"name": "Bianca",
"age": 4
}
```
+204
View File
@@ -0,0 +1,204 @@
cmake_minimum_required(VERSION 3.5)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/")
include(CMakeToolsHelpers OPTIONAL)
set(DEB_CHANGELOG_REQUIRED ON)
set(DEB_CHANGELOG "${CMAKE_CURRENT_SOURCE_DIR}/Changelog")
unset(CHANGELOG_LAST_VERSION)
unset(CHANGELOG_LAST_MESSAGE)
include(DebChangelog)
set(PROJECT_NAME "ejdb2")
project(${PROJECT_NAME} C)
set(PROJECT_VENDOR "Softmotions (https://softmotions.com)")
set(PROJECT_WEBSITE "http://ejdb.org")
set(PROJECT_MAINTAINER "Anton Adamansky <adamansky@gmail.com>")
set(PROJECT_DESCRIPTION_SUMMARY
"Embeddable JSON database engine with network support (EJDB2).")
set(PROJECT_DESCRIPTION
"Embeddable JSON database engine with network support (EJDB2).")
set(CHANGELOG_MESSAGE ${CHANGELOG_LAST_MESSAGE})
set(PROJECT_PPA "ppa:adamansky/ejdb2")
set(PROJECT_PPA_USER "adamansky")
set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED "NO")
set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "")
set(PROJECT_VERSION_MAJOR ${CHANGELOG_LAST_VERSION_MAJOR})
set(PROJECT_VERSION_MINOR ${CHANGELOG_LAST_VERSION_MINOR})
set(PROJECT_VERSION_PATCH ${CHANGELOG_LAST_VERSION_PATCH})
set(PROJECT_VERSION
${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH})
set(${PROJECT_NAME}_VERSION ${PROJECT_VERSION})
set(${PROJECT_NAME}_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
set(${PROJECT_NAME}_VERSION_MINOR ${PROJECT_VERSION_MINOR})
set(${PROJECT_NAME}_VERSION_PATCH ${PROJECT_VERSION_PATCH})
option(BUILD_SHARED_LIBS "Build shared libraries" ON)
option(ENABLE_HTTP "Enable HTTP endpoint and standalone server (jbs)" ON)
option(BUILD_TESTS "Build test cases" OFF)
option(ASAN "Turn on address sanitizer" OFF)
option(BUILD_EXAMPLES "Build example projects" ON)
option(BUILD_BENCHMARKS "Build benchmarks" OFF)
option(BUILD_JNI_BINDING "Build Java native binding" OFF)
option(BUILD_ANDROID_LIBS "Build Android libs" OFF)
option(BUILD_DART_BINDING "Build Dart VM binding" OFF)
option(BUILD_NODEJS_BINDING "Build Node.js binding" OFF)
option(BUILD_REACT_NATIVE_BINDING "Build React Native binding" OFF)
option(BUILD_FLUTTER_BINDING "Build Flutter binding" OFF)
option(BUILD_SWIFT_BINDING "Build Swift binding" OFF)
option(PACKAGE_DEB "Build .deb instalation packages" OFF)
option(PACKAGE_RPM "Build .rpm instalation packages" OFF)
option(PACKAGE_TGZ "Build .tgz package archive" ON)
option(PACKAGE_ZIP "Build .zip package archive" ON)
option(ENABLE_PPA "Enable PPA package build" OFF)
option(UPLOAD_PPA "Upload debian packages to the launchpad ppa repository" OFF)
set(PPA_DEBIAN_VERSION
"ppa1"
CACHE STRING "PPA version suffix for debian packages")
set(PROJECT_PPA_DISTRIB_TARGET
"focal;bionic;xenial"
CACHE STRING "Ubuntu PPA distribution names")
set(ANDROID_ABIS
"x86;x86_64;arm64-v8a;armeabi-v7a"
CACHE STRING "Android ABI list")
set(ANDROID_AVD
"TestingAVD"
CACHE STRING "Android virtual device name for tests")
set(CPACK_SET_DESTDIR ON)
if(POLICY CMP0042)
cmake_policy(SET CMP0042 NEW)
endif(POLICY CMP0042)
if(POLICY CMP0087)
cmake_policy(SET CMP0087 NEW)
endif(POLICY CMP0087)
if(BUILD_REACT_NATIVE_BINDING
OR BUILD_FLUTTER_BINDING
OR BUILD_ANDROID_LIBS)
set(ENABLE_HTTP OFF)
set(BUILD_ANDROID_LIBS ON)
endif()
if(ANDROID_ABI OR IOS)
set(ENABLE_HTTP OFF)
endif()
if(DEFINED CMAKE_TOOLCHAIN_FILE)
get_filename_component(_CMAKE_TOOLCHAIN_FILE ${CMAKE_TOOLCHAIN_FILE} ABSOLUTE)
set(CMAKE_TOOLCHAIN_FILE ${_CMAKE_TOOLCHAIN_FILE})
endif()
include(GitRevision)
include(GNUInstallDirs)
include(ProjectUtils)
macro_ensure_out_of_source_build(
"${CMAKE_PROJECT_NAME} requires an out of source build.")
if(BUILD_TESTS)
include(CTest)
find_package(CUnit REQUIRED)
endif(BUILD_TESTS)
if(UPLOAD_PPA)
set(ENABLE_PPA ON)
set(PACKAGE_DEB ON)
endif(UPLOAD_PPA)
set(CPACK_GENERATORS)
if(PACKAGE_TGZ)
list(APPEND CPACK_GENERATORS "TGZ")
endif()
if(PACKAGE_ZIP)
list(APPEND CPACK_GENERATORS "ZIP")
endif()
if(PACKAGE_DEB)
list(APPEND CPACK_GENERATORS "DEB")
endif()
if(PACKAGE_RPM)
list(APPEND CPACK_GENERATORS "RPM")
endif()
if(NOT
(CPACK_GENERATORS
AND (BUILD_JNI_BINDING
OR BUILD_DART_BINDING
OR BUILD_NODEJS_BINDING)))
set(DO_INSTALL_CORE ON)
endif()
add_subdirectory(man)
if(NOT ENABLE_PPA)
add_subdirectory(src)
endif()
if(CPACK_GENERATORS)
set(CPACK_GENERATOR "${CPACK_GENERATORS}")
set(CPACK_SOURCE_IGNORE_FILES
"/src/bindings/ejdb2_android"
"/src/bindings/ejdb2_dart"
"/src/bindings/ejdb2_flutter"
"/src/bindings/ejdb2_node"
"/src/bindings/ejdb2_react_native"
"/src/bindings/ejdb2_swift"
"/mxe/"
"/build/"
"/target/"
"/tools/"
"/docker/"
"/node_modules/"
"/cmake-.*/"
"/Makefile$"
"hints\\\\.txt$"
"/\\\\.clang/"
"/\\\\.codelite/"
"/\\\\.git/"
"/\\\\.idea/"
"/\\\\.settings/"
"/\\\\.vscode/"
"\\\\.classpath$"
"\\\\.editorconfig$"
"\\\\.iml$"
"\\\\.ipr$"
"\\\\.log$"
"\\\\.mk$"
"\\\\.project$"
"\\\\.workspace$"
"\\\\.astylerc$"
"uncrustify\\\\.cfg")
set(PROJECT_ARCH "${CMAKE_SYSTEM_PROCESSOR}")
add_subdirectory(installer)
endif(CPACK_GENERATORS)
message("${PROJECT_NAME} GIT_REVISION: ${GIT_REVISION}")
message("${PROJECT_NAME} CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX}")
message("${PROJECT_NAME} CPACK_GENERATORS: ${CPACK_GENERATORS}")
message("${PROJECT_NAME} CMAKE_GENERATOR: ${CMAKE_GENERATOR}")
if(MXE_HOME)
message("${PROJECT_NAME} MXE_HOME: ${MXE_HOME}")
endif()
if(CMAKE_SYSTEM_NAME)
message("${PROJECT_NAME} CMAKE_SYSTEM_NAME: ${CMAKE_SYSTEM_NAME}")
endif()
message("${PROJECT_NAME} CPU: ${CMAKE_SYSTEM_PROCESSOR}")
if(CMAKE_SIZEOF_VOID_P)
message("${PROJECT_NAME} SIZEOF *VOID: ${CMAKE_SIZEOF_VOID_P}")
endif()
message("${PROJECT_NAME} PROJECT: ${CHANGELOG_LAST_LINE}")
if(CHANGELOG_MESSAGE)
message("${PROJECT_NAME} CHANGELOG_MESSAGE:\n ${CHANGELOG_MESSAGE}")
endif()
+457
View File
@@ -0,0 +1,457 @@
ejdb2 (2.0.59) testing; urgency=medium
* Fixed some uninitialized data issues with `jbl_clone()`
* Added ejdb_put_new_jbn() (ejdb2.h)
* jbs: Default database file name changed from db.jb to ejdb2.db
* Added jbl_from_json_printf_va(), jbn_from_json_printf_va() (jbl.h)
* Project code reformatted using uncrustify
* Updated copyright headers
* Removed dependency on some glibc specific features
* Added jbl_object_copy_to() (ejdb2.h)
* Added new convenient methods (ejdb2.h)
- ejdb_patch_jbn()
- ejdb_patch_jbl()
- ejdb_merge_or_put_jbn()
- ejdb_merge_or_put_jbl()
-- Anton Adamansky <adamansky@gmail.com> Sun, 21 Mar 2021 22:17:40 +0700
ejdb2 (2.0.58) testing; urgency=medium
* New versioning scheme is used for ejdb2 bindings.
* Fixed pub publish issues with dart and flutter bindings.
* Upgraded to iwkv v1.4.10
-- Anton Adamansky <adamansky@gmail.com> Tue, 22 Dec 2020 22:33:24 +0700
ejdb2 (2.0.57) testing; urgency=medium
* Added new non standard JSON `swap` operation.
* bugfix: Incorrect behavior of JSON patch `move` operation.
* Added --trylock option to jbs
* jbs server CLI should be able to load access token from file (#219)
* bugfix: Updated to iowow v1.4.10 with fix https://github.com/Softmotions/iowow/issues/35
* enhancement: EJDB2 Java binding improvements.
-- Anton Adamansky <adamansky@gmail.com> Thu, 17 Dec 2020 23:12:37 +0700
ejdb2 (2.0.56) testing; urgency=medium
* EJDB2 Java binding improvements.
* Added EJDB2 Maven example project and maven repository deployment.
-- Anton Adamansky <adamansky@gmail.com> Thu, 10 Dec 2020 00:27:09 +0700
ejdb2 (2.0.55) testing; urgency=medium
* EJDB2 Java binding now in Ubuntu ppa:adamansky/ejdb2
* Build scripts refactoring.
* Reduced number of WS server threads to half of available CPU Cores.
-- Anton Adamansky <adamansky@gmail.com> Sun, 06 Dec 2020 22:16:20 +0700
ejdb2 (2.0.54) testing; urgency=medium
* CRITICAL: Fixed incorrect behavior of `_jbl_cmp_atomic_values`
which leads to inconsitent number indexes processing.
* Transfered `-DASAN` to `AddIOWOW` CMake module.
-- Anton Adamansky <adamansky@gmail.com> Thu, 19 Nov 2020 23:33:44 +0700
ejdb2 (2.0.53) testing; urgency=medium
* Upgraded to iowow v1.4.9
* Eliminate duplicated documents from non-inique index scanning
* Add prefix matching operator ~ (#292)
-- Anton Adamansky <adamansky@gmail.com> Wed, 18 Nov 2020 16:00:16 +0700
ejdb2 (2.0.52) testing; urgency=medium
* Fixed serios bug concerning non-unique indexes, details: (#291)
* Dart binding: support of the latest Dart pub
* Added `jbn_add_item_null()` (jbl.h)
* SIGSEGV, Segmentation fault (#287)
* Upgraded to facil.io 0.7.5
* Code cleanup
-- Anton Adamansky <adamansky@gmail.com> Sun, 08 Nov 2020 22:04:58 +0700
ejdb2 (2.0.51) testing; urgency=medium
* Upgraded to iowow v1.4.7
* Added `jbl_from_json_printf()` and `jbn_from_json_printf()` (jbl.h)
* Added JQL `upsert` operation
* Typo fixed (jbl.c)
* `jbl_get_str()` now returns `const char*` (jbl.h)
* Added `jbl_set_user_data()` (jbl.h)
* Removed disable int compression feature from binn implementation (binn.c)
-- Anton Adamansky <adamansky@gmail.com> Mon, 21 Sep 2020 12:45:01 +0700
ejdb2 (2.0.50) testing; urgency=medium
* Better floating point numbers comparison in `jbn_compare_nodes()` (jbl.h)
* Fixed error in `jbn_copy_path()` if some source property doesn't exist (jbl.h)
* Added `jbn_length()` (jbl.h)
* Added `lwre.h` to set of public headers
* Added `node_out` for every `jbn_add_item_X()` (jbl.h)
* Fixed compilation error on clang-10
* Fixed ejdb2_jni to be java-8 compatible
* Fixed ejdb2_jni to be headless JDK compatible
-- Anton Adamansky <adamansky@gmail.com> Wed, 24 Jun 2020 20:42:46 +0700
ejdb2 (2.0.49) testing; urgency=medium
* Added ability to specify array of primary key values in `/=:?` query clause.
-- Anton Adamansky <adamansky@gmail.com> Sun, 17 May 2020 01:21:02 +0700
ejdb2 (2.0.48) testing; urgency=medium
* Implemented collection JOINs (#280)
-- Anton Adamansky <adamansky@gmail.com> Fri, 15 May 2020 14:22:08 +0700
ejdb2 (2.0.47) testing; urgency=medium
* Added ability to specify constraints on internal primary key in query (#281)
* Added `jbn_copy_paths` (jbl.h)
-- Anton Adamansky <adamansky@gmail.com> Fri, 08 May 2020 23:23:53 +0700
ejdb2 (2.0.46) testing; urgency=medium
* Upgraded to iowow v1.4.4
* Added `jbn_paths_compare()` (jbl.h)
* Added `no_src_clone` parameter `jbn_copy_path` (jbl.h)
-- Anton Adamansky <adamansky@gmail.com> Sat, 02 May 2020 19:43:36 +0700
ejdb2 (2.0.45) testing; urgency=medium
* Fixed errors found by PVS studio
* Added two variants of `jbn_detach` (jbl.h)
* Added non standard JSON patch operation: `add_create` (jbl.h)
* Added `jbl_from_node` (jbl.h)
* Added `jbn_copy_path` (jbl.h)
* Added `jbn_add_item_obj` (jbl.h)
* Added `jbn_add_item_arr` (jbl.h)
* Minor refactoring of jbl module
* Added a set of jbn_add_x (jbl.h)
-- Anton Adamansky <adamansky@gmail.com> Fri, 24 Apr 2020 02:20:32 +0700
ejdb2 (2.0.44) testing; urgency=medium
* Fixed missing parent pointer link in `_jbl_add_item` (jbl_json.c).
* Added `jbn_clone()` (jbl.h)
* Added checks for max nesting level of JSON objects, 1000 by default.
* Added `jbl_clone(JBL src, JBL *targetp)` (jbl.h)
* Added `jbl_merge_patch_jbl(JBL jbl, JBL patch)` (jbl.h)
* Added `jbl_set_string_printf()` (jbl.h)
* Added `jbl_structure_size()` (jbl.h)
* Better error handling of `kh_put()`
* Added `jbl_clone_into_pool(JBL src, IWPOOL *pool, JBL *targetp)` (jbl.h)
* Added jbn_path_compare, jbn_path_compare_str, jbn_path_compare_bool,
jbn_path_compare_i64, jbn_path_compare_f64 (jbl.h)
-- Anton Adamansky <adamansky@gmail.com> Mon, 20 Apr 2020 16:24:41 +0700
ejdb2 (2.0.43) testing; urgency=medium
* Upgraded to iowow v1.4.1
-- Anton Adamansky <adamansky@gmail.com> Sat, 07 Mar 2020 23:39:40 +0700
ejdb2 (2.0.42) testing; urgency=medium
* Upgraded to iowow v1.4.0
-- Anton Adamansky <adamansky@gmail.com> Sat, 07 Mar 2020 11:16:10 +0700
ejdb2 (2.0.41) testing; urgency=medium
* Fixed race condition on database open on slow devices
-- Anton Adamansky <adamansky@gmail.com> Tue, 18 Feb 2020 18:55:57 +0700
ejdb2 (2.0.40) testing; urgency=medium
* Added `jbl_object_get_i64`, `jbl_object_get_f64`,
`jbl_object_get_bool`, `jbl_object_get_str`
* Minor fixes in index selection rules
* Added `jbl_type_t jbl_object_get_type(JBL jbl, const char *key)` (jbl.h)
* Upgraded to iowow 1.3.37
-- Anton Adamansky <adamansky@gmail.com> Mon, 17 Feb 2020 23:38:24 +0700
ejdb2 (2.0.39) testing; urgency=medium
* Added iwrc jbn_at(JBL_NODE node, const char *path, JBL_NODE *res)
* Added iwrc jbn_at2(JBL_NODE node, JBL_PTR jp, JBL_NODE *res)
* Added `jbl_set_int64`, `jbl_set_f64`, `jbl_set_string`, `jbl_set_nested` (jbl.h)
* Added `jbl_set_bool`, `jbl_set_null` (jbl.h)
* Added `jbl_set_empty_array`, `jbl_set_empty_object` (jbl.h)
* Safer `jql_destroy` (jql.h)
* Added `jql_set_json_jbl` (jql.h)
* Added `ejdb_count` (ejdb2.h)
* Fixed `_jbl_create_patch` issues
-- Anton Adamansky <adamansky@gmail.com> Wed, 22 Jan 2020 16:13:20 +0700
ejdb2 (2.0.38) testing; urgency=medium
* FIXED: In the case of apply/projection `ejdb_list` returned old (not updated) documents
* Added `iwrc ejdb_get_iwkv(EJDB db, IWKV *kvp)` (ejdb2.h)
* Added non standart JSON patch extension: `increment`
-- Anton Adamansky <adamansky@gmail.com> Fri, 17 Jan 2020 18:23:56 +0700
ejdb2 (2.0.37) testing; urgency=medium
* Upgraded to iowow v1.3.35
* Fixed wal related durability issue
-- Anton Adamansky <adamansky@gmail.com> Wed, 15 Jan 2020 13:19:06 +0700
ejdb2 (2.0.36) testing; urgency=medium
* Implemented Swift language binding #267
* Ported to iOS
* Upgraded to iowow 1.3.34
* Upgraded to facil.io 0.7.4
* Improved ejdb2.h documentation
-- Anton Adamansky <adamansky@gmail.com> Mon, 06 Jan 2020 23:20:38 +0700
ejdb2 (2.0.35) testing; urgency=medium
* FIXED: JQL apply ignores value set by placeholder (#269)
-- Anton Adamansky <adamansky@gmail.com> Tue, 10 Dec 2019 21:12:43 +0700
ejdb2 (2.0.34) testing; urgency=medium
* Reduced library size by 400K: stripped off unused utf8proc data
-- Anton Adamansky <adamansky@gmail.com> Thu, 05 Dec 2019 12:01:59 +0700
ejdb2 (2.0.33) testing; urgency=medium
* Added ejdb_merge_or_put atomic method #268
* Added getOrNull to node/react bindings
-- Anton Adamansky <adamansky@gmail.com> Wed, 04 Dec 2019 17:34:01 +0700
ejdb2 (2.0.32) testing; urgency=medium
* Upgraded to iowow v1.3.31
-- Anton Adamansky <adamansky@gmail.com> Wed, 04 Dec 2019 17:33:20 +0700
ejdb2 (2.0.31) testing; urgency=medium
* Upgraded to iowow v1.3.30
-- Anton Adamansky <adamansky@gmail.com> Tue, 19 Nov 2019 20:40:29 +0700
ejdb2 (2.0.30) testing; urgency=medium
* Upgraded to iowow v1.3.29
-- Anton Adamansky <adamansky@gmail.com> Fri, 15 Nov 2019 13:55:03 +0700
ejdb2 (2.0.29) testing; urgency=medium
* Upgraded to iowow v1.3.27
* React Native binding implemented (Android)
-- Anton Adamansky <adamansky@gmail.com> Mon, 04 Nov 2019 21:52:07 +0700
ejdb2 (2.0.28) testing; urgency=medium
* Upgraded to facil.io v0.7.3
* JBS server functions removed from ejdb2 target libs
-- Anton Adamansky <adamansky@gmail.com> Fri, 27 Sep 2019 18:26:57 +0700
ejdb2 (2.0.27) testing; urgency=medium
* Upgraded to iowow v1.3.25 with critical fixes
-- Anton Adamansky <adamansky@gmail.com> Thu, 29 Aug 2019 12:46:41 +0700
ejdb2 (2.0.26) testing; urgency=medium
* Upgraded to iowow v1.3.24
-- Anton Adamansky <adamansky@gmail.com> Thu, 22 Aug 2019 02:16:50 +0700
ejdb2 (2.0.25) testing; urgency=medium
* ejdb2_dart: Fixed memory leak in dart binding
* Upgraded to iowow 1.3.23
-- Anton Adamansky <adamansky@gmail.com> Sat, 17 Aug 2019 21:27:29 +0700
ejdb2 (2.0.24) testing; urgency=medium
* Strip shared libraries for release builds.
-- Anton Adamansky <adamansky@gmail.com> Thu, 25 Jul 2019 21:09:00 +0700
ejdb2 (2.0.23) testing; urgency=medium
* BUG: Fixed incorrect behavior of `jbi_ftoa`
-- Anton Adamansky <adamansky@gmail.com> Fri, 19 Jul 2019 05:55:16 +0700
ejdb2 (2.0.22) testing; urgency=medium
* Limited windows support without HTTP/Websocket network API (#237)
* `static_assert` is set to `_Static_assert` if not defined
* All uses of `iwftoa` replaced by `jbi_ftoa`
-- Anton Adamansky <adamansky@gmail.com> Thu, 18 Jul 2019 19:27:26 +0700
ejdb2 (2.0.21) testing; urgency=medium
* Added `ejdb_rename_collection` method (#254)
-- Anton Adamansky <adamansky@gmail.com> Fri, 12 Jul 2019 12:39:32 +0700
ejdb2 (2.0.20) testing; urgency=medium
* Node.js binding (#248)
* Added git revision hash getter `ejdb_git_revision()` (ejdb2.h)
* Better error reporting on failed memory allocations
-- Anton Adamansky <adamansky@gmail.com> Wed, 03 Jul 2019 19:36:46 +0700
ejdb2 (2.0.19) testing; urgency=medium
* Upgraded to iowow v1.3.20 with critical fixes
-- Anton Adamansky <adamansky@gmail.com> Thu, 13 Jun 2019 22:04:27 +0700
ejdb2 (2.0.18) testing; urgency=medium
* Limit one time file allocation step to 2G iowow v1.3.18
* Added Docker image (#249)
* Better qsort_t detection, build ok with `musl`
-- Anton Adamansky <adamansky@gmail.com> Wed, 12 Jun 2019 16:48:57 +0700
ejdb2 (2.0.17) testing; urgency=medium
* Added `inverse` JQL query option.
-- Anton Adamansky <adamansky@gmail.com> Wed, 05 Jun 2019 23:15:09 +0700
ejdb2 (2.0.16) testing; urgency=medium
* Allowed dash and underscope chars in collection names specified in query: `[@collection_name]/query`.
* Fixed minor typo in ejdb2_jni/src/CMakeLists.txt
-- Anton Adamansky <adamansky@gmail.com> Wed, 05 Jun 2019 19:14:38 +0700
ejdb2 (2.0.15) testing; urgency=medium
* Security: a heap-overflow vulnerability was fixed in the WebSocket parser of facil.io library
-- Anton Adamansky <adamansky@gmail.com> Mon, 27 May 2019 13:33:03 +0700
ejdb2 (2.0.14) testing; urgency=medium
* Android support
* Test cases for Android JNI binding
-- Anton Adamansky <adamansky@gmail.com> Fri, 17 May 2019 00:57:11 +0700
ejdb2 (2.0.13) testing; urgency=medium
* Upgraded to iowow_1.3.17 with critical fixes
-- Anton Adamansky <adamansky@gmail.com> Fri, 03 May 2019 18:27:10 +0700
ejdb2 (2.0.12) testing; urgency=medium
* Upgraded to iowow_1.3.16 with critical fixes
-- Anton Adamansky <adamansky@gmail.com> Fri, 03 May 2019 11:59:56 +0700
ejdb2 (2.0.11) testing; urgency=medium
* Upgraded to iowow_1.3.15 with critical fixes
-- Anton Adamansky <adamansky@gmail.com> Wed, 01 May 2019 23:34:20 +0700
ejdb2 (2.0.10) testing; urgency=medium
* CRITICAL: Fixed unexpected database file truncation and data loss on close.
* Upgraded to iowow 1.3.14
-- Anton Adamansky <adamansky@gmail.com> Sat, 27 Apr 2019 01:12:15 +0700
ejdb2 (2.0.9) testing; urgency=medium
* Upgraded to iowow 1.3.13
* Building Native JNI binding on Android
* ejdb2_dart: Added notFound,invalidQuery to EJDB2Error
-- Anton Adamansky <adamansky@gmail.com> Thu, 25 Apr 2019 17:47:16 +0700
ejdb2 (2.0.8) testing; urgency=medium
* Remove redundant memory coping in ejdb_put()
-- Anton Adamansky <adamansky@gmail.com> Sun, 21 Apr 2019 14:38:08 +0700
ejdb2 (2.0.7) testing; urgency=medium
* Fixed deadlock condition with OSX pthread rwlocks.
* Phreads `PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP` is used by default
-- Anton Adamansky <adamansky@gmail.com> Sun, 21 Apr 2019 12:20:27 +0700
ejdb2 (2.0.6) testing; urgency=medium
* Java JNI binding implemented (#243)
* Stability: `jql_create` takes own copy of `coll` argument
* Documentation improvements
-- Anton Adamansky <adamansky@gmail.com> Fri, 19 Apr 2019 17:30:12 +0700
ejdb2 (2.0.5) testing; urgency=medium
* Library ported to OSX
* Library ported to Android NDK (#244)
-- Anton Adamansky <adamansky@gmail.com> Mon, 15 Apr 2019 11:28:30 +0700
ejdb2 (2.0.4) testing; urgency=medium
* Landed DartVM binding https://pub.dartlang.org/packages/ejdb2_dart
* Minors API enhancements
-- Anton Adamansky <adamansky@gmail.com> Tue, 09 Apr 2019 01:55:42 +0700
ejdb2 (2.0.3) testing; urgency=medium
* Fixed #238 Disable network access for PPA Lunchpad builds
* Removed gcc `-fvisibility=hidden` from shared lib flag
-- Anton Adamansky <adamansky@gmail.com> Wed, 03 Apr 2019 17:39:52 +0700
ejdb2 (2.0.1) testing; urgency=medium
* Because we are static linked to iowow its header files included under `include/ejdb2/iowow`
-- Anton Adamansky <adamansky@gmail.com> Tue, 02 Apr 2019 12:38:32 +0700
ejdb2 (2.0.0) testing; urgency=medium
* Initial beta release
-- Anton Adamansky <adamansky@gmail.com> Mon, 01 Apr 2019 20:21:27 +0700
+21
View File
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2012-2021 Softmotions Ltd <info@softmotions.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
-36
View File
@@ -1,36 +0,0 @@
# third_party_ejdb
#### Description
{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**}
#### Software Architecture
Software architecture description
#### Installation
1. xxxx
2. xxxx
3. xxxx
#### Instructions
1. xxxx
2. xxxx
3. xxxx
#### Contribution
1. Fork the repository
2. Create Feat_xxx branch
3. Commit your code
4. Create Pull Request
#### Gitee Feature
1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md
2. Gitee blog [blog.gitee.com](https://blog.gitee.com)
3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore)
4. The most valuable open source project [GVP](https://gitee.com/gvp)
5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help)
6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
+1338 -32
View File
File diff suppressed because it is too large Load Diff
+50
View File
@@ -0,0 +1,50 @@
# Windows cross compilation
**Note:** HTTP/Websocket network API is disabled and not supported
on Windows until porting of http://facil.io library
Nodejs/Dart bindings not yet ported to Windows.
## Prerequisites
```sh
sudo apt-get install bison flex libtool ruby scons intltool libtool-bin p7zip-full wine
```
## Build
### Prepare MXE
```sh
git submodule update --init
```
`nano ./mxe/settings.mk`:
```
JOBS := 1
MXE_TARGETS := x86_64-w64-mingw32.static
LOCAL_PKG_LIST := cunit libiberty
.DEFAULT local-pkg-list:
local-pkg-list: $(LOCAL_PKG_LIST)
```
```
cd ./mxe
make
```
### Cross compilation
```bash
mkdir ./build
cd ./build
export MXE_HOME=<path to project>/mxe
cmake .. -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_TOOLCHAIN_FILE=../win64-tc.cmake \
-DENABLE_HTTP=OFF
make package
```
+3
View File
@@ -0,0 +1,3 @@
analyzer:
exclude:
- build/**
+86
View File
@@ -0,0 +1,86 @@
include(ExternalProject)
if (${CMAKE_VERSION} VERSION_LESS "3.8.0")
set(_UPDATE_DISCONNECTED 0)
else()
set(_UPDATE_DISCONNECTED 1)
endif()
set(FACIL_SOURCE_DIR "${CMAKE_BINARY_DIR}/src/extern_facil")
set(FACIL_BINARY_DIR "${CMAKE_BINARY_DIR}/src/extern_facil")
set(FACIL_INCLUDE_DIR "${FACIL_BINARY_DIR}/lib/facil")
set(FACIL_LIBRARY_DIR "${FACIL_BINARY_DIR}")
if("${FACIL_URL}" STREQUAL "")
if(EXISTS ${CMAKE_SOURCE_DIR}/facil.zip)
set(FACIL_URL ${CMAKE_SOURCE_DIR}/facil.zip)
else()
set(FACIL_URL https://github.com/Softmotions/facil.io/archive/master.zip)
endif()
endif()
message("FACIL_URL: ${FACIL_URL}")
set(CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-DCMAKE_C_FLAGS=-fPIC -fvisibility=hidden)
foreach(extra
CMAKE_C_COMPILER
CMAKE_TOOLCHAIN_FILE
ANDROID_PLATFORM
ANDROID_ABI
TEST_TOOL_CMD
PLATFORM
ENABLE_BITCODE
ENABLE_ARC
ENABLE_VISIBILITY
ENABLE_STRICT_TRY_COMPILE
ARCHS)
if(DEFINED ${extra})
list(APPEND CMAKE_ARGS "-D${extra}=${${extra}}")
endif()
endforeach()
message("FACIL CMAKE_ARGS: ${CMAKE_ARGS}")
ExternalProject_Add(
extern_facil
URL ${FACIL_URL}
DOWNLOAD_NAME facil.zip
TIMEOUT 360
# Remove in-source makefile to avoid clashing
PATCH_COMMAND rm -f ./makefile
PREFIX ${CMAKE_BINARY_DIR}
BUILD_IN_SOURCE ON
GIT_PROGRESS ON
UPDATE_COMMAND ""
INSTALL_COMMAND ""
UPDATE_DISCONNECTED ${_UPDATE_DISCONNECTED}
LOG_DOWNLOAD OFF
LOG_UPDATE OFF
LOG_BUILD OFF
LOG_CONFIGURE OFF
LOG_INSTALL OFF
CMAKE_ARGS ${CMAKE_ARGS}
BUILD_BYPRODUCTS "${FACIL_LIBRARY_DIR}/libfacil.io.a"
)
add_library(facil_s STATIC IMPORTED GLOBAL)
set_target_properties(
facil_s
PROPERTIES
IMPORTED_LOCATION "${FACIL_LIBRARY_DIR}/libfacil.io.a"
)
add_dependencies(facil_s extern_facil)
if (DO_INSTALL_CORE)
install(FILES "${FACIL_LIBRARY_DIR}/libfacil.io.a"
RENAME "libfacilio-1.a"
DESTINATION ${CMAKE_INSTALL_LIBDIR})
endif()
list(APPEND PROJECT_LLIBRARIES facil_s)
list(APPEND PROJECT_INCLUDE_DIRS "${FACIL_INCLUDE_DIR}"
"${FACIL_INCLUDE_DIR}/fiobj"
"${FACIL_INCLUDE_DIR}/http"
"${FACIL_INCLUDE_DIR}/cli"
"${FACIL_INCLUDE_DIR}/tls")
+84
View File
@@ -0,0 +1,84 @@
include(ExternalProject)
if (${CMAKE_VERSION} VERSION_LESS "3.8.0")
set(_UPDATE_DISCONNECTED 0)
else()
set(_UPDATE_DISCONNECTED 1)
endif()
set(IOWOW_INCLUDE_DIR "${CMAKE_BINARY_DIR}/include")
if("${IOWOW_URL}" STREQUAL "")
if(EXISTS ${CMAKE_SOURCE_DIR}/iowow.zip)
set(IOWOW_URL ${CMAKE_SOURCE_DIR}/iowow.zip)
else()
set(IOWOW_URL https://github.com/Softmotions/iowow/archive/master.zip)
endif()
endif()
message("IOWOW_URL: ${IOWOW_URL}")
if (IOS)
set(BYPRODUCT "${CMAKE_BINARY_DIR}/lib/libiowow-1.a")
else()
set(BYPRODUCT "${CMAKE_BINARY_DIR}/src/extern_iowow-build/src/libiowow-1.a")
endif()
set(CMAKE_ARGS -DOWNER_PROJECT_NAME=${PROJECT_NAME}
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}
-DASAN=${ASAN}
-DBUILD_SHARED_LIBS=OFF
-DBUILD_EXAMPLES=OFF)
foreach(extra
CMAKE_C_COMPILER
CMAKE_TOOLCHAIN_FILE
ANDROID_PLATFORM
ANDROID_ABI
TEST_TOOL_CMD
PLATFORM
ENABLE_BITCODE
ENABLE_ARC
ENABLE_VISIBILITY
ENABLE_STRICT_TRY_COMPILE
ARCHS)
if(DEFINED ${extra})
list(APPEND CMAKE_ARGS "-D${extra}=${${extra}}")
endif()
endforeach()
message("IOWOW CMAKE_ARGS: ${CMAKE_ARGS}")
ExternalProject_Add(
extern_iowow
URL ${IOWOW_URL}
DOWNLOAD_NAME iowow.zip
TIMEOUT 360
PREFIX ${CMAKE_BINARY_DIR}
BUILD_IN_SOURCE OFF
UPDATE_COMMAND ""
UPDATE_DISCONNECTED ${_UPDATE_DISCONNECTED}
LOG_DOWNLOAD OFF
LOG_UPDATE OFF
LOG_BUILD OFF
LOG_CONFIGURE OFF
LOG_INSTALL OFF
CMAKE_ARGS ${CMAKE_ARGS}
BUILD_BYPRODUCTS ${BYPRODUCT}
)
add_library(iowow_s STATIC IMPORTED GLOBAL)
set_target_properties(
iowow_s
PROPERTIES
IMPORTED_LOCATION ${BYPRODUCT}
)
add_dependencies(iowow_s extern_iowow)
if (DO_INSTALL_CORE)
install(FILES "${BYPRODUCT}"
DESTINATION ${CMAKE_INSTALL_LIBDIR})
endif()
list(APPEND PROJECT_LLIBRARIES iowow_s m)
list(APPEND PROJECT_INCLUDE_DIRS "${IOWOW_INCLUDE_DIR}")
+31
View File
@@ -0,0 +1,31 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
# Do not include this module directly from code outside CMake!
set(_JAVA_HOME "")
if(JAVA_HOME AND IS_DIRECTORY "${JAVA_HOME}")
set(_JAVA_HOME "${JAVA_HOME}")
set(_JAVA_HOME_EXPLICIT 1)
else()
set(_ENV_JAVA_HOME "")
if(DEFINED ENV{JAVA_HOME})
file(TO_CMAKE_PATH "$ENV{JAVA_HOME}" _ENV_JAVA_HOME)
endif()
if(_ENV_JAVA_HOME AND IS_DIRECTORY "${_ENV_JAVA_HOME}")
set(_JAVA_HOME "${_ENV_JAVA_HOME}")
set(_JAVA_HOME_EXPLICIT 1)
else()
set(_CMD_JAVA_HOME "")
if(APPLE AND EXISTS /usr/libexec/java_home)
execute_process(COMMAND /usr/libexec/java_home
OUTPUT_VARIABLE _CMD_JAVA_HOME OUTPUT_STRIP_TRAILING_WHITESPACE)
endif()
if(_CMD_JAVA_HOME AND IS_DIRECTORY "${_CMD_JAVA_HOME}")
set(_JAVA_HOME "${_CMD_JAVA_HOME}")
set(_JAVA_HOME_EXPLICIT 0)
endif()
unset(_CMD_JAVA_HOME)
endif()
unset(_ENV_JAVA_HOME)
endif()
+54
View File
@@ -0,0 +1,54 @@
## -*- mode:cmake; coding:utf-8; -*-
# Set output:
# CHANGELOG_LAST_LINE
# CHANGELOG_LAST_VERSION - Last changelog version
# CHANGELOG_LAST_VERSION_MAJOR - Last changelog major version
# CHANGELOG_LAST_VERSION_MINOR - Last changelog minor version
# CHANGELOG_LAST_VERSION_PATCH - Last changelog patch version
# CHANGELOG_LAST_MESSAGE - Last changelog description
if (NOT DEB_CHANGELOG)
set(DEB_CHANGELOG "${CMAKE_SOURCE_DIR}/Changelog")
endif()
if (NOT EXISTS ${DEB_CHANGELOG})
if (DEB_CHANGELOG_REQUIRED)
message(FATAL_ERROR "Missing required project changelog file: ${DEB_CHANGELOG}")
else()
message("Missing project changelog file: ${DEB_CHANGELOG}")
return()
endif()
endif()
message(STATUS "Using project changelog file: ${DEB_CHANGELOG}")
file(STRINGS "${DEB_CHANGELOG}" _DEBCHANGELOGN)
foreach(CLINE IN LISTS _DEBCHANGELOGN)
if (NOT CHANGELOG_LAST_VERSION)
#ejdb (1.2.6) testing; urgency=low
string(REGEX MATCH "^[A-Za-z0-9_].*[ \t]+\\((([0-9]+)\\.([0-9]+)\\.([0-9]+))\\)[ \t]+[A-Za-z]+;[ \t].*" _MATCHED "${CLINE}")
if (_MATCHED)
set(CHANGELOG_LAST_LINE "${_MATCHED}")
set(CHANGELOG_LAST_VERSION "${CMAKE_MATCH_1}")
set(CHANGELOG_LAST_VERSION_MAJOR "${CMAKE_MATCH_2}")
set(CHANGELOG_LAST_VERSION_MINOR "${CMAKE_MATCH_3}")
set(CHANGELOG_LAST_VERSION_PATCH "${CMAKE_MATCH_4}")
endif()
elseif(NOT CHANGELOG_LAST_MESSAGE)
string(REGEX MATCH "^[A-Za-z0-9_].*[ \t]+\\((([0-9]+)\\.([0-9]+)\\.([0-9]+))\\)[ \t]+[A-Za-z]+;[ \t].*" _MATCHED "${CLINE}")
if (_MATCHED)
string(STRIP "${_CDESC}" CHANGELOG_LAST_MESSAGE)
return()
endif()
if (CLINE)
string(REGEX MATCH "^[ \t]*\\-\\-[ \t]+" _MATCHED "${CLINE}")
if (_MATCHED)
string(STRIP "${_CDESC}" CHANGELOG_LAST_MESSAGE)
return()
endif()
set(_CDESC "${_CDESC}\n${CLINE}")
endif()
endif()
endforeach(CLINE)
message(FATAL_ERROR "Invalid changelog file: ${DEB_CHANGELOG}")
+24
View File
@@ -0,0 +1,24 @@
# Find the CUnit headers and libraries
#
# CUNIT_INCLUDE_DIRS - The CUnit include directory (directory where CUnit/CUnit.h was found)
# CUNIT_LIBRARIES - The libraries needed to use CUnit
# CUNIT_FOUND - True if CUnit found in system
FIND_PATH(CUNIT_INCLUDE_DIR NAMES CUnit/CUnit.h)
MARK_AS_ADVANCED(CUNIT_INCLUDE_DIR)
FIND_LIBRARY(CUNIT_LIBRARY NAMES
cunit
libcunit
cunitlib
)
MARK_AS_ADVANCED(CUNIT_LIBRARY)
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(CUnit DEFAULT_MSG CUNIT_LIBRARY CUNIT_INCLUDE_DIR)
IF(CUNIT_FOUND)
SET(CUNIT_LIBRARIES ${CUNIT_LIBRARY})
SET(CUNIT_INCLUDE_DIRS ${CUNIT_INCLUDE_DIR})
ENDIF(CUNIT_FOUND)
+39
View File
@@ -0,0 +1,39 @@
# Find the IOWOW headers and libraries, attemting to import IOWOW exported targets,
#
# IOWOW_INCLUDE_DIRS - The IOWOW include directory
# IOWOW_LIBRARIES - The libraries needed to use IOWOW
# IOWOW_FOUND - True if IOWOW found in system
find_path(IOWOW_INCLUDE_DIR NAMES iowow/iowow.h)
mark_as_advanced(IOWOW_INCLUDE_DIR)
find_library(IOWOW_LIBRARY NAMES
iowow
libiowow
iowowlib
)
mark_as_advanced(IOWOW_LIBRARY)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(IOWOW DEFAULT_MSG IOWOW_LIBRARY IOWOW_INCLUDE_DIR)
if(IOWOW_FOUND)
set(IOWOW_LIBRARIES ${IOWOW_LIBRARY})
set(IOWOW_INCLUDE_DIRS ${IOWOW_INCLUDE_DIR})
find_path(IOWOW_EXPORTS_DIR
NAMES "iowow/iowow-exports.cmake"
PATHS /usr/share /usr/local/share)
mark_as_advanced(IOWOW_EXPORTS_DIR)
if(IOWOW_EXPORTS_DIR)
if(EXISTS ${IOWOW_EXPORTS_DIR}/iowow/iowow-exports.cmake)
include(${IOWOW_EXPORTS_DIR}/iowow/iowow-exports.cmake)
message("-- Imported ${IOWOW_EXPORTS_DIR}/iowow/iowow-exports.cmake")
endif()
if(EXISTS ${IOWOW_EXPORTS_DIR}/iowow/iowow-static-exports.cmake)
include(${IOWOW_EXPORTS_DIR}/iowow/iowow-static-exports.cmake)
message("-- Imported ${IOWOW_EXPORTS_DIR}/iowow/iowow-static-exports.cmake")
endif()
endif(IOWOW_EXPORTS_DIR)
elseif(IOWOW_FIND_REQUIRED)
message(FATAL_ERROR "Could not find libiowow.")
endif(IOWOW_FOUND)
+406
View File
@@ -0,0 +1,406 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
#[=======================================================================[.rst:
FindJNI
-------
Find Java Native Interface (JNI) libraries.
JNI enables Java code running in a Java Virtual Machine (JVM) to call
and be called by native applications and libraries written in other
languages such as C, C++.
This module finds if Java is installed and determines where the
include files and libraries are. It also determines what the name of
the library is. The caller may set variable ``JAVA_HOME`` to specify a
Java installation prefix explicitly.
Result Variables
^^^^^^^^^^^^^^^^
This module sets the following result variables:
``JNI_INCLUDE_DIRS``
the include dirs to use
``JNI_LIBRARIES``
the libraries to use (JAWT and JVM)
``JNI_FOUND``
TRUE if JNI headers and libraries were found.
Cache Variables
^^^^^^^^^^^^^^^
The following cache variables are also available to set or use:
``JAVA_AWT_LIBRARY``
the path to the Java AWT Native Interface (JAWT) library
``JAVA_JVM_LIBRARY``
the path to the Java Virtual Machine (JVM) library
``JAVA_INCLUDE_PATH``
the include path to jni.h
``JAVA_INCLUDE_PATH2``
the include path to jni_md.h and jniport.h
#]=======================================================================]
# Expand {libarch} occurrences to java_libarch subdirectory(-ies) and set ${_var}
macro(java_append_library_directories _var)
# Determine java arch-specific library subdir
# Mostly based on openjdk/jdk/make/common/shared/Platform.gmk as of openjdk
# 1.6.0_18 + icedtea patches. However, it would be much better to base the
# guess on the first part of the GNU config.guess platform triplet.
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
if(CMAKE_LIBRARY_ARCHITECTURE STREQUAL "x86_64-linux-gnux32")
set(_java_libarch "x32" "amd64" "i386")
else()
set(_java_libarch "amd64" "i386")
endif()
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^i.86$")
set(_java_libarch "i386")
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^alpha")
set(_java_libarch "alpha")
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm")
# Subdir is "arm" for both big-endian (arm) and little-endian (armel).
set(_java_libarch "arm" "aarch32")
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^mips")
# mips* machines are bi-endian mostly so processor does not tell
# endianness of the underlying system.
set(_java_libarch "${CMAKE_SYSTEM_PROCESSOR}"
"mips" "mipsel" "mipseb" "mipsr6" "mipsr6el"
"mips64" "mips64el" "mips64r6" "mips64r6el"
"mipsn32" "mipsn32el" "mipsn32r6" "mipsn32r6el")
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64le")
set(_java_libarch "ppc64" "ppc64le")
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64")
set(_java_libarch "ppc64" "ppc")
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)")
set(_java_libarch "ppc" "ppc64")
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^sparc")
# Both flavours can run on the same processor
set(_java_libarch "${CMAKE_SYSTEM_PROCESSOR}" "sparc" "sparcv9")
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(parisc|hppa)")
set(_java_libarch "parisc" "parisc64")
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^s390")
# s390 binaries can run on s390x machines
set(_java_libarch "${CMAKE_SYSTEM_PROCESSOR}" "s390" "s390x")
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^sh")
set(_java_libarch "sh")
else()
set(_java_libarch "${CMAKE_SYSTEM_PROCESSOR}")
endif()
# Append default list architectures if CMAKE_SYSTEM_PROCESSOR was empty or
# system is non-Linux (where the code above has not been well tested)
if(NOT _java_libarch OR NOT (CMAKE_SYSTEM_NAME MATCHES "Linux"))
list(APPEND _java_libarch "i386" "amd64" "ppc")
endif()
# Sometimes ${CMAKE_SYSTEM_PROCESSOR} is added to the list to prefer
# current value to a hardcoded list. Remove possible duplicates.
list(REMOVE_DUPLICATES _java_libarch)
foreach(_path ${ARGN})
if(_path MATCHES "{libarch}")
foreach(_libarch ${_java_libarch})
string(REPLACE "{libarch}" "${_libarch}" _newpath "${_path}")
if(EXISTS ${_newpath})
list(APPEND ${_var} "${_newpath}")
endif()
endforeach()
else()
if(EXISTS ${_path})
list(APPEND ${_var} "${_path}")
endif()
endif()
endforeach()
endmacro()
include(CMakeFindJavaCommon)
# Save CMAKE_FIND_FRAMEWORK
if(DEFINED CMAKE_FIND_FRAMEWORK)
set(_JNI_CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK})
else()
unset(_JNI_CMAKE_FIND_FRAMEWORK)
endif()
if(_JAVA_HOME_EXPLICIT)
set(CMAKE_FIND_FRAMEWORK NEVER)
endif()
set(JAVA_AWT_LIBRARY_DIRECTORIES)
if(_JAVA_HOME)
JAVA_APPEND_LIBRARY_DIRECTORIES(JAVA_AWT_LIBRARY_DIRECTORIES
${_JAVA_HOME}/jre/lib/{libarch}
${_JAVA_HOME}/jre/lib
${_JAVA_HOME}/lib/{libarch}
${_JAVA_HOME}/lib
${_JAVA_HOME}
)
endif()
if (WIN32)
set (_JNI_HINTS)
execute_process(COMMAND REG QUERY HKLM\\SOFTWARE\\JavaSoft\\JDK /f "." /k
RESULT_VARIABLE _JNI_RESULT
OUTPUT_VARIABLE _JNI_VERSIONS
ERROR_QUIET)
if (NOT _JNI_RESULT)
string (REGEX MATCHALL "HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\JavaSoft\\\\JDK\\\\[0-9.]+" _JNI_VERSIONS "${_JNI_VERSIONS}")
if (_JNI_VERSIONS)
# sort versions. Most recent first
## handle version 9 apart from other versions to get correct ordering
set (_JNI_V9 ${_JNI_VERSIONS})
list (FILTER _JNI_VERSIONS EXCLUDE REGEX "JDK\\\\9")
list (SORT _JNI_VERSIONS)
list (REVERSE _JNI_VERSIONS)
list (FILTER _JNI_V9 INCLUDE REGEX "JDK\\\\9")
list (SORT _JNI_V9)
list (REVERSE _JNI_V9)
list (APPEND _JNI_VERSIONS ${_JNI_V9})
foreach (_JNI_HINT IN LISTS _JNI_VERSIONS)
list(APPEND _JNI_HINTS "[${_JNI_HINT};JavaHome]")
endforeach()
endif()
endif()
foreach (_JNI_HINT IN LISTS _JNI_HINTS)
list(APPEND JAVA_AWT_LIBRARY_DIRECTORIES "${_JNI_HINT}/lib")
endforeach()
get_filename_component(java_install_version
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit;CurrentVersion]" NAME)
list(APPEND JAVA_AWT_LIBRARY_DIRECTORIES
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\11;JavaHome]/lib"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\10;JavaHome]/lib"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.9;JavaHome]/lib"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.8;JavaHome]/lib"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.7;JavaHome]/lib"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.6;JavaHome]/lib"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.5;JavaHome]/lib"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.4;JavaHome]/lib"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.3;JavaHome]/lib"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\${java_install_version};JavaHome]/lib"
)
endif()
JAVA_APPEND_LIBRARY_DIRECTORIES(JAVA_AWT_LIBRARY_DIRECTORIES
/usr/lib/jvm/java/lib
/usr/lib/java/jre/lib/{libarch}
/usr/lib/jvm/jre/lib/{libarch}
/usr/local/lib/java/jre/lib/{libarch}
/usr/local/share/java/jre/lib/{libarch}
# Debian specific paths for default JVM
/usr/lib/jvm/default-java/jre/lib/{libarch}
/usr/lib/jvm/default-java/jre/lib
/usr/lib/jvm/default-java/lib
# Arch Linux specific paths for default JVM
/usr/lib/jvm/default/jre/lib/{libarch}
/usr/lib/jvm/default/lib/{libarch}
# SuSE specific paths for default JVM
/usr/lib64/jvm/java/jre/lib/{libarch}
/usr/lib64/jvm/jre/lib/{libarch}
/usr/lib/jvm/java-11-openjdk-{libarch}/jre/lib/{libarch} # Ubuntu 18.04 LTS
/usr/lib/jvm/java-11-oracle/lib/{libarch}
/usr/lib/jvm/java-10-openjdk-{libarch}/jre/lib/{libarch}
/usr/lib/jvm/java-10-oracle/lib/{libarch}
/usr/lib/jvm/java-9-openjdk-{libarch}/jre/lib/{libarch}
/usr/lib/jvm/java-9-oracle/lib/{libarch}
/usr/lib/jvm/java-8-openjdk-{libarch}/jre/lib/{libarch} # Ubuntu 15.10
/usr/lib/jvm/java-8-oracle/lib/{libarch}
# Ubuntu specific paths for default JVM
/usr/lib/jvm/java-7-openjdk-{libarch}/jre/lib/{libarch} # Ubuntu 15.10
/usr/lib/jvm/java-7-oracle/lib/{libarch}
/usr/lib/jvm/java-6-openjdk-{libarch}/jre/lib/{libarch} # Ubuntu 15.10
/usr/lib/jvm/java-6-oracle/lib/{libarch}
/usr/lib/jvm/java-6-sun/jre/lib/{libarch}
/usr/lib/jvm/java-6-sun-1.6.0.00/jre/lib/{libarch} # can this one be removed according to #8821 ? Alex
/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/jre/lib/{libarch} # fedora
/usr/lib/jvm/java-6-openjdk/jre/lib/{libarch}
# OpenBSD specific paths for default JVM
/usr/local/jdk-1.8.0/jre/lib/{libarch}
/usr/local/jre-1.8.0/lib/{libarch}
/usr/local/jdk-1.7.0/jre/lib/{libarch}
/usr/local/jre-1.7.0/lib/{libarch}
/usr/local/jdk-1.6.0/jre/lib/{libarch}
/usr/local/jre-1.6.0/lib/{libarch}
)
set(JAVA_JVM_LIBRARY_DIRECTORIES)
foreach(dir ${JAVA_AWT_LIBRARY_DIRECTORIES})
list(APPEND JAVA_JVM_LIBRARY_DIRECTORIES
"${dir}"
"${dir}/client"
"${dir}/server"
# IBM SDK, Java Technology Edition, specific paths
"${dir}/j9vm"
"${dir}/default"
)
endforeach()
set(JAVA_AWT_INCLUDE_DIRECTORIES)
if(_JAVA_HOME)
list(APPEND JAVA_AWT_INCLUDE_DIRECTORIES ${_JAVA_HOME}/include)
endif()
if (WIN32)
foreach (_JNI_HINT IN LISTS _JNI_HINTS)
list(APPEND JAVA_AWT_INCLUDE_DIRECTORIES "${_JNI_HINT}/include")
endforeach()
list(APPEND JAVA_AWT_INCLUDE_DIRECTORIES
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\11;JavaHome]/include"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\10;JavaHome]/include"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.9;JavaHome]/include"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.8;JavaHome]/include"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.7;JavaHome]/include"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.6;JavaHome]/include"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.5;JavaHome]/include"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.4;JavaHome]/include"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.3;JavaHome]/include"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\${java_install_version};JavaHome]/include"
)
endif()
JAVA_APPEND_LIBRARY_DIRECTORIES(JAVA_AWT_INCLUDE_DIRECTORIES
/usr/lib/java/include
/usr/local/lib/java/include
/usr/lib/jvm/java/include
/usr/lib/jvm/java-11-openjdk-{libarch}/include
/usr/lib/jvm/java-11-oracle/include
/usr/lib/jvm/java-10-openjdk-{libarch}/include
/usr/lib/jvm/java-10-oracle/include
/usr/lib/jvm/java-9-openjdk-{libarch}/include
/usr/lib/jvm/java-9-oracle/include
/usr/lib/jvm/java-8-openjdk-{libarch}/include
/usr/lib/jvm/java-8-oracle/include
/usr/lib/jvm/java-7-openjdk-{libarch}/include
/usr/lib/jvm/java-7-oracle/include
/usr/lib/jvm/java-6-openjdk-{libarch}/include
/usr/lib/jvm/java-6-openjdk/include
/usr/lib/jvm/java-6-oracle/include
/usr/lib/jvm/java-6-sun/include
/usr/local/share/java/include
# Debian specific path for default JVM
/usr/lib/jvm/default-java/include
# Arch specific path for default JVM
/usr/lib/jvm/default/include
# OpenBSD specific path for default JVM
/usr/local/jdk-1.8.0/include
/usr/local/jdk-1.7.0/include
/usr/local/jdk-1.6.0/include
# SuSE specific paths for default JVM
/usr/lib64/jvm/java/include
)
foreach(JAVA_PROG "${JAVA_RUNTIME}" "${JAVA_COMPILE}" "${JAVA_ARCHIVE}")
get_filename_component(jpath "${JAVA_PROG}" PATH)
foreach(JAVA_INC_PATH ../include ../java/include ../share/java/include)
if(EXISTS ${jpath}/${JAVA_INC_PATH})
list(APPEND JAVA_AWT_INCLUDE_DIRECTORIES "${jpath}/${JAVA_INC_PATH}")
endif()
endforeach()
foreach(JAVA_LIB_PATH
../lib ../jre/lib ../jre/lib/i386
../java/lib ../java/jre/lib ../java/jre/lib/i386
../share/java/lib ../share/java/jre/lib ../share/java/jre/lib/i386)
if(EXISTS ${jpath}/${JAVA_LIB_PATH})
list(APPEND JAVA_AWT_LIBRARY_DIRECTORIES "${jpath}/${JAVA_LIB_PATH}")
endif()
endforeach()
endforeach()
if(APPLE)
if(CMAKE_FIND_FRAMEWORK STREQUAL "ONLY")
set(_JNI_SEARCHES FRAMEWORK)
elseif(CMAKE_FIND_FRAMEWORK STREQUAL "NEVER")
set(_JNI_SEARCHES NORMAL)
elseif(CMAKE_FIND_FRAMEWORK STREQUAL "LAST")
set(_JNI_SEARCHES NORMAL FRAMEWORK)
else()
set(_JNI_SEARCHES FRAMEWORK NORMAL)
endif()
set(_JNI_FRAMEWORK_JVM NAMES JavaVM)
set(_JNI_FRAMEWORK_JAWT "${_JNI_FRAMEWORK_JVM}")
else()
set(_JNI_SEARCHES NORMAL)
endif()
set(_JNI_NORMAL_JVM
NAMES jvm
PATHS ${JAVA_JVM_LIBRARY_DIRECTORIES}
)
set(_JNI_NORMAL_JAWT
NAMES jawt
PATHS ${JAVA_AWT_LIBRARY_DIRECTORIES}
)
foreach(search ${_JNI_SEARCHES})
find_library(JAVA_JVM_LIBRARY ${_JNI_${search}_JVM})
find_library(JAVA_AWT_LIBRARY ${_JNI_${search}_JAWT})
if(JAVA_JVM_LIBRARY)
break()
endif()
endforeach()
unset(_JNI_SEARCHES)
unset(_JNI_FRAMEWORK_JVM)
unset(_JNI_FRAMEWORK_JAWT)
unset(_JNI_NORMAL_JVM)
unset(_JNI_NORMAL_JAWT)
# Find headers matching the library.
if("${JAVA_JVM_LIBRARY};${JAVA_AWT_LIBRARY};" MATCHES "(/JavaVM.framework|-framework JavaVM);")
set(CMAKE_FIND_FRAMEWORK ONLY)
else()
set(CMAKE_FIND_FRAMEWORK NEVER)
endif()
# add in the include path
find_path(JAVA_INCLUDE_PATH jni.h
${JAVA_AWT_INCLUDE_DIRECTORIES}
)
find_path(JAVA_INCLUDE_PATH2 NAMES jni_md.h jniport.h
PATHS
${JAVA_INCLUDE_PATH}
${JAVA_INCLUDE_PATH}/darwin
${JAVA_INCLUDE_PATH}/win32
${JAVA_INCLUDE_PATH}/linux
${JAVA_INCLUDE_PATH}/freebsd
${JAVA_INCLUDE_PATH}/openbsd
${JAVA_INCLUDE_PATH}/solaris
${JAVA_INCLUDE_PATH}/hp-ux
${JAVA_INCLUDE_PATH}/alpha
${JAVA_INCLUDE_PATH}/aix
)
# Restore CMAKE_FIND_FRAMEWORK
if(DEFINED _JNI_CMAKE_FIND_FRAMEWORK)
set(CMAKE_FIND_FRAMEWORK ${_JNI_CMAKE_FIND_FRAMEWORK})
unset(_JNI_CMAKE_FIND_FRAMEWORK)
else()
unset(CMAKE_FIND_FRAMEWORK)
endif()
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(JNI DEFAULT_MSG JAVA_AWT_LIBRARY
JAVA_JVM_LIBRARY
JAVA_INCLUDE_PATH
JAVA_INCLUDE_PATH2)
mark_as_advanced(
JAVA_AWT_LIBRARY
JAVA_JVM_LIBRARY
JAVA_INCLUDE_PATH
JAVA_INCLUDE_PATH2
)
set(JNI_LIBRARIES
${JAVA_AWT_LIBRARY}
${JAVA_JVM_LIBRARY}
)
set(JNI_INCLUDE_DIRS
${JAVA_INCLUDE_PATH}
${JAVA_INCLUDE_PATH2}
)
+359
View File
@@ -0,0 +1,359 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
#[=======================================================================[.rst:
FindJava
--------
Find Java
This module finds if Java is installed and determines where the
include files and libraries are. The caller may set variable ``JAVA_HOME``
to specify a Java installation prefix explicitly.
See also the :module:`FindJNI` module to find Java Native Interface (JNI).
Specify one or more of the following components as you call this find module. See example below.
::
Runtime = Java Runtime Environment used to execute Java byte-compiled applications
Development = Development tools (java, javac, javah, jar and javadoc), includes Runtime component
IdlJ = Interface Description Language (IDL) to Java compiler
JarSigner = Signer and verifier tool for Java Archive (JAR) files
This module sets the following result variables:
::
Java_JAVA_EXECUTABLE = the full path to the Java runtime
Java_JAVAC_EXECUTABLE = the full path to the Java compiler
Java_JAVAH_EXECUTABLE = the full path to the Java header generator
Java_JAVADOC_EXECUTABLE = the full path to the Java documentation generator
Java_IDLJ_EXECUTABLE = the full path to the Java idl compiler
Java_JAR_EXECUTABLE = the full path to the Java archiver
Java_JARSIGNER_EXECUTABLE = the full path to the Java jar signer
Java_VERSION_STRING = Version of java found, eg. 1.6.0_12
Java_VERSION_MAJOR = The major version of the package found.
Java_VERSION_MINOR = The minor version of the package found.
Java_VERSION_PATCH = The patch version of the package found.
Java_VERSION_TWEAK = The tweak version of the package found (after '_')
Java_VERSION = This is set to: $major[.$minor[.$patch[.$tweak]]]
The minimum required version of Java can be specified using the
:command:`find_package` syntax, e.g.
.. code-block:: cmake
find_package(Java 1.8)
NOTE: ``${Java_VERSION}`` and ``${Java_VERSION_STRING}`` are not guaranteed to
be identical. For example some java version may return:
``Java_VERSION_STRING = 1.8.0_17`` and ``Java_VERSION = 1.8.0.17``
another example is the Java OEM, with: ``Java_VERSION_STRING = 1.8.0-oem``
and ``Java_VERSION = 1.8.0``
For these components the following variables are set:
::
Java_FOUND - TRUE if all components are found.
Java_<component>_FOUND - TRUE if <component> is found.
Example Usages:
::
find_package(Java)
find_package(Java 1.8 REQUIRED)
find_package(Java COMPONENTS Runtime)
find_package(Java COMPONENTS Development)
#]=======================================================================]
include(CMakeFindJavaCommon)
# The HINTS option should only be used for values computed from the system.
set(_JAVA_HINTS)
if(_JAVA_HOME)
list(APPEND _JAVA_HINTS ${_JAVA_HOME}/bin)
endif()
if (WIN32)
macro (_JAVA_GET_INSTALLED_VERSIONS _KIND)
execute_process(COMMAND REG QUERY HKLM\\SOFTWARE\\JavaSoft\\${_KIND}
RESULT_VARIABLE _JAVA_RESULT
OUTPUT_VARIABLE _JAVA_VERSIONS
ERROR_QUIET)
if (NOT _JAVA_RESULT)
string (REGEX MATCHALL "HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\JavaSoft\\\\${_KIND}\\\\[0-9.]+" _JAVA_VERSIONS "${_JAVA_VERSIONS}")
if (_JAVA_VERSIONS)
# sort versions. Most recent first
## handle version 9 apart from other versions to get correct ordering
set (_JAVA_V9 ${_JAVA_VERSIONS})
list (FILTER _JAVA_VERSIONS EXCLUDE REGEX "${_KIND}\\\\9")
list (SORT _JAVA_VERSIONS)
list (REVERSE _JAVA_VERSIONS)
list (FILTER _JAVA_V9 INCLUDE REGEX "${_KIND}\\\\9")
list (SORT _JAVA_V9)
list (REVERSE _JAVA_V9)
list (APPEND _JAVA_VERSIONS ${_JAVA_V9})
foreach (_JAVA_HINT IN LISTS _JAVA_VERSIONS)
list(APPEND _JAVA_HINTS "[${_JAVA_HINT};JavaHome]/bin")
endforeach()
endif()
endif()
endmacro()
# search for installed versions for version 9 and upper
_JAVA_GET_INSTALLED_VERSIONS("JDK")
_JAVA_GET_INSTALLED_VERSIONS("JRE")
list(APPEND _JAVA_HINTS
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.9;JavaHome]/bin"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.8;JavaHome]/bin"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.7;JavaHome]/bin"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.6;JavaHome]/bin"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.5;JavaHome]/bin"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.4;JavaHome]/bin"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.3;JavaHome]/bin"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment\\1.9;JavaHome]/bin"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment\\1.8;JavaHome]/bin"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment\\1.7;JavaHome]/bin"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment\\1.6;JavaHome]/bin"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment\\1.5;JavaHome]/bin"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment\\1.4;JavaHome]/bin"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Runtime Environment\\1.3;JavaHome]/bin"
)
endif()
# Hard-coded guesses should still go in PATHS. This ensures that the user
# environment can always override hard guesses.
set(_JAVA_PATHS
/usr/lib/java/bin
/usr/share/java/bin
/usr/local/java/bin
/usr/local/java/share/bin
/usr/java/j2sdk1.4.2_04
/usr/lib/j2sdk1.4-sun/bin
/usr/java/j2sdk1.4.2_09/bin
/usr/lib/j2sdk1.5-sun/bin
/opt/sun-jdk-1.5.0.04/bin
/usr/local/jdk-1.7.0/bin
/usr/local/jdk-1.6.0/bin
)
find_program(Java_JAVA_EXECUTABLE
NAMES java
HINTS ${_JAVA_HINTS}
PATHS ${_JAVA_PATHS}
)
if(Java_JAVA_EXECUTABLE)
execute_process(COMMAND "${Java_JAVA_EXECUTABLE}" -version
RESULT_VARIABLE res
OUTPUT_VARIABLE var
ERROR_VARIABLE var # sun-java output to stderr
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_STRIP_TRAILING_WHITESPACE)
if( res )
if(var MATCHES "Unable to locate a Java Runtime to invoke|No Java runtime present, requesting install")
set(Java_JAVA_EXECUTABLE Java_JAVA_EXECUTABLE-NOTFOUND)
elseif(${Java_FIND_REQUIRED})
message( FATAL_ERROR "Error executing java -version" )
else()
message( STATUS "Warning, could not run java -version")
endif()
else()
# Extract version components (up to 4 levels) from "java -version" output.
set(_java_version_regex [[(([0-9]+)(\.([0-9]+)(\.([0-9]+)(_([0-9]+))?)?)?.*)]])
if(var MATCHES "java version \"${_java_version_regex}\"")
# Sun, GCJ, older OpenJDK
set(Java_VERSION_STRING "${CMAKE_MATCH_1}")
set(Java_VERSION_MAJOR "${CMAKE_MATCH_2}")
if (CMAKE_MATCH_4)
set(Java_VERSION_MINOR "${CMAKE_MATCH_4}")
else()
set(Java_VERSION_MINOR 0)
endif()
if (CMAKE_MATCH_6)
set(Java_VERSION_PATCH "${CMAKE_MATCH_6}")
else()
set(Java_VERSION_PATCH 0)
endif()
set(Java_VERSION_TWEAK "${CMAKE_MATCH_8}")
elseif(var MATCHES "openjdk version \"${_java_version_regex}\"")
# OpenJDK
set(Java_VERSION_STRING "${CMAKE_MATCH_1}")
set(Java_VERSION_MAJOR "${CMAKE_MATCH_2}")
if (CMAKE_MATCH_4)
set(Java_VERSION_MINOR "${CMAKE_MATCH_4}")
else()
set(Java_VERSION_MINOR 0)
endif()
if (CMAKE_MATCH_6)
set(Java_VERSION_PATCH "${CMAKE_MATCH_6}")
else()
set(Java_VERSION_PATCH 0)
endif()
set(Java_VERSION_TWEAK "${CMAKE_MATCH_8}")
elseif(var MATCHES "openjdk version \"([0-9]+)-[A-Za-z]+\"")
# OpenJDK 9 early access builds or locally built
set(Java_VERSION_STRING "1.${CMAKE_MATCH_1}.0")
set(Java_VERSION_MAJOR "1")
set(Java_VERSION_MINOR "${CMAKE_MATCH_1}")
set(Java_VERSION_PATCH "0")
set(Java_VERSION_TWEAK "")
elseif(var MATCHES "java full version \"kaffe-${_java_version_regex}\"")
# Kaffe style
set(Java_VERSION_STRING "${CMAKE_MATCH_1}")
set(Java_VERSION_MAJOR "${CMAKE_MATCH_2}")
set(Java_VERSION_MINOR "${CMAKE_MATCH_4}")
set(Java_VERSION_PATCH "${CMAKE_MATCH_6}")
set(Java_VERSION_TWEAK "${CMAKE_MATCH_8}")
else()
if(NOT Java_FIND_QUIETLY)
string(REPLACE "\n" "\n " ver_msg "\n${var}")
message(WARNING "Java version not recognized:${ver_msg}\nPlease report.")
endif()
set(Java_VERSION_STRING "")
set(Java_VERSION_MAJOR "")
set(Java_VERSION_MINOR "")
set(Java_VERSION_PATCH "")
set(Java_VERSION_TWEAK "")
endif()
set(Java_VERSION "${Java_VERSION_MAJOR}")
if(NOT "x${Java_VERSION}" STREQUAL "x")
foreach(c MINOR PATCH TWEAK)
if(NOT "x${Java_VERSION_${c}}" STREQUAL "x")
string(APPEND Java_VERSION ".${Java_VERSION_${c}}")
else()
break()
endif()
endforeach()
endif()
endif()
endif()
find_program(Java_JAR_EXECUTABLE
NAMES jar
HINTS ${_JAVA_HINTS}
PATHS ${_JAVA_PATHS}
)
find_program(Java_JAVAC_EXECUTABLE
NAMES javac
HINTS ${_JAVA_HINTS}
PATHS ${_JAVA_PATHS}
)
find_program(Java_JAVAH_EXECUTABLE
NAMES javah
HINTS ${_JAVA_HINTS}
PATHS ${_JAVA_PATHS}
)
find_program(Java_JAVADOC_EXECUTABLE
NAMES javadoc
HINTS ${_JAVA_HINTS}
PATHS ${_JAVA_PATHS}
)
find_program(Java_IDLJ_EXECUTABLE
NAMES idlj
HINTS ${_JAVA_HINTS}
PATHS ${_JAVA_PATHS}
)
find_program(Java_JARSIGNER_EXECUTABLE
NAMES jarsigner
HINTS ${_JAVA_HINTS}
PATHS ${_JAVA_PATHS}
)
include(FindPackageHandleStandardArgs)
if(Java_FIND_COMPONENTS)
set(_JAVA_REQUIRED_VARS)
foreach(component ${Java_FIND_COMPONENTS})
# User just want to execute some Java byte-compiled
If(component STREQUAL "Runtime")
list(APPEND _JAVA_REQUIRED_VARS Java_JAVA_EXECUTABLE)
if(Java_JAVA_EXECUTABLE)
set(Java_Runtime_FOUND TRUE)
endif()
elseif(component STREQUAL "Development")
list(APPEND _JAVA_REQUIRED_VARS Java_JAVA_EXECUTABLE Java_JAVAC_EXECUTABLE
Java_JAR_EXECUTABLE Java_JAVADOC_EXECUTABLE)
if(Java_VERSION VERSION_LESS "10")
list(APPEND _JAVA_REQUIRED_VARS Java_JAVAH_EXECUTABLE)
if(Java_JAVA_EXECUTABLE AND Java_JAVAC_EXECUTABLE
AND Java_JAVAH_EXECUTABLE AND Java_JAR_EXECUTABLE AND Java_JAVADOC_EXECUTABLE)
set(Java_Development_FOUND TRUE)
endif()
else()
if(Java_JAVA_EXECUTABLE AND Java_JAVAC_EXECUTABLE
AND Java_JAR_EXECUTABLE AND Java_JAVADOC_EXECUTABLE)
set(Java_Development_FOUND TRUE)
endif()
endif()
elseif(component STREQUAL "IdlJ")
list(APPEND _JAVA_REQUIRED_VARS Java_IDLJ_EXECUTABLE)
if(Java_IDLJ_EXECUTABLE)
set(Java_IdlJ_FOUND TRUE)
endif()
elseif(component STREQUAL "JarSigner")
list(APPEND _JAVA_REQUIRED_VARS Java_JARSIGNER_EXECUTABLE)
if(Java_JARSIGNER_EXECUTABLE)
set(Java_JarSigner_FOUND TRUE)
endif()
else()
message(FATAL_ERROR "Comp: ${component} is not handled")
endif()
endforeach()
list (REMOVE_DUPLICATES _JAVA_REQUIRED_VARS)
find_package_handle_standard_args(Java
REQUIRED_VARS ${_JAVA_REQUIRED_VARS} HANDLE_COMPONENTS
VERSION_VAR Java_VERSION
)
if(Java_FOUND)
foreach(component ${Java_FIND_COMPONENTS})
set(Java_${component}_FOUND TRUE)
endforeach()
endif()
else()
# Check for Development
if(Java_VERSION VERSION_LESS "10")
find_package_handle_standard_args(Java
REQUIRED_VARS Java_JAVA_EXECUTABLE Java_JAR_EXECUTABLE Java_JAVAC_EXECUTABLE
Java_JAVAH_EXECUTABLE Java_JAVADOC_EXECUTABLE
VERSION_VAR Java_VERSION_STRING
)
else()
find_package_handle_standard_args(Java
REQUIRED_VARS Java_JAVA_EXECUTABLE Java_JAR_EXECUTABLE Java_JAVAC_EXECUTABLE
Java_JAVADOC_EXECUTABLE
VERSION_VAR Java_VERSION_STRING
)
endif()
endif()
mark_as_advanced(
Java_JAVA_EXECUTABLE
Java_JAR_EXECUTABLE
Java_JAVAC_EXECUTABLE
Java_JAVAH_EXECUTABLE
Java_JAVADOC_EXECUTABLE
Java_IDLJ_EXECUTABLE
Java_JARSIGNER_EXECUTABLE
)
# LEGACY
set(JAVA_RUNTIME ${Java_JAVA_EXECUTABLE})
set(JAVA_ARCHIVE ${Java_JAR_EXECUTABLE})
set(JAVA_COMPILE ${Java_JAVAC_EXECUTABLE})
+40
View File
@@ -0,0 +1,40 @@
# - Find Iberty
# This module finds libiberty.
#
# It sets the following variables:
# IBERTY_LIBRARIES - The libiberty library to link against.
# For Debian <= wheezy, use libiberty_pic.a from binutils-dev
# For Debian >= jessie, use libiberty.a from libiberty-dev
# For all RHEL/Fedora, use libiberty.a from binutils-devel
FIND_LIBRARY( IBERTY_LIBRARIES
NAMES iberty_pic iberty
HINTS ${IBERTY_LIBRARIES}
PATHS
/usr/lib
/usr/lib64
/usr/local/lib
/usr/local/lib64
/opt/local/lib
/opt/local/lib64
/sw/lib
ENV LIBRARY_PATH
ENV LD_LIBRARY_PATH
)
IF (IBERTY_LIBRARIES)
# show which libiberty was found only if not quiet
MESSAGE( STATUS "Found libiberty: ${IBERTY_LIBRARIES}")
SET(IBERTY_FOUND TRUE)
ELSE (IBERTY_LIBRARIES)
IF (IBERTY_FIND_REQUIRED)
MESSAGE(FATAL_ERROR "Could not find libiberty. Try to install binutil-devel?")
ELSE()
MESSAGE(STATUS "Could not find libiberty; downloading binutils and building PIC libiberty.")
ENDIF (IBERTY_FIND_REQUIRED)
ENDIF (IBERTY_LIBRARIES)
+18
View File
@@ -0,0 +1,18 @@
message(STATUS "Resolving GIT Version")
set(GIT_REVISION "")
find_package(Git)
if(GIT_FOUND)
execute_process(
COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD
WORKING_DIRECTORY "${local_dir}"
OUTPUT_VARIABLE GIT_REVISION
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE
)
message(STATUS "GIT hash: ${GIT_REVISION}")
else()
message(STATUS "GIT not found")
endif()
+16
View File
@@ -0,0 +1,16 @@
macro(MACRO_ENSURE_OUT_OF_SOURCE_BUILD MSG)
string(COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" insource)
get_filename_component(PARENTDIR ${CMAKE_SOURCE_DIR} PATH)
string(COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${PARENTDIR}" insourcesubdir)
if(insource OR insourcesubdir)
message(FATAL_ERROR "${MSG}")
endif(insource OR insourcesubdir)
endmacro(MACRO_ENSURE_OUT_OF_SOURCE_BUILD)
function(UTILS_LIST_PREPEND var prefix)
set(_collector)
foreach(n ${ARGN})
list(APPEND _collector "${prefix}${n}")
endforeach()
set(${var} ${_collector} PARENT_SCOPE)
endfunction(UTILS_LIST_PREPEND)
+5
View File
@@ -0,0 +1,5 @@
#include <stdlib.h>
int main(int argc, char **argv) {
qsort_r(0, 0, 0, 0, 0);
return 0;
}
+7
View File
@@ -0,0 +1,7 @@
if (NOT DEFINED HAVE_QSORT_R)
try_compile(HAVE_QSORT_R
"${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/"
"${CMAKE_CURRENT_LIST_DIR}/TestQSortR.c")
endif()
+361
View File
@@ -0,0 +1,361 @@
## -*- mode:cmake; coding:utf-8; -*-
# Copyright (c) 2010 Daniel Pfeifer <daniel@pfeifer-mail.de>
# Changes Copyright (c) 2011 2012 Rüdiger Sonderfeld <ruediger@c-plusplus.de>
#
# UploadPPA.cmake is free software. It comes without any warranty,
# to the extent permitted by applicable law. You can redistribute it
# and/or modify it under the terms of the Do What The Fuck You Want
# To Public License, Version 2, as published by Sam Hocevar. See
# http://sam.zoy.org/wtfpl/COPYING for more details.
#
##
# Documentation
#
# This CMake module uploads a project to a PPA. It creates all the files
# necessary (similar to CPack) and uses debuild(1) and dput(1) to create the
# package and upload it to a PPA. A PPA is a Personal Package Archive and can
# be used by Debian/Ubuntu or other apt/deb based distributions to install and
# update packages from a remote repository.
# Canonicals Launchpad (http://launchpad.net) is usually used to host PPAs.
# See https://help.launchpad.net/Packaging/PPA for further information
# about PPAs.
#
# UploadPPA.cmake uses similar settings to CPack and the CPack DEB Generator.
# Additionally the following variables are used
#
# CPACK_DEBIAN_PACKAGE_BUILD_DEPENDS to specify build dependencies
# (cmake is added as default)
# CPACK_DEBIAN_RESOURCE_FILE_CHANGELOG should point to a file containing the
# changelog in debian format. If not set it checks whether a file
# debian/changelog exists in the source directory or creates a simply changelog
# file.
# CPACK_DEBIAN_UPDATE_CHANGELOG if set to True then UploadPPA.cmake adds a new
# entry to the changelog with the current version number and distribution name
# (lsb_release -c is used). This can be useful because debuild uses the latest
# version number from the changelog and the version number set in
# CPACK_PACKAGE_VERSION. If they mismatch the creation of the package fails.
#
## A.Hoarau : CHANGELOG_MESSAGE can be used to pass a custom changelog message
# Check packages
#
# ./configure -DENABLE_PPA=On
# make dput
# cd build/Debian/${DISTRI}
# dpkg-source -x vobsub2srt_1.0pre4-ppa1.dsc
# cd vobsub2srt-1.0pre4/
# debuild -i -us -uc -sa -b
#
# Check the lintian warnings!
#
##
# TODO
# I plan to add support for git dch (from git-buildpackage) to auto generate
# the changelog.
##
find_program(DEBUILD_EXECUTABLE debuild)
find_program(DPUT_EXECUTABLE dput)
if(NOT DEBUILD_EXECUTABLE OR NOT DPUT_EXECUTABLE)
message(WARNING "Debuild or dput not installed, please run sudo apt-get install devscripts")
return()
endif(NOT DEBUILD_EXECUTABLE OR NOT DPUT_EXECUTABLE)
if(NOT PROJECT_PPA_DISTRIB_TARGET)
execute_process(
COMMAND lsb_release -cs
OUTPUT_VARIABLE DISTRI
OUTPUT_STRIP_TRAILING_WHITESPACE)
set(PROJECT_PPA_DISTRIB_TARGET ${DISTRI})
message(STATUS "PROJECT_PPA_DISTRIB_TARGET NOT provided, so using system settings : ${DISTRI}")
endif()
foreach(DISTRI ${PROJECT_PPA_DISTRIB_TARGET})
message(STATUS "Building for ${DISTRI}")
# Strip "-dirty" flag from package version.
# It can be added by, e.g., git describe but it causes trouble with debuild etc.
string(REPLACE "-dirty" "" CPACK_PACKAGE_VERSION ${CPACK_PACKAGE_VERSION})
message(STATUS "version: ${CPACK_PACKAGE_VERSION}")
# DEBIAN/control
# debian policy enforce lower case for package name
# Package: (mandatory)
IF(NOT CPACK_DEBIAN_PACKAGE_NAME)
STRING(TOLOWER "${CPACK_PACKAGE_NAME}" CPACK_DEBIAN_PACKAGE_NAME)
ENDIF(NOT CPACK_DEBIAN_PACKAGE_NAME)
# Section: (recommended)
IF(NOT CPACK_DEBIAN_PACKAGE_SECTION)
SET(CPACK_DEBIAN_PACKAGE_SECTION "devel")
ENDIF(NOT CPACK_DEBIAN_PACKAGE_SECTION)
# Priority: (recommended)
IF(NOT CPACK_DEBIAN_PACKAGE_PRIORITY)
SET(CPACK_DEBIAN_PACKAGE_PRIORITY "optional")
ENDIF(NOT CPACK_DEBIAN_PACKAGE_PRIORITY)
if(NOT CPACK_DEBIAN_PACKAGE_MAINTAINER)
set(CPACK_DEBIAN_PACKAGE_MAINTAINER ${CPACK_PACKAGE_CONTACT})
endif()
if(NOT CPACK_PACKAGE_DESCRIPTION AND EXISTS ${CPACK_PACKAGE_DESCRIPTION_FILE})
file(STRINGS ${CPACK_PACKAGE_DESCRIPTION_FILE} DESC_LINES)
foreach(LINE ${DESC_LINES})
set(deb_long_description "${deb_long_description} ${LINE}\n")
endforeach(LINE ${DESC_LINES})
else()
# add space before each line
string(REPLACE "\n" "\n " deb_long_description " ${CPACK_PACKAGE_DESCRIPTION}")
endif()
if(PPA_DEBIAN_VERSION)
set(DEBIAN_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION}-${PPA_DEBIAN_VERSION}~${DISTRI}1")
elseif(NOT PPA_DEBIAN_VERSION AND NOT PROJECT_PPA_DISTRIB_TARGET)
message(WARNING "Variable PPA_DEBIAN_VERSION not set! Building 'native' package!")
set(DEBIAN_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION}")
else()
set(DEBIAN_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION}~${DISTRI}1")
endif()
message(STATUS "Debian version: ${DEBIAN_PACKAGE_VERSION}")
set(DEBIAN_SOURCE_DIR ${CMAKE_BINARY_DIR}/Debian/${DISTRI}/${CPACK_DEBIAN_PACKAGE_NAME}_${DEBIAN_PACKAGE_VERSION})
##############################################################################
# debian/control
set(debian_control ${DEBIAN_SOURCE_DIR}/debian/control)
list(APPEND CPACK_DEBIAN_PACKAGE_BUILD_DEPENDS "cmake" "debhelper (>= 7.0.50)")
list(REMOVE_DUPLICATES CPACK_DEBIAN_PACKAGE_BUILD_DEPENDS)
list(SORT CPACK_DEBIAN_PACKAGE_BUILD_DEPENDS)
string(REPLACE ";" ", " build_depends "${CPACK_DEBIAN_PACKAGE_BUILD_DEPENDS}")
string(REPLACE ";" ", " bin_depends "${CPACK_DEBIAN_PACKAGE_DEPENDS}")
file(WRITE ${debian_control}
"Source: ${CPACK_DEBIAN_PACKAGE_NAME}\n"
"Section: ${CPACK_DEBIAN_PACKAGE_SECTION}\n"
"Priority: ${CPACK_DEBIAN_PACKAGE_PRIORITY}\n"
"Maintainer: ${CPACK_DEBIAN_PACKAGE_MAINTAINER}\n"
"Build-Depends: ${build_depends}\n"
"Standards-Version: 3.9.7\n"
"Homepage: ${CPACK_DEBIAN_PACKAGE_HOMEPAGE}\n"
"\n"
"Package: ${CPACK_DEBIAN_PACKAGE_NAME}\n"
"Architecture: ${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}\n"
"Depends: ${bin_depends}, \${shlibs:Depends}, \${misc:Depends}\n"
"Description: ${CPACK_PACKAGE_DESCRIPTION_SUMMARY}\n"
"${deb_long_description}"
)
file(APPEND ${debian_control}
"\n\n"
"Package: ${CPACK_DEBIAN_PACKAGE_NAME}-dbg\n"
"Priority: extra\n"
"Section: debug\n"
"Architecture: any\n"
"Depends: ${CPACK_DEBIAN_PACKAGE_NAME} (= \${binary:Version}), \${shlibs:Depends}, \${misc:Depends}\n"
"Description: ${CPACK_PACKAGE_DESCRIPTION_SUMMARY}\n"
"${deb_long_description}"
"\n .\n"
" This is the debugging symbols for the ${CPACK_DEBIAN_PACKAGE_NAME} library"
)
foreach(COMPONENT ${CPACK_COMPONENTS_ALL})
string(TOUPPER ${COMPONENT} UPPER_COMPONENT)
set(DEPENDS "${CPACK_DEBIAN_PACKAGE_NAME}")
foreach(DEP ${CPACK_COMPONENT_${UPPER_COMPONENT}_DEPENDS})
set(DEPENDS "${DEPENDS}, ${CPACK_DEBIAN_PACKAGE_NAME}-${DEP}")
endforeach(DEP ${CPACK_COMPONENT_${UPPER_COMPONENT}_DEPENDS})
file(APPEND ${debian_control} "\n"
"Package: ${CPACK_DEBIAN_PACKAGE_NAME}-${COMPONENT}\n"
"Architecture: ${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}\n"
"Depends: ${DEPENDS}\n"
"Description: ${CPACK_PACKAGE_DESCRIPTION_SUMMARY}"
": ${CPACK_COMPONENT_${UPPER_COMPONENT}_DISPLAY_NAME}\n"
"${deb_long_description}"
"\n .\n"
" ${CPACK_COMPONENT_${UPPER_COMPONENT}_DESCRIPTION}\n"
)
endforeach(COMPONENT ${CPACK_COMPONENTS_ALL})
##############################################################################
# debian/copyright
set(debian_copyright ${DEBIAN_SOURCE_DIR}/debian/copyright)
configure_file(${CPACK_RESOURCE_FILE_LICENSE} ${debian_copyright} COPYONLY)
##############################################################################
# debian/rules
set(debian_rules ${DEBIAN_SOURCE_DIR}/debian/rules)
file(WRITE ${debian_rules}
"#!/usr/bin/make -f\n"
"\nexport DH_VERBOSE=1"
"\n\n%:\n"
"\tdh $@ --buildsystem=cmake\n"
"\noverride_dh_auto_configure:\n"
"\tDESTDIR=\"$(CURDIR)/debian/${CPACK_DEBIAN_PACKAGE_NAME}\" dh_auto_configure -- -DCMAKE_BUILD_TYPE=RelWithDebInfo -DPACKAGE_TGZ=OFF ${DEB_CMAKE_ARGS}"
"\n\noverride_dh_auto_install:\n"
"\tdh_auto_install --destdir=\"$(CURDIR)/debian/${CPACK_DEBIAN_PACKAGE_NAME}\" --buildsystem=cmake"
"\n\noverride_dh_strip:\n"
"\tdh_strip --dbg-package=${CPACK_DEBIAN_PACKAGE_NAME}-dbg"
)
execute_process(COMMAND chmod +x ${debian_rules})
##############################################################################
# debian/compat
file(WRITE ${DEBIAN_SOURCE_DIR}/debian/compat "7")
##############################################################################
# debian/source/format
file(WRITE ${DEBIAN_SOURCE_DIR}/debian/source/format "3.0 (native)")
##############################################################################
# debian/changelog
set(debian_changelog ${DEBIAN_SOURCE_DIR}/debian/changelog)
if(NOT CPACK_DEBIAN_RESOURCE_FILE_CHANGELOG)
set(CPACK_DEBIAN_RESOURCE_FILE_CHANGELOG ${CMAKE_SOURCE_DIR}/debian/changelog)
endif()
# TODO add support for git dch (git-buildpackage)
if(CHANGELOG_MESSAGE)
set(output_changelog_msg ${CHANGELOG_MESSAGE})
else()
set(output_changelog_msg "* Package created with CMake")
endif(CHANGELOG_MESSAGE)
message(STATUS "Changelog message : \"${output_changelog_msg}\"")
if(EXISTS ${CPACK_DEBIAN_RESOURCE_FILE_CHANGELOG})
configure_file(${CPACK_DEBIAN_RESOURCE_FILE_CHANGELOG} ${debian_changelog} COPYONLY)
if(CPACK_DEBIAN_UPDATE_CHANGELOG)
file(READ ${debian_changelog} debian_changelog_content)
execute_process(
COMMAND date -R
OUTPUT_VARIABLE DATE_TIME
OUTPUT_STRIP_TRAILING_WHITESPACE)
file(WRITE ${debian_changelog}
"${CPACK_DEBIAN_PACKAGE_NAME} (${DEBIAN_PACKAGE_VERSION}) ${DISTRI}; urgency=low\n\n"
" ${output_changelog_msg}\n\n"
" -- ${CPACK_DEBIAN_PACKAGE_MAINTAINER} ${DATE_TIME}\n\n"
)
file(APPEND ${debian_changelog} ${debian_changelog_content})
endif()
else()
execute_process(
COMMAND date -R
OUTPUT_VARIABLE DATE_TIME
OUTPUT_STRIP_TRAILING_WHITESPACE)
file(WRITE ${debian_changelog}
"${CPACK_DEBIAN_PACKAGE_NAME} (${DEBIAN_PACKAGE_VERSION}) ${DISTRI}; urgency=low\n\n"
" ${output_changelog_msg}\n\n"
" -- ${CPACK_DEBIAN_PACKAGE_MAINTAINER} ${DATE_TIME}\n"
)
#configure_file(${debian_changelog} ${CPACK_DEBIAN_RESOURCE_FILE_CHANGELOG} COPYONLY)
endif()
##########################################################################
# Templates
if (CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA)
foreach(CF ${CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA})
get_filename_component(CF_NAME ${CF} NAME)
message("Writing debian/${CF_NAME}")
configure_file(${CF} ${DEBIAN_SOURCE_DIR}/debian/${CF_NAME} @ONLY)
endforeach()
endif(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA)
##########################################################################
# .orig.tar.gz
#execute_process(COMMAND date +%y%m%d
# OUTPUT_VARIABLE day_suffix
# OUTPUT_STRIP_TRAILING_WHITESPACE
# )
set(CPACK_SOURCE_IGNORE_FILES
${CPACK_SOURCE_IGNORE_FILES}
"/build.*/"
"/Testing/"
"/test/"
"/tmp/"
"/packaging/"
"/debian/"
"/node_modules/"
"/\\\\.git.*"
"/\\\\.idea/"
"/\\\\.codelite/"
"*~$")
#set(package_file_name "${CPACK_DEBIAN_PACKAGE_NAME}_${DEBIAN_PACKAGE_VERSION}")
set(package_file_name "${CPACK_DEBIAN_PACKAGE_NAME}_${CPACK_PACKAGE_VERSION}")
file(WRITE "${CMAKE_BINARY_DIR}/Debian/${DISTRI}/cpack.cmake"
"set(CPACK_GENERATOR TGZ)\n"
"set(CPACK_PACKAGE_NAME \"${CPACK_DEBIAN_PACKAGE_NAME}\")\n"
"set(CPACK_PACKAGE_VERSION \"${CPACK_PACKAGE_VERSION}\")\n"
"set(CPACK_PACKAGE_FILE_NAME \"${package_file_name}.orig\")\n"
"set(CPACK_PACKAGE_DESCRIPTION \"${CPACK_PACKAGE_NAME} Source\")\n"
"set(CPACK_IGNORE_FILES \"${CPACK_SOURCE_IGNORE_FILES}\")\n"
"set(CPACK_INSTALLED_DIRECTORIES \"${CPACK_SOURCE_INSTALLED_DIRECTORIES}\")\n"
"set(CPACK_INSTALL_SCRIPT \"${CPACK_SOURCE_INSTALL_SCRIPT}\")\n"
"set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY OFF)\n"
)
set(orig_file "${CMAKE_BINARY_DIR}/Debian/${DISTRI}/${package_file_name}.orig.tar.gz")
add_custom_command(OUTPUT ${orig_file}
COMMAND cpack --config ${CMAKE_BINARY_DIR}/Debian/${DISTRI}/cpack.cmake
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/Debian/${DISTRI}
)
add_custom_command(OUTPUT ${DEBIAN_SOURCE_DIR}/CMakeLists.txt
COMMAND tar zxf ${orig_file}
WORKING_DIRECTORY ${DEBIAN_SOURCE_DIR}
DEPENDS ${orig_file}
)
##############################################################################
# debuild -S
set(DEB_SOURCE_CHANGES
${CPACK_DEBIAN_PACKAGE_NAME}_${DEBIAN_PACKAGE_VERSION}_source.changes
)
add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/Debian/${DISTRI}/${DEB_SOURCE_CHANGES}
COMMAND ${DEBUILD_EXECUTABLE} --no-tgz-check -S
WORKING_DIRECTORY ${DEBIAN_SOURCE_DIR}
)
add_custom_target(debuild_${DISTRI} ALL
DEPENDS ${DEBIAN_SOURCE_DIR}/CMakeLists.txt
${CMAKE_BINARY_DIR}/Debian/${DISTRI}/${DEB_SOURCE_CHANGES}
)
##############################################################################
# dput ppa:your-lp-id/ppa <source.changes>
message(STATUS "Upload PPA is ${UPLOAD_PPA}")
if(UPLOAD_PPA)
if (EXISTS ${DPUT_CONFIG_IN})
set(DPUT_DIST ${DISTRI})
configure_file(
${DPUT_CONFIG_IN}
${CMAKE_BINARY_DIR}/Debian/${DISTRI}/dput.cf
@ONLY
)
add_custom_target(dput_${DISTRI} ALL
COMMAND ${DPUT_EXECUTABLE} -c ${CMAKE_BINARY_DIR}/Debian/${DISTRI}/dput.cf ${DPUT_HOST} ${DEB_SOURCE_CHANGES}
DEPENDS debuild_${DISTRI}
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/Debian/${DISTRI}
)
else()
add_custom_target(dput_${DISTRI} ALL
COMMAND ${DPUT_EXECUTABLE} ${DPUT_HOST} ${DEB_SOURCE_CHANGES}
DEPENDS debuild_${DISTRI}
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/Debian/${DISTRI}
)
endif()
endif()
endforeach(DISTRI)
+53
View File
@@ -0,0 +1,53 @@
if (NOT CMAKE_HOST_UNIX OR NOT WIN32)
return()
endif()
find_program(WINTOOLS_WINE_EXEC wine)
if (NOT WINTOOLS_WINE_EXEC)
message("Wine executable not found! Failed to initiate wintools staff.")
return()
endif()
find_program(WINTOOLS_WGET_EXEC wget)
if (NOT WINTOOLS_WGET_EXEC)
message("Wget executable not found! Failed to initiate wintools staff.")
return()
endif()
set(WINTOOLS_DIR ${CMAKE_BINARY_DIR}/WINTOOLS)
set(WINTOOLS_DL_ROOT "http://softmotions.com/windev")
if (NOT EXISTS ${WINTOOLS_DIR})
file(MAKE_DIRECTORY ${WINTOOLS_DIR})
endif()
set(WINTOOLS_EXECS)
foreach (WINTOOLS_EXEC link.exe lib.exe mspdb100.dll)
if (NOT EXISTS ${WINTOOLS_DIR}/${WINTOOLS_EXEC})
add_custom_command(OUTPUT ${WINTOOLS_DIR}/${WINTOOLS_EXEC}
COMMAND ${WINTOOLS_WGET_EXEC} ${WINTOOLS_DL_ROOT}/${WINTOOLS_EXEC} -nv -O${WINTOOLS_DIR}/${WINTOOLS_EXEC}
WORKING_DIRECTORY ${WINTOOLS_DIR})
list(APPEND WINTOOLS_EXECS ${WINTOOLS_DIR}/${WINTOOLS_EXEC})
endif()
endforeach(WINTOOLS_EXEC)
add_custom_target(wintools_init
DEPENDS ${WINTOOLS_EXECS})
if (CMAKE_SIZEOF_VOID_P MATCHES 8)
set(WINTOOLS_LIB_MACHINE "X64")
else()
set(WINTOOLS_LIB_MACHINE "X86")
endif()
message("${PROJECT_NAME} WINTOOLS_LIB_MACHINE: ${WINTOOLS_LIB_MACHINE}")
macro(add_w32_importlib tgt libname wdir)
add_custom_command(
TARGET ${tgt}
POST_BUILD
COMMAND ${WINTOOLS_WINE_EXEC} ${WINTOOLS_DIR}/lib.exe /def:${libname}.def /machine:${WINTOOLS_LIB_MACHINE}
WORKING_DIRECTORY ${wdir}
)
endmacro(add_w32_importlib)
+78
View File
@@ -0,0 +1,78 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (c) 2021 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import sys
import argparse
import os
import shutil
def copy_file(src_dir, dst_dir):
if not os.path.exists(dst_dir):
os.makedirs(dst_dir)
headers = [
'basedefs.h',
'fs/iwdlsnr.h',
'fs/iwexfile.h',
'fs/iwfile.h',
'fs/iwfsmfile.h',
'iowow.h',
#'kv/iwal.h',
'kv/iwkv.h',
#'kv/iwkv_internal.h',
#'kv/tests/iwkv_tests.h',
'log/iwlog.h',
'platform/iwp.h',
#'platform/win32/mman/mman.h',
'rdb/iwrdb.h',
'tmpl/iwcfg.h',
'utils/iwarr.h',
'utils/iwbits.h',
'utils/iwconv.h',
'utils/iwhmap.h',
'utils/iwpool.h',
'utils/iwsha2.h',
'utils/iwstree.h',
'utils/iwstw.h',
'utils/iwth.h',
'utils/iwutils.h',
'utils/iwuuid.h',
'utils/iwxstr.h',
#'utils/kbtree.h',
#'utils/khash.h',
#'utils/ksort.h',
#'utils/mt19937ar.h',
'utils/murmur3.h',
#'utils/pthread_spin_lock_shim.h'
]
for header in headers:
src_file = os.path.join(src_dir, header)
file_tags = header.split('/')
if (len(file_tags) == 1):
des_file = os.path.join(dst_dir, header)
else:
des_file = os.path.join(dst_dir, file_tags[len(file_tags) - 1])
shutil.copy2(src_file, des_file)
def main():
parser = argparse.ArgumentParser()
parser.add_argument('--src-dir', help='source path of iowow header file', required=True)
parser.add_argument('--dst-dir', help='destion path of iowow header file', required=True)
args = parser.parse_args()
print('copy from %s to %s', args.src_dir, args.dst_dir)
copy_file(args.src_dir, args.dst_dir)
return 0
if __name__ == '__main__':
sys.exit(main())
+22
View File
@@ -0,0 +1,22 @@
FROM alpine:3.9
MAINTAINER Anton Adamansky <adamansky@gmail.com>
RUN apk add --no-cache cmake gcc binutils libc-dev git ninja
RUN git clone https://github.com/Softmotions/ejdb.git && \
mkdir -p ejdb/build
WORKDIR ejdb/build
RUN cmake .. -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/opt/ejdb2 && \
ninja install && \
mkdir -p /ejdb2_data
VOLUME ["/ejdb2_data"]
EXPOSE 9191
WORKDIR /ejdb2_data
ENTRYPOINT ["/opt/ejdb2/bin/jbs", "-b", "0.0.0.0"]
+15
View File
@@ -0,0 +1,15 @@
# Docker support
If you have [Docker]("https://www.docker.com/") installed, you can build a Docker image and run it in a container
```
cd docker
docker build -t ejdb2 .
docker run -d -p 9191:9191 --name myEJDB ejdb2 --access myAccessKey
```
or get an image of `ejdb2` directly from the Docker Hub
```
docker run -d -p 9191:9191 --name myEJDB softmotions/ejdb2 --access myAccessKey
```
+28
View File
@@ -0,0 +1,28 @@
# EJDB2 testbed docker image
FROM ubuntu:xenial
LABEL maintainer="adamansky@gmail.com"
RUN mkdir /setup
WORKDIR /setup
COPY ./*.sh ./
RUN ./setup.sh
VOLUME /home/worker/.jenkins
VOLUME /home/worker/agent
USER root
COPY jenkins-agent /usr/local/bin/jenkins-agent
RUN chmod +x /usr/local/bin/jenkins-agent &&\
ln -s /usr/local/bin/jenkins-agent /usr/local/bin/jenkins-slave
USER worker
WORKDIR /home/worker
ENTRYPOINT ["/usr/local/bin/jenkins-agent"]
+117
View File
@@ -0,0 +1,117 @@
#!/usr/bin/env bash
# The MIT License
#
# Copyright (c) 2015-2020, CloudBees, Inc.
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
# Usage jenkins-agent.sh [options] -url http://jenkins [SECRET] [AGENT_NAME]
# Optional environment variables :
# * JENKINS_TUNNEL : HOST:PORT for a tunnel to route TCP traffic to jenkins host, when jenkins can't be directly accessed over network
# * JENKINS_URL : alternate jenkins URL
# * JENKINS_SECRET : agent secret, if not set as an argument
# * JENKINS_AGENT_NAME : agent name, if not set as an argument
# * JENKINS_AGENT_WORKDIR : agent work directory, if not set by optional parameter -workDir
# * JENKINS_WEB_SOCKET: true if the connection should be made via WebSocket rather than TCP
# * JENKINS_DIRECT_CONNECTION: Connect directly to this TCP agent port, skipping the HTTP(S) connection parameter download.
# Value: "<HOST>:<PORT>"
# * JENKINS_INSTANCE_IDENTITY: The base64 encoded InstanceIdentity byte array of the Jenkins master. When this is set,
# the agent skips connecting to an HTTP(S) port for connection info.
# * JENKINS_PROTOCOLS: Specify the remoting protocols to attempt when instanceIdentity is provided.
if [ $# -eq 1 ]; then
# if `docker run` only has one arguments, we assume user is running alternate command like `bash` to inspect the image
exec "$@"
else
# if -tunnel is not provided, try env vars
case "$@" in
*"-tunnel "*) ;;
*)
if [ ! -z "$JENKINS_TUNNEL" ]; then
TUNNEL="-tunnel $JENKINS_TUNNEL"
fi ;;
esac
# if -workDir is not provided, try env vars
if [ ! -z "$JENKINS_AGENT_WORKDIR" ]; then
case "$@" in
*"-workDir"*) echo "Warning: Work directory is defined twice in command-line arguments and the environment variable" ;;
*)
WORKDIR="-workDir $JENKINS_AGENT_WORKDIR" ;;
esac
fi
if [ -n "$JENKINS_URL" ]; then
URL="-url $JENKINS_URL"
fi
if [ -n "$JENKINS_NAME" ]; then
JENKINS_AGENT_NAME="$JENKINS_NAME"
fi
if [ "$JENKINS_WEB_SOCKET" = true ]; then
WEB_SOCKET=-webSocket
fi
if [ -n "$JENKINS_PROTOCOLS" ]; then
PROTOCOLS="-protocols $JENKINS_PROTOCOLS"
fi
if [ -n "$JENKINS_DIRECT_CONNECTION" ]; then
DIRECT="-direct $JENKINS_DIRECT_CONNECTION"
fi
if [ -n "$JENKINS_INSTANCE_IDENTITY" ]; then
INSTANCE_IDENTITY="-instanceIdentity $JENKINS_INSTANCE_IDENTITY"
fi
# if java home is defined, use it
JAVA_BIN="java"
if [ "$JAVA_HOME" ]; then
JAVA_BIN="$JAVA_HOME/bin/java"
fi
# if both required options are defined, do not pass the parameters
OPT_JENKINS_SECRET=""
if [ -n "$JENKINS_SECRET" ]; then
case "$@" in
*"${JENKINS_SECRET}"*) echo "Warning: SECRET is defined twice in command-line arguments and the environment variable" ;;
*)
OPT_JENKINS_SECRET="${JENKINS_SECRET}" ;;
esac
fi
OPT_JENKINS_AGENT_NAME=""
if [ -n "$JENKINS_AGENT_NAME" ]; then
case "$@" in
*"${JENKINS_AGENT_NAME}"*) echo "Warning: AGENT_NAME is defined twice in command-line arguments and the environment variable" ;;
*)
OPT_JENKINS_AGENT_NAME="${JENKINS_AGENT_NAME}" ;;
esac
fi
#TODO: Handle the case when the command-line and Environment variable contain different values.
#It is fine it blows up for now since it should lead to an error anyway.
exec $JAVA_BIN $JAVA_OPTS -cp /usr/share/jenkins/agent.jar hudson.remoting.jnlp.Main -headless $TUNNEL $URL $WORKDIR $WEB_SOCKET $DIRECT $PROTOCOLS $INSTANCE_IDENTITY $OPT_JENKINS_SECRET $OPT_JENKINS_AGENT_NAME "$@"
fi
+76
View File
@@ -0,0 +1,76 @@
#!/usr/bin/env bash
set -e
set -x
function register_clang_version {
local version=$1
local priority=$2
update-alternatives \
--install /usr/bin/llvm-config llvm-config /usr/bin/llvm-config-${version} ${priority} \
--slave /usr/bin/llvm-addr2line llvm-addr2line /usr/bin/llvm-addr2line-${version} \
--slave /usr/bin/llvm-ar llvm-ar /usr/bin/llvm-ar-${version} \
--slave /usr/bin/llvm-as llvm-as /usr/bin/llvm-as-${version} \
--slave /usr/bin/llvm-bcanalyzer llvm-bcanalyzer /usr/bin/llvm-bcanalyzer-${version} \
--slave /usr/bin/llvm-cov llvm-cov /usr/bin/llvm-cov-${version} \
--slave /usr/bin/llvm-diff llvm-diff /usr/bin/llvm-diff-${version} \
--slave /usr/bin/llvm-dis llvm-dis /usr/bin/llvm-dis-${version} \
--slave /usr/bin/llvm-dwarfdump llvm-dwarfdump /usr/bin/llvm-dwarfdump-${version} \
--slave /usr/bin/llvm-exegesis llvm-exegesis /usr/bin/llvm-exegesis-${version} \
--slave /usr/bin/llvm-extract llvm-extract /usr/bin/llvm-extract-${version} \
--slave /usr/bin/llvm-link llvm-link /usr/bin/llvm-link-${version} \
--slave /usr/bin/llvm-lipo llvm-lipo /usr/bin/llvm-lipo-${version} \
--slave /usr/bin/llvm-lto llvm-lto /usr/bin/llvm-lto-${version} \
--slave /usr/bin/llvm-lto2 llvm-lto2 /usr/bin/llvm-lto2-${version} \
--slave /usr/bin/llvm-mc llvm-mc /usr/bin/llvm-mc-${version} \
--slave /usr/bin/llvm-mcmarkup llvm-mcmarkup /usr/bin/llvm-mcmarkup-${version} \
--slave /usr/bin/llvm-nm llvm-nm /usr/bin/llvm-nm-${version} \
--slave /usr/bin/llvm-objcopy llvm-objcopy /usr/bin/llvm-objcopy-${version} \
--slave /usr/bin/llvm-objdump llvm-objdump /usr/bin/llvm-objdump-${version} \
--slave /usr/bin/llvm-opt-report llvm-opt-report /usr/bin/llvm-opt-report-${version} \
--slave /usr/bin/llvm-pdbutil llvm-pdbutil /usr/bin/llvm-pdbutil-${version} \
--slave /usr/bin/llvm-profdata llvm-profdata /usr/bin/llvm-profdata-${version} \
--slave /usr/bin/llvm-ranlib llvm-ranlib /usr/bin/llvm-ranlib-${version} \
--slave /usr/bin/llvm-rc llvm-rc /usr/bin/llvm-rc-${version} \
--slave /usr/bin/llvm-readelf llvm-readelf /usr/bin/llvm-readelf-${version} \
--slave /usr/bin/llvm-readobj llvm-readobj /usr/bin/llvm-readobj-${version} \
--slave /usr/bin/llvm-rtdyld llvm-rtdyld /usr/bin/llvm-rtdyld-${version} \
--slave /usr/bin/llvm-size llvm-size /usr/bin/llvm-size-${version} \
--slave /usr/bin/llvm-split llvm-split /usr/bin/llvm-split-${version} \
--slave /usr/bin/llvm-stress llvm-stress /usr/bin/llvm-stress-${version} \
--slave /usr/bin/llvm-strip llvm-strip /usr/bin/llvm-strip-${version} \
--slave /usr/bin/llvm-symbolizer llvm-symbolizer /usr/bin/llvm-symbolizer-${version} \
--slave /usr/bin/llvm-tblgen llvm-tblgen /usr/bin/llvm-tblgen-${version} \
--slave /usr/bin/llvm-undname llvm-undname /usr/bin/llvm-undname-${version}
update-alternatives \
--install /usr/bin/clang clang /usr/bin/clang-${version} ${priority} \
--slave /usr/bin/asan_symbolize asan_symbolize /usr/bin/asan_symbolize-${version} \
--slave /usr/bin/c-index-test c-index-test /usr/bin/c-index-test-${version} \
--slave /usr/bin/clang++ clang++ /usr/bin/clang++-${version} \
--slave /usr/bin/clang-check clang-check /usr/bin/clang-check-${version} \
--slave /usr/bin/clang-cl clang-cl /usr/bin/clang-cl-${version} \
--slave /usr/bin/clang-cpp clang-cpp /usr/bin/clang-cpp-${version} \
--slave /usr/bin/clang-format clang-format /usr/bin/clang-format-${version} \
--slave /usr/bin/clang-format-diff clang-format-diff /usr/bin/clang-format-diff-${version} \
--slave /usr/bin/clang-import-test clang-import-test /usr/bin/clang-import-test-${version} \
--slave /usr/bin/clang-include-fixer clang-include-fixer /usr/bin/clang-include-fixer-${version} \
--slave /usr/bin/clang-offload-bundler clang-offload-bundler /usr/bin/clang-offload-bundler-${version} \
--slave /usr/bin/clang-query clang-query /usr/bin/clang-query-${version} \
--slave /usr/bin/clang-rename clang-rename /usr/bin/clang-rename-${version} \
--slave /usr/bin/clang-reorder-fields clang-reorder-fields /usr/bin/clang-reorder-fields-${version} \
--slave /usr/bin/clang-tidy clang-tidy /usr/bin/clang-tidy-${version} \
--slave /usr/bin/clangd clangd /usr/bin/clangd-${version} \
--slave /usr/bin/lld lld /usr/bin/lld-${version} \
--slave /usr/bin/lld-link lld-link /usr/bin/lld-link-${version} \
--slave /usr/bin/lldb lldb /usr/bin/lldb-${version} \
--slave /usr/bin/lldb-argdumper lldb-argdumper /usr/bin/lldb-argdumper-${version} \
--slave /usr/bin/lldb-instr lldb-instr /usr/bin/lldb-instr-${version} \
--slave /usr/bin/lldb-server lldb-server /usr/bin/lldb-server-${version} \
--slave /usr/bin/lldb-vscode lldb-vscode /usr/bin/lldb-vscode-${version} \
--slave /usr/bin/lli lli /usr/bin/lli-${version} \
--slave /usr/bin/lli-child-target lli-child-target /usr/bin/lli-child-target-${version}
}
register_clang_version $1 $2
+62
View File
@@ -0,0 +1,62 @@
#!/bin/bash
################################################################################
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
################################################################################
#
# This script will install the llvm toolchain on the different
# Debian and Ubuntu versions
set -eux
# read optional command line argument
LLVM_VERSION=10
if [ "$#" -eq 1 ]; then
LLVM_VERSION=$1
fi
DISTRO=$(lsb_release -is)
VERSION=$(lsb_release -sr)
DIST_VERSION="${DISTRO}_${VERSION}"
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root!"
exit 1
fi
declare -A LLVM_VERSION_PATTERNS
LLVM_VERSION_PATTERNS[9]="-9"
LLVM_VERSION_PATTERNS[10]="-10"
LLVM_VERSION_PATTERNS[11]="-11"
if [ ! ${LLVM_VERSION_PATTERNS[$LLVM_VERSION]+_} ]; then
echo "This script does not support LLVM version $LLVM_VERSION"
exit 3
fi
LLVM_VERSION_STRING=${LLVM_VERSION_PATTERNS[$LLVM_VERSION]}
# find the right repository name for the distro and version
case "$DIST_VERSION" in
Debian_9* ) REPO_NAME="deb http://apt.llvm.org/stretch/ llvm-toolchain-stretch$LLVM_VERSION_STRING main" ;;
Debian_10* ) REPO_NAME="deb http://apt.llvm.org/buster/ llvm-toolchain-buster$LLVM_VERSION_STRING main" ;;
Debian_unstable ) REPO_NAME="deb http://apt.llvm.org/unstable/ llvm-toolchain$LLVM_VERSION_STRING main" ;;
Debian_testing ) REPO_NAME="deb http://apt.llvm.org/unstable/ llvm-toolchain$LLVM_VERSION_STRING main" ;;
Ubuntu_16.04 ) REPO_NAME="deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial$LLVM_VERSION_STRING main" ;;
Ubuntu_18.04 ) REPO_NAME="deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic$LLVM_VERSION_STRING main" ;;
Ubuntu_18.10 ) REPO_NAME="deb http://apt.llvm.org/cosmic/ llvm-toolchain-cosmic$LLVM_VERSION_STRING main" ;;
Ubuntu_19.04 ) REPO_NAME="deb http://apt.llvm.org/disco/ llvm-toolchain-disco$LLVM_VERSION_STRING main" ;;
Ubuntu_19.10 ) REPO_NAME="deb http://apt.llvm.org/eoan/ llvm-toolchain-eoan$LLVM_VERSION_STRING main" ;;
Ubuntu_20.04 ) REPO_NAME="deb http://apt.llvm.org/focal/ llvm-toolchain-focal$LLVM_VERSION_STRING main" ;;
* )
echo "Distribution '$DISTRO' in version '$VERSION' is not supported by this script (${DIST_VERSION})."
exit 2
esac
# install everything
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add -
add-apt-repository "${REPO_NAME}"
apt-get update
apt-get install -y clang-$LLVM_VERSION lldb-$LLVM_VERSION lld-$LLVM_VERSION clangd-$LLVM_VERSION
+202
View File
@@ -0,0 +1,202 @@
#!/bin/bash
set -e
set -x
echo "Setup docker host"
SCRIPTPATH="$(
cd "$(dirname "$0")"
pwd -P
)"
cd $SCRIPTPATH
JENKINS_AGENT_VERSION=4.6
dpkg --add-architecture i386
apt-get update
apt-get install -y apt-utils software-properties-common apt-transport-https sudo curl wget zip unzip
apt-get update
apt-get dist-upgrade -y
wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | tee /etc/apt/trusted.gpg.d/kitware.gpg >/dev/null
wget -qO- https://deb.nodesource.com/setup_12.x | bash -
wget -qO- https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
wget -qO- https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
apt-add-repository -y 'deb https://apt.kitware.com/ubuntu/ xenial main'
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
wget -qO- https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_unstable.list >/etc/apt/sources.list.d/dart_unstable.list
./llvm.sh 10
./llvm-update-alternatives.sh 10 1000
apt-get update
echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections
apt-get install -y \
autopoint \
binutils \
bison \
build-essential \
ca-certificates \
cmake \
dart \
debhelper \
debianutils \
devscripts \
flex \
g++ \
gcc \
git \
gnupg \
gperf \
intltool \
lib32z1 \
libc6-dbg \
libcunit1-dev \
libcurl4-openssl-dev \
libgdk-pixbuf2.0-0 \
libgdk-pixbuf2.0-dev \
libtool \
libtool-bin \
lzip \
make \
mc \
nano \
ninja \
nodejs \
openjdk-8-jdk-headless \
p7zip-full \
ruby \
scons \
wine \
yarn
echo 'JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64' >> /etc/environment
mkdir -p /opt
(
cd /opt
wget -qO swift.tar.gz https://swift.org/builds/swift-5.2.3-release/ubuntu1604/swift-5.2.3-RELEASE/swift-5.2.3-RELEASE-ubuntu16.04.tar.gz
tar -xf ./swift.tar.gz
rm -f ./swift.tar.gz
)
useradd -d /home/worker -m -s /bin/bash worker
sudo -iu worker /bin/bash -i <<"EOF"
set -e
set -x
echo 'export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64' >> ~/.profile
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.profile
curl -s "https://get.sdkman.io" | /bin/bash
EOF
sudo -iu worker /bin/bash -i <<"EOF"
set -e
set -x
sdk install gradle 5.4.1
sdk install maven
echo 'PATH=/usr/lib/dart/bin:$PATH' >> ~/.profile
echo 'PATH=~/.sdkman/candidates/maven/current/bin:$PATH' >> ~/.profile
echo 'PATH=~/.sdkman/candidates/gradle/current/bin:$PATH' >> ~/.profile
echo 'PATH=$PATH:/opt/swift-5.2.3-RELEASE-ubuntu16.04/usr/bin' >> ~/.profile
echo 'export PATH=$PATH:~/.yarn/bin' >> ~/.profile
EOF
sudo -iu worker /bin/bash -i <<"EOF"
set -e
set -x
wget -O commandlinetools.zip https://dl.google.com/android/repository/commandlinetools-linux-6200805_latest.zip
unzip commandlinetools.zip -d ./Android
rm commandlinetools.zip
echo 'export ANDROID_NDK_VERSION=21.1.6352462' >> ~/.profile
echo 'export ANDROID_HOME=~/Android' >> ~/.profile
echo 'export ANDROID_SDK_ROOT=${ANDROID_HOME}' >> ~/.profile
echo 'PATH=$PATH:$ANDROID_HOME/tools' >> ~/.profile
echo 'PATH=$PATH:$ANDROID_HOME/tools/bin' >> ~/.profile
echo 'PATH=$PATH:$ANDROID_HOME/platform-tools' >> ~/.profile
echo 'PATH=~/flutter/bin:$PATH' >> ~/.profile
echo 'export PATH' >> ~/.profile
echo 'export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/$ANDROID_NDK_VERSION' >> ~/.profile
EOF
sudo -iu worker /bin/bash -i <<"EOF"
set -e
set -x
yes | sdkmanager --sdk_root=${ANDROID_HOME} --licenses
sdkmanager --sdk_root=${ANDROID_HOME} \
--install \
"platform-tools" \
"platforms;android-28" \
"platforms;android-29" \
"ndk;${ANDROID_NDK_VERSION}" \
"build-tools;28.0.3" \
"build-tools;29.0.3"
sdkmanager --sdk_root=${ANDROID_HOME} tools
yes | sdkmanager --sdk_root=${ANDROID_HOME} --licenses
EOF
sudo -iu worker /bin/bash -i <<"EOF"
set -e
set -x
git clone https://github.com/flutter/flutter.git -b stable
flutter config --android-sdk $ANDROID_HOME
flutter doctor --android-licenses
flutter precache
EOF
sudo -iu worker /bin/bash -i <<"EOF"
set -e
set -x
mkdir -p ~/tmp && cd ~/tmp
wget https://sourceware.org/pub/valgrind/valgrind-3.15.0.tar.bz2
tar -xf ./valgrind-3.15.0.tar.bz2
cd ./valgrind-3.15.0
./configure --prefix=/home/worker/.local
make && make install
cd ~/ && rm -rf ./tmp/*
EOF
curl --create-dirs -fsSLo /usr/share/jenkins/agent.jar \
https://repo.jenkins-ci.org/public/org/jenkins-ci/main/remoting/${JENKINS_AGENT_VERSION}/remoting-${JENKINS_AGENT_VERSION}.jar
chmod 755 /usr/share/jenkins
chmod 644 /usr/share/jenkins/agent.jar
ln -sf /usr/share/jenkins/agent.jar /usr/share/jenkins/slave.jar
sudo -iu worker /bin/bash -i <<"EOF"
set -e
set -x
git clone https://github.com/mxe/mxe.git
cd ./mxe
echo 'JOBS := 1' > ./settings.mk
echo 'MXE_TARGETS := x86_64-w64-mingw32.static' >> ./settings.mk
echo 'LOCAL_PKG_LIST := cunit libiberty' >> ./settings.mk
echo '.DEFAULT local-pkg-list:' >> ./settings.mk
echo 'local-pkg-list: $(LOCAL_PKG_LIST)' >> ./settings.mk
make
echo 'export MXE_HOME=~/mxe' >> ~/.profile
EOF
sudo -iu worker /bin/bash -i <<"EOF"
set -e
set -x
mkdir -p ~/.jenkins
mkdir -p ~/agent
cat ~/.profile
echo $PATH
EOF
+5
View File
@@ -0,0 +1,5 @@
if (BUILD_JNI_BINDING)
add_subdirectory(jni)
else()
add_subdirectory(core)
endif()
+62
View File
@@ -0,0 +1,62 @@
set(CPACK_PACKAGE_NAME "${CMAKE_PROJECT_NAME}")
set(CPACK_PACKAGE_CONTACT "${PROJECT_MAINTAINER}")
set(CPACK_PACKAGE_VERSION ${ejdb2_VERSION})
set(CPACK_PACKAGE_VERSION_MAJOR ${ejdb2_VERSION_MAJOR})
set(CPACK_PACKAGE_VERSION_MINOR ${ejdb2_VERSION_MINOR})
set(CPACK_PACKAGE_VERSION_PATCH ${ejdb2_VERSION_PATCH})
set(CPACK_PACKAGE_VENDOR ${PROJECT_VENDOR})
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY ${PROJECT_DESCRIPTION_SUMMARY})
set(CPACK_PACKAGE_DESCRIPTION ${PROJECT_DESCRIPTION})
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE")
set(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/README.md")
set(CPACK_RESOURCE_FILE_WELCOME "${CMAKE_SOURCE_DIR}/README.md")
set(CPACK_PACKAGE_FILE_NAME
"${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_BUILD_TYPE}-${CMAKE_SYSTEM_NAME}-${PROJECT_ARCH}")
if (CMAKE_BUILD_TYPE STREQUAL "Release")
set(CPACK_STRIP_FILES ON)
endif ()
set(DEB_CMAKE_ARGS "-DBUILD_SHARED_LIBS=ON")
if (PACKAGE_DEB)
execute_process(
COMMAND /usr/bin/dpkg --print-architecture
OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE
RESULT_VARIABLE EXECUTE_RESULT
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
if (EXECUTE_RESULT)
message(FATAL_ERROR "dpkg not found: No package generation.")
endif ()
set(CPACK_DEBIAN_PACKAGE_DESCRIPTION ${CPACK_PACKAGE_DESCRIPTION})
set(CPACK_DEBIAN_PACKAGE_HOMEPAGE ${PROJECT_WEBSITE})
set(CPACK_DEBIAN_PACKAGE_SECTION libs)
set(CPACK_DEBIAN_PACKAGE_PRIORITY optional)
#set(CPACK_DEBIAN_PACKAGE_DEPENDS zlib1g)
set(CPACK_DEBIAN_PACKAGE_BUILD_DEPENDS pkg-config git devscripts dh-make)
if (NOT PPA_DEBIAN_VERSION)
set(PPA_DEBIAN_VERSION ppa1)
endif ()
if (PROJECT_PPA)
set(DPUT_HOST ${PROJECT_PPA})
endif ()
#set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "any")
set(CPACK_DEBIAN_RESOURCE_FILE_CHANGELOG ${CMAKE_SOURCE_DIR}/Changelog)
set(CPACK_DEBIAN_UPDATE_CHANGELOG ON)
endif (PACKAGE_DEB)
if (PACKAGE_TGZ)
set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY OFF)
endif (PACKAGE_TGZ)
include(CPack)
if (ENABLE_PPA)
set(CPACK_SOURCE_INSTALL_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/../fetch_libs.cmake")
if (NOT PROJECT_PPA_DISTRIB_TARGET)
set(PROJECT_PPA_DISTRIB_TARGET focal)
endif ()
set(DPUT_CONFIG_IN ${CMAKE_CURRENT_SOURCE_DIR}/../debian/dput.cf.in)
include(UploadPPA)
endif ()
+5
View File
@@ -0,0 +1,5 @@
[ppa]
fqdn = ppa.launchpad.net
method = sftp
login = @PROJECT_PPA_USER@
incoming = ~%(ppa)s/ubuntu/@DPUT_DIST@
+5
View File
@@ -0,0 +1,5 @@
message("DOWNLOAD https://github.com/Softmotions/facil.io/archive/master.zip")
file(DOWNLOAD https://github.com/Softmotions/facil.io/archive/master.zip ${CMAKE_CURRENT_BINARY_DIR}/facil.zip)
message("DOWNLOAD https://github.com/Softmotions/iowow/archive/master.zip")
file(DOWNLOAD https://github.com/Softmotions/iowow/archive/master.zip ${CMAKE_CURRENT_BINARY_DIR}/iowow.zip)
+73
View File
@@ -0,0 +1,73 @@
file(READ ${CMAKE_SOURCE_DIR}/src/bindings/ejdb2_jni/version.txt
EJDB2_JNI_VERSION)
if(NOT EJDB2_JNI_VERSION)
message(
FATAL_ERROR
"${CMAKE_SOURCE_DIR}/src/bindings/ejdb2_jni/version.txt is not exists")
endif()
set(EJDB2_JNI_VERSION "${PROJECT_VERSION}.${EJDB2_JNI_VERSION}")
set(CPACK_PACKAGE_NAME "${CMAKE_PROJECT_NAME}-java")
set(CPACK_PACKAGE_CONTACT "${PROJECT_MAINTAINER}")
set(CPACK_PACKAGE_VERSION ${EJDB2_JNI_VERSION})
set(CPACK_PACKAGE_VERSION_MAJOR ${ejdb2_VERSION_MAJOR})
set(CPACK_PACKAGE_VERSION_MINOR ${ejdb2_VERSION_MINOR})
set(CPACK_PACKAGE_VERSION_PATCH ${ejdb2_VERSION_PATCH})
set(CPACK_PACKAGE_VENDOR ${PROJECT_VENDOR})
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY
"${PROJECT_DESCRIPTION_SUMMARY} Java binding.")
set(CPACK_PACKAGE_DESCRIPTION "${PROJECT_DESCRIPTION} Java binding.")
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE")
set(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/README.md")
set(CPACK_RESOURCE_FILE_WELCOME "${CMAKE_SOURCE_DIR}/README.md")
set(CPACK_PACKAGE_FILE_NAME
"${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_BUILD_TYPE}-${CMAKE_SYSTEM_NAME}-${PROJECT_ARCH}"
)
if(CMAKE_BUILD_TYPE STREQUAL "Release")
set(CPACK_STRIP_FILES ON)
endif()
set(DEB_CMAKE_ARGS "-DBUILD_JNI_BINDING=ON")
if(PACKAGE_DEB)
execute_process(
COMMAND /usr/bin/dpkg --print-architecture
OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE
RESULT_VARIABLE EXECUTE_RESULT
OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET)
if(EXECUTE_RESULT)
message(FATAL_ERROR "dpkg not found: No package generation.")
endif()
set(CPACK_DEBIAN_PACKAGE_DESCRIPTION ${CPACK_PACKAGE_DESCRIPTION})
set(CPACK_DEBIAN_PACKAGE_HOMEPAGE ${PROJECT_WEBSITE})
set(CPACK_DEBIAN_PACKAGE_SECTION libs)
set(CPACK_DEBIAN_PACKAGE_PRIORITY optional)
# set(CPACK_DEBIAN_PACKAGE_DEPENDS zlib1g)
set(CPACK_DEBIAN_PACKAGE_BUILD_DEPENDS pkg-config git devscripts dh-make
openjdk-8-jdk)
if(NOT PPA_DEBIAN_VERSION)
set(PPA_DEBIAN_VERSION ppa1)
endif()
if(PROJECT_PPA)
set(DPUT_HOST ${PROJECT_PPA})
endif()
# set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "any")
set(CPACK_DEBIAN_RESOURCE_FILE_CHANGELOG ${CMAKE_SOURCE_DIR}/Changelog)
set(CPACK_DEBIAN_UPDATE_CHANGELOG ON)
endif(PACKAGE_DEB)
if(PACKAGE_TGZ)
set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY OFF)
endif(PACKAGE_TGZ)
include(CPack)
if(ENABLE_PPA)
set(CPACK_SOURCE_INSTALL_SCRIPT
"${CMAKE_CURRENT_SOURCE_DIR}/../fetch_libs.cmake")
if(NOT PROJECT_PPA_DISTRIB_TARGET)
set(PROJECT_PPA_DISTRIB_TARGET focal)
endif()
set(DPUT_CONFIG_IN ${CMAKE_CURRENT_SOURCE_DIR}/../debian/dput.cf.in)
include(UploadPPA)
endif()
+704
View File
@@ -0,0 +1,704 @@
# This file is part of the ios-cmake project. It was retrieved from
# https://github.com/cristeab/ios-cmake.git, which is a fork of
# https://code.google.com/p/ios-cmake/. Which in turn is based off of
# the Platform/Darwin.cmake and Platform/UnixPaths.cmake files which
# are included with CMake 2.8.4
#
# The ios-cmake project is licensed under the new BSD license.
#
# Copyright (c) 2014, Bogdan Cristea and LTE Engineering Software,
# Kitware, Inc., Insight Software Consortium. All rights reserved.
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
# This file is based off of the Platform/Darwin.cmake and
# Platform/UnixPaths.cmake files which are included with CMake 2.8.4
# It has been altered for iOS development.
#
# Updated by Alex Stewart (alexs.mac@gmail.com)
#
# *****************************************************************************
# Now maintained by Alexander Widerberg (widerbergaren [at] gmail.com)
# under the BSD-3-Clause license
# https://github.com/leetal/ios-cmake
# *****************************************************************************
#
# INFORMATION / HELP
#
# The following arguments control the behaviour of this toolchain:
#
# PLATFORM: (default "OS")
# OS = Build for iPhoneOS.
# OS64 = Build for arm64 iphoneOS.
# OS64COMBINED = Build for arm64 x86_64 iphoneOS. Combined into FAT STATIC lib (supported on 3.14+ of CMakewith "-G Xcode" argument ONLY)
# SIMULATOR = Build for x86 i386 iphoneOS Simulator.
# SIMULATOR64 = Build for x86_64 iphoneOS Simulator.
# TVOS = Build for arm64 tvOS.
# TVOSCOMBINED = Build for arm64 x86_64 tvOS. Combined into FAT STATIC lib (supported on 3.14+ of CMake with "-G Xcode" argument ONLY)
# SIMULATOR_TVOS = Build for x86_64 tvOS Simulator.
# WATCHOS = Build for armv7k arm64_32 for watchOS.
# WATCHOSCOMBINED = Build for armv7k arm64_32 x86_64 watchOS. Combined into FAT STATIC lib (supported on 3.14+ of CMake with "-G Xcode" argument ONLY)
# SIMULATOR_WATCHOS = Build for x86_64 for watchOS Simulator.
#
# CMAKE_OSX_SYSROOT: Path to the SDK to use. By default this is
# automatically determined from PLATFORM and xcodebuild, but
# can also be manually specified (although this should not be required).
#
# CMAKE_DEVELOPER_ROOT: Path to the Developer directory for the platform
# being compiled for. By default this is automatically determined from
# CMAKE_OSX_SYSROOT, but can also be manually specified (although this should
# not be required).
#
# DEPLOYMENT_TARGET: Minimum SDK version to target. Default 2.0 on watchOS and 9.0 on tvOS+iOS
#
# ENABLE_BITCODE: (1|0) Enables or disables bitcode support. Default 1 (true)
#
# ENABLE_ARC: (1|0) Enables or disables ARC support. Default 1 (true, ARC enabled by default)
#
# ENABLE_VISIBILITY: (1|0) Enables or disables symbol visibility support. Default 0 (false, visibility hidden by default)
#
# ENABLE_STRICT_TRY_COMPILE: (1|0) Enables or disables strict try_compile() on all Check* directives (will run linker
# to actually check if linking is possible). Default 0 (false, will set CMAKE_TRY_COMPILE_TARGET_TYPE to STATIC_LIBRARY)
#
# ARCHS: (armv7 armv7s armv7k arm64 arm64_32 i386 x86_64) If specified, will override the default architectures for the given PLATFORM
# OS = armv7 armv7s arm64 (if applicable)
# OS64 = arm64 (if applicable)
# SIMULATOR = i386
# SIMULATOR64 = x86_64
# TVOS = arm64
# SIMULATOR_TVOS = x86_64 (i386 has since long been deprecated)
# WATCHOS = armv7k arm64_32 (if applicable)
# SIMULATOR_WATCHOS = x86_64 (i386 has since long been deprecated)
#
# This toolchain defines the following variables for use externally:
#
# XCODE_VERSION: Version number (not including Build version) of Xcode detected.
# SDK_VERSION: Version of SDK being used.
# CMAKE_OSX_ARCHITECTURES: Architectures being compiled for (generated from PLATFORM).
#
# This toolchain defines the following macros for use externally:
#
# set_xcode_property (TARGET XCODE_PROPERTY XCODE_VALUE XCODE_VARIANT)
# A convenience macro for setting xcode specific properties on targets.
# Available variants are: All, Release, RelWithDebInfo, Debug, MinSizeRel
# example: set_xcode_property (myioslib IPHONEOS_DEPLOYMENT_TARGET "3.1" "all").
#
# find_host_package (PROGRAM ARGS)
# A macro used to find executable programs on the host system, not within the
# environment. Thanks to the android-cmake project for providing the
# command.
#
# ******************************** DEPRECATIONS *******************************
#
# IOS_DEPLOYMENT_TARGET: (Deprecated) Alias to DEPLOYMENT_TARGET
# CMAKE_IOS_DEVELOPER_ROOT: (Deprecated) Alias to CMAKE_DEVELOPER_ROOT
# IOS_PLATFORM: (Deprecated) Alias to PLATFORM
# IOS_ARCH: (Deprecated) Alias to ARCHS
#
# *****************************************************************************
#
# Fix for PThread library not in path
set(CMAKE_THREAD_LIBS_INIT "-lpthread")
set(CMAKE_HAVE_THREADS_LIBRARY 1)
set(CMAKE_USE_WIN32_THREADS_INIT 0)
set(CMAKE_USE_PTHREADS_INIT 1)
# Cache what generator is used
set(USED_CMAKE_GENERATOR "${CMAKE_GENERATOR}" CACHE STRING "Expose CMAKE_GENERATOR" FORCE)
if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.14")
set(MODERN_CMAKE YES)
endif()
# Get the Xcode version being used.
execute_process(COMMAND xcodebuild -version
OUTPUT_VARIABLE XCODE_VERSION
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REGEX MATCH "Xcode [0-9\\.]+" XCODE_VERSION "${XCODE_VERSION}")
string(REGEX REPLACE "Xcode ([0-9\\.]+)" "\\1" XCODE_VERSION "${XCODE_VERSION}")
######## ALIASES (DEPRECATION WARNINGS)
if(DEFINED IOS_PLATFORM)
set(PLATFORM ${IOS_PLATFORM})
message(DEPRECATION "IOS_PLATFORM argument is DEPRECATED. Consider using the new PLATFORM argument instead.")
endif()
if(DEFINED IOS_DEPLOYMENT_TARGET)
set(DEPLOYMENT_TARGET ${IOS_DEPLOYMENT_TARGET})
message(DEPRECATION "IOS_DEPLOYMENT_TARGET argument is DEPRECATED. Consider using the new DEPLOYMENT_TARGET argument instead.")
endif()
if(DEFINED CMAKE_IOS_DEVELOPER_ROOT)
set(CMAKE_DEVELOPER_ROOT ${CMAKE_IOS_DEVELOPER_ROOT})
message(DEPRECATION "CMAKE_IOS_DEVELOPER_ROOT argument is DEPRECATED. Consider using the new CMAKE_DEVELOPER_ROOT argument instead.")
endif()
if(DEFINED IOS_ARCH)
set(ARCHS ${IOS_ARCH})
message(DEPRECATION "IOS_ARCH argument is DEPRECATED. Consider using the new ARCHS argument instead.")
endif()
######## END ALIASES
# Unset the FORCE on cache variables if in try_compile()
set(FORCE_CACHE FORCE)
get_property(_CMAKE_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE)
if(_CMAKE_IN_TRY_COMPILE)
unset(FORCE_CACHE)
endif()
# Default to building for iPhoneOS if not specified otherwise, and we cannot
# determine the platform from the CMAKE_OSX_ARCHITECTURES variable. The use
# of CMAKE_OSX_ARCHITECTURES is such that try_compile() projects can correctly
# determine the value of PLATFORM from the root project, as
# CMAKE_OSX_ARCHITECTURES is propagated to them by CMake.
if(NOT DEFINED PLATFORM)
if (CMAKE_OSX_ARCHITECTURES)
if(CMAKE_OSX_ARCHITECTURES MATCHES ".*arm.*" AND CMAKE_OSX_SYSROOT MATCHES ".*iphoneos.*")
set(PLATFORM "OS")
elseif(CMAKE_OSX_ARCHITECTURES MATCHES "i386" AND CMAKE_OSX_SYSROOT MATCHES ".*iphonesimulator.*")
set(PLATFORM "SIMULATOR")
elseif(CMAKE_OSX_ARCHITECTURES MATCHES "x86_64" AND CMAKE_OSX_SYSROOT MATCHES ".*iphonesimulator.*")
set(PLATFORM "SIMULATOR64")
elseif(CMAKE_OSX_ARCHITECTURES MATCHES "arm64" AND CMAKE_OSX_SYSROOT MATCHES ".*appletvos.*")
set(PLATFORM "TVOS")
elseif(CMAKE_OSX_ARCHITECTURES MATCHES "x86_64" AND CMAKE_OSX_SYSROOT MATCHES ".*appletvsimulator.*")
set(PLATFORM "SIMULATOR_TVOS")
elseif(CMAKE_OSX_ARCHITECTURES MATCHES ".*armv7k.*" AND CMAKE_OSX_SYSROOT MATCHES ".*watchos.*")
set(PLATFORM "WATCHOS")
elseif(CMAKE_OSX_ARCHITECTURES MATCHES "i386" AND CMAKE_OSX_SYSROOT MATCHES ".*watchsimulator.*")
set(PLATFORM "SIMULATOR_WATCHOS")
endif()
endif()
if (NOT PLATFORM)
set(PLATFORM "OS")
endif()
endif()
set(PLATFORM_INT "${PLATFORM}" CACHE STRING "Type of platform for which the build targets.")
# Handle the case where we are targeting iOS and a version above 10.3.4 (32-bit support dropped officially)
if(PLATFORM_INT STREQUAL "OS" AND DEPLOYMENT_TARGET VERSION_GREATER_EQUAL 10.3.4)
set(PLATFORM_INT "OS64")
message(STATUS "Targeting minimum SDK version ${DEPLOYMENT_TARGET}. Dropping 32-bit support.")
elseif(PLATFORM_INT STREQUAL "SIMULATOR" AND DEPLOYMENT_TARGET VERSION_GREATER_EQUAL 10.3.4)
set(PLATFORM_INT "SIMULATOR64")
message(STATUS "Targeting minimum SDK version ${DEPLOYMENT_TARGET}. Dropping 32-bit support.")
endif()
# Determine the platform name and architectures for use in xcodebuild commands
# from the specified PLATFORM name.
if(PLATFORM_INT STREQUAL "OS")
set(SDK_NAME iphoneos)
if(NOT ARCHS)
set(ARCHS armv7 armv7s arm64)
endif()
elseif(PLATFORM_INT STREQUAL "OS64")
set(SDK_NAME iphoneos)
if(NOT ARCHS)
if (XCODE_VERSION VERSION_GREATER 10.0)
set(ARCHS arm64) # Add arm64e when Apple have fixed the integration issues with it, libarclite_iphoneos.a is currently missung bitcode markers for example
else()
set(ARCHS arm64)
endif()
endif()
elseif(PLATFORM_INT STREQUAL "OS64COMBINED")
set(SDK_NAME iphoneos)
if(MODERN_CMAKE)
if(NOT ARCHS)
if (XCODE_VERSION VERSION_GREATER 10.0)
set(ARCHS arm64 x86_64) # Add arm64e when Apple have fixed the integration issues with it, libarclite_iphoneos.a is currently missung bitcode markers for example
else()
set(ARCHS arm64 x86_64)
endif()
endif()
else()
message(FATAL_ERROR "Please make sure that you are running CMake 3.14+ to make the OS64COMBINED setting work")
endif()
elseif(PLATFORM_INT STREQUAL "SIMULATOR")
set(SDK_NAME iphonesimulator)
if(NOT ARCHS)
set(ARCHS i386)
endif()
message(DEPRECATION "SIMULATOR IS DEPRECATED. Consider using SIMULATOR64 instead.")
elseif(PLATFORM_INT STREQUAL "SIMULATOR64")
set(SDK_NAME iphonesimulator)
if(NOT ARCHS)
set(ARCHS x86_64)
endif()
elseif(PLATFORM_INT STREQUAL "TVOS")
set(SDK_NAME appletvos)
if(NOT ARCHS)
set(ARCHS arm64)
endif()
elseif (PLATFORM_INT STREQUAL "TVOSCOMBINED")
set(SDK_NAME appletvos)
if(MODERN_CMAKE)
if(NOT ARCHS)
set(ARCHS arm64 x86_64)
endif()
else()
message(FATAL_ERROR "Please make sure that you are running CMake 3.14+ to make the TVOSCOMBINED setting work")
endif()
elseif(PLATFORM_INT STREQUAL "SIMULATOR_TVOS")
set(SDK_NAME appletvsimulator)
if(NOT ARCHS)
set(ARCHS x86_64)
endif()
elseif(PLATFORM_INT STREQUAL "WATCHOS")
set(SDK_NAME watchos)
if(NOT ARCHS)
if (XCODE_VERSION VERSION_GREATER 10.0)
set(ARCHS armv7k arm64_32)
else()
set(ARCHS armv7k)
endif()
endif()
elseif(PLATFORM_INT STREQUAL "WATCHOSCOMBINED")
set(SDK_NAME watchos)
if(MODERN_CMAKE)
if(NOT ARCHS)
if (XCODE_VERSION VERSION_GREATER 10.0)
set(ARCHS armv7k arm64_32 i386)
else()
set(ARCHS armv7k i386)
endif()
endif()
else()
message(FATAL_ERROR "Please make sure that you are running CMake 3.14+ to make the WATCHOSCOMBINED setting work")
endif()
elseif(PLATFORM_INT STREQUAL "SIMULATOR_WATCHOS")
set(SDK_NAME watchsimulator)
if(NOT ARCHS)
set(ARCHS i386)
endif()
else()
message(FATAL_ERROR "Invalid PLATFORM: ${PLATFORM_INT}")
endif()
if(MODERN_CMAKE AND PLATFORM_INT MATCHES ".*COMBINED" AND NOT USED_CMAKE_GENERATOR MATCHES "Xcode")
message(FATAL_ERROR "The COMBINED options only work with Xcode generator, -G Xcode")
endif()
# If user did not specify the SDK root to use, then query xcodebuild for it.
execute_process(COMMAND xcodebuild -version -sdk ${SDK_NAME} Path
OUTPUT_VARIABLE CMAKE_OSX_SYSROOT_INT
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
if (NOT DEFINED CMAKE_OSX_SYSROOT_INT AND NOT DEFINED CMAKE_OSX_SYSROOT)
message(SEND_ERROR "Please make sure that Xcode is installed and that the toolchain"
"is pointing to the correct path. Please run:"
"sudo xcode-select -s /Applications/Xcode.app/Contents/Developer"
"and see if that fixes the problem for you.")
message(FATAL_ERROR "Invalid CMAKE_OSX_SYSROOT: ${CMAKE_OSX_SYSROOT} "
"does not exist.")
elseif(DEFINED CMAKE_OSX_SYSROOT_INT)
set(CMAKE_OSX_SYSROOT "${CMAKE_OSX_SYSROOT_INT}" CACHE INTERNAL "")
endif()
# Set Xcode property for SDKROOT as well if Xcode generator is used
if(USED_CMAKE_GENERATOR MATCHES "Xcode")
set(CMAKE_OSX_SYSROOT "${SDK_NAME}" CACHE INTERNAL "")
if(NOT DEFINED CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM)
set(CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM "123456789A" CACHE INTERNAL "")
endif()
endif()
# Specify minimum version of deployment target.
if(NOT DEFINED DEPLOYMENT_TARGET)
if (PLATFORM_INT STREQUAL "WATCHOS" OR PLATFORM_INT STREQUAL "SIMULATOR_WATCHOS")
# Unless specified, SDK version 2.0 is used by default as minimum target version (watchOS).
set(DEPLOYMENT_TARGET "2.0"
CACHE STRING "Minimum SDK version to build for." )
else()
# Unless specified, SDK version 9.0 is used by default as minimum target version (iOS, tvOS).
set(DEPLOYMENT_TARGET "9.0"
CACHE STRING "Minimum SDK version to build for." )
endif()
message(STATUS "Using the default min-version since DEPLOYMENT_TARGET not provided!")
endif()
# Use bitcode or not
if(NOT DEFINED ENABLE_BITCODE AND NOT ARCHS MATCHES "((^|;|, )(i386|x86_64))+")
# Unless specified, enable bitcode support by default
message(STATUS "Enabling bitcode support by default. ENABLE_BITCODE not provided!")
set(ENABLE_BITCODE TRUE)
elseif(NOT DEFINED ENABLE_BITCODE)
message(STATUS "Disabling bitcode support by default on simulators. ENABLE_BITCODE not provided for override!")
set(ENABLE_BITCODE FALSE)
endif()
set(ENABLE_BITCODE_INT ${ENABLE_BITCODE} CACHE BOOL "Whether or not to enable bitcode" ${FORCE_CACHE})
# Use ARC or not
if(NOT DEFINED ENABLE_ARC)
# Unless specified, enable ARC support by default
set(ENABLE_ARC TRUE)
message(STATUS "Enabling ARC support by default. ENABLE_ARC not provided!")
endif()
set(ENABLE_ARC_INT ${ENABLE_ARC} CACHE BOOL "Whether or not to enable ARC" ${FORCE_CACHE})
# Use hidden visibility or not
if(NOT DEFINED ENABLE_VISIBILITY)
# Unless specified, disable symbols visibility by default
set(ENABLE_VISIBILITY FALSE)
message(STATUS "Hiding symbols visibility by default. ENABLE_VISIBILITY not provided!")
endif()
set(ENABLE_VISIBILITY_INT ${ENABLE_VISIBILITY} CACHE BOOL "Whether or not to hide symbols (-fvisibility=hidden)" ${FORCE_CACHE})
# Set strict compiler checks or not
if(NOT DEFINED ENABLE_STRICT_TRY_COMPILE)
# Unless specified, disable strict try_compile()
set(ENABLE_STRICT_TRY_COMPILE FALSE)
message(STATUS "Using NON-strict compiler checks by default. ENABLE_STRICT_TRY_COMPILE not provided!")
endif()
set(ENABLE_STRICT_TRY_COMPILE_INT ${ENABLE_STRICT_TRY_COMPILE} CACHE BOOL "Whether or not to use strict compiler checks" ${FORCE_CACHE})
# Get the SDK version information.
execute_process(COMMAND xcodebuild -sdk ${CMAKE_OSX_SYSROOT} -version SDKVersion
OUTPUT_VARIABLE SDK_VERSION
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
# Find the Developer root for the specific iOS platform being compiled for
# from CMAKE_OSX_SYSROOT. Should be ../../ from SDK specified in
# CMAKE_OSX_SYSROOT. There does not appear to be a direct way to obtain
# this information from xcrun or xcodebuild.
if (NOT DEFINED CMAKE_DEVELOPER_ROOT AND NOT USED_CMAKE_GENERATOR MATCHES "Xcode")
get_filename_component(PLATFORM_SDK_DIR ${CMAKE_OSX_SYSROOT} PATH)
get_filename_component(CMAKE_DEVELOPER_ROOT ${PLATFORM_SDK_DIR} PATH)
if (NOT DEFINED CMAKE_DEVELOPER_ROOT)
message(FATAL_ERROR "Invalid CMAKE_DEVELOPER_ROOT: "
"${CMAKE_DEVELOPER_ROOT} does not exist.")
endif()
endif()
# Find the C & C++ compilers for the specified SDK.
if(NOT CMAKE_C_COMPILER)
execute_process(COMMAND xcrun -sdk ${CMAKE_OSX_SYSROOT} -find clang
OUTPUT_VARIABLE CMAKE_C_COMPILER
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
message(STATUS "Using C compiler: ${CMAKE_C_COMPILER}")
endif()
if(NOT CMAKE_CXX_COMPILER)
execute_process(COMMAND xcrun -sdk ${CMAKE_OSX_SYSROOT} -find clang++
OUTPUT_VARIABLE CMAKE_CXX_COMPILER
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
message(STATUS "Using CXX compiler: ${CMAKE_CXX_COMPILER}")
endif()
# Find (Apple's) libtool.
execute_process(COMMAND xcrun -sdk ${CMAKE_OSX_SYSROOT} -find libtool
OUTPUT_VARIABLE BUILD_LIBTOOL
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
message(STATUS "Using libtool: ${BUILD_LIBTOOL}")
# Configure libtool to be used instead of ar + ranlib to build static libraries.
# This is required on Xcode 7+, but should also work on previous versions of
# Xcode.
set(CMAKE_C_CREATE_STATIC_LIBRARY
"${BUILD_LIBTOOL} -static -o <TARGET> <LINK_FLAGS> <OBJECTS> ")
set(CMAKE_CXX_CREATE_STATIC_LIBRARY
"${BUILD_LIBTOOL} -static -o <TARGET> <LINK_FLAGS> <OBJECTS> ")
# Find the toolchain's provided install_name_tool if none is found on the host
if(NOT CMAKE_INSTALL_NAME_TOOL)
execute_process(COMMAND xcrun -sdk ${CMAKE_OSX_SYSROOT} -find install_name_tool
OUTPUT_VARIABLE CMAKE_INSTALL_NAME_TOOL_INT
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
set(CMAKE_INSTALL_NAME_TOOL ${CMAKE_INSTALL_NAME_TOOL_INT} CACHE STRING "" ${FORCE_CACHE})
endif()
# Get the version of Darwin (OS X) of the host.
execute_process(COMMAND uname -r
OUTPUT_VARIABLE CMAKE_HOST_SYSTEM_VERSION
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
if(SDK_NAME MATCHES "iphone")
set(CMAKE_SYSTEM_NAME iOS CACHE INTERNAL "" ${FORCE_CACHE})
endif()
# CMake 3.14+ support building for iOS, watchOS and tvOS out of the box.
if(MODERN_CMAKE)
if(SDK_NAME MATCHES "appletv")
set(CMAKE_SYSTEM_NAME tvOS CACHE INTERNAL "" ${FORCE_CACHE})
elseif(SDK_NAME MATCHES "watch")
set(CMAKE_SYSTEM_NAME watchOS CACHE INTERNAL "" ${FORCE_CACHE})
endif()
# Provide flags for a combined FAT library build on newer CMake versions
if(PLATFORM_INT MATCHES ".*COMBINED")
set(CMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH "NO" CACHE INTERNAL "" ${FORCE_CACHE})
set(CMAKE_IOS_INSTALL_COMBINED YES CACHE INTERNAL "" ${FORCE_CACHE})
message(STATUS "Will combine built (static) artifacts into FAT lib...")
endif()
elseif(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.10")
# Legacy code path prior to CMake 3.14 or fallback if no SDK_NAME specified
set(CMAKE_SYSTEM_NAME iOS CACHE INTERNAL "" ${FORCE_CACHE})
else()
# Legacy code path prior to CMake 3.14 or fallback if no SDK_NAME specified
set(CMAKE_SYSTEM_NAME Darwin CACHE INTERNAL "" ${FORCE_CACHE})
endif()
# Standard settings.
set(CMAKE_SYSTEM_VERSION ${SDK_VERSION} CACHE INTERNAL "")
set(UNIX TRUE CACHE BOOL "")
set(APPLE TRUE CACHE BOOL "")
set(IOS TRUE CACHE BOOL "")
set(CMAKE_AR ar CACHE FILEPATH "" FORCE)
set(CMAKE_RANLIB ranlib CACHE FILEPATH "" FORCE)
set(CMAKE_STRIP strip CACHE FILEPATH "" FORCE)
# Set the architectures for which to build.
set(CMAKE_OSX_ARCHITECTURES ${ARCHS} CACHE STRING "Build architecture for iOS")
# Change the type of target generated for try_compile() so it'll work when cross-compiling, weak compiler checks
if(ENABLE_STRICT_TRY_COMPILE_INT)
message(STATUS "Using strict compiler checks (default in CMake).")
else()
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
endif()
# All iOS/Darwin specific settings - some may be redundant.
set(CMAKE_MACOSX_BUNDLE YES)
set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED "NO")
set(CMAKE_SHARED_LIBRARY_PREFIX "lib")
set(CMAKE_SHARED_LIBRARY_SUFFIX ".dylib")
set(CMAKE_SHARED_MODULE_PREFIX "lib")
set(CMAKE_SHARED_MODULE_SUFFIX ".so")
set(CMAKE_C_COMPILER_ABI ELF)
set(CMAKE_CXX_COMPILER_ABI ELF)
set(CMAKE_C_HAS_ISYSROOT 1)
set(CMAKE_CXX_HAS_ISYSROOT 1)
set(CMAKE_MODULE_EXISTS 1)
set(CMAKE_DL_LIBS "")
set(CMAKE_C_OSX_COMPATIBILITY_VERSION_FLAG "-compatibility_version ")
set(CMAKE_C_OSX_CURRENT_VERSION_FLAG "-current_version ")
set(CMAKE_CXX_OSX_COMPATIBILITY_VERSION_FLAG "${CMAKE_C_OSX_COMPATIBILITY_VERSION_FLAG}")
set(CMAKE_CXX_OSX_CURRENT_VERSION_FLAG "${CMAKE_C_OSX_CURRENT_VERSION_FLAG}")
if(ARCHS MATCHES "((^|;|, )(arm64|arm64e|x86_64))+")
set(CMAKE_C_SIZEOF_DATA_PTR 8)
set(CMAKE_CXX_SIZEOF_DATA_PTR 8)
if(ARCHS MATCHES "((^|;|, )(arm64|arm64e))+")
set(CMAKE_SYSTEM_PROCESSOR "aarch64")
else()
set(CMAKE_SYSTEM_PROCESSOR "x86_64")
endif()
else()
set(CMAKE_C_SIZEOF_DATA_PTR 4)
set(CMAKE_CXX_SIZEOF_DATA_PTR 4)
set(CMAKE_SYSTEM_PROCESSOR "arm")
endif()
# Note that only Xcode 7+ supports the newer more specific:
# -m${SDK_NAME}-version-min flags, older versions of Xcode use:
# -m(ios/ios-simulator)-version-min instead.
if(${CMAKE_VERSION} VERSION_LESS "3.11")
if(PLATFORM_INT STREQUAL "OS" OR PLATFORM_INT STREQUAL "OS64")
if(XCODE_VERSION VERSION_LESS 7.0)
set(SDK_NAME_VERSION_FLAGS
"-mios-version-min=${DEPLOYMENT_TARGET}")
else()
# Xcode 7.0+ uses flags we can build directly from SDK_NAME.
set(SDK_NAME_VERSION_FLAGS
"-m${SDK_NAME}-version-min=${DEPLOYMENT_TARGET}")
endif()
elseif(PLATFORM_INT STREQUAL "TVOS")
set(SDK_NAME_VERSION_FLAGS
"-mtvos-version-min=${DEPLOYMENT_TARGET}")
elseif(PLATFORM_INT STREQUAL "SIMULATOR_TVOS")
set(SDK_NAME_VERSION_FLAGS
"-mtvos-simulator-version-min=${DEPLOYMENT_TARGET}")
elseif(PLATFORM_INT STREQUAL "WATCHOS")
set(SDK_NAME_VERSION_FLAGS
"-mwatchos-version-min=${DEPLOYMENT_TARGET}")
elseif(PLATFORM_INT STREQUAL "SIMULATOR_WATCHOS")
set(SDK_NAME_VERSION_FLAGS
"-mwatchos-simulator-version-min=${DEPLOYMENT_TARGET}")
else()
# SIMULATOR or SIMULATOR64 both use -mios-simulator-version-min.
set(SDK_NAME_VERSION_FLAGS
"-mios-simulator-version-min=${DEPLOYMENT_TARGET}")
endif()
else()
# Newer versions of CMake sets the version min flags correctly
set(CMAKE_OSX_DEPLOYMENT_TARGET ${DEPLOYMENT_TARGET} CACHE STRING
"Set CMake deployment target" ${FORCE_CACHE})
endif()
if(ENABLE_BITCODE_INT)
set(BITCODE "-fembed-bitcode")
set(CMAKE_XCODE_ATTRIBUTE_BITCODE_GENERATION_MODE "bitcode" CACHE INTERNAL "")
set(CMAKE_XCODE_ATTRIBUTE_ENABLE_BITCODE "YES" CACHE INTERNAL "")
else()
set(BITCODE "")
set(CMAKE_XCODE_ATTRIBUTE_ENABLE_BITCODE "NO" CACHE INTERNAL "")
endif()
if(ENABLE_ARC_INT)
set(FOBJC_ARC "-fobjc-arc")
set(CMAKE_XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC "YES" CACHE INTERNAL "")
else()
set(FOBJC_ARC "-fno-objc-arc")
set(CMAKE_XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC "NO" CACHE INTERNAL "")
endif()
if(NOT ENABLE_VISIBILITY_INT)
set(VISIBILITY "-fvisibility=hidden")
set(CMAKE_XCODE_ATTRIBUTE_GCC_SYMBOLS_PRIVATE_EXTERN "YES" CACHE INTERNAL "")
else()
set(VISIBILITY "")
set(CMAKE_XCODE_ATTRIBUTE_GCC_SYMBOLS_PRIVATE_EXTERN "NO" CACHE INTERNAL "")
endif()
if(NOT IOS_TOOLCHAIN_HAS_RUN)
#Check if Xcode generator is used, since that will handle these flags automagically
if(USED_CMAKE_GENERATOR MATCHES "Xcode")
message(STATUS "Not setting any manual command-line buildflags, since Xcode is selected as generator.")
else()
set(CMAKE_C_FLAGS
"${SDK_NAME_VERSION_FLAGS} ${BITCODE} -fobjc-abi-version=2 ${FOBJC_ARC} ${CMAKE_C_FLAGS}")
# Hidden visibilty is required for C++ on iOS.
set(CMAKE_CXX_FLAGS
"${SDK_NAME_VERSION_FLAGS} ${BITCODE} ${VISIBILITY} -fvisibility-inlines-hidden -fobjc-abi-version=2 ${FOBJC_ARC} ${CMAKE_CXX_FLAGS}")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -O0 -g ${CMAKE_CXX_FLAGS_DEBUG}")
set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS} -DNDEBUG -Os -ffast-math ${CMAKE_CXX_FLAGS_MINSIZEREL}")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS} -DNDEBUG -O2 -g -ffast-math ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} -DNDEBUG -O3 -ffast-math ${CMAKE_CXX_FLAGS_RELEASE}")
set(CMAKE_C_LINK_FLAGS "${SDK_NAME_VERSION_FLAGS} -Wl,-search_paths_first ${CMAKE_C_LINK_FLAGS}")
set(CMAKE_CXX_LINK_FLAGS "${SDK_NAME_VERSION_FLAGS} -Wl,-search_paths_first ${CMAKE_CXX_LINK_FLAGS}")
set(CMAKE_ASM_FLAGS "${CFLAGS} -x assembler-with-cpp")
# In order to ensure that the updated compiler flags are used in try_compile()
# tests, we have to forcibly set them in the CMake cache, not merely set them
# in the local scope.
set(VARS_TO_FORCE_IN_CACHE
CMAKE_C_FLAGS
CMAKE_CXX_FLAGS
CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_RELWITHDEBINFO
CMAKE_CXX_FLAGS_MINSIZEREL
CMAKE_CXX_FLAGS_RELEASE
CMAKE_C_LINK_FLAGS
CMAKE_CXX_LINK_FLAGS)
foreach(VAR_TO_FORCE ${VARS_TO_FORCE_IN_CACHE})
set(${VAR_TO_FORCE} "${${VAR_TO_FORCE}}" CACHE STRING "" ${FORCE_CACHE})
endforeach()
endif()
## Print status messages to inform of the current state
message(STATUS "Configuring ${SDK_NAME} build for platform: ${PLATFORM_INT}, architecture(s): ${ARCHS}")
message(STATUS "Using SDK: ${CMAKE_OSX_SYSROOT_INT}")
message(STATUS "Using minimum deployment version: ${DEPLOYMENT_TARGET}"
" (SDK version: ${SDK_VERSION})")
if(MODERN_CMAKE)
message(STATUS "Merging integrated CMake 3.14+ iOS,tvOS,watchOS,macOS toolchain(s) with this toolchain!")
endif()
if(USED_CMAKE_GENERATOR MATCHES "Xcode")
message(STATUS "Using Xcode version: ${XCODE_VERSION}")
endif()
if(DEFINED SDK_NAME_VERSION_FLAGS)
message(STATUS "Using version flags: ${SDK_NAME_VERSION_FLAGS}")
endif()
message(STATUS "Using a data_ptr size of: ${CMAKE_CXX_SIZEOF_DATA_PTR}")
message(STATUS "Using install_name_tool: ${CMAKE_INSTALL_NAME_TOOL}")
if(ENABLE_BITCODE_INT)
message(STATUS "Enabling bitcode support.")
else()
message(STATUS "Disabling bitcode support.")
endif()
if(ENABLE_ARC_INT)
message(STATUS "Enabling ARC support.")
else()
message(STATUS "Disabling ARC support.")
endif()
if(NOT ENABLE_VISIBILITY_INT)
message(STATUS "Hiding symbols (-fvisibility=hidden).")
endif()
endif()
set(CMAKE_PLATFORM_HAS_INSTALLNAME 1)
set(CMAKE_SHARED_LINKER_FLAGS "-rpath @executable_path/Frameworks -rpath @loader_path/Frameworks")
set(CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS "-dynamiclib -Wl,-headerpad_max_install_names")
set(CMAKE_SHARED_MODULE_CREATE_C_FLAGS "-bundle -Wl,-headerpad_max_install_names")
set(CMAKE_SHARED_MODULE_LOADER_C_FLAG "-Wl,-bundle_loader,")
set(CMAKE_SHARED_MODULE_LOADER_CXX_FLAG "-Wl,-bundle_loader,")
set(CMAKE_FIND_LIBRARY_SUFFIXES ".tbd" ".dylib" ".so" ".a")
set(CMAKE_SHARED_LIBRARY_SONAME_C_FLAG "-install_name")
# Set the find root to the iOS developer roots and to user defined paths.
set(CMAKE_FIND_ROOT_PATH ${CMAKE_OSX_SYSROOT_INT} ${CMAKE_PREFIX_PATH} CACHE STRING "Root path that will be prepended
to all search paths")
# Default to searching for frameworks first.
set(CMAKE_FIND_FRAMEWORK FIRST)
# Set up the default search directories for frameworks.
set(CMAKE_FRAMEWORK_PATH
${CMAKE_DEVELOPER_ROOT}/Library/PrivateFrameworks
${CMAKE_OSX_SYSROOT_INT}/System/Library/Frameworks
${CMAKE_FRAMEWORK_PATH} CACHE STRING "Frameworks search paths" ${FORCE_CACHE})
set(IOS_TOOLCHAIN_HAS_RUN TRUE CACHE BOOL "Has the CMake toolchain run already?" ${FORCE_CACHE})
# By default, search both the specified iOS SDK and the remainder of the host filesystem.
if(NOT CMAKE_FIND_ROOT_PATH_MODE_PROGRAM)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH CACHE STRING "" ${FORCE_CACHE})
endif()
if(NOT CMAKE_FIND_ROOT_PATH_MODE_LIBRARY)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY CACHE STRING "" ${FORCE_CACHE})
endif()
if(NOT CMAKE_FIND_ROOT_PATH_MODE_INCLUDE)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY CACHE STRING "" ${FORCE_CACHE})
endif()
if(NOT CMAKE_FIND_ROOT_PATH_MODE_PACKAGE)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY CACHE STRING "" ${FORCE_CACHE})
endif()
#
# Some helper-macros below to simplify and beautify the CMakeFile
#
# This little macro lets you set any Xcode specific property.
macro(set_xcode_property TARGET XCODE_PROPERTY XCODE_VALUE XCODE_RELVERSION)
set(XCODE_RELVERSION_I "${XCODE_RELVERSION}")
if(XCODE_RELVERSION_I STREQUAL "All")
set_property(TARGET ${TARGET} PROPERTY
XCODE_ATTRIBUTE_${XCODE_PROPERTY} "${XCODE_VALUE}")
else()
set_property(TARGET ${TARGET} PROPERTY
XCODE_ATTRIBUTE_${XCODE_PROPERTY}[variant=${XCODE_RELVERSION_I}] "${XCODE_VALUE}")
endif()
endmacro(set_xcode_property)
# This macro lets you find executable programs on the host system.
macro(find_host_package)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE NEVER)
set(IOS FALSE)
find_package(${ARGN})
set(IOS TRUE)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE BOTH)
endmacro(find_host_package)
+10
View File
@@ -0,0 +1,10 @@
if (DO_INSTALL_CORE)
install(FILES ejdb2.3 DESTINATION ${CMAKE_INSTALL_MANDIR}/man3
COMPONENT doc)
install(FILES jbs.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1
COMPONENT doc)
endif()
+12
View File
@@ -0,0 +1,12 @@
.TH "EJDB2" 3 "2020-04-01" "Man Page" "EJDB2"
.SH NAME
EJDB2 \- Embedded JSON Database engine
.SH DESCRIPTION
.PP
EJDB2 is an embeddable JSON database engine published under MIT license.
.SH "SEE ALSO"
.I http://ejdb.org
EJDB project offcial web site.
+12
View File
@@ -0,0 +1,12 @@
.TH "JBS" 1 "2019-04-01" "Man Page" "JBS"
.SH NAME
EJDB2 standalone HTTP REST/Websocket server.
.SH DESCRIPTION
.PP
EJDB2 is an embeddable JSON database engine published under MIT license.
.SH "SEE ALSO"
.I http://ejdb.org
EJDB2 project offcial web site.
+22
View File
@@ -0,0 +1,22 @@
#!/bin/bash
set -e
SCRIPTPATH="$(
cd "$(dirname "$0")"
pwd -P
)"
cd $SCRIPTPATH
if [ ! -d ./build ]; then
mkdir ./build
fi
cd ./build
cmake .. -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Release \
-DBUILD_JNI_BINDING=ON \
-DBUILD_DART_BINDING=ON \
-DBUILD_NODEJS_BINDING=ON \
&& make
pvs-studio-analyzer analyze -a 45 -l ${HOME}/.config/PVS-Studio/PVS-Studio.lic -j4 -o ./pvs.log
rm -rf ./pvs_report
plog-converter -a 'GA:1,2,3;64:1;OP:1,2,3;MISRA:1' -t fullhtml -o ./pvs_report ./pvs.log
Executable
+66
View File
@@ -0,0 +1,66 @@
#!/bin/bash
set -e
# set -x
SCRIPTPATH="$(
cd "$(dirname "$0")"
pwd -P
)"
cd $SCRIPTPATH
readme() {
echo "Generating README.md";
cat "./BASE.md" > "./README.md"
echo -e "\n\n" >> "./README.md"
cat "./src/bindings/ejdb2_android/README.md" >> "./README.md"
echo -e "\n\n" >> "./README.md"
# cat "./src/bindings/ejdb2_swift/EJDB2Swift/README.md" >> "./README.md"
# echo -e "\n\n" >> "./README.md"
cat "./src/jql/README.md" >> "./README.md"
echo -e "\n\n" >> "./README.md"
cat "./src/jbr/README.md" >> "./README.md"
echo -e "\n\n" >> "./README.md"
cat "./docker/README.md" >> "./README.md"
echo -e "\n\n" >> "./README.md"
cat "./CAPI.md" >> "./README.md"
echo -e '\n# License\n```\n' >> "./README.md"
cat "./LICENSE" >> "./README.md"
echo -e '\n```\n' >> "./README.md"
}
release_tag() {
echo "Creating EJDB2 release"
readme
git pull origin master
dch --distribution testing --no-force-save-on-release --release "" -c ./Changelog
VERSION=`dpkg-parsechangelog -l./Changelog -SVersion`
TAG="v${VERSION}"
CHANGESET=`dpkg-parsechangelog -l./Changelog -SChanges | sed '/^ejdb2.*/d' | sed '/^\s*$/d'`
git add ./Changelog
git add ./README.md
if ! git diff-index --quiet HEAD --; then
git commit -a -m"${TAG} landed"
git push origin master
fi
echo "${CHANGESET}" | git tag -f -a -F - "${TAG}"
git push origin -f --tags
}
while [ "$1" != "" ]; do
case $1 in
"-d" ) readme
exit
;;
"-r" ) release_tag
exit
;;
esac
shift
done
+383
View File
@@ -0,0 +1,383 @@
if(NOT CMAKE_BUILD_TYPE)
message(
FATAL_ERROR
"Please specify the build type -DCMAKE_BUILD_TYPE=Debug|Release|RelWithDebInfo"
)
endif()
set(MODULES util jbl jql jbi)
set(PROJECT_LLIBRARIES)
set(PROJECT_INCLUDE_DIRS)
set(ALL_SRC)
set(ALL_HDRS)
set(PUB_HDRS)
set(PROJECT_GENERATED_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated)
list(APPEND PROJECT_INCLUDE_DIRS "${PROJECT_GENERATED_DIR}"
"${CMAKE_CURRENT_SOURCE_DIR}")
if(APPLE)
option(BUILD_FRAMEWORK "Build an OS X framework" OFF)
set(FRAMEWORK_INSTALL_DIR
"/Library/Frameworks"
CACHE STRING "Directory to install frameworks to.")
endif()
include(CheckIncludeFile)
include(CheckIncludeFiles)
include(CheckLibraryExists)
include(TestBigEndian)
include(AddIOWOW)
if(ENABLE_HTTP)
if(WIN32)
message(FATAL_ERROR "ENABLE_HTTP option cannot be used in Windows build")
endif()
include(AddFacil)
add_definitions(-DJB_HTTP)
list(APPEND MODULES jbr)
endif()
if((CMAKE_BUILD_TYPE EQUAL Release) OR (CMAKE_BUILD_TYPE EQUAL RelWithDebInfo))
add_definition(-DJB_RELEASE=1)
endif()
include(TestQsortR)
if(HAVE_QSORT_R)
add_definitions(-DJB_HAVE_QSORT_R)
endif()
test_big_endian(IS_BIG_ENDIAN)
if(IS_BIG_ENDIAN EQUAL 1)
add_definitions(-DIW_BIGENDIAN=1)
endif()
if(CMAKE_SIZEOF_VOID_P MATCHES 8)
add_definitions(-DIW_64)
else()
add_definitions(-DIW_32)
endif()
if(BUILD_TESTS)
add_definitions(-DIW_TESTS)
endif()
find_package(Threads REQUIRED CMAKE_THREAD_PREFER_PTHREAD)
if(CMAKE_USE_WIN32_THREADS_INIT)
add_definitions(-DJB_WIN32_THREADS)
elseif(CMAKE_USE_PTHREADS_INIT)
add_definitions(-DJB_PTHREADS)
else()
mesage(FATAL_ERROR "Unable to find suitable threading library")
endif(CMAKE_USE_WIN32_THREADS_INIT)
if(ANDROID)
find_library(LOG_LIB log)
if(NOT LOG_LIB)
message(FATAL_ERROR "Library 'log' not FOUND")
endif()
list(APPEND PROJECT_LLIBRARIES "${LOG_LIB}")
endif()
if(NOT WIN32)
list(APPEND PROJECT_LLIBRARIES ${CMAKE_THREAD_LIBS_INIT})
else()
include(Win32LIBTools)
check_include_file(windows.h HAVE_WINDOWS_H)
if(NOT HAVE_WINDOWS_H)
message(FATAL_ERROR "Unable to find windows.h include file")
endif()
set(IBERTY_FIND_REQUIRED ON)
include(FindLibIberty)
list(APPEND PROJECT_LLIBRARIES ${IBERTY_LIBRARIES})
check_library_exists(winpthread pthread_exit "" HAVE_WINPTHREAD)
if(NOT HAVE_WINPTHREAD)
message(FATAL_ERROR "Unable to winpthread lib")
endif()
list(INSERT PROJECT_LLIBRARIES 0 -lwinpthread)
add_definitions(-D_POSIX_THREAD_SAFE_FUNCTIONS)
endif()
foreach(HF IN ITEMS stdlib stddef stdint stdbool)
string(TOUPPER "${HF}" UHF)
check_include_file(${HF}.h "JB_HAVE_${UHF}")
if(NOT JB_HAVE_${UHF})
message(FATAL_ERROR "Include file '${HF}.h' not FOUND")
endif()
endforeach()
add_definitions(-D_XOPEN_SOURCE=600)
add_definitions(-D_DEFAULT_SOURCE)
add_definitions(-D_LARGEFILE_SOURCE)
add_definitions(-D_FILE_OFFSET_BITS=64)
if(APPLE)
add_definitions(-D_DARWIN_C_SOURCE)
endif(APPLE)
file(GLOB ROOT_SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.c)
list(APPEND ALL_SRC ${ROOT_SRC})
foreach(MODULE IN LISTS MODULES)
file(GLOB MODULE_SRC ${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/*.c)
file(GLOB MODULE_HDRS ${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/*.h)
list(APPEND ALL_SRC ${MODULE_SRC})
list(APPEND ALL_HDRS ${MODULE_HDRS})
list(APPEND PROJECT_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/${MODULE})
endforeach(MODULE)
list(
APPEND
PUB_HDRS
${CMAKE_CURRENT_SOURCE_DIR}/ejdb2.h
${CMAKE_CURRENT_SOURCE_DIR}/jbl/jbl.h
${CMAKE_CURRENT_SOURCE_DIR}/jbr/jbr.h
${CMAKE_CURRENT_SOURCE_DIR}/jql/jql.h
${CMAKE_CURRENT_SOURCE_DIR}/util/lwre.h)
set(CMAKE_C_FLAGS
"${CMAKE_C_FLAGS} -std=gnu11 -fsigned-char -pedantic -Wfatal-errors -Wall -Wextra \
-Wno-sign-compare -Wno-unused-parameter -Wno-unknown-pragmas -Wno-unused-function \
-Wno-missing-field-initializers -Wno-missing-braces \
-Wno-shorten-64-to-32")
if(NOT WIN32)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-implicit-fallthrough -fPIC")
else()
add_definitions(-D__USE_MINGW_ANSI_STDIO)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-pedantic-ms-format")
set(CMAKE_EXE_LINKER_FLAGS
"${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++")
endif()
if(ASAN)
set(CMAKE_C_ASAN "-fsanitize=address -fno-omit-frame-pointer")
endif()
set(CMAKE_C_FLAGS_DEBUG
"${CMAKE_C_ASAN} -O0 -g -ggdb -Werror -DDEBUG -D_DEBUG -UNDEBUG -Wno-unused-variable"
)
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_ASAN} -O3 -DNDEBUG")
# set(CMAKE_EXE_LINKER_FLAGS_RELEASE "-Wl,-s")
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELEASE} -g")
set(CMAKE_C_FLAGS_RELEASEWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
if(CMAKE_COMPILER_IS_GNUCC)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
endif()
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/tmpl/ejdb2cfg.h
${PROJECT_GENERATED_DIR}/ejdb2cfg.h)
file(GLOB PROJECT_GENERATED_HDRS ${PROJECT_GENERATED_DIR}/*.h)
list(APPEND ALL_HDRS ${PROJECT_GENERATED_HDRS})
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/tmpl/libejdb2.pc.in
${PROJECT_GENERATED_DIR}/libejdb2.pc @ONLY)
if(DO_INSTALL_CORE)
install(FILES ${PROJECT_GENERATED_DIR}/libejdb2.pc
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
endif()
list(REMOVE_DUPLICATES PROJECT_LLIBRARIES)
list(REMOVE_DUPLICATES PROJECT_INCLUDE_DIRS)
include_directories(${PROJECT_INCLUDE_DIRS})
foreach(MODULE IN LISTS MODULES)
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/CMakeLists.txt)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${MODULE})
endif()
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/tools/CMakeLists.txt)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/tools)
endif()
if(BUILD_TESTS AND EXISTS
${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/tests/CMakeLists.txt)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/tests)
endif()
if(BUILD_EXAMPLES
AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/examples/CMakeLists.txt)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/examples)
endif()
if(BUILD_BENCHMARKS
AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/benchmark/CMakeLists.txt)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/benchmark)
endif()
endforeach(MODULE)
if(ENABLE_HTTP)
add_subdirectory(jbs)
endif()
if(BUILD_TESTS)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/tests)
endif()
if(BUILD_EXAMPLES)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/examples)
endif()
if(BUILD_DART_BINDING)
add_subdirectory(bindings/ejdb2_dart)
endif()
if(BUILD_JNI_BINDING)
add_subdirectory(bindings/ejdb2_jni)
endif()
if(BUILD_NODEJS_BINDING)
add_subdirectory(bindings/ejdb2_node)
endif()
if(BUILD_ANDROID_LIBS)
add_subdirectory(bindings/ejdb2_android)
endif()
if(BUILD_REACT_NATIVE_BINDING)
add_subdirectory(bindings/ejdb2_react_native)
endif()
if(BUILD_FLUTTER_BINDING)
add_subdirectory(bindings/ejdb2_flutter)
endif()
if(BUILD_SWIFT_BINDING)
add_subdirectory(bindings/ejdb2_swift)
endif()
if(NOT BUILD_SHARED_LIBS)
add_definitions(-DIW_NODLL)
add_library(ejdb2 STATIC ${ALL_SRC})
add_library(ejdb2_s ALIAS ejdb2)
else()
add_library(ejdb2 SHARED ${ALL_SRC})
add_library(ejdb2_s STATIC ${ALL_SRC})
endif()
target_link_libraries(ejdb2 ${PROJECT_LLIBRARIES})
if(BUILD_SHARED_LIBS)
target_link_libraries(ejdb2_s ${PROJECT_LLIBRARIES})
endif()
if(BUILD_SHARED_LIBS)
if(WIN32)
add_dependencies(ejdb2 wintools_init)
set_target_properties(ejdb2 PROPERTIES LINK_FLAGS
"-Wl,--output-def,libejdb2.def")
add_w32_importlib(ejdb2 libejdb2 ${CMAKE_CURRENT_BINARY_DIR})
if(DO_INSTALL_CORE)
install(
FILES ${CMAKE_CURRENT_BINARY_DIR}/libejdb2.def
${CMAKE_CURRENT_BINARY_DIR}/libejdb2.lib
${CMAKE_CURRENT_BINARY_DIR}/libejdb2.exp
DESTINATION ${CMAKE_INSTALL_LIBDIR})
endif()
endif()
set_target_properties(
ejdb2
PROPERTIES VERSION ${PROJECT_VERSION}
SOVERSION ${PROJECT_VERSION_MAJOR}
PUBLIC_HEADER "${PUB_HDRS}"
DEFINE_SYMBOL IW_API_EXPORTS)
if(CMAKE_BUILD_TYPE STREQUAL "Release")
add_custom_command(
TARGET ejdb2
POST_BUILD
COMMAND strip -s $<TARGET_FILE:ejdb2>)
endif()
set_target_properties(
ejdb2_s PROPERTIES VERSION ${PROJECT_VERSION} COMPILE_FLAGS "-DIW_NODLL"
OUTPUT_NAME ejdb2-${PROJECT_VERSION_MAJOR})
else()
set_target_properties(
ejdb2
PROPERTIES VERSION ${PROJECT_VERSION}
PUBLIC_HEADER "${PUB_HDRS}"
COMPILE_FLAGS "-DIW_NODLL"
LINK_FLAGS_RELEASE "${LINK_FLAGS_RELEASE} -s"
OUTPUT_NAME ejdb2-${PROJECT_VERSION_MAJOR})
endif()
if(DO_INSTALL_CORE)
install(
TARGETS ejdb2
EXPORT ejdb2-exports
FRAMEWORK DESTINATION ${FRAMEWORK_INSTALL_DIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME})
install(EXPORT ejdb2-exports
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME})
endif()
if(BUILD_SHARED_LIBS AND DO_INSTALL_CORE)
install(
TARGETS ejdb2_s
EXPORT ejdb2-static-exports
FRAMEWORK DESTINATION ${FRAMEWORK_INSTALL_DIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME})
install(EXPORT ejdb2-static-exports
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME})
endif()
if(DO_INSTALL_CORE)
# Install iowow headers included into ejdb2
install(
DIRECTORY ${IOWOW_INCLUDE_DIR}/${PROJECT_NAME}/iowow
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}
COMPONENT headers
FILES_MATCHING
PATTERN "*.h")
install(FILES ${CMAKE_SOURCE_DIR}/LICENSE ${CMAKE_SOURCE_DIR}/Changelog
DESTINATION ${CMAKE_INSTALL_DOCDIR})
install(
FILES ${CMAKE_SOURCE_DIR}/README.md
RENAME README
DESTINATION ${CMAKE_INSTALL_DOCDIR})
export(EXPORT ejdb2-exports)
if(BUILD_SHARED_LIBS)
export(EXPORT ejdb2-static-exports)
endif(BUILD_SHARED_LIBS)
endif()
include(InstallRequiredSystemLibraries)
set(${PROJECT_NAME}_PUB_HDRS
${PUB_HDRS}
CACHE INTERNAL "${PROJECT_NAME}: Public headers" FORCE)
set(${PROJECT_NAME}_INCLUDE_DIRS
${PROJECT_INCLUDE_DIRS}
CACHE INTERNAL "${PROJECT_NAME}: Include Directories" FORCE)
message("")
message("CMAKE_GENERATOR: ${CMAKE_GENERATOR}")
message("${PROJECT_NAME} LINK LIBS: ${PROJECT_LLIBRARIES}")
message("${PROJECT_NAME} ASAN: ${ASAN}")
message("\n${PROJECT_NAME} INCLUDE DIRS: ${PROJECT_INCLUDE_DIRS}")
message("\n${PROJECT_NAME} SOURCES: ${ALL_SRC}")
message("\n${PROJECT_NAME} PUB_HDRS: ${PUB_HDRS}")
message("\n${PROJECT_NAME} CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
message("${PROJECT_NAME} ANDROID_ABIS: ${ANDROID_ABIS}")
message("${PROJECT_NAME} ENABLE_HTTP: ${ENABLE_HTTP}")
message("${PROJECT_NAME} BUILD_SHARED_LIBS: ${BUILD_SHARED_LIBS}")
message("${PROJECT_NAME} BUILD_TESTS: ${BUILD_TESTS}")
message("${PROJECT_NAME} BUILD_EXAMPLES: ${BUILD_EXAMPLES}")
message("${PROJECT_NAME} BUILD_BENCHMARKS: ${BUILD_BENCHMARKS}")
message("${PROJECT_NAME} BUILD_DART_BINDING: ${BUILD_DART_BINDING}")
message("${PROJECT_NAME} BUILD_ANDROID_LIBS: ${BUILD_ANDROID_LIBS}")
message("${PROJECT_NAME} BUILD_JNI_BINDING: ${BUILD_JNI_BINDING}")
message("${PROJECT_NAME} BUILD_NODEJS_BINDING: ${BUILD_NODEJS_BINDING}")
message(
"${PROJECT_NAME} BUILD_REACT_NATIVE_BINDING: ${BUILD_REACT_NATIVE_BINDING}")
message("${PROJECT_NAME} BUILD_FLUTTER_BINDING: ${BUILD_FLUTTER_BINDING}")
message("${PROJECT_NAME} BUILD_SWIFT_BINDING: ${BUILD_SWIFT_BINDING}")
+36
View File
@@ -0,0 +1,36 @@
if (NOT DEFINED ANDROID_NDK_HOME)
if (DEFINED ENV{ANDROID_NDK_HOME})
set(ANDROID_NDK_HOME $ENV{ANDROID_NDK_HOME})
else ()
message(FATAL_ERROR "Missing required ANDROID_NDK_HOME option/env. Use -DANDROID_NDK_HOME=...")
endif ()
endif ()
set(ANDROID_BUILD_DIR "${CMAKE_SOURCE_DIR}/build_android")
set(ANDROID_LIBS_DIR "${CMAKE_CURRENT_BINARY_DIR}/libs")
foreach (AABI IN ITEMS ${ANDROID_ABIS})
list(APPEND ANDROID_ABIS_LIBS "${ANDROID_LIBS_DIR}/${AABI}/libejdb2jni.so")
add_custom_target(
android_${AABI} ALL
BYPRODUCTS ${ANDROID_LIBS_DIR}/${AABI}/libejdb2jni.so
COMMAND ${CMAKE_COMMAND} -E remove_directory ${ANDROID_BUILD_DIR}
COMMAND ${CMAKE_COMMAND} -E make_directory ${ANDROID_BUILD_DIR}
COMMAND ${CMAKE_COMMAND} -G ${CMAKE_GENERATOR} -S ${CMAKE_SOURCE_DIR}
-B ${ANDROID_BUILD_DIR}
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-DBUILD_JNI_BINDING=ON
-DENABLE_HTTP=OFF
-DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK_HOME}/build/cmake/android.toolchain.cmake
-DANDROID_ABI=${AABI}
-DANDROID_PLATFORM=android-21
-DANDROID_NATIVE_API_LEVEL=21
-DIOWOW_URL=${IOWOW_URL}
COMMAND ${CMAKE_COMMAND} --build ${ANDROID_BUILD_DIR}
COMMAND ${CMAKE_COMMAND} -E make_directory ${ANDROID_LIBS_DIR}/${AABI}
COMMAND ${CMAKE_COMMAND} -E copy ${ANDROID_BUILD_DIR}/src/bindings/ejdb2_jni/src/libejdb2jni.so ${ANDROID_LIBS_DIR}/${AABI}
COMMAND ${CMAKE_COMMAND} -E copy ${ANDROID_BUILD_DIR}/src/bindings/ejdb2_jni/src/ejdb2.jar ${ANDROID_LIBS_DIR}
COMMAND ${CMAKE_COMMAND} -E remove_directory ${ANDROID_BUILD_DIR}
VERBATIM
)
endforeach ()
+10
View File
@@ -0,0 +1,10 @@
# Android
* [Flutter binding](https://github.com/Softmotions/ejdb/tree/master/src/bindings/ejdb2_flutter)
* [React Native binding](https://github.com/Softmotions/ejdb/tree/master/src/bindings/ejdb2_react_native)
## Sample Android application
* https://github.com/Softmotions/ejdb/tree/master/src/bindings/ejdb2_android/test
* https://github.com/Softmotions/ejdb_android_todo_app
@@ -0,0 +1,6 @@
!/gradle/wrapper/gradle-wrapper.jar
.gradle
.DS_Store
/build
/captures
.externalNativeBuild
+30
View File
@@ -0,0 +1,30 @@
# Android
## Sample Android application
https://github.com/Softmotions/ejdb_android_todo_app
## Android binding showcase and unit tests
```bash
cd ./src/bindings/ejdb2_android/test
```
Set local android SDK/NDK path and target `arch` in `local.properties`
```properties
# Path to Android SDK dir
sdk.dir=/Android-sdk
# Path to Android NDK dir
ndk.dir=/Android-sdk/ndk-bundle
# Target abi name: armeabi-v7a, arm64-v8a, x86, x86_64
abi.name=arm64-v8a
```
Run Android emulator for the same abi version then:
```bash
./gradlew connectedAndroidTest
```
@@ -0,0 +1,36 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:3.1.0"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
Properties properties = new Properties()
if (project.rootProject.file('local.properties').exists()) {
def is = project.rootProject.file('local.properties').newDataInputStream()
properties.load(is)
is.close()
}
ext {
abiName = properties.get("abi.name")
}
@@ -0,0 +1,3 @@
/build
/jniLibs
/libs
@@ -0,0 +1,65 @@
apply plugin: 'com.android.library'
def props = rootProject.ext
android {
compileSdkVersion 21
defaultConfig {
minSdkVersion 21
targetSdkVersion 21
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
abiFilters props.abiName
targets "ejdb2jni"
arguments "-DCMAKE_BUILD_TYPE=Release",
"-DBUILD_JNI_BINDING=ON",
"-DENABLE_HTTP=OFF",
"-DBUILD_EXAMPLES=OFF",
"-DCMAKE_TOOLCHAIN_FILE=$ndkDirectory/build/cmake/android.toolchain.cmake",
"-DANDROID_ABI=$props.abiName",
"-DANDROID_PLATFORM=android-21",
"-DANDROID_NATIVE_API_LEVEL=21"
}
}
}
externalNativeBuild {
cmake {
path file("../../../../CMakeLists.txt")
}
}
}
project.afterEvaluate {
if (tasks.findByName("externalNativeBuildDebug")) {
javaPreCompileDebug.dependsOn externalNativeBuildDebug
externalNativeBuildDebug.doLast {
copy {
from(".externalNativeBuild/cmake/debug/$props.abiName/src/bindings/ejdb2_jni/src") {
include "ejdb2.jar"
}
into "libs"
}
}
}
if (tasks.findByName("externalNativeBuildRelease")) {
javaPreCompileRelease.dependsOn externalNativeBuildRelease
externalNativeBuildRelease.doLast {
copy {
from(".externalNativeBuild/cmake/release/$props.abiName/src/bindings/ejdb2_jni/src") {
include "ejdb2.jar"
}
into "libs"
}
}
}
}
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
testImplementation "junit:junit:4.12"
androidTestImplementation "com.android.support.test:runner:1.0.2"
androidTestImplementation "com.android.support.test.espresso:espresso-core:3.0.2"
}
@@ -0,0 +1,189 @@
package com.softmotions.ejdb2;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.LinkedHashMap;
import java.util.Map;
import static org.junit.Assert.*;
@RunWith(AndroidJUnit4.class)
public class Ejdb2AndroidTest {
private EJDB2 db;
@Before
public void start() {
try {
File dir = InstrumentationRegistry.getTargetContext().getCacheDir();
File path = new File(dir, "test.db");
db = new EJDB2Builder(path.getAbsolutePath()).truncate().open();
} catch (EJDB2Exception e) {
e.printStackTrace();
fail();
}
}
@After
public void shutdown() {
db.close();
}
@Test
public void ejdb2tests() {
try {
EJDB2Exception exception;
String json = "{'foo':'bar'}".replace('\'', '"');
String patch = "[{'op':'add', 'path':'/baz', 'value':'qux'}]".replace('\'', '"');
long id = db.put("c1", json);
assertEquals(1L, id);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
db.get("c1", 1L, bos);
assertEquals(bos.toString(), json);
db.patch("c1", patch, id);
bos.reset();
db.get("c1", 1L, bos);
assertEquals(bos.toString(), "{'foo':'bar','baz':'qux'}".replace('\'', '"'));
bos.reset();
db.del("c1", id);
exception = null;
try {
db.get("c1", id, bos);
} catch (EJDB2Exception e) {
exception = e;
}
assertNotNull(exception);
assertTrue(exception.getMessage().contains("IWKV_ERROR_NOTFOUND"));
// JQL resources can be closed explicitly or garbage collected
JQL q = db.createQuery("@mycoll/*");
assertNotNull(q.getDb());
assertEquals(q.getCollection(), "mycoll");
id = db.put("mycoll", "{'foo':'bar'}".replace('\'', '"'));
assertEquals(1, id);
exception = null;
try {
db.put("mycoll", "{\"");
} catch (EJDB2Exception e) {
exception = e;
}
assertTrue(exception != null && exception.getMessage() != null);
assertEquals(86005, exception.getCode());
assertTrue(exception.getMessage().contains("JBL_ERROR_PARSE_UNQUOTED_STRING"));
db.put("mycoll", "{'foo':'baz'}".replace('\'', '"'));
final Map<Long, String> results = new LinkedHashMap<>();
q.execute(new JQLCallback() {
@Override
public long onRecord(long docId, String doc) {
assertTrue(docId > 0 && doc != null);
results.put(docId, doc);
return 1;
}
});
assertEquals(2, results.size());
assertEquals(results.get(1L), "{\"foo\":\"bar\"}");
assertEquals(results.get(2L), "{\"foo\":\"baz\"}");
results.clear();
try {
JQL q2 = db.createQuery("/[foo=:?]", "mycoll").setString(0, "zaz");
q2.execute(new JQLCallback() {
@Override
public long onRecord(long docId, String doc) {
results.put(docId, doc);
return 1;
}
});
q2.close();
} catch (Exception e) {
e.printStackTrace();
fail();
}
assertTrue(results.isEmpty());
try {
JQL q2 = db.createQuery("/[foo=:val]", "mycoll").setString("val", "bar");
q2.execute(new JQLCallback() {
@Override
public long onRecord(long docId, String doc) {
results.put(docId, doc);
return 1;
}
});
q2.close();
} catch (Exception e) {
e.printStackTrace();
fail();
}
assertEquals(1, results.size());
assertEquals(results.get(1L), "{\"foo\":\"bar\"}");
exception = null;
try {
db.createQuery("@mycoll/[");
} catch (EJDB2Exception e) {
exception = e;
}
assertTrue(exception != null && exception.getMessage() != null);
assertEquals(87001, exception.getCode());
assertTrue(exception.getMessage().contains("@mycoll/[ <---"));
long count = db.createQuery("@mycoll/* | count").executeScalarInt();
assertEquals(2, count);
q.withExplain().execute();
assertTrue(q.getExplainLog().contains("[INDEX] NO [COLLECTOR] PLAIN"));
json = db.infoAsString();
assertNotNull(json);
assertTrue(json.contains("{\"name\":\"mycoll\",\"dbid\":4,\"rnum\":2,\"indexes\":[]}"));
// Indexes
db.ensureStringIndex("mycoll", "/foo", true);
json = db.infoAsString();
assertTrue(json.contains("\"indexes\":[{\"ptr\":\"/foo\",\"mode\":5,\"idbf\":0,\"dbid\":5,\"rnum\":2}]"));
db.patch("mycoll", patch, 2);
json = db.createQuery("@mycoll/[foo=:?] and /[baz=:?]")
.setString(0, "baz")
.setString(1, "qux")
.firstJson();
assertEquals("{\"foo\":\"baz\",\"baz\":\"qux\"}", json);
json = db.createQuery("@mycoll/[foo re :?]").setRegexp(0, ".*").firstJson();
assertEquals("{\"foo\":\"baz\",\"baz\":\"qux\"}", json);
db.removeStringIndex("mycoll", "/foo", true);
json = db.infoAsString();
assertTrue(json.contains("{\"name\":\"mycoll\",\"dbid\":4,\"rnum\":2,\"indexes\":[]}"));
db.removeCollection("mycoll");
db.removeCollection("c1");
json = db.infoAsString();
assertTrue(json.contains("\"collections\":[]"));
} catch (UnsupportedEncodingException | EJDB2Exception e) {
e.printStackTrace();
fail();
}
}
}
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.softmotions.ejdb2_android">
<application
android:allowBackup="true"
android:supportsRtl="true">
</application>
</manifest>
@@ -0,0 +1,15 @@
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
Binary file not shown.
@@ -0,0 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
+188
View File
@@ -0,0 +1,188 @@
#!/usr/bin/env sh
#
# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=$(save "$@")
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
fi
exec "$JAVACMD" "$@"
+100
View File
@@ -0,0 +1,100 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem http://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
@@ -0,0 +1,9 @@
## Path to Android SDK dir
sdk.dir=/Android-sdk
## Path to Android NDK dir
ndk.dir=/Android-sdk/ndk-bundle
## Target abi name: armeabi-v7a, arm64-v8a, x86, x86_64
abi.name=x86
@@ -0,0 +1 @@
include ':ejdb2'
+1
View File
@@ -0,0 +1 @@
!/.packages
+54
View File
@@ -0,0 +1,54 @@
# Generated by pub on 2020-12-21 22:58:24.542808.
_fe_analyzer_shared:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/_fe_analyzer_shared-7.0.0/lib/
analyzer:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/analyzer-0.39.17/lib/
args:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/args-1.6.0/lib/
async:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/async-2.5.0-nullsafety.3/lib/
boolean_selector:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0-nullsafety.3/lib/
charcode:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/charcode-1.2.0-nullsafety.3/lib/
cli_util:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/cli_util-0.2.0/lib/
collection:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0-nullsafety.5/lib/
convert:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/convert-2.1.1/lib/
coverage:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/coverage-0.14.0/lib/
crypto:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/crypto-2.1.5/lib/
csslib:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/csslib-0.16.2/lib/
glob:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/glob-1.2.0/lib/
html:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/html-0.14.0+3/lib/
http_multi_server:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/http_multi_server-2.2.0/lib/
http_parser:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/http_parser-3.1.4/lib/
io:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/io-0.3.4/lib/
js:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/js-0.6.3-nullsafety.3/lib/
json_at:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/json_at-2.0.0-nullsafety.1/lib/
logging:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/logging-0.11.4/lib/
matcher:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.10-nullsafety.3/lib/
meta:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/meta-1.3.0-nullsafety.6/lib/
mime:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/mime-0.9.7/lib/
node_interop:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/node_interop-1.1.1/lib/
node_io:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/node_io-1.1.1/lib/
node_preamble:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/node_preamble-1.4.12/lib/
package_config:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/package_config-1.9.3/lib/
path:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/path-1.8.0-nullsafety.3/lib/
pedantic:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/pedantic-1.10.0-nullsafety.3/lib/
pool:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/pool-1.5.0-nullsafety.3/lib/
pub_semver:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/pub_semver-1.4.4/lib/
quiver:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/quiver-3.0.0-nullsafety.2/lib/
shelf:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/shelf-0.7.9/lib/
shelf_packages_handler:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-2.0.0/lib/
shelf_static:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/shelf_static-0.2.8/lib/
shelf_web_socket:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-0.2.3/lib/
source_map_stack_trace:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-2.1.0-nullsafety.4/lib/
source_maps:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.10-nullsafety.3/lib/
source_span:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.0-nullsafety.4/lib/
stack_trace:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0-nullsafety.6/lib/
stream_channel:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0-nullsafety.3/lib/
string_scanner:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0-nullsafety.3/lib/
term_glyph:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0-nullsafety.3/lib/
test:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/test-1.16.0-nullsafety.13/lib/
test_api:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/test_api-0.2.19-nullsafety.6/lib/
test_core:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/test_core-0.3.12-nullsafety.12/lib/
typed_data:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0-nullsafety.5/lib/
vm_service:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/vm_service-4.2.0/lib/
watcher:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/watcher-0.9.7+15/lib/
web_socket_channel:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-1.1.0/lib/
webkit_inspection_protocol:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/webkit_inspection_protocol-0.7.3/lib/
yaml:file:///home/adam/.pub-cache/hosted/pub.dartlang.org/yaml-2.2.1/lib/
ejdb2_dart:lib/
+4
View File
@@ -0,0 +1,4 @@
ejdb_dart (@EJDB2_DART_VERSION@)
- Upgraded to Dart v2.12.x (null safety and native bindings API)
- Used new versioning scheme: {EJDB_VERSION}{BINDING_VERSION_NUMBER}
+91
View File
@@ -0,0 +1,91 @@
# Build dart binding shared library
file(READ ${CMAKE_CURRENT_SOURCE_DIR}/version.txt _VERSION)
set_property(GLOBAL PROPERTY EJDB2_DART_VERSION_PROPERTY
"${PROJECT_VERSION}${_VERSION}")
set(EJDB2_DART_VERSION "${PROJECT_VERSION}${_VERSION}")
add_library(ejdb2_dart SHARED lib/ejdb2_dart.c)
target_link_libraries(ejdb2_dart ejdb2_s ${PROJECT_LLIBRARIES})
set(dart_COMPILE_FLAGS " ")
set(dart_LINK_FLAGS " ")
if(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
set(dart_LINK_FLAGS "-dynamic -undefined dynamic_lookup")
endif()
set(DART_PUB_DIR ${CMAKE_CURRENT_BINARY_DIR}/ejdb2_dart)
configure_file(lib/ejdb2_dart.c ${DART_PUB_DIR}/lib/ejdb2_dart.c COPYONLY)
configure_file(lib/ejdb2_dart.dart ${DART_PUB_DIR}/lib/ejdb2_dart.dart COPYONLY)
configure_file(test/ejdb2_dart_test.dart
${DART_PUB_DIR}/test/ejdb2_dart_test.dart COPYONLY)
configure_file(example/example.dart ${DART_PUB_DIR}/example/example.dart
COPYONLY)
configure_file(example/isolate.dart ${DART_PUB_DIR}/example/isolate.dart
COPYONLY)
configure_file(README.md ${DART_PUB_DIR}/README.md COPYONLY)
configure_file(LICENSE ${DART_PUB_DIR}/LICENSE COPYONLY)
configure_file(CHANGELOG.md ${DART_PUB_DIR}/CHANGELOG.md @ONLY)
configure_file(pubspec.yaml.in ${DART_PUB_DIR}/pubspec.yaml @ONLY)
configure_file(analysis_options.yaml ${DART_PUB_DIR}/analysis_options.yaml
COPYONLY)
configure_file(.packages ${DART_PUB_DIR}/.packages COPYONLY)
set_target_properties(
ejdb2_dart
PROPERTIES COMPILE_FLAGS ${dart_COMPILE_FLAGS} LINK_FLAGS ${dart_LINK_FLAGS}
LIBRARY_OUTPUT_DIRECTORY ${DART_PUB_DIR}/lib)
if(CMAKE_BUILD_TYPE STREQUAL "Release")
add_custom_command(
TARGET ejdb2_dart
POST_BUILD
COMMAND strip -s $<TARGET_FILE:ejdb2_dart>)
endif()
set_target_properties(
ejdb2_dart
PROPERTIES VERSION ${PROJECT_VERSION} OUTPUT_NAME ejdb2dart
SOVERSION ${PROJECT_VERSION_MAJOR} DEFINE_SYMBOL IW_API_EXPORTS)
install(
TARGETS ejdb2_dart
FRAMEWORK DESTINATION ${FRAMEWORK_INSTALL_DIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME})
install(FILES ${DART_PUB_DIR}/lib/ejdb2_dart.dart ${DART_PUB_DIR}/README.md
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME}/dart)
install(FILES ${DART_PUB_DIR}/example/example.dart
${DART_PUB_DIR}/example/isolate.dart
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME}/dart/example)
if(BUILD_TESTS)
find_program(DART_EXEC dart HINTS /usr/bin /usr/local/bin)
if(DART_EXEC MATCHES "DART_EXEC-NOTFOUND")
message(FATAL_ERROR "`dart` executable not found")
endif()
find_program(PUB_EXEC pub /usr/bin /usr/local/bin)
if(PUB_EXEC MATCHES "PUB_EXEC-NOTFOUND")
set(PUB_EXEC ${DART_EXEC} pub)
endif()
add_custom_command(
COMMAND ${PUB_EXEC} get
OUTPUT ${DART_PUB_DIR}/pubspec.lock
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/pubspec.yaml
WORKING_DIRECTORY ${DART_PUB_DIR}
VERBATIM)
add_custom_target(pub_get ALL DEPENDS ${DART_PUB_DIR}/pubspec.lock)
add_test(
NAME ejdb2dart
COMMAND ${DART_EXEC} --enable-asserts ./test/ejdb2_dart_test.dart
WORKING_DIRECTORY ${DART_PUB_DIR})
endif(BUILD_TESTS)
+21
View File
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2012-2021 Softmotions Ltd <info@softmotions.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+49
View File
@@ -0,0 +1,49 @@
# EJDB2 Dart VM native binding
Embeddable JSON Database engine http://ejdb.org Dart binding.
See https://github.com/Softmotions/ejdb/blob/master/README.md
For API usage examples take a look into [/example](https://github.com/Softmotions/ejdb/tree/master/src/bindings/ejdb2_dart/example) and [/test](https://github.com/Softmotions/ejdb/tree/master/src/bindings/ejdb2_dart/test) folders.
## Example
```dart
import 'package:ejdb2_dart/ejdb2_dart.dart';
void main() async {
final db = await EJDB2.open('example.db', truncate: true);
var id = await db.put('parrots', {'name': 'Bianca', 'age': 4});
print('Bianca record: ${id}');
id = await db.put('parrots', {'name': 'Darko', 'age': 8});
print('Darko record: ${id}');
final q = db.createQuery('/[age > :age]', 'parrots');
await for (final doc in q.setInt('age', 3).execute()) {
print('Found ${doc}');
}
await db.close();
}
```
## Supported platforms
* Linux x64
* OSX
## How build it manually
Note: native binding requires Dart SDK version >= 2.12.x
``` sh
git clone https://github.com/Softmotions/ejdb.git
cd ./ejdb
mkdir ./build && cd build
cmake .. -DBUILD_DART_BINDING=ON -DCMAKE_BUILD_TYPE=Release
make
cd src/bindings/ejdb2_dart/ejdb2_dart
pub get
```
@@ -0,0 +1,157 @@
analyzer:
errors:
native_function_body_in_non_sdk_code: ignore
strong-mode:
implicit-casts: false
implicit-dynamic: true
linter:
rules:
- always_declare_return_types
- always_put_required_named_parameters_first
- always_require_non_null_named_parameters
- annotate_overrides
- avoid_bool_literals_in_conditional_expressions
- avoid_catching_errors
- avoid_classes_with_only_static_members
- avoid_double_and_int_checks
- avoid_empty_else
- avoid_field_initializers_in_const_classes
- avoid_implementing_value_types
- avoid_init_to_null
- avoid_js_rounded_ints
- avoid_null_checks_in_equality_operators
- avoid_private_typedef_functions
- avoid_relative_lib_imports
- avoid_renaming_method_parameters
- avoid_return_types_on_setters
- avoid_returning_null
- avoid_returning_null_for_future
- avoid_returning_null_for_void
#- avoid_returning_this
- avoid_setters_without_getters
- avoid_shadowing_type_parameters
- avoid_single_cascade_in_expression_statements
- avoid_slow_async_io
- avoid_types_as_parameter_names
- avoid_unused_constructor_parameters
- camel_case_extensions
- camel_case_types
- cancel_subscriptions
- comment_references
- control_flow_in_finally
- curly_braces_in_flow_control_structures
- diagnostic_describe_all_properties
- directives_ordering
- empty_catches
- empty_constructor_bodies
- empty_statements
- file_names
- flutter_style_todos
- hash_and_equals
- implementation_imports
- invariant_booleans
- iterable_contains_unrelated_type
- join_return_with_assignment
- library_names
- list_remove_unrelated_type
- literal_only_boolean_expressions
- no_adjacent_strings_in_list
- no_duplicate_case_values
- null_closures
- one_member_abstracts
- only_throw_errors
- overridden_fields
- package_api_docs
- package_names
- package_prefixed_library_names
- prefer_adjacent_string_concatenation
- prefer_asserts_in_initializer_lists
#- prefer_asserts_with_message
- prefer_collection_literals
- prefer_conditional_assignment
- prefer_const_constructors
- prefer_const_declarations
- prefer_const_literals_to_create_immutables
- prefer_constructors_over_static_methods
- prefer_contains
- prefer_equal_for_default_values
# - prefer_expression_function_bodies
- prefer_final_fields
- prefer_final_in_for_each
- prefer_final_locals
- prefer_for_elements_to_map_fromIterable
- prefer_foreach
- prefer_function_declarations_over_variables
- prefer_generic_function_type_aliases
- prefer_if_null_operators
- prefer_initializing_formals
- prefer_inlined_adds
- prefer_interpolation_to_compose_strings
- prefer_is_empty
- prefer_is_not_empty
- prefer_iterable_whereType
- prefer_mixin
- prefer_null_aware_operators
- prefer_single_quotes
- prefer_spread_collections
- prefer_typing_uninitialized_variables
- prefer_void_to_null
- provide_deprecation_message
- recursive_getters
- slash_for_doc_comments
- sort_child_properties_last
- sort_constructors_first
- sort_pub_dependencies
- sort_unnamed_constructors_first
- test_types_in_equals
- throw_in_finally
- type_init_formals
- unawaited_futures
- unnecessary_await_in_return
- unnecessary_const
- unnecessary_getters_setters
- unnecessary_lambdas
- unnecessary_new
- unnecessary_null_aware_assignments
- unnecessary_null_in_if_null_operators
- unnecessary_overrides
- unnecessary_parenthesis
- unnecessary_statements
- unnecessary_this
- unrelated_type_equality_checks
- unsafe_html
- use_full_hex_values_for_flutter_colors
- use_rethrow_when_possible
- use_setters_to_change_properties
- use_string_buffers
- use_to_and_as_if_applicable
- valid_regexps
- void_checks
# - always_put_control_body_on_new_line
# - always_specify_types
# - avoid_annotating_with_dynamic
# - avoid_as
# - avoid_catches_without_on_clauses
# - avoid_equals_and_hash_code_on_mutable_classes
# - avoid_function_literals_in_foreach_calls
# - avoid_positional_boolean_parameters
# - avoid_print
# - avoid_types_on_closure_parameters
# - avoid_void_async
# - await_only_futures
# - cascade_invocations
# - close_sinks
# - constant_identifier_names
# - library_prefixes
# - lines_longer_than_80_chars
# - non_constant_identifier_names
# - omit_local_variable_types
# - parameter_assignments
# - prefer_const_constructors_in_immutables
# - prefer_double_quotes
# - prefer_if_elements_to_conditional_expressions
# - prefer_int_literals
# - public_member_api_docs
# - type_annotate_public_apis
# - unnecessary_brace_in_string_interps
# - use_function_type_syntax_for_parameters
@@ -0,0 +1,17 @@
import 'package:ejdb2_dart/ejdb2_dart.dart';
void main() async {
final db = await EJDB2.open('example.db', truncate: true);
var id = await db.put('parrots', {'name': 'Bianca', 'age': 4});
print('Bianca record: ${id}');
id = await db.put('parrots', {'name': 'Darko', 'age': 8});
print('Darko record: ${id}');
final q = db.createQuery('/[age > :age]', 'parrots');
await for (final doc in q.setInt('age', 3).execute()) {
print('Found $doc');
}
await db.close();
}
@@ -0,0 +1,38 @@
import 'dart:async';
import 'dart:isolate';
import 'package:ejdb2_dart/ejdb2_dart.dart';
/// Database access from multiple isolates.
/// Based on isolate example from https://github.com/adamlofts/leveldb_dart
void main() async {
final runners = Iterable<int>.generate(5).map((int index) {
return Runner.spawn(index);
}).toList();
await Future.wait(runners.map((Runner r) => r.finish));
}
Future<void> run(int index) async {
print('Thread ${index} write');
final db = await EJDB2.open('isolate.db', truncate: true);
await db.put('c1', {'index': index});
// Sleep 1 second
await Future<void>.delayed(const Duration(seconds: 1));
final nextKey = (index + 1) % 5;
final doc = await db.createQuery('/[index=:?]', 'c1').setInt(0, nextKey).execute().first;
print('Thread ${index} read: ${doc}');
}
class Runner {
final Completer<void> _finish = Completer<void>();
final RawReceivePort _finishPort = RawReceivePort();
Runner.spawn(int index) {
_finishPort.handler = (dynamic _) {
_finish.complete();
_finishPort.close();
};
Isolate.spawn(run, index, onExit: _finishPort.sendPort);
}
Future<void> get finish => _finish.future;
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,191 @@
/*
* Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
* for details. All rights reserved. Use of this source code is governed by a
* BSD-style license that can be found in the LICENSE file.
*/
#ifndef RUNTIME_INCLUDE_DART_NATIVE_API_H_
#define RUNTIME_INCLUDE_DART_NATIVE_API_H_
#include "dart_api.h" /* NOLINT */
/*
* ==========================================
* Message sending/receiving from native code
* ==========================================
*/
/**
* A Dart_CObject is used for representing Dart objects as native C
* data outside the Dart heap. These objects are totally detached from
* the Dart heap. Only a subset of the Dart objects have a
* representation as a Dart_CObject.
*
* The string encoding in the 'value.as_string' is UTF-8.
*
* All the different types from dart:typed_data are exposed as type
* kTypedData. The specific type from dart:typed_data is in the type
* field of the as_typed_data structure. The length in the
* as_typed_data structure is always in bytes.
*
* The data for kTypedData is copied on message send and ownership remains with
* the caller. The ownership of data for kExternalTyped is passed to the VM on
* message send and returned when the VM invokes the
* Dart_HandleFinalizer callback; a non-NULL callback must be provided.
*/
typedef enum {
Dart_CObject_kNull = 0,
Dart_CObject_kBool,
Dart_CObject_kInt32,
Dart_CObject_kInt64,
Dart_CObject_kDouble,
Dart_CObject_kString,
Dart_CObject_kArray,
Dart_CObject_kTypedData,
Dart_CObject_kExternalTypedData,
Dart_CObject_kSendPort,
Dart_CObject_kCapability,
Dart_CObject_kUnsupported,
Dart_CObject_kNumberOfTypes
} Dart_CObject_Type;
typedef struct _Dart_CObject {
Dart_CObject_Type type;
union {
bool as_bool;
int32_t as_int32;
int64_t as_int64;
double as_double;
char* as_string;
struct {
Dart_Port id;
Dart_Port origin_id;
} as_send_port;
struct {
int64_t id;
} as_capability;
struct {
intptr_t length;
struct _Dart_CObject** values;
} as_array;
struct {
Dart_TypedData_Type type;
intptr_t length;
uint8_t* values;
} as_typed_data;
struct {
Dart_TypedData_Type type;
intptr_t length;
uint8_t* data;
void* peer;
Dart_HandleFinalizer callback;
} as_external_typed_data;
} value;
} Dart_CObject;
// This struct is versioned by DART_API_DL_MAJOR_VERSION, bump the version when
// changing this struct.
/**
* Posts a message on some port. The message will contain the Dart_CObject
* object graph rooted in 'message'.
*
* While the message is being sent the state of the graph of Dart_CObject
* structures rooted in 'message' should not be accessed, as the message
* generation will make temporary modifications to the data. When the message
* has been sent the graph will be fully restored.
*
* If true is returned, the message was enqueued, and finalizers for external
* typed data will eventually run, even if the receiving isolate shuts down
* before processing the message. If false is returned, the message was not
* enqueued and ownership of external typed data in the message remains with the
* caller.
*
* This function may be called on any thread when the VM is running (that is,
* after Dart_Initialize has returned and before Dart_Cleanup has been called).
*
* \param port_id The destination port.
* \param message The message to send.
*
* \return True if the message was posted.
*/
DART_EXPORT bool Dart_PostCObject(Dart_Port port_id, Dart_CObject* message);
/**
* Posts a message on some port. The message will contain the integer 'message'.
*
* \param port_id The destination port.
* \param message The message to send.
*
* \return True if the message was posted.
*/
DART_EXPORT bool Dart_PostInteger(Dart_Port port_id, int64_t message);
/**
* A native message handler.
*
* This handler is associated with a native port by calling
* Dart_NewNativePort.
*
* The message received is decoded into the message structure. The
* lifetime of the message data is controlled by the caller. All the
* data references from the message are allocated by the caller and
* will be reclaimed when returning to it.
*/
typedef void (*Dart_NativeMessageHandler)(Dart_Port dest_port_id,
Dart_CObject* message);
/**
* Creates a new native port. When messages are received on this
* native port, then they will be dispatched to the provided native
* message handler.
*
* \param name The name of this port in debugging messages.
* \param handler The C handler to run when messages arrive on the port.
* \param handle_concurrently Is it okay to process requests on this
* native port concurrently?
*
* \return If successful, returns the port id for the native port. In
* case of error, returns ILLEGAL_PORT.
*/
DART_EXPORT Dart_Port Dart_NewNativePort(const char* name,
Dart_NativeMessageHandler handler,
bool handle_concurrently);
/* TODO(turnidge): Currently handle_concurrently is ignored. */
/**
* Closes the native port with the given id.
*
* The port must have been allocated by a call to Dart_NewNativePort.
*
* \param native_port_id The id of the native port to close.
*
* \return Returns true if the port was closed successfully.
*/
DART_EXPORT bool Dart_CloseNativePort(Dart_Port native_port_id);
/*
* ==================
* Verification Tools
* ==================
*/
/**
* Forces all loaded classes and functions to be compiled eagerly in
* the current isolate..
*
* TODO(turnidge): Document.
*/
DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_CompileAll();
/**
* Finalizes all classes.
*/
DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_FinalizeAllClasses();
/* This function is intentionally undocumented.
*
* It should not be used outside internal tests.
*/
DART_EXPORT void* Dart_ExecuteInternalCommand(const char* command, void* arg);
#endif /* INCLUDE_DART_NATIVE_API_H_ */ /* NOLINT */
File diff suppressed because it is too large Load Diff
+632
View File
@@ -0,0 +1,632 @@
///
/// EJDB2 Dart VM native API binding.
///
/// See https://github.com/Softmotions/ejdb/blob/master/README.md
///
/// For API usage examples look into `/example` and `/test` folders.
///
library ejdb2_dart;
import 'dart:async';
import 'dart:convert';
import 'dart:convert' as convert_lib;
import 'dart:io';
import 'dart:isolate';
import 'dart:nativewrappers' show NativeFieldWrapperClass2;
import 'package:path/path.dart' as path_lib;
import 'package:quiver/core.dart';
import 'package:json_at/json_at.dart';
import 'dart-ext:ejdb2dart';
String ejdb2ExplainRC(int rc) native 'explain_rc';
/// EJDB specific exception
class EJDB2Error implements Exception {
EJDB2Error(this.code, this.message);
EJDB2Error.fromCode(int code) : this(code, ejdb2ExplainRC(code));
EJDB2Error.invalidState() : this.fromCode(EJD_ERROR_INVALID_STATE);
EJDB2Error.notFound() : this.fromCode(IWKV_ERROR_NOTFOUND);
static int EJD_ERROR_CREATE_PORT = 89001;
static int EJD_ERROR_POST_PORT = 89002;
static int EJD_ERROR_INVALID_NATIVE_CALL_ARGS = 89003;
static int EJD_ERROR_INVALID_STATE = 89004;
static int IWKV_ERROR_NOTFOUND = 75001;
final int code;
final String message;
bool get notFound => code == IWKV_ERROR_NOTFOUND;
bool get invalidQuery => code == 87001;
@override
String toString() => '$runtimeType: $code $message';
}
/// EJDB document item
class JBDOC {
JBDOC(this.id, this._json);
JBDOC._fromList(List list) : this(list[0] as int, list[1] as String?);
/// Document identifier
final int id;
/// Document body as JSON string
String get json => _json ?? convert_lib.jsonEncode(_object);
/// Document body as parsed JSON object.
dynamic get object {
if (_json == null) {
return _object;
} else {
_object = convert_lib.jsonDecode(_json!);
_json = null; // Release memory used to store JSON string data
return _object;
}
}
/// Gets subset of document using RFC 6901 JSON [pointer].
Optional<dynamic> at(String pointer) => jsonAt(object, pointer);
/// Gets subset of document using RFC 6901 JSON [pointer].
Optional<dynamic> operator [](String pointer) => at(pointer);
String? _json;
dynamic _object;
@override
String toString() => '$runtimeType: $id $json';
}
/// Represents query on ejdb collection.
/// Instance can be reused for multiple queries reusing
/// placeholder parameters.
class JQL extends NativeFieldWrapperClass2 {
JQL._(this.db, this.query, this.collection);
final String query;
final String collection;
final EJDB2 db;
StreamController<JBDOC>? _controller;
RawReceivePort? _replyPort;
/// Execute query and returns a stream of matched documents.
///
/// [explainCallback] Used to get query execution log.
/// [limit] Overrides `limit` set by query text for this execution session.
///
Stream<JBDOC> execute({void explainCallback(String log)?, int limit = 0}) {
abort();
var execHandle = 0;
_controller = StreamController<JBDOC>();
_replyPort = RawReceivePort();
_replyPort!.handler = (dynamic reply) {
if (reply is int) {
_exec_check(execHandle, true);
_replyPort!.close();
_controller!.addError(EJDB2Error.fromCode(reply));
return;
} else if (reply is List) {
_exec_check(execHandle, false);
if (reply[2] != null && explainCallback != null) {
explainCallback(reply[2] as String);
}
_controller!.add(JBDOC._fromList(reply));
} else {
_exec_check(execHandle, true);
if (reply != null && explainCallback != null) {
explainCallback(reply as String);
}
abort();
}
};
execHandle = _exec(_replyPort!.sendPort, explainCallback != null, limit);
return _controller!.stream;
}
/// Returns optional element for first record in result set.
Future<Optional<JBDOC>> first({void explainCallback(String log)?}) async {
await for (final doc in execute(explainCallback: explainCallback, limit: 1)) {
return Optional.of(doc);
}
return const Optional.absent();
}
/// Return first record in result set or throw not found [EJDB2Error] error.
Future<JBDOC> firstRequired({void explainCallback(String log)?}) async {
await for (final doc in execute(explainCallback: explainCallback, limit: 1)) {
return doc;
}
throw EJDB2Error.notFound();
}
/// Collects up to [n] elements from result set into array.
Future<List<JBDOC>> firstN(int n, {void explainCallback(String log)?}) async {
final ret = <JBDOC>[];
await for (final doc in execute(explainCallback: explainCallback, limit: n)) {
if (n-- <= 0) break;
ret.add(doc);
}
return ret;
}
/// Abort query execution.
void abort() {
_replyPort?.close();
_replyPort = null;
_controller?.close();
_controller = null;
}
/// Return scalar integer value as result of query execution.
/// For example execution of count query: `/... | count`
Future<int> scalarInt({void explainCallback(String log)?}) {
return execute(explainCallback: explainCallback).map((d) => d.id).first;
}
/// Set [json] at the specified [placeholder].
/// [placeholder] can be either `string` or `int`
JQL setJson(dynamic placeholder, dynamic json) {
_checkPlaceholder(placeholder);
ArgumentError.checkNotNull(json);
_set(placeholder, _asJsonString(json), 1);
return this;
}
/// Set [regexp] at the specified [placeholder].
/// [placeholder] can be either `string` or `int`
JQL setRegExp(dynamic placeholder, RegExp regexp) {
_checkPlaceholder(placeholder);
ArgumentError.checkNotNull(regexp);
_set(placeholder, regexp.pattern, 2);
return this;
}
/// Set integer [val] at the specified [placeholder].
/// [placeholder] can be either `string` or `int`
JQL setInt(dynamic placeholder, int val) {
_checkPlaceholder(placeholder);
ArgumentError.checkNotNull(val);
_set(placeholder, val);
return this;
}
/// Set double [val] at the specified [placeholder].
/// [placeholder] can be either `string` or `int`
JQL setDouble(dynamic placeholder, double val) {
_checkPlaceholder(placeholder);
ArgumentError.checkNotNull(val);
_set(placeholder, val);
return this;
}
/// Set boolean [val] at the specified [placeholder].
/// [placeholder] can be either `string` or `int`
JQL setBoolean(dynamic placeholder, bool val) {
_checkPlaceholder(placeholder);
ArgumentError.checkNotNull(val);
_set(placeholder, val);
return this;
}
/// Set string [val] at the specified [placeholder].
/// [placeholder] can be either `string` or `int`
JQL setString(dynamic placeholder, String val) {
_checkPlaceholder(placeholder);
ArgumentError.checkNotNull(val);
_set(placeholder, val);
return this;
}
/// Set `null` at the specified [placeholder].
/// [placeholder] can be either `string` or `int`
JQL setNull(dynamic placeholder) {
_checkPlaceholder(placeholder);
_set(placeholder, null);
return this;
}
/// Get current `limit` encoded in query.
int get limit native 'jql_get_limit';
void _checkPlaceholder(dynamic placeholder) {
if (!(placeholder is String) && !(placeholder is int)) {
ArgumentError.value(placeholder, 'placeholder');
}
}
void _set(dynamic placeholder, dynamic value, [int type]) native 'jql_set';
int _exec(SendPort sendPort, bool explain, int limit) native 'exec';
void _exec_check(int execHandle, bool terminate) native 'check_exec';
}
/// Database wrapper
class EJDB2 extends NativeFieldWrapperClass2 {
EJDB2._();
static bool _checkCompleterPortError(Completer<dynamic> completer, dynamic reply) {
if (reply is int) {
completer.completeError(EJDB2Error(reply, ejdb2ExplainRC(reply)));
return true;
} else if (reply is! List) {
completer.completeError(EJDB2Error(0, 'Invalid port response'));
return true;
}
return false;
}
/// Open EJDB2 database
/// See https://github.com/Softmotions/ejdb/blob/master/src/ejdb2.h#L104
/// for description of options.
static Future<EJDB2> open(String path,
{bool truncate = false,
bool readonly = false,
bool http_enabled = false,
bool http_read_anon = false,
bool wal_enabled = true,
bool wal_check_crc_on_checkpoint = false,
int? wal_checkpoint_buffer_sz,
int? wal_checkpoint_timeout_sec,
int? wal_savepoint_timeout_sec,
int? wal_wal_buffer_sz,
int? document_buffer_sz,
int? sort_buffer_sz,
String? http_access_token,
String? http_bind,
int? http_max_body_size,
int? http_port}) {
final completer = Completer<EJDB2>();
final replyPort = RawReceivePort();
final jb = EJDB2._();
path = path_lib.canonicalize(File(path).absolute.path);
replyPort.handler = (dynamic reply) {
replyPort.close();
if (_checkCompleterPortError(completer, reply)) {
return;
}
try {
jb._set_handle((reply as List).first as int);
} catch (e) {
completer.completeError(e);
return;
}
completer.complete(jb);
};
// Open
var oflags = 0;
if (readonly) {
oflags |= 0x02;
} else if (truncate) {
oflags |= 0x04;
}
jb._port().send([
replyPort.sendPort,
'open',
path,
oflags,
wal_enabled,
wal_check_crc_on_checkpoint,
wal_checkpoint_buffer_sz as dynamic,
wal_checkpoint_timeout_sec as dynamic,
wal_savepoint_timeout_sec as dynamic,
wal_wal_buffer_sz as dynamic,
document_buffer_sz as dynamic,
sort_buffer_sz as dynamic,
http_enabled,
http_access_token as dynamic,
http_bind as dynamic,
http_max_body_size as dynamic,
http_port as dynamic,
http_read_anon
]);
return completer.future;
}
/// Closes database instance.
Future<void> close() {
final hdb = _get_handle();
if (hdb == null) {
return Future.value();
}
final completer = Completer<void>();
final replyPort = RawReceivePort();
replyPort.handler = (dynamic reply) {
replyPort.close();
if (_checkCompleterPortError(completer, reply)) {
return;
}
completer.complete();
};
_set_handle(null);
_port().send([replyPort.sendPort, 'close', hdb as dynamic]);
return completer.future;
}
/// Save [json] document under specified [id] or create a document
/// with new generated `id`. Returns future holding actual document `id`.
Future<int> put(String collection, dynamic json, [int? id]) {
final hdb = _get_handle();
if (hdb == null) {
return Future.error(EJDB2Error.invalidState());
}
final completer = Completer<int>();
final replyPort = RawReceivePort();
replyPort.handler = (dynamic reply) {
replyPort.close();
if (_checkCompleterPortError(completer, reply)) {
return;
}
completer.complete((reply as List).first as int);
};
_port().send([
replyPort.sendPort,
'put',
hdb as dynamic,
collection,
_asJsonString(json),
id as dynamic
]);
return completer.future;
}
/// Apply rfc6902/rfc7386 JSON [patch] to the document identified by [id].
Future<void> patch(String collection, dynamic patchObj, int id, [bool upsert = false]) {
final hdb = _get_handle();
if (hdb == null) {
return Future.error(EJDB2Error.invalidState());
}
final completer = Completer<void>();
final replyPort = RawReceivePort();
replyPort.handler = (dynamic reply) {
replyPort.close();
if (_checkCompleterPortError(completer, reply)) {
return;
}
completer.complete();
};
_port().send([
replyPort.sendPort,
'patch',
hdb as dynamic,
collection,
_asJsonString(patchObj),
id as dynamic,
upsert
]);
return completer.future;
}
/// Apply JSON merge patch (rfc7396) to the document identified by `id` or
/// insert new document under specified `id`.
Future<void> patchOrPut(String collection, dynamic patchObj, int id) =>
patch(collection, patch, id, true);
/// Get json body of document identified by [id] and stored in [collection].
/// Throws [EJDB2Error] not found exception if document is not found.
Future<String> get(String collection, int id) {
final hdb = _get_handle();
if (hdb == null) {
return Future.error(EJDB2Error.invalidState());
}
final completer = Completer<String>();
final replyPort = RawReceivePort();
replyPort.handler = (dynamic reply) {
replyPort.close();
if (_checkCompleterPortError(completer, reply)) {
return;
}
completer.complete((reply as List).first as String);
};
_port().send([replyPort.sendPort, 'get', hdb as dynamic, collection, id]);
return completer.future;
}
/// Get json body of database metadata.
Future<String> info() {
final hdb = _get_handle();
if (hdb == null) {
return Future.error(EJDB2Error.invalidState());
}
final completer = Completer<String>();
final replyPort = RawReceivePort();
replyPort.handler = (dynamic reply) {
replyPort.close();
if (_checkCompleterPortError(completer, reply)) {
return;
}
completer.complete((reply as List).first as String);
};
_port().send([replyPort.sendPort, 'info', hdb as dynamic]);
return completer.future;
}
/// Remove document idenfied by [id] from [collection].
Future<void> del(String collection, int id) {
final hdb = _get_handle();
if (hdb == null) {
return Future.error(EJDB2Error.invalidState());
}
final completer = Completer<void>();
final replyPort = RawReceivePort();
replyPort.handler = (dynamic reply) {
replyPort.close();
if (_checkCompleterPortError(completer, reply)) {
return;
}
completer.complete();
};
_port().send([replyPort.sendPort, 'del', hdb as dynamic, collection, id]);
return completer.future;
}
/// Remove document idenfied by [id] from [collection].
/// Doesn't raise error if document is not found.
Future<void> delIgnoreNotFound(String collection, int id) =>
del(collection, id).catchError((err) {
if (err is EJDB2Error && err.notFound) {
return Future.value();
} else {
return Future.error(err as Object);
}
});
Future<void> renameCollection(String oldCollection, String newCollectionName) {
final hdb = _get_handle();
if (hdb == null) {
return Future.error(EJDB2Error.invalidState());
}
final completer = Completer<void>();
final replyPort = RawReceivePort();
replyPort.handler = (dynamic reply) {
replyPort.close();
if (_checkCompleterPortError(completer, reply)) {
return;
}
completer.complete();
};
_port().send([replyPort.sendPort, 'rename', hdb as dynamic, oldCollection, newCollectionName]);
return completer.future;
}
/// Ensures json document database index specified by [path] json pointer to string data type.
Future<void> ensureStringIndex(String collection, String path, {bool unique = false}) {
return _idx(collection, path, 0x04 | (unique ? 0x01 : 0));
}
/// Removes specified database index.
Future<void> removeStringIndex(String collection, String path, {bool unique = false}) {
return _rmi(collection, path, 0x04 | (unique ? 0x01 : 0));
}
/// Ensures json document database index specified by [path] json pointer to integer data type.
Future<void> ensureIntIndex(String collection, String path, {bool unique = false}) {
return _idx(collection, path, 0x08 | (unique ? 0x01 : 0));
}
/// Removes specified database index.
Future<void> removeIntIndex(String collection, String path, {bool unique = false}) {
return _rmi(collection, path, 0x08 | (unique ? 0x01 : 0));
}
/// Ensures json document database index specified by [path] json pointer to floating point data type.
Future<void> ensureFloatIndex(String collection, String path, {bool unique = false}) {
return _idx(collection, path, 0x10 | (unique ? 0x01 : 0));
}
/// Removes specified database index.
Future<void> removeFloatIndex(String collection, String path, {bool unique = false}) {
return _rmi(collection, path, 0x10 | (unique ? 0x01 : 0));
}
/// Removes database [collection].
Future<void> removeCollection(String collection) {
final hdb = _get_handle();
if (hdb == null) {
return Future.error(EJDB2Error.invalidState());
}
final completer = Completer<void>();
final replyPort = RawReceivePort();
replyPort.handler = (dynamic reply) {
replyPort.close();
if (_checkCompleterPortError(completer, reply)) {
return;
}
completer.complete();
};
_port().send([replyPort.sendPort, 'rmc', hdb as dynamic, collection]);
return completer.future;
}
/// Creates an online database backup image and copies it into the specified [fileName].
/// During online backup phase read/write database operations are allowed and not
/// blocked for significant amount of time. Returns future with backup
/// finish time as number of milliseconds since epoch.
Future<int> onlineBackup(String fileName) {
final hdb = _get_handle();
if (hdb == null) {
return Future.error(EJDB2Error.invalidState());
}
final completer = Completer<int>();
final replyPort = RawReceivePort();
replyPort.handler = (dynamic reply) {
replyPort.close();
if (_checkCompleterPortError(completer, reply)) {
return;
}
completer.complete((reply as List).first as int);
};
_port().send([replyPort.sendPort, 'bkp', hdb as dynamic, fileName]);
return completer.future;
}
/// Create instance of [query] specified for [collection].
/// If [collection] is not specified a [query] spec must contain collection name,
/// eg: `@mycollection/[foo=bar]`
JQL createQuery(String query, [String collection]) native 'create_query';
Future<void> _idx(String collection, String path, int mode) {
final hdb = _get_handle();
if (hdb == null) {
return Future.error(EJDB2Error.invalidState());
}
final completer = Completer<void>();
final replyPort = RawReceivePort();
replyPort.handler = (dynamic reply) {
replyPort.close();
if (_checkCompleterPortError(completer, reply)) {
return;
}
completer.complete();
};
_port().send([replyPort.sendPort, 'idx', hdb as dynamic, collection, path, mode]);
return completer.future;
}
Future<void> _rmi(String collection, String path, int mode) {
final hdb = _get_handle();
if (hdb == null) {
return Future.error(EJDB2Error.invalidState());
}
final completer = Completer<void>();
final replyPort = RawReceivePort();
replyPort.handler = (dynamic reply) {
replyPort.close();
if (_checkCompleterPortError(completer, reply)) {
return;
}
completer.complete();
};
_port().send([replyPort.sendPort, 'rmi', hdb as dynamic, collection, path, mode]);
return completer.future;
}
SendPort _port() native 'port';
void _set_handle(int? handle) native 'set_handle';
int? _get_handle() native 'get_handle';
}
String _asJsonString(dynamic val) {
if (val is String) {
return val;
} else {
return jsonEncode(val);
}
}
+15
View File
@@ -0,0 +1,15 @@
name: ejdb2_dart
description: Embeddable JSON Database engine EJDB http://ejdb.org Dart binding.
version: 1.0.63
homepage: https://github.com/Softmotions/ejdb
issue_tracker: https://github.com/Softmotions/ejdb/issues?q=is%3Aissue+label%3ADart+
license: MIT
environment:
sdk: ">=2.12.0-0 <3.0.0"
dependencies:
json_at: ^2.0.0-nullsafety.1
path: ^1.8.0-nullsafety.3
quiver: ^3.0.0-nullsafety.2
test: ^1.16.0-nullsafety.13
+15
View File
@@ -0,0 +1,15 @@
name: ejdb2_dart
description: Embeddable JSON Database engine EJDB http://ejdb.org Dart binding.
version: @EJDB2_DART_VERSION@
homepage: https://github.com/Softmotions/ejdb
issue_tracker: https://github.com/Softmotions/ejdb/issues?q=is%3Aissue+label%3ADart+
license: MIT
environment:
sdk: ">=2.12.0-0 <3.0.0"
dependencies:
json_at: ^2.0.0-nullsafety.1
path: ^1.8.0-nullsafety.3
quiver: ^3.0.0-nullsafety.2
test: ^1.16.0-nullsafety.13
@@ -0,0 +1,192 @@
import 'package:ejdb2_dart/ejdb2_dart.dart';
void main() async {
final db = await EJDB2.open('hello.db', truncate: true);
var q = db.createQuery('@mycoll/*');
assert(q.collection == 'mycoll');
var id = await db.put('mycoll', {'foo': 'bar'});
assert(id == 1);
dynamic error;
try {
await db.put('mycoll', '{"');
} on EJDB2Error catch (e) {
error = e;
assert(e.code == 86005);
assert(e.message == 'Unquoted JSON string (JBL_ERROR_PARSE_UNQUOTED_STRING)');
}
assert(error != null);
var json = await db.get('mycoll', id);
assert(json == '{"foo":"bar"}');
await db.put('mycoll', {'foo': 'baz'});
final list = await db.createQuery('@mycoll/*').execute(limit: 1).toList();
assert(list.length == 1);
var first = await db.createQuery('@mycoll/*').first();
assert(first.isPresent);
assert(first.value.json == '{"foo":"baz"}');
first = await db.createQuery('@mycoll/[zzz=bbb]').first();
assert(first.isEmpty);
var firstN = await db.createQuery('@mycoll/*').firstN(5);
assert(firstN.length == 2);
assert(firstN[0].json == '{"foo":"baz"}');
assert(firstN[1].json == '{"foo":"bar"}');
firstN = await db.createQuery('@mycoll/*').firstN(1);
assert(firstN.length == 1);
// Query 1
final rbuf = <String>[];
await for (final doc in q.execute()) {
rbuf..add(doc.id.toString())..add(doc.json);
}
assert(rbuf.toString() == '[2, {"foo":"baz"}, 1, {"foo":"bar"}]');
rbuf.clear();
// Query 2
await for (final doc in db.createQuery('@mycoll/[foo=zaz]').execute()) {
rbuf..add(doc.id.toString())..add(doc.json);
}
assert(rbuf.isEmpty);
// Query 3
await for (final doc in db.createQuery('/[foo=bar]', 'mycoll').execute()) {
rbuf..add(doc.id.toString())..add(doc.json);
}
assert(rbuf.toString() == '[1, {"foo":"bar"}]');
error = null;
try {
await db.createQuery('@mycoll/[').execute();
} on EJDB2Error catch (e) {
error = e;
assert(e.invalidQuery);
assert(e.message.contains('@mycoll/[ <---'));
}
assert(error != null);
var count = await db.createQuery('@mycoll/* | count').scalarInt();
assert(count == 2);
count = await db.createQuery('@mycoll/* | count').scalarInt(explainCallback: (log) {
log.contains('[INDEX] NO [COLLECTOR] PLAIN');
});
assert(count == 2);
// Del
await db.del('mycoll', 1);
error = null;
try {
await db.get('mycoll', 1);
} on EJDB2Error catch (e) {
error = e;
assert(e.notFound);
assert(e.message.contains('IWKV_ERROR_NOTFOUND'));
}
assert(error != null);
count = await db.createQuery('@mycoll/* | count').scalarInt();
assert(count == 1);
// Patch
await db.patch('mycoll', '[{"op":"add", "path":"/baz", "value":"qux"}]', 2);
json = await db.get('mycoll', 2);
assert(json == '{"foo":"baz","baz":"qux"}');
// DB Info
json = await db.info();
assert(json.contains('"collections":[{"name":"mycoll","dbid":3,"rnum":1,"indexes":[]}]'));
// Indexes
await db.ensureStringIndex('mycoll', '/foo', unique: true);
json = await db.info();
assert(json.contains('"indexes":[{"ptr":"/foo","mode":5,"idbf":0,"dbid":4,"rnum":1}]'));
// Test JQL set
JBDOC? doc = await db.createQuery('@mycoll/[foo=:?]').setString(0, 'baz').execute().first;
assert(doc.json == '{"foo":"baz","baz":"qux"}');
// Test explain log
await db.createQuery('@mycoll/[foo=:?]').setString(0, 'baz').execute(explainCallback: (log) {
assert(
log.contains("[INDEX] SELECTED UNIQUE|STR|1 /foo EXPR1: 'foo = :?' INIT: IWKV_CURSOR_EQ"));
});
doc = await db
.createQuery('@mycoll/[foo=:?] and /[baz=:?]')
.setString(0, 'baz')
.setString(1, 'qux')
.execute()
.first;
assert(doc.json == '{"foo":"baz","baz":"qux"}');
doc = await db
.createQuery('@mycoll/[foo=:foo] and /[baz=:baz]')
.setString('foo', 'baz')
.setString('baz', 'qux')
.execute()
.first;
doc = await db.createQuery('@mycoll/[foo re :?]').setRegExp(0, RegExp('.*')).execute().first;
assert(doc.json == '{"foo":"baz","baz":"qux"}');
doc = await db.createQuery('@mycoll/* | /foo').execute().first;
assert(doc.json == '{"foo":"baz"}');
await db.removeStringIndex('mycoll', '/foo', unique: true);
json = await db.info();
assert(json.contains('"collections":[{"name":"mycoll","dbid":3,"rnum":1,"indexes":[]}]'));
// Remove collection
await db.removeCollection('mycoll');
json = await db.info();
assert(json.contains('"collections":[]'));
// Check apply
await db.put(
'apply1', {'tx_hash': 'ed36cfd14a4fe29b16c511d68a8be89e42dcc6e4ced69d04f318448a2b8fafa0'});
doc = await db
.createQuery('/[tx_hash = :?] | apply :?', 'apply1')
.setString(0, 'ed36cfd14a4fe29b16c511d68a8be89e42dcc6e4ced69d04f318448a2b8fafa0')
.setJson(1, {'status': 'completed'}).firstRequired();
assert(doc.object['status'] == 'completed');
/// Test get limit
q = db.createQuery('@c1/* | limit 1');
assert(q.limit == 1);
q = db.createQuery('@c1/*');
assert(q.limit == 0);
id = await db.put('cc1', {'foo': 1});
await db.renameCollection('cc1', 'cc2');
json = await db.get('cc2', id);
assert(json == '{"foo":1}');
for (var i = 0; i < 10000; ++i) {
await db.put('cc1', {'name': 'v${i}'});
}
var cnt = 0;
await for (final _ in db.createQuery('@cc1/*').execute()) {
cnt++;
}
assert(cnt == 10000);
final ts0 = DateTime.now().millisecondsSinceEpoch;
final ts = await db.onlineBackup('hello-bkp.db');
assert(ts > ts0);
await db.close();
// Reopen backup image
final db2 = await EJDB2.open('hello-bkp.db', truncate: false);
doc = (await db2.createQuery('@cc1/*').first()).orNull;
assert(doc != null);
await db2.close();
}
+1
View File
@@ -0,0 +1 @@
1-nullsafety.1
+12
View File
@@ -0,0 +1,12 @@
local.properties
!*.iml
.classpath
!.project
.DS_Store
.dart_tool/
.packages
.pub/
build/
.flutter-plugins-dependencies
Podfile.lock
+10
View File
@@ -0,0 +1,10 @@
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled and should not be manually edited.
version:
revision: 68587a0916366e9512a78df22c44163d041dd5f3
channel: stable
project_type: plugin
+5
View File
@@ -0,0 +1,5 @@
## @EJDB2_FLUTTER_VERSION@
- Used new versioning scheme: {EJDB_VERSION}{BINDING_VERSION_NUMBER}
- Opted out null safety mode
+62
View File
@@ -0,0 +1,62 @@
file(READ ${CMAKE_CURRENT_SOURCE_DIR}/version.txt _VERSION)
set_property(GLOBAL PROPERTY EJDB2_FLUTTER_VERSION_PROPERTY
"${PROJECT_VERSION}${_VERSION}")
set(EJDB2_FLUTTER_VERSION "${PROJECT_VERSION}${_VERSION}")
file(
COPY .
DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
REGEX "(/\\.gradle)|(/node_modules)|(/build$)|(/libs)|(/jniLibs)" EXCLUDE
)
set(ANDROID_LIBS_DIR "${CMAKE_CURRENT_BINARY_DIR}/android/src/main/jniLibs")
set(PUB_PUBLISH_DIR "${CMAKE_CURRENT_BINARY_DIR}/pub_publish")
foreach (AABI IN ITEMS ${ANDROID_ABIS})
list(APPEND ANDROID_ABIS_LIBS "android_${AABI}")
endforeach()
add_custom_target(
ejdb2_flutter ALL
DEPENDS ${ANDROID_ABIS_LIBS}
COMMAND ${CMAKE_COMMAND} -E remove_directory ${ANDROID_LIBS_DIR}
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_BINARY_DIR}/../ejdb2_android/libs ${ANDROID_LIBS_DIR}
# Prepare pub publish dir:
COMMAND ${CMAKE_COMMAND} -E make_directory ${PUB_PUBLISH_DIR}
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/LICENSE ${PUB_PUBLISH_DIR}
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/README.md ${PUB_PUBLISH_DIR}
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/analysis_options.yaml ${PUB_PUBLISH_DIR}
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_BINARY_DIR}/lib ${PUB_PUBLISH_DIR}/lib
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_BINARY_DIR}/ios ${PUB_PUBLISH_DIR}/ios
COMMAND ${CMAKE_COMMAND} -E make_directory ${PUB_PUBLISH_DIR}/android
COMMAND ${CMAKE_COMMAND} -E make_directory ${PUB_PUBLISH_DIR}/android/src
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/android/gradlew* ${PUB_PUBLISH_DIR}/android
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/android/*.gradle ${PUB_PUBLISH_DIR}/android
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/android/gradle.properties ${PUB_PUBLISH_DIR}/android
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_BINARY_DIR}/android/src ${PUB_PUBLISH_DIR}/android/src
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_BINARY_DIR}/android/gradle ${PUB_PUBLISH_DIR}/android/gradle
COMMAND ${CMAKE_COMMAND} -E make_directory ${PUB_PUBLISH_DIR}/example
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_BINARY_DIR}/example/ios ${PUB_PUBLISH_DIR}/example/ios
COMMAND ${CMAKE_COMMAND} -E make_directory ${PUB_PUBLISH_DIR}/example/android
COMMAND ${CMAKE_COMMAND} -E make_directory ${PUB_PUBLISH_DIR}/example/android/app
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/example/*.md ${PUB_PUBLISH_DIR}/example
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/example/*.yaml ${PUB_PUBLISH_DIR}/example
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_BINARY_DIR}/example/lib ${PUB_PUBLISH_DIR}/example/lib
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_BINARY_DIR}/example/test_driver ${PUB_PUBLISH_DIR}/example/test_driver
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/example/android/*.gradle ${PUB_PUBLISH_DIR}/example/android
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/example/android/gradlew* ${PUB_PUBLISH_DIR}/example/android
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/example/android/gradle.properties ${PUB_PUBLISH_DIR}/example/android
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/example/android/app/*.gradle ${PUB_PUBLISH_DIR}/example/android/app
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_BINARY_DIR}/example/android/app/src ${PUB_PUBLISH_DIR}/example/android/app/src
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_BINARY_DIR}/example/android/gradle ${PUB_PUBLISH_DIR}/example/android/gradle
)
configure_file(pubspec.yaml.in ${PUB_PUBLISH_DIR}/pubspec.yaml @ONLY)
configure_file(CHANGELOG.md ${PUB_PUBLISH_DIR}/CHANGELOG.md @ONLY)
+21
View File
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2012-2021 Softmotions Ltd <info@softmotions.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+101
View File
@@ -0,0 +1,101 @@
# EJDB2 Flutter integration
Embeddable JSON Database engine http://ejdb.org Dart binding.
See https://github.com/Softmotions/ejdb/blob/master/README.md
For API usage examples take a look into [/example](https://github.com/Softmotions/ejdb/tree/master/src/bindings/ejdb2_flutter/example)
application.
## Example
pubspec.yaml
```yaml
dependencies:
ejdb2_flutter:
```
```dart
import 'package:ejdb2_flutter/ejdb2_flutter.dart';
var db = await EJDB2Builder('test.db').open();
var id = await db.put('parrots', {'name': 'Bianca', 'age': 4});
print('Bianca record: ${id}');
id = await db.put('parrots', {'name': 'Darko', 'age': 8});
print('Darko record: ${id}');
final q = db.createQuery('/[age > :age]', 'parrots');
await for (final doc in q.setInt('age', 3).execute()) {
print('Found ${doc}');
}
await db.close();
```
## Supported platforms
- iOS
- Android
## iOS notes
In order to build app with this binding you have
to add the following code into application `Podfile`:
```ruby
pre_install do |installer|
# workaround for https://github.com/CocoaPods/CocoaPods/issues/3289
Pod::Installer::Xcode::TargetValidator.send(:define_method, :verify_no_static_framework_transitive_dependencies) {}
end
```
## Android notes
For release builds you have to setup proguard rules as follows:
`build.gradle`
```
buildTypes {
...
release {
...
minifyEnabled true
useProguard true
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
}
}
```
`proguard-rules.pro`
```
...
# Keep EJDB
-keep class com.softmotions.ejdb2.** { *; }
```
## How build it manually
```sh
git clone https://github.com/Softmotions/ejdb.git
cd ./ejdb
mkdir ./build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release \
-DANDROID_NDK_HOME=<path to Android NDK> \
-DBUILD_FLUTTER_BINDING=ON
make
# Move generate to ejdb2 flutter pub package with example app
cd src/bindings/ejdb2_flutter/pub_publish
flutter pub get
cd ./example
# Start Android emulator
flutter run
```
@@ -0,0 +1,157 @@
analyzer:
errors:
native_function_body_in_non_sdk_code: ignore
strong-mode:
implicit-casts: false
implicit-dynamic: true
linter:
rules:
- always_declare_return_types
- always_put_required_named_parameters_first
- always_require_non_null_named_parameters
- annotate_overrides
- avoid_bool_literals_in_conditional_expressions
- avoid_catching_errors
- avoid_classes_with_only_static_members
- avoid_double_and_int_checks
- avoid_empty_else
- avoid_field_initializers_in_const_classes
- avoid_implementing_value_types
- avoid_init_to_null
- avoid_js_rounded_ints
- avoid_null_checks_in_equality_operators
- avoid_private_typedef_functions
- avoid_relative_lib_imports
- avoid_renaming_method_parameters
- avoid_return_types_on_setters
- avoid_returning_null
- avoid_returning_null_for_future
- avoid_returning_null_for_void
#- avoid_returning_this
- avoid_setters_without_getters
- avoid_shadowing_type_parameters
- avoid_single_cascade_in_expression_statements
- avoid_slow_async_io
- avoid_types_as_parameter_names
- avoid_unused_constructor_parameters
- camel_case_extensions
- camel_case_types
- cancel_subscriptions
- comment_references
- control_flow_in_finally
- curly_braces_in_flow_control_structures
- diagnostic_describe_all_properties
- directives_ordering
- empty_catches
- empty_constructor_bodies
- empty_statements
- file_names
- flutter_style_todos
- hash_and_equals
- implementation_imports
- invariant_booleans
- iterable_contains_unrelated_type
- join_return_with_assignment
- library_names
- list_remove_unrelated_type
- literal_only_boolean_expressions
- no_adjacent_strings_in_list
- no_duplicate_case_values
- null_closures
- one_member_abstracts
- only_throw_errors
- overridden_fields
- package_api_docs
- package_names
- package_prefixed_library_names
- prefer_adjacent_string_concatenation
- prefer_asserts_in_initializer_lists
- prefer_asserts_with_message
- prefer_collection_literals
- prefer_conditional_assignment
- prefer_const_constructors
- prefer_const_declarations
- prefer_const_literals_to_create_immutables
- prefer_constructors_over_static_methods
- prefer_contains
- prefer_equal_for_default_values
- prefer_expression_function_bodies
- prefer_final_fields
- prefer_final_in_for_each
- prefer_final_locals
- prefer_for_elements_to_map_fromIterable
- prefer_foreach
- prefer_function_declarations_over_variables
- prefer_generic_function_type_aliases
- prefer_if_null_operators
- prefer_initializing_formals
- prefer_inlined_adds
- prefer_interpolation_to_compose_strings
- prefer_is_empty
- prefer_is_not_empty
- prefer_iterable_whereType
- prefer_mixin
- prefer_null_aware_operators
- prefer_single_quotes
- prefer_spread_collections
- prefer_typing_uninitialized_variables
- prefer_void_to_null
- provide_deprecation_message
- recursive_getters
- slash_for_doc_comments
- sort_child_properties_last
- sort_constructors_first
- sort_pub_dependencies
- sort_unnamed_constructors_first
- test_types_in_equals
- throw_in_finally
- type_init_formals
- unawaited_futures
- unnecessary_await_in_return
- unnecessary_const
- unnecessary_getters_setters
- unnecessary_lambdas
- unnecessary_new
- unnecessary_null_aware_assignments
- unnecessary_null_in_if_null_operators
- unnecessary_overrides
- unnecessary_parenthesis
- unnecessary_statements
- unnecessary_this
- unrelated_type_equality_checks
- unsafe_html
- use_full_hex_values_for_flutter_colors
- use_rethrow_when_possible
- use_setters_to_change_properties
- use_string_buffers
- use_to_and_as_if_applicable
- valid_regexps
- void_checks
# - always_put_control_body_on_new_line
# - always_specify_types
# - avoid_annotating_with_dynamic
# - avoid_as
# - avoid_catches_without_on_clauses
# - avoid_equals_and_hash_code_on_mutable_classes
# - avoid_function_literals_in_foreach_calls
# - avoid_positional_boolean_parameters
# - avoid_print
# - avoid_types_on_closure_parameters
# - avoid_void_async
# - await_only_futures
# - cascade_invocations
# - close_sinks
# - constant_identifier_names
# - library_prefixes
# - lines_longer_than_80_chars
# - non_constant_identifier_names
# - omit_local_variable_types
# - parameter_assignments
# - prefer_const_constructors_in_immutables
# - prefer_double_quotes
# - prefer_if_elements_to_conditional_expressions
# - prefer_int_literals
# - public_member_api_docs
# - type_annotate_public_apis
# - unnecessary_brace_in_string_interps
# - use_function_type_syntax_for_parameters
@@ -0,0 +1,9 @@
!*.iml
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/build
/captures
/libs
@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>ejdb2_flutter</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.buildship.core.gradleprojectbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.buildship.core.gradleprojectnature</nature>
</natures>
<filteredResources>
<filter>
<id>1607244372293</id>
<name></name>
<type>30</type>
<matcher>
<id>org.eclipse.core.resources.regexFilterMatcher</id>
<arguments>node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
</matcher>
</filter>
</filteredResources>
</projectDescription>
@@ -0,0 +1,97 @@
import org.gradle.plugins.ide.eclipse.model.Library
group 'com.softmotions.ejdb2'
version '1.0'
apply plugin: 'com.android.library'
//apply plugin: "com.greensopinion.gradle-android-eclipse"
//apply plugin: 'eclipse'
sourceCompatibility = 1.8
ext {
flutterRoot = {
def flutterProperties = new Properties()
def flutterPropertiesFile = rootProject.file('local.properties')
if (!flutterPropertiesFile.exists()) {
throw new GradleException("Flutter properties file not found. Define a flutter.properties file in your project root.")
}
flutterPropertiesFile.withInputStream { stream ->
flutterProperties.load(stream)
}
def flutterRoot = flutterProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the flutter.properties file.")
}
return flutterRoot
}()
androidHome = {
if (System.env.ANDROID_HOME == null) {
throw new GradleException("Missing required ANDROID_HOME env variable");
}
return System.env.ANDROID_HOME;
}()
}
buildscript {
repositories {
google()
jcenter()
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.1'
//classpath "gradle.plugin.com.greensopinion.gradle-android-eclipse:gradle-android-eclipse:1.1"
}
}
rootProject.allprojects {
repositories {
google()
jcenter()
}
}
android {
compileSdkVersion 28
defaultConfig {
minSdkVersion 16
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
lintOptions {
disable 'InvalidPackage'
}
}
dependencies {
compile fileTree(dir: 'src/main/jniLibs', include: ['*.jar'])
}
// eclipse {
// classpath {
// plusConfigurations += [ configurations.compile, configurations.testCompile ]
// downloadSources = true
// file {
// whenMerged {
// def androidHome = project.ext.get('androidHome')
// def libAndroid = new Library(fileReference(file("$System.env.ANDROID_HOME/platforms/$project.android.compileSdkVersion/android.jar")));
// libAndroid.setSourcePath(fileReference(file("$System.env.ANDROID_HOME/sources/$project.android.compileSdkVersion")));
// // def flutterRoot = project.ext.get('flutterRoot')
// // def flutterLib = new Library(fileReference(file("$flutterRoot/bin/cache/artifacts/engine/android-x86/flutter.jar")))
// // flutterLib.setSourcePath(fileReference(file('/home/adam/Projects/tmp/engine/shell/platform/android')))
// // entries += [ libAndroid, flutterLib ]
// entries += [ libAndroid ]
// }
// }
// }
// }
@@ -0,0 +1,3 @@
org.gradle.jvmargs=-Xmx1024M
android.useAndroidX=true
android.enableJetifier=true
@@ -0,0 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
+160
View File
@@ -0,0 +1,160 @@
#!/usr/bin/env bash
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn ( ) {
echo "$*"
}
die ( ) {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
esac
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
+90
View File
@@ -0,0 +1,90 @@
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windowz variants
if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
goto execute
:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
@@ -0,0 +1 @@
rootProject.name = 'ejdb2_flutter'
@@ -0,0 +1,3 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.softmotions.ejdb2">
</manifest>
@@ -0,0 +1,576 @@
package com.softmotions.ejdb2;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executor;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import io.flutter.plugin.common.EventChannel;
import io.flutter.plugin.common.EventChannel.EventSink;
import io.flutter.plugin.common.EventChannel.StreamHandler;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;
import io.flutter.plugin.common.PluginRegistry.Registrar;
/**
* Ejdb2FlutterPlugin
*/
public final class Ejdb2FlutterPlugin implements MethodCallHandler, StreamHandler {
public static final String TAG = "Ejdb2FlutterPlugin";
@SuppressWarnings("StaticCollection")
static final Map<Integer, DbEntry> dbmap = new ConcurrentHashMap<>();
static final AtomicInteger dbkeys = new AtomicInteger();
static final Map<String, DbMethod> methods = new ConcurrentHashMap<>();
static final Executor executor = new ThreadPoolExecutor(0, 5, 60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
static {
methods.put("executeFirst", thread(Ejdb2FlutterPlugin::executeFirst));
methods.put("executeList", thread(Ejdb2FlutterPlugin::executeList));
methods.put("executeScalarInt", thread(Ejdb2FlutterPlugin::executeScalarInt));
methods.put("executeQuery", thread(Ejdb2FlutterPlugin::executeQuery));
methods.put("onlineBackup", thread(Ejdb2FlutterPlugin::onlineBackup));
methods.put("removeFloatIndex", thread(Ejdb2FlutterPlugin::removeFloatIndex));
methods.put("ensureFloatIndex", thread(Ejdb2FlutterPlugin::ensureFloatIndex));
methods.put("removeIntIndex", thread(Ejdb2FlutterPlugin::removeIntIndex));
methods.put("ensureIntIndex", thread(Ejdb2FlutterPlugin::ensureIntIndex));
methods.put("removeStringIndex", thread(Ejdb2FlutterPlugin::removeStringIndex));
methods.put("ensureStringIndex", thread(Ejdb2FlutterPlugin::ensureStringIndex));
methods.put("removeCollection", thread(Ejdb2FlutterPlugin::removeCollection));
methods.put("renameCollection", thread(Ejdb2FlutterPlugin::renameCollection));
methods.put("del", thread(Ejdb2FlutterPlugin::del));
methods.put("get", thread(Ejdb2FlutterPlugin::get));
methods.put("patch", thread(Ejdb2FlutterPlugin::patch));
methods.put("put", thread(Ejdb2FlutterPlugin::put));
methods.put("info", thread(Ejdb2FlutterPlugin::info));
methods.put("open", thread(Ejdb2FlutterPlugin::open));
methods.put("close", thread(Ejdb2FlutterPlugin::close));
}
Ejdb2FlutterPlugin(Registrar registrar) {
this.registrar = registrar;
this.methodChannel = new MethodChannel(registrar.messenger(), "ejdb2");
this.methodChannel.setMethodCallHandler(this);
this.eventChannel = new EventChannel(registrar.messenger(), "ejdb2/query");
this.eventChannel.setStreamHandler(this);
}
final Registrar registrar;
final MethodChannel methodChannel;
final EventChannel eventChannel;
EventSink events;
static Ejdb2FlutterPlugin plugin;
/**
* Plugin registration.
*/
public static void registerWith(Registrar registrar) {
plugin = new Ejdb2FlutterPlugin(registrar);
}
@Override
public void onMethodCall(MethodCall call, Result result) {
DbMethod method = methods.get(call.method);
if (method == null) {
result.notImplemented();
return;
}
@SuppressWarnings("unchecked")
Object[] args = ((List) call.arguments).toArray();
DbEntry dbe = null;
if (args[0] != null) {
dbe = dbmap.get(((Number) args[0]).intValue());
if (dbe == null) {
result.error("@ejdb", "Database handle already disposed", null);
return;
}
}
try {
method.handle(new DbMethodCall(this, dbe, args, result));
} catch (EJDB2Exception e) {
result.error("@ejdb IWRC:" + e.getCode(), e.getMessage(), null);
} catch (Exception e) {
Log.e(TAG, e.getMessage(), e);
result.error("@ejdb", e.toString(), null);
}
}
@Override
public void onListen(Object arguments, EventSink events) {
this.events = events;
}
@Override
public void onCancel(Object arguments) {
this.events = null;
}
private static void executeFirst(DbMethodCall mc) throws Exception {
executeListImpl(mc, 1L);
}
private static void executeList(DbMethodCall mc) throws Exception {
executeListImpl(mc, null);
}
private static void executeListImpl(DbMethodCall mc, Long limit) throws Exception {
prepareQuery(mc, (q, hook) -> {
if (limit != null) {
q.setLimit(limit);
}
final List<Object> res = new ArrayList<>((limit != null && limit < 1024) ? limit.intValue() : 64);
q.execute((id, json) -> {
res.add(id);
res.add(json);
return 1;
});
mc.successOnMainThread(res);
});
}
private static void executeScalarInt(DbMethodCall mc) throws Exception {
prepareQuery(mc, (q, hook) -> {
Long res = q.executeScalarInt();
mc.successOnMainThread(res);
});
}
private static void executeQuery(DbMethodCall mc) throws Exception {
prepareQuery(mc, (q, hook) -> {
final AtomicReference<List<Object>> holder = new AtomicReference<>(new ArrayList<>());
q.execute((id, json) -> {
List<Object> batch = holder.get();
if (batch.size() >= 128 && batch.size() % 2 == 0) {
EventSink sink = mc.plugin.events;
if (sink != null) {
List<Object> res = batch;
res.add(0, hook);
mc.runOnMainThread(() -> sink.success(res));
}
batch = new ArrayList<>();
holder.set(batch);
}
batch.add(id);
batch.add(json);
return 1;
});
// Flush rest of records
List<Object> batch = holder.get();
batch.add(0, hook);
batch.add(true);
holder.set(null);
EventSink esink = mc.plugin.events;
if (esink != null) {
mc.runOnMainThread(() -> esink.success(batch));
}
});
}
private static void prepareQuery(DbMethodCall mc, DbQueryHandler qh) throws Exception {
final String hook = cast(mc.args[1]);
final String coll = cast(mc.args[2]);
final String qtext = asString(mc.args[3], "");
final Map<String, Object> qspec = cast(mc.args[4]);
final List<List<Object>> params = cast(mc.args[5]);
final EJDB2 db = mc.getDb();
final JQL q = db.createQuery(qtext, coll);
try {
for (Map.Entry<String, Object> entry : qspec.entrySet()) {
String key = entry.getKey();
switch (key) {
case "l": // limit
q.setLimit(asLong(entry.getValue(), 0));
break;
case "s": // skip
q.setSkip(asLong(entry.getValue(), 0));
break;
}
}
for (List<Object> pslot : params) {
int type = asInt(pslot.get(0), 0);
Object plh = pslot.get(1);
Object val = pslot.get(2);
if (type == 0 || val == null) {
if (plh instanceof Number) {
q.setNull(((Number) plh).intValue());
} else {
q.setNull((String) plh);
}
} else {
switch (type) {
case 1: // String
if (plh instanceof Number) {
q.setString(((Number) plh).intValue(), asString(val, null));
} else {
q.setString((String) plh, asString(val, null));
}
break;
case 2: // Long
if (plh instanceof Number) {
q.setLong(((Number) plh).intValue(), asLong(val, 0));
} else {
q.setLong((String) plh, asLong(val, 0));
}
break;
case 3: // Double
if (plh instanceof Number) {
q.setDouble(((Number) plh).intValue(), asDouble(val, 0));
} else {
q.setDouble((String) plh, asDouble(val, 0));
}
break;
case 4: // Boolean
if (plh instanceof Number) {
q.setBoolean(((Number) plh).intValue(), asBoolean(val, false));
} else {
q.setBoolean((String) plh, asBoolean(val, false));
}
break;
case 5: // Regexp
if (plh instanceof Number) {
q.setRegexp(((Number) plh).intValue(), asString(val, null));
} else {
q.setRegexp((String) plh, asString(val, null));
}
break;
case 6: // JSON
if (plh instanceof Number) {
q.setJSON(((Number) plh).intValue(), asString(val, null));
} else {
q.setJSON((String) plh, asString(val, null));
}
break;
}
}
}
qh.handle(q, hook);
} finally {
q.close();
}
}
private static void onlineBackup(DbMethodCall mc) {
String targetFile = asString(mc.args[1], null);
Log.w(TAG, "Online backup into: " + targetFile);
mc.successOnMainThread(mc.getDb().onlineBackup(targetFile));
}
private static void removeFloatIndex(DbMethodCall mc) {
String coll = asString(mc.args[1], null);
String path = asString(mc.args[2], null);
boolean unique = asBoolean(mc.args[3], false);
mc.getDb().removeFloatIndex(coll, path, unique);
mc.successOnMainThread(null);
}
private static void ensureFloatIndex(DbMethodCall mc) {
String coll = asString(mc.args[1], null);
String path = asString(mc.args[2], null);
boolean unique = asBoolean(mc.args[3], false);
mc.getDb().ensureFloatIndex(coll, path, unique);
mc.successOnMainThread(null);
}
private static void removeIntIndex(DbMethodCall mc) {
String coll = asString(mc.args[1], null);
String path = asString(mc.args[2], null);
boolean unique = asBoolean(mc.args[3], false);
mc.getDb().removeIntIndex(coll, path, unique);
mc.successOnMainThread(null);
}
private static void ensureIntIndex(DbMethodCall mc) {
String coll = asString(mc.args[1], null);
String path = asString(mc.args[2], null);
boolean unique = asBoolean(mc.args[3], false);
mc.getDb().ensureIntIndex(coll, path, unique);
mc.successOnMainThread(null);
}
private static void removeStringIndex(DbMethodCall mc) {
String coll = asString(mc.args[1], null);
String path = asString(mc.args[2], null);
boolean unique = asBoolean(mc.args[3], false);
mc.getDb().removeStringIndex(coll, path, unique);
mc.successOnMainThread(null);
}
private static void ensureStringIndex(DbMethodCall mc) {
String coll = asString(mc.args[1], null);
String path = asString(mc.args[2], null);
boolean unique = asBoolean(mc.args[3], false);
mc.getDb().ensureStringIndex(coll, path, unique);
mc.successOnMainThread(null);
}
private static void removeCollection(DbMethodCall mc) {
String coll = asString(mc.args[1], null);
mc.getDb().removeCollection(coll);
mc.successOnMainThread(null);
}
private static void renameCollection(DbMethodCall mc) {
String oldName = asString(mc.args[1], null);
String newName = asString(mc.args[2], null);
mc.getDb().renameCollection(oldName, newName);
mc.successOnMainThread(null);
}
private static void del(DbMethodCall mc) {
String coll = asString(mc.args[1], null);
long id = asLong(mc.args[2], 0);
mc.getDb().del(coll, id);
mc.successOnMainThread(null);
}
private static void get(DbMethodCall mc) throws Exception {
String coll = asString(mc.args[1], null);
long id = asLong(mc.args[2], 0);
mc.successOnMainThread(mc.getDb().getAsString(coll, id));
}
private static void patch(DbMethodCall mc) {
String coll = asString(mc.args[1], null);
String json = asString(mc.args[2], null);
long id = asLong(mc.args[3], 0);
boolean upsert = asBoolean(mc.args[4], false);
if (upsert) {
mc.getDb().patchOrPut(coll, json, id);
} else {
mc.getDb().patch(coll, json, id);
}
mc.successOnMainThread(null);
}
private static void put(DbMethodCall mc) {
String coll = asString(mc.args[1], null);
String json = asString(mc.args[2], null);
long id = asLong(mc.args[3], 0);
mc.successOnMainThread(mc.getDb().put(coll, json, id));
}
private static void info(DbMethodCall mc) throws Exception {
mc.successOnMainThread(mc.dbe.db.infoAsString());
}
private static void open(DbMethodCall mc) {
synchronized (mc.plugin) {
String path = normalizePath(mc.getAppContext(), (String) mc.args[1]);
DbEntry dbe = null;
for (DbEntry v : dbmap.values()) {
if (v.path.equals(path)) {
dbe = v;
break;
}
}
if (dbe != null) {
dbe.countOpen();
mc.successOnMainThread(dbe.handle);
return;
}
Map<String, Object> opts = cast(mc.args[2]);
EJDB2Builder b = new EJDB2Builder(path);
if (asBoolean(opts.get("readonly"), false)) {
b.readonly();
}
if (asBoolean(opts.get("truncate"), false)) {
b.truncate();
}
if (asBoolean(opts.get("wal_enabled"), true)) {
b.withWAL();
}
b.walCRCOnCheckpoint(asBoolean(opts.get("wal_check_crc_on_checkpoint"), false));
if (opts.containsKey("wal_checkpoint_buffer_sz")) {
b.walCheckpointBufferSize(asInt(opts.get("wal_checkpoint_buffer_sz"), 0));
}
if (opts.containsKey("wal_checkpoint_timeout_sec")) {
b.walCheckpointTimeoutSec(asInt(opts.get("wal_checkpoint_timeout_sec"), 0));
}
if (opts.containsKey("wal_savepoint_timeout_sec")) {
b.walSavepointTimeoutSec(asInt(opts.get("wal_savepoint_timeout_sec"), 0));
}
if (opts.containsKey("wal_wal_buffer_sz")) {
b.walBufferSize(asInt(opts.get("wal_wal_buffer_sz"), 0));
}
if (opts.containsKey("document_buffer_sz")) {
b.documentBufferSize(asInt(opts.get("document_buffer_sz"), 0));
}
if (opts.containsKey("sort_buffer_sz")) {
b.sortBufferSize(asInt(opts.get("sort_buffer_sz"), 0));
}
final Integer handle = dbkeys.incrementAndGet();
dbmap.put(handle, new DbEntry(b.open(), handle, path));
mc.successOnMainThread(handle);
}
}
private static void close(DbMethodCall mc) {
synchronized (mc.plugin) {
if (mc.dbe.close()) {
dbmap.remove(mc.dbe.handle);
}
}
mc.successOnMainThread(null);
}
@SuppressWarnings("unchecked")
private static <T> T cast(Object obj) {
return (T) obj;
}
private static boolean asBoolean(Object obj, boolean dv) {
if (obj instanceof Boolean) {
return ((Boolean) obj).booleanValue();
} else {
return obj != null ? Boolean.parseBoolean(obj.toString()) : dv;
}
}
private static int asInt(Object obj, int dv) {
if (obj instanceof Number) {
return ((Number) obj).intValue();
} else {
return obj != null ? Integer.parseInt(obj.toString()) : dv;
}
}
private static long asLong(Object obj, long dv) {
if (obj instanceof Number) {
return ((Number) obj).longValue();
} else {
return obj != null ? Long.parseLong(obj.toString()) : dv;
}
}
private static double asDouble(Object obj, double dv) {
if (obj instanceof Number) {
return ((Number) obj).doubleValue();
} else {
return obj != null ? Double.parseDouble(obj.toString()) : dv;
}
}
private static String asString(Object obj, String dv) {
return obj != null ? obj.toString() : dv;
}
private static String normalizePath(Context ctx, String path) {
return ctx.getDatabasePath(path).getAbsolutePath();
}
private static DbMethod thread(DbMethod dbm) {
return mc -> executor.execute(() -> {
try {
dbm.handle(mc);
} catch (EJDB2Exception e) {
mc.errorOnMainThread("@ejdb IWRC:" + e.getCode(), e.getMessage(), null);
} catch (Exception e) {
Log.e(TAG, e.getMessage(), e);
mc.errorOnMainThread("@ejdb", e.toString(), null);
}
});
}
private static final class DbMethodCall {
private DbMethodCall(Ejdb2FlutterPlugin plugin, DbEntry dbe, Object[] args, Result result) {
this.plugin = plugin;
this.dbe = dbe;
this.args = args;
this.result = result;
}
private final Ejdb2FlutterPlugin plugin;
private final DbEntry dbe;
private final Object[] args;
private final Result result;
private EJDB2 getDb() {
return dbe.db;
}
private Context getAppContext() {
return plugin.registrar.context();
}
private Activity getActivity() {
return plugin.registrar.activity();
}
private boolean runOnMainThread(Runnable action) {
Activity activity = getActivity();
if (activity != null) {
activity.runOnUiThread(action);
return true;
} else {
action.run();
}
return false;
}
private void successOnMainThread(Object val) {
runOnMainThread(() -> result.success(val));
}
private void errorOnMainThread(String errorCode, String errorMessage, Object errorDetails) {
runOnMainThread(() -> result.error(errorCode, errorMessage, errorDetails));
}
}
private static final class DbEntry {
DbEntry(EJDB2 db, Integer handle, String path) {
this.db = db;
this.counter = new AtomicInteger(1);
this.path = path;
this.handle = handle;
}
private final EJDB2 db;
private final AtomicInteger counter;
private final String path;
private final Integer handle;
void countOpen() {
this.counter.incrementAndGet();
}
boolean close() {
int cnt = this.counter.decrementAndGet();
if (cnt <= 0) {
db.close();
}
return cnt <= 0;
}
}
private interface DbMethod {
void handle(DbMethodCall mc) throws Exception;
}
private interface DbQueryHandler {
void handle(JQL q, String hook) throws Exception;
}
}
@@ -0,0 +1,75 @@
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/
# IntelliJ related
*.iml
*.ipr
*.iws
.idea/
# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/
# Flutter/Dart/Pub related
**/doc/api/
.dart_tool/
.flutter-plugins
.packages
.pub-cache/
.pub/
/build/
# Android related
# **/android/**/gradle-wrapper.jar
# **/android/gradlew.bat
# **/android/gradlew
**/android/.gradle
**/android/captures/
**/android/local.properties
**/android/**/GeneratedPluginRegistrant.java
# iOS/XCode related
**/ios/**/*.mode1v3
**/ios/**/*.mode2v3
**/ios/**/*.moved-aside
**/ios/**/*.pbxuser
**/ios/**/*.perspectivev3
**/ios/**/*sync/
**/ios/**/.sconsign.dblite
**/ios/**/.tags*
**/ios/**/.vagrant/
**/ios/**/DerivedData/
**/ios/**/Icon?
**/ios/**/Pods/
**/ios/**/.symlinks/
**/ios/**/profile
**/ios/**/xcuserdata
**/ios/.generated/
**/ios/Flutter/App.framework
**/ios/Flutter/Flutter.framework
**/ios/Flutter/Generated.xcconfig
**/ios/Flutter/app.flx
**/ios/Flutter/app.zip
**/ios/Flutter/flutter_assets/
**/ios/Flutter/flutter_export_environment.sh
**/ios/ServiceDefinitions.json
**/ios/Runner/GeneratedPluginRegistrant.*
# Exceptions to above rules.
!**/ios/**/default.mode1v3
!**/ios/**/default.mode2v3
!**/ios/**/default.pbxuser
!**/ios/**/default.perspectivev3
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
!*.iml
@@ -0,0 +1,10 @@
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled and should not be manually edited.
version:
revision: 68587a0916366e9512a78df22c44163d041dd5f3
channel: stable
project_type: app
@@ -0,0 +1,16 @@
# ejdb2_example
Demonstrates how to use the ejdb2 plugin.
## Getting Started
This project is a starting point for a Flutter application.
A few resources to get you started if this is your first Flutter project:
- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab)
- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook)
For help getting started with Flutter, view our
[online documentation](https://flutter.dev/docs), which offers tutorials,
samples, guidance on mobile development, and a full API reference.
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>android</name>
<comment>Project android created by Buildship.</comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.buildship.core.gradleprojectbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.buildship.core.gradleprojectnature</nature>
</natures>
</projectDescription>

Some files were not shown because too many files have changed in this diff Show More