diff options
author | Romain Forlot <romain.forlot@iot.bzh> | 2018-11-05 10:38:16 +0100 |
---|---|---|
committer | Romain Forlot <romain.forlot@iot.bzh> | 2018-11-06 20:30:35 +0100 |
commit | 5f06de040287a5df88d21367da9e8725d8585ba1 (patch) | |
tree | bba4fb8aa6474b451f4f6f7af327c46ed6e181ae /src/cmake | |
parent | dcdff18c4f09406ca1ec522fbde3f6f7342d8423 (diff) |
Adding packaging files
Change-Id: I70d30588c59e6a0d3c451c74fc6cc565b5eea167
Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
Diffstat (limited to 'src/cmake')
-rw-r--r-- | src/cmake/cmake.d/01-build_options.cmake | 156 | ||||
-rw-r--r-- | src/cmake/cmake.d/02-variables.cmake | 205 | ||||
-rw-r--r-- | src/cmake/cmake.d/03-macros.cmake | 695 | ||||
-rw-r--r-- | src/cmake/cmake.d/04-extra_targets.cmake | 69 | ||||
-rw-r--r-- | src/cmake/common.cmake | 121 | ||||
-rw-r--r-- | src/cmake/configure_file.cmake | 2 | ||||
-rw-r--r-- | src/cmake/export.map | 1 |
7 files changed, 1249 insertions, 0 deletions
diff --git a/src/cmake/cmake.d/01-build_options.cmake b/src/cmake/cmake.d/01-build_options.cmake new file mode 100644 index 0000000..3b1eca7 --- /dev/null +++ b/src/cmake/cmake.d/01-build_options.cmake @@ -0,0 +1,156 @@ +########################################################################### +# Copyright 2015, 2016, 2017 IoT.bzh +# +# authors: Fulup Ar Foll <fulup@iot.bzh> +# Romain Forlot <romain.forlot@iot.bzh> +# +# 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) + +if(NOT CMAKE_BUILD_TYPE) + if(BUILD_TYPE) + set(CMAKE_BUILD_TYPE ${BUILD_TYPE} CACHE STRING "the type of build" FORCE) + else() + set(CMAKE_BUILD_TYPE RELEASE CACHE STRING "the type of build" FORCE) + endif() +endif() +if(NOT DEFINED BUILD_TEST_WGT) + set(BUILD_TEST_WGT FALSE) +endif() + +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=implicit-function-declaration + -ffunction-sections + -fdata-sections + -fPIC CACHE STRING "Compilation flags") + +set(COMPILE_OPTIONS_GNU -Werror=maybe-uninitialized CACHE STRING "GNU Compile specific options") +set(COMPILE_OPTIONS_CLANG -Werror=uninitialized CACHE STRING "CLang compile specific options") + +# Compilation OPTIONS depending on language +######################################### +foreach(option ${COMPILE_OPTIONS}) + add_compile_options(${option}) +endforeach() + +if (${CMAKE_C_COMPILER_ID} STREQUAL "GNU" OR ${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU") + foreach(option ${COMPILE_OPTIONS_GNU}) + add_compile_options(${option}) + endforeach() +elseif(${CMAKE_C_COMPILER_ID} STREQUAL "Clang" OR ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang") + foreach(option ${COMPILE_OPTIONS_CLANG}) + add_compile_options(${option}) + endforeach() +endif() + +foreach(option ${C_COMPILE_OPTIONS}) + add_compile_options($<$<COMPILE_LANGUAGE:C>:${option}>) +endforeach() +foreach(option ${CXX_COMPILE_OPTIONS}) + add_compile_options($<$<COMPILE_LANGUAGE:CXX>:${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 + -O0 + -ggdb + CACHE STRING "Compilation flags for DEBUG build type.") +set(COVERAGE_COMPILE_OPTIONS + -g + -O0 + --coverage + CACHE STRING "Compilation flags for COVERAGE build type.") +set(RELEASE_COMPILE_OPTIONS + -O2 + -D_FORTIFY_SOURCE=2 + CACHE STRING "Compilation flags for RELEASE build type.") + +foreach(option ${PROFILING_COMPILE_OPTIONS}) + add_compile_options($<$<CONFIG:PROFILING>:${option}>) +endforeach() +foreach(option ${DEBUG_COMPILE_OPTIONS}) + add_compile_options($<$<CONFIG:DEBUG>:${option}>) +endforeach() +foreach(option ${COVERAGE_COMPILE_OPTIONS}) + add_compile_options($<$<CONFIG:COVERAGE>:${option}>) +endforeach() +foreach(option ${RELEASE_COMPILE_OPTIONS}) + add_compile_options($<$<CONFIG:RELEASE>:${option}>) +endforeach() + +# 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 AND USE_EFENCE) +CHECK_LIBRARY_EXISTS(efence malloc "" HAVE_LIBEFENCE) +IF(HAVE_LIBEFENCE) + MESSAGE("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 AND USE_EFENCE) +IF(${CMAKE_BUILD_TYPE} MATCHES COVERAGE) + list (APPEND link_libraries -coverage) +ENDIF(${CMAKE_BUILD_TYPE} MATCHES COVERAGE) + +# set default include directories +INCLUDE_DIRECTORIES(${EXTRA_INCLUDE_DIRS}) + +# Default Linkflag +get_filename_component(PKG_TEMPLATE_PREFIX "${CMAKE_CURRENT_LIST_DIR}/../.." REALPATH CACHE) + +if(NOT BINDINGS_LINK_FLAG) + set(BINDINGS_LINK_FLAG "-Wl,--version-script=${PKG_TEMPLATE_PREFIX}/cmake/export.map") +endif() diff --git a/src/cmake/cmake.d/02-variables.cmake b/src/cmake/cmake.d/02-variables.cmake new file mode 100644 index 0000000..951a681 --- /dev/null +++ b/src/cmake/cmake.d/02-variables.cmake @@ -0,0 +1,205 @@ +########################################################################### +# Copyright 2015, 2016, 2017 IoT.bzh +# +# author: Fulup Ar Foll <fulup@iot.bzh> +# contrib: Romain Forlot <romain.forlot@iot.bzh> +# +# 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}") + +# Setup project and app-templates version variables +execute_process(COMMAND git describe --abbrev=0 + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_PROJECT_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET +) + +# Get the git commit hash to append to the version +execute_process(COMMAND git rev-parse --short HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE COMMIT_HASH + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET +) + +# Detect unstaged or untracked changes +execute_process(COMMAND git status --short + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE DIRTY_FLAG + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET +) + +# Include project configuration +# ------------------------------ +if(NOT DEFINED PROJECT_VERSION AND NOT DEFINED GIT_PROJECT_VERSION) + message(FATAL_ERROR "${Red}No version tag found from your project's source directory and no PROJECT_VERSION set in your config.cmake file. Abort!") +elseif(NOT DEFINED PROJECT_VERSION AND DEFINED GIT_PROJECT_VERSION) + set(PROJECT_VERSION ${GIT_PROJECT_VERSION}) +endif() + +# Release additionnals informations isn't supported so setting project +# attributes then add the dirty flag if git repo not sync'ed +project(${PROJECT_NAME} VERSION ${PROJECT_VERSION} LANGUAGES ${PROJECT_LANGUAGES}) +if(NOT ${DIRTY_FLAG}) + set(PROJECT_VERSION "${PROJECT_VERSION}-${COMMIT_HASH}-dirty") +else() + set(PROJECT_VERSION "${PROJECT_VERSION}-${COMMIT_HASH}") +endif() + +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 ("${Cyan}-- Check gcc_minimal_version (found gcc version ${CMAKE_C_COMPILER_VERSION}) \ + (found g++ version ${CMAKE_CXX_COMPILER_VERSION})${ColourReset}") + + if (("${PROJECT_LANGUAGES}" MATCHES "CXX" + AND 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("${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 ( "${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() + +set(PROJECT_APP_TEMPLATES_DIR "${CMAKE_CURRENT_LIST_DIR}/../..") + +set(TEMPLATE_DIR "${PROJECT_APP_TEMPLATES_DIR}/template.d" + CACHE PATH "Subpath to a directory where are stored needed files to launch on remote target to debuging purposes") + +set(PROJECT_PKG_ENTRY_POINT ${CMAKE_SOURCE_DIR}/${PROJECT_CMAKE_CONF_DIR}/packaging + CACHE PATH "Where package build files, like rpm.spec file or config.xml, are write.") +set(WIDGET_ICON "${CMAKE_SOURCE_DIR}/${PROJECT_CMAKE_CONF_DIR}/wgt/${PROJECT_ICON}" + CACHE PATH "Path to the widget icon") + +if(NOT WIDGET_CONFIG_TEMPLATE) + set(WIDGET_CONFIG_TEMPLATE ${TEMPLATE_DIR}/config.xml.in + CACHE PATH "Path to widget config file template (config.xml.in)") +endif() + +# Path to autobuild template +set(PROJECT_AGL_AUTOBUILD_DIR ${CMAKE_SOURCE_DIR}/autobuild/agl + CACHE PATH "Subpath to a directory where are stored autobuild script") +set(PROJECT_LINUX_AUTOBUILD_DIR ${CMAKE_SOURCE_DIR}/autobuild/linux + CACHE PATH "Subpath to a directory where are stored autobuild script") + +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 "" CACHE STRING "JSON linter") + +# Default GNU directories path variables +set(BINDIR bin CACHE PATH "User executables") +set(ETCDIR etc CACHE PATH "Read only system configuration data") +set(LIBDIR lib CACHE PATH "System library directory") +set(HTTPDIR htdocs CACHE PATH "HTML5 data directory") +set(DATADIR var CACHE PATH "External data resources files") + +# Normally CMake uses the build tree for the RPATH when building executables +# etc on systems that use RPATH. When the software is installed the executables +# etc are relinked by CMake to have the install RPATH. If this variable is set +# to true then the software is always built with the install path for the RPATH +# and does not need to be relinked when installed. +# Rpath could be set and controlled by target property INSTALL_RPATH +set(CMAKE_BUILD_WITH_INSTALL_RPATH true) diff --git a/src/cmake/cmake.d/03-macros.cmake b/src/cmake/cmake.d/03-macros.cmake new file mode 100644 index 0000000..0a94564 --- /dev/null +++ b/src/cmake/cmake.d/03-macros.cmake @@ -0,0 +1,695 @@ +########################################################################### +# Copyright 2015, 2016, 2017 IoT.bzh +# +# author: Fulup Ar Foll <fulup@iot.bzh> +# contrib: Romain Forlot <romain.forlot@iot.bzh> +# +# 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(prevent_in_source_build) + execute_process(COMMAND rm -rf ${CMAKE_SOURCE_DIR}/CMakeCache.txt + ${CMAKE_SOURCE_DIR}/CMakeCacheForScript.cmake + ${CMAKE_SOURCE_DIR}/CMakeFiles + ${CMAKE_SOURCE_DIR}/cmake_install.cmake) + + get_filename_component(srcdir "${CMAKE_SOURCE_DIR}" REALPATH) + get_filename_component(bindir "${CMAKE_BINARY_DIR}" REALPATH) + + if(${srcdir} STREQUAL ${bindir}) + message(FATAL_ERROR "${Red}**** ERROR: You trying to build the project from the source directory or a previous build in-source occured. This isn't allowed, you have to clean CMakeCache.txt file from your source directory (${srcdir}), and build from a separate directory. ****\n") + endif() +ENDMACRO(prevent_in_source_build) + +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(set_install_prefix) + if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT AND INSTALL_PREFIX) + message("-- Overwrite the CMAKE default install prefix with ${INSTALL_PREFIX}") + set(CMAKE_INSTALL_PREFIX ${INSTALL_PREFIX} CACHE PATH "Install prefix" FORCE) + endif() + + # (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 CACHE PATH 'Prefix Path list used by pkgconfig module') + set(LD_LIBRARY_PATH ${CMAKE_INSTALL_PREFIX}/lib64 ${CMAKE_INSTALL_PREFIX}/lib CACHE PATH 'Path list where to search for libraries') +endmacro() + +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) + execute_process( + COMMAND which ${XML_CHECKER} + RESULT_VARIABLE XML_CHECKER_PRESENT + OUTPUT_QUIET ERROR_QUIET + ) + endif() + if(NOT DEFINED LUA_LIST) + set(ext_reg "lua$") + set(LUA_LIST ${INPUT_FILES}) + list_filter(LUA_LIST ext_reg) + execute_process( + COMMAND which ${LUA_CHECKER} + RESULT_VARIABLE LUA_CHECKER_PRESENT + OUTPUT_QUIET ERROR_QUIET + ) + endif() + if(NOT DEFINED JSON_FILES) + set(ext_reg "json$") + set(JSON_LIST ${INPUT_FILES}) + list_filter(JSON_LIST ext_reg) + execute_process( + COMMAND which ${JSON_CHECKER} + RESULT_VARIABLE JSON_CHECKER_PRESENT + OUTPUT_QUIET ERROR_QUIET + ) + 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} + ) + + if(XML_CHECKER_PRESENT EQUAL 0) + foreach(file ${XML_LIST}) + add_custom_command(TARGET ${TARGET_NAME} + PRE_BUILD + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMAND ${XML_CHECKER} ${file} + ) + endforeach() + elseif(XML_LIST) + add_custom_command(TARGET ${TARGET_NAME} + PRE_BUILD + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --red "Warning: XML_CHECKER not found. Not verification made on files !") + endif() + if(LUA_CHECKER_PRESENT EQUAL 0) + foreach(file ${LUA_LIST}) + add_custom_command(TARGET ${TARGET_NAME} + PRE_BUILD + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMAND ${LUA_CHECKER} ${file} + ) + endforeach() + elseif(LUA_LIST) + add_custom_command(TARGET ${TARGET_NAME} + PRE_BUILD + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --red "Warning: LUA_CHECKER not found. Not verification made on files !") + endif() + if(JSON_CHECKER_PRESENT EQUAL 0) + foreach(file ${JSON_LIST}) + add_custom_command(TARGET ${TARGET_NAME} + PRE_BUILD + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMAND ${JSON_CHECKER} ${file} + ) + endforeach() + elseif(JSON_LIST) + add_custom_command(TARGET ${TARGET_NAME} + PRE_BUILD + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --red "Warning: JSON_CHECKER not found. Not verification made on files !") + endif() + + 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() + +# Common command to call inside project_targets_populate macro +macro(generate_one_populate_target OUTPUTFILES PKG_DESTDIR) + add_custom_command(OUTPUT ${PKG_DESTDIR}/${OUTPUTFILES} + DEPENDS ${BD}/${OUTPUTFILES} + COMMAND mkdir -p ${PKG_DESTDIR} + COMMAND touch ${PKG_DESTDIR} + COMMAND cp -r ${BD}/${OUTPUTFILES}/* ${PKG_DESTDIR} 2> /dev/null || cp ${BD}/${OUTPUTFILES} ${PKG_DESTDIR} + ) + + add_custom_target(${POPULE_PACKAGE_TARGET} DEPENDS ${PKG_DESTDIR}/${OUTPUTFILES}) + add_dependencies(populate ${POPULE_PACKAGE_TARGET}) + add_dependencies(${POPULE_PACKAGE_TARGET} ${TARGET}) +endmacro() + +# To be call inside project_targets_populate macro +macro(afb_genskel) + set (ARGSLIST ${ARGN}) + + if ("${PROJECT_LANGUAGES}" MATCHES "CXX") + list(APPEND ARGSLIST "--cpp") + endif() + + if (OPENAPI_DEF) + add_custom_command(OUTPUT ${SD}/${OPENAPI_DEF}.h + DEPENDS ${SD}/${OPENAPI_DEF}.json + COMMAND afb-genskel ${ARGSLIST} ${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 ${ARGSLIST} ${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() +endmacro() + +# Pre-packaging +macro(project_targets_populate) + # Default Widget default directory + 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}) + # Default test Widget default directory + string(REGEX REPLACE "/([^/]*)$" "/\\1-test" PROJECT_PKG_TEST_DIR "${PROJECT_PKG_BUILD_DIR}") + set(PACKAGE_TEST_BINDIR ${PROJECT_PKG_TEST_DIR}/${BINDIR}) + set(PACKAGE_TEST_ETCDIR ${PROJECT_PKG_TEST_DIR}/${ETCDIR}) + set(PACKAGE_TEST_LIBDIR ${PROJECT_PKG_TEST_DIR}/${LIBDIR}) + set(PACKAGE_TEST_HTTPDIR ${PROJECT_PKG_TEST_DIR}/${HTTPDIR}) + set(PACKAGE_TEST_DATADIR ${PROJECT_PKG_TEST_DIR}/${DATADIR}) + + add_custom_command(OUTPUT ${PACKAGE_BINDIR} + ${PACKAGE_ETCDIR} + ${PACKAGE_LIBDIR} + ${PACKAGE_HTTPDIR} + ${PACKAGE_DATADIR} + ${PACKAGE_TEST_BINDIR} + ${PACKAGE_TEST_ETCDIR} + ${PACKAGE_TEST_LIBDIR} + ${PACKAGE_TEST_HTTPDIR} + ${PACKAGE_TEST_DATADIR} + COMMAND mkdir -p ${PACKAGE_BINDIR} + COMMAND mkdir -p ${PACKAGE_ETCDIR} + COMMAND mkdir -p ${PACKAGE_LIBDIR} + COMMAND mkdir -p ${PACKAGE_HTTPDIR} + COMMAND mkdir -p ${PACKAGE_DATADIR} + COMMAND mkdir -p ${PACKAGE_TEST_BINDIR} + COMMAND mkdir -p ${PACKAGE_TEST_ETCDIR} + COMMAND mkdir -p ${PACKAGE_TEST_LIBDIR} + COMMAND mkdir -p ${PACKAGE_TEST_HTTPDIR} + COMMAND mkdir -p ${PACKAGE_TEST_DATADIR} + ) + add_custom_target(populate DEPENDS ${PACKAGE_BINDIR} + ${PACKAGE_ETCDIR} + ${PACKAGE_LIBDIR} + ${PACKAGE_HTTPDIR} + ${PACKAGE_DATADIR} + ${PACKAGE_TEST_BINDIR} + ${PACKAGE_TEST_ETCDIR} + ${PACKAGE_TEST_LIBDIR} + ${PACKAGE_TEST_HTTPDIR} + ${PACKAGE_TEST_DATADIR}) + + # Dirty trick to define a default INSTALL command for app-templates handled + # targets + INSTALL(CODE "execute_process(COMMAND make populate)") + if(NO_DEDICATED_INSTALL_DIR) + INSTALL(DIRECTORY ${PROJECT_PKG_BUILD_DIR}/ + DESTINATION ${CMAKE_INSTALL_PREFIX} + ) + else() + INSTALL(DIRECTORY ${PROJECT_PKG_BUILD_DIR}/ + DESTINATION ${CMAKE_INSTALL_PREFIX}/${PROJECT_NAME} + ) + endif() + + get_property(PROJECT_TARGETS GLOBAL PROPERTY PROJECT_TARGETS) + foreach(TARGET ${PROJECT_TARGETS}) + # Declaration of a custom command that will populate widget tree with the target + set(POPULE_PACKAGE_TARGET "project_populate_${TARGET}") + get_target_property(T ${TARGET} LABELS) + + if(T) + get_target_property(P ${TARGET} PREFIX) + get_target_property(S ${TARGET} SUFFIX) + 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 "LIBRARY" OR + ${T} MATCHES "^BINDINGV?.?$") + set(P "lib") + else() + set(P "") + endif() + endif() + + get_target_property(IMPPATH ${TARGET} IMPORTED_LOCATION) + if(${T} STREQUAL "LIBRARY") + unset(BD) + generate_one_populate_target(${IMPPATH} ${PACKAGE_LIBDIR}) + elseif(${T} STREQUAL "TEST-LIBRARY") + unset(BD) + generate_one_populate_target(${IMPPATH} ${PACKAGE_TEST_LIBDIR}) + elseif(${T} STREQUAL "PLUGIN") + if(NOT S) + set(S ".ctlso") + endif() + generate_one_populate_target(${P}${OUT}${S} "${PACKAGE_LIBDIR}/plugins") + elseif(${T} STREQUAL "TEST-PLUGIN") + if(NOT S) + set(S ".ctlso") + endif() + generate_one_populate_target(${P}${OUT}${S} "${PACKAGE_TEST_LIBDIR}/plugins") + elseif(${T} STREQUAL "BINDING") + if(NOT S) + set(S ".so") + endif() + list(APPEND BINDINGS_LIST "${P}${OUT}${S}") + generate_one_populate_target(${P}${OUT}${S} ${PACKAGE_LIBDIR}) + SET_TARGET_PROPERTIES(${TARGET} PROPERTIES + LINK_FLAGS ${BINDINGS_LINK_FLAG} + ) + elseif(${T} STREQUAL "BINDINGV2") + if(NOT S) + set(S ".so") + endif() + afb_genskel("-2") + generate_one_populate_target(${P}${OUT}${S} ${PACKAGE_LIBDIR}) + SET_TARGET_PROPERTIES(${TARGET} PROPERTIES + LINK_FLAGS ${BINDINGS_LINK_FLAG} + ) + elseif(${T} STREQUAL "BINDINGV3") + if(NOT S) + set(S ".so") + endif() + afb_genskel("-3") + generate_one_populate_target(${P}${OUT}${S} ${PACKAGE_LIBDIR}) + SET_TARGET_PROPERTIES(${TARGET} PROPERTIES + LINK_FLAGS ${BINDINGS_LINK_FLAG} + ) + elseif(${T} STREQUAL "EXECUTABLE") + if(NOT S) + set(S "") + endif() + if(NOT OUT AND IMPPATH) + unset(BD) + generate_one_populate_target(${IMPPATH} ${PACKAGE_BINDIR}) + else() + generate_one_populate_target(${P}${OUT}${S} ${PACKAGE_BINDIR}) + endif() + elseif(${T} STREQUAL "TEST-EXECUTABLE") + if(NOT S) + set(S "") + endif() + if(NOT OUT AND IMPPATH) + unset(BD) + generate_one_populate_target(${IMPPATH} ${PACKAGE_TEST_BINDIR}) + else() + generate_one_populate_target(${P}${OUT}${S} ${PACKAGE_TEST_BINDIR}) + endif() + elseif(${T} STREQUAL "HTDOCS") + generate_one_populate_target(${P}${OUT} ${PACKAGE_HTTPDIR}) + elseif(${T} STREQUAL "TEST-HTDOCS") + generate_one_populate_target(${P}${OUT} ${PACKAGE_HTTPDIR}) + elseif(${T} STREQUAL "DATA" ) + generate_one_populate_target(${TARGET} ${PACKAGE_DATADIR}) + elseif(${T} STREQUAL "TEST-DATA") + generate_one_populate_target(${TARGET} ${PACKAGE_TEST_DATADIR}) + elseif(${T} STREQUAL "BINDING-CONFIG" ) + generate_one_populate_target(${TARGET} ${PACKAGE_ETCDIR}) + elseif(${T} STREQUAL "TEST-CONFIG") + generate_one_populate_target(${TARGET} ${PACKAGE_TEST_ETCDIR}) + endif() + elseif("${CMAKE_BUILD_TYPE}" MATCHES "[Dd][Ee][Bb][Uu][Gg]") + MESSAGE("${BoldBlue}.. Notice: ${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 ${TEST_WIDGET_CONFIG_TEMPLATE}) + MESSAGE("${BoldBlue}-- Notice: Using default test widget configuration's file. +-- If you want to use a customized test-config.xml template then specify TEST_WIDGET_CONFIG_TEMPLATE in your config.cmake file.${ColourReset}") + + set(TEST_WIDGET_CONFIG_TEMPLATE "${PROJECT_APP_TEMPLATES_DIR}/test-wgt/test-config.xml.in" + CACHE PATH "Path to the test widget config file template (test-config.xml.in)") + endif() + if(NOT EXISTS ${WIDGET_CONFIG_TEMPLATE}) + MESSAGE(FATAL_ERROR "${Red}WARNING ! Missing mandatory files to build widget file. +You 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 ${PROJECT_APP_TEMPLATES_DIR}/wgt/icon-default.png) + endif() + + if(NOT WIDGET_ENTRY_POINT) + set(WIDGET_ENTRY_POINT lib) + endif() + + if(NOT ${CMAKE_BUILD_TYPE} STREQUAL "RELEASE") + string(TOLOWER "${PROJECT_NAME}-${CMAKE_BUILD_TYPE}" WGT_NAME) + else() + string(TOLOWER "${PROJECT_NAME}" WGT_NAME) + endif() + + # 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}) + + find_program(wgtpkgCMD "wgtpkg-pack") + if(wgtpkgCMD) + set(packCMD ${wgtpkgCMD} "-f" "-o" "${WGT_NAME}.wgt" ${PROJECT_PKG_BUILD_DIR}) + set(packCMDTest ${wgtpkgCMD} "-f" "-o" "${WGT_NAME}-test.wgt" ${PROJECT_PKG_TEST_DIR}) + else() + find_program(wgtpkgCMD "zip") + if(wgtpkgCMD) + set(packCMD ${CMAKE_COMMAND} -E cmake_echo_color --yellow "Warning: Widget will be built using Zip, NOT using the Application Framework widget pack command." && cd ${PROJECT_PKG_BUILD_DIR} && ${wgtpkgCMD} "../${WGT_NAME}.wgt" "*") + set(packCMDTest ${CMAKE_COMMAND} -E cmake_echo_color --yellow "Warning: Test widget will be built using Zip, NOT using the Application Framework widget pack command." && cd ${PROJECT_PKG_TEST_DIR} && ${wgtpkgCMD} "../${WGT_NAME}-test.wgt" "*") + else() + set(packCMD ${CMAKE_COMMAND} -E cmake_echo_color --red "Error: No utility found to build a widget. Either install wgtpkg-pack from App Framework or zip command") + endif() + 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 ${PROJECT_APP_TEMPLATES_DIR}/cmake/configure_file.cmake + COMMAND cp ${ICON_PATH} ${PROJECT_PKG_BUILD_DIR}/${PROJECT_ICON} + ) + add_custom_command(OUTPUT ${PROJECT_PKG_TEST_DIR}/config.xml ${PROJECT_PKG_TEST_DIR}/bin/launcher + COMMAND ${CMAKE_COMMAND} -DINFILE=${TEST_WIDGET_CONFIG_TEMPLATE} -DOUTFILE=${PROJECT_PKG_TEST_DIR}/config.xml + -DPROJECT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} + -P ${PROJECT_APP_TEMPLATES_DIR}/cmake/configure_file.cmake + COMMAND mkdir -p ${PROJECT_PKG_TEST_DIR}/bin + COMMAND cp ${ICON_PATH} ${PROJECT_PKG_TEST_DIR}/${PROJECT_ICON} + COMMAND cp ${PROJECT_APP_TEMPLATES_DIR}/test-wgt/launcher.sh.in ${PROJECT_PKG_TEST_DIR}/bin/launcher + ) + + add_custom_command(OUTPUT ${WGT_NAME}.wgt + DEPENDS ${PROJECT_TARGETS} + COMMAND ${packCMD} + ) + + add_custom_command(OUTPUT ${WGT_NAME}-test.wgt + DEPENDS ${PROJECT_TARGETS} + COMMAND ${packCMDTest} + ) + + if(${BUILD_TEST_WGT}) + add_custom_target(packaging_wgt DEPENDS ${PROJECT_PKG_BUILD_DIR}/config.xml + ${PROJECT_PKG_TEST_DIR}/config.xml + ${PROJECT_PKG_TEST_DIR}/bin/launcher) + add_custom_target(widget DEPENDS ${WGT_NAME}.wgt ${WGT_NAME}-test.wgt) + + set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "${CMAKE_CURRENT_BINARY_DIR}/${WGT_NAME}-test.wgt") + else() + add_custom_target(packaging_wgt DEPENDS ${PROJECT_PKG_BUILD_DIR}/config.xml) + add_custom_target(widget DEPENDS ${WGT_NAME}.wgt) + add_custom_target(packaging_test_wgt DEPENDS ${PROJECT_PKG_TEST_DIR}/config.xml ${PROJECT_PKG_TEST_DIR}/bin/launcher) + add_custom_target(test_widget DEPENDS ${WGT_NAME}-test.wgt + ${PROJECT_PKG_TEST_DIR}/config.xml + ${PROJECT_PKG_TEST_DIR}/bin/launcher) + endif() + + add_dependencies(widget populate packaging_wgt) + set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "${CMAKE_CURRENT_BINARY_DIR}/${WGT_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(project_package_build) + if(EXISTS ${TEMPLATE_DIR}) + wgt_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}) + elseif(${filename} MATCHES "^.*\\.cmake$") + include(${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/src/cmake/cmake.d/04-extra_targets.cmake b/src/cmake/cmake.d/04-extra_targets.cmake new file mode 100644 index 0000000..1cde843 --- /dev/null +++ b/src/cmake/cmake.d/04-extra_targets.cmake @@ -0,0 +1,69 @@ +########################################################################### +# Copyright 2015, 2016, 2017 IoT.bzh +# +# author: Fulup Ar Foll <fulup@iot.bzh> +# contrib: Romain Forlot <romain.forlot@iot.bzh> +# +# 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" +#-------------------------------------------------------------------------- + +#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_command(OUTPUT ${PROJECT_AGL_AUTOBUILD_DIR}/autobuild ${PROJECT_LINUX_AUTOBUILD_DIR}/autobuild + DEPENDS ${TEMPLATE_DIR}/autobuild/agl/autobuild.in + ${TEMPLATE_DIR}/autobuild/linux/autobuild.in + + COMMAND [ ! -f "${PROJECT_AGL_AUTOBUILD_DIR}/autobuild" ] && + ${CMAKE_COMMAND} -DINFILE=${TEMPLATE_DIR}/autobuild/agl/autobuild.in + -DOUTFILE=${PROJECT_AGL_AUTOBUILD_DIR}/autobuild + -DPROJECT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} + -P ${PROJECT_APP_TEMPLATES_DIR}/cmake/configure_file.cmake && + chmod a+x ${PROJECT_AGL_AUTOBUILD_DIR}/autobuild || + true + COMMAND [ ! -f "${PROJECT_LINUX_AUTOBUILD_DIR}/autobuild" ] && + ${CMAKE_COMMAND} -DINFILE=${TEMPLATE_DIR}/autobuild/agl/autobuild.in + -DOUTFILE=${PROJECT_LINUX_AUTOBUILD_DIR}/autobuild + -DPROJECT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} + -P ${PROJECT_APP_TEMPLATES_DIR}/cmake/configure_file.cmake && + chmod a+x ${PROJECT_LINUX_AUTOBUILD_DIR}/autobuild || + true +) + +add_custom_target(autobuild ALL DEPENDS ${PROJECT_AGL_AUTOBUILD_DIR}/autobuild + ${PROJECT_LINUX_AUTOBUILD_DIR}/autobuild) diff --git a/src/cmake/common.cmake b/src/cmake/common.cmake new file mode 100644 index 0000000..6e43d13 --- /dev/null +++ b/src/cmake/common.cmake @@ -0,0 +1,121 @@ +########################################################################### +# Copyright 2015 - 2018 IoT.bzh +# +# author: Fulup Ar Foll <fulup@iot.bzh> +# contrib: Romain Forlot <romain.forlot@iot.bzh> +# +# 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" +#-------------------------------------------------------------------------- + +# Include ExternalProject CMake module by default +include(ExternalProject) + +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" OSDETECTED ${TMP_OSRELEASE}) + string(REPLACE " " ";" OSRELEASE ${OSDETECTED}) + else() + set(OSRELEASE "NOT COMPATIBLE !") + endif() +elseif("${BUILD_ENV_SYSROOT}" STREQUAL "$ENV{PKG_CONFIG_SYSROOT_DIR}") + set(OSRELEASE "yocto-build") +else() + set(OSRELEASE "NOT COMPATIBLE ! Missing ${OS_RELEASE_PATH} file.") +endif() +message("Distribution detected (separated by ';' choose one of them) ${OSRELEASE}") + +# Include CMake modules core files +file(GLOB project_cmakefiles ${CMAKE_CURRENT_LIST_DIR}/cmake.d/[0-9][0-9]-*.cmake) + +# Include optionnal user defined OS relative CMake files +foreach(OS IN LISTS OSRELEASE) + list(APPEND PATTERN "${CMAKE_SOURCE_DIR}/${PROJECT_CMAKE_CONF_DIR}/cmake/[0-9][0-9]-${OS}*.cmake" + "${CMAKE_SOURCE_DIR}/${PROJECT_CMAKE_CONF_DIR}/cmake.d/[0-9][0-9]-${OS}*.cmake") +endforeach() +list(APPEND PATTERN "${PROJECT_CMAKE_CONF_DIR}/../cmake/[0-9][0-9]-common*.cmake" + "${PROJECT_CMAKE_CONF_DIR}/../cmake.d/[0-9][0-9]-common*.cmake") + +file(GLOB distro_cmakefiles ${PATTERN}) +list(SORT distro_cmakefiles) + +if(NOT distro_cmakefiles) + file(GLOB distro_cmakefiles ${CMAKE_SOURCE_DIR}/${PROJECT_CMAKE_CONF_DIR}/cmake/[0-9][0-9]-default*.cmake + ${CMAKE_SOURCE_DIR}/${PROJECT_CMAKE_CONF_DIR}/cmake.d/[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 + $ENV{HOME}/.config/cmake-apps-module/cmake.d/[0-9][0-9]-common*.cmake + $ENV{HOME}/.config/cmake-apps-module/cmake.d/[0-9][0-9]-${PROJECT_NAME}*.cmake + $ENV{HOME}/.config/CMakeAfbTemplates/cmake.d/[0-9][0-9]-common*.cmake + $ENV{HOME}/.config/CMakeAfbTemplates/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 + /etc/cmake-apps-module/cmake.d/[0-9][0-9]-common*.cmake + /etc/cmake-apps-module/cmake.d/[0-9][0-9]-${PROJECT_NAME}*.cmake + /etc/CMakeAfbTemplates/cmake.d/[0-9][0-9]-common*.cmake + /etc/CMakeAfbTemplates/cmake.d/[0-9][0-9]-${PROJECT_NAME}*.cmake) +list(SORT system_cmakefiles) + +foreach(file ${system_cmakefiles} ${home_cmakefiles} ${project_cmakefiles}) + message("Include: ${file}") + include(${file}) +endforeach() + +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(${CMAKE_SOURCE_DIR}/${PROJECT_CMAKE_CONF_DIR}/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/src/cmake/configure_file.cmake b/src/cmake/configure_file.cmake new file mode 100644 index 0000000..2028388 --- /dev/null +++ b/src/cmake/configure_file.cmake @@ -0,0 +1,2 @@ +include(${CMAKE_BINARY_DIR}/CMakeCacheForScript.cmake) +configure_file(${INFILE} ${OUTFILE} @ONLY) diff --git a/src/cmake/export.map b/src/cmake/export.map new file mode 100644 index 0000000..ee2f413 --- /dev/null +++ b/src/cmake/export.map @@ -0,0 +1 @@ +{ global: afbBindingV*; local: *; }; |