Reorganization for a new project tree logic.
authorRomain Forlot <romain.forlot@iot.bzh>
Thu, 18 May 2017 16:21:08 +0000 (18:21 +0200)
committerRomain Forlot <romain.forlot@iot.bzh>
Thu, 18 May 2017 17:02:20 +0000 (19:02 +0200)
This directory has to be include as submodules by example into a conf.d
directory at root project path. conf.d will have config.cmake, icon.png, build scripts
and a package directory where should lies builded config.xml and config.spec files to
build package using OBS (by example)

Change-Id: I2a5cd8a4b5641995ef89a1e796a0e5a229303f7c
Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
cmake/config.cmake.sample [moved from reference/etc/config.cmake with 89% similarity]
cmake/export.map [moved from reference/etc/export.map with 100% similarity]
cmake/macros.cmake [moved from reference/etc/macros.cmake with 55% similarity]
rpm/config.spec.in [new file with mode: 0644]
scripts/build [moved from reference/AGLbuild with 100% similarity]
wgt/config.xml.in [moved from reference/packaging/wgt/config.xml.in with 100% similarity]
wgt/icon.png [moved from reference/packaging/wgt/icon.png.in with 100% similarity]

similarity index 89%
rename from reference/etc/config.cmake
rename to cmake/config.cmake.sample
index 2520153..a7386c0 100644 (file)
@@ -29,10 +29,6 @@ set(PROJECT_AUTHOR_MAIL "example.man@bigouden.bzh")
 set(PROJECT_LICENCE "APL2.0")
 set(PROJECT_LANGUAGES,"C")
 
-# Where are stored config.xml.in and icon.png.in files. Template available at :
-# https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/app-templates
-# set(PROJECT_WGT_DIR "packaging/wgt")
-
 # Where are stored your external libraries for your project. This is 3rd party library that you don't maintain
 # but used and must be built and linked.
 # set(PROJECT_LIBDIR "libs")
@@ -67,7 +63,7 @@ set(CMAKE_CXX_FLAGS "")
 # Print a helper message when every thing is finished
 # ----------------------------------------------------
 #set(CLOSING_MESSAGE "")
-#set(WIDGET_MESSAGE "Install widget file using in the target : afm-util install ${PROJECT_NAME}.wgt")
+#set(PACKAGE_MESSAGE "Install widget file using in the target : afm-util install ${PROJECT_NAME}.wgt")
 
 # (BUG!!!) as PKG_CONFIG_PATH does not work [should be an env variable]
 # ---------------------------------------------------------------------
@@ -91,9 +87,13 @@ set(LD_LIBRARY_PATH ${CMAKE_INSTALL_PREFIX}/lib64 ${CMAKE_INSTALL_PREFIX}/lib)
 # ------------------------------------
 # set(BINDINGS_INSTALL_PREFIX PrefixPath )
 
-# Optional force widget prefix generation
-# ------------------------------------------------
-# set(WIDGET_PREFIX DestinationPath)
+# Optional force binding Linking flag
+# ------------------------------------
+# set(BINDINGS_LINK_FLAG LinkOptions )
+
+# Optional force package prefix generation, like widget
+# -----------------------------------------------------
+# set(PACKAGE_PREFIX DestinationPath)
 
 # Optional Widget entry point file.
 # ---------------------------------------------------------
@@ -116,7 +116,3 @@ set(LD_LIBRARY_PATH ${CMAKE_INSTALL_PREFIX}/lib64 ${CMAKE_INSTALL_PREFIX}/lib)
 # - application/vnd.agl.html.hybrid
 #
 # set(WIDGET_TYPE MimeType)
-
-# Optional force binding Linking flag
-# ------------------------------------
-# set(BINDINGS_LINK_FLAG LinkOptions )
similarity index 100%
rename from reference/etc/export.map
rename to cmake/export.map
similarity index 55%
rename from reference/etc/macros.cmake
rename to cmake/macros.cmake
index 18af27e..42b7dd4 100644 (file)
 #     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()
 
 # Generic useful macro
 # -----------------------
@@ -34,9 +54,9 @@ endmacro(PROJECT_TARGET_ADD)
 
 # Check GCC minimal version version
 if (gcc_minimal_version)
-   message ("-- Check gcc_minimal_version (found gcc version ${CMAKE_C_COMPILER_VERSION})  (found g++ version ${CMAKE_CXX_COMPILER_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 "**** FATAL: Require at least gcc-${gcc_minimal_version} please set CMAKE_C[XX]_COMPILER")
+       message(FATAL_ERROR "${Red}**** FATAL: Require at least gcc-${gcc_minimal_version} please set CMAKE_C[XX]_COMPILER")
 endif()
 endif(gcc_minimal_version)
 
@@ -46,13 +66,20 @@ endmacro(defstr)
 
 # WGT packaging
 macro(project_targets_populate)
-       add_custom_target(MAIN_POPULATE)
+       # Default Widget default directory
+       set(PACKAGE_BINDIR  ${PROJECT_PKG_DIR}/bin)
+       set(PACKAGE_ETCDIR  ${PROJECT_PKG_DIR}/etc)
+       set(PACKAGE_LIBDIR  ${PROJECT_PKG_DIR}/lib)
+       set(PACKAGE_HTTPDIR ${PROJECT_PKG_DIR}/htdocs)
+       set(PACKAGE_DATADIR ${PROJECT_PKG_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_WIDGET_TARGET "project_populate_${TARGET}")
+                       set(POPULE_PACKAGE_TARGET "project_populate_${TARGET}")
 
                        get_target_property(P ${TARGET} PREFIX)
                        get_target_property(BD ${TARGET} BINARY_DIR)
@@ -67,35 +94,37 @@ macro(project_targets_populate)
                        endif()
 
                        if(${T} STREQUAL "BINDING")
-                               add_custom_command(OUTPUT ${WIDGET_LIBDIR}/${P}${TARGET}.so
+                               add_custom_command(OUTPUT ${PACKAGE_LIBDIR}/${P}${TARGET}.so
                                        DEPENDS ${TARGET}
-                                       COMMAND mkdir -p ${WIDGET_LIBDIR}
-                                       COMMAND cp ${BD}/${P}${OUT}.so ${WIDGET_LIBDIR}
+                                       COMMAND mkdir -p ${PACKAGE_LIBDIR}
+                                       COMMAND cp ${BD}/${P}${OUT}.so ${PACKAGE_LIBDIR}
                                )
-                               add_custom_target(${POPULE_WIDGET_TARGET} DEPENDS ${WIDGET_LIBDIR}/${P}${TARGET}.so)
-                               add_dependencies(MAIN_POPULATE ${POPULE_WIDGET_TARGET}) 
+                               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 ${WIDGET_BINDIR}/${P}${TARGET}
+                               add_custom_command(OUTPUT ${PACKAGE_BINDIR}/${P}${TARGET}
                                        DEPENDS ${TARGET}
-                                       COMMAND mkdir -p ${WIDGET_BINDIR}
-                                       COMMAND cp ${BD}/${P}${OUT} ${WIDGET_BINDIR}
+                                       COMMAND mkdir -p ${PACKAGE_BINDIR}
+                                       COMMAND cp ${BD}/${P}${OUT} ${PACKAGE_BINDIR}
                                )
-                               add_custom_target(${POPULE_WIDGET_TARGET} DEPENDS ${WIDGET_BINDIR}/${P}${TARGET})
-                               add_dependencies(MAIN_POPULATE ${POPULE_WIDGET_TARGET}) 
+                               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 ${WIDGET_HTTPDIR}
+                               add_custom_command(OUTPUT ${PACKAGE_HTTPDIR}
                                        DEPENDS ${TARGET}
-                                       COMMAND cp -r ${BD}/${P}${OUT} ${WIDGET_HTTPDIR}
+                                       COMMAND mkdir -p ${PROJECT_PKG_DIR}
+                                       COMMAND cp -r ${BD}/${P}${OUT} ${PACKAGE_HTTPDIR}
                                        )
-                                       add_custom_target(${POPULE_WIDGET_TARGET} DEPENDS ${WIDGET_HTTPDIR})
-                                       add_dependencies(MAIN_POPULATE ${POPULE_WIDGET_TARGET}) 
+                                       add_custom_target(${POPULE_PACKAGE_TARGET} DEPENDS ${PACKAGE_HTTPDIR})
+                                       add_dependencies(populate ${POPULE_PACKAGE_TARGET}) 
                        elseif(${T} STREQUAL "DATA")
-                               add_custom_command(OUTPUT ${WIDGET_DATADIR}
+                               add_custom_command(OUTPUT ${PACKAGE_DATADIR}
                                        DEPENDS ${TARGET}
-                                       COMMAND cp -r ${BD}/${P}${OUT} ${WIDGET_DATADIR}
+                                       COMMAND mkdir -p ${PROJECT_PKG_DIR}
+                                       COMMAND cp -r ${BD}/${P}${OUT} ${PACKAGE_DATADIR}
                                        )
-                                       add_custom_target(${POPULE_WIDGET_TARGET} DEPENDS ${WIDGET_HTTPDIR})
-                                       add_dependencies(MAIN_POPULATE ${POPULE_WIDGET_TARGET}) 
+                                       add_custom_target(${POPULE_PACKAGE_TARGET} DEPENDS ${PACKAGE_HTTPDIR})
+                                       add_dependencies(populate ${POPULE_PACKAGE_TARGET}) 
                        endif(${T} STREQUAL "BINDING")
 #              elseif(${CMAKE_BUILD_TYPE} MATCHES "[Dd][Ee][Bb][Uu][Gg]")
 #                                      MESSAGE(WARNING "This target, ${TARGET}, will be not be included in the package.")
@@ -103,35 +132,81 @@ macro(project_targets_populate)
        endforeach()
 endmacro(project_targets_populate)
 
-macro(project_package_build)
-               if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_WGT_DIR}/config.xml.in OR NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_WGT_DIR}/${PROJECT_ICON}.in)
-                       MESSAGE(FATAL_ERROR "Missing mandatory files: you need config.xml.in and ${PROJECT_ICON}.in files in ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_WGT_DIR} folder.")
-               endif()
-
-               if(NOT EXISTS ${WIDGET_DIR}/config.xml.in OR NOT EXISTS ${WIDGET_DIR}/${PROJECT_ICON}.in)
-                       configure_file(${PROJECT_WGT_DIR}/config.xml.in ${WIDGET_DIR}/config.xml)
-                       file(COPY ${PROJECT_WGT_DIR}/${PROJECT_ICON}.in DESTINATION ${WIDGET_DIR}/${PROJECT_ICON})
-               endif(NOT EXISTS ${WIDGET_DIR}/config.xml.in OR NOT EXISTS ${WIDGET_DIR}/${PROJECT_ICON}.in)
-
-               file(GLOB PROJECT_CONF_FILES "${PROJECT_WGT_DIR}/etc/*")
+macro(wgt_package_build)
+       if(NOT EXISTS ${TEMPLATE_WGT_DIR}/config.xml.in OR NOT EXISTS ${TEMPLATE_WGT_DIR}/${PROJECT_ICON})
+               MESSAGE(SEND_ERROR "${Red}WARNING ! Missing mandatory files to build widget file.\nYou need config.xml.in and ${PROJECT_ICON} files in ${TEMPLATE_WGT_DIR} folder.${ColourReset}")
+       else()
+               # Build widget spec file from template only once (Fulup good idea or should depend on time ????)
+               if(NOT EXISTS ${TEMPLATE_WGT_DIR}/config.xml.in OR NOT EXISTS ${TEMPLATE_WGT_DIR}/${PROJECT_ICON})
+                               configure_file(${TEMPLATE_WGT_DIR}/config.xml.in ${PROJECT_PKG_DIR}/config.xml)
+                               file(COPY ${TEMPLATE_WGT_DIR}/${PROJECT_ICON} DESTINATION ${PROJECT_PKG_DIR}/${PROJECT_ICON})
+               endif(NOT EXISTS ${TEMPLATE_WGT_DIR}/config.xml.in OR NOT EXISTS ${TEMPLATE_WGT_DIR}/${PROJECT_ICON})
+
+               # Fulup ??? copy any extra file in wgt/etc into populate package before building the widget
+               file(GLOB PROJECT_CONF_FILES "${TEMPLATE_WGT_DIR}/etc/*")
                if(${PROJECT_CONF_FILES})
-                       file(COPY "${PROJECT_WGT_DIR}/etc/*" DESTINATION ${WIDGET_ETCDIR}/)
+                               file(COPY "${TEMPLATE_WGT_DIR}/etc/*" DESTINATION ${PROJECT_PKG_DIR}/etc/)
                endif(${PROJECT_CONF_FILES})
 
                add_custom_command(OUTPUT ${PROJECT_NAME}.wgt
-                       DEPENDS ${PROJECT_TARGETS}
-                       COMMAND wgtpkg-pack -f -o ${PROJECT_NAME}.wgt ${WIDGET_DIR}
+                               DEPENDS ${PROJECT_TARGETS}
+                               COMMAND wgtpkg-pack -f -o ${PROJECT_NAME}.wgt ${PROJECT_PKG_DIR}
                )
 
                add_custom_target(widget DEPENDS ${PROJECT_NAME}.wgt)
-               add_dependencies(widget MAIN_POPULATE)
+               add_dependencies(widget populate)
                set(ADDITIONAL_MAKE_CLEAN_FILES, "${PROJECT_NAME}.wgt")
 
-               if(WIDGET_MESSAGE)
+               if(PACKAGE_MESSAGE)
                add_custom_command(TARGET widget
-                       POST_BUILD
-                       COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --cyan "++ ${WIDGET_MESSAGE}")
+                               POST_BUILD
+                               COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --cyan "++ ${PACKAGE_MESSAGE}")
                endif()
+       endif()
+endmacro(wgt_package_build)
+
+macro(rpm_package_build)
+       if(NOT EXISTS ${PROJECT_RPM_DIR}/config.rpm.in)
+                       MESSAGE(STATUS "Missing mandatory files: you needconfig.rpm.in in ${PROJECT_RPM_DIR} folder.")
+       else()
+               # extract PROJECT_PKG_DEPS and replace ; by , for RPM spec file
+               get_property(PROJECT_PKG_DEPS GLOBAL PROPERTY PROJECT_PKG_DEPS)
+               foreach (PKFCONF ${PROJECT_PKG_DEPS})
+               set(RPM_PKG_DEPS "${RPM_PKG_DEPS}, pkgconfig(${PKFCONF})")
+               endforeach()
+
+               # build rpm spec file from template
+               configure_file(${PROJECT_RPM_DIR}/config.rpm.in ${PROJECT_PKG_DIR}/config.rpm)
+
+               add_custom_command(OUTPUT ${PROJECT_NAME}.rpm
+                               DEPENDS ${PROJECT_TARGETS}
+                               COMMAND rpmbuild -ba  ${PROJECT_PKG_DIR}/config.rpm
+               )
+
+               add_custom_target(rpm DEPENDS ${PROJECT_NAME}.rpm)
+               add_dependencies(rpm populate)
+               set(ADDITIONAL_MAKE_CLEAN_FILES, "${PROJECT_NAME}.rpm")
+
+               if(PACKAGE_MESSAGE)
+               add_custom_command(TARGET rpm
+                               POST_BUILD
+                               COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --cyan "++ ${PACKAGE_MESSAGE}")
+               endif()
+       endif()
+endmacro(rpm_package_build)
+
+macro(project_package_build)
+       if(EXISTS ${TEMPLATE_RPM_DIR})
+               rpm_package_build()
+       endif()
+
+       if(EXISTS ${TEMPLATE_WGT_DIR})
+               wgt_package_build()
+       endif()
+
+       if(EXISTS ${TEMPLATE_DEB_DIR})
+               deb_package_build()
+       endif()
 endmacro(project_package_build)
 
 macro(project_subdirs_add)
@@ -155,7 +230,6 @@ set(CMP0048 1)
 # Include project configuration
 # ------------------------------
 project(${PROJECT_NAME} VERSION ${PROJECT_VERSION} LANGUAGES ${PROJECT_LANGUAGES})
-set(PROJECT_WGT_DIR "packaging/wgt" CACHE PATH "Subpath to the widget directory")
 set(PROJECT_LIBDIR "libs" CACHE PATH "Subpath to libraries")
 set(PROJECT_RESOURCES "data" CACHE PATH "Subpath to data")
 
@@ -215,28 +289,26 @@ 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})
+       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})
+       set(BINDINGS_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME} CACHE PATH "Where the binding will be installed in your system")
 endif()
 
 # Define a default package directory
-if(WIDGET_PREFIX)
-       set(WIDGET_DIR ${WIDGET_PREFIX}/package)
+if(PACKAGE_PREFIX)
+       set(PROJECT_PKG_DIR ${PKG_PREFIX}/package CACHE PATH "Where the package will be built.")
 else()
-       set(WIDGET_DIR ${CMAKE_CURRENT_BINARY_DIR}/package)
+       set(PROJECT_PKG_DIR ${CMAKE_CURRENT_BINARY_DIR}/package CACHE PATH "Where the package will be built")
 endif()
 
-# and their subsequent subdir
-set(WIDGET_BINDIR ${WIDGET_DIR}/bin)
-set(WIDGET_ETCDIR ${WIDGET_DIR}/etc)
-set(WIDGET_LIBDIR ${WIDGET_DIR}/lib)
-set(WIDGET_HTTPDIR ${WIDGET_DIR}/htdocs)
-set(WIDGET_DATADIR ${WIDGET_DIR}/data)
+set (PKG_TEMPLATE_PREFIX ${CMAKE_SOURCE_DIR}/etc CACHE PATH "Default Package Templates Directory")
+set(TEMPLATE_WGT_DIR "${CMAKE_SOURCE_DIR}/conf.d/app-templates/wgt" CACHE PATH "Subpath to a directory where are stored needed files to build widget")
+set(TEMPLATE_RPM_DIR "${CMAKE_SOURCE_DIR}/conf.d/app-templates/rpm" CACHE PATH "Subpath to a directory where are stored needed files to build rpm package")
+set(TEMPLATE_DEB_DIR "${CMAKE_SOURCE_DIR}/conf.d/app-templates/deb" CACHE PATH "Subpath to a directory where are stored needed files to build deb package")
 
 # Default Linkflag
 if(NOT BINDINGS_LINK_FLAG)
-       set(BINDINGS_LINK_FLAG "-Wl,--version-script=${CMAKE_SOURCE_DIR}/etc/export.map")
+       set(BINDINGS_LINK_FLAG "-Wl,--version-script=${CMAKE_SOURCE_DIR}/conf.d/app-templates/cmake/export.map")
 endif()
 
 # Add a dummy target to enable global dependency order
diff --git a/rpm/config.spec.in b/rpm/config.spec.in
new file mode 100644 (file)
index 0000000..66346fb
--- /dev/null
@@ -0,0 +1,43 @@
+###########################################################################
+# Copyright 2015, 2016, 2017 IoT.bzh
+#
+# author: Fulup Ar Foll <fulup@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.
+###########################################################################
+
+
+Name:    @PROJECT_NAME@
+Version: @PROJECT_VERSION@
+Release: 1
+License: @PROJECT_LICENCE@
+Summary: @PROJECT_DESCRIPTION@
+Url:     @PROJECT_URL@
+
+Provides: @PROJECT_NAME@
+Prefix: /opt/@PROJECT_NAME@
+BuildRequires: pkg-config @RPM_PKG_DEPS@
+
+BuildRoot:@CMAKE_CURRENT_BINARY_DIR@
+
+%description
+@PROJECT_DESCRIPTION@
+
+%prep
+
+%build
+(mkdir -p build; cd build; cmake ..; make)
+
+%install
+(cd build; make populate DESTDIR=%{buildroot})
+
similarity index 100%
rename from reference/AGLbuild
rename to scripts/build