Add gitlab issue/merge request templates
[apps/app-templates.git] / cmake / common.cmake
index 5b4d3eb..77ecd3f 100644 (file)
 #--------------------------------------------------------------------------
 #  WARNING:
 #     Do not change this cmake template
-#     Customise your preferences in "./etc/config.cmake"
+#     Customise your preferences in "./conf.d/cmake/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()
-
-# 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)
+# Include ExternalProject CMake module by default
+include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
 
-macro(PROJECT_PKGDEP_ADD PKG_NAME)
-       set_property(GLOBAL APPEND PROPERTY PROJECT_PKG_DEPS ${PKG_NAME})
-endmacro(PROJECT_PKGDEP_ADD)
-
-# Check GCC minimal version
-if (gcc_minimal_version)
-       message (STATUS "${Blue}-- 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 minimal version
-if (kernel_minimal_version)
-       message (STATUS "${Blue}-- Check kernel_minimal_version (found kernel version ${CMAKE_SYSTEM_VERSION})${ColourReset}")
-       if (CMAKE_SYSTEM_VERSION VERSION_LESS ${kernel_minimal_version})
-       message(FATAL_ERROR "${Red}**** FATAL: Require at least ${kernel_minimal_version} please use a recent kernel.")
+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()
-endif(kernel_minimal_version)
-
-macro(defstr name value)
-       add_definitions(-D${name}=${value})
-endmacro(defstr)
-
-# Native packaging name
-set(NPKG_PROJECT_NAME agl-${PROJECT_NAME})
-
-# Pre-packaging
-macro(project_targets_populate)
-       # Default Widget default directory
-       set(PACKAGE_BINDIR  ${PROJECT_PKG_BUILD_DIR}/bin)
-       set(PACKAGE_ETCDIR  ${PROJECT_PKG_BUILD_DIR}/etc)
-       set(PACKAGE_LIBDIR  ${PROJECT_PKG_BUILD_DIR}/lib)
-       set(PACKAGE_HTTPDIR ${PROJECT_PKG_BUILD_DIR}/htdocs)
-       set(PACKAGE_DATADIR ${PROJECT_PKG_BUILD_DIR}/data)
-
-       add_custom_target(populate)
-               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(OUT ${TARGET} OUTPUT_NAME)
-
-                       if(P MATCHES "NOTFOUND$")
-                               if (${T} STREQUAL "BINDING")
-                                       set(P "lib")
-                               else()
-                                       set(P "")
-                               endif()
-                       endif()
-
-                       if(${T} STREQUAL "BINDING")
-                               add_custom_command(OUTPUT ${PACKAGE_LIBDIR}/${P}${TARGET}.so
-                                       DEPENDS ${TARGET}
-                                       COMMAND mkdir -p ${PACKAGE_LIBDIR}
-                                       COMMAND cp ${BD}/${P}${OUT}.so ${PACKAGE_LIBDIR}
-                               )
-                               add_custom_target(${POPULE_PACKAGE_TARGET} DEPENDS ${PACKAGE_LIBDIR}/${P}${TARGET}.so)
-                               add_dependencies(populate ${POPULE_PACKAGE_TARGET})
-                       elseif(${T} STREQUAL "EXECUTABLE")
-                               add_custom_command(OUTPUT ${PACKAGE_BINDIR}/${P}${TARGET}
-                                       DEPENDS ${TARGET}
-                                       COMMAND mkdir -p ${PACKAGE_BINDIR}
-                                       COMMAND cp ${BD}/${P}${OUT} ${PACKAGE_BINDIR}
-                               )
-                               add_custom_target(${POPULE_PACKAGE_TARGET} DEPENDS ${PACKAGE_BINDIR}/${P}${TARGET})
-                               add_dependencies(populate ${POPULE_PACKAGE_TARGET})
-                       elseif(${T} STREQUAL "HTDOCS")
-                               add_custom_command(OUTPUT ${PACKAGE_HTTPDIR}-xx
-                                       DEPENDS ${TARGET}
-                                       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})
-                       elseif(${T} STREQUAL "DATA")
-                               add_custom_command(OUTPUT ${PACKAGE_DATADIR}-xx
-                                       DEPENDS ${TARGET}
-                                       COMMAND mkdir -p ${PACKAGE_DATADIR}
-                                       COMMAND touch ${PACKAGE_DATADIR}
-                                       COMMAND cp -r ${BD}/${P}${OUT} ${PACKAGE_DATADIR}
-                               )
-                                       add_custom_target(${POPULE_PACKAGE_TARGET} DEPENDS ${PACKAGE_DATADIR}-xx)
-                                       add_dependencies(populate ${POPULE_PACKAGE_TARGET})
-                       endif(${T} STREQUAL "BINDING")
-               elseif(${CMAKE_BUILD_TYPE} MATCHES "[Dd][Ee][Bb][Uu][Gg]")
-                       MESSAGE(".. Warning: ${TARGET} ignored when packaging.")
-               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()
-
-               configure_file(${SSH_TEMPLATE_DIR}/start-on-target.in ${CMAKE_CURRENT_BINARY_DIR}/target/start-on-${RSYNC_TARGET}.sh)
-               configure_file(${GDB_TEMPLATE_DIR}/gdb-on-target.in ${CMAKE_CURRENT_BINARY_DIR}/target/gdb-on-${RSYNC_TARGET}.ini)
-
-               add_custom_target(remote-target-populate
-                       DEPENDS 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}
-                       COMMENT "${REMOTE_LAUNCH}"
-               )
-       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 EXISTS ${WGT_TEMPLATE_DIR}/icon-default.png)
-               MESSAGE(FATAL_ERROR "${Red}WARNING ! Missing mandatory files to build widget file.\nYou need ${PROJECT_ICON} file in ${WGT_TEMPLATE_DIR} folder.${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 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 ${WGT_TEMPLATE_DIR}/icon-default.png ${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 "${WGT_TEMPLATE_DIR}/etc/*")
-       if(${PROJECT_CONF_FILES})
-               file(COPY "${WGT_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(ADDITIONAL_MAKE_CLEAN_FILES, "${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_file(${WGT_TEMPLATE_DIR}/install-wgt-on-target.in ${CMAKE_CURRENT_BINARY_DIR}/target/install-wgt-on-${RSYNC_TARGET}.sh)
-        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
+# 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
        )
 
-       add_custom_target(rpm DEPENDS ${NPKG_PROJECT_NAME}.spec)
-       add_dependencies(rpm populate packaging)
-       set(ADDITIONAL_MAKE_CLEAN_FILES, "${PROJECT_NAME}.spec")
-
-       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 ${RPM_TEMPLATE_DIR})
-               rpm_package_build()
-       endif()
-
-       if(EXISTS ${WGT_TEMPLATE_DIR})
-               wgt_package_build()
-       endif()
-
-       if(EXISTS ${DEB_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}")
+       if (NOT TMP_OSRELEASE STREQUAL "")
+               string(REGEX REPLACE ".*=\"?([0-9a-z\._ -]*)\"?\n" "\\1" OSDETECTED ${TMP_OSRELEASE})
+               string(REPLACE " " ";" OSRELEASE ${OSDETECTED})
        else()
-       file(GLOB filelist "*")
+               set(OSRELEASE "NOT COMPATIBLE !")
        endif()
-
-       foreach(filename ${filelist})
-               if(EXISTS "${filename}/CMakeLists.txt")
-                       add_subdirectory(${filename})
-               endif(EXISTS "${filename}/CMakeLists.txt")
-       endforeach()
-endmacro(project_subdirs_add)
-
-set(CMAKE_BUILD_TYPE Debug CACHE STRING "the type of build")
-set(CMAKE_POSITION_INDEPENDENT_CODE ON)
-set(CMP0048 1)
-
-# 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")
-
-INCLUDE(FindPkgConfig)
-INCLUDE(CheckIncludeFiles)
-INCLUDE(CheckLibraryExists)
-INCLUDE(GNUInstallDirs)
-
-# Default compilation options
-############################################################################
-link_libraries(-Wl,--as-needed -Wl,--gc-sections)
-add_compile_options(-Wall -Wextra -Wconversion)
-add_compile_options(-Wno-unused-parameter) # frankly not using a parameter does it care?
-add_compile_options(-Wno-sign-compare -Wno-sign-conversion)
-add_compile_options(-Werror=maybe-uninitialized)
-add_compile_options(-Werror=implicit-function-declaration)
-add_compile_options(-ffunction-sections -fdata-sections)
-add_compile_options(-fPIC)
-add_compile_options(-g)
-
-set(CMAKE_C_FLAGS_PROFILING   "-g -O2 -pg -Wp,-U_FORTIFY_SOURCE" CACHE STRING "Flags for profiling")
-set(CMAKE_C_FLAGS_DEBUG       "-g -O2 -ggdb -Wp,-U_FORTIFY_SOURCE" CACHE STRING "Flags for debugging")
-set(CMAKE_C_FLAGS_RELEASE     "-O2" CACHE STRING "Flags for releasing")
-set(CMAKE_C_FLAGS_CCOV        "-g -O2 --coverage" CACHE STRING "Flags for coverage test")
-
-set(CMAKE_CXX_FLAGS_PROFILING    "-g -O0 -pg -Wp,-U_FORTIFY_SOURCE")
-set(CMAKE_CXX_FLAGS_DEBUG        "-g -O0 -ggdb -Wp,-U_FORTIFY_SOURCE")
-set(CMAKE_CXX_FLAGS_RELEASE      "-g -O2")
-set(CMAKE_CXX_FLAGS_CCOV "-g -O2 --coverage")
-
-# Env variable overload default
-if(DEFINED ENV{INSTALL_PREFIX})
-       set (INSTALL_PREFIX $ENV{INSTALL_PREFIX})
+elseif("${BUILD_ENV_SYSROOT}" STREQUAL "$ENV{PKG_CONFIG_SYSROOT_DIR}")
+       set(OSRELEASE "yocto-build")
 else()
-       set(INSTALL_PREFIX "${CMAKE_SOURCE_DIR}/Install" CACHE PATH "The path where to install")
+       set(OSRELEASE "NOT COMPATIBLE ! Missing ${OS_RELEASE_PATH} file.")
 endif()
-set(CMAKE_INSTALL_PREFIX ${INSTALL_PREFIX} CACHE STRING "Installation Prefix")
-
-# (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")
-
-# 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})
+message(STATUS "Distribution detected (separated by ';' choose one of them) ${OSRELEASE}")
 
-       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})
-
-# If no install dir try to guess some smart default
-if(BINDINGS_INSTALL_PREFIX)
-       set(BINDINGS_INSTALL_DIR ${BINDINGS_INSTALL_PREFIX}/${PROJECT_NAME} CACHE PATH "Where the binding will be installed in your system")
-else()
-       set(BINDINGS_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME} CACHE PATH "Where the binding will be installed in your system")
-endif()
-
-set(PKGOUT_DIR package CACHE PATH "Output directory for packages")
+file(GLOB project_cmakefiles ${PROJECT_APP_TEMPLATES_DIR}/cmake/cmake.d/[0-9][0-9]-*.cmake)
+foreach(OS IN LISTS OSRELEASE)
+       list(APPEND PATTERN "${PROJECT_APP_TEMPLATES_DIR}/../cmake/[0-9][0-9]-${OS}*.cmake")
+endforeach()
+list(APPEND PATTERN "${PROJECT_APP_TEMPLATES_DIR}/../cmake/[0-9][0-9]-common*.cmake")
 
-# 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()
+file(GLOB distro_cmakefiles ${PATTERN})
+list(SORT distro_cmakefiles)
 
-set (PKG_TEMPLATE_PREFIX ${CMAKE_SOURCE_DIR}/${PROJECT_APP_TEMPLATES_DIR} CACHE PATH "Default Package Templates Directory")
-set(SSH_TEMPLATE_DIR "${PKG_TEMPLATE_PREFIX}/ssh" CACHE PATH "Subpath to a directory where are stored needed files to launch on remote target to debuging purposes")
-set(GDB_TEMPLATE_DIR "${PKG_TEMPLATE_PREFIX}/gdb" CACHE PATH "Subpath to a directory where are stored needed files to launch debuging server on a remote target. Use gdbserver.")
-set(WGT_TEMPLATE_DIR "${PKG_TEMPLATE_PREFIX}/wgt" CACHE PATH "Subpath to a directory where are stored needed files to build widget")
-if(NOT WIDGET_CONFIG_TEMPLATE)
-       set(WIDGET_CONFIG_TEMPLATE ${WGT_TEMPLATE_DIR}/config.xml.in CACHE PATH "Path to widget config file template (config.xml.in)")
+if(NOT distro_cmakefiles)
+       file(GLOB distro_cmakefiles ${PROJECT_APP_TEMPLATES_DIR}/../cmake/[0-9][0-9]-default*.cmake)
 endif()
-set(RPM_TEMPLATE_DIR "${PKG_TEMPLATE_PREFIX}/rpm" CACHE PATH "Subpath to a directory where are stored needed files to build rpm package")
-set(DEB_TEMPLATE_DIR "${PKG_TEMPLATE_PREFIX}/deb" CACHE PATH "Subpath to a directory where are stored needed files to build deb package")
 
-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.")
+list(APPEND project_cmakefiles "${distro_cmakefiles}")
+list(SORT project_cmakefiles)
 
-# Default Linkflag
-if(NOT BINDINGS_LINK_FLAG)
-       set(BINDINGS_LINK_FLAG "-Wl,--version-script=${PKG_TEMPLATE_PREFIX}/cmake/export.map")
-endif()
+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)
 
-# Add a dummy target to enable global dependency order
-# -----------------------------------------------------
-if(EXTRA_DEPENDENCIES_ORDER)
-       set(DEPENDENCIES_TARGET ${PROJECT_NAME}_extra_dependencies)
-       add_custom_target(${DEPENDENCIES_TARGET} ALL
-               DEPENDS ${EXTRA_DEPENDENCY_ORDER}
-       )
-endif()
-
-# 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
-                       ${DEPENDENCIES_TARGET} ${PROJECT_TARGETS})
-       endif()
-endmacro()
+foreach(file ${system_cmakefiles} ${home_cmakefiles} ${project_cmakefiles})
+       message(STATUS "Include: ${file}")
+       include(${file})
+endforeach()
 
-# Add RSYNCTARGET
-remote_targets_populate()
+message(STATUS "${Red}You are using the submodule version of app-templates. This version will not be update in the future and you should migrate to the CMake module version. It could be found here: https://gerrit.automotivelinux.org/gerrit/#/admin/projects/src/cmake-apps-module. Using latest SDK with a version > FF include it by default. To migrate deinit the existing app-templates submodule, it could be then be deleted. To finish, replace the last line of your config.cmake file with 'include(CMakeAfbTemplates)'. If you directly want to use it, only take the config.sample.cmake file from the CMake module and edit to fit your needs.${ColourReset}")
 
-#Archive project
-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\' )
-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})
+set_install_prefix()
+prevent_in_source_build()
 
-#Get the os type
-if(EXISTS "/etc/os-release")
-       execute_process(COMMAND grep ID_LIKE /etc/os-release
-               OUTPUT_VARIABLE TMP_OSRELEASE
-       )
-       if (NOT TMP_OSRELEASE STREQUAL "")
-               string(REGEX REPLACE ".*=" "" OSRELEASE ${TMP_OSRELEASE})
-       else()
-               set(OSRELEASE "NOT DEBIAN OS")
-       endif()
-       message(STATUS "OSRELEASE = ${OSRELEASE}")
+if(DEFINED PROJECT_SRC_DIR_PATTERN)
+       project_subdirs_add(${PROJECT_SRC_DIR_PATTERN})
 else()
-       set(OSRELEASE "NOT DEBIAN OS")
-endif()
-
-       #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
-               if( OSRELEASE MATCHES "debian" )
-                       execute_process(
-                               COMMAND dpkg -S *${XPREFIX}.pc
-                                               OUTPUT_VARIABLE TMP_PKG_BIN
-                                               )
-                       #Need to be harden check
-                       string(REGEX REPLACE ":.*$" "" PKG_BIN ${TMP_PKG_BIN})
-                       set(DEB_PKG_DEPS "${DEB_PKG_DEPS} ${PKG_BIN} ${DEB_EXTRA_DEP}")
-               endif()
-       endforeach()
-
-       if(NOT EXISTS ${RPM_TEMPLATE_DIR}/rpm-config.spec.in)
-               MESSAGE(FATAL_ERROR "${Red}Missing mandatory files: you need rpm-config.spec.in in ${RPM_TEMPLATE_DIR} folder.${ColourReset}")
-       endif()
-       set(PACKAGING_SPEC_OUTPUT ${PROJECT_PKG_ENTRY_POINT}/${NPKG_PROJECT_NAME}.spec)
-add_custom_command(OUTPUT ${PACKAGING_SPEC_OUTPUT}
-       COMMAND ${CMAKE_COMMAND} -DINFILE=${RPM_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
-       )
-
-#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
-if(OSRELEASE MATCHES "debian")
-       # 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)
-       add_custom_command(OUTPUT ${PACKAGING_DEB_OUTPUT_DSC}
-                               ${PACKAGING_DEB_OUTPUT_INSTALL}
-                               ${PACKAGING_DEB_OUTPUT_CHANGELOG}
-                               ${PACKAGING_DEB_OUTPUT_COMPAT}
-                               ${PACKAGING_DEB_OUTPUT_CONTROL}
-                               ${PACKAGING_DEB_OUTPUT_RULES}
-                               COMMAND ${CMAKE_COMMAND} -DINFILE=${DEB_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=${DEB_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=${DEB_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=${DEB_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=${DEB_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=${DEB_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
-       )
-       add_custom_target(packaging_deb DEPENDS ${PACKAGING_DEB_OUTPUT_DSC}
-                                               ${PACKAGING_DEB_OUTPUT_INSTALL}
-                                               ${PACKAGING_DEB_OUTPUT_CHANGELOG}
-                                               ${PACKAGING_DEB_OUTPUT_COMPAT}
-                                               ${PACKAGING_DEB_OUTPUT_CONTROL}
-                                               ${PACKAGING_DEB_OUTPUT_CONTROL}
-                                               ${PACKAGING_DEB_OUTPUT_RULES})
-endif()
-
-add_custom_target(packaging)
-add_custom_target(packaging_rpm DEPENDS ${PACKAGING_SPEC_OUTPUT})
-add_dependencies(packaging packaging_rpm)
-if(TARGET packaging_wgt)
-       add_dependencies(packaging packaging_wgt)
-endif()
-if(OSRELEASE MATCHES "debian")
-       # 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} "")
+       project_subdirs_add()
+endif(DEFINED PROJECT_SRC_DIR_PATTERN)
 
-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()
+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)
 
-       file(APPEND ${CacheForScript} "set(${Var} \"${VALUE}\")\n")
-endforeach()
+check_version()
+project_targets_populate()
+remote_targets_populate()
+project_package_build()
+project_closing_msg()