templates.d: adjustments for xds (gdb*.ini, xds-project-target.conf)
[apps/app-templates.git] / README.md
index f49c9cd..eca9349 100644 (file)
--- a/README.md
+++ b/README.md
@@ -1,5 +1,4 @@
-AGL CMake template
-==================
+# AGL CMake template
 
 Files used to build an application, or binding, project with the
 AGL Application Framework.
 
 Files used to build an application, or binding, project with the
 AGL Application Framework.
@@ -11,12 +10,99 @@ 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.
 
 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 simple usage example for different kind of target under the `examples` folder.
-More advanced usage can be saw with the [low-level-can-service](https://gerrit.automotivelinux.org/gerrit/apps/low-level-can-service)
-which mix external libraries, binding.
+You'll find usage samples here:
 
 
-Typical project architecture
----------------------------------
+- [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 :
 
 
 A typical project architecture would be :
 
@@ -24,15 +110,22 @@ A typical project architecture would be :
 <project-root-path>
 │
 ├── conf.d/
 <project-root-path>
 │
 ├── conf.d/
+│   ├── autobuild/
+│   │   ├── agl
+│   │   │   └── autobuild
+│   │   ├── linux
+│   │   │   └── autobuild
+│   │   └── windows
+│   │       └── autobuild
 │   ├── app-templates/
 │   │   ├── README.md
 │   │   ├── autobuild/
 │   │   │   ├── agl
 │   ├── app-templates/
 │   │   ├── README.md
 │   │   ├── autobuild/
 │   │   │   ├── agl
-│   │   │   │   └── autobuild.sh
+│   │   │   │   └── autobuild.in
 │   │   │   ├── linux
 │   │   │   ├── linux
-│   │   │   │   └── autobuild.sh
+│   │   │   │   └── autobuild.in
 │   │   │   └── windows
 │   │   │   └── windows
-│   │   │       └── autobuild.bat
+│   │   │       └── autobuild.in
 │   │   ├── cmake/
 │   │   │   ├── config.cmake.sample
 │   │   │   ├── export.map
 │   │   ├── cmake/
 │   │   │   ├── config.cmake.sample
 │   │   │   ├── export.map
@@ -58,75 +151,64 @@ A typical project architecture would be :
 │      └── config.xml.in
 ├── <libs>
 ├── <target>
 │      └── config.xml.in
 ├── <libs>
 ├── <target>
+│   └── <files>
 ├── <target>
 ├── <target>
+│   └── <file>
 └── <target>
 └── <target>
+    └── <files>
 ```
 
 | # | Parent | Description |
 | - | -------| ----------- |
 | \<root-path\> | - | Path to your project. Hold master CMakeLists.txt and general files of your projects. |
 ```
 
 | # | Parent | Description |
 | - | -------| ----------- |
 | \<root-path\> | - | Path to your project. Hold master CMakeLists.txt and general files of your projects. |
-| conf.d | \<root-path\> | 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. |
-| app-templates | conf.d | Holds examples files and cmake macros used to build packages |
+| conf.d | \<root-path\> | Holds needed files to build, install, debug, package an AGL app project |
+| app-templates | conf.d | Git submodule to app-templates AGL repository which provides CMake helpers macros library, and build scripts. config.cmake is a copy of config.cmake.sample configured for the projects. SHOULD NOT BE MODIFIED MANUALLY !|
+| autobuild | conf.d | Scripts generated from app-templates to build packages the same way for differents platforms.|
+| cmake | conf.d | Contains at least config.cmake file modified from the sample provided in app-templates submodule. |
+| wgt | conf.d | Contains at least config.xml.in template file modified from the sample provided in app-templates submodule for the needs of project (See config.xml.in.sample file for more details). |
 | packaging | conf.d | Contains output files used to build packages. |
 | packaging | conf.d | Contains output files used to build packages. |
-| autobuild | conf.d | Scripts used to build packages the same way for differents platforms. |
 | \<libs\> | \<root-path\> | External dependencies libraries. This isn't to be used to include header file but build and link statically specifics libraries. | Library sources files. Can be a decompressed library archive file or project fork. |
 | \<target\> | \<root-path\> | A target to build, typically library, executable, etc. |
 
 | \<libs\> | \<root-path\> | External dependencies libraries. This isn't to be used to include header file but build and link statically specifics libraries. | Library sources files. Can be a decompressed library archive file or project fork. |
 | \<target\> | \<root-path\> | A target to build, typically library, executable, etc. |
 
-Usage
-------
+### Update app-templates submodule
 
 
-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 :
+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
 
 ```bash
-git submodule add https://gerrit.automotivelinux.org/gerrit/apps/app-templates conf.d/app-templates
+git submodule update --remote
+git commit -s conf.d/app-templates
 ```
 
 ```
 
-Specify manually your targets, you should look at samples provided in this
-repository to make yours. Then when you are ready to build, using `autobuild`
-that will wrap CMake build command:
-
-```bash
-./conf.d/app-templates/autobuild/agl/autobuild.mk package
-```
+This will update the submodule to the HEAD of master branch repository.
 
 
-Or with the classic way :
+You could just want to update at a specified repository tag or branch or commit
+, here are the method to do so:
 
 ```bash
 
 ```bash
-mkdir -p build
-cd build
-cmake .. && make
-```
-
-### Create a CMake target
-
-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. Be aware that ***populate_widget*** macro will also use
-***PROJECT_TARGET_ADD*** so ***TARGET_NAME*** will change after using
-***populate_widget*** macro.
-
-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}....
-
-populate_widget() --> add target to widget tree depending upon target properties
+cd conf.d/app-templates
+# Choose one of the following depending what you want
+git checkout <tag_name>
+git checkout --detach <branch_name>
+git checkout --detach <commit_id>
+# Then commit
+cd ../..
+git commit -s conf.d/app-templates
 ```
 
 ### Build a widget
 
 #### config.xml.in file
 
 ```
 
 ### Build a widget
 
 #### config.xml.in file
 
-To build a widget you need to configure file _config.xml_. This repo
-provide a simple default file _config.xml.in_ that will be configured using the
-variable set in _config.cmake_  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
 
 > ***CAUTION*** : The default file is only meant to be use for a
 > simple widget app, more complicated ones which needed to export
@@ -136,12 +218,34 @@ variable set in _config.cmake_  file.
 
 #### Using cmake template macros
 
 
 #### Using cmake template macros
 
-To leverage all macros features, you have to specify ***properties*** on your
-targets. Some macros will not works without specifying which is the target type.
+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.
 
 
 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
 Example:
 
 ```cmake
@@ -151,16 +255,11 @@ SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES
        )
 ```
 
        )
 ```
 
-If your target output is not named as the ***TARGET_NAME***, you need to specify
-***OUTPUT_NAME*** property that will be used by the ***populate_widget*** macro.
-
-Use the ***populate_widget*** macro as latest statement of your target
-definition. Then at the end of your project definition you should use the macro
-***build_widget*** that make an archive from the populated widget tree using the
-`wgtpkg-pack` Application Framework tools.
+> **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
---------------------
+## Macro reference
 
 ### PROJECT_TARGET_ADD
 
 
 ### PROJECT_TARGET_ADD
 
@@ -189,44 +288,116 @@ Usage :
 project_subdirs_add()
 ```
 
 project_subdirs_add()
 ```
 
-You also can specify a globbing pattern as argument to filter which folders will be looked for.
+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:
+To filter all directories that begin with a number followed by a dash the
+anything:
 
 ```cmake
 project_subdirs_add("[0-9]-*")
 ```
 
 
 ```cmake
 project_subdirs_add("[0-9]-*")
 ```
 
-### project_targets_populate
+## Advanced customization
 
 
-Macro use to populate widget tree. To make this works you have to specify some properties to your target :
+### Including additionnals cmake files
 
 
-* LABELS : specify *BINDING*, *HTDOCS*, *EXECUTABLE*, *DATA*
-* PREFIX : must be empty **""** when target is a *BINDING* else default prefix *lib* will be applied
-* OUTPUT_NAME : Name of the output file generated, useful when generated file name is different from `${TARGET_NAME}`
+#### Machine and system custom cmake files
 
 
-Always specify  `populate_widget()` macro as the last statement, especially if
-you use ${TARGET_NAME} variable. Else variable will be set at wrong value with
-the **populate_** target name.
+Advanced tuning is possible using addionnals cmake files that are included
+automatically from some specifics locations. They are included in that order:
 
 
-Usage :
+- Project CMake files normaly located in _<project-root-path>/conf.d/app-templates/cmake/cmake.d_
+- Home CMake files located in _$HOME/.config/app-templates/cmake.d_
+- System CMake files located in _/etc/app-templates/cmake.d_
+
+CMake files has to be named using the following convention: `XX-common*.cmake`
+or `XX-${PROJECT_NAME}*.cmake`, where `XX` are numbers, `*` file name
+(ie. `99-common-my_customs.cmake`).
+
+> **NOTE** You need to specify after numbers that indicate include order, to
+which project that file applies, if it applies to all project then use keyword
+`common`.
+
+So, saying that you should be aware that every normal cmake variables used at
+project level could be overwrited by home or system located cmake files if
+variables got the same name. Exceptions are cached variables set using
+**CACHE** keyword:
+
+Example:
 
 ```cmake
 
 ```cmake
-project_targets_populate()
+set(VARIABLE_NAME 'value string random' CACHE STRING 'docstring')
 ```
 
 ```
 
-### project_package_build
+#### OS custom cmake files
 
 
-Use at project level, to gather all populated targets in the widget tree plus
-widget specifics files into a **WGT** archive. Generated under your `build`
-directory :
+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.
 
 
-Usage :
+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/_
 
 
-```cmake
-project_package_build()
+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
 ```
 
 ```
 
-### project_closing_message
+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:
 
 
-Will display the closing message configured in `config.cmake` file. Put it at the end of your project CMake file.
+- **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
+```