X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=README.md;h=218ce30e3eeae18390ec0f35bf859262918834fb;hb=bb3c5413dd0e2ff098a99748a53be1c66186f235;hp=eca93494e2baed73ad1b7c67a7dff87e0bc4a236;hpb=4a4b3ccac7c0d44b15cd3ccb35b39d6c6bf26607;p=apps%2Fapp-templates.git diff --git a/README.md b/README.md index eca9349..218ce30 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ To use these templates files on your project just install the reference files us ```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 +cp conf.d/app-templates/samples.d/config.cmake.sample conf.d/cmake/config.cmake ``` Edit the copied config.cmake file to fit your needs. @@ -39,7 +39,7 @@ 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 +cp conf.d/app-templates/samples.d/CMakeLists.txt.sample CMakeLists.txt ``` ### Create your CMake targets @@ -72,20 +72,27 @@ 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. +- **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, without the + extension, 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. +- **PLUGIN**: Shared library meant to be used as a binding plugin. Binding + would load it as a plugin to extend its functionnalities. It should be named + with a special extension that you choose with SUFFIX cmake target property or + it'd be **.ctlso** by default. - **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 +- **LIBRARY**: An external 3rd party library bundled with the binding for its + own purpose because platform doesn't provide it. > **TIP** you should use the prefix _afb-_ with your **BINDING* targets which > stand for **Application Framework Binding**. @@ -119,24 +126,34 @@ A typical project architecture would be : │ │ └── 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 +│ │ ├── samples.d/ +│ │ │ ├── CMakeLists.txt.sample +│ │ │ ├── config.cmake.sample +│ │ │ ├── config.xml.in.sample +│ │ │ └── xds-config.env.sample +│ │ ├── template.d/ +│ │ │ ├── autobuild/ +│ │ │ │ ├── agl +│ │ │ │ │ └── autobuild.in +│ │ │ │ ├── linux +│ │ │ │ │ └── autobuild.in +│ │ │ │ └── windows +│ │ │ │ └── autobuild.in +│ │ │ ├── config.xml.in +│ │ │ ├── deb-config.dsc.in +│ │ │ ├── deb-config.install.in +│ │ │ ├── debian.changelog.in +│ │ │ ├── debian.compat.in +│ │ │ ├── debian.rules.in +│ │ │ ├── gdb-on-target.ini.in +│ │ │ ├── install-wgt-on-target.sh.in +│ │ │ ├── start-on-target.sh.in +│ │ │ ├── rpm-config.spec.in +│ │ │ └── xds-project-target.conf.in │ │ └── wgt/ -│ │ ├── config.xml.in -│ │ ├── config.xml.in.sample │ │ ├── icon-default.png │ │ ├── icon-html5.png │ │ ├── icon-native.png @@ -228,20 +245,27 @@ 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. +- **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, without the + extension, 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. +- **PLUGIN**: Shared library meant to be used as a binding plugin. Binding + would load it as a plugin to extend its functionnalities. It should be named + with a special extension that you choose with SUFFIX cmake target property or + it'd be **.ctlso** by default. - **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 +- **LIBRARY**: An external 3rd party library bundled with the binding for its + own purpose because platform doesn't provide it. > **TIP** you should use the prefix _afb-_ with your **BINDING* targets which > stand for **Application Framework Binding**. @@ -259,9 +283,100 @@ SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES > targets. This is already handle by template and will be installed in the > following path : **${CMAKE_INSTALL_PREFIX}/${PROJECT_NAME}** -## Macro reference +> **NOTE**: if you want to set and use `rpath` with your target you should use +> and set the target property `INSTALL_RPATH`. + +## Add external 3rd party library + +### Build, link and ship external library with the project + +You could need to include an external library that isn't shipped in the +platform. Then you have to bundle the required library in the `lib` widget +directory. + +Templates includes some facilities to help you to do so. Classic way to do so +is to declare as many CMake ExternalProject as library you need. + +An ExternalProject is a special CMake module that let you define how to: +download, update, patch, configure, build and install an external project. It +doesn't have to be a CMake project and custom step could be added for special +needs using ExternalProject step. More informations on CMake [ExternalProject +documentation site](https://cmake.org/cmake/help/v3.5/module/ExternalProject.html?highlight=externalproject). + +Example to include `mxml` library for [unicens2-binding](https://github.com/iotbzh/unicens2-binding) +project: + +```cmake +set(MXML external-mxml) +set(MXML_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/mxml) +ExternalProject_Add(${MXML} + GIT_REPOSITORY https://github.com/michaelrsweet/mxml.git + GIT_TAG release-2.10 + SOURCE_DIR ${MXML_SOURCE_DIR} + CONFIGURE_COMMAND ./configure --build x86_64 --host aarch64 + BUILD_COMMAND make libmxml.so.1.5 + BUILD_IN_SOURCE 1 + INSTALL_COMMAND "" +) + +PROJECT_TARGET_ADD(mxml) + +add_library(${TARGET_NAME} SHARED IMPORTED GLOBAL) + +SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES + LABELS LIBRARY + IMPORTED_LOCATION ${MXML_SOURCE_DIR}/libmxml.so.1 + INTERFACE_INCLUDE_DIRECTORIES ${MXML_SOURCE_DIR} +) + +add_dependencies(${TARGET_NAME} ${MXML}) +``` + +Here we define an external project that drive the build of the library then we +define new CMake target of type **IMPORTED**. Meaning that this target hasn't +been built using CMake but is available at the location defined in the target +property *IMPORTED_LOCATION*. + +You could want to build the library as *SHARED* or *STATIC* depending on your needs +and goals. Then you only have to modify the external project configure step and change +filename used by **IMPORTED** library target defined after external project. + +Then target *LABELS* property is set to **LIBRARY** to ship it in the widget. + +Unicens project also need some header from this library, so we use the target +property *INTERFACE_INCLUDE_DIRECTORIES*. Setting that when another target link +to that imported target, it can access to the include directories. + +We bound the target to the external project using a CMake dependency at last. + +Then this target could be use like any other CMake target and be linked etc. + +### Only link and ship external library with the project + +If you already have a binary version of the library that you want to use and you +can't or don't want to build the library then you only have to add an **IMPORTED** +library target. + +So, taking the above example, `mxml` library inclusion would be: + +```cmake +PROJECT_TARGET_ADD(mxml) + +add_library(${TARGET_NAME} SHARED IMPORTED GLOBAL) + +SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES + LABELS LIBRARY + IMPORTED_LOCATION /path/to/library/libmxml.so.1 + INTERFACE_INCLUDE_DIRECTORIES /path/to/mxml/include/dir +) +``` + +Finally, you can link any other lib or executable target with this imported +library like any other target. + +#### Macro reference -### PROJECT_TARGET_ADD +##### 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. @@ -276,7 +391,7 @@ PROJECT_TARGET_ADD(low-can-demo) > set with the specificied name. This variable will change at the next call > to this macros. -### project_subdirs_add +##### 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 @@ -298,7 +413,7 @@ anything: project_subdirs_add("[0-9]-*") ``` -## Advanced customization +## Advanced build customization ### Including additionnals cmake files @@ -345,7 +460,12 @@ _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. +_/etc/os-release_ file. You can also define default OS configuration file +to use as fallback is none specific OS configuration is available using the +scheme _XX-default*.cmake_. Then is you need by example a module that isn't +named the same in one distro only, you only has to define a specific file to +handle that case then for all the other case put the configuration in the +default file. ### Include customs templated scripts