mirror of
https://github.com/openharmony/third_party_ejdb.git
synced 2026-07-01 22:54:24 -04:00
@@ -0,0 +1,157 @@
|
||||
# EJDB 2.0
|
||||
|
||||
[](https://tlg.name/ejdb2)
|
||||
[](https://github.com/Softmotions/ejdb/blob/master/LICENSE)
|
||||

|
||||
|
||||
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)**
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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
@@ -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()
|
||||
@@ -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
|
||||
@@ -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.
|
||||
@@ -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/)
|
||||
+50
@@ -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
|
||||
```
|
||||
@@ -0,0 +1,3 @@
|
||||
analyzer:
|
||||
exclude:
|
||||
- build/**
|
||||
@@ -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")
|
||||
@@ -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}")
|
||||
@@ -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()
|
||||
@@ -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}")
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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}
|
||||
)
|
||||
@@ -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})
|
||||
@@ -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)
|
||||
@@ -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()
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
@@ -0,0 +1,5 @@
|
||||
#include <stdlib.h>
|
||||
int main(int argc, char **argv) {
|
||||
qsort_r(0, 0, 0, 0, 0);
|
||||
return 0;
|
||||
}
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
|
||||
|
||||
Executable
+78
@@ -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())
|
||||
@@ -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"]
|
||||
@@ -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
|
||||
```
|
||||
@@ -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"]
|
||||
|
||||
|
||||
|
||||
|
||||
Executable
+117
@@ -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
|
||||
Executable
+76
@@ -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
|
||||
Executable
+62
@@ -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
|
||||
Executable
+202
@@ -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
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
if (BUILD_JNI_BINDING)
|
||||
add_subdirectory(jni)
|
||||
else()
|
||||
add_subdirectory(core)
|
||||
endif()
|
||||
@@ -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 ()
|
||||
@@ -0,0 +1,5 @@
|
||||
[ppa]
|
||||
fqdn = ppa.launchpad.net
|
||||
method = sftp
|
||||
login = @PROJECT_PPA_USER@
|
||||
incoming = ~%(ppa)s/ubuntu/@DPUT_DIST@
|
||||
@@ -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)
|
||||
@@ -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
@@ -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)
|
||||
@@ -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
@@ -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.
|
||||
@@ -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.
|
||||
Executable
+22
@@ -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
@@ -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
|
||||
|
||||
|
||||
@@ -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}")
|
||||
@@ -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 ()
|
||||
@@ -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
|
||||
@@ -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"
|
||||
}
|
||||
+189
@@ -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
@@ -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
@@ -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'
|
||||
@@ -0,0 +1 @@
|
||||
!/.packages
|
||||
@@ -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/
|
||||
@@ -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}
|
||||
@@ -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)
|
||||
@@ -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.
|
||||
@@ -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
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
@@ -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();
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
1-nullsafety.1
|
||||
@@ -0,0 +1,12 @@
|
||||
local.properties
|
||||
!*.iml
|
||||
.classpath
|
||||
!.project
|
||||
.DS_Store
|
||||
.dart_tool/
|
||||
.packages
|
||||
.pub/
|
||||
build/
|
||||
.flutter-plugins-dependencies
|
||||
Podfile.lock
|
||||
|
||||
@@ -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
|
||||
@@ -0,0 +1,5 @@
|
||||
## @EJDB2_FLUTTER_VERSION@
|
||||
|
||||
- Used new versioning scheme: {EJDB_VERSION}{BINDING_VERSION_NUMBER}
|
||||
- Opted out null safety mode
|
||||
|
||||
@@ -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)
|
||||
@@ -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.
|
||||
@@ -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
|
||||
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
|
||||
+160
@@ -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
@@ -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>
|
||||
+576
@@ -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
Reference in New Issue
Block a user