config.cmake.sample: Remove dependency to libsystemd
[apps/app-templates.git] / cmake / cmake.d / 03-macros.cmake
index 9f5a1db..9df9a10 100644 (file)
 #     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(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)
-  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})
+       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)
@@ -236,10 +247,13 @@ endmacro()
 
 # To be call inside project_targets_populate macro
 macro(afb_genskel)
+       if ("${PROJECT_LANGUAGES}" MATCHES "CXX")
+               list(APPEND GENSKEL_OPTS "--cpp")
+       endif()
        if (OPENAPI_DEF)
                add_custom_command(OUTPUT ${SD}/${OPENAPI_DEF}.h
                        DEPENDS ${SD}/${OPENAPI_DEF}.json
-                       COMMAND afb-genskel ${SD}/${OPENAPI_DEF}.json > ${SD}/${OPENAPI_DEF}.h
+                       COMMAND afb-genskel ${GENSKEL_OPTS} ${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")
@@ -247,7 +261,7 @@ macro(afb_genskel)
        else()
                add_custom_command(OUTPUT ${SD}/${OUT}-apidef.h
                        DEPENDS ${SD}/${OUT}-apidef.json
-                       COMMAND afb-genskel ${SD}/${OUT}-apidef.json > ${SD}/${OUT}-apidef.h
+                       COMMAND afb-genskel ${GENSKEL_OPTS} ${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")
@@ -258,13 +272,6 @@ endmacro()
 # Pre-packaging
 macro(project_targets_populate)
        # Default Widget default directory
-       set(AFBDIR afb)
-       set(BINDIR bin)
-       set(ETCDIR etc)
-       set(LIBDIR lib)
-       set(HTTPDIR htdocs)
-       set(DATADIR data)
-       set(PACKAGE_AFBDIR  ${PROJECT_PKG_BUILD_DIR}/${AFBDIR})
        set(PACKAGE_BINDIR  ${PROJECT_PKG_BUILD_DIR}/${BINDIR})
        set(PACKAGE_ETCDIR  ${PROJECT_PKG_BUILD_DIR}/${ETCDIR})
        set(PACKAGE_LIBDIR  ${PROJECT_PKG_BUILD_DIR}/${LIBDIR})
@@ -317,19 +324,19 @@ macro(project_targets_populate)
                                if(NOT S)
                                        set(S ".ctlso")
                                endif()
-                               generate_one_populate_target(${P}${OUT}${S} "${PACKAGE_AFBDIR}/plugins")
+                               generate_one_populate_target(${P}${OUT}${S} "${PACKAGE_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_AFBDIR})
+                               generate_one_populate_target(${P}${OUT}${S} ${PACKAGE_LIBDIR})
                        elseif(${T} STREQUAL "BINDINGV2")
                                if(NOT S)
                                        set(S ".so")
                                endif()
                                afb_genskel()
-                               generate_one_populate_target(${P}${OUT}${S} ${PACKAGE_AFBDIR})
+                               generate_one_populate_target(${P}${OUT}${S} ${PACKAGE_LIBDIR})
                        elseif(${T} STREQUAL "EXECUTABLE")
                                if(NOT S)
                                        set(S "")
@@ -495,22 +502,10 @@ macro(rpm_package_build)
        endif()
 endmacro(rpm_package_build)
 
-macro(deb_package_build)
-#TODO
-endmacro(deb_package_build)
-
 macro(project_package_build)
-#      if(EXISTS ${TEMPLATE_DIR})
-#              rpm_package_build()
-#      endif()
-
        if(EXISTS ${TEMPLATE_DIR})
                wgt_package_build()
        endif()
-
-#      if(EXISTS ${TEMPLATE_DIR})
-#              deb_package_build()
-#      endif()
 endmacro(project_package_build)
 
 macro(project_subdirs_add)
@@ -525,6 +520,8 @@ macro(project_subdirs_add)
        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)
@@ -542,3 +539,23 @@ macro(project_closing_msg)
                        ${PROJECT_TARGETS} populate)
        endif()
 endmacro()
+
+macro(check_version)
+       if(GIT_PROJECT_VERSION)
+               if(${GIT_PROJECT_VERSION} VERSION_GREATER ${APP_TEMPLATES_VERSION})
+                       message(STATUS "${Yellow}.. Your app-templates submodule version seems outdated. You should update it with 'git submodule update --remote ${PROJECT_APP_TEMPLATES_DIR}'.
+               - App-templates version: ${APP_TEMPLATES_VERSION}
+               - Project version according AGL Git tag: ${GIT_PROJECT_VERSION}"
+               )
+               endif()
+       elseif(PROJECT_VERSION)
+               if(${PROJECT_VERSION} VERSION_GREATER ${APP_TEMPLATES_VERSION})
+                       message(STATUS "${Yellow}.. Your app-templates submodule version seems outdated. You should update it with 'git submodule update --remote ${PROJECT_APP_TEMPLATES_DIR}'.
+               - App-templates version: ${APP_TEMPLATES_VERSION}
+               - Project version according AGL Git tag: ${PROJECT_VERSION}"
+               )
+               endif()
+       else()
+               message(STATUS "${Yellow} Your git project repo doesn't have any version tags nor hosted by AGL gerrit infrastructure. Can't compare version between project and app-templates ${APP_TEMPLATES_VERSION} ${ColourReset}")
+       endif()
+endmacro()