From: Loïc Collignon Date: Tue, 24 Oct 2017 11:34:38 +0000 (+0200) Subject: replaced store binding with a database binding based on a berkeley db X-Git-Tag: 4.99.5~35 X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=commitdiff_plain;h=97325dd67f3b7858bd093fc161d0a56e7c7bc9bd;p=apps%2Fagl-service-data-persistence.git replaced store binding with a database binding based on a berkeley db Change-Id: I03978ecbf996ebc6d53a88dfd2b275051080016f Signed-off-by: Loïc Collignon --- diff --git a/ll-database-binding/.gitmodules b/ll-database-binding/.gitmodules new file mode 100644 index 0000000..e07cae1 --- /dev/null +++ b/ll-database-binding/.gitmodules @@ -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 index 0000000..5e276f6 --- /dev/null +++ b/ll-database-binding/CMakeLists.txt @@ -0,0 +1,21 @@ +########################################################################### +# Copyright 2017 IoT.bzh +# +# author: Loïc Collignon +# +# 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 index 0000000..fb420dc --- /dev/null +++ b/ll-database-binding/README.md @@ -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 index 0000000..507c195 --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/.gitignore @@ -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 index 0000000..c22e5d1 --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/.gitreview @@ -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 index 0000000..93b07d3 --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/LICENSE @@ -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 index 0000000..eca9349 --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/README.md @@ -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 + +│ +├── 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 +├── +├── +│ └── +├── +│ └── +└── + └── +``` + +| # | Parent | Description | +| - | -------| ----------- | +| \ | - | Path to your project. Hold master CMakeLists.txt and general files of your projects. | +| conf.d | \ | 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. | +| \ | \ | 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. | +| \ | \ | 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 +git checkout --detach +git checkout --detach +# 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 _/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 index 0000000..dafc6ae --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/book.json @@ -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": "", + "flags": "g", + "substitute": "
" + }, + { + "pattern": "", + "flags": "g", + "substitute": "
" + }, + { + "pattern": "", + "flags": "g", + "substitute": "
" + }, + { + "pattern": "", + "flags": "g", + "substitute": "
" + }, + { + "pattern": "", + "flags": "g", + "substitute": "
" + }, + { + "pattern": "", + "flags": "g", + "substitute": "
" + }, + { + "pattern": "!\\[(.*?)\\]\\((.*?)(?:\\s+\"(.*)\")?\\){0,}{caption=1([^\\}]*)}", + "flags": "gmi", + "substitute": "
\"$1\"
", + "decode": true + }, + { + "pattern": "]*) {0,}\/{0,}> {0,}{caption=1([^\\}]*)}", + "flags": "g", + "substitute": "
", + "decode": true + }, + { + "pattern": "
", + "flags": "g", + "substitute": "
Picture _PAGE_LEVEL_._INDEX_: $2
", + "store": { + "substitute": "Pic. _PAGE_LEVEL_._INDEX_ $2", + "variable_name": "pictures" + } + }, + { + "pattern": "]*)> {0,}{style {1,}([^}]*)}", + "flags": "g", + "substitute": "", + "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 index 0000000..84649fc --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/cmake/cmake.d/01-build_options.cmake @@ -0,0 +1,116 @@ +########################################################################### +# Copyright 2015, 2016, 2017 IoT.bzh +# +# author: Fulup Ar Foll +# contrib: Romain Forlot +# +# 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($<$:${option}>) +endforeach() + +# Compilation OPTIONS depending on language +######################################### +foreach(option ${COMPILE_OPTIONS}) + add_compile_options(${option}) +endforeach() +foreach(option ${C_COMPILE_OPTIONS}) + add_compile_options($<$:${option}>) +endforeach() +foreach(option ${CXX_COMPILE_OPTIONS}) + add_compile_options($<$:${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($<$:${option}>) +endforeach() +foreach(option ${DEBUG_COMPILE_OPTIONS}) + add_compile_options($<$:${option}>) +endforeach() +foreach(option ${CCOV_COMPILE_OPTIONS}) + add_compile_options($<$:${option}>) +endforeach() +foreach(option ${RELEASE_COMPILE_OPTIONS}) + add_compile_options($<$:${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 index 0000000..0532c33 --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/cmake/cmake.d/02-variables.cmake @@ -0,0 +1,144 @@ +########################################################################### +# Copyright 2015, 2016, 2017 IoT.bzh +# +# author: Fulup Ar Foll +# contrib: Romain Forlot +# +# 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 index 0000000..06f61a4 --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/cmake/cmake.d/03-macros.cmake @@ -0,0 +1,513 @@ +########################################################################### +# Copyright 2015, 2016, 2017 IoT.bzh +# +# author: Fulup Ar Foll +# contrib: Romain Forlot +# +# 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 index 0000000..3ba8f4e --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/cmake/cmake.d/04-extra_targets.cmake @@ -0,0 +1,153 @@ +########################################################################### +# Copyright 2015, 2016, 2017 IoT.bzh +# +# author: Fulup Ar Foll +# contrib: Romain Forlot +# +# 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 index 0000000..041bb74 --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/cmake/common.cmake @@ -0,0 +1,90 @@ +########################################################################### +# Copyright 2015, 2016, 2017 IoT.bzh +# +# author: Fulup Ar Foll +# contrib: Romain Forlot +# +# 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 index 0000000..2028388 --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/cmake/configure_file.cmake @@ -0,0 +1,2 @@ +include(${CMAKE_BINARY_DIR}/CMakeCacheForScript.cmake) +configure_file(${INFILE} ${OUTFILE} @ONLY) diff --git a/ll-store-binding/src/export.map b/ll-database-binding/conf.d/app-templates/cmake/export.map similarity index 100% rename from ll-store-binding/src/export.map rename to ll-database-binding/conf.d/app-templates/cmake/export.map 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 index 0000000..38b6e74 --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/docs/0-Doc-Revisions.md @@ -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 index 0000000..39f9209 --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/docs/README.md @@ -0,0 +1,22 @@ +# Introduction + +This document explain how to use the CMake templates files and associated +files to ease developement of AGL application. + +
+
+
+
+
+ +| *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 index 0000000..f475678 --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/docs/SUMMARY.md @@ -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 index 0000000..bf325e9 --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/docs/_layouts/ebook/page.html @@ -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 %} + + {% else %} + + {% 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) %} + + {% endif %} + {% endfor %} +{% endblock %} + +{% block body %} +
+ {% block page %} +

{{ page.title }}

+
+ {{ page.content|safe }} +
+ {% endblock %} +
+{% 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 index 0000000..679e562 --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/docs/_layouts/ebook/pdf_footer.html @@ -0,0 +1,13 @@ +{% extends "./page.html" %} +{% block body %} + + + + +{% 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 index 0000000..ef49641 --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/docs/_layouts/ebook/pdf_header.html @@ -0,0 +1,13 @@ +{% extends "./page.html" %} +{% block body %} +
+ IoT.Bzh + {{ config.title }} +
+ + + + +{% 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 index 0000000..be328a4 --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/docs/_layouts/ebook/summary.html @@ -0,0 +1,58 @@ +{% extends "./page.html" %} + +{% block title %}{{ "SUMMARY"|t }}{% endblock %} + +{% macro articles(_articles) %} + {% for article in _articles %} +
  • + + {% if article.path or article.url %} + {% if article.path %} + {{ article.title }} + {% else %} + {{ article.title }} + {% endif %} + {% else %} + {{ article.title }} + {% endif %} + {% if 1 %} + {{ article.level }} + {% endif %} + + {% if article.articles.length > 0 %} +
      + {{ articles(article.articles) }} +
    + {% endif %} +
  • + {% endfor %} +{% endmacro %} + +{% block page %} +
    +

    {{ "SUMMARY"|t }}

    +
      + {% for part in summary.parts %} + {% if part.title %} +
    1. +

      {{ part.title }}

      +
    2. + {% endif %} + {{ articles(part.articles) }} + + {% if not loop.last %} +
    3. + {% endif %} + {% endfor %} + + {% if glossary.path %} +
    4. + + {{ "GLOSSARY"|t }} + +
    5. + {% endif %} +
    +
    +{% 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 index 0000000..3d5aca6 --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/docs/_layouts/layout.html @@ -0,0 +1,28 @@ + + + + + + {% block title %}{{ config.title|d("GitBook", true) }}{% endblock %} + + + + {% if config.author %}{% endif %} + {% if config.isbn %}{% endif %} + {% block style %} + {% for resource in plugins.resources.css %} + {% if resource.url %} + + {% else %} + + {% endif %} + {% endfor %} + {% endblock %} + + {% block head %}{% endblock %} + + + {% block body %}{% endblock %} + {% block javascript %}{% endblock %} + + 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 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 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 index 0000000..a04cc87 --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/docs/dev_guide/0_Abstract.md @@ -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 index 0000000..6db1ef2 --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/docs/dev_guide/1_Quickstart.md @@ -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 index 0000000..0cae607 --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/docs/dev_guide/2_project_architecture.md @@ -0,0 +1,98 @@ +# Project architecture + +A typical project architecture would be : + +```tree + +│ +├── 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 +├── +├── +│ └── +├── +│ └── +└── + └── +``` + +| # | Parent | Description | +| - | -------| ----------- | +| \ | - | Path to your project. Hold master CMakeLists.txt and general files of your projects. | +| conf.d | \ | 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. | +| \ | \ | 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. | +| \ | \ | 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 +git checkout --detach +git checkout --detach +# 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 index 0000000..f9d9e90 --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/docs/dev_guide/3_advanced_usage.md @@ -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 index 0000000..a9974a8 --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/docs/dev_guide/4_advanced_customization.md @@ -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 _/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 index 0000000..fe1c63d --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/docs/dev_guide/5_autobuild.md @@ -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 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 index 0000000..6726de7 --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/docs/resources/cover.svg @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + {title} + + {subtitle} + + {version} {date} + 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 index 0000000..39f126c --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/docs/resources/ebook.css @@ -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 index 0000000..1026ecb --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/docs/resources/make_cover.sh @@ -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 index 0000000..ea9400a --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/gendocs.sh @@ -0,0 +1,79 @@ +#!/bin/bash + +OUTFILENAME="Gitbook-Iotbzh-template" + +SCRIPT=$(basename $BASH_SOURCE) + +function usage() { + cat <&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 diff --git a/ll-store-binding/CMakeLists.txt b/ll-database-binding/conf.d/app-templates/samples.d/CMakeLists.txt.sample similarity index 90% rename from ll-store-binding/CMakeLists.txt rename to ll-database-binding/conf.d/app-templates/samples.d/CMakeLists.txt.sample index 7c83265..b485097 100644 --- a/ll-store-binding/CMakeLists.txt +++ b/ll-database-binding/conf.d/app-templates/samples.d/CMakeLists.txt.sample @@ -1,7 +1,7 @@ ########################################################################### # Copyright 2015, 2016, 2017 IoT.bzh # -# author: Loïc Collignon +# author: Romain Forlot # # 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 index 0000000..2497ee2 --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/samples.d/config.cmake.sample @@ -0,0 +1,203 @@ +########################################################################### +# Copyright 2015, 2016, 2017 IoT.bzh +# +# author: Fulup Ar Foll +# +# 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 index 0000000..b93f3d9 --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/samples.d/config.xml.in.sample @@ -0,0 +1,142 @@ + + + @PROJECT_NAME@ + + + @PROJECT_DESCRIPTION@ + @PROJECT_AUTHOR@ <@PROJECT_AUTHOR_MAIL@> + @PROJECT_LICENSE@ + + + + + + + + + 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 index 0000000..a4c51b1 --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/samples.d/xds-config.env.sample @@ -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 index 0000000..35d20b8 --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/template.d/config.xml.in @@ -0,0 +1,9 @@ + + + @PROJECT_NAME@ + + + @PROJECT_DESCRIPTION@ + @PROJECT_AUTHOR@ <@PROJECT_AUTHOR_MAIL@> + @PROJECT_LICENSE@ + 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 index 0000000..28a4835 --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/template.d/deb-config.dsc.in @@ -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 index 0000000..5858efd --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/template.d/deb-config.install.in @@ -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 index 0000000..f72c717 --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/template.d/debian.changelog.in @@ -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 index 0000000..45a4fb7 --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/template.d/debian.compat.in @@ -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 index 0000000..ea4ad8a --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/template.d/debian.control.in @@ -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 index 0000000..6bb2825 --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/template.d/debian.rules.in @@ -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 index 0000000..20c8d30 --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/template.d/gdb-on-target.ini.in @@ -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 index 0000000..39a69d5 --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/template.d/install-wgt-on-target.sh.in @@ -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 index 0000000..34a605d --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/template.d/rpm-config.spec.in @@ -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 index 0000000..9baab37 --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/template.d/start-on-target.sh.in @@ -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 index 0000000..814597c --- /dev/null +++ b/ll-database-binding/conf.d/app-templates/template.d/xds-project-target.conf.in @@ -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 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 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 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 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 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 index 0000000..1f94785 --- /dev/null +++ b/ll-database-binding/conf.d/cmake/FindBerkeleyDB.cmake @@ -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 + ) + diff --git a/ll-store-binding/conf.d/cmake/config.cmake b/ll-database-binding/conf.d/cmake/config.cmake 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 --- a/ll-store-binding/conf.d/cmake/config.cmake +++ b/ll-database-binding/conf.d/cmake/config.cmake @@ -1,7 +1,7 @@ ########################################################################### -# Copyright 2015, 2016, 2017 IoT.bzh +# Copyright 2017 IoT.bzh # -# author: Loïc Collignon +# author: Loïc Collignon # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -18,20 +18,20 @@ # 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 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 index 0000000..904b857 --- /dev/null +++ b/ll-database-binding/src/CMakeLists.txt @@ -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 index 0000000..ee2f413 --- /dev/null +++ b/ll-database-binding/src/export.map @@ -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 index 0000000..adaf023 --- /dev/null +++ b/ll-database-binding/src/ll-database-binding.c @@ -0,0 +1,389 @@ +/* + * Copyright 2017 IoT.bzh + * + * author: Loïc Collignon + * + * 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 +#include +#include +#include +#include +#include +#include +#include + +#define AFB_BINDING_VERSION 2 +#include + +#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 index 0000000..093d591 --- /dev/null +++ b/ll-database-binding/src/utils.h @@ -0,0 +1,72 @@ +/* +* Copyright 2017 IoT.bzh +* +* author: Loïc Collignon +* +* 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 +#include + +#ifndef AFB_BINDING_VERSION +#define AFB_BINDING_VERSION 2 +#endif +#include + +#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 index b447f98..0000000 --- a/ll-store-binding/src/CMakeLists.txt +++ /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 index fd65552..0000000 --- a/ll-store-binding/src/ll-store-binding.c +++ /dev/null @@ -1,269 +0,0 @@ -#define _GNU_SOURCE -#include -#include -#include -#include - -#define AFB_BINDING_VERSION 2 -#include - -#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 index e37f05d..0000000 --- a/ll-store-binding/start.sh +++ /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 index d2dfbc7..0000000 --- a/ll-store-binding/store.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/sh - -case "$1" in - "get") - if [ "$#" -ne "4" ]; then - echo "Usage: store get " - 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 " - exit 1 - fi - curl -v "http://localhost:9001/api/ll-store/set?username=$2&appname=$3&tagname=$4&value=$5&token=" - ;; - *) - echo "Usage: store " - echo " Action can be 'get' or 'set'." - ;; -esac -