replaced store binding with a database binding based on a berkeley db
authorLoïc Collignon <loic.collignon@iot.bzh>
Tue, 24 Oct 2017 11:34:38 +0000 (13:34 +0200)
committerLoïc Collignon <loic.collignon@iot.bzh>
Tue, 24 Oct 2017 11:34:38 +0000 (13:34 +0200)
Change-Id: I03978ecbf996ebc6d53a88dfd2b275051080016f
Signed-off-by: Loïc Collignon <loic.collignon@iot.bzh>
68 files changed:
ll-database-binding/.gitmodules [new file with mode: 0644]
ll-database-binding/CMakeLists.txt [new file with mode: 0644]
ll-database-binding/README.md [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/.gitignore [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/.gitreview [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/LICENSE [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/README.md [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/book.json [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/cmake/cmake.d/01-build_options.cmake [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/cmake/cmake.d/02-variables.cmake [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/cmake/cmake.d/03-macros.cmake [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/cmake/cmake.d/04-extra_targets.cmake [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/cmake/common.cmake [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/cmake/configure_file.cmake [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/cmake/export.map [moved from ll-store-binding/src/export.map with 100% similarity]
ll-database-binding/conf.d/app-templates/docs/0-Doc-Revisions.md [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/docs/README.md [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/docs/SUMMARY.md [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/docs/_layouts/ebook/page.html [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/docs/_layouts/ebook/pdf_footer.html [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/docs/_layouts/ebook/pdf_header.html [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/docs/_layouts/ebook/summary.html [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/docs/_layouts/layout.html [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/docs/cover.jpg [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/docs/cover_small.jpg [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/docs/dev_guide/0_Abstract.md [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/docs/dev_guide/1_Quickstart.md [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/docs/dev_guide/2_project_architecture.md [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/docs/dev_guide/3_advanced_usage.md [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/docs/dev_guide/4_advanced_customization.md [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/docs/dev_guide/5_autobuild.md [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/docs/dev_guide/pictures/iotbzh_logo_small.png [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/docs/resources/cover.svg [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/docs/resources/ebook.css [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/docs/resources/make_cover.sh [new file with mode: 0755]
ll-database-binding/conf.d/app-templates/gendocs.sh [new file with mode: 0755]
ll-database-binding/conf.d/app-templates/samples.d/CMakeLists.txt.sample [moved from ll-store-binding/CMakeLists.txt with 90% similarity]
ll-database-binding/conf.d/app-templates/samples.d/config.cmake.sample [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/samples.d/config.xml.in.sample [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/samples.d/xds-config.env.sample [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/template.d/config.xml.in [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/template.d/deb-config.dsc.in [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/template.d/deb-config.install.in [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/template.d/debian.changelog.in [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/template.d/debian.compat.in [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/template.d/debian.control.in [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/template.d/debian.rules.in [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/template.d/gdb-on-target.ini.in [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/template.d/install-wgt-on-target.sh.in [new file with mode: 0755]
ll-database-binding/conf.d/app-templates/template.d/rpm-config.spec.in [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/template.d/start-on-target.sh.in [new file with mode: 0755]
ll-database-binding/conf.d/app-templates/template.d/xds-project-target.conf.in [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/wgt/icon-default.png [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/wgt/icon-html5.png [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/wgt/icon-native.png [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/wgt/icon-qml.png [new file with mode: 0644]
ll-database-binding/conf.d/app-templates/wgt/icon-service.png [new file with mode: 0644]
ll-database-binding/conf.d/cmake/FindBerkeleyDB.cmake [new file with mode: 0644]
ll-database-binding/conf.d/cmake/config.cmake [moved from ll-store-binding/conf.d/cmake/config.cmake with 55% similarity]
ll-database-binding/src/.ll-database-binding.c.swp [new file with mode: 0644]
ll-database-binding/src/CMakeLists.txt [new file with mode: 0644]
ll-database-binding/src/export.map [new file with mode: 0644]
ll-database-binding/src/ll-database-binding.c [new file with mode: 0644]
ll-database-binding/src/utils.h [new file with mode: 0644]
ll-store-binding/src/CMakeLists.txt [deleted file]
ll-store-binding/src/ll-store-binding.c [deleted file]
ll-store-binding/start.sh [deleted file]
ll-store-binding/store.sh [deleted file]

diff --git a/ll-database-binding/.gitmodules b/ll-database-binding/.gitmodules
new file mode 100644 (file)
index 0000000..e07cae1
--- /dev/null
@@ -0,0 +1,3 @@
+[submodule "conf.d/app-templates"]
+       path = conf.d/app-templates
+       url = https://gerrit.automotivelinux.org/gerrit/p/apps/app-templates.git
diff --git a/ll-database-binding/CMakeLists.txt b/ll-database-binding/CMakeLists.txt
new file mode 100644 (file)
index 0000000..5e276f6
--- /dev/null
@@ -0,0 +1,21 @@
+###########################################################################
+# Copyright 2017 IoT.bzh
+#
+# author: Loïc Collignon <loic.collignon@iot.bzh>
+#
+# 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 applicabfile:///home/agl/projects/identity/hl-identity-binding/conf.d/app-templates/samples.d/CMakeLists.txt.samplele 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.
+###########################################################################
+
+cmake_minimum_required(VERSION 3.6)
+SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/conf.d/cmake/)
+include(${CMAKE_CURRENT_SOURCE_DIR}/conf.d/cmake/config.cmake)
diff --git a/ll-database-binding/README.md b/ll-database-binding/README.md
new file mode 100644 (file)
index 0000000..fb420dc
--- /dev/null
@@ -0,0 +1,38 @@
+
+# Database Binding
+This binding provide a database API with key/value semantics.
+The backend is currently a Berkeley DB.
+
+## Verbs
+* **insert**:
+       This verb insert a key/value pair in the database.
+       If the key already exist, the verb fails.
+       
+* **update**:
+       This verb update an existing record.
+       If the key doesn't exist, the verb fails.
+       
+* **delete**:
+       This verb remove an existing key/value pair from the database.
+       If no matching record is found, the verb fails.
+
+* **read**:
+       This verb get the value associated with the specified key.
+       If no matching record is found, the verb fails.
+
+## Arguments
+* The **read** and **delete** verbs need only a **key** to work:
+```
+{
+       "key": "mykey"
+}
+```
+
+* The **insert** and **update** verbs need a **key** and a **value** to work:
+```
+{
+       "key": "mykey",
+       "value": "my value"
+}
+```
+The **value** can be any valid json.
diff --git a/ll-database-binding/conf.d/app-templates/.gitignore b/ll-database-binding/conf.d/app-templates/.gitignore
new file mode 100644 (file)
index 0000000..507c195
--- /dev/null
@@ -0,0 +1,12 @@
+build/
+bower_components/
+node_modules/
+dist.prod/
+CMakeCache.txt
+Makefile
+*.so
+nbproject
+.vscode
+*.tar.gz
+.*.sw*
+_book
diff --git a/ll-database-binding/conf.d/app-templates/.gitreview b/ll-database-binding/conf.d/app-templates/.gitreview
new file mode 100644 (file)
index 0000000..c22e5d1
--- /dev/null
@@ -0,0 +1,5 @@
+[gerrit]
+host=gerrit.automotivelinux.org
+port=29418
+project=apps/app-templates
+defaultbranch=master
diff --git a/ll-database-binding/conf.d/app-templates/LICENSE b/ll-database-binding/conf.d/app-templates/LICENSE
new file mode 100644 (file)
index 0000000..93b07d3
--- /dev/null
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright 2017 claneys
+
+   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.
diff --git a/ll-database-binding/conf.d/app-templates/README.md b/ll-database-binding/conf.d/app-templates/README.md
new file mode 100644 (file)
index 0000000..eca9349
--- /dev/null
@@ -0,0 +1,403 @@
+# AGL CMake template
+
+Files used to build an application, or binding, project with the
+AGL Application Framework.
+
+To build your AGL project using these templates, you have to install
+them within your project and adjust compilation option in `config.cmake`.
+For technical reasons, you also have to specify **cmake** target in
+sub CMakeLists.txt installed. Make a globbing search to find source files
+isn't recommended now to handle project build especially in a multiuser
+project because CMake will not be aware of new or removed source files.
+
+You'll find usage samples here:
+
+- [helloworld-service](https://github.com/iotbzh/helloworld-service)
+- [low-level-can-service](https://gerrit.automotivelinux.org/gerrit/apps/low-level-can-service)
+- [high-level-viwi-service](https://github.com/iotbzh/high-level-viwi-service)
+- [audio-binding](https://github.com/iotbzh/audio-binding)
+- [unicens2-binding](https://github.com/iotbzh/unicens2-binding)
+
+## Quickstart
+
+### Initialization
+
+To use these templates files on your project just install the reference files using
+**git submodule** then use `config.cmake` file to configure your project specificities :
+
+```bash
+git submodule add https://gerrit.automotivelinux.org/gerrit/p/apps/app-templates.git conf.d/app-templates
+mkdir conf.d/cmake
+cp conf.d/app-templates/cmake/config.cmake.sample conf.d/cmake/config.cmake
+```
+
+Edit the copied config.cmake file to fit your needs.
+
+Now, create your top CMakeLists.txt file which include `config.cmake` file.
+
+An example is available in **app-templates** submodule that you can copy and
+use:
+
+```bash
+cp conf.d/app-templates/cmake/CMakeLists.txt.sample CMakeLists.txt
+```
+
+### Create your CMake targets
+
+For each target part of your project, you need to use ***PROJECT_TARGET_ADD***
+to include this target to your project.
+
+Using it, make available the cmake variable ***TARGET_NAME*** until the next
+***PROJECT_TARGET_ADD*** is invoked with a new target name.
+
+So, typical usage defining a target is:
+
+```cmake
+PROJECT_TARGET_ADD(SuperExampleName) --> Adding target to your project
+
+add_executable/add_library(${TARGET_NAME}.... --> defining your target sources
+
+SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES.... --> fit target properties
+for macros usage
+```
+
+### Targets PROPERTIES
+
+You should set properties on your targets that will be used to package your
+apps in a widget file that could be installed on an AGL system.
+
+Specify what is the type of your targets that you want to be included in the
+widget package with the property **LABELS**:
+
+Choose between:
+
+- **BINDING**: Shared library that be loaded by the AGL Application Framework
+- **BINDINGV2**: Shared library that be loaded by the AGL Application Framework.
+ This has to be accompagnied with a JSON file named like the *${OUTPUT_NAME}-apidef* of
+ the target that describe the API with OpenAPI syntax (e.g: *mybinding-apidef*).
+ Or you can choose the name by setting the *CACHE* cmake variable *OPENAPI_DEF*
+ (***CAUTION***: setting a CACHE variable is needed, or set a normal variable
+ with the *PARENT_SCOPE* option to make it visible for the parent scope
+ where the target is defined) JSON file will be used to generate header file
+ using `afb-genskel` tool.
+- **HTDOCS**: Root directory of a web app. This target has to build its
+ directory and puts its files in the ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}
+- **DATA**: Resources used by your application. This target has to build its
+ directory and puts its files in the ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}
+- **EXECUTABLE**: Entry point of your application executed by the AGL
+ Application Framework
+
+> **TIP** you should use the prefix _afb-_ with your **BINDING* targets which
+> stand for **Application Framework Binding**.
+
+```cmake
+SET_TARGET_PROPERTIES(${TARGET_NAME}
+       PREFIX "afb-"
+       LABELS "BINDING"
+       OUTPUT_NAME "file_output_name"
+)
+```
+
+> **NOTE**: You doesn't need to specify an **INSTALL** command for these
+> targets. This is already handle by template and will be installed in the
+> following path : **${CMAKE_INSTALL_PREFIX}/${PROJECT_NAME}**
+
+## More details: Typical project architecture
+
+A typical project architecture would be :
+
+```tree
+<project-root-path>
+│
+├── conf.d/
+│   ├── autobuild/
+│   │   ├── agl
+│   │   │   └── autobuild
+│   │   ├── linux
+│   │   │   └── autobuild
+│   │   └── windows
+│   │       └── autobuild
+│   ├── app-templates/
+│   │   ├── README.md
+│   │   ├── autobuild/
+│   │   │   ├── agl
+│   │   │   │   └── autobuild.in
+│   │   │   ├── linux
+│   │   │   │   └── autobuild.in
+│   │   │   └── windows
+│   │   │       └── autobuild.in
+│   │   ├── cmake/
+│   │   │   ├── config.cmake.sample
+│   │   │   ├── export.map
+│   │   │   └── macros.cmake
+│   │   ├── deb/
+│   │   │   └── config.deb.in
+│   │   ├── rpm/
+│   │   │   └── config.spec.in
+│   │   └── wgt/
+│   │       ├── config.xml.in
+│   │       ├── config.xml.in.sample
+│   │       ├── icon-default.png
+│   │       ├── icon-html5.png
+│   │       ├── icon-native.png
+│   │       ├── icon-qml.png
+│   │       └── icon-service.png
+│   ├── packaging/
+│   │   ├── config.spec
+│   │   └── config.deb
+│   ├── cmake
+│   │   └── config.cmake
+│   └── wgt
+│      └── config.xml.in
+├── <libs>
+├── <target>
+│   └── <files>
+├── <target>
+│   └── <file>
+└── <target>
+    └── <files>
+```
+
+| # | Parent | Description |
+| - | -------| ----------- |
+| \<root-path\> | - | Path to your project. Hold master CMakeLists.txt and general files of your projects. |
+| conf.d | \<root-path\> | Holds needed files to build, install, debug, package an AGL app project |
+| app-templates | conf.d | Git submodule to app-templates AGL repository which provides CMake helpers macros library, and build scripts. config.cmake is a copy of config.cmake.sample configured for the projects. SHOULD NOT BE MODIFIED MANUALLY !|
+| autobuild | conf.d | Scripts generated from app-templates to build packages the same way for differents platforms.|
+| cmake | conf.d | Contains at least config.cmake file modified from the sample provided in app-templates submodule. |
+| wgt | conf.d | Contains at least config.xml.in template file modified from the sample provided in app-templates submodule for the needs of project (See config.xml.in.sample file for more details). |
+| packaging | conf.d | Contains output files used to build packages. |
+| \<libs\> | \<root-path\> | External dependencies libraries. This isn't to be used to include header file but build and link statically specifics libraries. | Library sources files. Can be a decompressed library archive file or project fork. |
+| \<target\> | \<root-path\> | A target to build, typically library, executable, etc. |
+
+### Update app-templates submodule
+
+You may have some news bug fixes or features available from app-templates
+repository that you want. To update your submodule proceed like the following:
+
+```bash
+git submodule update --remote
+git commit -s conf.d/app-templates
+```
+
+This will update the submodule to the HEAD of master branch repository.
+
+You could just want to update at a specified repository tag or branch or commit
+, here are the method to do so:
+
+```bash
+cd conf.d/app-templates
+# Choose one of the following depending what you want
+git checkout <tag_name>
+git checkout --detach <branch_name>
+git checkout --detach <commit_id>
+# Then commit
+cd ../..
+git commit -s conf.d/app-templates
+```
+
+### Build a widget
+
+#### config.xml.in file
+
+To build a widget you need a _config.xml_ file describing what is your apps and
+how Application Framework would launch it. This repo provide a simple default
+file _config.xml.in_ that should work for simple application without
+interactions with others bindings.
+
+It is recommanded that you use the sample one which is more complete. You can
+find it at the same location under the name _config.xml.in.sample_ (stunning
+isn't it). Just copy the sample file to your _conf.d/wgt_ directory and name it
+_config.xml.in_, then edit it to fit your needs.
+
+> ***CAUTION*** : The default file is only meant to be use for a
+> simple widget app, more complicated ones which needed to export
+> their api, or ship several app in one widget need to use the provided
+> _config.xml.in.sample_ which had all new Application Framework
+> features explained and examples.
+
+#### Using cmake template macros
+
+To leverage all cmake templates features, you have to specify ***properties***
+on your targets. Some macros will not works without specifying which is the
+target type.
+
+As the type is not always specified for some custom targets, like an ***HTML5***
+application, macros make the difference using ***LABELS*** property.
+
+Choose between:
+
+- **BINDING**: Shared library that be loaded by the AGL Application Framework
+- **BINDINGV2**: Shared library that be loaded by the AGL Application Framework.
+ This has to be accompagnied with a JSON file named like the *${OUTPUT_NAME}-apidef* of
+ the target that describe the API with OpenAPI syntax (e.g: *mybinding-apidef*).
+ Or you can choose the name by setting the *CACHE* cmake variable *OPENAPI_DEF*
+ (***CAUTION***: setting a CACHE variable is needed, or set a normal variable
+ with the *PARENT_SCOPE* option to make it visible for the parent scope
+ where the target is defined) JSON file will be used to generate header file
+ using `afb-genskel` tool.
+- **HTDOCS**: Root directory of a web app. This target has to build its
+ directory and puts its files in the ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}
+- **DATA**: Resources used by your application. This target has to build its
+ directory and puts its files in the ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}
+- **EXECUTABLE**: Entry point of your application executed by the AGL
+ Application Framework
+
+> **TIP** you should use the prefix _afb-_ with your **BINDING* targets which
+> stand for **Application Framework Binding**.
+
+Example:
+
+```cmake
+SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES
+               LABELS "HTDOCS"
+               OUTPUT_NAME dist.prod
+       )
+```
+
+> **NOTE**: You doesn't need to specify an **INSTALL** command for these
+> targets. This is already handle by template and will be installed in the
+> following path : **${CMAKE_INSTALL_PREFIX}/${PROJECT_NAME}**
+
+## Macro reference
+
+### PROJECT_TARGET_ADD
+
+Typical usage would be to add the target to your project using macro
+`PROJECT_TARGET_ADD` with the name of your target as parameter.
+
+Example:
+
+```cmake
+PROJECT_TARGET_ADD(low-can-demo)
+```
+
+> ***NOTE***: This will make available the variable `${TARGET_NAME}`
+> set with the specificied name. This variable will change at the next call
+> to this macros.
+
+### project_subdirs_add
+
+This macro will search in all subfolder any `CMakeLists.txt` file. If found then
+it will be added to your project. This could be use in an hybrid application by
+example where the binding lay in a sub directory.
+
+Usage :
+
+```cmake
+project_subdirs_add()
+```
+
+You also can specify a globbing pattern as argument to filter which folders
+will be looked for.
+
+To filter all directories that begin with a number followed by a dash the
+anything:
+
+```cmake
+project_subdirs_add("[0-9]-*")
+```
+
+## Advanced customization
+
+### Including additionnals cmake files
+
+#### Machine and system custom cmake files
+
+Advanced tuning is possible using addionnals cmake files that are included
+automatically from some specifics locations. They are included in that order:
+
+- Project CMake files normaly located in _<project-root-path>/conf.d/app-templates/cmake/cmake.d_
+- Home CMake files located in _$HOME/.config/app-templates/cmake.d_
+- System CMake files located in _/etc/app-templates/cmake.d_
+
+CMake files has to be named using the following convention: `XX-common*.cmake`
+or `XX-${PROJECT_NAME}*.cmake`, where `XX` are numbers, `*` file name
+(ie. `99-common-my_customs.cmake`).
+
+> **NOTE** You need to specify after numbers that indicate include order, to
+which project that file applies, if it applies to all project then use keyword
+`common`.
+
+So, saying that you should be aware that every normal cmake variables used at
+project level could be overwrited by home or system located cmake files if
+variables got the same name. Exceptions are cached variables set using
+**CACHE** keyword:
+
+Example:
+
+```cmake
+set(VARIABLE_NAME 'value string random' CACHE STRING 'docstring')
+```
+
+#### OS custom cmake files
+
+This is meant to personalize the project depending on the OS your are using.
+At the end of config.cmake, common.cmake will include lot of cmake file to
+customize project build depending on your plateform. It will detect your OS
+deducing it from file _/etc/os-release_ now as default in almost all Linux
+distribution.
+
+So you can use the value of field **ID_LIKE** or **ID** if the
+first one doesn't exists and add a cmake file for that distribution in your
+_conf.d/cmake/_ directory or relatively to your _app-templates_ submodule path
+_app-templates/../cmake/_
+
+Those files has to be named use the following scheme _XX-${OSRELEASE}*.cmake_
+where _XX_ are numbers, ${OSRELEASE} the **ID_LIKE** or **ID** field from
+_/etc/os-release_ file.
+
+### Include customs templated scripts
+
+As well as for additionnals cmake files you can include your own templated
+scripts that will be passed to cmake command `configure_file`.
+
+Just create your own script to the following directories:
+
+- Home location in _$HOME/.config/app-templates/scripts_
+- System location in _/etc/app-templates/scripts_
+
+Scripts only needs to use the extension `.in` to be parsed and configured by
+CMake command.
+
+## Autobuild script usage
+
+### Generation
+
+To be integrated in the Yocto build workflow you have to generate `autobuild`
+scripts using _autobuild_ target.
+
+To generate those scripts proceeds:
+
+```bash
+mkdir -p build
+cd build
+cmake .. && make autobuild
+```
+
+You should see _conf.d/autobuild/agl/autobuild_ file now.
+
+### Available targets
+
+Here are the available targets available from _autobuild_ scripts:
+
+- **clean** : clean build directory from object file and targets results.
+- **distclean** : delete build directory
+- **configure** : generate project Makefile from CMakeLists.txt files.
+- **build** : compile all project targets.
+- **package** : build and output a wgt package.
+
+You can specify variables that modify the behavior of compilation using
+the following variables:
+
+- **CONFIGURE_ARGS** : Variable used at **configure** time.
+- **BUILD_ARGS** : Variable used at **build** time.
+- **DEST** : Directory where to output ***wgt*** file.
+
+Variable as to be in CMake format. (ie: BUILD_ARGS="-DC_FLAGS='-g -O2'")
+
+Usage example:
+
+```bash
+./conf.d/autobuild/wgt/autobuild package DEST=/tmp
+```
diff --git a/ll-database-binding/conf.d/app-templates/book.json b/ll-database-binding/conf.d/app-templates/book.json
new file mode 100644 (file)
index 0000000..dafc6ae
--- /dev/null
@@ -0,0 +1,94 @@
+{
+    "title": "CMake Application templates",
+    "subtitle": "Developer Documentation",
+    "description": "CMake templates used to build an AGL apps and widget",
+    "keywords": "AGL, Development, Iotbzh",
+    "author": "IoT.Bzh Team",
+    "website": "http://iot.bzh",
+    "published": "July 2017",
+    "version": "1.0",
+
+    "gitbook": "3.2.2",
+    "root": "docs",
+    "pdf": {
+        "fontFamily": "Verdana",
+        "fontSize": 12,
+        "paperSize": "a4",
+        "pageBreaksBefore": "//h:div[@class=\"page-break\"]"
+    },
+    "styles": {
+        "website": "resources/ebook.css",
+        "ebook": "resources/ebook.css",
+        "pdf": "resources/ebook.css"
+    },
+
+    "hidepageheaders": [2, 3],
+    "hidepagefooters": [2, 3],
+
+    "plugins": [
+        "regexplace"
+    ],
+    "pluginsConfig": {
+        "regexplace": {
+            "removeFirstPartsInSectionNumber": true,
+            "substitutes": [{
+                    "pattern": "<!-- pagebreak -->",
+                    "flags": "g",
+                    "substitute": "<div class=\"page-break\"></div>"
+                },
+                {
+                    "pattern": "<!-- clear -->",
+                    "flags": "g",
+                    "substitute": "<div class=\"clear\"></div>"
+                },
+                {
+                    "pattern": "<!-- nopagebreak -->",
+                    "flags": "g",
+                    "substitute": "<div class=\"nopb\">"
+                },
+                {
+                    "pattern": "<!-- endnopagebreak -->",
+                    "flags": "g",
+                    "substitute": "</div>"
+                },
+                {
+                    "pattern": "<!-- note -->",
+                    "flags": "g",
+                    "substitute": "<div class=\"note\">"
+                },
+                {
+                    "pattern": "<!-- endnote -->",
+                    "flags": "g",
+                    "substitute": "</div>"
+                },
+                {
+                    "pattern": "!\\[(.*?)\\]\\((.*?)(?:\\s+\"(.*)\")?\\){0,}{caption=1([^\\}]*)}",
+                    "flags": "gmi",
+                    "substitute": "<figure id=\"fig_PAGE_LEVEL_._INDEX_\"><img $3 alt=\"$1\" title=\"$1\" href=\"$2\"><figcaption></figcaption></figure>",
+                    "decode": true
+                },
+                {
+                    "pattern": "<img ([^>]*) {0,}\/{0,}> {0,}{caption=1([^\\}]*)}",
+                    "flags": "g",
+                    "substitute": "<figure id=\"fig_PAGE_LEVEL_._INDEX_\"><img $2 $1><figcaption></figcaption></figure>",
+                    "decode": true
+                },
+                {
+                    "pattern": "<img (.*)alt=\"([^\"]*)\"(.*) {0,1}\/{0,1}><figcaption></figcaption>",
+                    "flags": "g",
+                    "substitute": "<img$1alt=\"$2\"$3><figcaption><span>Picture _PAGE_LEVEL_._INDEX_</span>: $2</figcaption>",
+                    "store": {
+                        "substitute": "<a href=\"_PAGE_PATH_#fig_PAGE_LEVEL_._INDEX_\">Pic. _PAGE_LEVEL_._INDEX_</a> <span>$2</span>",
+                        "variable_name": "pictures"
+                    }
+                },
+                {
+                    "pattern": "<img ([^>]*)> {0,}{style {1,}([^}]*)}",
+                    "flags": "g",
+                    "substitute": "<img $1 style=\"$2\">",
+                    "decode": true
+                }
+            ]
+        }
+    }
+}
diff --git a/ll-database-binding/conf.d/app-templates/cmake/cmake.d/01-build_options.cmake b/ll-database-binding/conf.d/app-templates/cmake/cmake.d/01-build_options.cmake
new file mode 100644 (file)
index 0000000..84649fc
--- /dev/null
@@ -0,0 +1,116 @@
+###########################################################################
+# Copyright 2015, 2016, 2017 IoT.bzh
+#
+# author: Fulup Ar Foll <fulup@iot.bzh>
+# contrib: Romain Forlot <romain.forlot@iot.bzh>
+#
+# 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.
+###########################################################################
+
+
+#--------------------------------------------------------------------------
+#  WARNING:
+#     Do not change this cmake template
+#     Customise your preferences in "./conf.d/cmake/config.cmake"
+#--------------------------------------------------------------------------
+
+# (BUG!!!) as PKG_CONFIG_PATH does not work [should be en env variable]
+set(PKG_CONFIG_USE_CMAKE_PREFIX_PATH ON CACHE BOOLEAN "Flag for using prefix path")
+
+INCLUDE(FindPkgConfig)
+INCLUDE(CheckIncludeFiles)
+INCLUDE(CheckLibraryExists)
+INCLUDE(GNUInstallDirs)
+
+set(CMAKE_BUILD_TYPE Debug CACHE STRING "the type of build")
+set(CMAKE_POSITION_INDEPENDENT_CODE ON)
+set(CMP0048 1)
+
+# Default compilation options
+############################################################################
+link_libraries(-Wl,--as-needed -Wl,--gc-sections)
+set(COMPILE_OPTIONS -Wall -Wextra -Wconversion -Wno-unused-parameter -Wno-sign-compare -Wno-sign-conversion -Werror=maybe-uninitialized -Werror=implicit-function-declaration -ffunction-sections -fdata-sections -fPIC CACHE STRING "Compilation flags")
+foreach(option ${COMPILE_OPTIONS})
+       add_compile_options($<$<CONFIG:PROFILING>:${option}>)
+endforeach()
+
+# Compilation OPTIONS depending on language
+#########################################
+foreach(option ${COMPILE_OPTIONS})
+       add_compile_options(${option})
+endforeach()
+foreach(option ${C_COMPILE_OPTIONS})
+       add_compile_options($<$<COMPILE_LANGUAGE:C>:${option}>)
+endforeach()
+foreach(option ${CXX_COMPILE_OPTIONS})
+       add_compile_options($<$<COMPILE_LANGUAGE:CXX>:${option}>)
+endforeach()
+
+# Compilation option depending on CMAKE_BUILD_TYPE
+##################################################
+set(PROFILING_COMPILE_OPTIONS -g -O0 -pg -Wp,-U_FORTIFY_SOURCE CACHE STRING "Compilation flags for PROFILING build type.")
+set(DEBUG_COMPILE_OPTIONS -g -ggdb -Wp,-U_FORTIFY_SOURCE CACHE STRING "Compilation flags for DEBUG build type.")
+set(CCOV_COMPILE_OPTIONS -g -O2 --coverage CACHE STRING "Compilation flags for CCOV build type.")
+set(RELEASE_COMPILE_OPTIONS -g -O2 CACHE STRING "Compilation flags for RELEASE build type.")
+foreach(option ${PROFILING_COMPILE_OPTIONS})
+       add_compile_options($<$<CONFIG:PROFILING>:${option}>)
+endforeach()
+foreach(option ${DEBUG_COMPILE_OPTIONS})
+       add_compile_options($<$<CONFIG:PROFILING>:${option}>)
+endforeach()
+foreach(option ${CCOV_COMPILE_OPTIONS})
+       add_compile_options($<$<CONFIG:PROFILING>:${option}>)
+endforeach()
+foreach(option ${RELEASE_COMPILE_OPTIONS})
+       add_compile_options($<$<CONFIG:PROFILING>:${option}>)
+endforeach()
+
+# Env variable overload default
+# Disabled by default now. Tell me if you need really it
+# but you should not have needs for that since you can
+# set CMAKE_INSTALL_PREFIX in your config.cmake.
+#if(DEFINED ENV{INSTALL_PREFIX})
+#      set(INSTALL_PREFIX $ENV{INSTALL_PREFIX} CACHE PATH "The path where to install")
+#else()
+#      set(INSTALL_PREFIX "${CMAKE_SOURCE_DIR}/Install" CACHE PATH "The path where to install")
+#endif()
+#set(CMAKE_INSTALL_PREFIX ${INSTALL_PREFIX} CACHE PATH "Installation Prefix")
+
+# Loop on required package and add options
+foreach (PKG_CONFIG ${PKG_REQUIRED_LIST})
+       string(REGEX REPLACE "[<>]?=.*$" "" XPREFIX ${PKG_CONFIG})
+       PKG_CHECK_MODULES(${XPREFIX} REQUIRED ${PKG_CONFIG})
+
+       INCLUDE_DIRECTORIES(${${XPREFIX}_INCLUDE_DIRS})
+       list(APPEND link_libraries ${${XPREFIX}_LDFLAGS})
+       add_compile_options (${${XPREFIX}_CFLAGS})
+endforeach(PKG_CONFIG)
+
+# Optional LibEfence Malloc debug library
+IF(CMAKE_BUILD_TYPE MATCHES DEBUG)
+CHECK_LIBRARY_EXISTS(efence malloc "" HAVE_LIBEFENCE)
+IF(HAVE_LIBEFENCE)
+       MESSAGE(STATUS "Linking with ElectricFence for debugging purposes...")
+       SET(libefence_LIBRARIES "-lefence")
+       list (APPEND link_libraries ${libefence_LIBRARIES})
+ENDIF(HAVE_LIBEFENCE)
+ENDIF(CMAKE_BUILD_TYPE MATCHES DEBUG)
+
+# set default include directories
+INCLUDE_DIRECTORIES(${EXTRA_INCLUDE_DIRS})
+
+# Default Linkflag
+set (PKG_TEMPLATE_PREFIX ${CMAKE_SOURCE_DIR}/${PROJECT_APP_TEMPLATES_DIR} CACHE PATH "Default Package Templates Directory")
+if(NOT BINDINGS_LINK_FLAG)
+       set(BINDINGS_LINK_FLAG "-Wl,--version-script=${PKG_TEMPLATE_PREFIX}/cmake/export.map")
+endif()
diff --git a/ll-database-binding/conf.d/app-templates/cmake/cmake.d/02-variables.cmake b/ll-database-binding/conf.d/app-templates/cmake/cmake.d/02-variables.cmake
new file mode 100644 (file)
index 0000000..0532c33
--- /dev/null
@@ -0,0 +1,144 @@
+###########################################################################
+# Copyright 2015, 2016, 2017 IoT.bzh
+#
+# author: Fulup Ar Foll <fulup@iot.bzh>
+# contrib: Romain Forlot <romain.forlot@iot.bzh>
+#
+# 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.
+###########################################################################
+
+
+#--------------------------------------------------------------------------
+#  WARNING:
+#     Do not change this cmake template
+#     Customise your preferences in "./etc/config.cmake"
+#--------------------------------------------------------------------------
+
+# Get colorized message output non Windows OS. You know bash ? :)
+if(NOT WIN32)
+       string(ASCII 27 Esc)
+       set(ColourReset "${Esc}[m")
+       set(ColourBold  "${Esc}[1m")
+       set(Red         "${Esc}[31m")
+       set(Green       "${Esc}[32m")
+       set(Yellow      "${Esc}[33m")
+       set(Blue        "${Esc}[34m")
+       set(Magenta     "${Esc}[35m")
+       set(Cyan        "${Esc}[36m")
+       set(White       "${Esc}[37m")
+       set(BoldRed     "${Esc}[1;31m")
+       set(BoldGreen   "${Esc}[1;32m")
+       set(BoldYellow  "${Esc}[1;33m")
+       set(BoldBlue    "${Esc}[1;34m")
+       set(BoldMagenta "${Esc}[1;35m")
+       set(BoldCyan    "${Esc}[1;36m")
+       set(BoldWhite   "${Esc}[1;37m")
+endif()
+
+# Native packaging name
+set(NPKG_PROJECT_NAME agl-${PROJECT_NAME})
+
+string(REGEX MATCH "[0-9]+" LINUX_VERSION_CODE ${LINUX_VERSION_CODE_LINE})
+math(EXPR a "${LINUX_VERSION_CODE} >> 16")
+math(EXPR b "(${LINUX_VERSION_CODE} >> 8) & 255")
+math(EXPR c "(${LINUX_VERSION_CODE} & 255)")
+
+set(KERNEL_VERSION "${a}.${b}.${c}")
+
+# Include project configuration
+# ------------------------------
+project(${PROJECT_NAME} VERSION ${PROJECT_VERSION} LANGUAGES ${PROJECT_LANGUAGES})
+set(PROJECT_LIBDIR "${CMAKE_SOURCE_DIR}/libs" CACHE PATH "Subpath to libraries")
+set(PROJECT_RESOURCES "${CMAKE_SOURCE_DIR}/data" CACHE PATH "Subpath to data")
+
+set(AFB_TOKEN   ""      CACHE PATH "Default AFB_TOKEN")
+set(AFB_REMPORT "1234" CACHE PATH "Default AFB_TOKEN")
+
+# Check GCC minimal version
+if (gcc_minimal_version)
+message (STATUS "${Cyan}-- Check gcc_minimal_version (found gcc version ${CMAKE_C_COMPILER_VERSION}) \
+(found g++ version ${CMAKE_CXX_COMPILER_VERSION})${ColourReset}")
+if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${gcc_minimal_version} OR CMAKE_C_COMPILER_VERSION VERSION_LESS ${gcc_minimal_version})
+message(FATAL_ERROR "${Red}**** FATAL: Require at least gcc-${gcc_minimal_version} please set CMAKE_C[XX]_COMPILER")
+endif()
+endif(gcc_minimal_version)
+
+# Check Kernel mandatory version, will fail the configuration if required version not matched.
+if (kernel_mandatory_version)
+message (STATUS "${Cyan}-- Check kernel_mandatory_version (found kernel version ${KERNEL_VERSION})${ColourReset}")
+if (KERNEL_VERSION VERSION_LESS ${kernel_mandatory_version})
+message(FATAL_ERROR "${Red}**** FATAL: Require at least ${kernel_mandatory_version} please use a recent kernel or source your SDK environment then clean and reconfigure your CMake project.")
+endif (KERNEL_VERSION VERSION_LESS ${kernel_mandatory_version})
+endif(kernel_mandatory_version)
+
+# Check Kernel minimal version just print a Warning about missing features
+# and set a definition to be used as preprocessor condition in code to disable
+# incompatibles features.
+if (kernel_minimal_version)
+message (STATUS "${Cyan}-- Check kernel_minimal_version (found kernel version ${KERNEL_VERSION})${ColourReset}")
+if (KERNEL_VERSION VERSION_LESS ${kernel_minimal_version})
+message(WARNING "${Yellow}**** Warning: Some feature(s) require at least ${kernel_minimal_version}. Please use a recent kernel or source your SDK environment then clean and reconfigure your CMake project.${ColourReset}")
+else (KERNEL_VERSION VERSION_LESS ${kernel_minimal_version})
+add_definitions(-DKERNEL_MINIMAL_VERSION_OK)
+endif (KERNEL_VERSION VERSION_LESS ${kernel_minimal_version})
+endif(kernel_minimal_version)
+
+# Project path variables
+# ----------------------
+set(PKGOUT_DIR package CACHE PATH "Output directory for packages")
+
+# Define a default package directory
+if(PKG_PREFIX)
+       set(PROJECT_PKG_BUILD_DIR ${PKG_PREFIX}/${PKGOUT_DIR} CACHE PATH "Application contents to be packaged")
+else()
+       set(PROJECT_PKG_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/${PKGOUT_DIR} CACHE PATH "Application contents to be packaged")
+endif()
+
+# Paths to templates files
+set(TEMPLATE_DIR "${PKG_TEMPLATE_PREFIX}/template.d" CACHE PATH "Subpath to a directory where are stored needed files to launch on remote target to debuging purposes")
+
+string(REGEX REPLACE "^(.*)/.*$" "\\1" ENTRY_POINT "${PKG_TEMPLATE_PREFIX}")
+set(PROJECT_PKG_ENTRY_POINT ${ENTRY_POINT}/packaging CACHE PATH "Where package build files, like rpm.spec file or config.xml, are write.")
+
+set(WIDGET_ICON "${ENTRY_POINT}/wgt/${PROJECT_ICON}" CACHE PATH "Path to the widget icon")
+set(WIDGET_CONFIG_TEMPLATE ${TEMPLATE_DIR}/config.xml.in CACHE PATH "Path to widget config file template (config.xml.in)")
+
+# Path to autobuild template
+set(PROJECT_TEMPLATE_AGL_AUTOBUILD_DIR ${CMAKE_SOURCE_DIR}/conf.d/autobuild/agl CACHE PATH "Subpath to a directory where are stored autobuild script")
+set(PROJECT_TEMPLATE_LINUX_AUTOBUILD_DIR ${CMAKE_SOURCE_DIR}/conf.d/autobuild/linux CACHE PATH "Subpath to a directory where are stored autobuild script")
+
+# Archive target variables
+set(ARCHIVE_OUTPUT_ARCHIVE ${PROJECT_PKG_ENTRY_POINT}/${NPKG_PROJECT_NAME}_${PROJECT_VERSION}.orig.tar)
+set(ARCHIVE_OUTPUT ${ARCHIVE_OUTPUT_ARCHIVE}.gz)
+set(TMP_ARCHIVE_SUBMODULE ${PROJECT_PKG_ENTRY_POINT}/${NPKG_PROJECT_NAME}-sub)
+set(CMD_ARCHIVE_SUBMODULE \'git archive --verbose --prefix=${NPKG_PROJECT_NAME}-${PROJECT_VERSION}/$$path/ --format tar HEAD --output ${TMP_ARCHIVE_SUBMODULE}-$$sha1.tar\' )
+
+if(OSRELEASE MATCHES "debian" AND NOT DEFINED ENV{SDKTARGETSYSROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)
+       # build deb spec file from template
+       set(PACKAGING_DEB_OUTPUT_DSC       ${PROJECT_PKG_ENTRY_POINT}/${NPKG_PROJECT_NAME}.dsc)
+       set(PACKAGING_DEB_OUTPUT_INSTALL   ${PROJECT_PKG_ENTRY_POINT}/debian.${NPKG_PROJECT_NAME}.install)
+       set(PACKAGING_DEB_OUTPUT_CHANGELOG ${PROJECT_PKG_ENTRY_POINT}/debian.changelog)
+       set(PACKAGING_DEB_OUTPUT_COMPAT    ${PROJECT_PKG_ENTRY_POINT}/debian.compat)
+       set(PACKAGING_DEB_OUTPUT_CONTROL   ${PROJECT_PKG_ENTRY_POINT}/debian.control)
+       set(PACKAGING_DEB_OUTPUT_RULES     ${PROJECT_PKG_ENTRY_POINT}/debian.rules)
+endif()
+
+# Break After Binding are loaded but before they get initialised
+set(GDB_INITIAL_BREAK "personality" CACHE STRING "Initial Break Point for GDB remote")
+
+# Define some checker binaries to verify input DATA files
+# to be included in package. Schema aren't checked for now.
+# Dummy checker about JSON.
+set(LUA_CHECKER "luac" "-p" CACHE STRING "LUA compiler")
+set(XML_CHECKER "xmllint" CACHE STRING "XML linter")
+set(JSON_CHECKER "echo" CACHE STRING "JSON linter")
diff --git a/ll-database-binding/conf.d/app-templates/cmake/cmake.d/03-macros.cmake b/ll-database-binding/conf.d/app-templates/cmake/cmake.d/03-macros.cmake
new file mode 100644 (file)
index 0000000..06f61a4
--- /dev/null
@@ -0,0 +1,513 @@
+###########################################################################
+# Copyright 2015, 2016, 2017 IoT.bzh
+#
+# author: Fulup Ar Foll <fulup@iot.bzh>
+# contrib: Romain Forlot <romain.forlot@iot.bzh>
+#
+# 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.
+###########################################################################
+
+#--------------------------------------------------------------------------
+#  WARNING:
+#     Do not change this cmake template
+#     Customise your preferences in "./conf.d/cmake/config.cmake"
+#--------------------------------------------------------------------------
+# CMake 3.6 imported macros to simulate list(FILTER ...) subcommand
+# -----------------------
+MACRO(PARSE_ARGUMENTS prefix arg_names option_names)
+SET(DEFAULT_ARGS)
+FOREACH(arg_name ${arg_names})
+  SET(${prefix}_${arg_name})
+ENDFOREACH(arg_name)
+FOREACH(option ${option_names})
+  SET(${prefix}_${option} FALSE)
+ENDFOREACH(option)
+
+SET(current_arg_name DEFAULT_ARGS)
+SET(current_arg_list)
+FOREACH(arg ${ARGN})
+  LIST_CONTAINS(is_arg_name ${arg} ${arg_names})
+  IF (is_arg_name)
+       SET(${prefix}_${current_arg_name} ${current_arg_list})
+       SET(current_arg_name ${arg})
+       SET(current_arg_list)
+  ELSE (is_arg_name)
+       LIST_CONTAINS(is_option ${arg} ${option_names})
+       IF (is_option)
+  SET(${prefix}_${arg} TRUE)
+       ELSE (is_option)
+  SET(current_arg_list ${current_arg_list} ${arg})
+       ENDIF (is_option)
+  ENDIF (is_arg_name)
+ENDFOREACH(arg)
+SET(${prefix}_${current_arg_name} ${current_arg_list})
+ENDMACRO(PARSE_ARGUMENTS)
+
+MACRO(LIST_CONTAINS var value)
+SET(${var})
+FOREACH (value2 ${ARGN})
+  IF (${value} STREQUAL ${value2})
+       SET(${var} TRUE)
+  ENDIF (${value} STREQUAL ${value2})
+ENDFOREACH (value2)
+ENDMACRO(LIST_CONTAINS)
+
+MACRO(LIST_FILTER)
+PARSE_ARGUMENTS(LIST_FILTER "OUTPUT_VARIABLE" "" ${ARGV})
+# Check arguments.
+LIST(LENGTH LIST_FILTER_DEFAULT_ARGS LIST_FILTER_default_length)
+IF(${LIST_FILTER_default_length} EQUAL 0)
+  MESSAGE(FATAL_ERROR "LIST_FILTER: missing list variable.")
+ENDIF(${LIST_FILTER_default_length} EQUAL 0)
+IF(${LIST_FILTER_default_length} EQUAL 1)
+  MESSAGE(FATAL_ERROR "LIST_FILTER: missing regular expression variable.")
+ENDIF(${LIST_FILTER_default_length} EQUAL 1)
+# Reset output variable
+IF(NOT LIST_FILTER_OUTPUT_VARIABLE)
+  SET(LIST_FILTER_OUTPUT_VARIABLE "LIST_FILTER_internal_output")
+ENDIF(NOT LIST_FILTER_OUTPUT_VARIABLE)
+SET(${LIST_FILTER_OUTPUT_VARIABLE})
+# Extract input list from arguments
+LIST(GET LIST_FILTER_DEFAULT_ARGS 0 LIST_FILTER_input_list)
+LIST(REMOVE_AT LIST_FILTER_DEFAULT_ARGS 0)
+FOREACH(LIST_FILTER_item ${${LIST_FILTER_input_list}})
+  FOREACH(LIST_FILTER_regexp_var ${LIST_FILTER_DEFAULT_ARGS})
+       FOREACH(LIST_FILTER_regexp ${${LIST_FILTER_regexp_var}})
+         IF(${LIST_FILTER_item} MATCHES ${LIST_FILTER_regexp})
+               LIST(APPEND ${LIST_FILTER_OUTPUT_VARIABLE} ${LIST_FILTER_item})
+         ENDIF(${LIST_FILTER_item} MATCHES ${LIST_FILTER_regexp})
+       ENDFOREACH(LIST_FILTER_regexp ${${LIST_FILTER_regexp_var}})
+  ENDFOREACH(LIST_FILTER_regexp_var)
+ENDFOREACH(LIST_FILTER_item)
+# If OUTPUT_VARIABLE is not specified, overwrite the input list.
+IF(${LIST_FILTER_OUTPUT_VARIABLE} STREQUAL "LIST_FILTER_internal_output")
+  SET(${LIST_FILTER_input_list} ${${LIST_FILTER_OUTPUT_VARIABLE}})
+ENDIF(${LIST_FILTER_OUTPUT_VARIABLE} STREQUAL "LIST_FILTER_internal_output")
+ENDMACRO(LIST_FILTER)
+
+# Generic useful macro
+# -----------------------
+macro(PROJECT_TARGET_ADD TARGET_NAME)
+       set_property(GLOBAL APPEND PROPERTY PROJECT_TARGETS ${TARGET_NAME})
+       set(TARGET_NAME ${TARGET_NAME})
+endmacro(PROJECT_TARGET_ADD)
+
+macro(PROJECT_PKGDEP_ADD PKG_NAME)
+       set_property(GLOBAL APPEND PROPERTY PROJECT_PKG_DEPS ${PKG_NAME})
+endmacro(PROJECT_PKGDEP_ADD)
+
+macro(defstr name value)
+       add_definitions(-D${name}=${value})
+endmacro(defstr)
+
+macro(configure_files_in_dir dir)
+       file(GLOB filelist "${dir}/*in")
+       foreach(file ${filelist})
+               get_filename_component(filename ${file} NAME)
+               string(REGEX REPLACE "target" "${RSYNC_TARGET}" destinationfile ${filename})
+               string(REGEX REPLACE ".in$" "" destinationfile ${destinationfile})
+               configure_file(${file} ${CMAKE_CURRENT_BINARY_DIR}/target/${destinationfile})
+               set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "${CMAKE_CURRENT_BINARY_DIR}/target/${destinationfile}")
+       endforeach()
+endmacro(configure_files_in_dir)
+
+# Create custom target dedicated for HTML5 and DATA AGL target type
+macro(add_input_files INPUT_FILES)
+       if(NOT DEFINED XML_FILES)
+               set(ext_reg "xml$")
+               set(XML_LIST ${INPUT_FILES})
+               list_filter(XML_LIST ext_reg)
+       endif()
+       if(NOT DEFINED LUA_LIST)
+               set(ext_reg "lua$")
+               set(LUA_LIST ${INPUT_FILES})
+               list_filter(LUA_LIST ext_reg)
+       endif()
+       if(NOT DEFINED JSON_FILES)
+               set(ext_reg "json$")
+               set(JSON_LIST ${INPUT_FILES})
+               list_filter(JSON_LIST ext_reg)
+       endif()
+
+       # These are v3.6 subcommand. Not used as default for now as
+       # many dev use Ubuntu 16.04 which have only 3.5 version
+       #list(FILTER XML_LIST INCLUDE REGEX "xml$")
+       #list(FILTER LUA_LIST INCLUDE REGEX "lua$")
+       #list(FILTER JSON_LIST INCLUDE REGEX "json$")
+
+       add_custom_target(${TARGET_NAME} ALL
+       DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}
+       )
+
+       foreach(file ${XML_LIST})
+               add_custom_command(TARGET ${TARGET_NAME}
+                       PRE_BUILD
+                       WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+                       COMMAND ${XML_CHECKER} ${file}
+               )
+       endforeach()
+       foreach(file ${LUA_LIST})
+       add_custom_command(TARGET ${TARGET_NAME}
+               PRE_BUILD
+               WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+               COMMAND ${LUA_CHECKER} ${file}
+       )
+       endforeach()
+       foreach(file ${JSON_LIST})
+       add_custom_command(TARGET ${TARGET_NAME}
+               PRE_BUILD
+               WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+               COMMAND cat ${file} | ${JSON_CHECKER}
+       )
+       endforeach()
+
+       add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}
+       DEPENDS ${INPUT_FILES}
+       COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}
+       COMMAND touch ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}
+       COMMAND cp -r ${INPUT_FILES} ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}
+       )
+endmacro()
+
+# Set the name of the OPENAPI definition JSON file for binding v2
+macro(set_openapi_filename openapi_filename)
+       set(OPENAPI_DEF ${openapi_filename} CACHE STRING "OpenAPI JSON file name used to generate binding header file before building a binding v2 target.")
+endmacro()
+
+# Pre-packaging
+macro(project_targets_populate)
+       # Default Widget default directory
+       set(BINDIR bin)
+       set(ETCDIR etc)
+       set(LIBDIR lib)
+       set(HTTPDIR htdocs)
+       set(DATADIR data)
+       set(PACKAGE_BINDIR  ${PROJECT_PKG_BUILD_DIR}/${BINDIR})
+       set(PACKAGE_ETCDIR  ${PROJECT_PKG_BUILD_DIR}/${ETCDIR})
+       set(PACKAGE_LIBDIR  ${PROJECT_PKG_BUILD_DIR}/${LIBDIR})
+       set(PACKAGE_HTTPDIR ${PROJECT_PKG_BUILD_DIR}/${HTTPDIR})
+       set(PACKAGE_DATADIR ${PROJECT_PKG_BUILD_DIR}/${DATADIR})
+
+       add_custom_command(OUTPUT ${PACKAGE_BINDIR} ${PACKAGE_ETCDIR} ${PACKAGE_LIBDIR} ${PACKAGE_HTTPDIR} ${PACKAGE_DATADIR}
+               COMMAND mkdir -p ${PACKAGE_BINDIR} ${PACKAGE_ETCDIR} ${PACKAGE_LIBDIR} ${PACKAGE_HTTPDIR} ${PACKAGE_DATADIR})
+       add_custom_target(populate DEPENDS ${PACKAGE_BINDIR} ${PACKAGE_ETCDIR} ${PACKAGE_LIBDIR} ${PACKAGE_HTTPDIR} ${PACKAGE_DATADIR})
+
+       INSTALL(CODE "execute_process(COMMAND make populate)")
+       INSTALL(DIRECTORY ${PROJECT_PKG_BUILD_DIR}/
+               DESTINATION ${CMAKE_INSTALL_PREFIX}/${PROJECT_NAME}
+       )
+
+       get_property(PROJECT_TARGETS GLOBAL PROPERTY PROJECT_TARGETS)
+       foreach(TARGET ${PROJECT_TARGETS})
+       get_target_property(T ${TARGET} LABELS)
+       if(T)
+               # Declaration of a custom command that will populate widget tree with the target
+               set(POPULE_PACKAGE_TARGET "project_populate_${TARGET}")
+
+               get_target_property(P ${TARGET} PREFIX)
+               get_target_property(BD ${TARGET} BINARY_DIR)
+               get_target_property(SD ${TARGET} SOURCE_DIR)
+               get_target_property(OUT ${TARGET} OUTPUT_NAME)
+
+               if(P MATCHES "NOTFOUND$")
+                       if (${T} STREQUAL "BINDING")
+                               set(P "lib")
+                       else()
+                               set(P "")
+                       endif()
+               endif()
+
+               if(${T} STREQUAL "BINDING")
+                       list(APPEND BINDINGS_LIST "${P}${OUT}")
+                       add_custom_command(OUTPUT ${PACKAGE_LIBDIR}/${P}${OUT}.so
+                               DEPENDS ${BD}/${P}${OUT}.so
+                               COMMAND mkdir -p ${PACKAGE_LIBDIR}
+                               COMMAND cp ${BD}/${P}${OUT}.so ${PACKAGE_LIBDIR}
+                       )
+                       add_custom_target(${POPULE_PACKAGE_TARGET} DEPENDS ${PACKAGE_LIBDIR}/${P}${OUT}.so)
+                       add_dependencies(populate ${POPULE_PACKAGE_TARGET})
+                       add_dependencies(${POPULE_PACKAGE_TARGET} ${TARGET})
+               elseif(${T} STREQUAL "BINDINGV2")
+                       if (OPENAPI_DEF)
+                               add_custom_command(OUTPUT ${SD}/${OPENAPI_DEF}.h
+                                       DEPENDS ${SD}/${OPENAPI_DEF}.json
+                                       COMMAND afb-genskel ${SD}/${OPENAPI_DEF}.json > ${SD}/${OPENAPI_DEF}.h
+                               )
+                               add_custom_target("${TARGET}_GENSKEL" DEPENDS ${SD}/${OPENAPI_DEF}.h
+                                       COMMENT "Generating OpenAPI header file ${OPENAPI_DEF}.h")
+                               add_dependencies(${TARGET} "${TARGET}_GENSKEL")
+                       else()
+                               add_custom_command(OUTPUT ${SD}/${OUT}-apidef.h
+                                       DEPENDS ${SD}/${OUT}-apidef.json
+                                       COMMAND afb-genskel ${SD}/${OUT}-apidef.json > ${SD}/${OUT}-apidef.h
+                               )
+                               add_custom_target("${TARGET}_GENSKEL" DEPENDS ${SD}/${OUT}-apidef.h
+                                       COMMENT "Generating OpenAPI header file ${OUT}-apidef.h")
+                               add_dependencies(${TARGET} "${TARGET}_GENSKEL")
+                       endif()
+
+                       add_custom_command(OUTPUT ${PACKAGE_LIBDIR}/${P}${OUT}.so
+                                       DEPENDS ${BD}/${P}${OUT}.so
+                                       COMMAND mkdir -p ${PACKAGE_LIBDIR}
+                                       COMMAND cp ${BD}/${P}${OUT}.so ${PACKAGE_LIBDIR}
+                               )
+                               add_custom_target(${POPULE_PACKAGE_TARGET} DEPENDS ${PACKAGE_LIBDIR}/${P}${OUT}.so)
+                               add_dependencies(populate ${POPULE_PACKAGE_TARGET})
+                               add_dependencies(${POPULE_PACKAGE_TARGET} ${TARGET})
+               elseif(${T} STREQUAL "EXECUTABLE")
+                       add_custom_command(OUTPUT ${PACKAGE_BINDIR}/${P}${OUT}
+                               DEPENDS ${BD}/${P}${OUT}
+                               COMMAND mkdir -p ${PACKAGE_BINDIR}
+                               COMMAND cp ${BD}/${P}${OUT} ${PACKAGE_BINDIR}
+                       )
+                       add_custom_target(${POPULE_PACKAGE_TARGET} DEPENDS ${PACKAGE_BINDIR}/${P}${OUT})
+                       add_dependencies(populate ${POPULE_PACKAGE_TARGET})
+                       add_dependencies(${POPULE_PACKAGE_TARGET} ${TARGET})
+               elseif(${T} STREQUAL "HTDOCS")
+                       add_custom_command(OUTPUT ${PACKAGE_HTTPDIR}-xx
+                               DEPENDS ${BD}/${P}${OUT}
+                               COMMAND mkdir -p ${PACKAGE_HTTPDIR}
+                               COMMAND touch ${PACKAGE_HTTPDIR}
+                               COMMAND cp -r ${BD}/${P}${OUT}/* ${PACKAGE_HTTPDIR}
+                       )
+                       add_custom_target(${POPULE_PACKAGE_TARGET} DEPENDS ${PACKAGE_HTTPDIR}-xx)
+                       add_dependencies(populate ${POPULE_PACKAGE_TARGET})
+                       add_dependencies(${POPULE_PACKAGE_TARGET} ${TARGET})
+               elseif(${T} STREQUAL "DATA")
+                       # Generate list of output files instead of just one output directory
+                       get_target_property(SF ${TARGET} SOURCES)
+                       foreach(file ${SF})
+                               get_filename_component(JUST_FILENAME ${file} NAME)
+                               list(APPEND OUTPUT_FILES ${PACKAGE_DATADIR}/${JUST_FILENAME})
+                       endforeach()
+                       add_custom_target(${POPULE_PACKAGE_TARGET})
+                       add_custom_command(TARGET ${POPULE_PACKAGE_TARGET}
+                               POST_BUILD
+                               COMMAND mkdir -p ${PACKAGE_DATADIR}
+                               COMMAND touch ${PACKAGE_DATADIR}
+                               COMMAND cp -r ${BD}/${TARGET} ${PACKAGE_DATADIR}
+                       )
+                       add_dependencies(populate ${POPULE_PACKAGE_TARGET})
+                       add_dependencies(${POPULE_PACKAGE_TARGET} ${TARGET})
+                       elseif(${T} STREQUAL "BINDING-CONFIG")
+                       # Generate list of output files instead of just one output directory
+                       get_target_property(SF ${TARGET} SOURCES)
+                       foreach(file ${SF})
+                               get_filename_component(JUST_FILENAME ${file} NAME)
+                               list(APPEND OUTPUT_FILES ${PACKAGE_ETCDIR}/${JUST_FILENAME})
+                       endforeach()
+                       add_custom_target(${POPULE_PACKAGE_TARGET})
+                       add_custom_command(TARGET ${POPULE_PACKAGE_TARGET}
+                               POST_BUILD
+                               COMMAND mkdir -p ${PACKAGE_ETCDIR}
+                               COMMAND touch ${PACKAGE_ETCDIR}
+                               COMMAND cp -r ${BD}/${TARGET} ${PACKAGE_ETCDIR}
+                       )
+                       add_dependencies(populate ${POPULE_PACKAGE_TARGET})
+                       add_dependencies(${POPULE_PACKAGE_TARGET} ${TARGET})
+               endif(${T} STREQUAL "BINDING")
+               elseif(${CMAKE_BUILD_TYPE} MATCHES "[Dd][Ee][Bb][Uu][Gg]")
+                       MESSAGE("${Yellow}.. Warning: ${TARGET} ignored when packaging.${ColourReset}")
+               endif()
+       endforeach()
+endmacro(project_targets_populate)
+
+macro(remote_targets_populate)
+       if (DEFINED ENV{RSYNC_TARGET})
+               set (RSYNC_TARGET $ENV{RSYNC_TARGET})
+       endif()
+       if (DEFINED ENV{RSYNC_PREFIX})
+               set (RSYNC_PREFIX $ENV{RSYNC_PREFIX})
+       endif()
+
+       set(
+               REMOTE_LAUNCH "Test on target with: ${CMAKE_CURRENT_BINARY_DIR}/target/start-on-${RSYNC_TARGET}.sh"
+               CACHE STRING "Command to start ${PROJECT_NAME} on remote target ${RSYNC_TARGET}"
+       )
+
+       if(NOT RSYNC_TARGET OR NOT RSYNC_PREFIX)
+               message ("${Yellow}.. Warning: RSYNC_TARGET RSYNC_PREFIX not defined 'make remote-target-populate' not instanciated${ColourReset}")
+               add_custom_target(remote-target-populate
+                       COMMENT "${Red}*** Fatal: RSYNC_TARGET RSYNC_PREFIX environment variables required with 'make remote-target-populate'${ColourReset}"
+                       COMMAND exit -1
+               )
+       else()
+               set(BINDINGS_REGEX "not_set")
+               if(DEFINED BINDINGS_LIST)
+                       list(LENGTH BINDINGS_LIST BINDINGS_LIST_LENGTH)
+                       if(BINDINGS_LIST_LENGTH EQUAL 1)
+                               list(GET BINDINGS_LIST 0 BINDINGS_REGEX)
+                               string(APPEND BINDINGS_REGEX ".so")
+                       elseif(BINDINGS_LIST_LENGTH GREATER 1)
+                               foreach(B IN LISTS BINDINGS_LIST)
+                                       STRING(APPEND BINDINGS_STR "${B}|")
+                               endforeach()
+                                       STRING(REGEX REPLACE "^(.*)\\|$" "(\\1).so" BINDINGS_REGEX ${BINDINGS_STR})
+                       endif()
+               endif()
+
+               configure_files_in_dir(${TEMPLATE_DIR})
+               configure_files_in_dir(${TEMPLATE_DIR})
+
+               add_custom_target(remote-target-populate
+                       COMMAND chmod +x ${CMAKE_CURRENT_BINARY_DIR}/target/*.sh
+                       COMMAND rsync -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --archive --delete ${PROJECT_PKG_BUILD_DIR}/ ${RSYNC_TARGET}:${RSYNC_PREFIX}/${PROJECT_NAME}
+               )
+
+               add_custom_command(TARGET remote-target-populate
+               POST_BUILD
+               COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --green --bold ${REMOTE_LAUNCH}
+               )
+
+               add_dependencies(remote-target-populate populate)
+       endif()
+endmacro(remote_targets_populate)
+
+macro(wgt_package_build)
+       if(NOT EXISTS ${WIDGET_CONFIG_TEMPLATE})
+               MESSAGE(FATAL_ERROR "${Red}WARNING ! Missing mandatory files to build widget file.\nYou need a config.xml template: please specify WIDGET_CONFIG_TEMPLATE correctly.${ColourReset}")
+       endif()
+       if(NOT WIDGET_TYPE)
+               MESSAGE(FATAL_ERROR "WIDGET_TYPE must be set in your config.cmake.\neg.: set(WIDGET_TYPE application/vnd.agl.service)")
+       endif()
+       if(NOT DEFINED PROJECT_ICON)
+               if( ${WIDGET_TYPE} MATCHES "agl.native")
+                       set(ICON_PATH ${PKG_APP_TEMPLATE_DIR}/wgt/icon-native.png)
+               elseif( ${WIDGET_TYPE} MATCHES "agl.service")
+                       set(ICON_PATH ${PKG_APP_TEMPLATE_DIR}/wgt/icon-service.png)
+               elseif( ${WIDGET_TYPE} MATCHES "x-executable")
+                       set(ICON_PATH ${PKG_APP_TEMPLATE_DIR}/wgt/icon-qml.png)
+               elseif( ${WIDGET_TYPE} MATCHES "text/html")
+                       set(ICON_PATH ${PKG_APP_TEMPLATE_DIR}/wgt/icon-html5.png)
+               endif()
+       elseif(EXISTS "${CMAKE_SOURCE_DIR}/${WIDGET_ICON}")
+               set(ICON_PATH "${CMAKE_SOURCE_DIR}/${WIDGET_ICON}")
+       elseif(EXISTS "${WIDGET_ICON}")
+               set(ICON_PATH "${WIDGET_ICON}")
+       else()
+               set(ICON_PATH ${CMAKE_SOURCE_DIR}/${PROJECT_APP_TEMPLATES_DIR}/wgt/icon-default.png)
+       endif()
+
+       if(NOT WIDGET_ENTRY_POINT)
+               set(WIDGET_ENTRY_POINT lib)
+       endif()
+
+       add_custom_command(OUTPUT ${PROJECT_PKG_BUILD_DIR}/config.xml
+               COMMAND ${CMAKE_COMMAND} -DINFILE=${WIDGET_CONFIG_TEMPLATE} -DOUTFILE=${PROJECT_PKG_BUILD_DIR}/config.xml -DPROJECT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_APP_TEMPLATES_DIR}/cmake/configure_file.cmake
+               COMMAND cp ${ICON_PATH} ${PROJECT_PKG_BUILD_DIR}/${PROJECT_ICON}
+
+       )
+       add_custom_target(packaging_wgt DEPENDS ${PROJECT_PKG_BUILD_DIR}/config.xml)
+
+       # Fulup ??? copy any extra file in wgt/etc into populate package before building the widget
+       file(GLOB PROJECT_CONF_FILES "${TEMPLATE_DIR}/etc/*")
+       if(${PROJECT_CONF_FILES})
+               file(COPY "${TEMPLATE_DIR}/etc/*" DESTINATION ${PROJECT_PKG_BUILD_DIR}/etc/)
+       endif(${PROJECT_CONF_FILES})
+
+       add_custom_command(OUTPUT ${PROJECT_NAME}.wgt
+               DEPENDS ${PROJECT_TARGETS}
+               COMMAND wgtpkg-pack -f -o ${PROJECT_NAME}.wgt ${PROJECT_PKG_BUILD_DIR}
+       )
+
+       add_custom_target(widget DEPENDS ${PROJECT_NAME}.wgt)
+       add_dependencies(widget populate packaging_wgt)
+       set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.wgt")
+
+       if(NOT RSYNC_TARGET)
+               message ("${Yellow}.. Warning: RSYNC_TARGET not defined 'make widget-target-install' not instanciated${ColourReset}")
+               add_custom_target(widget-target-install
+                       COMMENT "${Red}*** Fatal: RSYNC_TARGET RSYNC_PREFIX environment variables required with 'make widget-target-install'${ColourReset}"
+                       COMMAND exit -1
+               )
+       else()
+       configure_files_in_dir(${TEMPLATE_DIR})
+       add_custom_target(widget-target-install
+       DEPENDS widget
+       COMMAND chmod +x ${CMAKE_CURRENT_BINARY_DIR}/target/install-wgt-on-${RSYNC_TARGET}.sh
+       COMMAND ${CMAKE_CURRENT_BINARY_DIR}/target/install-wgt-on-${RSYNC_TARGET}.sh
+       )
+endif()
+
+       if(PACKAGE_MESSAGE)
+       add_custom_command(TARGET widget
+               POST_BUILD
+               COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --cyan "++ ${PACKAGE_MESSAGE}")
+       endif()
+endmacro(wgt_package_build)
+
+macro(rpm_package_build)
+       add_custom_command(OUTPUT ${NPKG_PROJECT_NAME}.spec
+               DEPENDS ${PROJECT_TARGETS}
+                               archive
+                               packaging
+               COMMAND rpmbuild --define=\"%_sourcedir ${PROJECT_PKG_ENTRY_POINT}\" -ba  ${PROJECT_PKG_ENTRY_POINT}/${NPKG_PROJECT_NAME}.spec
+       )
+
+       add_custom_target(rpm DEPENDS ${NPKG_PROJECT_NAME}.spec)
+       add_dependencies(rpm populate packaging)
+
+       if(PACKAGE_MESSAGE)
+       add_custom_command(TARGET rpm
+               POST_BUILD
+               COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --cyan "++ ${PACKAGE_MESSAGE}")
+       endif()
+endmacro(rpm_package_build)
+
+macro(deb_package_build)
+#TODO
+endmacro(deb_package_build)
+
+macro(project_package_build)
+#      if(EXISTS ${TEMPLATE_DIR})
+#              rpm_package_build()
+#      endif()
+
+       if(EXISTS ${TEMPLATE_DIR})
+               wgt_package_build()
+       endif()
+
+#      if(EXISTS ${TEMPLATE_DIR})
+#              deb_package_build()
+#      endif()
+endmacro(project_package_build)
+
+macro(project_subdirs_add)
+       set (ARGSLIST ${ARGN})
+       list(LENGTH ARGSLIST ARGSNUM)
+       if(${ARGSNUM} GREATER 0)
+               file(GLOB filelist "${ARGV0}")
+       else()
+       file(GLOB filelist "*")
+       endif()
+
+       foreach(filename ${filelist})
+               if(EXISTS "${filename}/CMakeLists.txt")
+                       add_subdirectory(${filename})
+               endif(EXISTS "${filename}/CMakeLists.txt")
+       endforeach()
+endmacro(project_subdirs_add)
+
+# Print developer helper message when build is done
+# -------------------------------------------------------
+macro(project_closing_msg)
+       get_property(PROJECT_TARGETS_SET GLOBAL PROPERTY PROJECT_TARGETS SET)
+       get_property(PROJECT_TARGETS GLOBAL PROPERTY PROJECT_TARGETS)
+       if(CLOSING_MESSAGE AND ${PROJECT_TARGETS_SET})
+               add_custom_target(${PROJECT_NAME}_build_done ALL
+                       COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --cyan "++ ${CLOSING_MESSAGE}"
+               )
+               add_dependencies(${PROJECT_NAME}_build_done
+                       ${PROJECT_TARGETS} populate)
+       endif()
+endmacro()
diff --git a/ll-database-binding/conf.d/app-templates/cmake/cmake.d/04-extra_targets.cmake b/ll-database-binding/conf.d/app-templates/cmake/cmake.d/04-extra_targets.cmake
new file mode 100644 (file)
index 0000000..3ba8f4e
--- /dev/null
@@ -0,0 +1,153 @@
+###########################################################################
+# Copyright 2015, 2016, 2017 IoT.bzh
+#
+# author: Fulup Ar Foll <fulup@iot.bzh>
+# contrib: Romain Forlot <romain.forlot@iot.bzh>
+#
+# 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.
+###########################################################################
+
+
+#--------------------------------------------------------------------------
+#  WARNING:
+#     Do not change this cmake template
+#     Customise your preferences in "./conf.d/cmake/config.cmake"
+#--------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+#                                Archive target
+# ----------------------------------------------------------------------------
+#add_custom_command(OUTPUT  ${ARCHIVE_OUTPUT}
+#      DEPENDS ${PROJECT_TARGETS}
+#      #Create git archive of the main project
+#      COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR}\; git --git-dir=${CMAKE_CURRENT_SOURCE_DIR}/.git archive --format=tar --prefix=${NPKG_PROJECT_NAME}-${PROJECT_VERSION}/ HEAD -o ${ARCHIVE_OUTPUT_ARCHIVE}
+#      #Create tmp git archive for each submodule
+#      COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR}\; git --git-dir=${CMAKE_CURRENT_SOURCE_DIR}/.git submodule foreach --recursive ${CMD_ARCHIVE_SUBMODULE}
+#      #Concatenate main archive and tmp submodule archive
+#      COMMAND  for SUBTAR in ${TMP_ARCHIVE_SUBMODULE}-*.tar\; do tar --concatenate --file=${ARCHIVE_OUTPUT_ARCHIVE} $$SUBTAR\;done
+#      #Remove tmp submodule archive
+#      COMMAND rm -rf ${TMP_ARCHIVE_SUBMODULE}-*.tar
+#      #Compress main archive
+#      COMMAND gzip --force --verbose ${ARCHIVE_OUTPUT_ARCHIVE}
+#)
+#add_custom_target(archive DEPENDS ${ARCHIVE_OUTPUT})
+
+# ----------------------------------------------------------------------------
+#                                Packaging target
+# ----------------------------------------------------------------------------
+#Format Build require package
+#foreach (PKG_CONFIG ${PKG_REQUIRED_LIST})
+#      #Unset TMP variable
+#      unset(XPREFIX)
+#      unset(XRULE)
+#      unset(RPM_EXTRA_DEP)
+#      unset(DEB_EXTRA_DEP)
+#      #For deb package,add EOL format only for a new line
+#      if(DEB_PKG_DEPS)
+#              set(DEB_PKG_DEPS "${DEB_PKG_DEPS},\n")
+#      endif()
+#      #Get pkg-config rule on version
+#      string(REGEX REPLACE "[<>]?=.*$" "" XPREFIX ${PKG_CONFIG})
+#      string(REGEX MATCH "[<>]?="  XRULE ${PKG_CONFIG})
+#      #Only if pkg-config has rule on version
+#      if(XRULE)
+#              string(REGEX REPLACE ".*[<>]?=" "" XVERS ${PKG_CONFIG})
+#              set(RPM_EXTRA_DEP " ${XRULE} ${XVERS}")
+#              set(DEB_EXTRA_DEP " (${XRULE} ${XVERS})")
+#      endif()
+#      # Format for rpm package
+#      set(RPM_PKG_DEPS "${RPM_PKG_DEPS}BuildRequires: pkgconfig(${XPREFIX})${RPM_EXTRA_DEP}\n")
+#
+#      # Format for deb package
+#      # Because the tool "dpkg" is used on the packages db to find the
+#      # package providing the pkg-cong file ${XPREFIX}.pc, we need
+#      # to test the OS release package type
+#      # Only doable within a native environment not under SDK
+#      if( OSRELEASE MATCHES "debian" AND NOT DEFINED ENV{SDKTARGETSYSROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)
+#              execute_process(
+#                      COMMAND dpkg -S *${XPREFIX}.pc
+#                                      OUTPUT_VARIABLE TMP_PKG_BIN
+#              )
+#              if(TMP_PKG_BIN)
+#                      string(REGEX REPLACE ":.*$" "" PKG_BIN ${TMP_PKG_BIN})
+#                      set(DEB_PKG_DEPS "${DEB_PKG_DEPS} ${PKG_BIN} ${DEB_EXTRA_DEP}")
+#              else()
+#                      message(FATAL_ERROR "-- ${Red}${XPREFIX} development files not installed. Abort.${ColourReset}")
+#              endif()
+#      endif()
+#endforeach()
+#
+#if(NOT EXISTS ${TEMPLATE_DIR}/rpm-config.spec.in)
+#      MESSAGE(FATAL_ERROR "${Red}Missing mandatory files: you need rpm-config.spec.in in ${TEMPLATE_DIR} folder.${ColourReset}")
+#endif()
+#
+## Because the tool "dpkg" is used on the packages db to find the
+## package providing the pkg-cong file ${XPREFIX}.pc, we need
+## to test the OS release package type
+## Only doable within a native environment not under SDK
+#if(OSRELEASE MATCHES "debian" AND NOT DEFINED ENV{SDKTARGETSYSROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)
+#      add_custom_target(packaging_deb DEPENDS ${TEMPLATE_DIR}/debian.compat.in
+#                              ${TEMPLATE_DIR}/debian.changelog.in
+#                              ${TEMPLATE_DIR}/deb-config.dsc.in
+#                              ${TEMPLATE_DIR}/deb-config.install.in
+#                              ${TEMPLATE_DIR}/debian.control.in
+#                              ${TEMPLATE_DIR}/debian.rules.in
+#              COMMAND ${CMAKE_COMMAND} -DINFILE=${TEMPLATE_DIR}/debian.compat.in              -DOUTFILE=${PACKAGING_DEB_OUTPUT_COMPAT}        -DPROJECT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}        -P      ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_APP_TEMPLATES_DIR}/cmake/configure_file.cmake
+#              COMMAND ${CMAKE_COMMAND} -DINFILE=${TEMPLATE_DIR}/debian.changelog.in   -DOUTFILE=${PACKAGING_DEB_OUTPUT_CHANGELOG}     -DPROJECT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}        -P      ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_APP_TEMPLATES_DIR}/cmake/configure_file.cmake
+#              COMMAND ${CMAKE_COMMAND} -DINFILE=${TEMPLATE_DIR}/deb-config.dsc.in             -DOUTFILE=${PACKAGING_DEB_OUTPUT_DSC}           -DPROJECT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}        -P      ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_APP_TEMPLATES_DIR}/cmake/configure_file.cmake
+#              COMMAND ${CMAKE_COMMAND} -DINFILE=${TEMPLATE_DIR}/deb-config.install.in -DOUTFILE=${PACKAGING_DEB_OUTPUT_INSTALL}       -DPROJECT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}        -P      ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_APP_TEMPLATES_DIR}/cmake/configure_file.cmake
+#              COMMAND ${CMAKE_COMMAND} -DINFILE=${TEMPLATE_DIR}/debian.control.in             -DOUTFILE=${PACKAGING_DEB_OUTPUT_CONTROL}       -DPROJECT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}        -P      ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_APP_TEMPLATES_DIR}/cmake/configure_file.cmake
+#              COMMAND ${CMAKE_COMMAND} -DINFILE=${TEMPLATE_DIR}/debian.rules.in               -DOUTFILE=${PACKAGING_DEB_OUTPUT_RULES}         -DPROJECT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}        -P      ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_APP_TEMPLATES_DIR}/cmake/configure_file.cmake
+#      )
+#endif()
+#
+#add_custom_target(packaging)
+#set(PACKAGING_SPEC_OUTPUT ${PROJECT_PKG_ENTRY_POINT}/${NPKG_PROJECT_NAME}.spec)
+#add_custom_target(packaging_rpm DEPENDS ${TEMPLATE_DIR}/rpm-config.spec.in
+#      COMMAND ${CMAKE_COMMAND} -DINFILE=${TEMPLATE_DIR}/rpm-config.spec.in -DOUTFILE=${PACKAGING_SPEC_OUTPUT} -DPROJECT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_APP_TEMPLATES_DIR}/cmake/configure_file.cmake
+#)
+#add_dependencies(packaging packaging_rpm)
+#if(TARGET packaging_wgt)
+#      add_dependencies(packaging packaging_wgt)
+#endif()
+#if(OSRELEASE MATCHES "debian" AND NOT DEFINED ENV{SDKTARGETSYSROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)
+#      # Target to add dependencies indirectly to "packaging" target.
+#      add_dependencies(packaging packaging_deb)
+#endif()
+
+#Generate a cmake cache file usable by cmake script.
+set(CacheForScript ${CMAKE_BINARY_DIR}/CMakeCacheForScript.cmake)
+#Create a tmp cmake file.
+file(WRITE ${CacheForScript} "")
+
+get_cmake_property(Vars VARIABLES)
+foreach(Var ${Vars})
+       if(${Var})
+               #Replace unwanted char.
+               string(REPLACE "\\" "\\\\" VALUE ${${Var}})
+               string(REPLACE "\n" "\\n" VALUE ${VALUE})
+               string(REPLACE "\r" "\\n" VALUE ${VALUE})
+               string(REPLACE "\"" "\\\"" VALUE ${VALUE})
+       endif()
+       file(APPEND ${CacheForScript} "set(${Var} \"${VALUE}\")\n")
+endforeach()
+
+# ----------------------------------------------------------------------------
+#                                Autobuild target
+# ----------------------------------------------------------------------------
+
+add_custom_target(autobuild ALL DEPENDS ${CMAKE_SOURCE_DIR}/${PROJECT_APP_TEMPLATES_DIR}/template.d/autobuild/agl/autobuild.in
+       ${CMAKE_SOURCE_DIR}/${PROJECT_APP_TEMPLATES_DIR}/template.d/autobuild/linux/autobuild.in
+       COMMAND ${CMAKE_COMMAND} -DINFILE=${CMAKE_SOURCE_DIR}/${PROJECT_APP_TEMPLATES_DIR}/template.d/autobuild/agl/autobuild.in -DOUTFILE=${PROJECT_TEMPLATE_AGL_AUTOBUILD_DIR}/autobuild -DPROJECT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_APP_TEMPLATES_DIR}/cmake/configure_file.cmake
+       COMMAND ${CMAKE_COMMAND} -DINFILE=${CMAKE_SOURCE_DIR}/${PROJECT_APP_TEMPLATES_DIR}/template.d/autobuild/agl/autobuild.in -DOUTFILE=${PROJECT_TEMPLATE_LINUX_AUTOBUILD_DIR}/autobuild -DPROJECT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_APP_TEMPLATES_DIR}/cmake/configure_file.cmake
+)
diff --git a/ll-database-binding/conf.d/app-templates/cmake/common.cmake b/ll-database-binding/conf.d/app-templates/cmake/common.cmake
new file mode 100644 (file)
index 0000000..041bb74
--- /dev/null
@@ -0,0 +1,90 @@
+###########################################################################
+# Copyright 2015, 2016, 2017 IoT.bzh
+#
+# author: Fulup Ar Foll <fulup@iot.bzh>
+# contrib: Romain Forlot <romain.forlot@iot.bzh>
+#
+# 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.
+###########################################################################
+
+
+#--------------------------------------------------------------------------
+#  WARNING:
+#     Do not change this cmake template
+#     Customise your preferences in "./conf.d/cmake/config.cmake"
+#--------------------------------------------------------------------------
+
+if(DEFINED ENV{SDKTARGETSYSROOT})
+file(STRINGS $ENV{SDKTARGETSYSROOT}/usr/include/linux/version.h LINUX_VERSION_CODE_LINE REGEX "LINUX_VERSION_CODE")
+set(BUILD_ENV_SYSROOT $ENV{SDKTARGETSYSROOT})
+elseif(DEFINED ENV{PKG_CONFIG_SYSROOT_DIR})
+file(STRINGS $ENV{PKG_CONFIG_SYSROOT_DIR}/usr/include/linux/version.h LINUX_VERSION_CODE_LINE REGEX "LINUX_VERSION_CODE")
+set(BUILD_ENV_SYSROOT $ENV{PKG_CONFIG_SYSROOT_DIR})
+else()
+file(STRINGS /usr/include/linux/version.h LINUX_VERSION_CODE_LINE REGEX "LINUX_VERSION_CODE")
+set(BUILD_ENV_SYSROOT "")
+endif()
+
+# Get the os type
+# Used to package .deb
+set(OS_RELEASE_PATH "${BUILD_ENV_SYSROOT}/etc/os-release")
+if(EXISTS ${OS_RELEASE_PATH})
+       execute_process(COMMAND bash "-c" "grep -E '^ID(_LIKE)?=' ${OS_RELEASE_PATH} | tail -n 1"
+               OUTPUT_VARIABLE TMP_OSRELEASE
+       )
+
+       if (NOT TMP_OSRELEASE STREQUAL "")
+               string(REGEX REPLACE ".*=\"?([0-9a-z\._-]*)\"?\n" "\\1" OSRELEASE ${TMP_OSRELEASE})
+       else()
+               set(OSRELEASE "NOT COMPATIBLE !")
+       endif()
+
+else()
+       set(OSRELEASE "NOT COMPATIBLE ! Missing ${OS_RELEASE_PATH} file.")
+endif()
+message(STATUS "Distribution used ${OSRELEASE}")
+
+file(GLOB project_cmakefiles ${PROJECT_APP_TEMPLATES_DIR}/cmake/cmake.d/[0-9][0-9]-*.cmake)
+file(GLOB distro_cmakefiles ${PROJECT_APP_TEMPLATES_DIR}/../cmake/[0-9][0-9]-${OSRELEASE}*.cmake ${PROJECT_APP_TEMPLATES_DIR}/../cmake/[0-9][0-9]-common*.cmake)
+list(SORT distro_cmakefiles)
+if(NOT distro_cmakefiles)
+       file(GLOB distro_cmakefiles ${PROJECT_APP_TEMPLATES_DIR}/../cmake/[0-9][0-9]-default*.cmake)
+endif()
+
+list(APPEND project_cmakefiles "${distro_cmakefiles}")
+list(SORT project_cmakefiles)
+
+file(GLOB home_cmakefiles $ENV{HOME}/.config/app-templates/cmake.d/[0-9][0-9]-common*.cmake $ENV{HOME}/.config/app-templates/cmake.d/[0-9][0-9]-${PROJECT_NAME}*.cmake)
+list(SORT home_cmakefiles)
+file(GLOB system_cmakefiles /etc/app-templates/cmake.d/[0-9][0-9]-common*.cmake /etc/app-templates/cmake.d/[0-9][0-9]-${PROJECT_NAME}*.cmake)
+list(SORT system_cmakefiles)
+
+foreach(file ${system_cmakefiles} ${home_cmakefiles} ${project_cmakefiles})
+       message(STATUS "Include: ${file}")
+       include(${file})
+endforeach()
+
+if(DEFINED PROJECT_SRC_DIR_PATTERN)
+       project_subdirs_add(${PROJECT_SRC_DIR_PATTERN})
+else()
+       project_subdirs_add()
+endif(DEFINED PROJECT_SRC_DIR_PATTERN)
+
+configure_files_in_dir(${PROJECT_APP_TEMPLATES_DIR}/${ENTRY_POINT}/template.d)
+configure_files_in_dir($ENV{HOME}/.config/app-templates/scripts)
+configure_files_in_dir(/etc/app-templates/scripts)
+
+project_targets_populate()
+remote_targets_populate()
+project_package_build()
+project_closing_msg()
diff --git a/ll-database-binding/conf.d/app-templates/cmake/configure_file.cmake b/ll-database-binding/conf.d/app-templates/cmake/configure_file.cmake
new file mode 100644 (file)
index 0000000..2028388
--- /dev/null
@@ -0,0 +1,2 @@
+include(${CMAKE_BINARY_DIR}/CMakeCacheForScript.cmake)
+configure_file(${INFILE} ${OUTFILE} @ONLY)
diff --git a/ll-database-binding/conf.d/app-templates/docs/0-Doc-Revisions.md b/ll-database-binding/conf.d/app-templates/docs/0-Doc-Revisions.md
new file mode 100644 (file)
index 0000000..38b6e74
--- /dev/null
@@ -0,0 +1,6 @@
+Document revisions
+==================
+
+| Date        | Version | Designation                          | Author                  |
+|-------------|---------|--------------------------------------|-------------------------|
+| 4 Jul 2017  |   1.0   | Initial release                      | R. Forlot   [ Iot.bzh ] |
diff --git a/ll-database-binding/conf.d/app-templates/docs/README.md b/ll-database-binding/conf.d/app-templates/docs/README.md
new file mode 100644 (file)
index 0000000..39f9209
--- /dev/null
@@ -0,0 +1,22 @@
+# Introduction
+
+This document explain how to use the CMake templates files and associated
+files to ease developement of AGL application.
+
+<br>
+<br>
+<br>
+<br>
+<br>
+
+| *Meta* | *Data* |
+| -- | -- |
+| **Title** | {{ config.title }} |
+| **Author** | {{ config.author }} |
+| **Description** | {{ config.description }} |
+| **Keywords** | {{ config.keywords }} |
+| **Language** | English |
+| **Published** | Published {{ config.published }} as an electronic book |
+| **Updated** | {{ gitbook.time }} |
+| **Collection** | Open-source |
+| **Website** | [{{ config.website }}]({{ config.website }}) |
diff --git a/ll-database-binding/conf.d/app-templates/docs/SUMMARY.md b/ll-database-binding/conf.d/app-templates/docs/SUMMARY.md
new file mode 100644 (file)
index 0000000..f475678
--- /dev/null
@@ -0,0 +1,10 @@
+# Summary
+
+* [Document revisions](0-Doc-Revisions.md)
+
+* [Developper guide](dev_guide/0_Abstract.md)
+  * [Quickstart](dev_guide/1_Quickstart.md)
+  * [Project architecture](dev_guide/2_project_architecture.md)
+  * [Advanced usage](dev_guide/3_advanced_usage.md)
+  * [Customization](dev_guide/4_advanced_customization.md)
+  * [Autobuild](dev_guide/5_autobuild.md)
diff --git a/ll-database-binding/conf.d/app-templates/docs/_layouts/ebook/page.html b/ll-database-binding/conf.d/app-templates/docs/_layouts/ebook/page.html
new file mode 100644 (file)
index 0000000..bf325e9
--- /dev/null
@@ -0,0 +1,36 @@
+{% extends "layout.html" %}
+
+{% block title %}{{ page.title }}{% endblock %}
+{% block description %}{{ page.description }}{% endblock %}
+
+{% block style %}
+    {### Include theme css before plugins css ###}
+    {% if not fileExists(config.styles.print) %}
+        {% if options.format %}
+        <link rel="stylesheet" href="{{ (options.format + ".css")|resolveAsset }}">
+        {% else %}
+        <link rel="stylesheet" href="{{ "ebook.css"|resolveAsset }}">
+        {% endif %}
+    {% endif %}
+
+    {{ super() }}
+
+    {### Custom stylesheets for the book ###}
+
+    {% for type, style in config.styles %}
+        {% if fileExists(style) and (type == "ebook" or type == "print" or type == options.format) %}
+        <link rel="stylesheet" href="{{ style|resolveFile }}">
+        {% endif %}
+    {% endfor %}
+{% endblock %}
+
+{% block body %}
+<div class="page">
+    {% block page %}
+        <h1 class="book-chapter book-chapter-{{ page.depth }}">{{ page.title }}</h1>
+        <div class="section">
+            {{ page.content|safe }}
+        </div>
+    {% endblock %}
+</div>
+{% endblock %}
diff --git a/ll-database-binding/conf.d/app-templates/docs/_layouts/ebook/pdf_footer.html b/ll-database-binding/conf.d/app-templates/docs/_layouts/ebook/pdf_footer.html
new file mode 100644 (file)
index 0000000..679e562
--- /dev/null
@@ -0,0 +1,13 @@
+{% extends "./page.html" %}
+{% block body %}
+<div id="pdf-footer" class="pdf-footer">
+    <span class="footer-left">Version {{ config.version }}</span>
+    <span class="footer-right">{{ page.num }}</span>
+    <span class="footer-center">{{ config.published }}</span>
+</div>
+
+<!-- Allow to hide footer for some pages using hidepagefooters config in book.json -->
+<script>
+    if (({% for num in config.hidepagefooters %}{{ page.num }} == {{ num }} || {% endfor %}false)) document.getElementById('pdf-footer').style.display = 'none'
+</script>
+{% endblock %}
diff --git a/ll-database-binding/conf.d/app-templates/docs/_layouts/ebook/pdf_header.html b/ll-database-binding/conf.d/app-templates/docs/_layouts/ebook/pdf_header.html
new file mode 100644 (file)
index 0000000..ef49641
--- /dev/null
@@ -0,0 +1,13 @@
+{% extends "./page.html" %}
+{% block body %}
+<div id="pdf-header" class="pdf-header">
+    <span class="header-left">IoT.Bzh</span>
+    <span class="header-right">{{ config.title }}</span>
+</div>
+
+<!-- Allow to hide header for some pages using hidepageheaders config in book.json -->
+<script>
+    if (({% for num in config.hidepageheaders %}{{ page.num }} == {{ num }} || {% endfor %}false)) document.getElementById('pdf-header').style.display = 'none'
+</script>
+
+{% endblock %}
\ No newline at end of file
diff --git a/ll-database-binding/conf.d/app-templates/docs/_layouts/ebook/summary.html b/ll-database-binding/conf.d/app-templates/docs/_layouts/ebook/summary.html
new file mode 100644 (file)
index 0000000..be328a4
--- /dev/null
@@ -0,0 +1,58 @@
+{% extends "./page.html" %}
+
+{% block title %}{{ "SUMMARY"|t }}{% endblock %}
+
+{% macro articles(_articles) %}
+    {% for article in _articles %}
+        <li>
+            <span class="inner">
+                {% if article.path or article.url %}
+                    {% if article.path %}
+                        <a href="{{ article.path|contentURL }}{{ article.anchor }}">{{ article.title }}</a>
+                    {% else %}
+                        <a target="_blank" href="{{ article.url }}">{{ article.title }}</a>
+                    {% endif %}
+                {% else %}
+                    <span>{{ article.title }}</span>
+                {% endif %}
+                {% if 1 %}
+                <span class="page">{{ article.level }}</span>
+                {% endif %}
+            </span>
+            {% if article.articles.length > 0 %}
+            <ol>
+                {{ articles(article.articles) }}
+            </ol>
+            {% endif %}
+        </li>
+    {% endfor %}
+{% endmacro %}
+
+{% block page %}
+<div class="section toc">
+    <h1>{{ "SUMMARY"|t }}</h1>
+    <ol>
+        {% for part in summary.parts %}
+            {% if part.title %}
+            <li class="part-title">
+                <h2>{{ part.title }}</h2>
+            </li>
+            {% endif %}
+            {{ articles(part.articles) }}
+
+            {% if not loop.last %}
+            <li class="divider"></li>
+            {% endif %}
+        {% endfor %}
+
+        {% if glossary.path %}
+        <li>
+            <span class="inner">
+                <a href="{{ ('/' + glossary.path)|contentURL }}">{{ "GLOSSARY"|t }}</a>
+            </span>
+        </li>
+        {% endif %}
+    </ol>
+</div>
+{% endblock %}
+
diff --git a/ll-database-binding/conf.d/app-templates/docs/_layouts/layout.html b/ll-database-binding/conf.d/app-templates/docs/_layouts/layout.html
new file mode 100644 (file)
index 0000000..3d5aca6
--- /dev/null
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML>
+<html lang="{{ config.language }}" {% if page.dir == "rtl" %}dir="rtl"{% endif %}>
+    <head>
+        <meta charset="UTF-8">
+        <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+        <title>{% block title %}{{ config.title|d("GitBook", true) }}{% endblock %}</title>
+        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+        <meta name="description" content="{% block description %}{% endblock %}">
+        <meta name="generator" content="GitBook {{ gitbook.version }}">
+        {% if config.author %}<meta name="author" content="{{ config.author }}">{% endif %}
+        {% if config.isbn %}<meta name="identifier" content="{{ config.isbn }}" scheme="ISBN">{% endif %}
+        {% block style %}
+            {% for resource in plugins.resources.css %}
+                {% if resource.url %}
+                <link rel="stylesheet" href="{{ resource.url }}">
+                {% else %}
+                <link rel="stylesheet" href="{{ resource.path|resolveAsset }}">
+                {% endif %}
+            {% endfor %}
+        {% endblock %}
+
+        {% block head %}{% endblock %}
+    </head>
+    <body>
+        {% block body %}{% endblock %}
+        {% block javascript %}{% endblock %}
+    </body>
+</html>
diff --git a/ll-database-binding/conf.d/app-templates/docs/cover.jpg b/ll-database-binding/conf.d/app-templates/docs/cover.jpg
new file mode 100644 (file)
index 0000000..4e04b0c
Binary files /dev/null and b/ll-database-binding/conf.d/app-templates/docs/cover.jpg differ
diff --git a/ll-database-binding/conf.d/app-templates/docs/cover_small.jpg b/ll-database-binding/conf.d/app-templates/docs/cover_small.jpg
new file mode 100644 (file)
index 0000000..315816b
Binary files /dev/null and b/ll-database-binding/conf.d/app-templates/docs/cover_small.jpg differ
diff --git a/ll-database-binding/conf.d/app-templates/docs/dev_guide/0_Abstract.md b/ll-database-binding/conf.d/app-templates/docs/dev_guide/0_Abstract.md
new file mode 100644 (file)
index 0000000..a04cc87
--- /dev/null
@@ -0,0 +1,21 @@
+# Developper Guide: use AGL CMake Templates
+
+## Abstract
+
+Files used to build an application, or binding, project with the
+AGL Application Framework.
+
+To build your AGL project using these templates, you have to install
+them within your project and adjust compilation option in `config.cmake`.
+For technical reasons, you also have to specify **cmake** target in
+sub CMakeLists.txt installed. Make a globbing search to find source files
+isn't recommended now to handle project build especially in a multiuser
+project because CMake will not be aware of new or removed source files.
+
+You'll find usage samples here:
+
+- [helloworld-service](https://github.com/iotbzh/helloworld-service)
+- [low-level-can-service](https://gerrit.automotivelinux.org/gerrit/apps/low-level-can-service)
+- [high-level-viwi-service](https://github.com/iotbzh/high-level-viwi-service)
+- [audio-binding](https://github.com/iotbzh/audio-binding)
+- [unicens2-binding](https://github.com/iotbzh/unicens2-binding)
diff --git a/ll-database-binding/conf.d/app-templates/docs/dev_guide/1_Quickstart.md b/ll-database-binding/conf.d/app-templates/docs/dev_guide/1_Quickstart.md
new file mode 100644 (file)
index 0000000..6db1ef2
--- /dev/null
@@ -0,0 +1,84 @@
+# Quickstart
+
+## Initialization
+
+To use these templates files on your project just install the reference files using
+**git submodule** then use `config.cmake` file to configure your project specificities :
+
+```bash
+git submodule add https://gerrit.automotivelinux.org/gerrit/apps/app-templatesconf.d/app-templates conf.d/app-templates
+mkdir conf.d/cmake
+cp conf.d/app-templates/cmake/config.cmake.sample conf.d/cmake/config.cmake
+```
+
+Edit the copied config.cmake file to fit your needs.
+
+Now, create your top CMakeLists.txt file which include `config.cmake` file.
+
+An example is available in **app-templates** submodule that you can copy and
+use:
+
+```bash
+cp conf.d/app-templates/cmake/CMakeLists.txt CMakeLists.txt
+```
+
+## Create your CMake targets
+
+For each target part of your project, you need to use ***PROJECT_TARGET_ADD***
+to include this target to your project.
+
+Using it, make available the cmake variable ***TARGET_NAME*** until the next
+***PROJECT_TARGET_ADD*** is invoked with a new target name.
+
+So, typical usage defining a target is:
+
+```cmake
+PROJECT_TARGET_ADD(SuperExampleName) --> Adding target to your project
+
+add_executable/add_library(${TARGET_NAME}.... --> defining your target sources
+
+SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES.... --> fit target properties
+for macros usage
+
+INSTALL(TARGETS ${TARGET_NAME}....
+```
+
+## Targets PROPERTIES
+
+You should set properties on your targets that will be used to package your
+apps in a widget file that could be installed on an AGL system.
+
+Specify what is the type of your targets that you want to be included in the
+widget package with the property **LABELS**:
+
+Choose between:
+
+- **BINDING**: Shared library that be loaded by the AGL Application Framework
+- **BINDINGV2**: Shared library that be loaded by the AGL Application Framework.
+ This has to be accompagnied with a JSON file named like the *${OUTPUT_NAME}-apidef* of
+ the target that describe the API with OpenAPI syntax (e.g: *mybinding-apidef*).
+ Or you can choose the name by setting the *CACHE* cmake variable *OPENAPI_DEF*
+ (***CAUTION***: setting a CACHE variable is needed, or set a normal variable
+ with the *PARENT_SCOPE* option to make it visible for the parent scope
+ where the target is defined) JSON file will be used to generate header file
+ using `afb-genskel` tool.
+- **HTDOCS**: Root directory of a web app. This target has to build its
+ directory and puts its files in the ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}
+- **DATA**: Resources used by your application. This target has to build its
+ directory and puts its files in the ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}
+- **EXECUTABLE**: Entry point of your application executed by the AGL
+ Application Framework
+
+> **TIP** you should use the prefix _afb-_ with your **BINDING* targets which
+> stand for **Application Framework Binding**.
+
+```cmake
+SET_TARGET_PROPERTIES(${TARGET_NAME}
+       PREFIX "afb-"
+       LABELS "BINDING"
+       OUTPUT_NAME "file_output_name")
+```
+
+> **NOTE**: You doesn't need to specify an **INSTALL** command for these
+> targets. This is already handle by template and will be installed in the
+> following path : **${CMAKE_INSTALL_PREFIX}/${PROJECT_NAME}**
diff --git a/ll-database-binding/conf.d/app-templates/docs/dev_guide/2_project_architecture.md b/ll-database-binding/conf.d/app-templates/docs/dev_guide/2_project_architecture.md
new file mode 100644 (file)
index 0000000..0cae607
--- /dev/null
@@ -0,0 +1,98 @@
+# Project architecture
+
+A typical project architecture would be :
+
+```tree
+<project-root-path>
+│
+├── conf.d/
+│   ├── autobuild/
+│   │   ├── agl
+│   │   │   └── autobuild
+│   │   ├── linux
+│   │   │   └── autobuild
+│   │   └── windows
+│   │       └── autobuild
+│   ├── app-templates/
+│   │   ├── README.md
+│   │   ├── autobuild/
+│   │   │   ├── agl
+│   │   │   │   └── autobuild.in
+│   │   │   ├── linux
+│   │   │   │   └── autobuild.in
+│   │   │   └── windows
+│   │   │       └── autobuild.in
+│   │   ├── cmake/
+│   │   │   ├── config.cmake.sample
+│   │   │   ├── export.map
+│   │   │   └── macros.cmake
+│   │   ├── deb/
+│   │   │   └── config.deb.in
+│   │   ├── rpm/
+│   │   │   └── config.spec.in
+│   │   └── wgt/
+│   │       ├── config.xml.in
+│   │       ├── config.xml.in.sample
+│   │       ├── icon-default.png
+│   │       ├── icon-html5.png
+│   │       ├── icon-native.png
+│   │       ├── icon-qml.png
+│   │       └── icon-service.png
+│   ├── packaging/
+│   │   ├── config.spec
+│   │   └── config.deb
+│   ├── cmake
+│   │   └── config.cmake
+│   └── wgt
+│      └── config.xml.in
+├── <libs>
+├── <target>
+│   └── <files>
+├── <target>
+│   └── <file>
+└── <target>
+    └── <files>
+```
+
+| # | Parent | Description |
+| - | -------| ----------- |
+| \<root-path\> | - | Path to your project. Hold master CMakeLists.txt and general files of your projects. |
+| conf.d | \<root-path\> | Holds needed files to build, install, debug, package an AGL app project |
+| app-templates | conf.d | Git submodule to app-templates AGL repository which provides CMake helpers macros library, and build scripts. config.cmake is a copy of config.cmake.sample configured for the projects. SHOULD NOT BE MODIFIED MANUALLY !|
+| autobuild | conf.d | Scripts generated from app-templates to build packages the same way for differents platforms.|
+| cmake | conf.d | Contains at least config.cmake file modified from the sample provided in app-templates submodule. |
+| wgt | conf.d | Contains at least config.xml.in template file modified from the sample provided in app-templates submodule for the needs of project (See config.xml.in.sample file for more details). |
+| packaging | conf.d | Contains output files used to build packages. |
+| \<libs\> | \<root-path\> | External dependencies libraries. This isn't to be used to include header file but build and link statically specifics libraries. | Library sources files. Can be a decompressed library archive file or project fork. |
+| \<target\> | \<root-path\> | A target to build, typically library, executable, etc. |
+
+## Manage app-templates submodule
+
+### Update
+
+You may have some news bug fixes or features available from app-templates
+repository that you want. To update your submodule proceed like the following:
+
+```bash
+git submodule update --remote
+git commit -s conf.d/app-templates
+```
+
+This will update the submodule to the HEAD of master branch repository. Save
+the modification by commiting it in your master git project.
+
+### Checkout submodule to a git tag
+
+You could just want to update at a specified repository tag or branch or commit
+, here are the method to do so:
+
+```bash
+cd conf.d/app-templates
+# Choose one of the following depending what you want
+git checkout <tag_name>
+git checkout --detach <branch_name>
+git checkout --detach <commit_id>
+# Then commit
+cd ../..
+git commit -s conf.d/app-templates
+```
diff --git a/ll-database-binding/conf.d/app-templates/docs/dev_guide/3_advanced_usage.md b/ll-database-binding/conf.d/app-templates/docs/dev_guide/3_advanced_usage.md
new file mode 100644 (file)
index 0000000..f9d9e90
--- /dev/null
@@ -0,0 +1,101 @@
+# Build a widget
+
+## config.xml.in file
+
+To build a widget you need a _config.xml_ file describing what is your apps and
+how Application Framework would launch it. This repo provide a simple default
+file _config.xml.in_ that should work for simple application without
+interactions with others bindings.
+
+It is recommanded that you use the sample one which is more complete. You can
+find it at the same location under the name _config.xml.in.sample_ (stunning
+isn't it). Just copy the sample file to your _conf.d/wgt_ directory and name it
+_config.xml.in_, then edit it to fit your needs.
+
+> ***CAUTION*** : The default file is only meant to be use for a
+> simple widget app, more complicated ones which needed to export
+> their api, or ship several app in one widget need to use the provided
+> _config.xml.in.sample_ which had all new Application Framework
+> features explained and examples.
+
+## Using cmake template macros
+
+To leverage all cmake templates features, you have to specify ***properties***
+on your targets. Some macros will not works without specifying which is the
+target type.
+
+As the type is not always specified for some custom targets, like an ***HTML5***
+application, macros make the difference using ***LABELS*** property.
+
+Choose between:
+
+- **BINDING**: Shared library that be loaded by the AGL Application Framework
+- **BINDINGV2**: Shared library that be loaded by the AGL Application Framework.
+ This has to be accompagnied with a JSON file named like the *${OUTPUT_NAME}-apidef* of
+ the target that describe the API with OpenAPI syntax (e.g: *mybinding-apidef*).
+ Or you can choose the name by setting the *CACHE* cmake variable *OPENAPI_DEF*
+ (***CAUTION***: setting a CACHE variable is needed, or set a normal variable
+ with the *PARENT_SCOPE* option to make it visible for the parent scope
+ where the target is defined) JSON file will be used to generate header file
+ using `afb-genskel` tool.
+- **HTDOCS**: Root directory of a web app. This target has to build its
+ directory and puts its files in the ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}
+- **DATA**: Resources used by your application. This target has to build its
+ directory and puts its files in the ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}
+- **EXECUTABLE**: Entry point of your application executed by the AGL
+ Application Framework
+
+> **TIP** you should use the prefix _afb-_ with your **BINDING* targets which
+> stand for **Application Framework Binding**.
+
+Example:
+
+```cmake
+SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES
+               LABELS "HTDOCS"
+               OUTPUT_NAME dist.prod
+       )
+```
+
+> **NOTE**: You doesn't need to specify an **INSTALL** command for these
+> targets. This is already handle by template and will be installed in the
+> following path : **${CMAKE_INSTALL_PREFIX}/${PROJECT_NAME}**
+
+## Macro reference
+
+### PROJECT_TARGET_ADD
+
+Typical usage would be to add the target to your project using macro
+`PROJECT_TARGET_ADD` with the name of your target as parameter.
+
+Example:
+
+```cmake
+PROJECT_TARGET_ADD(low-can-demo)
+```
+
+> ***NOTE***: This will make available the variable `${TARGET_NAME}`
+> set with the specificied name. This variable will change at the next call
+> to this macros.
+
+### project_subdirs_add
+
+This macro will search in all subfolder any `CMakeLists.txt` file. If found then
+it will be added to your project. This could be use in an hybrid application by
+example where the binding lay in a sub directory.
+
+Usage :
+
+```cmake
+project_subdirs_add()
+```
+
+You also can specify a globbing pattern as argument to filter which folders
+will be looked for.
+
+To filter all directories that begin with a number followed by a dash the
+anything:
+
+```cmake
+project_subdirs_add("[0-9]-*")
+```
diff --git a/ll-database-binding/conf.d/app-templates/docs/dev_guide/4_advanced_customization.md b/ll-database-binding/conf.d/app-templates/docs/dev_guide/4_advanced_customization.md
new file mode 100644 (file)
index 0000000..a9974a8
--- /dev/null
@@ -0,0 +1,61 @@
+# Advanced customization
+
+## Including additionnals cmake files
+
+### Machine and system custom cmake files
+
+Advanced tuning is possible using addionnals cmake files that are included
+automatically from some specifics locations. They are included in that order:
+
+- Project CMake files normaly located in _<project-root-path>/conf.d/app-templates/cmake/cmake.d_
+- Home CMake files located in _$HOME/.config/app-templates/cmake.d_
+- System CMake files located in _/etc/app-templates/cmake.d_
+
+CMake files has to be named using the following convention: `XX-common*.cmake`
+or `XX-${PROJECT_NAME}*.cmake`, where `XX` are numbers, `*` file name
+(ie. `99-common-my_customs.cmake`).
+
+> **NOTE** You need to specify after numbers that indicate include order, to
+which project that file applies, if it applies to all project then use keyword
+`common`.
+
+So, saying that you should be aware that every normal cmake variables used at
+project level could be overwrited by home or system located cmake files if
+variables got the same name. Exceptions are cached variables set using
+**CACHE** keyword:
+
+Example:
+
+```cmake
+set(VARIABLE_NAME 'value string random' CACHE STRING 'docstring')
+```
+
+### OS custom cmake files
+
+This is meant to personalize the project depending on the OS your are using.
+At the end of config.cmake, common.cmake will include lot of cmake file to
+customize project build depending on your plateform. It will detect your OS
+deducing it from file _/etc/os-release_ now as default in almost all Linux
+distribution.
+
+So you can use the value of field **ID_LIKE** or **ID** if the
+first one doesn't exists and add a cmake file for that distribution in your
+_conf.d/cmake/_ directory or relatively to your _app-templates_ submodule path
+_app-templates/../cmake/_
+
+Those files has to be named use the following scheme _XX-${OSRELEASE}*.cmake_
+where _XX_ are numbers, ${OSRELEASE} the **ID_LIKE** or **ID** field from
+_/etc/os-release_ file.
+
+## Include customs templated scripts
+
+As well as for additionnals cmake files you can include your own templated
+scripts that will be passed to cmake command `configure_file`.
+
+Just create your own script to the following directories:
+
+- Home location in _$HOME/.config/app-templates/scripts_
+- System location in _/etc/app-templates/scripts_
+
+Scripts only needs to use the extension `.in` to be parsed and configured by
+CMake command.
diff --git a/ll-database-binding/conf.d/app-templates/docs/dev_guide/5_autobuild.md b/ll-database-binding/conf.d/app-templates/docs/dev_guide/5_autobuild.md
new file mode 100644 (file)
index 0000000..fe1c63d
--- /dev/null
@@ -0,0 +1,41 @@
+# Autobuild script usage
+
+## Generation
+
+To be integrated in the Yocto build workflow you have to generate `autobuild`
+scripts using _autobuild_ target.
+
+To generate those scripts proceeds:
+
+```bash
+mkdir -p build
+cd build
+cmake .. && make autobuild
+```
+
+You should see _conf.d/autobuild/agl/autobuild_ file now.
+
+## Available targets
+
+Here are the available targets available from _autobuild_ scripts:
+
+- **clean** : clean build directory from object file and targets results.
+- **distclean** : delete build directory
+- **configure** : generate project Makefile from CMakeLists.txt files.
+- **build** : compile all project targets.
+- **package** : build and output a wgt package.
+
+You can specify variables that modify the behavior of compilation using
+the following variables:
+
+- **CONFIGURE_ARGS** : Variable used at **configure** time.
+- **BUILD_ARGS** : Variable used at **build** time.
+- **DEST** : Directory where to output ***wgt*** file.
+
+Variable as to be in CMake format. (ie: BUILD_ARGS="-DC_FLAGS='-g -O2'")
+
+Usage example:
+
+```bash
+./conf.d/autobuild/wgt/autobuild package DEST=/tmp
+```
diff --git a/ll-database-binding/conf.d/app-templates/docs/dev_guide/pictures/iotbzh_logo_small.png b/ll-database-binding/conf.d/app-templates/docs/dev_guide/pictures/iotbzh_logo_small.png
new file mode 100644 (file)
index 0000000..6a98c60
Binary files /dev/null and b/ll-database-binding/conf.d/app-templates/docs/dev_guide/pictures/iotbzh_logo_small.png differ
diff --git a/ll-database-binding/conf.d/app-templates/docs/resources/cover.svg b/ll-database-binding/conf.d/app-templates/docs/resources/cover.svg
new file mode 100644 (file)
index 0000000..6726de7
--- /dev/null
@@ -0,0 +1,210 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="1800"
+   height="2360"
+   viewBox="0 0 1800 2360"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="cover.svg">
+  <defs
+     id="defs4175">
+    <filter
+       style="color-interpolation-filters:sRGB"
+       inkscape:label="Drop Shadow"
+       id="filter4000">
+      <feFlood
+         result="flood"
+         flood-color="rgb(0,0,0)"
+         flood-opacity="0.475"
+         id="feFlood4002" />
+      <feComposite
+         result="composite1"
+         operator="in"
+         in="flood"
+         in2="SourceGraphic"
+         id="feComposite4004" />
+      <feGaussianBlur
+         result="blur"
+         stdDeviation="5"
+         id="feGaussianBlur4006" />
+      <feOffset
+         result="offset"
+         dy="8"
+         dx="8"
+         id="feOffset4008" />
+      <feComposite
+         result="composite2"
+         operator="over"
+         in="SourceGraphic"
+         in2="offset"
+         id="feComposite4010" />
+    </filter>
+    <filter
+       style="color-interpolation-filters:sRGB"
+       id="filter4000-6"
+       inkscape:label="Drop Shadow">
+      <feFlood
+         id="feFlood4002-4"
+         flood-opacity="0.475"
+         flood-color="rgb(0,0,0)"
+         result="flood" />
+      <feComposite
+         id="feComposite4004-6"
+         in2="SourceGraphic"
+         in="flood"
+         operator="in"
+         result="composite1" />
+      <feGaussianBlur
+         id="feGaussianBlur4006-2"
+         stdDeviation="5"
+         result="blur" />
+      <feOffset
+         id="feOffset4008-8"
+         dx="8"
+         dy="8"
+         result="offset" />
+      <feComposite
+         id="feComposite4010-9"
+         in2="offset"
+         in="SourceGraphic"
+         operator="over"
+         result="composite2" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.24748737"
+     inkscape:cx="928.3577"
+     inkscape:cy="404.58117"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:snap-text-baseline="false"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1171"
+     inkscape:window-x="1920"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     showguides="false" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,1307.6379)">
+    <g
+       id="iotbzh-logo"
+       transform="matrix(2.3917866,0,0,2.3917866,216.6324,-1946.4393)"
+       inkscape:export-filename="/home/sdx/Pictures/Logo/logo_iot_bzh_100dpi.png"
+       inkscape:export-xdpi="100.22011"
+       inkscape:export-ydpi="100.22011"
+       style="display:inline;filter:url(#filter4000-6)">
+      <text
+         sodipodi:linespacing="125%"
+         id="text3557-5-3-7-0-7-3"
+         y="519.50671"
+         x="27.886671"
+         style="font-style:normal;font-weight:normal;font-size:97.09867096px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:97.09867096px;line-height:125%;font-family:FreeEuro;-inkscape-font-specification:'FreeEuro Bold';text-align:start;writing-mode:lr-tb;text-anchor:start"
+           y="519.50671"
+           x="27.886671"
+           id="tspan3559-5-4-1-5-0-6"
+           sodipodi:role="line">IOT</tspan></text>
+      <path
+         inkscape:connector-curvature="0"
+         d="m 286.73007,473.23356 c 28.21686,16.29102 28.75566,58.73779 0.99693,78.53831 -7.67688,5.47598 -8.77935,4.91028 -1.99529,-1.0238 17.47377,-15.28453 17.98492,-42.17775 1.08522,-57.09786 l -3.91266,-3.45435 0.72312,-3.71053 c 0.39771,-2.04076 0.5997,-5.73115 0.44885,-8.20083 -0.33876,-5.54623 0.15803,-6.49185 2.65383,-5.05094 z m -64.76568,11.40332 c 7.06047,-7.74198 18.64659,-14.16089 29.04027,-16.08874 l 6.87489,-1.27521 0.87404,2.89709 c 0.4807,1.59343 0.67439,5.2245 0.43037,8.06906 l -0.44364,5.17195 -6.13887,1.6918 c -10.91241,3.00731 -20.4022,10.85909 -25.4533,21.05979 l -2.41633,4.87984 -2.74281,-0.41238 c -5.14252,-0.77316 -12.72985,-3.97645 -12.79123,-5.40033 -0.092,-2.13451 8.34659,-15.74625 12.76661,-20.59287 z m 33.20546,36.39493 c -28.21687,16.29101 -65.24624,-4.46574 -68.51461,-38.40577 -0.9039,-9.38637 0.13723,-10.0583 1.88428,-1.21608 4.49989,22.77499 27.53453,36.66428 48.90556,29.48876 l 4.94788,-1.66128 2.85184,2.48149 c 1.56852,1.36481 4.66349,3.38493 6.87772,4.48914 4.97257,2.47973 5.54308,3.38282 3.04733,4.82374 z m 22.50729,-61.79039 c 3.17451,9.98553 2.94038,23.22889 -0.58688,33.19399 l -2.33309,6.59143 -2.94597,-0.69161 c -1.6203,-0.38041 -4.86173,-2.02821 -7.2032,-3.6618 l -4.25721,-2.97018 1.60429,-6.16234 c 2.85178,-10.95404 0.79685,-23.09833 -5.51167,-32.57307 l -3.01788,-4.53253 1.72854,-2.16916 c 3.24083,-4.06698 9.80863,-9.03614 11.07242,-8.37738 1.89457,0.98756 9.46336,15.1015 11.45065,21.35265 z m -48.80223,10.31437 c 0,-32.58201 36.49058,-54.27201 67.51771,-40.1325 8.58077,3.9104 8.6421,5.148 0.11108,2.23988 -21.97368,-7.49048 -45.51946,5.51348 -49.99082,27.6091 l -1.03521,5.11561 -3.57498,1.22902 c -1.96621,0.67596 -5.26316,2.34622 -7.32655,3.71171 -4.63379,3.06649 -5.70115,3.10904 -5.70115,0.22718 z m 42.25842,50.3871 c -10.23499,-2.24356 -21.58699,-9.06801 -28.45341,-17.10525 l -4.5418,-5.31622 2.07194,-2.20549 c 1.13957,-1.21302 4.18733,-3.19628 6.77282,-4.40726 l 4.70085,-2.20176 4.53458,4.47053 c 8.06061,7.94674 19.60535,12.23927 30.96496,11.51329 l 5.43422,-0.34731 1.01427,2.58154 c 1.90169,4.84014 2.92124,13.01261 1.71883,13.77769 -1.80254,1.14695 -17.80995,0.64475 -24.21726,-0.75976 z"
+         style="display:inline;fill:#5a2ca0"
+         id="path3415-4-2-2-5-0-3-7-4-4-1-5" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3557-5-3-7-46-7-3-7"
+         y="519.50671"
+         x="317.95816"
+         style="font-style:normal;font-weight:normal;font-size:97.09867096px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none"
+         xml:space="preserve"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:97.09867096px;line-height:125%;font-family:FreeEuro;-inkscape-font-specification:'FreeEuro Bold';text-align:start;writing-mode:lr-tb;text-anchor:start"
+           y="519.50671"
+           x="317.95816"
+           id="tspan3559-5-4-1-90-0-2-9"
+           sodipodi:role="line">BZH</tspan></text>
+    </g>
+    <flowRoot
+       xml:space="preserve"
+       id="root-title"
+       transform="matrix(2.3469382,0,0,2.3469382,464.13874,-1200)"><flowRegion
+         id="flowRegion4303"><rect
+           id="rect4305"
+           width="679.99994"
+           height="141.42853"
+           x="-154.28572"
+           y="400"/>
+        </flowRegion>
+        <flowPara
+         id="title"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:87.5px;line-height:125%;font-family:Verdana;-inkscape-font-specification:'Verdana, Bold';text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1">{title}</flowPara></flowRoot>    <flowRoot
+       xml:space="preserve"
+       id="root-subtitle"
+       transform="matrix(1.8523279,0,0,1.8523279,553.97647,-380)"><flowRegion
+         id="flowRegion4303-6"><rect
+           id="rect4305-0"
+           width="852.32806"
+           height="154.51677"
+           x="-239.3591"
+           y="290"/>
+        </flowRegion>
+        <flowPara
+         id="subtitle"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:62.5px;line-height:125%;font-family:Verdana;-inkscape-font-specification:'Verdana, Bold';text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1">{subtitle}</flowPara>
+    </flowRoot>
+    <flowRoot
+       id="root-version"
+       xml:space="preserve"
+       transform="translate(-2.0185547,164)"><flowRegion
+         id="flowRegion4169"><rect
+           y="501.68909"
+           x="343.32947"
+           height="99.591171"
+           width="1117.3768"
+           id="rect4171" /></flowRegion><flowPara
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:50px;line-height:125%;font-family:Verdana;-inkscape-font-specification:'Verdana, Bold';text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1"
+         id="version">{version}</flowPara></flowRoot>    <flowRoot
+       transform="translate(-2.0185547,238)"
+       xml:space="preserve"
+       id="root-date"><flowRegion
+         id="flowRegion4170"><rect
+           id="rect4172"
+           width="1117.3768"
+           height="99.591171"
+           x="343.32947"
+           y="501.68909" /></flowRegion><flowPara
+         id="date"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:50px;line-height:125%;font-family:Verdana;-inkscape-font-specification:'Verdana, Bold';text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1">{date}</flowPara></flowRoot>  </g>
+</svg>
diff --git a/ll-database-binding/conf.d/app-templates/docs/resources/ebook.css b/ll-database-binding/conf.d/app-templates/docs/resources/ebook.css
new file mode 100644 (file)
index 0000000..39f126c
--- /dev/null
@@ -0,0 +1,386 @@
+/* IoT.Bzh theaming */
+
+h1 {
+    color: #330066;
+    border-bottom: 2px solid #330066;
+}
+
+h2 {
+    color: #330066;
+}
+
+h3 {
+    color: #330066;
+}
+
+h4 {
+    color: #330066;
+}
+
+
+/* GENERAL ELEMENTS */
+
+/* clear both */
+
+.clear {
+    clear: both;
+}
+
+.section> :last-child {
+    margin-bottom: 0 !important;
+}
+
+.section> :first-child {
+    margin-top: 0 !important;
+}
+
+
+/* SPECIAL ELEMENTS */
+
+
+/* page break always after element on pdf/print definition */
+
+div.pagebreak {
+    page-break-after: always;
+}
+
+
+/* no page break inside element on pdf/print definition */
+
+div.nopb {
+    page-break-inside: avoid !important;
+    margin: 4px 0 4px 0;
+}
+
+
+/* note blocks */
+
+div.note {
+    background: #FCF8E3 none repeat scroll 0% 0%;
+    color: #8A6D3B;
+    padding: 15px;
+    margin-bottom: 10px;
+    border-bottom: 5px solid #DDD;
+    border-color: #FAEBCC;
+    page-break-inside: avoid;
+}
+
+div.note p {
+    padding-bottom: 0;
+    margin-bottom: 0;
+}
+
+
+/* images, figures and captions */
+
+p img {
+    /* center all images */
+    display: block;
+    margin: 0 auto;
+    padding: 10px 0;
+}
+
+figure {
+    margin: 1.0em 0px;
+    padding: 10px 0;
+    text-align: center;
+    page-break-inside: avoid;
+    display: block;
+}
+
+figure img {
+    display: block;
+    margin: 0 auto;
+}
+
+figcaption {
+    clear: left;
+    margin: 1.0em 0 0 0;
+    text-align: center;
+    font-style: italic;
+    line-height: 1.5em;
+    font-size: 80%;
+    color: #666;
+    display: block;
+}
+
+.page .section p img {
+    margin-top: 10px;
+}
+
+
+/* ul, ol list margin fix */
+
+.page .section ol,
+.page .section ul {
+    margin-bottom: 10px;
+}
+
+
+/* blockquotes */
+
+.page .section blockquote {
+    margin: 0 0 0 5%;
+    font-style: italic;
+}
+
+
+/* PAGE SPECIFIC */
+
+
+/* set summary page to right side of the paper */
+
+.page .toc h1 {
+    page-break-before: right;
+}
+
+.page .section.toc {
+    page-break-inside: always;
+}
+
+/* table headers */
+
+div#README\.md table {
+    margin-top: 30px;
+    font-size: 95%;
+}
+
+div#README\.md table thead {
+    display: none;
+}
+
+
+
+/* CITATION AND IMAGES */
+
+
+/* math image styles */
+
+.page .section p img.svg,
+.page .section p img.png {
+    margin-top: 0px;
+    margin-bottom: -2px;
+}
+
+.page .section p img.math {
+    vertical-align: middle;
+    height: auto;
+    width: auto;
+    margin-top: -4px;
+    max-height: 15px;
+}
+
+.page .section p img.math.line1 {
+    margin-top: -7px;
+    max-height: 19px;
+}
+
+.page .section p img.math.line2 {
+    margin-top: -1px;
+    max-height: 30px;
+}
+
+
+/* credits page */
+
+.page .section ul.pictures {
+    margin-left: -30px;
+}
+
+.page .section ul.pictures li {
+    list-style: outside none none;
+}
+
+.page .section ul.pictures li a {
+    float: left;
+}
+
+.page .section ul.pictures li span {
+    display: block;
+    margin-left: 100px;
+}
+
+
+
+/* sub and super script */
+
+.page .section sub {
+    font-size: 80%;
+    margin-left: 1px;
+}
+
+
+/* citations and references */
+
+.page .section sup {
+    margin-left: -1px;
+    margin-right: 2px;
+    font-size: 80%;
+}
+
+.page .section sup:before {
+    content: " ";
+}
+
+.page .section ul.citations,
+.page .section ul.references {
+    margin-left: -30px;
+}
+
+
+.page .section ul.citations li:nth-child(1) {
+    margin-top: 20px;
+    padding-top: 20px;
+    border-top: 1px solid #BBB;
+}
+
+.page .section ul.citations li,
+.page .section ul.references li {
+    list-style: outside none none;
+}
+
+.page .section ul.citations li {
+    font-size: 80%;
+}
+
+.page .section ul.citations li>span:nth-child(1),
+.page .section ul.references li>span:nth-child(1) {
+    display: block;
+    float: left;
+    text-align: left;
+    width: 70px
+}
+
+.page .section ul.citations li>span:nth-child(1) {
+    width: 50px
+}
+
+.page .section ul.references li div {
+    margin-left: 70px;
+}
+
+.page .section ul.citations li div {
+    margin-left: 50px;
+}
+
+.page .section a[href="#"],
+.page .section a[href="#"]:link,
+.page .section a[href="#"]:visited,
+.page .section a[href="#"]:hover,
+.page .section a[href="#"]:focus {
+    text-decoration: none;
+    color: inherit;
+    cursor: text;
+    font-style: italic;
+}
+
+
+/* self referential footnotes */
+
+.page .section div[type="selfref"] a[href="#"],
+.page .section div[type="selfref"] a[href="#"]:link,
+.page .section div[type="selfref"] a[href="#"]:visited,
+.page .section div[type="selfref"] a[href="#"]:hover,
+.page .section div[type="selfref"] a[href="#"]:focus {
+    font-style: normal;
+}
+
+.page .section div[type="selfref"] span:nth-child(1) {
+    display: none;
+}
+
+
+/* page break always after element on pdf/print definition */
+
+div.page-break {
+    page-break-inside: always;
+}
+
+div.page-break:before {
+    content: ' ';
+}
+
+
+/* no page break inside element on pdf/print definition */
+
+div.nopb {
+    page-break-inside: avoid;
+}
+
+/* justify text */
+p {
+    text-align: justify;
+}
+
+/* page header and footer */
+
+.pdf-footer,
+.pdf-header {
+    margin-top: 20px;
+    color: #aaa;
+}
+
+.pdf-header .header-left {
+    float: left;
+    margin-left: 2em;
+    margin-right: auto;
+}
+
+.pdf-header .header-right {
+    display: table;
+    margin-left: auto;
+    margin-right: 2em;
+}
+
+.pdf-footer .sub {
+    padding-top: 8px;
+    font-size: 70%;
+}
+
+.pdf-header .sub {
+    padding-top: 2px;
+    font-size: 70%;
+}
+
+.pdf-footer {
+    padding-top: 10px;
+    border-top: 1px solid #eee;
+}
+
+.pdf-footer .footer-left {
+    float: left;
+    margin-left: 2em;
+    margin-right: auto;
+}
+
+.pdf-footer .footer-center {
+    display: table;
+    margin-left: auto;
+    margin-right: auto;
+}
+
+.pdf-footer .footer-right {
+    float: right;
+    margin-left: auto;
+    margin-right: 2em;
+}
+
+.pdf-header {
+    padding-bottom: 10px;
+    border-bottom: 1px solid #eee;
+}
+
+.pdf-header .header-pages-count {
+    float: right;
+    text-align: right;
+}
+
+.pdf-header .header-pages-count a,
+.pdf-header .header-pages-count a:visited,
+.pdf-header .header-pages-count a:active,
+.pdf-header .header-pages-count a:focus,
+.pdf-header .header-pages-count a:link {
+    text-decoration: none;
+    color: #aaa;
+    cursor: text;
+}
diff --git a/ll-database-binding/conf.d/app-templates/docs/resources/make_cover.sh b/ll-database-binding/conf.d/app-templates/docs/resources/make_cover.sh
new file mode 100755 (executable)
index 0000000..1026ecb
--- /dev/null
@@ -0,0 +1,27 @@
+#!/bin/bash
+DOCS_DIR=$(cd $(dirname $0)/.. && pwd)
+BOOKFILE=$DOCS_DIR/../book.json
+
+TITLE=$(grep  '"title":' $BOOKFILE | cut -d'"' -f 4)
+SUBTITLE=$(grep  '"subtitle":' $BOOKFILE | cut -d'"' -f 4)
+VERSION="Version $(grep  '"version":' $BOOKFILE | cut -d'"' -f 4)"
+DATE=$(grep  '"published":' $BOOKFILE | cut -d'"' -f 4)
+
+[ -z "$TITLE" ] && { echo "Error TITLE not set!" ; exit 1; }
+[ -z "$VERSION" ] && { echo "Error VERSION not set!" ; exit 1; }
+[ -z "$DATE" ] && { echo "Error DATE not set!" ; exit 1; }
+
+
+cat $(dirname $0)/cover.svg | sed -e "s/{title}/$TITLE/g" \
+    -e "s/font-size:87.5px/font-size:54px/g" \
+    -e "s/{subtitle}/$SUBTITLE/g" \
+    -e "s/font-size:62.5px/font-size:40px/g" \
+    -e "s/{version}/$VERSION/g" \
+    -e "s/{date}/$DATE/g" \
+    > /tmp/cover.svg
+
+# use  imagemagick convert tool  (cover size must be 1800x2360)
+convert -resize "1600x2160!" -border 100 -bordercolor white -background white \
+    -flatten -quality 100 /tmp/cover.svg $DOCS_DIR/cover.jpg
+
+convert -resize "200x262!" $DOCS_DIR/cover.jpg $DOCS_DIR/cover_small.jpg
diff --git a/ll-database-binding/conf.d/app-templates/gendocs.sh b/ll-database-binding/conf.d/app-templates/gendocs.sh
new file mode 100755 (executable)
index 0000000..ea9400a
--- /dev/null
@@ -0,0 +1,79 @@
+#!/bin/bash
+
+OUTFILENAME="Gitbook-Iotbzh-template"
+
+SCRIPT=$(basename $BASH_SOURCE)
+
+function usage() {
+       cat <<EOF >&2
+Usage: $SCRIPT [options] [pdf|serve|doxygen]
+
+Options:
+   --debug
+      enable debug when generating pdf or html documentation
+   -d|--dry
+      dry run
+   -h|--help
+      get this help
+
+Example:
+       $SCRIPT pdf
+
+EOF
+       exit 1
+}
+
+function info() {
+       echo "$@" >&2
+}
+
+#default values
+DEBUG_FLAG=""
+DRY=""
+DO_ACTION=""
+OUT_DIR=./build
+
+[[ $? != 0 ]] && usage
+while [ $# -gt 0 ]; do
+       case "$1" in
+               --debug) DEBUG_FLAG="--log=debug --debug";;
+               -d|--dry) DRY=echo;;
+               -h|--help) usage;;
+        pdf | serve | doxygen) DO_ACTION=$1;;
+               --) break;;
+       esac
+    shift
+done
+
+cd $(dirname $0)
+ROOTDIR=`pwd -P`
+
+# Create out dir if needed
+[ -d $OUT_DIR ] || mkdir -p $OUT_DIR
+
+if [ "$DO_ACTION" = "pdf" -o "$DO_ACTION" = "serve" ]; then
+    GITBOOK=`which gitbook`
+    [ "$?" = "1" ] && { echo "You must install gitbook first, using: sudo npm install -g gitbook-cli"; exit 1; }
+
+    EBCONV=`which ebook-convert`
+    [ "$?" = "1" ] && { echo "You must install calibre first, using: 'sudo apt install calibre' or refer to https://calibre-ebook.com/download"; exit 1; }
+
+    if [ "$DO_ACTION" = "pdf" ]; then
+
+        # Update cover when book.json has been changed
+        [[ $ROOTDIR/book.json -nt $ROOTDIR/docs/cover.jpg ]] && { echo "Update cover files"; $ROOTDIR/docs/resources/make_cover.sh || exit 1; }
+
+           OUTFILE=$OUT_DIR/$OUTFILENAME.pdf
+        $DRY $GITBOOK pdf $ROOTDIR $OUTFILE $DEBUG_FLAG
+        [ "$?" = "0" ] && echo "PDF has been successfully generated in $OUTFILE"
+    else
+        $DRY $GITBOOK serve $DEBUG_FLAG
+    fi
+
+elif [ "$DO_ACTION" = "doxygen" ]; then
+    $DRY cd $OUT_DIR && cmake .. && make doxygen $ROOTDIR/Doxyfile
+
+else
+    echo "Unknown action !"
+    usage
+fi
@@ -1,7 +1,7 @@
 ###########################################################################
 # Copyright 2015, 2016, 2017 IoT.bzh
 #
-# author: Loïc Collignon <loic.collignon@iot.bzh>
+# author: Romain Forlot <romain.forlot@iot.bzh>
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -16,5 +16,6 @@
 # limitations under the License.
 ###########################################################################
 
-cmake_minimum_required(VERSION 3.3)
+CMAKE_MINIMUM_REQUIRED(VERSION 3.3)
+
 include(${CMAKE_CURRENT_SOURCE_DIR}/conf.d/cmake/config.cmake)
diff --git a/ll-database-binding/conf.d/app-templates/samples.d/config.cmake.sample b/ll-database-binding/conf.d/app-templates/samples.d/config.cmake.sample
new file mode 100644 (file)
index 0000000..2497ee2
--- /dev/null
@@ -0,0 +1,203 @@
+###########################################################################
+# Copyright 2015, 2016, 2017 IoT.bzh
+#
+# author: Fulup Ar Foll <fulup@iot.bzh>
+#
+# 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.
+###########################################################################
+
+# Project Info
+# ------------------
+set(PROJECT_NAME example)
+set(PROJECT_VERSION "0.0")
+set(PROJECT_PRETTY_NAME "Example")
+set(PROJECT_DESCRIPTION "AGL application example")
+set(PROJECT_URL "https://gerrit.automotivelinux.org/gerrit/apps/app-templates")
+set(PROJECT_ICON "icon.png")
+set(PROJECT_AUTHOR "Last Name, First Name")
+set(PROJECT_AUTHOR_MAIL "example.man@bigouden.bzh")
+set(PROJECT_LICENSE "APL2.0")
+set(PROJECT_LANGUAGES,"C")
+
+# Where are stored default templates files from submodule or subtree app-templates in your project tree
+# relative to the root project directory
+set(PROJECT_APP_TEMPLATES_DIR "conf.d/app-templates")
+
+# Where are stored your external libraries for your project. This is 3rd party library that you don't maintain
+# but used and must be built and linked.
+# set(PROJECT_LIBDIR "libs")
+
+# Where are stored data for your application. Pictures, static resources must be placed in that folder.
+# set(PROJECT_RESOURCES "data")
+
+# Which directories inspect to find CMakeLists.txt target files
+# set(PROJECT_SRC_DIR_PATTERN "*")
+
+# Compilation Mode (DEBUG, RELEASE)
+# ----------------------------------
+set(CMAKE_BUILD_TYPE "DEBUG")
+
+# Kernel selection if needed. You can choose between a
+# mandatory version to impose a minimal version.
+# Or check Kernel minimal version and just print a Warning
+# about missing features and define a preprocessor variable
+# to be used as preprocessor condition in code to disable
+# incompatibles features. Preprocessor define is named
+# KERNEL_MINIMAL_VERSION_OK.
+#
+# NOTE*** FOR NOW IT CHECKS KERNEL Yocto environment and
+# Yocto SDK Kernel version.
+# -----------------------------------------------
+#set (kernel_mandatory_version 4.8)
+#set (kernel_minimal_version 4.8)
+
+# Compiler selection if needed. Impose a minimal version.
+# -----------------------------------------------
+set (gcc_minimal_version 4.9)
+
+# PKG_CONFIG required packages
+# -----------------------------
+set (PKG_REQUIRED_LIST
+       json-c
+       libsystemd>=222
+       afb-daemon
+       libmicrohttpd>=0.9.55
+)
+
+# Prefix path where will be installed the files
+# Default: /usr/local (need root permission to write in)
+# ------------------------------------------------------
+#set(CMAKE_INSTALL_PREFIX $ENV{HOME}/opt)
+
+# Customize link option
+# -----------------------------
+#list(APPEND link_libraries -an-option)
+
+# Compilation options definition
+# Use CMake generator expressions to specify only for a specific language
+# Values are prefilled with default options that is currently used.
+# Either separate options with ";", or each options must be quoted separately
+# DO NOT PUT ALL OPTION QUOTED AT ONCE , COMPILATION COULD FAILED !
+# ----------------------------------------------------------------------------
+#set(COMPILE_OPTIONS
+# -Wall
+# -Wextra
+# -Wconversion
+# -Wno-unused-parameter
+# -Wno-sign-compare
+# -Wno-sign-conversion
+# -Werror=maybe-uninitialized
+# -Werror=implicit-function-declaration
+# -ffunction-sections
+# -fdata-sections
+# -fPIC
+# CACHE STRING "Compilation flags")
+#set(C_COMPILE_OPTIONS "" CACHE STRING "Compilation flags for C language.")
+#set(CXX_COMPILE_OPTIONS "" CACHE STRING "Compilation flags for C++ language.")
+#set(PROFILING_COMPILE_OPTIONS
+# -g
+# -O0
+# -pg
+# -Wp,-U_FORTIFY_SOURCE
+# CACHE STRING "Compilation flags for PROFILING build type.")
+#set(DEBUG_COMPILE_OPTIONS
+# -g
+# -ggdb
+# -Wp,-U_FORTIFY_SOURCE
+# CACHE STRING "Compilation flags for DEBUG build type.")
+#set(CCOV_COMPILE_OPTIONS
+# -g
+# -O2
+# --coverage
+# CACHE STRING "Compilation flags for CCOV build type.")
+#set(RELEASE_COMPILE_OPTIONS
+# -g
+# -O2
+# CACHE STRING "Compilation flags for RELEASE build type.")
+
+# (BUG!!!) as PKG_CONFIG_PATH does not work [should be an env variable]
+# ---------------------------------------------------------------------
+set(CMAKE_PREFIX_PATH ${CMAKE_INSTALL_PREFIX}/lib64/pkgconfig ${CMAKE_INSTALL_PREFIX}/lib/pkgconfig)
+set(LD_LIBRARY_PATH ${CMAKE_INSTALL_PREFIX}/lib64 ${CMAKE_INSTALL_PREFIX}/lib)
+
+# Optional location for config.xml.in
+# -----------------------------------
+#set(WIDGET_ICON conf.d/wgt/${PROJECT_ICON} CACHE PATH "Path to the widget icon")
+#set(WIDGET_CONFIG_TEMPLATE ${CMAKE_CURRENT_SOURCE_DIR}/conf.d/wgt/config.xml.in CACHE PATH "Path to widget config file template (config.xml.in)")
+
+# Mandatory widget Mimetype specification of the main unit
+# --------------------------------------------------------------------------
+# Choose between :
+#- text/html : HTML application,
+#      content.src designates the home page of the application
+#
+#- application/vnd.agl.native : AGL compatible native,
+#      content.src designates the relative path of the binary.
+#
+# - application/vnd.agl.service: AGL service, content.src is not used.
+#
+#- ***application/x-executable***: Native application,
+#      content.src designates the relative path of the binary.
+#      For such application, only security setup is made.
+#
+set(WIDGET_TYPE MimeType_Not_Set)
+
+# Mandatory Widget entry point file of the main unit
+# --------------------------------------------------------------
+# This is the file that will be executed, loaded,
+# at launch time by the application framework.
+#
+set(WIDGET_ENTRY_POINT EntryPoint_Path_Not_Set)
+
+# Optional dependencies order
+# ---------------------------
+#set(EXTRA_DEPENDENCIES_ORDER)
+
+# Optional Extra global include path
+# -----------------------------------
+#set(EXTRA_INCLUDE_DIRS)
+
+# Optional extra libraries
+# -------------------------
+#set(EXTRA_LINK_LIBRARIES)
+
+# Optional force binding Linking flag
+# ------------------------------------
+# set(BINDINGS_LINK_FLAG LinkOptions )
+
+# Optional force package prefix generation, like widget
+# -----------------------------------------------------
+# set(PKG_PREFIX DestinationPath)
+
+# Optional Application Framework security token
+# and port use for remote debugging.
+#------------------------------------------------------------
+set(AFB_TOKEN   ""     CACHE PATH "Default binder security token")
+set(AFB_REMPORT "1234" CACHE PATH "Default binder listening port")
+
+# Print a helper message when every thing is finished
+# ----------------------------------------------------
+set(CLOSING_MESSAGE "Typical binding launch: afb-daemon --port=${AFB_REMPORT} --workdir=${CMAKE_BINARY_DIR}/package --ldpaths=lib --roothttp=htdocs  --token=\"${AFB_TOKEN}\" --tracereq=common --verbose")
+set(PACKAGE_MESSAGE "Install widget file using in the target : afm-util install ${PROJECT_NAME}.wgt")
+
+# Optional schema validator about now only XML, LUA and JSON
+# are supported
+#------------------------------------------------------------
+#set(LUA_CHECKER "luac" "-p" CACHE STRING "LUA compiler")
+#set(XML_CHECKER "xmllint" CACHE STRING "XML linter")
+#set(JSON_CHECKER "json_verify" CACHE STRING "JSON linter")
+
+# This include is mandatory and MUST happens at the end
+# of this file, else you expose you to unexpected behavior
+# -----------------------------------------------------------
+include(${PROJECT_APP_TEMPLATES_DIR}/cmake/common.cmake)
diff --git a/ll-database-binding/conf.d/app-templates/samples.d/config.xml.in.sample b/ll-database-binding/conf.d/app-templates/samples.d/config.xml.in.sample
new file mode 100644 (file)
index 0000000..b93f3d9
--- /dev/null
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<widget xmlns="http://www.w3.org/ns/widgets" id="@PROJECT_NAME@" version="@PROJECT_VERSION@">
+       <name>@PROJECT_NAME@</name>
+       <icon src="@PROJECT_ICON@"/>
+       <content src="@WIDGET_ENTRY_POINT@" type="@WIDGET_TYPE@"/>
+       <description>@PROJECT_DESCRIPTION@</description>
+       <author>@PROJECT_AUTHOR@ &lt;@PROJECT_AUTHOR_MAIL@&gt;</author>
+       <license>@PROJECT_LICENSE@</license>
+
+<!-- Feature : required-api ------------------------------------------------------
+#### param name="#target" OPTIONAL
+
+Declares the name of the unit requiring the listed apis.
+Only one instance of the param "#target" is allowed.
+When there is not instance of this param, it behave as if
+the target main was specified.
+
+#### param name=[required api name]
+
+The name is the name of the required API.
+The value describes how to connect to the required api.
+It is either:
+
+ - local: The binding is a local shared object.
+       In that case, the name is the relative path of the
+       shared object to be loaded.
+ - auto: The framework set automatically the kind of
+       the connection to the API
+ - ws: The framework connect using internal websockets
+ - dbus: The framework connect using internal dbus
+ - link: The framework connect in memory by dinamically linking
+
+Example:
+       <feature name="urn:AGL:widget:required-api">
+               <param name="#target" value="low-can" />
+               <param name="<a-required-api>" value="auto" />
+               <param name="<another-required-api>" value="auto" />
+       </feature>
+--------------------------------------------------------------------------------->
+
+<!-- Feature : required-permission ------------------------------------------
+
+List of the permissions required by the unit.
+Each required permission must be explicited using a <param> entry.
+
+#### param name="#target" OPTIONAL
+
+Declares the name of the unit requiring the listed permissions.
+Only one instance of the param "#target" is allowed.
+When there is not instance of this param, it behave as if
+the target main was specified.
+
+#### param name=[required permission name]
+
+The value is either:
+- required: the permission is mandatorily needed except if the feature
+isn't required (required="false") and in that case it is optional.
+- optional: the permission is optional
+
+Example:
+<feature name="urn:AGL:widget:required-permission">
+       <param name="#target" value="geoloc" />
+       <param name="urn:AGL:permission:real-time" value="required" />
+       <param name="urn:AGL:permission:syscall:*" value="required" />
+</feature>
+--------------------------------------------------------------------------------->
+
+<!-- Feature : provided-unit -------------------------------------------------
+This feature is made for declaring new units
+for the widget. Using this feature, a software publisher
+can provide more than one application in the same widget.
+
+#### param name="#target" REQUIRED
+
+Declares the name of the unit. The default unit, the unit
+of the main of the widget, has the name "main". The value
+given here must be unique within the widget file. It will
+be used in other places of the widget config.xml file to
+designate the unit.
+
+Only one instance of the param "#target" is allowed.
+The value can't be "main".
+
+#### param name="content.type" REQUIRED
+
+The mimetype of the provided unit.
+
+#### param name="content.src"
+
+A path to the file (subject to localisation), this is the entry point
+to that unit.
+
+#### other parameters
+
+The items that can be set for the main unit
+can also be set using the params if needed.
+
+ - description
+ - name.content
+ - name.short
+ - ...
+
+Example:
+<feature name="urn:AGL:widget:provided-unit">
+       <param name="#target" value="geoloc" />
+       <param name="description" value="binding of name geoloc" />
+       <param name="content.src" value="index.html" />
+       <param name="content.type" value="application/vnd.agl.service" />
+</feature>
+--------------------------------------------------------------------------------->
+
+<!-- Feature: provided-api ---------------------------------------------------
+Use this feature for exporting one or more API of a unit
+to other widgets of the platform.
+
+This feature is an important feature of the framework.
+
+#### param name="#target" OPTIONAL
+
+Declares the name of the unit exporting the listed apis.
+Only one instance of the param "#target" is allowed.
+When there is not instance of this param, it behave as if
+the target main was specified.
+
+#### param name=[name of exported api]
+
+The name give the name of the api that is exported.
+
+The value is one of the following values:
+
+- ws: export the api using UNIX websocket
+- dbus: export the API using dbus
+- auto: export the api using the default method(s).
+
+Example:
+<feature name="urn:AGL:widget:provided-api">
+       <param name="#target" value="geoloc" />
+       <param name="geoloc" value="auto" />
+       <param name="moonloc" value="auto" />
+</feature>
+--------------------------------------------------------------------------------->
+</widget>
diff --git a/ll-database-binding/conf.d/app-templates/samples.d/xds-config.env.sample b/ll-database-binding/conf.d/app-templates/samples.d/xds-config.env.sample
new file mode 100644 (file)
index 0000000..a4c51b1
--- /dev/null
@@ -0,0 +1,10 @@
+XDS_PROJECT_ID=W2EAQBA-HQI75XA_unicens2-binding
+XDS_SDK_ID=poky-agl_aarch64_3.99.1+snapshot
+XDS_SERVER_URL=localhost:8000
+
+DOCKER_TARGET=docker-sdk
+
+RSYNC_TARGET=root@192.168.168.11
+RSYNC_PREFIX=./opt
+PROJECT_DIR=/home/seb/tmp/unicens2-binding
+
diff --git a/ll-database-binding/conf.d/app-templates/template.d/config.xml.in b/ll-database-binding/conf.d/app-templates/template.d/config.xml.in
new file mode 100644 (file)
index 0000000..35d20b8
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<widget xmlns="http://www.w3.org/ns/widgets" id="@PROJECT_NAME@" version="@PROJECT_VERSION@">
+  <name>@PROJECT_NAME@</name>
+  <icon src="@PROJECT_ICON@"/>
+  <content src="@WIDGET_ENTRY_POINT@" type="@WIDGET_TYPE@"/>
+  <description>@PROJECT_DESCRIPTION@</description>
+  <author>@PROJECT_AUTHOR@ &lt;@PROJECT_AUTHOR_MAIL@&gt;</author>
+  <license>@PROJECT_LICENSE@</license>
+</widget>
diff --git a/ll-database-binding/conf.d/app-templates/template.d/deb-config.dsc.in b/ll-database-binding/conf.d/app-templates/template.d/deb-config.dsc.in
new file mode 100644 (file)
index 0000000..28a4835
--- /dev/null
@@ -0,0 +1,15 @@
+Format: @PROJECT_VERSION@
+Source: @NPKG_PROJECT_NAME@
+Binary: @NPKG_PROJECT_NAME@-bin
+Architecture: any
+Version: 2.0-0
+Maintainer: @PROJECT_AUTHOR@ <@PROJECT_AUTHOR_MAIL@>
+Standards-Version: 3.8.2
+Homepage: @PROJECT_URL@
+Build-Depends: debhelper (>= 5),
+ pkg-config,
+ cmake,
+ gcc,
+ g++,
+@DEB_PKG_DEPS@
+Debtransform-Tar: @NPKG_PROJECT_NAME@_@PROJECT_VERSION@.orig.tar.gz
diff --git a/ll-database-binding/conf.d/app-templates/template.d/deb-config.install.in b/ll-database-binding/conf.d/app-templates/template.d/deb-config.install.in
new file mode 100644 (file)
index 0000000..5858efd
--- /dev/null
@@ -0,0 +1,2 @@
+/opt/AGL/*
+/etc/profile.d/*
diff --git a/ll-database-binding/conf.d/app-templates/template.d/debian.changelog.in b/ll-database-binding/conf.d/app-templates/template.d/debian.changelog.in
new file mode 100644 (file)
index 0000000..f72c717
--- /dev/null
@@ -0,0 +1,5 @@
+@NPKG_PROJECT_NAME@ (@PROJECT_VERSION@-0) UNRELEASED; urgency=low
+
+  * init build
+
+ -- @PROJECT_AUTHOR@ <@PROJECT_AUTHOR_MAIL@>  Mon, 25 Dec 2007 10:50:38 +0100
diff --git a/ll-database-binding/conf.d/app-templates/template.d/debian.compat.in b/ll-database-binding/conf.d/app-templates/template.d/debian.compat.in
new file mode 100644 (file)
index 0000000..45a4fb7
--- /dev/null
@@ -0,0 +1 @@
+8
diff --git a/ll-database-binding/conf.d/app-templates/template.d/debian.control.in b/ll-database-binding/conf.d/app-templates/template.d/debian.control.in
new file mode 100644 (file)
index 0000000..ea4ad8a
--- /dev/null
@@ -0,0 +1,16 @@
+Priority: optional
+Maintainer: @PROJECT_AUTHOR@ <@PROJECT_AUTHOR_MAIL@>
+Source: @NPKG_PROJECT_NAME@
+Build-Depends: debhelper (>= 5),
+ pkg-config,
+ cmake,
+ gcc,
+ g++,
+@DEB_PKG_DEPS@
+Standards-Version: 3.8.2
+Homepage: @PROJECT_URL@
+
+Package: @NPKG_PROJECT_NAME@
+Section: libs
+Architecture: any
+Description: @PROJECT_DESCRIPTION@
diff --git a/ll-database-binding/conf.d/app-templates/template.d/debian.rules.in b/ll-database-binding/conf.d/app-templates/template.d/debian.rules.in
new file mode 100644 (file)
index 0000000..6bb2825
--- /dev/null
@@ -0,0 +1,87 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+# Uncomment this to turn on verbose mode.
+export DH_VERBOSE=1
+
+# These are used for cross-compiling and for saving the configure script
+# from having to guess our platform (since we know it already)
+DEB_HOST_GNU_TYPE   ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
+DEB_BUILD_GNU_TYPE  ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
+
+
+CFLAGS = -Wall -g
+
+ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
+       CFLAGS += -O0
+else
+       CFLAGS += -O2
+endif
+ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS)))
+       INSTALL_PROGRAM += -s
+endif
+
+configure: configure-stamp
+configure-stamp:
+       dh_testdir
+       #
+       touch configure-stamp
+
+build: build-stamp
+build-stamp: configure-stamp
+       dh_testdir
+       mkdir -p build
+       cd build;cmake ../ -DCMAKE_INSTALL_PREFIX:PATH=/opt/AGL/@PROJECT_NAME@ -DCMAKE_INSTALL_LIBDIR:PATH=lib/$(DEB_HOST_MULTIARCH);$(MAKE)
+       #
+       touch build-stamp
+
+clean:
+       #dh_testdir
+       dh_testroot
+       rm -f configure-stamp build-stamp
+       [ ! -f Makefile ] || $(MAKE) distclean
+       #dh_clean
+
+install: build
+       dh_testdir
+       dh_testroot
+       dh_prep
+       dh_installdirs
+       # Add here commands to install the package into debian/tmp
+       mkdir -p debian/tmp/opt/AGL/@PROJECT_NAME@;cd build;make populate;cp -r package/* ../debian/tmp/opt/AGL/@PROJECT_NAME@/
+       mkdir -p debian/tmp/etc/profile.d
+       echo '#----------  AGL @PROJECT_NAME@ options Start ---------" '  > debian/tmp/etc/profile.d/AGL_@PROJECT_NAME@.sh
+       echo '# Object: AGL cmake option for  binder/bindings'  >> debian/tmp/etc/profile.d/AGL_@PROJECT_NAME@.sh
+       echo 'export LD_LIBRARY_PATH=/opt/AGL/@PROJECT_NAME@/lib/$(DEB_HOST_MULTIARCH):$$LD_LIBRARY_PATH'  >> debian/tmp/etc/profile.d/AGL_@PROJECT_NAME@.sh
+       echo 'export LIBRARY_PATH=/opt/AGL/@PROJECT_NAME@/lib/$(DEB_HOST_MULTIARCH):$$LIBRARY_PATH'  >> debian/tmp/etc/profile.d/AGL_@PROJECT_NAME@.sh
+       echo 'export PATH=/opt/AGL/@PROJECT_NAME@/bin:$$PATH'  >> debian/tmp/etc/profile.d/AGL_@PROJECT_NAME@.sh
+       echo '#----------  AGL options End ---------'  >> debian/tmp/etc/profile.d/AGL_@PROJECT_NAME@.sh
+       # Move all files in their corresponding package
+       dh_install --list-missing -s --sourcedir=debian/tmp
+       # empty dependency_libs in .la files
+       #sed -i "/dependency_libs/ s/'.*'/''/" `find debian/ -name '*.la'`
+
+# Build architecture-independent files here.
+binary-indep: build install
+# We have nothing to do by default.
+
+# Build architecture-dependent files here.
+binary-arch: build install
+       dh_testdir
+       dh_testroot
+       dh_installchangelogs
+       dh_installdocs
+       dh_installexamples
+       dh_installman
+       dh_link
+       dh_strip
+       dh_compress
+       dh_fixperms
+       dh_makeshlibs -V
+       dh_installdeb
+       dh_shlibdeps --dpkg-shlibdeps-params=--ignore-missing-info
+       dh_gencontrol
+       dh_md5sums
+       dh_builddeb
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install
diff --git a/ll-database-binding/conf.d/app-templates/template.d/gdb-on-target.ini.in b/ll-database-binding/conf.d/app-templates/template.d/gdb-on-target.ini.in
new file mode 100644 (file)
index 0000000..20c8d30
--- /dev/null
@@ -0,0 +1,39 @@
+# gdb-remote.init file for IDE
+# Object: allow to use standard gdb to remote debug a target
+# Usage: remote-target-populate update script under ./build directory
+# Author: Fulup Ar Foll (IoT.bzh)
+# Reference: https://blog.flameeyes.eu/2010/02/remote-debugging-with-gdb-part-2-gdb/
+#
+# Warning:
+#  - on target start with $GDB ./target/gdb-cross-root@$TARGET.ini  
+#  - Netbeans impose debug-command to point on a local instance of afb-daemon binary
+#  - --ldpath should be absolute as solib-search-path refuse to work as documented
+
+# xds-gdb annotation to point where it should 
+# :XDS-ENV: XDS_PROJECT_ID=@XDS_PROJECT_ID@
+# :XDS-ENV: XDS_SDK_ID=@XDS_SDK_ID@
+# :XDS-ENV: XDS_SERVER_URL=@XDS_SERVER_URL@
+
+# Start gdbserver on target and connect through SSH link WARNING:
+target remote | ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null @RSYNC_TARGET@ gdbserver - \
+       /usr/bin/afb-daemon --port=@AFB_REMPORT@ --workdir=@RSYNC_PREFIX@/@PROJECT_NAME@ --roothttp=htdocs --ldpaths=@RSYNC_PREFIX@/@PROJECT_NAME@/lib --verbose --token=@AFB_TOKEN@
+
+# Disable auto answer no on questions and to set breakpoint
+set confirm off
+
+# Disable auto load of libraries to improved perf
+set auto-solib-add off
+
+# Define path for project libraries
+set solib-search-path ${PROJECT_PKG_BUILD_DIR}
+
+# Replace run by continue done by xds-gdb
+
+# Manually load project libraries when loaded by afb-daemon
+tbreak @GDB_INITIAL_BREAK@
+commands
+sharedlibrary @RSYNC_PREFIX@/@PROJECT_NAME@
+continue
+end
+
+
diff --git a/ll-database-binding/conf.d/app-templates/template.d/install-wgt-on-target.sh.in b/ll-database-binding/conf.d/app-templates/template.d/install-wgt-on-target.sh.in
new file mode 100755 (executable)
index 0000000..39a69d5
--- /dev/null
@@ -0,0 +1,19 @@
+#!/bin/sh
+#
+# File:   install-wgt-on-target.sh
+# Author: Sebastien Douheret @ IoT.bzh
+# Object: install widget on target
+# Created on 24-May-2017, 09:23:37
+# Usage:
+
+# Do not change manually use 'make remote-target-populate'
+export RSYNC_TARGET=@RSYNC_TARGET@
+export WGT_FILE_L=@CMAKE_CURRENT_BINARY_DIR@/@PROJECT_NAME@.wgt
+export WGT_FILE_T=/tmp/@PROJECT_NAME@.wgt
+
+scp $WGT_FILE_L $RSYNC_TARGET:$WGT_FILE_T \
+    && ssh -o "StrictHostKeyChecking no" -tt $RSYNC_TARGET -- \
+        afm-util install $WGT_FILE_T
+
+#    && rm -f $WGT_FILE_T
+
diff --git a/ll-database-binding/conf.d/app-templates/template.d/rpm-config.spec.in b/ll-database-binding/conf.d/app-templates/template.d/rpm-config.spec.in
new file mode 100644 (file)
index 0000000..34a605d
--- /dev/null
@@ -0,0 +1,62 @@
+###########################################################################
+# Copyright 2015, 2016, 2017 IoT.bzh
+#
+# author: @PROJECT_AUTHOR@ <@PROJECT_AUTHOR_MAIL@>
+#
+# 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.
+###########################################################################
+
+
+Name:    @NPKG_PROJECT_NAME@
+Version: @PROJECT_VERSION@
+Release: 1
+Group:   AGL
+License: @PROJECT_LICENSE@
+Summary: @PROJECT_DESCRIPTION@
+Url:     @PROJECT_URL@
+Source0: %{name}_%{version}.orig.tar.gz
+
+BuildRequires: cmake
+BuildRequires: gcc gcc-c++
+@RPM_PKG_DEPS@
+
+BuildRoot:     %{_tmppath}/%{name}-%{version}-build
+
+%define _prefix /opt/AGL/@PROJECT_NAME@
+%define __cmake cmake
+
+%description
+@PROJECT_DESCRIPTION@
+
+%prep
+%setup -q
+
+%build
+%cmake -DCMAKE_INSTALL_PREFIX:PATH=%{_libdir}
+make %{?_smp_mflags}
+
+%install
+CURDIR=$(pwd)
+[ -d build ] && cd build
+make populate
+mkdir -p %{?buildroot}%{_prefix}
+cp -r package/* %{?buildroot}%{_prefix}
+
+cd $CURDIR
+find %{?buildroot}%{_prefix} -type d -exec echo "%dir {}" \;>> pkg_file
+find %{?buildroot}%{_prefix} -type f -exec echo "{}" \;>> pkg_file
+sed -i 's@%{?buildroot}@@g' pkg_file
+
+
+%files -f pkg_file
+%defattr(-,root,root)
diff --git a/ll-database-binding/conf.d/app-templates/template.d/start-on-target.sh.in b/ll-database-binding/conf.d/app-templates/template.d/start-on-target.sh.in
new file mode 100755 (executable)
index 0000000..9baab37
--- /dev/null
@@ -0,0 +1,25 @@
+#!/bin/sh
+#
+# File:   start-on-target.sh
+# Author: Fulup Ar Foll @ IoT.bzh
+# Object: Forward signal (SIGTERM) to remote process
+# Created on 24-May-2017, 09:23:37
+# Usage: remote-target-populate update script under ./build directory
+
+# Do not change manually use 'make remote-target-populate'
+export RSYNC_TARGET=@RSYNC_TARGET@
+export PROJECT_NAME=@PROJECT_NAME@
+export RSYNC_PREFIX=@RSYNC_PREFIX@/@PROJECT_NAME@
+export AFB_REMPORT=@AFB_REMPORT@
+export AFB_TOKEN=@AFB_TOKEN@
+
+exec ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -tt $RSYNC_TARGET << EOF
+    afb-daemon --workdir=$RSYNC_PREFIX --monitoring --port=$AFB_REMPORT --roothttp=./htdocs --ldpath=./lib --verbose --token=$AFB_TOKEN &
+    PID_DAEMON=\$!
+    trap "echo REMOTE-SIGNAL TRAP; kill -15 \$PID_DAEMON" INT QUIT TERM EXIT
+    echo "Target Process Waiting for command"
+
+    # wait for daemon to finish
+    wait \$PID_DAEMON
+    exit
+EOF
diff --git a/ll-database-binding/conf.d/app-templates/template.d/xds-project-target.conf.in b/ll-database-binding/conf.d/app-templates/template.d/xds-project-target.conf.in
new file mode 100644 (file)
index 0000000..814597c
--- /dev/null
@@ -0,0 +1,12 @@
+#
+#       Cmake generated Do Not Edit
+# 
+# Template:  conf.d/app-templates/template.d/xds-project.conf.in
+# Values:  $HOME/.config/app-templates/cmake/xx-projectname-xds.cmake
+#
+# WARNING: in Xdev mode $HOME is ~devel HOME on xds-docker
+#
+export XDS_SERVER_URL=@XDS_SERVER_URL@
+export XDS_PROJECT_ID=@XDS_PROJECT_ID@
+export XDS_SDK_ID=@XDS_SDK_ID@
+
diff --git a/ll-database-binding/conf.d/app-templates/wgt/icon-default.png b/ll-database-binding/conf.d/app-templates/wgt/icon-default.png
new file mode 100644 (file)
index 0000000..def888b
Binary files /dev/null and b/ll-database-binding/conf.d/app-templates/wgt/icon-default.png differ
diff --git a/ll-database-binding/conf.d/app-templates/wgt/icon-html5.png b/ll-database-binding/conf.d/app-templates/wgt/icon-html5.png
new file mode 100644 (file)
index 0000000..a3573ef
Binary files /dev/null and b/ll-database-binding/conf.d/app-templates/wgt/icon-html5.png differ
diff --git a/ll-database-binding/conf.d/app-templates/wgt/icon-native.png b/ll-database-binding/conf.d/app-templates/wgt/icon-native.png
new file mode 100644 (file)
index 0000000..fcb5d35
Binary files /dev/null and b/ll-database-binding/conf.d/app-templates/wgt/icon-native.png differ
diff --git a/ll-database-binding/conf.d/app-templates/wgt/icon-qml.png b/ll-database-binding/conf.d/app-templates/wgt/icon-qml.png
new file mode 100644 (file)
index 0000000..ba248ea
Binary files /dev/null and b/ll-database-binding/conf.d/app-templates/wgt/icon-qml.png differ
diff --git a/ll-database-binding/conf.d/app-templates/wgt/icon-service.png b/ll-database-binding/conf.d/app-templates/wgt/icon-service.png
new file mode 100644 (file)
index 0000000..3aeb6f0
Binary files /dev/null and b/ll-database-binding/conf.d/app-templates/wgt/icon-service.png differ
diff --git a/ll-database-binding/conf.d/cmake/FindBerkeleyDB.cmake b/ll-database-binding/conf.d/cmake/FindBerkeleyDB.cmake
new file mode 100644 (file)
index 0000000..1f94785
--- /dev/null
@@ -0,0 +1,51 @@
+# -*- cmake -*-
+
+# - Find BerkeleyDB
+# Find the BerkeleyDB includes and library
+# This module defines
+#  DB_INCLUDE_DIR, where to find db.h, etc.
+#  DB_LIBRARIES, the libraries needed to use BerkeleyDB.
+#  DB_FOUND, If false, do not try to use BerkeleyDB.
+# also defined, but not for general use are
+#  DB_LIBRARY, where to find the BerkeleyDB library.
+
+FIND_PATH(DB_INCLUDE_DIR db.h
+  /usr/local/include/db4
+  /usr/local/include
+  /usr/include/db4
+  /usr/include
+  )
+
+SET(DB_NAMES ${DB_NAMES} db)
+FIND_LIBRARY(DB_LIBRARY
+  NAMES ${DB_NAMES}
+  PATHS /usr/lib /usr/local/lib
+  )
+
+IF (DB_LIBRARY AND DB_INCLUDE_DIR)
+  SET(DB_LIBRARIES ${DB_LIBRARY})
+  SET(DB_FOUND "YES")
+ELSE (DB_LIBRARY AND DB_INCLUDE_DIR)
+  SET(DB_FOUND "NO")
+ENDIF (DB_LIBRARY AND DB_INCLUDE_DIR)
+
+
+IF (DB_FOUND)
+  IF (NOT DB_FIND_QUIETLY)
+    MESSAGE(STATUS "Found BerkeleyDB: ${DB_LIBRARIES}")
+  ENDIF (NOT DB_FIND_QUIETLY)
+ELSE (DB_FOUND)
+  IF (DB_FIND_REQUIRED)
+    MESSAGE(FATAL_ERROR "Could not find BerkeleyDB library")
+  ENDIF (DB_FIND_REQUIRED)
+ENDIF (DB_FOUND)
+
+# Deprecated declarations.
+SET (NATIVE_DB_INCLUDE_PATH ${DB_INCLUDE_DIR} )
+GET_FILENAME_COMPONENT (NATIVE_DB_LIB_PATH ${DB_LIBRARY} PATH)
+
+MARK_AS_ADVANCED(
+  DB_LIBRARY
+  DB_INCLUDE_DIR
+  )
+
similarity index 55%
rename from ll-store-binding/conf.d/cmake/config.cmake
rename to ll-database-binding/conf.d/cmake/config.cmake
index 4b21688..1731224 100644 (file)
@@ -1,7 +1,7 @@
 ###########################################################################
-# Copyright 2015, 2016, 2017 IoT.bzh
+# Copyright 2017 IoT.bzh
 #
-# author: Loïc Collignon <collignon.loic@iot.bzh>
+# author: Loïc Collignon <loic.collignon@iot.bzh>
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 
 # Project Info
 # ------------------
-set(PROJECT_NAME ll-store-binding)
-set(PROJECT_VERSION "0.1")
-set(PROJECT_PRETTY_NAME "Low Level Store Binding")
-set(PROJECT_DESCRIPTION "Binding able to store and retrieve data by user/app/tag.")
+set(PROJECT_NAME ll-database-binding)
+set(PROJECT_VERSION "0.0")
+set(PROJECT_PRETTY_NAME "Low Level Database Binding")
+set(PROJECT_DESCRIPTION "")
 set(PROJECT_URL "")
 set(PROJECT_ICON "icon.png")
 set(PROJECT_AUTHOR "Collignon, Loïc")
 set(PROJECT_AUTHOR_MAIL "loic.collignon@iot.bzh")
-set(PROJECT_LICENSE "Apache-V2")
+set(PROJECT_LICENSE "APL2.0")
 set(PROJECT_LANGUAGES,"C")
 
 # Where are stored default templates files from submodule or subtree app-templates in your project tree
 # relative to the root project directory
-set(PROJECT_APP_TEMPLATES_DIR "../conf.d/app-templates")
+set(PROJECT_APP_TEMPLATES_DIR "conf.d/app-templates")
 
 # Where are stored your external libraries for your project. This is 3rd party library that you don't maintain
 # but used and must be built and linked.
@@ -47,10 +47,18 @@ set(PROJECT_APP_TEMPLATES_DIR "../conf.d/app-templates")
 # ----------------------------------
 set(CMAKE_BUILD_TYPE "DEBUG")
 
-# Kernel selection if needed. Impose a minimal version.
-# NOTE FOR NOW IT CHECKS KERNEL Yocto SDK Kernel version
-# else only HOST VERSION
+# Kernel selection if needed. You can choose between a
+# mandatory version to impose a minimal version.
+# Or check Kernel minimal version and just print a Warning
+# about missing features and define a preprocessor variable
+# to be used as preprocessor condition in code to disable
+# incompatibles features. Preprocessor define is named
+# KERNEL_MINIMAL_VERSION_OK.
+#
+# NOTE*** FOR NOW IT CHECKS KERNEL Yocto environment and
+# Yocto SDK Kernel version.
 # -----------------------------------------------
+#set (kernel_mandatory_version 4.8)
 #set (kernel_minimal_version 4.8)
 
 # Compiler selection if needed. Impose a minimal version.
@@ -66,28 +74,66 @@ set (PKG_REQUIRED_LIST
        libmicrohttpd>=0.9.55
 )
 
-# Static constante definition
-# -----------------------------
-add_compile_options()
-
-# LANG Specific compile flags set for all build types
-set(CMAKE_C_FLAGS "")
-set(CMAKE_CXX_FLAGS "")
+# Prefix path where will be installed the files
+# Default: /usr/local (need root permission to write in)
+# ------------------------------------------------------
+#set(CMAKE_INSTALL_PREFIX $ENV{HOME}/opt)
 
-# Print a helper message when every thing is finished
-# ----------------------------------------------------
-#set(CLOSING_MESSAGE "")
-#set(PACKAGE_MESSAGE "Install widget file using in the target : afm-util install ${PROJECT_NAME}.wgt")
+# Customize link option
+# -----------------------------
+#list(APPEND link_libraries -an-option)
+
+# Compilation options definition
+# Use CMake generator expressions to specify only for a specific language
+# Values are prefilled with default options that is currently used.
+# Either separate options with ";", or each options must be quoted separately
+# DO NOT PUT ALL OPTION QUOTED AT ONCE , COMPILATION COULD FAILED !
+# ----------------------------------------------------------------------------
+#set(COMPILE_OPTIONS
+# -Wall
+# -Wextra
+# -Wconversion
+# -Wno-unused-parameter
+# -Wno-sign-compare
+# -Wno-sign-conversion
+# -Werror=maybe-uninitialized
+# -Werror=implicit-function-declaration
+# -ffunction-sections
+# -fdata-sections
+# -fPIC
+# CACHE STRING "Compilation flags")
+#set(C_COMPILE_OPTIONS "" CACHE STRING "Compilation flags for C language.")
+#set(CXX_COMPILE_OPTIONS "" CACHE STRING "Compilation flags for C++ language.")
+#set(PROFILING_COMPILE_OPTIONS
+# -g
+# -O0
+# -pg
+# -Wp,-U_FORTIFY_SOURCE
+# CACHE STRING "Compilation flags for PROFILING build type.")
+#set(DEBUG_COMPILE_OPTIONS
+# -g
+# -ggdb
+# -Wp,-U_FORTIFY_SOURCE
+# CACHE STRING "Compilation flags for DEBUG build type.")
+#set(CCOV_COMPILE_OPTIONS
+# -g
+# -O2
+# --coverage
+# CACHE STRING "Compilation flags for CCOV build type.")
+#set(RELEASE_COMPILE_OPTIONS
+# -g
+# -O2
+# CACHE STRING "Compilation flags for RELEASE build type.")
 
 # (BUG!!!) as PKG_CONFIG_PATH does not work [should be an env variable]
 # ---------------------------------------------------------------------
-set(CMAKE_INSTALL_PREFIX $ENV{HOME}/opt)
-set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${CMAKE_INSTALL_PREFIX}/lib64/pkgconfig ${CMAKE_INSTALL_PREFIX}/lib/pkgconfig)
+set(CMAKE_PREFIX_PATH ${CMAKE_INSTALL_PREFIX}/lib64/pkgconfig ${CMAKE_INSTALL_PREFIX}/lib/pkgconfig)
 set(LD_LIBRARY_PATH ${CMAKE_INSTALL_PREFIX}/lib64 ${CMAKE_INSTALL_PREFIX}/lib)
 
 # Optional location for config.xml.in
 # -----------------------------------
-#set(WIDGET_CONFIG_TEMPLATE ${CMAKE_CURRENT_SOURCE_DIR}/conf.d/config.xml.in)
+#set(WIDGET_ICON conf.d/wgt/${PROJECT_ICON} CACHE PATH "Path to the widget icon")
+#set(WIDGET_CONFIG_TEMPLATE ${CMAKE_CURRENT_SOURCE_DIR}/conf.d/wgt/config.xml.in CACHE PATH "Path to widget config file template (config.xml.in)")
 
 # Mandatory widget Mimetype specification of the main unit
 # --------------------------------------------------------------------------
@@ -125,10 +171,6 @@ set(WIDGET_ENTRY_POINT EntryPoint_Path_Not_Set)
 # -------------------------
 #set(EXTRA_LINK_LIBRARIES)
 
-# Optional force binding installation
-# ------------------------------------
-# set(BINDINGS_INSTALL_PREFIX PrefixPath )
-
 # Optional force binding Linking flag
 # ------------------------------------
 # set(BINDINGS_LINK_FLAG LinkOptions )
@@ -140,8 +182,20 @@ set(WIDGET_ENTRY_POINT EntryPoint_Path_Not_Set)
 # Optional Application Framework security token
 # and port use for remote debugging.
 #------------------------------------------------------------
-#set(AFB_TOKEN   ""      CACHE PATH "Default AFB_TOKEN")
-#set(AFB_REMPORT "1234" CACHE PATH "Default AFB_TOKEN")
+set(AFB_TOKEN   ""     CACHE PATH "Default binder security token")
+set(AFB_REMPORT "1234" CACHE PATH "Default binder listening port")
+
+# Print a helper message when every thing is finished
+# ----------------------------------------------------
+set(CLOSING_MESSAGE "Typical binding launch: afb-daemon --port=${AFB_REMPORT} --workdir=${CMAKE_BINARY_DIR}/package --ldpaths=lib --roothttp=htdocs  --token=\"${AFB_TOKEN}\" --tracereq=common --verbose")
+set(PACKAGE_MESSAGE "Install widget file using in the target : afm-util install ${PROJECT_NAME}.wgt")
+
+# Optional schema validator about now only XML, LUA and JSON
+# are supported
+#------------------------------------------------------------
+#set(LUA_CHECKER "luac" "-p" CACHE STRING "LUA compiler")
+#set(XML_CHECKER "xmllint" CACHE STRING "XML linter")
+#set(JSON_CHECKER "json_verify" CACHE STRING "JSON linter")
 
 # This include is mandatory and MUST happens at the end
 # of this file, else you expose you to unexpected behavior
diff --git a/ll-database-binding/src/.ll-database-binding.c.swp b/ll-database-binding/src/.ll-database-binding.c.swp
new file mode 100644 (file)
index 0000000..54fb691
Binary files /dev/null and b/ll-database-binding/src/.ll-database-binding.c.swp differ
diff --git a/ll-database-binding/src/CMakeLists.txt b/ll-database-binding/src/CMakeLists.txt
new file mode 100644 (file)
index 0000000..904b857
--- /dev/null
@@ -0,0 +1,13 @@
+PROJECT_TARGET_ADD(ll-database-binding)
+
+find_package(BerkeleyDB REQUIRED)
+include_directories(${DB_INCLUDE_DIR})
+
+add_library(ll-database-binding MODULE ll-database-binding.c utils.h)
+target_link_libraries(ll-database-binding ${DB_LIBRARY})
+
+set_target_properties(ll-database-binding PROPERTIES
+        PREFIX "afb-"
+        LABELS "BINDING"
+        LINK_FLAGS ${BINDINGS_LINK_FLAG}
+        OUTPUT_NAME ${TARGET_NAME})
diff --git a/ll-database-binding/src/export.map b/ll-database-binding/src/export.map
new file mode 100644 (file)
index 0000000..ee2f413
--- /dev/null
@@ -0,0 +1 @@
+{ global: afbBindingV*; local: *; };
diff --git a/ll-database-binding/src/ll-database-binding.c b/ll-database-binding/src/ll-database-binding.c
new file mode 100644 (file)
index 0000000..adaf023
--- /dev/null
@@ -0,0 +1,389 @@
+/*
+ * Copyright 2017 IoT.bzh
+ *
+ * author: Loïc Collignon <loic.collignon@iot.bzh>
+ *
+ * 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.
+ */
+
+#define _GNU_SOURCE
+#include <unistd.h>
+#include <sys/types.h>
+#include <pwd.h>
+#include <stdio.h>
+#include <string.h>
+#include <linux/limits.h>
+#include <json-c/json.h>
+#include <db.h>
+
+#define AFB_BINDING_VERSION 2
+#include <afb/afb-binding.h>
+
+#include "utils.h"
+
+#define DBFILE         "/ll-database-binding.db"
+#define USERNAME       "agl"
+#define APPNAME                "firefox"
+
+// ----- Globals -----
+DB*            database;
+char*  database_file;
+
+// ----- Binding's declarations -----
+int ll_database_binding_init();
+void verb_read(struct afb_req req);
+void verb_update(struct afb_req req);
+void verb_delete(struct afb_req req);
+
+void verb_insert(struct afb_req req);
+void verb_update(struct afb_req req);
+void verb_delete(struct afb_req req);
+void verb_read(struct afb_req req);
+
+// ----- Binding's implementations -----
+
+/**
+ * @brief Initialize the binding.
+ * @return Exit code, zero if success.
+ */
+int ll_database_binding_init()
+{
+       struct passwd pwd;
+       struct passwd* result;
+       char* buf;
+       size_t bufsize;
+       int ret;
+       
+       bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
+       if (bufsize == -1) bufsize = 16384;
+       buf = malloc(bufsize);
+       if (buf == NULL)
+       {
+               AFB_ERROR("Allocation failed!");
+               return 1;
+       }
+       
+       ret = getpwuid_r(getuid(), &pwd, buf, bufsize, &result);
+       if (result == NULL)
+       {
+               free(buf);
+               if (ret == 0) AFB_ERROR("User not found");
+               else AFB_ERROR("getpwuid_r failed with %d code", ret);
+               return 1;
+       }
+       
+       bufsize = strlen(result->pw_dir) + strlen(DBFILE) + 1;
+       database_file = malloc(bufsize);
+       if (database_file == NULL)
+       {
+               free(buf);
+               AFB_ERROR("Allocation failed!");
+               return 1;
+       }
+       
+       memset(database_file, 0, bufsize);      
+       strcat(database_file, result->pw_dir);
+       strcat(database_file, DBFILE);
+       free(buf);
+       
+       AFB_INFO("The database file is '%s'", database_file);
+
+       if ((ret = db_create(&database, NULL, 0)) != 0)
+       {
+               AFB_ERROR("Failed to create database: %s.", db_strerror(ret));
+               free(database_file);
+               return 1;
+       }
+       
+       if ((ret = database->open(database, NULL, database_file, NULL, DB_BTREE, DB_CREATE, 0664)) != 0)
+       {
+               AFB_ERROR("Failed to open the '%s' database: %s.", database_file, db_strerror(ret));
+               database->close(database, 0);
+               free(database_file);
+               return 1;
+       }
+       
+       return 0;
+}
+
+/**
+ * @brief Handle the @c read verb.
+ * @param[in] req The query.
+ */
+void verb_insert(struct afb_req req)
+{
+       DBT key;
+       DBT data;
+       int ret;
+       
+       char* rkey;
+       const char* tag;
+       const char* value;
+       
+       struct json_object* args;
+       struct json_object* item;
+       
+       args = afb_req_json(req);
+       
+       if (!args)
+       {
+               afb_req_fail(req, "No argument provided.", NULL);
+               return;
+       }
+       
+       if (!json_object_object_get_ex(args, "key", &item) || !item) tag = NULL;
+       else tag = json_object_get_string(item);
+       
+       if (!tag || !strlen(tag))
+       {
+               afb_req_fail(req, "No tag provided.", NULL);
+               return;
+       }
+       
+       if (!json_object_object_get_ex(args, "value", &item) || !item) value = NULL;
+       else value = json_object_get_string(item);
+       
+       if (!value || !strlen(value))
+       {
+               afb_req_fail(req, "No value provided.", NULL);
+               return;
+       }
+       
+       rkey = malloc(strlen(USERNAME) + strlen(APPNAME) + strlen(tag) + 3);
+       strcpy(rkey, USERNAME);
+       strcat(rkey, ":");
+       strcat(rkey, APPNAME);
+       strcat(rkey, ":");
+       strcat(rkey, tag);
+       
+       AFB_INFO("insert: key=%s, value=%s", rkey, value);
+
+       memset(&key, 0, sizeof(key));
+       memset(&data, 0, sizeof(data));
+       
+       key.data = rkey;
+       key.size = strlen(rkey);
+       
+       data.data = (void*)value;
+       data.size = strlen(value);
+
+       if ((ret = database->put(database, NULL, &key, &data, DB_NOOVERWRITE)) == 0)
+               afb_req_success_f(req, NULL, "db success: insertion %s=%s.", (char*)key.data, (char*)data.data);
+       else
+               afb_req_fail_f(req, "Failed to insert datas.", "db fail: insertion : %s=%s - %s", (char*)key.data, (char*)data.data, db_strerror(ret));
+       free(rkey);
+}
+
+void verb_update(struct afb_req req)
+{
+       DBT key;
+       DBT data;
+       int ret;
+       
+       char* rkey;
+       const char* tag;
+       const char* value;
+       
+       struct json_object* args;
+       struct json_object* item;
+       
+       args = afb_req_json(req);
+       // username should be get from identity binding
+       // application should be get from smack
+       // tag should be get using get_json_string(args, "tag");
+       
+       if (!args)
+       {
+               afb_req_fail(req, "No argument provided.", NULL);
+               return;
+       }
+       
+       if (!json_object_object_get_ex(args, "tag", &item) || !item) tag = NULL;
+       else tag = json_object_get_string(item);
+       
+       if (!tag || !strlen(tag))
+       {
+               afb_req_fail(req, "No tag provided.", NULL);
+               return;
+       }
+       
+       if (!json_object_object_get_ex(args, "value", &item) || !item) value = NULL;
+       else value = json_object_get_string(item);
+       
+       if (!value || !strlen(value))
+       {
+               afb_req_fail(req, "No value provided.", NULL);
+               return;
+       }
+       
+       rkey = malloc(strlen(USERNAME) + strlen(APPNAME) + strlen(tag) + 3);
+       strcpy(rkey, USERNAME);
+       strcat(rkey, ":");
+       strcat(rkey, APPNAME);
+       strcat(rkey, ":");
+       strcat(rkey, tag);
+       
+       AFB_INFO("update: key=%s, value=%s", rkey, value);
+
+       memset(&key, 0, sizeof(key));
+       memset(&data, 0, sizeof(data));
+       
+       key.data = rkey;
+       key.size = strlen(rkey);
+       
+       data.data = (void*)value;
+       data.size = strlen(value);
+
+       if ((ret = database->put(database, NULL, &key, &data, 0)) == 0)
+               afb_req_success_f(req, NULL, "db success: update %s=%s.", (char*)key.data, (char*)data.data);
+       else
+               afb_req_fail_f(req, "Failed to update datas.", "db fail: update %s=%s - %s", (char*)key.data, (char*)data.data, db_strerror(ret));
+       free(rkey);
+}
+
+void verb_delete(struct afb_req req)
+{
+       DBT key;
+       int ret;
+       
+       char* rkey;
+       const char* tag;
+       
+       struct json_object* args;
+       struct json_object* item;
+       
+       args = afb_req_json(req);
+       
+       if (!args)
+       {
+               afb_req_fail(req, "No argument provided.", NULL);
+               return;
+       }
+       
+       if (!json_object_object_get_ex(args, "tag", &item) || !item) tag = NULL;
+       else tag = json_object_get_string(item);
+       
+       if (!tag || !strlen(tag))
+       {
+               afb_req_fail(req, "No tag provided.", NULL);
+               return;
+       }
+       
+       rkey = malloc(strlen(USERNAME) + strlen(APPNAME) + strlen(tag) + 3);
+       strcpy(rkey, USERNAME);
+       strcat(rkey, ":");
+       strcat(rkey, APPNAME);
+       strcat(rkey, ":");
+       strcat(rkey, tag);
+       
+       AFB_INFO("delete: key=%s", rkey);
+
+       memset(&key, 0, sizeof(key));
+       
+       key.data = rkey;
+       key.size = strlen(rkey);
+
+       if ((ret = database->del(database, NULL, &key, 0)) == 0)
+               afb_req_success_f(req, NULL, "db success: delete %s.", (char *)key.data);
+       else
+               afb_req_fail_f(req, "Failed to delete datas.", "db fail: delete %s - %s", (char*)key.data, db_strerror(ret));
+       free(rkey);
+}
+
+void verb_read(struct afb_req req)
+{
+       DB* dbp;
+       DBT key;
+       DBT data;
+       int ret;
+       
+       char* rkey;
+       const char* tag;
+       char value[4096];
+       
+       struct json_object* args;
+       struct json_object* item;
+       struct json_object* result;
+       struct json_object* val;
+       
+       args = afb_req_json(req);
+       
+       if (!args)
+       {
+               afb_req_fail(req, "No argument provided.", NULL);
+               return;
+       }
+       
+       if (!json_object_object_get_ex(args, "tag", &item) || !item) tag = NULL;
+       else tag = json_object_get_string(item);
+       
+       if (!tag || !strlen(tag))
+       {
+               afb_req_fail(req, "No tag provided.", NULL);
+               return;
+       }
+       
+       rkey = malloc(strlen(USERNAME) + strlen(APPNAME) + strlen(tag) + 3);
+       strcpy(rkey, USERNAME);
+       strcat(rkey, ":");
+       strcat(rkey, APPNAME);
+       strcat(rkey, ":");
+       strcat(rkey, tag);
+       
+       AFB_INFO("update: key=%s, value=%s", rkey, value);
+
+       memset(&key, 0, sizeof(key));
+       memset(&data, 0, sizeof(data));
+       memset(&value, 0, 4096);
+       
+       key.data = rkey;
+       key.size = strlen(rkey);
+       
+       data.data = value;
+       data.ulen = 4096;
+       data.flags = DB_DBT_USERMEM;
+
+       if ((ret = database->get(database, NULL, &key, &data, 0)) == 0)
+       {
+               result = json_object_new_object();
+               val = json_tokener_parse((char*)data.data);
+               json_object_object_add(result, "value", val ? val : json_object_new_string((char*)data.data));
+               
+               afb_req_success_f(req, result, "db success: read %s=%s.", (char*)key.data, (char*)data.data);
+       }
+       else
+               afb_req_fail_f(req, "Failed to read datas.", "db fail: read %s - %s", (char*)key.data, db_strerror(ret));
+       free(rkey);
+}
+
+// ----- Binding's configuration -----
+static const struct afb_auth ll_database_binding_auths[] = {
+};
+
+static const afb_verb_v2 ll_database_binding_verbs[]= {
+               REGISTER_VERB(insert,   NULL, NULL, AFB_SESSION_NONE_V2),
+               REGISTER_VERB(update,   NULL, NULL, AFB_SESSION_NONE_V2),
+               REGISTER_VERB(delete,   NULL, NULL, AFB_SESSION_NONE_V2),
+               REGISTER_VERB(read,             NULL, NULL, AFB_SESSION_NONE_V2),
+        { .verb = NULL}
+};
+
+const struct afb_binding_v2 afbBindingV2 = {
+                .api = "ll-database",
+                .specification = NULL,
+                .verbs = ll_database_binding_verbs,
+                .preinit = NULL,
+                .init = ll_database_binding_init,
+                .onevent = NULL,
+                .noconcurrency = 0
+};
diff --git a/ll-database-binding/src/utils.h b/ll-database-binding/src/utils.h
new file mode 100644 (file)
index 0000000..093d591
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+* Copyright 2017 IoT.bzh
+*
+* author: Loïc Collignon <loic.collignon@iot.bzh>
+*
+* 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.
+*/
+
+#ifndef _BINDING_UTILS_H_
+#define _BINDING_UTILS_H_
+
+#include <string.h>
+#include <json-c/json.h>
+
+#ifndef AFB_BINDING_VERSION
+#define AFB_BINDING_VERSION 2
+#endif
+#include <afb/afb-binding.h>
+
+#define REGISTER_VERB(n, a, i, s) { .verb = #n, .callback = verb_##n, .auth = a, .info = i, .session = s }
+
+/**
+ * @brief Get a string from a json object.
+ * @param[in] obj Json object from wich the string is queried.
+ * @param[in] name Name of the string to get.
+ * @return The string value.
+ */
+static inline const char* get_json_string(struct json_object* obj, const char* name)
+{
+       struct json_object* item = NULL;
+       if (!obj || !name || !strlen(name)) return NULL;
+       if (!json_object_object_get_ex(obj, name, &item) || !item) return NULL;
+       return json_object_get_string(item);
+}
+
+/**
+ * @brief Add a string key/value to a json object.
+ * @param[in] obj The json object to which the key/value is added.
+ * @param[in] key The key to add.
+ * @param[in] value The value to add.
+ */
+static inline void json_object_add_string(struct json_object* obj, const char* key, const char* value)
+{
+       json_object_object_add(obj, key, json_object_new_string(value));
+}
+
+/**
+ * @brief Send an @c event with the specified @c message then fail with the same @c message.
+ * @param[in] req The query to fail.
+ * @param[in] event The event to push.
+ * @param[in] message The message to push with the event and use as a fail message.
+ */
+static inline void afb_fail_ex(struct afb_req req, struct afb_event event, const char* message)
+{
+       struct json_object* result = json_object_new_object();
+       json_object_add_string(result, "message", message);
+       afb_event_push(event, result);
+       
+       afb_req_fail(req, message, NULL);
+}
+
+#endif // _BINDING_UTILS_H_
diff --git a/ll-store-binding/src/CMakeLists.txt b/ll-store-binding/src/CMakeLists.txt
deleted file mode 100644 (file)
index b447f98..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-PROJECT_TARGET_ADD(ll-store-binding)
-
-list(APPEND link_libraries "/usr/lib64/liblmdb.so")
-add_library(ll-store-binding MODULE ll-store-binding.c)
-
-set_target_properties(ll-store-binding PROPERTIES
-       PREFIX "afb-"
-       LABELS "BINDING"
-       LINK_FLAGS ${BINDINGS_LINK_FLAG}
-       OUTPUT_NAME ${TARGET_NAME})
-
-target_link_libraries(ll-store-binding ${link_libraries})
-
-install(
-       TARGETS ll-store-binding
-       LIBRARY DESTINATION ${BINDINGS_INSTALL_DIR})
diff --git a/ll-store-binding/src/ll-store-binding.c b/ll-store-binding/src/ll-store-binding.c
deleted file mode 100644 (file)
index fd65552..0000000
+++ /dev/null
@@ -1,269 +0,0 @@
-#define _GNU_SOURCE
-#include <stdio.h>
-#include <string.h>
-#include <json-c/json.h>
-#include <lmdb.h>
-
-#define AFB_BINDING_VERSION 2
-#include <afb/afb-binding.h>
-
-#define DB_FILE "/home/agl/projects/ll-store-binding/build/src/ll-store-binding.lmdb"
-
-MDB_env* dbenv;
-
-/// @brief Get a string from a json object.
-/// @param[in] obj Json object from wich the string is queried.
-/// @param[in] name Name of the string to get.
-/// @return 
-const char* get_json_string(struct json_object* obj, const char* name)
-{
-       if (!obj || !name || !strlen(name)) return NULL;
-       
-       struct json_object* item = NULL;
-       if (!json_object_object_get_ex(obj, name, &item) || !item) return NULL;
-
-       return json_object_get_string(item);
-}
-
-char* make_key(const char* username, const char* appname, const char* tagname)
-{
-       size_t sz_username = username ? strlen(username) : 0;
-       size_t sz_appname = appname ? strlen(appname) : 0;
-       size_t sz_tagname = tagname ? strlen(tagname) : 0;
-       size_t sz_total = sz_username + sz_appname + sz_tagname + 3;
-
-       char* result = (char*)malloc(sz_total);
-       memset(result, sz_total, 0);
-
-       strcpy(result, username);
-       result[sz_username] = '.';
-       
-       strcpy(result + sz_username + 1, appname);
-       result[sz_username + 1 + sz_appname] = '.';
-
-       strcpy(result + sz_username + 1 + sz_appname + 1, tagname);
-       
-       return result;
-}
-
-static void verb_get(struct afb_req req)
-{
-       int r;
-       struct json_object* args = afb_req_json(req);
-
-       AFB_INFO("args:\n%s\n", json_object_to_json_string_ext(args, JSON_C_TO_STRING_PRETTY));
-
-       const char* username = get_json_string(args, "username");
-       const char* appname = get_json_string(args, "appname");
-       const char* tagname = get_json_string(args, "tagname");
-
-       if (!username || !appname || !tagname)
-       {
-               AFB_ERROR("[store] username, appname and tagname must be provided!");
-               afb_req_fail(req, "username, appname and tagname must be provided!", NULL);
-               return;
-       }
-
-       char* keyname = make_key(username, appname, tagname);
-
-       MDB_txn* txn;
-       r = mdb_txn_begin(dbenv, NULL, 0, &txn);
-       if (r)
-       {
-               free(keyname);
-               AFB_ERROR("Failed to begin a transaction!");
-               afb_req_fail(req, "Failed to begin a transaction!", NULL);
-               return;
-       }
-
-       MDB_dbi dbi;
-       r = mdb_dbi_open(txn, NULL, 0, &dbi);
-       if (r)
-       {
-               free(keyname);
-               mdb_txn_abort(txn);
-               AFB_ERROR("Failed to open the database!");
-               afb_req_fail(req, "Failed to open the database!", NULL);
-               return;
-       }
-
-       MDB_val k;
-       MDB_val v;
-       k.mv_size = strlen(keyname) + 1;
-       k.mv_data = keyname;
-
-       if(mdb_get(txn, dbi, &k, &v))
-       {
-               free(keyname);
-               mdb_txn_abort(txn);
-               mdb_dbi_close(dbenv, dbi);
-               AFB_ERROR("Failed to get the data!");
-               afb_req_fail(req, "Failed to get the data!", NULL);
-               return;
-       }
-
-       char* value = strndup(v.mv_data, v.mv_size + 1);
-       if(mdb_txn_commit(txn))
-       {
-               free(keyname);
-               free(value);
-               mdb_dbi_close(dbenv, dbi);
-               AFB_ERROR("Failed to commit the transaction!");
-               return;
-       }
-               
-       json_object* result = json_object_new_object();
-       json_object_object_add(result, "key", json_object_new_string(keyname));
-       json_object_object_add(result, "value", json_object_new_string(value));
-       afb_req_success(req, result, NULL);
-
-       free(value);
-       free(keyname);
-       return;
-}
-
-static void verb_set(struct afb_req req)
-{
-       int r;
-       struct json_object* args = afb_req_json(req);
-
-       AFB_INFO("args:\n%s\n", json_object_to_json_string_ext(args, JSON_C_TO_STRING_PRETTY));
-
-       const char* username = get_json_string(args, "username");
-       const char* appname = get_json_string(args, "appname");
-       const char* tagname = get_json_string(args, "tagname");
-       const char* value = get_json_string(args, "value");
-
-       if (!username || !appname || !tagname)
-       {
-               AFB_ERROR("[store] username, appname and tagname must be provided!");
-               afb_req_fail(req, "username, appname and tagname must be provided!", NULL);
-               return;
-       }
-
-       char* keyname = make_key(username, appname, tagname);
-
-       MDB_txn* txn;
-       r = mdb_txn_begin(dbenv, NULL, 0, &txn);
-       if (r)
-       {
-               free(keyname);
-               AFB_ERROR("Failed to begin a transaction!");
-               afb_req_fail(req, "Failed to begin a transaction!", NULL);
-               return;
-       }
-
-       MDB_dbi dbi;
-       r = mdb_dbi_open(txn, NULL, 0, &dbi);
-       if (r)
-       {
-               free(keyname);
-               mdb_txn_abort(txn);
-               AFB_ERROR("Failed to open the database!");
-               afb_req_fail(req, "Failed to open the database!", NULL);
-               return;
-       }
-
-       MDB_val k;
-       MDB_val v;
-       k.mv_size = strlen(keyname) + 1;
-       k.mv_data = keyname;
-       v.mv_size = value ? strlen(value) + 1 : 0;
-       v.mv_data = value;
-
-       if(mdb_put(txn, dbi, &k, &v, 0))
-       {
-               free(keyname);
-               mdb_txn_abort(txn);
-               mdb_dbi_close(dbenv, dbi);
-               AFB_ERROR("Failed to get the data!");
-               afb_req_fail(req, "Failed to get the data!", NULL);
-               return;
-       }
-
-       if(mdb_txn_commit(txn))
-       {
-               free(keyname);
-               mdb_dbi_close(dbenv, dbi);
-               AFB_ERROR("Failed to commit the transaction!");
-               return;
-       }
-               
-       json_object* result = json_object_new_object();
-       json_object_object_add(result, "key", json_object_new_string(keyname));
-       json_object_object_add(result, "value", json_object_new_string(value));
-       afb_req_success(req, result, NULL);
-
-       free(keyname);
-       return;
-}
-
-int ll_store_preinit()
-{
-       int r = mdb_env_create(&dbenv);
-       if (r)
-       {
-               AFB_INFO("Failed to create MDB environment!");
-               dbenv = NULL;
-               return r;
-       }
-
-       r = mdb_env_open(dbenv, "/home/agl/ll-store-binding.lmdb", MDB_NOSUBDIR, 0644);
-       if (r)
-       {
-               mdb_env_close(dbenv);
-               dbenv = NULL;
-               AFB_INFO("Failed to open MDB environment!");
-               return r;
-       }
-
-/*
-       MDB_txn* txn;
-       r = mdb_txn_begin(dbenv, NULL, 0, &txn);
-       if (r)
-       {
-               mdb_env_close(dbenv);
-               dbenv = NULL;
-               AFB_INFO("Failed to begin a transaction!");
-               return r;
-       }
-
-       MDB_dbi dbi;
-       r = mdb_dbi_open(txn, NULL, 0, &dbi);
-       if (r)
-       {
-               mdb_env_close(dbenv);
-               AFB_INFO("Failed to open the database!");
-               dbenv = NULL;
-       }
-*/
-       return 0;
-}
-
-static const afb_verb_v2 _ll_store_binding_verbs[]= {
-       {
-               .verb = "get",
-               .callback = verb_get,
-               .auth = NULL,
-               .info = NULL,
-               .session = AFB_SESSION_NONE_V2
-       },
-       {
-               .verb = "set",
-               .callback = verb_set,
-               .auth = NULL,
-               .info = NULL,
-               .session = AFB_SESSION_NONE_V2
-       },
-       { .verb=NULL}
-};
-
-const struct afb_binding_v2 afbBindingV2 = {
-               .api = "ll-store",
-               .specification = NULL,
-               .verbs = _ll_store_binding_verbs,
-               .preinit = ll_store_preinit,
-               .init = NULL,
-               .onevent = NULL,
-               .noconcurrency = 0
-};
diff --git a/ll-store-binding/start.sh b/ll-store-binding/start.sh
deleted file mode 100755 (executable)
index e37f05d..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/bash
-
-afb-daemon --port=9001 --token='' --binding=$PWD/build/src/afb-ll-store-binding.so --verbose
diff --git a/ll-store-binding/store.sh b/ll-store-binding/store.sh
deleted file mode 100755 (executable)
index d2dfbc7..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/sh
-
-case "$1" in
-       "get")
-               if [ "$#" -ne "4" ]; then
-                       echo "Usage: store get <user> <app> <tag>"
-                       exit 1
-               fi
-               curl -v "http://localhost:9001/api/ll-store/get?username=$2&appname=$3&tagname=$4&token="
-               ;;
-       "set")
-               if [ "$#" -ne "5" ]; then
-                       echo "Usage: store get <user> <app> <tag> <value>"
-                       exit 1
-               fi
-               curl -v "http://localhost:9001/api/ll-store/set?username=$2&appname=$3&tagname=$4&value=$5&token="
-               ;;
-       *)
-               echo "Usage: store <action> <user> <app> <tag> <value>"
-               echo "    Action can be 'get' or 'set'."
-               ;;
-esac
-