From: Romain Forlot Date: Thu, 18 May 2017 16:21:08 +0000 (+0200) Subject: Reorganization for a new project tree logic. X-Git-Tag: 3.99.2~97 X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=commitdiff_plain;h=2d21ecea6f2929cb07f62133c3812627d8408931;p=apps%2Fapp-templates.git Reorganization for a new project tree logic. 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 --- diff --git a/reference/etc/config.cmake b/cmake/config.cmake.sample similarity index 89% rename from reference/etc/config.cmake rename to cmake/config.cmake.sample index 2520153..a7386c0 100644 --- a/reference/etc/config.cmake +++ b/cmake/config.cmake.sample @@ -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 ) diff --git a/reference/etc/export.map b/cmake/export.map similarity index 100% rename from reference/etc/export.map rename to cmake/export.map diff --git a/reference/etc/macros.cmake b/cmake/macros.cmake similarity index 55% rename from reference/etc/macros.cmake rename to cmake/macros.cmake index 18af27e..42b7dd4 100644 --- a/reference/etc/macros.cmake +++ b/cmake/macros.cmake @@ -24,6 +24,26 @@ # 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 index 0000000..66346fb --- /dev/null +++ b/rpm/config.spec.in @@ -0,0 +1,43 @@ +########################################################################### +# Copyright 2015, 2016, 2017 IoT.bzh +# +# author: Fulup Ar Foll +# +# 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}) + diff --git a/reference/AGLbuild b/scripts/build similarity index 100% rename from reference/AGLbuild rename to scripts/build diff --git a/reference/packaging/wgt/config.xml.in b/wgt/config.xml.in similarity index 100% rename from reference/packaging/wgt/config.xml.in rename to wgt/config.xml.in diff --git a/reference/packaging/wgt/icon.png.in b/wgt/icon.png similarity index 100% rename from reference/packaging/wgt/icon.png.in rename to wgt/icon.png