Add gitlab issue/merge request templates
[apps/app-templates.git] / cmake / common.cmake
index ec0ffcf..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"
 #--------------------------------------------------------------------------
 
-include(${PROJECT_APP_TEMPLATES_DIR}/cmake/macros.cmake)
-include(${PROJECT_APP_TEMPLATES_DIR}/cmake/variables.cmake)
-include(${PROJECT_APP_TEMPLATES_DIR}/cmake/extra_targets.cmake)
+# Include ExternalProject CMake module by default
+include(${CMAKE_ROOT}/Modules/ExternalProject.cmake)
 
-# 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)
+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()
 
-# Check Kernel minimal version
-if (kernel_minimal_version)
-       if(DEFINED ENV{SDKTARGETSYSROOT})
-               file(STRINGS $ENV{SDKTARGETSYSROOT}/usr/include/linux/version.h LINUX_VERSION_CODE_LINE REGEX "LINUX_VERSION_CODE")
+# 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" OSDETECTED ${TMP_OSRELEASE})
+               string(REPLACE " " ";" OSRELEASE ${OSDETECTED})
        else()
-               file(STRINGS /usr/include/linux/version.h LINUX_VERSION_CODE_LINE REGEX "LINUX_VERSION_CODE")
+               set(OSRELEASE "NOT COMPATIBLE !")
        endif()
-
-       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}")
-       message (STATUS "${Cyan}-- Check kernel_minimal_version (found kernel version ${KERNEL_VERSION})${ColourReset}")
-
-       if (KERNEL_VERSION VERSION_LESS ${kernel_minimal_version})
-               message(FATAL_ERROR "${Red}**** FATAL: Require at least ${kernel_minimal_version} please use a recent kernel or source your SDK environment then clean and reconfigure your CMake project.")
-       endif (KERNEL_VERSION VERSION_LESS ${kernel_minimal_version})
-endif(kernel_minimal_version)
-
-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})
-
-       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
-if(NOT BINDINGS_LINK_FLAG)
-       set(BINDINGS_LINK_FLAG "-Wl,--version-script=${PKG_TEMPLATE_PREFIX}/cmake/export.map")
+message(STATUS "Distribution detected (separated by ';' choose one of them) ${OSRELEASE}")
+
+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")
+
+file(GLOB distro_cmakefiles ${PATTERN})
+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()
+
+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}")
+
+set_install_prefix()
+prevent_in_source_build()
+
+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)
+
+check_version()
+project_targets_populate()
+remote_targets_populate()
+project_package_build()
+project_closing_msg()