[oe] [meta-openembedded][PATCH v5 6/7] ibus-table-chinese: add ibus-table-chinese recipe

Khem Raj raj.khem at gmail.com
Thu Jul 25 14:18:35 UTC 2019


adding 0004-skip-ibus-table-createdb.patch solved the configure issue
but then install fails

| CMake Error at tables/array/cmake_install.cmake:49 (file):
|   file INSTALL cannot find
|   "/mnt/a/yoe/build/tmp/work/aarch64-yoe-linux-musl/ibus-table-chinese/1.8.2-r0/build/tables/array/array30.db".

On Thu, Jul 25, 2019 at 7:01 AM Khem Raj <raj.khem at gmail.com> wrote:
>
> this fails
>
> -- Checking for module 'ibus-table>=1.2'
> --   Found ibus-table, version 1.9.21
> CMake Error at tables/CMakeLists.txt:3 (MESSAGE):
> ibus-table-createdb is not installed
>
> On Wed, Jul 24, 2019 at 7:59 AM Pablo Saavedra <psaavedra at igalia.com> wrote:
> >
> > Signed-off-by: Pablo Saavedra <psaavedra at igalia.com>
> > ---
> >  .../0001-revert-CMakeLists.txt.patch               |  204 ++
> >  .../ibus/ibus-table-chinese/0002-add-Modules.patch | 2933 ++++++++++++++++++++
> >  .../0003-add-ChangeLog.prev.patch                  |   58 +
> >  .../0005-fix-cmake-cross-compile.patch             |  130 +
> >  .../ibus/ibus-table-chinese_1.8.2.bb               |   82 +
> >  5 files changed, 3407 insertions(+)
> >  create mode 100644 meta-oe/recipes-support/ibus/ibus-table-chinese/0001-revert-CMakeLists.txt.patch
> >  create mode 100644 meta-oe/recipes-support/ibus/ibus-table-chinese/0002-add-Modules.patch
> >  create mode 100644 meta-oe/recipes-support/ibus/ibus-table-chinese/0003-add-ChangeLog.prev.patch
> >  create mode 100644 meta-oe/recipes-support/ibus/ibus-table-chinese/0005-fix-cmake-cross-compile.patch
> >  create mode 100644 meta-oe/recipes-support/ibus/ibus-table-chinese_1.8.2.bb
> >
> > diff --git a/meta-oe/recipes-support/ibus/ibus-table-chinese/0001-revert-CMakeLists.txt.patch b/meta-oe/recipes-support/ibus/ibus-table-chinese/0001-revert-CMakeLists.txt.patch
> > new file mode 100644
> > index 000000000..d677dc49a
> > --- /dev/null
> > +++ b/meta-oe/recipes-support/ibus/ibus-table-chinese/0001-revert-CMakeLists.txt.patch
> > @@ -0,0 +1,204 @@
> > +--- a/CMakeLists.txt
> > ++++ b/CMakeLists.txt
> > +@@ -1,17 +1,20 @@
> > + cmake_minimum_required(VERSION 2.6.2)
> > +
> > +-# Included scripts do automatic cmake_policy PUSH and POP.
> > +-# OLD: CMake policy in included script will affect the invoker.
> > +-# CMAKE_POLICY(SET CMP0011 OLD)
> > ++# CMP0011 should be set here, otherwise policy set in module won't affect
> > ++# here.
> > ++CMAKE_POLICY(SET CMP0011 OLD)
> > +
> > + # Default CMAKE_INSTALL_PREFIX should be set before PROJECT()
> > + SET(CMAKE_INSTALL_PREFIX "/usr" CACHE PATH "Install dir prefix")
> > +
> > + # Whether to build on fedora
> > +-SET(CMAKE_FEDORA_ENABLE_FEDORA_BUILD "1" CACHE STRING "Enable fedora build")
> > ++SET(CMAKE_FEDORA_ENABLE_FEDORA_BUILD "0" CACHE STRING "Enable fedora build")
> > +
> > +-# Message level INFO1 (5)
> > +-SET(MANAGE_MESSAGE_LEVEL 5 CACHE STRING "Message (Verbose) Level")
> > ++# Message level M_OFF (4)
> > ++SET(MANAGE_MESSAGE_LEVEL 4 CACHE STRING "Message (Verbose) Level")
> > ++
> > ++# Default support Gnome shell
> > ++SET(GNOME_SHELL 1)
> > +
> > + ####################################################################
> > + # Project specific information
> > +@@ -19,34 +22,20 @@
> > + PROJECT(ibus-table-chinese NONE)
> > + SET(PRJ_SUMMARY "Chinese input tables for IBus")
> > +
> > +-SET(SUMMARY_TRANSLATIONS
> > +-    "zh_CN" "中文码表输入法"
> > +-    "zh_TW" "中文碼表輸入法"
> > +-    )
> > +-
> > + SET(PRJ_DESCRIPTION
> > + "ibus-table-chinese is provides the infrastructure for Chinese input methods.
> > + Input tables themselves are in subpackages."
> > +     )
> > +
> > +-SET(DESCRIPTION_TRANSLATIONS
> > +-    "zh_TW" "ibus-table-chinese 提供了中文碼表輸入法的基礎架構。
> > +-    輸入法本身則在子套件裡。"
> > +-    )
> > +-
> > + SET(AUTHORS "Yuwei Yu, Caius 'kaio' Chance, Ding-Yi Chen")
> > + SET(MAINTAINER "Ding-Yi Chen <dchen at redhat.com>")
> > + SET(VENDOR "Red Hat, Inc")
> > + SET(LICENSE "GPLv3+")
> > +-SET(PRJ_GROUP "System Environment/Libraries")
> > +-SET(BUILD_ARCH "noarch")
> > +-SET(RPM_SPEC_URL "http://code.google.com/p/ibus/")
> > +-SET(RPM_SPEC_SOURCES "https://fedorahosted.org/releases/c/m/%{name}/%{name}-%{version}-Source.tar.gz")
> > +
> > + ####################################################################
> > + # Includes
> > + #
> > +-LIST(INSERT CMAKE_MODULE_PATH 0 ${CMAKE_SOURCE_DIR}/Modules)
> > ++SET(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/Modules ${CMAKE_ROOT}/Modules )
> > +
> > + # Create a link if Modules/ does not exists
> > + IF(EXISTS ${CMAKE_SOURCE_DIR}/cmake-fedora/Modules)
> > +@@ -63,6 +52,7 @@
> > +       SET(LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib" CACHE PATH "Library dir")
> > +     ENDIF(CMAKE_SYSTEM_PROCESSOR MATCHES "64")
> > +     SET(LIBEXEC_DIR "${LIB_DIR}" CACHE PATH "LIBEXEC dir")
> > ++    MESSAGE("*Hi")
> > + ENDIF(NOT CMAKE_FEDORA_ENABLE_FEDORA_BUILD)
> > +
> > + INCLUDE(ManageEnvironment RESULT_VARIABLE MANAGE_ENVIRONMENT_PATH)
> > +@@ -77,56 +67,82 @@
> > +
> > + INCLUDE(ManageVersion)
> > + RELEASE_NOTES_READ_FILE()
> > +-INCLUDE(ManageArchive)
> > +-INCLUDE(ManageFile)
> > +-INCLUDE(ManageSourceVersionControl)
> > +-INCLUDE(ManageTarget)
> > +-INCLUDE(ManageTranslation)
> > + INCLUDE(ManageUninstall)
> > +-ENABLE_TESTING()
> > +
> > + ####################################################################
> > +-# Dependencies
> > ++# Required
> > + #
> > +
> > +-INCLUDE(ManageDependency)
> > +-## Requires
> > +-MANAGE_DEPENDENCY(REQUIRES IBUS-TABLE VER "1.2.0" REQUIRED)
> > +-
> > +-## Build Requires
> > +-MANAGE_DEPENDENCY(BUILD_REQUIRES CMAKE VER "2.6.2" REQUIRED)
> > +-MANAGE_DEPENDENCY(BUILD_REQUIRES IBUS-TABLE VER "1.2.0" REQUIRED DEVEL)
> > +-PRJ_INFO_CMAKE_APPEND(${PRJ_INFO_CMAKE} REQUIRES)
> > +-PRJ_INFO_CMAKE_APPEND(${PRJ_INFO_CMAKE} BUILD_REQUIRES)
> > ++FIND_PACKAGE(PkgConfig)
> > ++PKG_CHECK_MODULES(IBUS_TABLE REQUIRED ibus-table>=1.2)
> > +
> > + ####################################################################
> > + # Building
> > + #
> > ++
> > + ADD_SUBDIRECTORY(tables)
> > +
> > + ####################################################################
> > + # Installing
> > + #
> > +
> > +-MANAGE_SOURCE_VERSION_CONTROL_GIT()
> > ++# Install docs
> > ++# Note: Need to use filename only, otherwise
> > ++# ${CMAKE_SOURCE_DIR}/RELEASE-NOTES.txt will be deleted in spec
> > ++#
> > ++
> > ++GET_FILENAME_COMPONENT(_releaseFileName "${RELEASE_FILE}" NAME)
> > ++SET(INSTALL_DOCS ${_releaseFileName} AUTHORS README ChangeLog COPYING README)
> > ++STRING_JOIN(PRJ_DOC_LIST " " ${INSTALL_DOCS})
> > ++
> > ++INSTALL(FILES ${INSTALL_DOCS}
> > ++    DESTINATION "${PRJ_DOC_DIR}")
> > +
> > +-INSTALL(FILES AUTHORS README ChangeLog COPYING DESTINATION ${PRJ_DOC_DIR})
> > ++####################################################################
> > ++# Source Version Control
> > ++#
> > ++INCLUDE(ManageSourceVersionControl)
> > ++MANAGE_SOURCE_VERSION_CONTROL_GIT()
> > +
> > + ####################################################################
> > + # Packing
> > + #
> > ++INCLUDE(ManageArchive)
> > +
> > +-## Pack Source
> > +-SET(SOURCE_ARCHIVE_DIR ${CMAKE_BINARY_DIR}/SOURCES CACHE PATH "Source Archive Dir")
> > +-PACK_SOURCE_ARCHIVE("${SOURCE_ARCHIVE_DIR}"
> > +-    GITIGNORE ${CMAKE_SOURCE_DIR}/.gitignore
> > ++IF(CMAKE_FEDORA_ENABLE_FEDORA_BUILD)
> > ++    INCLUDE(ManageRPM)
> > ++    INCLUDE(ManageReleaseFedora)
> > ++ENDIF(CMAKE_FEDORA_ENABLE_FEDORA_BUILD)
> > ++INCLUDE(ManageRelease)
> > ++
> > ++SET(PRJ_IGNORE_FILES_COMMON
> > ++    "/doc/"  "\\\\.spec$" "messages.po$" "\\\\.orig$" "/cmake-fedora/"
> > ++    "/\\\\.cache/"
> > ++    "\\\\.db$"
> > ++    )
> > ++
> > ++LIST(APPEND PRJ_IGNORE_FILES_COMMON
> > ++    "\\\\.utf8$" "\\\\.tmp$" "\\\\.freq$" "\\\\.tab$"
> > ++    "tables/array/.*\\\\.head$"
> > ++    "array30.txt" "array30-big.txt" "wubi-haifeng86.txt"
> > +     )
> > +
> > +-## Pack RPM
> > ++LIST(APPEND SOURCE_ARCHIVE_IGNORE_FILES
> > ++    ${PRJ_IGNORE_FILES_COMMON} "/bin/" "\\\\.xml$" "\\\\.schemas")
> > ++
> > ++IF(RPM_BUILD_SOURCES)
> > ++    SET(SOURCE_ARCHIVE_DIR ${RPM_BUILD_SOURCES})
> > ++ELSE(RPM_BUILD_SOURCES)
> > ++    SET(SOURCE_ARCHIVE_DIR ${CMAKE_BINARY_DIR}/SOURCES)
> > ++ENDIF(RPM_BUILD_SOURCES)
> > ++
> > ++PACK_SOURCE_ARCHIVE("${SOURCE_ARCHIVE_DIR}")
> > + IF(CMAKE_FEDORA_ENABLE_FEDORA_BUILD)
> > +-    SET(RPM_BUILD_SOURCES ${SOURCE_ARCHIVE_DIR})
> > +-    INCLUDE(ManageRPM)
> > +-    PACK_RPM(SPEC_IN "SPECS/project.spec.in")
> > ++    PACK_RPM()
> > ++    RELEASE_FEDORA(fedora el6)
> > ++    # "Off" Warning is displayed if mock is not installed.
> > ++    RPM_MOCK_BUILD()
> > ++    MANAGE_RELEASE(release_fedora)
> > + ENDIF(CMAKE_FEDORA_ENABLE_FEDORA_BUILD)
> > +
> > + ####################################################################
> > +@@ -142,20 +158,10 @@
> > + #MANAGE_UPLOAD_CMD(scp src UPLOAD_FILES ${SOURCE_ARCHIVE_FILE})
> > + #ADD_DEPENDENCIES(upload upload_src)
> > +
> > +-INCLUDE(ManageRelease)
> > +-IF(CMAKE_FEDORA_ENABLE_FEDORA_BUILD)
> > +-    INCLUDE(ManageReleaseFedora)
> > +-    RELEASE_FEDORA(fedora el6)
> > +-    # "Off" Warning is displayed if mock is not installed.
> > +-    MANAGE_RELEASE(tag_push release_fedora)
> > +-ELSE(CMAKE_FEDORA_ENABLE_FEDORA_BUILD)
> > +-    MANAGE_RELEASE(tag_push)
> > +-ENDIF(CMAKE_FEDORA_ENABLE_FEDORA_BUILD)
> > +-
> > +-
> > + ####################################################################
> > + # Test Suites.
> > + #
> > ++#ENABLE_TESTING()
> > + #ADD_TEST("Test" test_cmd1)
> > +
> > +
> > diff --git a/meta-oe/recipes-support/ibus/ibus-table-chinese/0002-add-Modules.patch b/meta-oe/recipes-support/ibus/ibus-table-chinese/0002-add-Modules.patch
> > new file mode 100644
> > index 000000000..ffacda683
> > --- /dev/null
> > +++ b/meta-oe/recipes-support/ibus/ibus-table-chinese/0002-add-Modules.patch
> > @@ -0,0 +1,2933 @@
> > +--- /dev/null
> > ++++ b/Modules/DateTimeFormat.cmake
> > +@@ -0,0 +1,37 @@
> > ++# - Date/time format module.
> > ++#
> > ++# Included by:
> > ++#   ManageVersion
> > ++#
> > ++# Defines the following macros:
> > ++#    TODAY(date_var format [locale])
> > ++#      - Get date of today in specified format and locale.
> > ++#        * Parameters:
> > ++#                date_var: Result date string
> > ++#          format: date format for date(1)
> > ++#          locale: locale of the string. Use current locale setting if
> > ++#            locale is not given.
> > ++#
> > ++# Provides the following variables:
> > ++#    TODAY_CHANGELOG: Today in the format that is used in RPM Changelog.
> > ++#     e.g. Wed 08 Aug 2010
> > ++#
> > ++#    TODAY_SHORT: Short presentation of today, e.g. 20100818.
> > ++#
> > ++
> > ++IF(NOT DEFINED _DATE_TIME_FORMAT_CMAKE_)
> > ++    SET(_DATE_TIME_FORMAT_CMAKE_ "DEFINED")
> > ++
> > ++    MACRO(TODAY date_var format)
> > ++      INCLUDE(ManageVariable)
> > ++      SET(_locale ${ARGV2})
> > ++      IF(_locale)
> > ++          SET(ENV{LC_ALL} ${_locale})
> > ++      ENDIF(_locale)
> > ++      COMMAND_OUTPUT_TO_VARIABLE(${date_var} date --utc "${format}")
> > ++    ENDMACRO(TODAY date_var format)
> > ++
> > ++    TODAY(TODAY_CHANGELOG "+%a %b %d %Y" "C")
> > ++    TODAY(TODAY_SHORT "+%Y%m%d" "C")
> > ++ENDIF(NOT DEFINED _DATE_TIME_FORMAT_CMAKE_)
> > ++
> > +--- /dev/null
> > ++++ b/Modules/ManageAPIDoc.cmake
> > +@@ -0,0 +1,50 @@
> > ++# - Mage generated API documents
> > ++# This module is for API document generation, such as doxygen.
> > ++# Defines following macros:
> > ++#   MANAGE_APIDOC_DOXYGEN(doxygen_in doc_dir)
> > ++#   - This macro generate documents according to doxygen template.
> > ++#     Arguments:
> > ++#     + doxygen_in: Doxygen template file.
> > ++#     + doc_dir: Document source directory to be copied from.
> > ++#     Reads following variable:
> > ++#     + PRJ_DOC_DIR: Directory for document
> > ++#
> > ++#
> > ++IF(NOT DEFINED _MANAGE_APIDOC_CMAKE_)
> > ++    SET(_MANAGE_APIDOC_CMAKE_ "DEFINED")
> > ++    INCLUDE(ManageMessage)
> > ++
> > ++    MACRO(MANAGE_APIDOC_DOXYGEN doxygen_in doc_dir)
> > ++      SET(SOURCE_ARCHIVE_IGNORE_FILES ${SOURCE_ARCHIVE_IGNORE_FILES} "/Doxyfile$")
> > ++      SET(_manage_apidoc_doxygen_dependency_missing 0)
> > ++      IF(NOT PRJ_DOC_DIR)
> > ++          M_MSG(${M_OFF} "PRJ_DOC_DIR undefined. Doxygen support disabled.")
> > ++          SET(_manage_apidoc_doxygen_dependency_missing 1)
> > ++      ENDIF(NOT PRJ_DOC_DIR)
> > ++
> > ++      FIND_PACKAGE(doxygen)
> > ++      IF(NOT PACKAGE_FOUND_NAME)
> > ++          M_MSG(${M_OFF} "Package doxygen not found. Doxygen support disabled.")
> > ++          SET(_manage_apidoc_doxygen_dependency_missing 1)
> > ++      ENDIF(NOT PACKAGE_FOUND_NAME)
> > ++
> > ++      FIND_PROGRAM(DOXYGEN_CMD doxygen)
> > ++      IF(DOXYGEN_CMD STREQUAL "DOXYGEN_CMD-NOTFOUND")
> > ++          M_MSG(${M_OFF} "Program doxygen not found. Doxygen support disabled.")
> > ++          SET(_manage_apidoc_doxygen_dependency_missing 1)
> > ++      ENDIF(DOXYGEN_CMD STREQUAL "DOXYGEN_CMD-NOTFOUND")
> > ++
> > ++      IF(NOT _manage_apidoc_doxygen_dependency_missing)
> > ++          CONFIGURE_FILE(${doxygen_in} Doxyfile)
> > ++
> > ++          ADD_CUSTOM_TARGET(doxygen
> > ++              COMMAND "${DOXYGEN_CMD}" "Doxyfile"
> > ++              )
> > ++
> > ++          INSTALL(DIRECTORY ${doc_dir}
> > ++              DESTINATION "${PRJ_DOC_DIR}"
> > ++              )
> > ++      ENDIF(NOT _manage_apidoc_doxygen_dependency_missing)
> > ++    ENDMACRO(MANAGE_APIDOC_DOXYGEN doxygen_template)
> > ++ENDIF(NOT DEFINED _MANAGE_APIDOC_CMAKE_)
> > ++
> > +--- /dev/null
> > ++++ b/Modules/ManageArchive.cmake
> > +@@ -0,0 +1,179 @@
> > ++# - Pack source helper module
> > ++# By default CPack pack everything under the source directory, this is usually
> > ++# undesirable. We avoid this by using the sane default ignore list.
> > ++#
> > ++# Includes:
> > ++#   ManageVersion
> > ++#   CPack
> > ++#
> > ++# Included by:
> > ++#   ManageRPM
> > ++#
> > ++# Read and Defines following variable:
> > ++#   SOURCE_ARCHIVE_IGNORE_FILES_DEFAULT: Default list of file patterns
> > ++#     that are normally exclude from the source package.
> > ++#     Override it by setting it before INCLUDE(ManageArchive).
> > ++# Defines following target:
> > ++#     pack_remove_old: Remove old source package files.
> > ++# Defines following macro:
> > ++#   SOURCE_ARCHIVE(outputDir [generator])
> > ++#   - Pack source files as <projectName>-<PRJ_VER>-Source.<packFormat>,
> > ++#     Arguments:
> > ++#     + outputDir: Directory to write source archive.
> > ++#     + generator: (Optional) Method to make archive. Basically this argument
> > ++#       is passed as CPACK_GENERATOR. Default to TGZ.
> > ++#     Read following variables:
> > ++#     + PROJECT_NAME: Project name
> > ++#     + VENDOR: Organization that issue this project.
> > ++#     + PRJ_VER: Project version
> > ++#     + PRJ_SUMMARY: (Optional) Project summary
> > ++#     + SOURCE_ARCHIVE_IGNORE_FILES: A list of regex filename pattern
> > ++#       that should be excluded from source archive file.
> > ++#       (SOURCE_ARCHIVE_IGNORE_FILE_CMAKE) is already in this list.
> > ++#     Define following variables:
> > ++#     + SOURCE_ARCHIVE_CONTENTS: List of files to be packed to archive.
> > ++#     + SOURCE_ARCHIVE_FILE_EXTENSION: File extension of the source package
> > ++#       files.
> > ++#     + SOURCE_ARCHIVE_NAME: Name of source archive (without path)
> > ++#     + SOURCE_ARCHIVE_FILE: Path to source archive file
> > ++#     Target:
> > ++#     + pack_src: Pack source files like package_source.
> > ++#     + clean_pack_src: Remove all source archives.
> > ++#     + clean_old_pack_src: Remove all old source package.
> > ++#
> > ++#
> > ++IF(NOT DEFINED _MANAGE_ARCHIVE_CMAKE_)
> > ++    SET (_MANAGE_ARCHIVE_CMAKE_ "DEFINED")
> > ++    SET(SOURCE_ARCHIVE_IGNORE_FILES_DEFAULT
> > ++      "/\\\\.svn/"  "/CVS/" "/\\\\.git/"  "\\\\.gitignore$" "/\\\\.hg/"
> > ++      "/\\\\.hgignore$"
> > ++      "~$" "\\\\.swp$" "\\\\.log$" "\\\\.bak$" "\\\\.old$"
> > ++      "\\\\.gmo$" "\\\\.cache$"
> > ++      "\\\\.tar.gz$" "\\\\.tar.bz2$" "/src/config\\\\.h$" "NO_PACK")
> > ++
> > ++    SET(SOURCE_ARCHIVE_IGNORE_FILES_CMAKE "/CMakeFiles/" "_CPack_Packages/" "/Testing/"
> > ++      "\\\\.directory$" "CMakeCache\\\\.txt$"
> > ++      "/install_manifest.txt$"
> > ++      "/cmake_install\\\\.cmake$" "/cmake_uninstall\\\\.cmake$""/CPack.*\\\\.cmake$" "/CTestTestfile\\\\.cmake$"
> > ++      "Makefile$" "/${PROJECT_NAME}-${PRJ_VER}-SOURCE/"
> > ++      )
> > ++
> > ++    LIST(APPEND SOURCE_ARCHIVE_IGNORE_FILES ${SOURCE_ARCHIVE_IGNORE_FILES_DEFAULT} ${SOURCE_ARCHIVE_IGNORE_FILES_CMAKE})
> > ++
> > ++    INCLUDE(ManageVersion)
> > ++
> > ++    # Internal:  SOURCE_ARCHIVE_GET_CONTENTS()
> > ++    #   - Return all source file to be packed.
> > ++    #     This is called by SOURCE_ARCHIVE(),
> > ++    #     So no need to call it again.
> > ++    FUNCTION(SOURCE_ARCHIVE_GET_CONTENTS )
> > ++      SET(_fileList "")
> > ++      FILE(GLOB_RECURSE _ls "*")
> > ++      STRING(REPLACE "\\\\" "\\" _ignore_files "${SOURCE_ARCHIVE_IGNORE_FILES}")
> > ++      FOREACH(_file ${_ls})
> > ++          SET(_matched 0)
> > ++          FOREACH(filePattern ${_ignore_files})
> > ++              M_MSG(${M_INFO3} "_file=${_file} filePattern=${filePattern}")
> > ++              IF(_file MATCHES "${filePattern}")
> > ++                  SET(_matched 1)
> > ++                  BREAK()
> > ++              ENDIF(_file MATCHES "${filePattern}")
> > ++          ENDFOREACH(filePattern ${_ignore_files})
> > ++          IF(NOT _matched)
> > ++              FILE(RELATIVE_PATH _file ${CMAKE_SOURCE_DIR} "${_file}")
> > ++              LIST(APPEND _fileList "${_file}")
> > ++          ENDIF(NOT _matched)
> > ++      ENDFOREACH(_file ${_ls})
> > ++      SET(SOURCE_ARCHIVE_CONTENTS ${_fileList} CACHE STRING "Source archive file list" FORCE)
> > ++      M_MSG(${M_INFO2} "SOURCE_ARCHIVE_CONTENTS=${SOURCE_ARCHIVE_CONTENTS}")
> > ++    ENDFUNCTION(SOURCE_ARCHIVE_GET_CONTENTS var)
> > ++
> > ++    MACRO(PACK_SOURCE_ARCHIVE outputDir)
> > ++      IF(PRJ_VER STREQUAL "")
> > ++          M_MSG(${M_FATAL} "PRJ_VER not defined")
> > ++      ENDIF(PRJ_VER STREQUAL "")
> > ++      IF(${ARGV2})
> > ++          SET(CPACK_GENERATOR "${ARGV2}")
> > ++      ELSE(${ARGV2})
> > ++          SET(CPACK_GENERATOR "TGZ")
> > ++      ENDIF(${ARGV2})
> > ++      SET(CPACK_SOURCE_GENERATOR ${CPACK_GENERATOR})
> > ++      IF(${CPACK_GENERATOR} STREQUAL "TGZ")
> > ++          SET(SOURCE_ARCHIVE_FILE_EXTENSION "tar.gz")
> > ++      ELSEIF(${CPACK_GENERATOR} STREQUAL "TBZ2")
> > ++          SET(SOURCE_ARCHIVE_FILE_EXTENSION "tar.bz2")
> > ++      ELSEIF(${CPACK_GENERATOR} STREQUAL "ZIP")
> > ++          SET(SOURCE_ARCHIVE_FILE_EXTENSION "zip")
> > ++      ENDIF(${CPACK_GENERATOR} STREQUAL "TGZ")
> > ++
> > ++      SET(CPACK_SOURCE_IGNORE_FILES ${SOURCE_ARCHIVE_IGNORE_FILES})
> > ++      SET(CPACK_PACKAGE_VERSION ${PRJ_VER})
> > ++
> > ++      IF(EXISTS ${CMAKE_SOURCE_DIR}/COPYING)
> > ++          SET(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_SOURCE_DIR}/README)
> > ++      ENDIF(EXISTS ${CMAKE_SOURCE_DIR}/COPYING)
> > ++
> > ++      IF(EXISTS ${CMAKE_SOURCE_DIR}/README)
> > ++          SET(CPACK_PACKAGE_DESCRIPTION_FILE ${CMAKE_SOURCE_DIR}/README)
> > ++      ENDIF(EXISTS ${CMAKE_SOURCE_DIR}/README)
> > ++
> > ++      IF(DEFINED PRJ_SUMMARY)
> > ++          SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${PRJ_SUMMARY}")
> > ++      ENDIF(DEFINED PRJ_SUMMARY)
> > ++
> > ++      SET(CPACK_SOURCE_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PRJ_VER}-Source")
> > ++      SET(SOURCE_ARCHIVE_NAME "${CPACK_SOURCE_PACKAGE_FILE_NAME}.${SOURCE_ARCHIVE_FILE_EXTENSION}" CACHE STRING "Source archive name" FORCE)
> > ++      SET(SOURCE_ARCHIVE_FILE "${outputDir}/${SOURCE_ARCHIVE_NAME}" CACHE FILEPATH "Source archive file" FORCE)
> > ++
> > ++      SET(CPACK_PACKAGE_VENDOR "${VENDOR}")
> > ++      SOURCE_ARCHIVE_GET_CONTENTS()
> > ++
> > ++      SET(SOURCE_ARCHIVE_CONTENTS_ABSOLUTE "")
> > ++      FOREACH(_file ${SOURCE_ARCHIVE_CONTENTS})
> > ++          LIST(APPEND SOURCE_ARCHIVE_CONTENTS_ABSOLUTE "${CMAKE_HOME_DIRECTORY}/${_file}")
> > ++      ENDFOREACH(_file ${SOURCE_ARCHIVE_CONTENTS})
> > ++
> > ++      INCLUDE(CPack)
> > ++
> > ++      # Get relative path of outputDir
> > ++      FILE(RELATIVE_PATH _outputDir_rel ${CMAKE_BINARY_DIR} ${outputDir})
> > ++      #MESSAGE("#_outputDir_rel=${_outputDir_rel}")
> > ++
> > ++      IF("${_outputDir_rel}" STREQUAL ".")
> > ++          ADD_CUSTOM_TARGET_COMMAND(pack_src
> > ++              OUTPUT "${SOURCE_ARCHIVE_FILE}"
> > ++              COMMAND make package_source
> > ++              DEPENDS  ${SOURCE_ARCHIVE_CONTENTS}
> > ++              COMMENT "Packing the source as: ${SOURCE_ARCHIVE_FILE}"
> > ++              )
> > ++      ELSE("${_outputDir_rel}" STREQUAL ".")
> > ++          FILE(MAKE_DIRECTORY ${outputDir})
> > ++          ADD_CUSTOM_TARGET_COMMAND(pack_src
> > ++              OUTPUT "${SOURCE_ARCHIVE_FILE}"
> > ++              COMMAND make package_source
> > ++              COMMAND cmake -E copy "${SOURCE_ARCHIVE_NAME}" "${outputDir}"
> > ++              COMMAND cmake -E remove ${SOURCE_ARCHIVE_NAME}
> > ++              DEPENDS ${SOURCE_ARCHIVE_CONTENTS_ABSOLUTE}
> > ++              COMMENT "Packing the source as: ${SOURCE_ARCHIVE_FILE}"
> > ++              )
> > ++      ENDIF("${_outputDir_rel}" STREQUAL ".")
> > ++
> > ++      ADD_CUSTOM_TARGET(clean_old_pack_src
> > ++          COMMAND find .
> > ++          -name '${PROJECT_NAME}*.${SOURCE_ARCHIVE_FILE_EXTENSION}' ! -name '${PROJECT_NAME}-${PRJ_VER}-*.${SOURCE_ARCHIVE_FILE_EXTENSION}'
> > ++          -print -delete
> > ++          COMMENT "Cleaning old source archives"
> > ++          )
> > ++
> > ++      ADD_DEPENDENCIES(clean_old_pack_src changelog )
> > ++
> > ++      ADD_CUSTOM_TARGET(clean_pack_src
> > ++          COMMAND find .
> > ++          -name '${PROJECT_NAME}*.${SOURCE_ARCHIVE_FILE_EXTENSION}'
> > ++          -print -delete
> > ++          COMMENT "Cleaning all source archives"
> > ++          )
> > ++    ENDMACRO(PACK_SOURCE_ARCHIVE outputDir)
> > ++
> > ++ENDIF(NOT DEFINED _MANAGE_ARCHIVE_CMAKE_)
> > ++
> > +--- /dev/null
> > ++++ b/Modules/ManageEnvironment.cmake
> > +@@ -0,0 +1,190 @@
> > ++# - Manage build environment such as environment variables and compile flags.
> > ++# This module predefine various environment variables, cmake policies, and
> > ++# compile flags.
> > ++#
> > ++# The setting can be viewed and modified by ccmake.
> > ++#
> > ++# List of frequently used variable and compile flags:
> > ++#    + CMAKE_INSTALL_PREFIX: Compile flag whose value is ${CMAKE_INSTALL_PREFIX}.
> > ++#    + BIN_DIR: Directory for executable.
> > ++#      Default:  ${CMAKE_INSTALL_PREFIX}/bin
> > ++#    + DATA_DIR: Directory for architecture independent data files.
> > ++#      Default: ${CMAKE_INSTALL_PREFIX}/share
> > ++#    + DOC_DIR: Directory for documentation
> > ++#      Default: ${DATA_DIR}/doc
> > ++#    + SYSCONF_DIR: System wide configuration files.
> > ++#      Default: /etc
> > ++#    + LIB_DIR: System wide library path.
> > ++#      Default: ${CMAKE_INSTALL_PREFIX}/lib for 32 bit,
> > ++#               ${CMAKE_INSTALL_PREFIX}/lib64 for 64 bit.
> > ++#    + LIBEXEC_DIR: Executables that are not meant to be executed by user directly.
> > ++#      Default: ${CMAKE_INSTALL_PREFIX}/libexec
> > ++#    + PROJECT_NAME: Project name
> > ++#
> > ++# Defines following macros:
> > ++#   SET_COMPILE_ENV(var default_value [ENV_NAME env_name]
> > ++#     [CACHE type docstring [FORCE]])
> > ++#   - Ensure a variable is set to nonempty value, then add the variable and value to
> > ++#     compiling definition.
> > ++#     The value is determined by following order:
> > ++#     1. Value of var if var is defined.
> > ++#     2. Environment variable with the same name (or specified via ENV_NAME)
> > ++#     3. Parameter default_value
> > ++#     Parameters:
> > ++#     + var: Variable to be set
> > ++#     + default_value: Default value of the var
> > ++#     + env_name: (Optional)The name of environment variable.
> > ++#       Only need if different from var.
> > ++#     + CACHE type docstring [FORCE]:
> > ++#       Same with "SET" command.
> > ++#
> > ++#  SET_USUAL_COMPILE_ENVS()
> > ++#  - Set the most often used variable and compile flags.
> > ++#    It defines compile flags according to the values of corresponding variables,
> > ++#    usually under the same or similar name.
> > ++#    If a corresponding variable is not defined yet, then a default value is assigned
> > ++#    to that variable, then define the flag.
> > ++#
> > ++#    Defines following flags according to the variable with same name.
> > ++#    + CMAKE_INSTALL_PREFIX: Compile flag whose value is ${CMAKE_INSTALL_PREFIX}.
> > ++#    + BIN_DIR: Directory for executable.
> > ++#      Default:  ${CMAKE_INSTALL_PREFIX}/bin
> > ++#    + DATA_DIR: Directory for architecture independent data files.
> > ++#      Default: ${CMAKE_INSTALL_PREFIX}/share
> > ++#    + DOC_DIR: Directory for documentation
> > ++#      Default: ${DATA_DIR}/doc
> > ++#    + SYSCONF_DIR: System wide configuration files.
> > ++#      Default: /etc
> > ++#    + LIB_DIR: System wide library path.
> > ++#      Default: ${CMAKE_INSTALL_PREFIX}/lib for 32 bit,
> > ++#               ${CMAKE_INSTALL_PREFIX}/lib64 for 64 bit.
> > ++#    + LIBEXEC_DIR: Executables that are not meant to be executed by user directly.
> > ++#      Default: ${CMAKE_INSTALL_PREFIX}/libexec
> > ++#    + PROJECT_NAME: Project name
> > ++#    + PRJ_VER: Project version
> > ++#    + PRJ_DATA_DIR: Data directory for the project.
> > ++#      Default: ${DATA_DIR}/${PROJECT_NAME}
> > ++#    + PRJ_DOC_DIR: DocuFILEPATH = File chooser dialog.
> > ++#      Default: ${DOC_DIR}/${PROJECT_NAME}-${PRJ_VER}
> > ++
> > ++IF(NOT DEFINED _MANAGE_ENVIRONMENT_CMAKE_)
> > ++    SET(_MANAGE_ENVIRONMENT_CMAKE_ "DEFINED")
> > ++    SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON)
> > ++    CMAKE_POLICY(VERSION 2.6.2)
> > ++
> > ++    MACRO(SET_COMPILE_ENV var default_value)
> > ++      SET(_stage "")
> > ++      SET(_env "${var}")
> > ++      SET(_setOpts "")
> > ++      SET(_force 0)
> > ++      FOREACH(_arg ${ARGN})
> > ++          IF(_arg STREQUAL "ENV_NAME")
> > ++              SET(_stage "ENV_NAME")
> > ++          ELSEIF(_arg STREQUAL "CACHE")
> > ++              SET(_stage "_CACHE")
> > ++          ELSE(_arg STREQUAL "ENV_NAME")
> > ++              IF(_stage STREQUAL "ENV_NAME")
> > ++                  SET(_env "${_arg}")
> > ++              ELSEIF(_stage STREQUAL "_CACHE")
> > ++                  LIST(APPEND _setOpts "${_arg}")
> > ++                  IF(_arg STREQUAL "FORCE")
> > ++                      SET(_force 1)
> > ++                  ENDIF(_arg STREQUAL "FORCE")
> > ++              ENDIF(_stage STREQUAL "ENV_NAME")
> > ++          ENDIF(_arg STREQUAL "ENV_NAME")
> > ++      ENDFOREACH(_arg ${ARGN})
> > ++
> > ++      IF(NOT "${_setOpts}" STREQUAL "")
> > ++          LIST(INSERT _setOpts 0 "CACHE")
> > ++      ENDIF(NOT "${_setOpts}" STREQUAL "")
> > ++
> > ++      # Set the variable
> > ++      IF(_force)
> > ++          IF(NOT "$ENV{${_env}}" STREQUAL "")
> > ++              SET(${var} "$ENV{${_env}}" ${_setOpts})
> > ++          ELSE(NOT "$ENV{${_env}}" STREQUAL "")
> > ++              SET(${var} "${default_value}" ${_setOpts})
> > ++          ENDIF(NOT "$ENV{${_env}}" STREQUAL "")
> > ++      ELSE(_force)
> > ++          IF(NOT "${${var}}" STREQUAL "")
> > ++              SET(${var} "${${var}}" ${_setOpts})
> > ++          ELSEIF(NOT "$ENV{${_env}}" STREQUAL "")
> > ++              SET(${var} "$ENV{${_env}}" ${_setOpts})
> > ++          ELSE(NOT "${${var}}" STREQUAL "")
> > ++              # Default value
> > ++              SET(${var} "${default_value}" ${_setOpts})
> > ++          ENDIF(NOT "${${var}}" STREQUAL "")
> > ++      ENDIF(_force)
> > ++
> > ++      # Enforce CMP0005 to new, yet pop after ADD_DEFINITION
> > ++      CMAKE_POLICY(PUSH)
> > ++      CMAKE_POLICY(SET CMP0005 NEW)
> > ++      ADD_DEFINITIONS(-D${_env}=${${var}})
> > ++      CMAKE_POLICY(POP)
> > ++      M_MSG(${M_INFO2} "SET(${var} ${${var}})")
> > ++    ENDMACRO(SET_COMPILE_ENV var default_value)
> > ++
> > ++    MACRO(MANAGE_CMAKE_POLICY policyName defaultValue)
> > ++      IF(POLICY ${policyName})
> > ++          CMAKE_POLICY(GET "${policyName}" _cmake_policy_value)
> > ++          IF(_cmake_policy_value STREQUAL "")
> > ++              # Policy not defined yet
> > ++              CMAKE_POLICY(SET "${policyName}" "${defaultValue}")
> > ++          ENDIF(_cmake_policy_value STREQUAL "")
> > ++      ENDIF(POLICY ${policyName})
> > ++    ENDMACRO(MANAGE_CMAKE_POLICY policyName defaultValue)
> > ++
> > ++    ####################################################################
> > ++    # Recommended policy setting
> > ++    #
> > ++    # CMP0005: Preprocessor definition values are now escaped automatically.
> > ++    # OLD:Preprocessor definition values are not escaped.
> > ++    MANAGE_CMAKE_POLICY(CMP0005 NEW)
> > ++
> > ++    # CMP0009: FILE GLOB_RECURSE calls should not follow symlinks by default.
> > ++    # OLD: FILE GLOB_RECURSE calls follow symlinks
> > ++    MANAGE_CMAKE_POLICY(CMP0009 NEW)
> > ++
> > ++    # CMP0017: Prefer files from the CMake module directory when including from there.
> > ++    # OLD: Prefer files from CMAKE_MODULE_PATH regardless
> > ++    MANAGE_CMAKE_POLICY(CMP0017 NEW)
> > ++
> > ++    # Include should be put after the cmake policy
> > ++    INCLUDE(ManageMessage)
> > ++    M_MSG(${M_INFO1} "CMAKE_HOST_SYSTEM=${CMAKE_HOST_SYSTEM}")
> > ++    M_MSG(${M_INFO1} "CMAKE_SYSTEM=${CMAKE_SYSTEM}")
> > ++
> > ++    ####################################################################
> > ++    # CMake Variables
> > ++    #
> > ++    SET_COMPILE_ENV(BIN_DIR  "${CMAKE_INSTALL_PREFIX}/bin"
> > ++      CACHE PATH "Binary dir")
> > ++    SET_COMPILE_ENV(DATA_DIR "${CMAKE_INSTALL_PREFIX}/share"
> > ++      CACHE PATH "Data dir")
> > ++    SET_COMPILE_ENV(DOC_DIR  "${DATA_DIR}/doc"
> > ++      CACHE PATH "Documentation dir")
> > ++    SET_COMPILE_ENV(SYSCONF_DIR "/etc"
> > ++      CACHE PATH "System configuration dir")
> > ++    SET_COMPILE_ENV(LIBEXEC_DIR "${CMAKE_INSTALL_PREFIX}/libexec"
> > ++      CACHE PATH "LIBEXEC dir")
> > ++
> > ++    IF(CMAKE_SYSTEM_PROCESSOR MATCHES "64")
> > ++      SET_COMPILE_ENV(IS_64 "64" CACHE STRING "IS_64")
> > ++    ENDIF(CMAKE_SYSTEM_PROCESSOR MATCHES "64")
> > ++
> > ++    SET_COMPILE_ENV(LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib${IS_64}"
> > ++      CACHE PATH "Library dir")
> > ++
> > ++    SET_COMPILE_ENV(PROJECT_NAME "${PROJECT_NAME}")
> > ++    SET_COMPILE_ENV(PRJ_DATA_DIR "${DATA_DIR}/${PROJECT_NAME}")
> > ++
> > ++    # Directory to store cmake-fedora specific temporary files.
> > ++    IF(NOT CMAKE_FEDORA_TMP_DIR)
> > ++      SET(CMAKE_FEDORA_TMP_DIR "${CMAKE_BINARY_DIR}/NO_PACK")
> > ++    ENDIF(NOT CMAKE_FEDORA_TMP_DIR)
> > ++
> > ++    ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_FEDORA_TMP_DIR}
> > ++      COMMAND cmake -E make_directory ${CMAKE_FEDORA_TMP_DIR}
> > ++      COMMENT "Create CMAKE_FEDORA_TMP_DIR"
> > ++      )
> > ++ENDIF(NOT DEFINED _MANAGE_ENVIRONMENT_CMAKE_)
> > +--- /dev/null
> > ++++ b/Modules/ManageGConf.cmake
> > +@@ -0,0 +1,67 @@
> > ++# - GConf relative targets such as install/unstall schemas.
> > ++# This module finds gconftool-2 or gconftool for GConf manipulation.
> > ++#
> > ++# Reads following variables:
> > ++# GCONF_SCHEMAS_FILE: Schema file.
> > ++#         Default: "${PROJECT_NAME}.schemas"
> > ++#
> > ++# GCONF_SCHEMAS_INSTALLED_DIR: Direct of installed schemas files.
> > ++#         Default: "${SYSCONF_INSTALL_DIR}/gconf/schemas"
> > ++#
> > ++# GCONF_CONFIG_SOURCE: configuration source.
> > ++#         Default: "" (Use the system default)
> > ++#
> > ++# Defines following targets:
> > ++#   install_schemas: install schemas
> > ++#
> > ++#   uninstall_schemas: uninstall schemas
> > ++#
> > ++
> > ++IF(NOT DEFINED _MANAGE_GCONF_CMAKE_)
> > ++    FIND_PROGRAM(GCONFTOOL_CMD NAMES gconftool-2 gconftool)
> > ++
> > ++    IF(${GCONFTOOL_CMD} STREQUAL "GCONFTOOL_CMD-NOTFOUND")
> > ++      MESSAGE(FATAL_ERROR "gconftool and gconftool-2 are not found, please install GConf or GConf2.")
> > ++    ENDIF()
> > ++
> > ++    IF (NOT DEFINED GCONF_SCHEMAS_FILE)
> > ++      SET(GCONF_SCHEMAS_FILE  "${PROJECT_NAME}.schemas")
> > ++    ENDIF(NOT DEFINED GCONF_SCHEMAS_FILE)
> > ++
> > ++    GET_FILENAME_COMPONENT(_gconf_schemas_basename ${GCONF_SCHEMAS_FILE} NAME)
> > ++
> > ++    IF (NOT DEFINED GCONF_SCHEMAS_INSTALLED_DIR)
> > ++      IF(SYSCONF_INSTALL_DIR)
> > ++          SET(GCONF_SCHEMAS_INSTALLED_DIR  "${SYSCONF_INSTALL_DIR}/gconf/schemas")
> > ++      ELSE(SYSCONF_INSTALL_DIR)
> > ++          SET(GCONF_SCHEMAS_INSTALLED_DIR  "${SYSCONF_DIR}/gconf/schemas")
> > ++      ENDIF(SYSCONF_INSTALL_DIR)
> > ++    ENDIF(NOT DEFINED GCONF_SCHEMAS_INSTALLED_DIR)
> > ++
> > ++    IF (NOT DEFINED GCONF_CONFIG_SOURCE)
> > ++      SET(GCONF_CONFIG_SOURCE "")
> > ++    ENDIF(NOT DEFINED GCONF_CONFIG_SOURCE)
> > ++    SET(ENV{GCONF_CONFIG_SOURCE} ${GCONF_CONFIG_SOURCE})
> > ++
> > ++
> > ++    ADD_CUSTOM_TARGET(uninstall_schemas
> > ++      COMMAND GCONF_CONFIG_SOURCE=${GCONF_CONFIG_SOURCE}
> > ++      ${GCONFTOOL_CMD} --makefile-uninstall-rule
> > ++      ${GCONF_SCHEMAS_INSTALLED_DIR}/${_gconf_schemas_basename}
> > ++      COMMENT "Uninstalling schemas"
> > ++      )
> > ++
> > ++    ADD_CUSTOM_TARGET(install_schemas
> > ++      COMMAND cmake -E copy ${GCONF_SCHEMAS_FILE} ${GCONF_SCHEMAS_INSTALLED_DIR}/${_gconf_schemas_basename}
> > ++      COMMAND GCONF_CONFIG_SOURCE=${GCONF_CONFIG_SOURCE}
> > ++      ${GCONFTOOL_CMD} --makefile-install-rule
> > ++      ${GCONF_SCHEMAS_INSTALLED_DIR}/${_gconf_schemas_basename}
> > ++      DEPENDS ${GCONF_SCHEMAS_FILE}
> > ++      COMMENT "Installing schemas"
> > ++      )
> > ++
> > ++    INSTALL(FILES ${GCONF_SCHEMAS_FILE}
> > ++      DESTINATION "${GCONF_SCHEMAS_INSTALLED_DIR}")
> > ++ENDIF(NOT DEFINED _MANAGE_GCONF_CMAKE_)
> > ++
> > ++
> > +--- /dev/null
> > ++++ b/Modules/ManageInstall.cmake
> > +@@ -0,0 +1,25 @@
> > ++# - Manage installation
> > ++# Convenient collection of macros and functions to manage installation.
> > ++#
> > ++# Defines following macros:
> > ++#   MANAGE_INSTALL(var file1 [file2 ....])
> > ++#   - Managed install. Files are installed to the path specified by var.
> > ++#     This macro also sets 'MANAGE_INSTALL_$var' as files that associate to this var
> > ++#     The files that are associated to this var is
> > ++#     Read and define:
> > ++#     + MANAGE_INSTALL_$var : Files to be installed under var.
> > ++#     Arguments:
> > ++#     + var: A variable that contains install destination path
> > ++#     + file1 ... : File to be installed to $var
> > ++#
> > ++
> > ++IF(NOT DEFINED _MANAGE_INSTALL_CMAKE_)
> > ++    SET (_MANAGE_INSTALL_CMAKE_ "DEFINED")
> > ++    SET(MANAGE_INSTALL_FILES "")
> > ++
> > ++    MACRO(MANAGE_INSTALL var file1)
> > ++      LIST(APPEND MANAGE_INSTALL_${var} ${file1} ${ARGN})
> > ++      INSTALL(FILES $file1 ${ARGN}
> > ++          DESTINATION "${var}")
> > ++    ENDMACRO(MANAGE_INSTALL var file1)
> > ++ENDIF(NOT DEFINED _MANAGE_INSTALL_CMAKE_)
> > +--- /dev/null
> > ++++ b/Modules/ManageMessage.cmake
> > +@@ -0,0 +1,60 @@
> > ++# - Manage the output and debug messages.
> > ++# This module has macros that control how many messages to be shown
> > ++# by defining the desire message level.
> > ++#
> > ++# Defined variables that represent verbose levels:
> > ++#   1: M_FATAL - Critical error,Should stop immediately
> > ++#   2: M_ERROR - Error that will Eventually fail
> > ++#   3: M_WARN  - General Warning.
> > ++#   4: M_OFF   - Optional functionalities are turned-off because requirement is not met.
> > ++#   5: M_INFO1 - Info/debug message
> > ++#   6: M_INFO2 - Info/debug message
> > ++#   7: M_INFO3 - Info/debug message
> > ++#
> > ++# Read following variable:
> > ++#   + MANAGE_MESSAGE_LEVEL: Message level in integer.
> > ++#     Messages with greater level will be suppressed.
> > ++#     Default is ${M_OFF}
> > ++#   + MANAGE_MESSAGE_LABELS: Labels that printed in front of the message for
> > ++#     corresponding message level.
> > ++#     Default is "[Fatal] ;[Error] ;[Warn] ;[Off] ;[Info1] ;[Info2] ;[Info3] ")
> > ++#
> > ++# Define following macros:
> > ++#   M_MSG(level msg)
> > ++#   - Surpress the message if level is higher than MANAGE_MESSAGE_LEVEL
> > ++#     Otherwise show the message.
> > ++#     Arguments:
> > ++#     + level: level of the message.
> > ++#     + msg: Message to show.
> > ++#
> > ++
> > ++
> > ++IF(NOT DEFINED _MANAGE_MESSAGE_CMAKE_)
> > ++    SET(_MANAGE_MESSAGE_CMAKE_ "DEFINED")
> > ++    SET(M_FATAL 1)
> > ++    SET(M_ERROR 2)
> > ++    SET(M_WARN 3)
> > ++    SET(M_OFF  4)
> > ++    SET(M_INFO1 5)
> > ++    SET(M_INFO2 6)
> > ++    SET(M_INFO3 7)
> > ++    IF(NOT DEFINED MANAGE_MESSAGE_LABELS)
> > ++      SET(MANAGE_MESSAGE_LABELS
> > ++          "[Fatal] ;[Error] ;[Warn] ;[Off] ;[Info1] ;[Info2] ;[Info3] ")
> > ++    ENDIF(NOT DEFINED MANAGE_MESSAGE_LABELS)
> > ++
> > ++    SET(MANAGE_MESSAGE_LEVEL ${M_OFF} CACHE STRING "Message (Verbose) Level")
> > ++
> > ++    MACRO(M_MSG level msg)
> > ++      IF(NOT ${level} GREATER ${MANAGE_MESSAGE_LEVEL})
> > ++          MATH(EXPR _lvl ${level}-1)
> > ++          LIST(GET MANAGE_MESSAGE_LABELS ${_lvl} _label)
> > ++          IF(${level} EQUAL 1)
> > ++              MESSAGE(FATAL_ERROR "${_label}${msg}")
> > ++          ELSE(${level} EQUAL 1)
> > ++              MESSAGE("${_label}${msg}")
> > ++          ENDIF(${level} EQUAL 1)
> > ++      ENDIF(NOT ${level} GREATER ${MANAGE_MESSAGE_LEVEL})
> > ++    ENDMACRO(M_MSG level msg)
> > ++ENDIF(NOT DEFINED _MANAGE_MESSAGE_CMAKE_)
> > ++
> > +--- /dev/null
> > ++++ b/Modules/ManageRPM.cmake
> > +@@ -0,0 +1,327 @@
> > ++# - RPM generation, maintaining (remove old rpm) and verification (rpmlint).
> > ++# This module provides macros that provides various rpm building and
> > ++# verification targets.
> > ++#
> > ++# This module needs variable from ManageArchive, so INCLUDE(ManageArchive)
> > ++# before this module.
> > ++#
> > ++# Includes:
> > ++#   ManageMessage
> > ++#   ManageTarget
> > ++#
> > ++# Reads and defines following variables if dependencies are satisfied:
> > ++#   PRJ_RPM_SPEC_IN_FILE: spec.in that generate spec
> > ++#   PRJ_RPM_SPEC_FILE: spec file for rpmbuild.
> > ++#   RPM_DIST_TAG: (optional) Current distribution tag such as el5, fc10.
> > ++#     Default: Distribution tag from rpm --showrc
> > ++#
> > ++#   RPM_BUILD_TOPDIR: (optional) Directory of  the rpm topdir.
> > ++#     Default: ${CMAKE_BINARY_DIR}
> > ++#
> > ++#   RPM_BUILD_SPECS: (optional) Directory of generated spec files
> > ++#     and RPM-ChangeLog.
> > ++#     Note this variable is not for locating
> > ++#     SPEC template (project.spec.in), RPM-ChangeLog source files.
> > ++#     These are located through the path of spec_in.
> > ++#     Default: ${RPM_BUILD_TOPDIR}/SPECS
> > ++#
> > ++#   RPM_BUILD_SOURCES: (optional) Directory of source (tar.gz or zip) files.
> > ++#     Default: ${RPM_BUILD_TOPDIR}/SOURCES
> > ++#
> > ++#   RPM_BUILD_SRPMS: (optional) Directory of source rpm files.
> > ++#     Default: ${RPM_BUILD_TOPDIR}/SRPMS
> > ++#
> > ++#   RPM_BUILD_RPMS: (optional) Directory of generated rpm files.
> > ++#     Default: ${RPM_BUILD_TOPDIR}/RPMS
> > ++#
> > ++#   RPM_BUILD_BUILD: (optional) Directory for RPM build.
> > ++#     Default: ${RPM_BUILD_TOPDIR}/BUILD
> > ++#
> > ++#   RPM_BUILD_BUILDROOT: (optional) Directory for RPM build.
> > ++#     Default: ${RPM_BUILD_TOPDIR}/BUILDROOT
> > ++#
> > ++# Defines following variables:
> > ++#   RPM_IGNORE_FILES: A list of exclude file patterns for PackSource.
> > ++#     This value is appended to SOURCE_ARCHIVE_IGNORE_FILES after including
> > ++#     this module.
> > ++#
> > ++# Defines following Macros:
> > ++#   PACK_RPM()
> > ++#   - Generate spec and pack rpm  according to the spec file.
> > ++#     Arguments:
> > ++#     Targets:
> > ++#     + srpm: Build srpm (rpmbuild -bs).
> > ++#     + rpm: Build rpm and srpm (rpmbuild -bb)
> > ++#     + rpmlint: Run rpmlint to generated rpms.
> > ++#     + clean_rpm": Clean all rpm and build files.
> > ++#     + clean_pkg": Clean all source packages, rpm and build files.
> > ++#     + clean_old_rpm: Remove old rpm and build files.
> > ++#     + clean_old_pkg: Remove old source packages and rpms.
> > ++#     This macro defines following variables:
> > ++#     + PRJ_RELEASE: Project release with distribution tags. (e.g. 1.fc13)
> > ++#     + PRJ_RELEASE_NO: Project release number, without distribution tags. (e.g. 1)
> > ++#     + PRJ_SRPM_FILE: Path to generated SRPM file, including relative path.
> > ++#     + PRJ_RPM_BUILD_ARCH: Architecture to be build.
> > ++#     + PRJ_RPM_FILES: Binary RPM files to be build.
> > ++#
> > ++#   RPM_MOCK_BUILD()
> > ++#   - Add mock related targets.
> > ++#     Targets:
> > ++#     + rpm_mock_i386: Make i386 rpm
> > ++#     + rpm_mock_x86_64: Make x86_64 rpm
> > ++#     This macor reads following variables?:
> > ++#     + MOCK_RPM_DIST_TAG: Prefix of mock configure file, such as "fedora-11", "fedora-rawhide", "epel-5".
> > ++#         Default: Convert from RPM_DIST_TAG
> > ++#
> > ++
> > ++IF(NOT DEFINED _MANAGE_RPM_CMAKE_)
> > ++    SET (_MANAGE_RPM_CMAKE_ "DEFINED")
> > ++
> > ++    INCLUDE(ManageMessage)
> > ++    INCLUDE(ManageTarget)
> > ++    SET(_manage_rpm_dependency_missing 0)
> > ++
> > ++    FIND_PROGRAM(RPMBUILD_CMD NAMES "rpmbuild-md5")
> > ++    IF("${RPMBUILD_CMD}" STREQUAL "RPMBUILD_CMD-NOTFOUND")
> > ++      M_MSG(${M_OFF} "rpmbuild is not found in PATH, rpm build support is disabled.")
> > ++      SET(_manage_rpm_dependency_missing 1)
> > ++    ENDIF("${RPMBUILD_CMD}" STREQUAL "RPMBUILD_CMD-NOTFOUND")
> > ++
> > ++    SET(_PRJ_RPM_SPEC_IN_FILE_SEARCH_NAMES  "${PROJECT_NAME}.spec.in" "project.spec.in")
> > ++    SET(_PRJ_RPM_SPEC_IN_FILE_SEARCH_PATH "${CMAKE_SOURCE_DIR}/SPECS" "SPECS" "." "${RPM_BUILD_TOPDIR}/SPECS")
> > ++    FIND_FILE(PRJ_RPM_SPEC_IN_FILE NAMES ${_PRJ_RPM_SPEC_IN_FILE_SEARCH_NAMES} PATHS ${_PRJ_RPM_SPEC_IN_FILE_SEARCH_PATH})
> > ++    IF(PRJ_RPM_SPEC_IN_FILE STREQUAL "PRJ_RPM_SPEC_IN_FILE-NOTFOUND")
> > ++      M_MSG(${M_OFF} "Cannot find ${PROJECT}.spec.in or project .in"
> > ++          "${_PRJ_RPM_SPEC_IN_FILE_SEARCH_PATH}")
> > ++      M_MSG(${M_OFF} "rpm build support is disabled.")
> > ++      SET(_manage_rpm_dependency_missing 1)
> > ++    ENDIF(PRJ_RPM_SPEC_IN_FILE STREQUAL "PRJ_RPM_SPEC_IN_FILE-NOTFOUND")
> > ++
> > ++    IF(NOT _manage_rpm_dependency_missing)
> > ++      INCLUDE(ManageVariable)
> > ++      SET (SPEC_FILE_WARNING "This file is generated, please modified the .spec.in file instead!")
> > ++
> > ++      EXECUTE_PROCESS(COMMAND rpm --showrc
> > ++          COMMAND grep -E "dist[[:space:]]*\\."
> > ++          COMMAND sed -e "s/^.*dist\\s*\\.//"
> > ++          COMMAND tr \\n \\t
> > ++          COMMAND sed  -e s/\\t//
> > ++          OUTPUT_VARIABLE _RPM_DIST_TAG)
> > ++
> > ++      SET(RPM_DIST_TAG "${_RPM_DIST_TAG}" CACHE STRING "RPM Dist Tag")
> > ++      SET(RPM_BUILD_TOPDIR "${CMAKE_BINARY_DIR}" CACHE PATH "RPM topdir")
> > ++      SET(RPM_BUILD_SPECS "${RPM_BUILD_TOPDIR}/SPECS" CACHE PATH "RPM SPECS dir")
> > ++      SET(RPM_BUILD_SOURCES "${RPM_BUILD_TOPDIR}/SOURCES" CACHE PATH "RPM SOURCES dir")
> > ++      SET(RPM_BUILD_SRPMS "${RPM_BUILD_TOPDIR}/SRPMS" CACHE PATH "RPM SRPMS dir")
> > ++      SET(RPM_BUILD_RPMS "${RPM_BUILD_TOPDIR}/RPMS" CACHE PATH "RPM RPMS dir")
> > ++      SET(RPM_BUILD_BUILD "${RPM_BUILD_TOPDIR}/BUILD" CACHE PATH "RPM BUILD dir")
> > ++      SET(RPM_BUILD_BUILDROOT "${RPM_BUILD_TOPDIR}/BUILDROOT" CACHE PATH "RPM BUILDROOT dir")
> > ++
> > ++      ## RPM spec.in and RPM-ChangeLog.prev
> > ++      SET(PRJ_RPM_SPEC_FILE "${RPM_BUILD_SPECS}/${PROJECT_NAME}.spec" CACHE FILEPATH "spec")
> > ++      SET(PRJ_RPM_SPEC_IN_FILE "${_PRJ_RPM_SPEC_IN_FILE}" CACHE FILEPATH "spec.in")
> > ++      GET_FILENAME_COMPONENT(_PRJ_RPM_SPEC_IN_DIR "${PRJ_RPM_SPEC_IN_FILE}" PATH)
> > ++      SET(PRJ_RPM_SPEC_IN_DIR "${_PRJ_RPM_SPEC_IN_DIR}" CACHE INTERNAL "Dir contains spec.in")
> > ++      SET(RPM_CHANGELOG_PREV_FILE "${PRJ_RPM_SPEC_IN_DIR}/RPM-ChangeLog.prev" CACHE FILEPATH "ChangeLog.prev for RPM")
> > ++      SET(RPM_CHANGELOG_FILE "${RPM_BUILD_SPECS}/RPM-ChangeLog" CACHE FILEPATH "ChangeLog for RPM")
> > ++
> > ++      # Add RPM build directories in ignore file list.
> > ++      GET_FILENAME_COMPONENT(_rpm_build_sources_basename ${RPM_BUILD_SOURCES} NAME)
> > ++      GET_FILENAME_COMPONENT(_rpm_build_srpms_basename ${RPM_BUILD_SRPMS} NAME)
> > ++      GET_FILENAME_COMPONENT(_rpm_build_rpms_basename ${RPM_BUILD_RPMS} NAME)
> > ++      GET_FILENAME_COMPONENT(_rpm_build_build_basename ${RPM_BUILD_BUILD} NAME)
> > ++      GET_FILENAME_COMPONENT(_rpm_build_buildroot_basename ${RPM_BUILD_BUILDROOT} NAME)
> > ++      SET(RPM_IGNORE_FILES
> > ++          "/${_rpm_build_sources_basename}/" "/${_rpm_build_srpms_basename}/" "/${_rpm_build_rpms_basename}/"
> > ++          "/${_rpm_build_build_basename}/" "/${_rpm_build_buildroot_basename}/" "debug.*s.list")
> > ++      LIST(APPEND SOURCE_ARCHIVE_IGNORE_FILES ${RPM_IGNORE_FILES})
> > ++
> > ++    ENDIF(NOT _manage_rpm_dependency_missing)
> > ++
> > ++    FUNCTION(PRJ_RPM_SPEC_IN_READ_FILE)
> > ++      SETTING_FILE_GET_VARIABLE(_releaseStr Release "${PRJ_RPM_SPEC_IN_FILE}" ":")
> > ++      STRING(REPLACE "%{?dist}" ".${RPM_DIST_TAG}" _PRJ_RELEASE ${_releaseStr})
> > ++      STRING(REPLACE "%{?dist}" "" _PRJ_RELEASE_NO ${_releaseStr})
> > ++      #MESSAGE("_releaseTag=${_releaseTag} _releaseStr=${_releaseStr}")
> > ++
> > ++      SET(PRJ_RELEASE ${_PRJ_RELEASE} CACHE STRING "Release with dist" FORCE)
> > ++      SET(PRJ_RELEASE_NO ${_PRJ_RELEASE_NO} CACHE STRING "Release w/o dist" FORCE)
> > ++      SET(PRJ_SRPM "${PROJECT_NAME}-${PRJ_VER}-${PRJ_RELEASE}.src.rpm" CACHE STRING "PRJ SRPM" FORCE)
> > ++      SET(PRJ_SRPM_FILE "${RPM_BUILD_SRPMS}/${PRJ_SRPM}" CACHE FILEPATH "PRJ SRPM File" FORCE)
> > ++
> > ++      ## GET BuildArch
> > ++      SETTING_FILE_GET_VARIABLE(_archStr BuildArch "${PRJ_RPM_SPEC_IN_FILE}" ":")
> > ++      IF(NOT _archStr STREQUAL "noarch")
> > ++          SET(_archStr ${CMAKE_HOST_SYSTEM_PROCESSOR})
> > ++      ENDIF(NOT _archStr STREQUAL "noarch")
> > ++      SET(PRJ_RPM_BUILD_ARCH "${_archStr}" CACHE STRING "BuildArch")
> > ++
> > ++      ## Main rpm
> > ++      SET(PRJ_RPM_FILES "${RPM_BUILD_RPMS}/${PRJ_RPM_BUILD_ARCH}/${PROJECT_NAME}-${PRJ_VER}-${PRJ_RELEASE}.${PRJ_RPM_BUILD_ARCH}.rpm"
> > ++          CACHE STRING "RPM files" FORCE)
> > ++
> > ++      ## Obtains sub packages
> > ++      ## [TODO]
> > ++    ENDFUNCTION(PRJ_RPM_SPEC_IN_READ_FILE)
> > ++
> > ++    MACRO(RPM_CHANGELOG_WRITE_FILE)
> > ++      INCLUDE(DateTimeFormat)
> > ++
> > ++      FILE(WRITE ${RPM_CHANGELOG_FILE} "* ${TODAY_CHANGELOG} ${MAINTAINER} - ${PRJ_VER}-${PRJ_RELEASE_NO}\n")
> > ++      FILE(READ "${CMAKE_FEDORA_TMP_DIR}/ChangeLog.this" CHANGELOG_ITEMS)
> > ++
> > ++      FILE(APPEND ${RPM_CHANGELOG_FILE} "${CHANGELOG_ITEMS}\n\n")
> > ++
> > ++      # Update RPM_ChangeLog
> > ++      # Use this instead of FILE(READ is to avoid error when reading '\'
> > ++      # character.
> > ++      EXECUTE_PROCESS(COMMAND cat "${RPM_CHANGELOG_PREV_FILE}"
> > ++          OUTPUT_VARIABLE RPM_CHANGELOG_PREV
> > ++          OUTPUT_STRIP_TRAILING_WHITESPACE)
> > ++
> > ++      FILE(APPEND ${RPM_CHANGELOG_FILE} "${RPM_CHANGELOG_PREV}")
> > ++
> > ++      ADD_CUSTOM_COMMAND(OUTPUT ${RPM_CHANGELOG_FILE}
> > ++          COMMAND ${CMAKE_COMMAND} ${CMAKE_SOURCE_DIR}
> > ++          DEPENDS ${CHANGELOG_FILE} ${RPM_CHANGELOG_PREV_FILE}
> > ++          COMMENT "Write ${RPM_CHANGELOG_FILE}"
> > ++          VERBATIM
> > ++          )
> > ++
> > ++      ADD_CUSTOM_TARGET(rpm_changelog_prev_update
> > ++          COMMAND ${CMAKE_COMMAND} -E copy ${RPM_CHANGELOG_FILE} ${RPM_CHANGELOG_PREV_FILE}
> > ++          DEPENDS ${RPM_CHANGELOG_FILE}
> > ++          COMMENT "${RPM_CHANGELOG_FILE} are saving as ${RPM_CHANGELOG_PREV_FILE}"
> > ++          )
> > ++
> > ++      IF(TARGET after_release_commit_pre)
> > ++          ADD_DEPENDENCIES(after_release_commit_pre rpm_changelog_prev_update)
> > ++      ENDIF(TARGET after_release_commit_pre)
> > ++    ENDMACRO(RPM_CHANGELOG_WRITE_FILE)
> > ++
> > ++    MACRO(PACK_RPM)
> > ++      IF(NOT _manage_rpm_dependency_missing )
> > ++          PRJ_RPM_SPEC_IN_READ_FILE()
> > ++          RPM_CHANGELOG_WRITE_FILE()
> > ++
> > ++          # Generate spec
> > ++          CONFIGURE_FILE(${PRJ_RPM_SPEC_IN_FILE} ${PRJ_RPM_SPEC_FILE})
> > ++
> > ++          #-------------------------------------------------------------------
> > ++          # RPM build commands and targets
> > ++
> > ++          FILE(MAKE_DIRECTORY  ${RPM_BUILD_BUILD})
> > ++
> > ++          # Don't worry about SRPMS, RPMS and BUILDROOT, it will be created by rpmbuild
> > ++
> > ++          ADD_CUSTOM_TARGET_COMMAND(srpm
> > ++              OUTPUT ${PRJ_SRPM_FILE}
> > ++              COMMAND ${RPMBUILD_CMD} -bs ${PRJ_RPM_SPEC_FILE}
> > ++              --define '_sourcedir ${RPM_BUILD_SOURCES}'
> > ++              --define '_builddir ${RPM_BUILD_BUILD}'
> > ++              --define '_srcrpmdir ${RPM_BUILD_SRPMS}'
> > ++              --define '_rpmdir ${RPM_BUILD_RPMS}'
> > ++              --define '_specdir ${RPM_BUILD_SPECS}'
> > ++              DEPENDS ${PRJ_RPM_SPEC_FILE} ${SOURCE_ARCHIVE_FILE}
> > ++              COMMENT "Building srpm"
> > ++              )
> > ++
> > ++          # RPMs (except SRPM)
> > ++
> > ++          ADD_CUSTOM_TARGET_COMMAND(rpm
> > ++              OUTPUT ${PRJ_RPM_FILES}
> > ++              COMMAND ${RPMBUILD_CMD} -ba  ${PRJ_RPM_SPEC_FILE}
> > ++              --define '_sourcedir ${RPM_BUILD_SOURCES}'
> > ++              --define '_builddir ${RPM_BUILD_BUILD}'
> > ++              --define '_buildrootdir ${RPM_BUILD_BUILDROOT}'
> > ++              --define '_srcrpmdir ${RPM_BUILD_SRPMS}'
> > ++              --define '_rpmdir ${RPM_BUILD_RPMS}'
> > ++              --define '_specdir ${RPM_BUILD_SPECS}'
> > ++              DEPENDS ${PRJ_RPM_SPEC_FILE} ${PRJ_SRPM_FILE}
> > ++              COMMENT "Building rpm"
> > ++              )
> > ++
> > ++
> > ++          ADD_CUSTOM_TARGET(install_rpms
> > ++              COMMAND find ${RPM_BUILD_RPMS}/${PRJ_RPM_BUILD_ARCH}
> > ++              -name '${PROJECT_NAME}*-${PRJ_VER}-${PRJ_RELEASE_NO}.*.${PRJ_RPM_BUILD_ARCH}.rpm' !
> > ++              -name '${PROJECT_NAME}-debuginfo-${PRJ_RELEASE_NO}.*.${PRJ_RPM_BUILD_ARCH}.rpm'
> > ++              -print -exec sudo rpm --upgrade --hash --verbose '{}' '\\;'
> > ++              DEPENDS ${PRJ_RPM_FILES}
> > ++              COMMENT "Install all rpms except debuginfo"
> > ++              )
> > ++
> > ++          ADD_CUSTOM_TARGET(rpmlint
> > ++              COMMAND find .
> > ++              -name '${PROJECT_NAME}*-${PRJ_VER}-${PRJ_RELEASE_NO}.*.rpm'
> > ++              -print -exec rpmlint '{}' '\\;'
> > ++              DEPENDS ${PRJ_SRPM_FILE} ${PRJ_RPM_FILES}
> > ++              )
> > ++
> > ++          ADD_CUSTOM_TARGET(clean_old_rpm
> > ++              COMMAND find .
> > ++              -name '${PROJECT_NAME}*.rpm' ! -name '${PROJECT_NAME}*-${PRJ_VER}-${PRJ_RELEASE_NO}.*.rpm'
> > ++              -print -delete
> > ++              COMMAND find ${RPM_BUILD_BUILD}
> > ++              -path '${PROJECT_NAME}*' ! -path '${RPM_BUILD_BUILD}/${PROJECT_NAME}-${PRJ_VER}-*'
> > ++              -print -delete
> > ++              COMMENT "Cleaning old rpms and build."
> > ++              )
> > ++
> > ++          ADD_CUSTOM_TARGET(clean_old_pkg
> > ++              )
> > ++
> > ++          ADD_DEPENDENCIES(clean_old_pkg clean_old_rpm clean_old_pack_src)
> > ++
> > ++          ADD_CUSTOM_TARGET(clean_rpm
> > ++              COMMAND find . -name '${PROJECT_NAME}-*.rpm' -print -delete
> > ++              COMMENT "Cleaning rpms.."
> > ++              )
> > ++          ADD_CUSTOM_TARGET(clean_pkg
> > ++              )
> > ++
> > ++          ADD_DEPENDENCIES(clean_rpm clean_old_rpm)
> > ++          ADD_DEPENDENCIES(clean_pkg clean_rpm clean_pack_src)
> > ++      ENDIF(NOT _manage_rpm_dependency_missing )
> > ++    ENDMACRO(PACK_RPM)
> > ++
> > ++    MACRO(RPM_MOCK_BUILD)
> > ++      IF(NOT _manage_rpm_dependency_missing )
> > ++          FIND_PROGRAM(MOCK_CMD mock)
> > ++          IF(MOCK_CMD STREQUAL "MOCK_CMD-NOTFOUND")
> > ++              M_MSG(${M_OFF} "mock is not found in PATH, mock support disabled.")
> > ++          ELSE(MOCK_CMD STREQUAL "MOCK_CMD-NOTFOUND")
> > ++              IF(NOT PRJ_RPM_BUILD_ARCH STREQUAL "noarch")
> > ++                  IF(NOT DEFINED MOCK_RPM_DIST_TAG)
> > ++                      STRING(REGEX MATCH "^fc([1-9][0-9]*)"  _fedora_mock_dist "${RPM_DIST_TAG}")
> > ++                      STRING(REGEX MATCH "^el([1-9][0-9]*)"  _el_mock_dist "${RPM_DIST_TAG}")
> > ++
> > ++                      IF (_fedora_mock_dist)
> > ++                          STRING(REGEX REPLACE "^fc([1-9][0-9]*)" "fedora-\\1" MOCK_RPM_DIST_TAG "${RPM_DIST_TAG}")
> > ++                      ELSEIF (_el_mock_dist)
> > ++                          STRING(REGEX REPLACE "^el([1-9][0-9]*)" "epel-\\1" MOCK_RPM_DIST_TAG "${RPM_DIST_TAG}")
> > ++                      ELSE (_fedora_mock_dist)
> > ++                          SET(MOCK_RPM_DIST_TAG "fedora-devel")
> > ++                      ENDIF(_fedora_mock_dist)
> > ++                  ENDIF(NOT DEFINED MOCK_RPM_DIST_TAG)
> > ++
> > ++                  #MESSAGE ("MOCK_RPM_DIST_TAG=${MOCK_RPM_DIST_TAG}")
> > ++                  ADD_CUSTOM_TARGET(rpm_mock_i386
> > ++                      COMMAND ${CMAKE_COMMAND} -E make_directory ${RPM_BUILD_RPMS}/i386
> > ++                      COMMAND ${MOCK_CMD} -r  "${MOCK_RPM_DIST_TAG}-i386" --resultdir="${RPM_BUILD_RPMS}/i386" ${PRJ_SRPM_FILE}
> > ++                      DEPENDS ${PRJ_SRPM_FILE}
> > ++                      )
> > ++
> > ++                  ADD_CUSTOM_TARGET(rpm_mock_x86_64
> > ++                      COMMAND ${CMAKE_COMMAND} -E make_directory ${RPM_BUILD_RPMS}/x86_64
> > ++                      COMMAND ${MOCK_CMD} -r  "${MOCK_RPM_DIST_TAG}-x86_64" --resultdir="${RPM_BUILD_RPMS}/x86_64" ${PRJ_SRPM_FILE}
> > ++                      DEPENDS ${PRJ_SRPM_FILE}
> > ++                      )
> > ++              ENDIF(NOT PRJ_RPM_BUILD_ARCH STREQUAL "noarch")
> > ++          ENDIF(MOCK_CMD STREQUAL "MOCK_CMD-NOTFOUND")
> > ++      ENDIF(NOT _manage_rpm_dependency_missing )
> > ++
> > ++    ENDMACRO(RPM_MOCK_BUILD)
> > ++
> > ++ENDIF(NOT DEFINED _MANAGE_RPM_CMAKE_)
> > ++
> > +--- /dev/null
> > ++++ b/Modules/ManageRelease.cmake
> > +@@ -0,0 +1,57 @@
> > ++# - Module that perform release task.
> > ++# This module provides common targets for release or post-release chores.
> > ++#
> > ++#  Defines following macros:
> > ++#  MANAGE_RELEASE(releaseTargets)
> > ++#  - Run release targets and the target "after_release_commit".
> > ++#    This macro skips the missing targets so distro package maintainers
> > ++#    do not have to get the irrelevant dependencies.
> > ++#    For the "hard" requirement, please use cmake command
> > ++#      "ADD_DEPENDENCIES".
> > ++#    Arguments:
> > ++#    + releaseTargets: Targets need to be done for a release.
> > ++#      Note that sequence of the targets does not guarantee the
> > ++#      sequence of execution.
> > ++#    Defines following targets:
> > ++#    + release: Perform everything required for a release.
> > ++#      Reads following variables:
> > ++#      + RELEASE_DEPENDS_FILES: List of files that the release depends.
> > ++#        Note that the sequence of the target does not guarantee the
> > ++#        sequence of execution.
> > ++#
> > ++
> > ++IF(NOT DEFINED _MANAGE_RELEASE_CMAKE_)
> > ++    SET(_MANAGE_RELEASE_CMAKE_ "DEFINED")
> > ++    INCLUDE(ManageMessage)
> > ++
> > ++    MACRO(MANAGE_RELEASE)
> > ++      ## Target: release
> > ++      ADD_CUSTOM_TARGET(release
> > ++          DEPENDS ${RELEASE_DEPENDS_FILES}
> > ++          COMMENT "Releasing ${PROJECT_NAME}-${PRJ_VER}"
> > ++          )
> > ++
> > ++      ## Remove the missing targets
> > ++      SET(_releaseTargets "")
> > ++      FOREACH(_target ${ARGN})
> > ++          IF(TARGET ${_target})
> > ++              LIST(APPEND _releaseTargets "${_target}")
> > ++          ELSE(TARGET ${_target})
> > ++              M_MSG(${M_OFF} "Target ${_target} does not exist, skipped.")
> > ++          ENDIF(TARGET ${_target})
> > ++      ENDFOREACH(_target ${ARGN})
> > ++
> > ++      IF(_releaseTargets)
> > ++          ADD_DEPENDENCIES(release ${_releaseTargets})
> > ++      ENDIF(_releaseTargets)
> > ++
> > ++      ## Run after release
> > ++      #ADD_CUSTOM_COMMAND(TARGET release
> > ++      #    POST_BUILD
> > ++      #    COMMAND make after_release_commit
> > ++      #    COMMENT "After released ${PROJECT_NAME}-${PRJ_VER}"
> > ++      #    )
> > ++
> > ++    ENDMACRO(MANAGE_RELEASE)
> > ++ENDIF(NOT DEFINED _MANAGE_RELEASE_CMAKE_)
> > ++
> > +--- /dev/null
> > ++++ b/Modules/ManageReleaseFedora.cmake
> > +@@ -0,0 +1,381 @@
> > ++# - Module for working with Fedora and EPEL releases.
> > ++#
> > ++# This module provides convenient targets and macros for Fedora and EPEL
> > ++# releases by using fedpkg, koji, and bodhi
> > ++#
> > ++# This module check following files for dependencies:
> > ++#  1. ~/.fedora-upload-ca.cert : Ensure it has certificate file to submit to Fedora.
> > ++#  2. fedpkg : Required to submit to fedora.
> > ++#  3. koji : Required to submit to fedora.
> > ++#  4. bodhi : Required to submit to fedora.
> > ++#
> > ++#  If on of above file is missing, this module will be skipped.
> > ++#
> > ++# This module read the supported release information from cmake-fedora.conf
> > ++# It finds cmake-fedora.conf in following order:
> > ++# 1. Current directory
> > ++# 2. Path as defined CMAKE_SOURCE_DIR
> > ++# 3. /etc/cmake-fedora.conf
> > ++#
> > ++# Includes:
> > ++#   ManageMessage
> > ++#
> > ++# Defines following variables:
> > ++#    CMAKE_FEDORA_CONF: Path to cmake_fedora.conf
> > ++#    FEDPKG_CMD: Path to fedpkg
> > ++#    KOJI_CMD: Path to koji
> > ++#    GIT_CMD: Path to git
> > ++#    BODHI_CMD: Path to bodhi
> > ++#    KOJI_BUILD_SCRATCH_CMD: Path to koji-build-scratch
> > ++#    FEDORA_RAWHIDE_VER: Fedora Rawhide version.
> > ++#    FEDORA_SUPPORTED_VERS: Fedora supported versions.
> > ++#    EPEL_SUPPORTED_VERS: EPEL supported versions.
> > ++#    FEDPKG_DIR: Dir for fedpkg
> > ++#    FEDORA_KAMA: Fedora Karma. Default:3
> > ++#    FEDORA_UNSTABLE_KARMA: Fedora unstable Karma. Default:3
> > ++#    FEDORA_AUTO_KARMA: Whether to use fedora Karma system. Default:"True"
> > ++#
> > ++# Defines following functions:
> > ++#   RELEASE_FEDORA(tagList)
> > ++#   - Release this project to specified Fedora and EPEL releases.
> > ++#     Arguments:
> > ++#     + tagList: Fedora and EPEL dist tags that this project submit to.
> > ++#       E.g. "f18", "f17", "el7"
> > ++#       You can also specify "fedora" for fedora current releases,
> > ++#       and/or "epel" for EPEL current releases.
> > ++#
> > ++#     Reads following variables:
> > ++#     + PRJ_SRPM_FILE: Project SRPM
> > ++#     + FEDPKG_DIR: Directory for fedpkg checkout.
> > ++#       Default: FedPkg.
> > ++#     Reads and define following variables:
> > ++#     + FEDORA_RAWHIDE_VER: Numeric version of rawhide, such as 18
> > ++#     + FEDORA_SUPPORTED_VERS: Numeric versions of currently supported Fedora,
> > ++#       such as 17;16
> > ++#     + EPEL_SUPPORTED_VERS: Numeric versions of currently supported EPEL
> > ++#       since version 5. Such as 6;5
> > ++#     + FEDORA_KARMA: Karma for auto pushing.
> > ++#       Default: 3
> > ++#     + FEDORA_UNSTABLE_KARMA: Karma for auto unpushing.
> > ++#       Default: 3
> > ++#     + FEDORA_AUTO_KARMA: Whether to enable auto pushing/unpushing
> > ++#       Default: True
> > ++#     Defines following targets:
> > ++#     + release_fedora: Make necessary steps for releasing on fedora,
> > ++#       such as making source file tarballs, source rpms, build with fedpkg
> > ++#       and upload to bodhi.
> > ++#     + bodhi_new: Submit the package to bodhi
> > ++#     + fedpkg_<tag>_build: Build for tag
> > ++#     + fedpkg_<tag>_commit: Import, commit and push
> > ++#     + koji_build_scratch: Scratch build using koji
> > ++#
> > ++#
> > ++
> > ++IF(NOT DEFINED _MANAGE_RELEASE_FEDORA_)
> > ++    SET(_MANAGE_RELEASE_FEDORA_ "DEFINED")
> > ++    INCLUDE(ManageMessage)
> > ++    INCLUDE(ManageTarget)
> > ++    SET(_manage_release_fedora_dependencies_missing 0)
> > ++    SET(KOJI_BUILD_SCRATCH "koji-build-scratch" CACHE INTERNAL "Koji build scratch name")
> > ++
> > ++    FIND_FILE(CMAKE_FEDORA_CONF cmake-fedora.conf "." "${CMAKE_SOURCE_DIR}" "${SYSCONF_DIR}")
> > ++    M_MSG(${M_INFO1} "CMAKE_FEDORA_CONF=${CMAKE_FEDORA_CONF}")
> > ++    IF("${CMAKE_FEDORA_CONF}" STREQUAL "CMAKE_FEDORA_CONF-NOTFOUND")
> > ++      M_MSG(${M_OFF} "cmake-fedora.conf cannot be found! Fedora release support disabled.")
> > ++      SET(_manage_release_fedora_dependencies_missing 1)
> > ++    ENDIF("${CMAKE_FEDORA_CONF}" STREQUAL "CMAKE_FEDORA_CONF-NOTFOUND")
> > ++
> > ++    FIND_PROGRAM(FEDPKG_CMD fedpkg)
> > ++    IF(FEDPKG_CMD STREQUAL "FEDPKG_CMD-NOTFOUND")
> > ++      M_MSG(${M_OFF} "Program fedpkg is not found! Fedora support disabled.")
> > ++      SET(_manage_release_fedora_dependencies_missing 1)
> > ++    ENDIF(FEDPKG_CMD STREQUAL "FEDPKG_CMD-NOTFOUND")
> > ++
> > ++    FIND_PROGRAM(KOJI_CMD koji)
> > ++    IF(KOJI_CMD STREQUAL "KOJI_CMD-NOTFOUND")
> > ++      M_MSG(${M_OFF} "Program koji is not found! Koji support disabled.")
> > ++    ENDIF(KOJI_CMD STREQUAL "KOJI_CMD-NOTFOUND")
> > ++
> > ++    FIND_PROGRAM(GIT_CMD git)
> > ++    IF(FEDPKG_CMD STREQUAL "FEDPKG_CMD-NOTFOUND")
> > ++      M_MSG(${M_OFF} "Program git is not found! Fedora support disabled.")
> > ++      SET(_manage_release_fedora_dependencies_missing 1)
> > ++    ENDIF(FEDPKG_CMD STREQUAL "FEDPKG_CMD-NOTFOUND")
> > ++
> > ++    FIND_PROGRAM(BODHI_CMD bodhi)
> > ++    IF(BODHI_CMD STREQUAL "BODHI_CMD-NOTFOUND")
> > ++      M_MSG(${M_OFF} "Program bodhi is not found! Bodhi support disabled.")
> > ++    ENDIF(BODHI_CMD STREQUAL "BODHI_CMD-NOTFOUND")
> > ++
> > ++
> > ++    ## Set variables
> > ++    IF(NOT _manage_release_fedora_dependencies_missing)
> > ++      # Set release tags according to CMAKE_FEDORA_CONF
> > ++      SETTING_FILE_GET_ALL_VARIABLES(${CMAKE_FEDORA_CONF})
> > ++
> > ++      SET(FEDORA_RAWHIDE_VER "${FEDORA_RAWHIDE_VERSION}"
> > ++          CACHE STRING "Fedora Rawhide ver" FORCE)
> > ++      STRING_SPLIT(_FEDORA_SUPPORTED_VERS " " ${FEDORA_SUPPORTED_VERSIONS})
> > ++      SET(FEDORA_SUPPORTED_VERS ${_FEDORA_SUPPORTED_VERS}
> > ++          CACHE STRING "Fedora supported vers" FORCE)
> > ++
> > ++      STRING_SPLIT(_EPEL_SUPPORTED_VERS " " ${EPEL_SUPPORTED_VERSIONS})
> > ++      SET(EPEL_SUPPORTED_VERS ${_EPEL_SUPPORTED_VERS}
> > ++          CACHE STRING "EPEL supported vers" FORCE)
> > ++
> > ++      SET(FEDORA_KOJI_TAG_POSTFIX "" CACHE STRING "Koji Fedora tag prefix")
> > ++      SET(EPEL_KOJI_TAG_POSTFIX "-testing-candidate"
> > ++          CACHE STRING "Koji EPEL tag prefix")
> > ++
> > ++      SET(BODHI_TEMPLATE_FILE "${CMAKE_FEDORA_TMP_DIR}/bodhi.template"
> > ++          CACHE FILEPATH "Bodhi template file"
> > ++          )
> > ++
> > ++      SET(FEDPKG_DIR "${CMAKE_BINARY_DIR}/FedPkg" CACHE PATH "FedPkg dir")
> > ++      FILE(MAKE_DIRECTORY ${FEDPKG_DIR})
> > ++
> > ++      GET_FILENAME_COMPONENT(_FEDPKG_DIR_NAME ${FEDPKG_DIR} NAME)
> > ++      LIST(APPEND SOURCE_ARCHIVE_IGNORE_FILES "/${_FEDPKG_DIR_NAME}/")
> > ++
> > ++      ## Fedora package variables
> > ++      SET(FEDORA_KARMA "3" CACHE STRING "Fedora Karma")
> > ++      SET(FEDORA_UNSTABLE_KARMA "-3" CACHE STRING "Fedora unstable Karma")
> > ++      SET(FEDORA_AUTO_KARMA "True" CACHE STRING "Fedora auto Karma")
> > ++
> > ++      FIND_PROGRAM(KOJI_BUILD_SCRATCH_CMD ${KOJI_BUILD_SCRATCH} PATHS ${CMAKE_BINARY_DIR}/scripts . )
> > ++      IF(KOJI_BUILD_SCRATCH_CMD STREQUAL "KOJI_BUILD_SCRATCH_CMD-NOTFOUND")
> > ++          M_MSG(${M_OFF} "Program koji_build_scratch is not found!")
> > ++      ENDIF(KOJI_BUILD_SCRATCH_CMD STREQUAL "KOJI_BUILD_SCRATCH_CMD-NOTFOUND")
> > ++
> > ++      SET(FEDPKG_PRJ_DIR "${FEDPKG_DIR}/${PROJECT_NAME}")
> > ++
> > ++      ## Don't use what is in git, otherwise it will be cleaned
> > ++      ## By make clean
> > ++      SET(FEDPKG_PRJ_DIR_GIT "${FEDPKG_PRJ_DIR}/.git/.cmake-fedora")
> > ++
> > ++      ADD_CUSTOM_COMMAND(OUTPUT ${FEDPKG_PRJ_DIR_GIT}
> > ++          COMMAND [ -d ${FEDPKG_PRJ_DIR} ] || ${FEDPKG_CMD} clone ${PROJECT_NAME}
> > ++          COMMAND ${CMAKE_COMMAND} -E touch ${FEDPKG_PRJ_DIR_GIT}
> > ++          COMMENT "Making FedPkg directory"
> > ++          WORKING_DIRECTORY ${FEDPKG_DIR}
> > ++          VERBATIM
> > ++          )
> > ++
> > ++    ENDIF(NOT _manage_release_fedora_dependencies_missing)
> > ++
> > ++    FUNCTION(RELEASE_ADD_KOJI_BUILD_SCRATCH)
> > ++      IF(NOT _manage_release_fedora_dependencies_missing)
> > ++          ADD_CUSTOM_TARGET(koji_build_scratch
> > ++              COMMAND ${KOJI_BUILD_SCRATCH_CMD} ${PRJ_SRPM_FILE} ${ARGN}
> > ++              DEPENDS "${PRJ_SRPM_FILE}"
> > ++              COMMENT "koji scratch build on ${PRJ_SRPM_FILE}"
> > ++              VERBATIM
> > ++              )
> > ++      ENDIF(NOT _manage_release_fedora_dependencies_missing)
> > ++      ADD_DEPENDENCIES(koji_build_scratch rpmlint)
> > ++      ADD_DEPENDENCIES(tag_pre koji_build_scratch)
> > ++    ENDFUNCTION(RELEASE_ADD_KOJI_BUILD_SCRATCH)
> > ++
> > ++    # Convert fedora koji tag to bodhi tag
> > ++    FUNCTION(_RELEASE_TO_BODHI_TAG bodhiTag tag)
> > ++      STRING(REGEX REPLACE "f([0-9]+)" "fc\\1" _tag_replace "${tag}")
> > ++      IF(_tag_replace STREQUAL "")
> > ++          SET(${bodhiTag} "${tag}" PARENT_SCOPE)
> > ++      ELSE(_tag_replace STREQUAL "")
> > ++          SET(${bodhiTag} "${_tag_replace}" PARENT_SCOPE)
> > ++      ENDIF(_tag_replace STREQUAL "")
> > ++    ENDFUNCTION(_RELEASE_TO_BODHI_TAG bodhiTag tag)
> > ++
> > ++    FUNCTION(RELEASE_ADD_FEDPKG_TARGETS tag)
> > ++      IF(NOT _manage_release_fedora_dependencies_missing)
> > ++          SET(_branch ${tag})
> > ++          IF("${tag}" STREQUAL "f${FEDORA_RAWHIDE_VER}")
> > ++              SET(_branch "master")
> > ++          ENDIF("${tag}" STREQUAL "f${FEDORA_RAWHIDE_VER}")
> > ++
> > ++          _RELEASE_TO_BODHI_TAG(_bodhi_tag "${tag}")
> > ++
> > ++          ## Fedpkg import and commit
> > ++          SET(_import_opt "")
> > ++          IF(NOT ver EQUAL FEDORA_RAWHIDE_VER)
> > ++              SET(_import_opt "-b ${tag}")
> > ++          ENDIF(NOT ver EQUAL FEDORA_RAWHIDE_VER)
> > ++
> > ++          #Commit summary
> > ++          IF (DEFINED CHANGE_SUMMARY)
> > ++              SET (COMMIT_MSG  "-m" "${CHANGE_SUMMARY}")
> > ++          ELSE(DEFINED CHANGE_SUMMARY)
> > ++              SET (COMMIT_MSG  "-m"  "On releasing ${PRJ_VER}-${PRJ_RELEASE_NO}")
> > ++          ENDIF(DEFINED CHANGE_SUMMARY)
> > ++          # Depends on tag file instead of target "tag"
> > ++          # To avoid excessive scratch build and rpmlint
> > ++          SET(_commit_opt --push --tag )
> > ++
> > ++          SET(_fedpkg_nvrd "${PROJECT_NAME}-${PRJ_VER}-${PRJ_RELEASE_NO}.${_bodhi_tag}")
> > ++          SET(_fedpkg_nvrd_commit_file
> > ++              "${CMAKE_FEDORA_TMP_DIR}/${_fedpkg_nvrd}.commit")
> > ++
> > ++          IF(_branch STREQUAL "master")
> > ++              # Can't use ADD_CUSTOM_TARGET_COMMAND here, as the COMMIT_SUMMARY may have semi-colon ':'
> > ++              ADD_CUSTOM_COMMAND(OUTPUT "${FEDPKG_NVR_RAWHIDE_COMMIT_FILE}"
> > ++                  COMMAND test -d ${PROJECT_NAME} || ${FEDPKG_CMD} clone ${PROJECT_NAME}
> > ++                  COMMAND ${FEDPKG_CMD} switch-branch ${_branch}
> > ++                  COMMAND ${GIT_CMD} pull --all
> > ++                  COMMAND ${FEDPKG_CMD} import "${PRJ_SRPM_FILE}"
> > ++                  COMMAND ${FEDPKG_CMD} commit ${_commit_opt} -m "${CHANGE_SUMMARY}"
> > ++                  COMMAND ${GIT_CMD} push --all
> > ++                  COMMAND ${CMAKE_COMMAND} -E touch "${FEDPKG_NVR_RAWHIDE_COMMIT_FILE}"
> > ++                  DEPENDS "${FEDPKG_PRJ_DIR_GIT}" "${MANAGE_SOURCE_VERSION_CONTROL_TAG_FILE}" "${PRJ_SRPM_FILE}"
> > ++                  WORKING_DIRECTORY ${FEDPKG_PRJ_DIR}
> > ++                  COMMENT "fedpkg commit on ${_branch} with ${PRJ_SRPM_FILE}"
> > ++                  VERBATIM
> > ++                  )
> > ++
> > ++              ADD_CUSTOM_TARGET(fedpkg_${_branch}_commit
> > ++                  DEPENDS ${FEDPKG_NVR_RAWHIDE_COMMIT_FILE}
> > ++                  )
> > ++          ELSE(_branch STREQUAL "master")
> > ++              ADD_CUSTOM_COMMAND(OUTPUT "${_fedpkg_nvrd_commit_file}"
> > ++                  COMMAND ${FEDPKG_CMD} switch-branch ${_branch}
> > ++                  COMMAND ${GIT_CMD} pull
> > ++                  COMMAND ${GIT_CMD} merge -m "Merge branch 'master' into ${_branch}" master
> > ++                  COMMAND ${FEDPKG_CMD} push
> > ++                  COMMAND ${CMAKE_COMMAND} -E touch "${_fedpkg_nvrd_commit_file}"
> > ++                  DEPENDS "${FEDPKG_NVR_RAWHIDE_COMMIT_FILE}"
> > ++                  WORKING_DIRECTORY ${FEDPKG_PRJ_DIR}
> > ++                  COMMENT "fedpkg commit on ${_branch} with ${PRJ_SRPM_FILE}"
> > ++                  VERBATIM
> > ++                  )
> > ++
> > ++              ADD_CUSTOM_TARGET(fedpkg_${_branch}_commit
> > ++                  DEPENDS "${_fedpkg_nvrd_commit_file}"
> > ++                  )
> > ++          ENDIF(_branch STREQUAL "master")
> > ++
> > ++          ## Fedpkg build
> > ++          SET(_fedpkg_nvrd_build_file
> > ++              "${CMAKE_FEDORA_TMP_DIR}/${_fedpkg_nvrd}")
> > ++
> > ++          ADD_CUSTOM_COMMAND(OUTPUT "${_fedpkg_nvrd_build_file}"
> > ++              COMMAND ${FEDPKG_CMD} switch-branch ${_branch}
> > ++              COMMAND ${FEDPKG_CMD} build
> > ++              COMMAND ${CMAKE_COMMAND} -E touch "${_fedpkg_nvrd_build_file}"
> > ++              DEPENDS "${_fedpkg_nvrd_commit_file}"
> > ++              WORKING_DIRECTORY ${FEDPKG_PRJ_DIR}
> > ++              COMMENT "fedpkg build on ${_branch}"
> > ++              VERBATIM
> > ++              )
> > ++
> > ++          ADD_CUSTOM_TARGET(fedpkg_${_branch}_build
> > ++              DEPENDS "${_fedpkg_nvrd_build_file}"
> > ++              )
> > ++
> > ++          ADD_DEPENDENCIES(bodhi_new fedpkg_${_branch}_build)
> > ++
> > ++          ## Fedpkg update
> > ++          SET(_fedpkg_nvrd_update_file
> > ++              "${CMAKE_FEDORA_TMP_DIR}/${_fedpkg_nvrd}.update")
> > ++
> > ++          ADD_CUSTOM_TARGET_COMMAND(fedpkg_${_branch}_update
> > ++              OUTPUT "${_fedpkg_nvrd_update_file}"
> > ++              COMMAND ${FEDPKG_CMD} switch-branch ${_branch}
> > ++              COMMAND ${FEDPKG_CMD} update
> > ++              COMMAND ${CMAKE_COMMAND} -E touch "${_fedpkg_nvrd_build_file}"
> > ++              DEPENDS ${_fedpkg_nvrd_build_file}
> > ++              WORKING_DIRECTORY ${FEDPKG_PRJ_DIR}
> > ++              COMMENT "fedpkg build on ${_branch}"
> > ++              VERBATIM
> > ++              )
> > ++
> > ++      ENDIF(NOT _manage_release_fedora_dependencies_missing)
> > ++    ENDFUNCTION(RELEASE_ADD_FEDPKG_TARGETS tag)
> > ++
> > ++    MACRO(_append_notes _file)
> > ++      STRING(REGEX REPLACE "\n" "\n " _notes "${CHANGELOG_ITEMS}")
> > ++      FILE(APPEND "${_file}" "notes=${_notes}\n\n")
> > ++    ENDMACRO(_append_notes _file)
> > ++
> > ++    FUNCTION(RELEASE_APPEND_BODHI_FILE tag)
> > ++      IF(NOT _manage_release_fedora_dependencies_missing)
> > ++          # Rawhide does not go to bodhi
> > ++          IF(NOT "${tag}" STREQUAL "f${FEDORA_RAWHIDE_VER}")
> > ++              _RELEASE_TO_BODHI_TAG(_bodhi_tag "${tag}")
> > ++
> > ++              FILE(APPEND ${BODHI_TEMPLATE_FILE} "[${PROJECT_NAME}-${PRJ_VER}-${PRJ_RELEASE_NO}.${_bodhi_tag}]\n\n")
> > ++
> > ++              IF(BODHI_UPDATE_TYPE)
> > ++                  FILE(APPEND ${BODHI_TEMPLATE_FILE} "type=${BODHI_UPDATE_TYPE}\n\n")
> > ++              ELSE(BODHI_UPDATE_TYPE)
> > ++                  FILE(APPEND ${BODHI_TEMPLATE_FILE} "type=bugfix\n\n")
> > ++              ENDIF(BODHI_UPDATE_TYPE)
> > ++
> > ++              FILE(APPEND ${BODHI_TEMPLATE_FILE} "request=testing\n")
> > ++              FILE(APPEND ${BODHI_TEMPLATE_FILE} "bugs=${REDHAT_BUGZILLA}\n")
> > ++
> > ++              _append_notes(${BODHI_TEMPLATE_FILE})
> > ++
> > ++              FILE(APPEND ${BODHI_TEMPLATE_FILE} "autokarma=${FEDORA_AUTO_KARMA}\n")
> > ++              FILE(APPEND ${BODHI_TEMPLATE_FILE} "stable_karma=${FEDORA_KARMA}\n")
> > ++              FILE(APPEND ${BODHI_TEMPLATE_FILE} "unstable_karma=${FEDORA_UNSTABLE_KARMA}\n")
> > ++              FILE(APPEND ${BODHI_TEMPLATE_FILE} "close_bugs=True\n")
> > ++
> > ++              IF(SUGGEST_REBOOT)
> > ++                  FILE(APPEND ${BODHI_TEMPLATE_FILE} "suggest_reboot=True\n")
> > ++              ELSE(SUGGEST_REBOOT)
> > ++                  FILE(APPEND ${BODHI_TEMPLATE_FILE} "suggest_reboot=False\n\n")
> > ++              ENDIF(SUGGEST_REBOOT)
> > ++          ENDIF(NOT "${tag}" STREQUAL "f${FEDORA_RAWHIDE_VER}")
> > ++      ENDIF(NOT _manage_release_fedora_dependencies_missing)
> > ++    ENDFUNCTION(RELEASE_APPEND_BODHI_FILE tag)
> > ++
> > ++    FUNCTION(RELEASE_FEDORA)
> > ++      IF(NOT _manage_release_fedora_dependencies_missing)
> > ++          ## Parse tags
> > ++          SET(_build_list "f${FEDORA_RAWHIDE_VER}")
> > ++          FOREACH(_rel ${ARGN})
> > ++              IF(_rel STREQUAL "fedora")
> > ++                  FOREACH(_ver ${FEDORA_SUPPORTED_VERS})
> > ++                      LIST(APPEND _build_list "f${_ver}")
> > ++                  ENDFOREACH(_ver ${FEDORA_SUPPORTED_VERS})
> > ++              ELSEIF(_rel STREQUAL "epel")
> > ++                  FOREACH(_ver ${EPEL_SUPPORTED_VERS})
> > ++                      LIST(APPEND _build_list "el${_ver}")
> > ++                  ENDFOREACH(_ver ${FEDORA_SUPPORTED_VERS})
> > ++              ELSE(_rel STREQUAL "fedora")
> > ++                  LIST(APPEND _build_list "${_rel}")
> > ++              ENDIF(_rel STREQUAL "fedora")
> > ++          ENDFOREACH(_rel ${ARGN})
> > ++          LIST(REMOVE_DUPLICATES _build_list)
> > ++
> > ++          IF(BODHI_USER)
> > ++              SET(_bodhi_login "-u ${BODHI_USER}")
> > ++          ENDIF(BODHI_USER)
> > ++
> > ++          ADD_CUSTOM_TARGET(bodhi_new
> > ++              COMMAND ${BODHI_CMD} --new ${_bodhi_login} --file ${BODHI_TEMPLATE_FILE}
> > ++              DEPENDS "${BODHI_TEMPLATE_FILE}"
> > ++              COMMENT "Submit new release to bodhi (Fedora)"
> > ++              VERBATIM
> > ++              )
> > ++
> > ++          # NVRD: Name-Version-Release-Dist
> > ++          SET(FEDPKG_NVR_RAWHIDE "${PROJECT_NAME}-${PRJ_VER}-${PRJ_RELEASE_NO}.fc${FEDORA_RAWHIDE_VER}")
> > ++          SET(FEDPKG_NVR_RAWHIDE_COMMIT_FILE "${CMAKE_FEDORA_TMP_DIR}/${FEDPKG_NVR_RAWHIDE}.commit")
> > ++
> > ++          ## Create targets
> > ++          FILE(REMOVE "${BODHI_TEMPLATE_FILE}")
> > ++          RELEASE_ADD_KOJI_BUILD_SCRATCH(${_build_list})
> > ++          FOREACH(_tag ${_build_list})
> > ++              RELEASE_ADD_FEDPKG_TARGETS("${_tag}")
> > ++              RELEASE_APPEND_BODHI_FILE("${_tag}")
> > ++          ENDFOREACH(_tag ${_build_list})
> > ++
> > ++          ADD_CUSTOM_TARGET(release_fedora
> > ++              COMMENT "Release for Fedora")
> > ++
> > ++          ADD_DEPENDENCIES(release_fedora bodhi_new)
> > ++
> > ++      ENDIF(NOT _manage_release_fedora_dependencies_missing)
> > ++    ENDFUNCTION(RELEASE_FEDORA)
> > ++ENDIF(NOT DEFINED _MANAGE_RELEASE_FEDORA_)
> > ++
> > +--- /dev/null
> > ++++ b/Modules/ManageSourceVersionControl.cmake
> > +@@ -0,0 +1,137 @@
> > ++# - Module for manipulate source version control systems.
> > ++# This module provides an universal interface for supported
> > ++# source version control systems, namely:
> > ++# Git, Mercurial and SVN.
> > ++#
> > ++# Following targets are defined for each source version control (in Git terminology):
> > ++#   - tag: Tag the working tree with PRJ_VER and CHANGE_SUMMARY.
> > ++#     This target also does:
> > ++#     1. Ensure there is nothing uncommitted.
> > ++#     2. Push the commits and tags to server
> > ++#   - tag_pre: Targets that 'tag' depends on.
> > ++#     So you can push some check before the tag.
> > ++#   - after_release_commit:
> > ++#     This target does some post release chores, such as
> > ++#     updating ChangeLog.prev and RPM-ChangeLog.prev, then push them to server.
> > ++#
> > ++# Following variables are defined for each source version control:
> > ++#   - MANAGE_SOURCE_VERSION_CONTROL_TAG_FILE:
> > ++#     The file that would be touched after target tag is completed.
> > ++#
> > ++#
> > ++
> > ++IF(NOT DEFINED _MANAGE_SOURCE_VERSION_CONTROL_CMAKE_)
> > ++    SET(_MANAGE_SOURCE_VERSION_CONTROL_CMAKE_ "DEFINED")
> > ++    SET(_after_release_message "After released ${PRJ_VER}")
> > ++    INCLUDE(ManageTarget)
> > ++
> > ++    MACRO(MANAGE_SOURCE_VERSION_CONTROL_COMMON)
> > ++      ADD_CUSTOM_TARGET(tag_pre
> > ++          COMMENT "Pre-tagging check"
> > ++          )
> > ++
> > ++
> > ++      ADD_CUSTOM_TARGET(after_release_commit_pre
> > ++          COMMENT "Before 'after_release_commit'"
> > ++          )
> > ++
> > ++      IF(TARGET changelog_prev_update)
> > ++          ADD_DEPENDENCIES(after_release_commit_pre changelog_prev_update)
> > ++      ENDIF(TARGET changelog_prev_update)
> > ++
> > ++      IF(TARGET rpm_changelog_prev_update)
> > ++          ADD_DEPENDENCIES(after_release_commit_pre rpm_changelog_prev_update)
> > ++      ENDIF(TARGET rpm_changelog_prev_update)
> > ++    ENDMACRO(MANAGE_SOURCE_VERSION_CONTROL_COMMON)
> > ++
> > ++    MACRO(MANAGE_SOURCE_VERSION_CONTROL_GIT)
> > ++      SET(MANAGE_SOURCE_VERSION_CONTROL_TAG_FILE
> > ++          ${CMAKE_SOURCE_DIR}/.git/refs/tags/${PRJ_VER}
> > ++          CACHE PATH "Source Version Control Tag File" FORCE)
> > ++
> > ++      ADD_CUSTOM_TARGET(after_release_commit
> > ++          COMMAND make after_release_commit_pre
> > ++          COMMAND git commit -a -m "${_after_release_message}"
> > ++          COMMAND git push
> > ++          COMMENT "After released ${PRJ_VER}"
> > ++          VERBATIM
> > ++          )
> > ++
> > ++      # Can't use ADD_CUSTOM_TARGET here, as the COMMIT_SUMMARY may have semi-colon ':'
> > ++      ADD_CUSTOM_TARGET(tag
> > ++          DEPENDS "${MANAGE_SOURCE_VERSION_CONTROL_TAG_FILE}"
> > ++          )
> > ++
> > ++      ADD_CUSTOM_TARGET(commit_clean
> > ++          COMMAND git diff --exit-code
> > ++          COMMENT "Is git commit clean?"
> > ++          VERBATIM
> > ++          )
> > ++
> > ++      ADD_CUSTOM_COMMAND(OUTPUT ${MANAGE_SOURCE_VERSION_CONTROL_TAG_FILE}
> > ++          COMMAND make commit_clean
> > ++          COMMAND make tag_pre
> > ++          COMMAND git tag -a -m "${CHANGE_SUMMARY}" "${PRJ_VER}" HEAD
> > ++          COMMENT "Tagging the source as ver ${PRJ_VER}"
> > ++          VERBATIM
> > ++          )
> > ++      MANAGE_SOURCE_VERSION_CONTROL_COMMON()
> > ++    ENDMACRO(MANAGE_SOURCE_VERSION_CONTROL_GIT)
> > ++
> > ++    MACRO(MANAGE_SOURCE_VERSION_CONTROL_HG)
> > ++      SET(MANAGE_SOURCE_VERSION_CONTROL_TAG_FILE
> > ++          ${CMAKE_FEDORA_TEMP_DIR}/${PRJ_VER}
> > ++          CACHE PATH "Source Version Control Tag File" FORCE)
> > ++
> > ++      ADD_CUSTOM_TARGET(after_release_commit
> > ++          COMMAND make after_release_commit_pre
> > ++          COMMAND hg commit -m "${_after_release_message}"
> > ++          COMMAND hg push
> > ++          COMMENT "After released ${PRJ_VER}"
> > ++          VERBATIM
> > ++          )
> > ++
> > ++      ADD_CUSTOM_TARGET(tag
> > ++          DEPENDS "${MANAGE_SOURCE_VERSION_CONTROL_TAG_FILE}"
> > ++          )
> > ++
> > ++      ADD_CUSTOM_COMMAND(OUTPUT "${MANAGE_SOURCE_VERSION_CONTROL_TAG_FILE}"
> > ++          COMMAND make tag_pre
> > ++          COMMAND hg tag -m "${CHANGE_SUMMARY}" "${PRJ_VER}"
> > ++          COMMAND ${CMAKE_COMMAND} -E touch "${MANAGE_SOURCE_VERSION_CONTROL_TAG_FILE}"
> > ++          COMMENT "Tagging the source as ver ${PRJ_VER}"
> > ++          VERBATIM
> > ++          )
> > ++
> > ++      MANAGE_SOURCE_VERSION_CONTROL_COMMON()
> > ++    ENDMACRO(MANAGE_SOURCE_VERSION_CONTROL_HG)
> > ++
> > ++    MACRO(MANAGE_SOURCE_VERSION_CONTROL_SVN)
> > ++      SET(MANAGE_SOURCE_VERSION_CONTROL_TAG_FILE
> > ++          ${CMAKE_FEDORA_TEMP_DIR}/${PRJ_VER}
> > ++          CACHE PATH "Source Version Control Tag File" FORCE)
> > ++
> > ++      ADD_CUSTOM_TARGET(after_release_commit
> > ++          COMMAND make after_release_commit_pre
> > ++          COMMAND svn commit -m "${_after_release_message}"
> > ++          COMMENT "After released ${PRJ_VER}"
> > ++          VERBATIM
> > ++          )
> > ++
> > ++      ADD_CUSTOM_TARGET(tag
> > ++          DEPENDS "${MANAGE_SOURCE_VERSION_CONTROL_TAG_FILE}"
> > ++          )
> > ++
> > ++      ADD_CUSTOM_TARGET(OUTPUT "${MANAGE_SOURCE_VERSION_CONTROL_TAG_FILE}"
> > ++          COMMAND make tag_pre
> > ++          COMMAND svn copy "${SOURCE_BASE_URL}/trunk" "${SOURCE_BASE_URL}/tags/${PRJ_VER}" -m "${CHANGE_SUMMARY}"
> > ++          COMMAND cmake -E touch ${MANAGE_SOURCE_VERSION_CONTROL_TAG_FILE}
> > ++          COMMENT "Tagging the source as ver ${PRJ_VER}"
> > ++          VERBATIM
> > ++          )
> > ++
> > ++      MANAGE_SOURCE_VERSION_CONTROL_COMMON()
> > ++    ENDMACRO(MANAGE_SOURCE_VERSION_CONTROL_SVN)
> > ++
> > ++ENDIF(NOT DEFINED _MANAGE_SOURCE_VERSION_CONTROL_CMAKE_)
> > ++
> > +--- /dev/null
> > ++++ b/Modules/ManageString.cmake
> > +@@ -0,0 +1,325 @@
> > ++# - Collection of String utility macros.
> > ++#
> > ++# Included by:
> > ++#   ManageVarible
> > ++#
> > ++# Defines the following macros:
> > ++#   STRING_TRIM(var str [NOUNQUOTE])
> > ++#   - Trim a string by removing the leading and trailing spaces,
> > ++#     just like STRING(STRIP ...) in CMake 2.6 and later.
> > ++#     This macro is needed as CMake 2.4 does not support STRING(STRIP ..)
> > ++#     This macro also remove quote and double quote marks around the string,
> > ++#     unless NOUNQUOTE is defined.
> > ++#     * Parameters:
> > ++#       + var: A variable that stores the result.
> > ++#       + str: A string.
> > ++#       + NOUNQUOTE: (Optional) do not remove the double quote mark around the string.
> > ++#
> > ++#   STRING_ESCAPE_SEMICOLON(var str)
> > ++#   - Escape the semicolon
> > ++#     * Parameters:
> > ++#       + var: A variable that stores the result.
> > ++#       + str: A string.
> > ++#
> > ++#   STRING_UNQUOTE(var str)
> > ++#   - Remove double quote marks and quote marks around a string.
> > ++#     If the string is not quoted, then content of str is copied to var
> > ++#     * Parameters:
> > ++#       + var: A variable that stores the result.
> > ++#       + str: A string.
> > ++#
> > ++#   STRING_JOIN(var delimiter str_list [str...])
> > ++#   - Concatenate strings, with delimiter inserted between strings.
> > ++#     * Parameters:
> > ++#       + var: A variable that stores the result.
> > ++#       + str_list: A list of string.
> > ++#       + str: (Optional) more string to be join.
> > ++#
> > ++#   STRING_SPLIT(var delimiter str [NOESCAPE_SEMICOLON])
> > ++#   - Split a string into a list using a delimiter, which can be in 1 or more
> > ++#     characters long.
> > ++#     * Parameters:
> > ++#       + var: A variable that stores the result.
> > ++#       + delimiter: To separate a string.
> > ++#       + str: A string.
> > ++#       + NOESCAPE_SEMICOLON: (Optional) Do not escape semicolons.
> > ++#
> > ++
> > ++IF(NOT DEFINED _MANAGE_STRING_CMAKE_)
> > ++    SET(_MANAGE_STRING_CMAKE_ "DEFINED")
> > ++
> > ++    # Return (index of lefttmost non match character)
> > ++    # Return _strLen if all characters matches regex
> > ++    FUNCTION(STRING_LEFTMOST_NOTMATCH_INDEX var str regex)
> > ++      STRING(LENGTH "${str}" _strLen)
> > ++      SET(_index 0)
> > ++      SET(_ret ${_strLen})
> > ++      WHILE(_index LESS _strLen)
> > ++          STRING(SUBSTRING "${str}" ${_index} 1 _strCursor)
> > ++          #MESSAGE("***STRING_UNQUOTE: _i=${_index} _strCursor=${_strCursor}")
> > ++          IF(NOT "${_strCursor}" MATCHES "${regex}")
> > ++              SET(_ret ${_index})
> > ++              SET(_index ${_strLen})
> > ++          ENDIF(NOT "${_strCursor}" MATCHES "${regex}")
> > ++
> > ++          MATH(EXPR _index ${_index}+1)
> > ++      ENDWHILE(_index LESS _strLen)
> > ++      SET(${var} ${_ret} PARENT_SCOPE)
> > ++    ENDFUNCTION(STRING_LEFTMOST_NOTMATCH_INDEX var str)
> > ++
> > ++    # Return (index of rightmost non match character) +1
> > ++    # Return 0 if all characters matches regex
> > ++    #
> > ++    FUNCTION(STRING_RIGHTMOST_NOTMATCH_INDEX var str regex)
> > ++      STRING(LENGTH "${str}" _strLen)
> > ++      MATH(EXPR _index ${_strLen})
> > ++      SET(_ret 0)
> > ++      WHILE(_index GREATER 0)
> > ++          MATH(EXPR _index_1 ${_index}-1)
> > ++          STRING(SUBSTRING "${str}" ${_index_1} 1 _strCursor)
> > ++          #MESSAGE("***STRING_UNQUOTE: _i=${_index} _strCursor=${_strCursor}")
> > ++
> > ++          IF(NOT "${_strCursor}" MATCHES "${regex}")
> > ++              SET(_ret ${_index})
> > ++              SET(_index 0)
> > ++          ENDIF(NOT "${_strCursor}" MATCHES "${regex}")
> > ++          MATH(EXPR _index ${_index}-1)
> > ++      ENDWHILE(_index GREATER 0)
> > ++      SET(${var} ${_ret} PARENT_SCOPE)
> > ++    ENDFUNCTION(STRING_RIGHTMOST_NOTMATCH_INDEX var str)
> > ++
> > ++    FUNCTION(STRING_TRIM var str)
> > ++      #_STRING_ESCAPE(_ret "${str}" ${ARGN})
> > ++      STRING_LEFTMOST_NOTMATCH_INDEX(_leftIndex "${str}" "[ \t\n\r]")
> > ++      STRING_RIGHTMOST_NOTMATCH_INDEX(_rightIndex "${str}" "[ \t\n\r]")
> > ++      #MESSAGE("_left=${_leftIndex} _rightIndex=${_rightIndex} str=|${str}|")
> > ++      MATH(EXPR _subLen ${_rightIndex}-${_leftIndex})
> > ++      SET(_NOUNQUOTE 0)
> > ++      FOREACH( _arg ${ARGN})
> > ++          IF(_arg STREQUAL "NOUNQUOTE")
> > ++              SET(_NOUNQUOTE 1)
> > ++          ENDIF(_arg STREQUAL "NOUNQUOTE")
> > ++      ENDFOREACH( _arg ${ARGN})
> > ++
> > ++      IF(_subLen GREATER 0)
> > ++          STRING(SUBSTRING "${str}" ${_leftIndex} ${_subLen} _ret)
> > ++          # IF _subLen > 1
> > ++          #   IF UNQUOTE; then unquote
> > ++          # Otherwise don't touch
> > ++          IF (_subLen GREATER 1)
> > ++              IF(NOT _NOUNQUOTE)
> > ++                  STRING_UNQUOTE(_ret "${_ret}")
> > ++              ENDIF(NOT _NOUNQUOTE)
> > ++          ENDIF (_subLen GREATER 1)
> > ++      ELSE(_subLen GREATER 0)
> > ++          SET(_ret "")
> > ++      ENDIF(_subLen GREATER 0)
> > ++      SET(${var} "${_ret}" PARENT_SCOPE)
> > ++
> > ++      # Unencoding
> > ++      #_STRING_UNESCAPE(${var} "${_ret}" ${ARGN})
> > ++    ENDFUNCTION(STRING_TRIM var str)
> > ++
> > ++    MACRO(STRING_ESCAPE_SEMICOLON var str)
> > ++      STRING(REGEX REPLACE ";" "\\\\;" ${var} "${str}")
> > ++    ENDMACRO(STRING_ESCAPE_SEMICOLON var str)
> > ++
> > ++    # Internal macro
> > ++    # Nested Variable cannot be escaped here, as variable is already substituted
> > ++    # at the time it passes to this macro.
> > ++    MACRO(_STRING_ESCAPE var str)
> > ++      # ';' and '\' are tricky, need to be encoded.
> > ++      # '#' => '#H'
> > ++      # '\' => '#B'
> > ++      # ';' => '#S'
> > ++      SET(_NOESCAPE_SEMICOLON "")
> > ++      SET(_NOESCAPE_HASH "")
> > ++
> > ++      FOREACH(_arg ${ARGN})
> > ++          IF(${_arg} STREQUAL "NOESCAPE_SEMICOLON")
> > ++              SET(_NOESCAPE_SEMICOLON "NOESCAPE_SEMICOLON")
> > ++          ELSEIF(${_arg} STREQUAL "NOESCAPE_HASH")
> > ++              SET(_NOESCAPE_HASH "NOESCAPE_HASH")
> > ++          ENDIF(${_arg} STREQUAL "NOESCAPE_SEMICOLON")
> > ++      ENDFOREACH(_arg ${ARGN})
> > ++
> > ++      IF(_NOESCAPE_HASH STREQUAL "")
> > ++          STRING(REGEX REPLACE "#" "#H" _ret "${str}")
> > ++      ELSE(_NOESCAPE_HASH STREQUAL "")
> > ++          SET(_ret "${str}")
> > ++      ENDIF(_NOESCAPE_HASH STREQUAL "")
> > ++
> > ++      STRING(REGEX REPLACE "\\\\" "#B" _ret "${_ret}")
> > ++      IF(_NOESCAPE_SEMICOLON STREQUAL "")
> > ++          STRING(REGEX REPLACE ";" "#S" _ret "${_ret}")
> > ++      ENDIF(_NOESCAPE_SEMICOLON STREQUAL "")
> > ++      #MESSAGE("_STRING_ESCAPE:_ret=${_ret}")
> > ++      SET(${var} "${_ret}")
> > ++    ENDMACRO(_STRING_ESCAPE var str)
> > ++
> > ++    MACRO(_STRING_UNESCAPE var str)
> > ++      # '#B' => '\'
> > ++      # '#H' => '#'
> > ++      # '#D' => '$'
> > ++      # '#S' => ';'
> > ++      SET(_ESCAPE_VARIABLE "")
> > ++      SET(_NOESCAPE_SEMICOLON "")
> > ++      SET(_ret "${str}")
> > ++      FOREACH(_arg ${ARGN})
> > ++          IF(${_arg} STREQUAL "NOESCAPE_SEMICOLON")
> > ++              SET(_NOESCAPE_SEMICOLON "NOESCAPE_SEMICOLON")
> > ++          ELSEIF(${_arg} STREQUAL "ESCAPE_VARIABLE")
> > ++              SET(_ESCAPE_VARIABLE "ESCAPE_VARIABLE")
> > ++              STRING(REGEX REPLACE "#D" "$" _ret "${_ret}")
> > ++          ENDIF(${_arg} STREQUAL "NOESCAPE_SEMICOLON")
> > ++      ENDFOREACH(_arg ${ARGN})
> > ++      #MESSAGE("###_STRING_UNESCAPE: var=${var} _ret=${_ret} _NOESCAPE_SEMICOLON=${_NOESCAPE_SEMICOLON} ESCAPE_VARIABLE=${_ESCAPE_VARIABLE}")
> > ++
> > ++      STRING(REGEX REPLACE "#B" "\\\\" _ret "${_ret}")
> > ++      IF("${_NOESCAPE_SEMICOLON}" STREQUAL "")
> > ++          # ESCAPE_SEMICOLON
> > ++          STRING(REGEX REPLACE "#S" "\\\\;" _ret "${_ret}")
> > ++      ELSE("${_NOESCAPE_SEMICOLON}" STREQUAL "")
> > ++          # Don't ESCAPE_SEMICOLON
> > ++          STRING(REGEX REPLACE "#S" ";" _ret "${_ret}")
> > ++      ENDIF("${_NOESCAPE_SEMICOLON}" STREQUAL "")
> > ++
> > ++      IF(NOT _ESCAPE_VARIABLE STREQUAL "")
> > ++          # '#D' => '$'
> > ++          STRING(REGEX REPLACE "#D" "$" _ret "${_ret}")
> > ++      ENDIF(NOT _ESCAPE_VARIABLE STREQUAL "")
> > ++      STRING(REGEX REPLACE "#H" "#" _ret "${_ret}")
> > ++      SET(${var} "${_ret}")
> > ++      #MESSAGE("*** _STRING_UNESCAPE: ${var}=${${var}}")
> > ++    ENDMACRO(_STRING_UNESCAPE var str)
> > ++
> > ++    MACRO(STRING_UNQUOTE var str)
> > ++      SET(_ret "${str}")
> > ++      STRING(LENGTH "${str}" _strLen)
> > ++
> > ++      # IF _strLen > 1
> > ++      #   IF lCh and rCh are both "\""
> > ++      #      Remove _lCh and _rCh
> > ++      #   ELSEIF lCh and rCh are both "'"
> > ++      #      Remove _lCh and _rCh
> > ++      # Otherwise don't touch
> > ++      IF(_strLen GREATER 1)
> > ++          STRING(SUBSTRING "${str}" 0 1 _lCh)
> > ++          MATH(EXPR _strLen_1 ${_strLen}-1)
> > ++          MATH(EXPR _strLen_2 ${_strLen_1}-1)
> > ++          STRING(SUBSTRING "${str}" ${_strLen_1} 1 _rCh)
> > ++          #MESSAGE("_lCh=${_lCh} _rCh=${_rCh} _ret=|${_ret}|")
> > ++          IF("${_lCh}" STREQUAL "\"" AND "${_rCh}" STREQUAL "\"")
> > ++              STRING(SUBSTRING "${_ret}" 1 ${_strLen_2} _ret)
> > ++          ELSEIF("${_lCh}" STREQUAL "'" AND "${_rCh}" STREQUAL "'")
> > ++              STRING(SUBSTRING "${_ret}" 1 ${_strLen_2} _ret)
> > ++          ENDIF("${_lCh}" STREQUAL "\"" AND "${_rCh}" STREQUAL "\"")
> > ++      ENDIF (_strLen GREATER 1)
> > ++      SET(${var} "${_ret}")
> > ++    ENDMACRO(STRING_UNQUOTE var str)
> > ++
> > ++    MACRO(STRING_JOIN var delimiter str_list)
> > ++      SET(_ret "")
> > ++      FOREACH(_str ${str_list})
> > ++          IF(_ret STREQUAL "")
> > ++              SET(_ret "${_str}")
> > ++          ELSE(_ret STREQUAL "")
> > ++              SET(_ret "${_ret}${delimiter}${_str}")
> > ++          ENDIF(_ret STREQUAL "")
> > ++      ENDFOREACH(_str ${str_list})
> > ++
> > ++      FOREACH(_str ${ARGN})
> > ++          IF(_ret STREQUAL "")
> > ++              SET(_ret "${_str}")
> > ++          ELSE(_ret STREQUAL "")
> > ++              SET(_ret "${_ret}${delimiter}${_str}")
> > ++          ENDIF(_ret STREQUAL "")
> > ++      ENDFOREACH(_str ${ARGN})
> > ++      SET(${var} "${_ret}")
> > ++    ENDMACRO(STRING_JOIN var delimiter str_list)
> > ++
> > ++    FUNCTION(STRING_FIND var str search_str)
> > ++      STRING(LENGTH "${str}" _str_len)
> > ++      STRING(LENGTH "${search_str}" _search_len)
> > ++      MATH(EXPR _str_end ${_str_len}-${_search_len}+1)
> > ++
> > ++      SET(_index 0)
> > ++      SET(_str_remain "")
> > ++      SET(_result -1)
> > ++      WHILE(_index LESS _str_end)
> > ++          STRING(SUBSTRING "${str}" ${_index} ${_search_len} _str_window)
> > ++          IF("${_str_window}" STREQUAL "${search_str}")
> > ++              SET(_result ${_index})
> > ++              BREAK()
> > ++          ELSE("${_str_window}" STREQUAL "${search_str}")
> > ++              MATH(EXPR _index ${_index}+1)
> > ++          ENDIF("${_str_window}" STREQUAL "${search_str}")
> > ++      ENDWHILE(_index LESS _str_end)
> > ++      SET(${var} ${_result} PARENT_SCOPE)
> > ++    ENDFUNCTION(STRING_FIND var str search)
> > ++
> > ++    FUNCTION(STRING_SPLIT_2 var str_remain delimiter str)
> > ++      STRING_FIND(_index "${str}" "${delimiter}")
> > ++      IF(_index EQUAL -1)
> > ++          SET(${var} "${str}" PARENT_SCOPE)
> > ++          SET(${str_remain} "" PARENT_SCOPE)
> > ++      ELSE(_index EQUAL -1)
> > ++          STRING(SUBSTRING "${str}" 0 ${_index} _var)
> > ++          SET(${var} "${_var}" PARENT_SCOPE)
> > ++
> > ++          STRING(LENGTH "${str}" _str_len)
> > ++          STRING(LENGTH "${delimiter}" _delimiter_len)
> > ++          MATH(EXPR _str_2_start ${_index}+${_delimiter_len})
> > ++          MATH(EXPR _str_2_len ${_str_len}-${_index}-${_delimiter_len})
> > ++          STRING(SUBSTRING "${str}" ${_str_2_start} ${_str_2_len} _str_remain)
> > ++          SET(${str_remain} "${_str_remain}" PARENT_SCOPE)
> > ++      ENDIF(_index EQUAL -1)
> > ++    ENDFUNCTION(STRING_SPLIT_2 var str_remain delimiter str)
> > ++
> > ++    MACRO(STRING_SPLIT var delimiter str)
> > ++      #MESSAGE("***STRING_SPLIT: var=${var} str=${str}")
> > ++      SET(_max_tokens "")
> > ++      SET(_NOESCAPE_SEMICOLON "")
> > ++      SET(_ESCAPE_VARIABLE "")
> > ++      FOREACH(_arg ${ARGN})
> > ++          IF(${_arg} STREQUAL "NOESCAPE_SEMICOLON")
> > ++              SET(_NOESCAPE_SEMICOLON "NOESCAPE_SEMICOLON")
> > ++          ELSEIF(${_arg} STREQUAL "ESCAPE_VARIABLE")
> > ++              SET(_ESCAPE_VARIABLE "ESCAPE_VARIABLE")
> > ++          ELSE(${_arg} STREQUAL "NOESCAPE_SEMICOLON")
> > ++              SET(_max_tokens ${_arg})
> > ++          ENDIF(${_arg} STREQUAL "NOESCAPE_SEMICOLON")
> > ++      ENDFOREACH(_arg ${ARGN})
> > ++
> > ++      IF(NOT _max_tokens)
> > ++          SET(_max_tokens -1)
> > ++      ENDIF(NOT _max_tokens)
> > ++
> > ++      _STRING_ESCAPE(_str "${str}" ${_NOESCAPE_SEMICOLON} ${_ESCAPE_VARIABLE})
> > ++      _STRING_ESCAPE(_delimiter "${delimiter}" ${_NOESCAPE_SEMICOLON} ${_ESCAPE_VARIABLE})
> > ++      SET(_str_list "")
> > ++      SET(_token_count 1)
> > ++
> > ++      WHILE(NOT _token_count EQUAL _max_tokens)
> > ++          STRING_SPLIT_2(_token _str "${_delimiter}" "${_str}")
> > ++          #MESSAGE("_token_count=${_token_count} _max_tokens=${_max_tokens} _token=${_token} _str=${_str}")
> > ++          MATH(EXPR _token_count ${_token_count}+1)
> > ++          LIST(APPEND _str_list "${_token}")
> > ++          IF("${_str}" STREQUAL "")
> > ++              ## No more tokens
> > ++              BREAK()
> > ++          ENDIF("${_str}" STREQUAL "")
> > ++      ENDWHILE(NOT _token_count EQUAL _max_tokens)
> > ++
> > ++      IF(NOT "x${_str}" STREQUAL "x")
> > ++          ## Append last part
> > ++          LIST(APPEND _str_list "${_str}")
> > ++      ENDIF(NOT "x${_str}" STREQUAL "x")
> > ++
> > ++      # Unencoding
> > ++      _STRING_UNESCAPE(${var} "${_str_list}" ${_NOESCAPE_SEMICOLON} ${_ESCAPE_VARIABLE})
> > ++      #MESSAGE("***STRING_SPLIT: tokens=${${var}}")
> > ++    ENDMACRO(STRING_SPLIT var delimiter str)
> > ++
> > ++ENDIF(NOT DEFINED _MANAGE_STRING_CMAKE_)
> > ++
> > +--- /dev/null
> > ++++ b/Modules/ManageTarget.cmake
> > +@@ -0,0 +1,40 @@
> > ++# - Modules for managing targets and outputs.
> > ++#
> > ++# Defines following macros:
> > ++#   ADD_CUSTOM_TARGET_COMMAND(target OUTPUT file1 [file2 ..] COMMAND
> > ++#   command1 ...)
> > ++#   - Combine ADD_CUSTOM_TARGET and ADD_CUSTOM_COMMAND.
> > ++#     Always build when making the target, also specify the output files
> > ++#     Arguments:
> > ++#     + target: target for this command
> > ++#     + file1, file2 ... : Files to be outputted by this command
> > ++#     + command1 ... : Command to be run. The rest arguments are same with
> > ++#                      ADD_CUSTOM_TARGET.
> > ++#
> > ++
> > ++IF(NOT DEFINED _MANAGE_TARGET_CMAKE_)
> > ++    SET(_MANAGE_TARGET_CMAKE_ "DEFINED")
> > ++    MACRO(ADD_CUSTOM_TARGET_COMMAND target OUTPUT)
> > ++      SET(_outputFileList "")
> > ++      SET(_optionList "")
> > ++      SET(_outputFileMode 1)
> > ++      FOREACH(_t ${ARGN})
> > ++          IF(_outputFileMode)
> > ++              IF(_t STREQUAL "COMMAND")
> > ++                  SET(_outputFileMode 0)
> > ++                  LIST(APPEND _optionList "${_t}")
> > ++              ELSE(_t STREQUAL "COMMAND")
> > ++                  LIST(APPEND _outputFileList "${_t}")
> > ++              ENDIF(_t STREQUAL "COMMAND")
> > ++          ELSE(_outputFileMode)
> > ++              LIST(APPEND _optionList "${_t}")
> > ++          ENDIF(_outputFileMode)
> > ++      ENDFOREACH(_t ${ARGN})
> > ++      #MESSAGE("ADD_CUSTOM_TARGET(${target} ${_optionList})")
> > ++      ADD_CUSTOM_TARGET(${target} ${_optionList})
> > ++      #MESSAGE("ADD_CUSTOM_COMMAND(OUTPUT ${_outputFileList}  ${_optionList})")
> > ++      ADD_CUSTOM_COMMAND(OUTPUT ${_outputFileList}  ${_optionList})
> > ++    ENDMACRO(ADD_CUSTOM_TARGET_COMMAND)
> > ++
> > ++ENDIF(NOT DEFINED _MANAGE_TARGET_CMAKE_)
> > ++
> > +--- /dev/null
> > ++++ b/Modules/ManageTranslation.cmake
> > +@@ -0,0 +1,305 @@
> > ++# - Software Translation support
> > ++# This module supports software translation by:
> > ++#   1) Creates gettext related targets.
> > ++#   2) Communicate to Zanata servers.
> > ++#
> > ++# Defines following targets:
> > ++#   + translations: Make the translation files.
> > ++#     This target itself does nothing but provide a target for others to
> > ++#     depend on.
> > ++#     If macro MANAGE_GETTEXT is used, then it depends on the target gmo_files.
> > ++#
> > ++# Defines following variables:
> > ++#   + XGETTEXT_OPTIONS_C: Usual xgettext options for C programs.
> > ++#
> > ++# Defines following macros:
> > ++#   MANAGE_GETTEXT [ALL] SRCS src1 [src2 [...]]
> > ++#     [LOCALES locale1 [locale2 [...]]]
> > ++#     [POTFILE potfile]
> > ++#     [XGETTEXT_OPTIONS xgettextOpt]]
> > ++#     )
> > ++#   - Provide Gettext support like pot file generation and
> > ++#     gmo file generation.
> > ++#     You can specify supported locales with LOCALES ...
> > ++#     or omit the locales to use all the po files.
> > ++#
> > ++#     Arguments:
> > ++#     + ALL: (Optional) make target "all" depends on gettext targets.
> > ++#     + SRCS src1 [src2 [...]]: File list of source code that contains msgid.
> > ++#     + LOCALES locale1 [local2 [...]]:(optional) Locale list to be generated.
> > ++#       Currently, only the format: lang_Region (such as fr_FR) is supported.
> > ++#     + POTFILE potFile: (optional) pot file to be referred.
> > ++#       Default: ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pot
> > ++#     + XGETTEXT_OPTIONS xgettextOpt: (optional) xgettext_options.
> > ++#       Default: ${XGETTEXT_OPTIONS_C}
> > ++#     Defines following variables:
> > ++#     + GETTEXT_MSGMERGE_CMD: the full path to the msgmerge tool.
> > ++#     + GETTEXT_MSGFMT_CMD: the full path to the msgfmt tool.
> > ++#     + XGETTEXT_CMD: the full path to the xgettext.
> > ++#     Targets:
> > ++#     + pot_file: Generate the pot_file.
> > ++#     + gmo_files: Converts input po files into the binary output mo files.
> > ++#
> > ++#   MANAGE_ZANATA(serverUrl [YES])
> > ++#   - Use Zanata (was flies) as translation service.
> > ++#     Arguments:
> > ++#     + serverUrl: The URL of Zanata server
> > ++#     + YES: Assume yes for all questions.
> > ++#     Reads following variables:
> > ++#     + ZANATA_XML_FILE: Path to zanata.xml
> > ++#       Default:${CMAKE_CURRENT_SOURCE_DIR}/zanata.xml
> > ++#     + ZANATA_INI_FILE: Path to zanata.ini
> > ++#       Default:${CMAKE_CURRENT_SOURCE_DIR}/zanata.xml
> > ++#     + ZANATA_PUSH_OPTIONS: Options for zanata push
> > ++#     + ZANATA_PULL_OPTIONS: Options for zanata pull
> > ++#     Targets:
> > ++#     + zanata_project_create: Create project with PROJECT_NAME in zanata
> > ++#       server.
> > ++#     + zanata_version_create: Create version PRJ_VER in zanata server.
> > ++#     + zanata_push: Push source messages to zanata server
> > ++#     + zanata_push_trans: Push source messages and translations to zanata server.
> > ++#     + zanata_pull: Pull translations from zanata server.
> > ++#
> > ++
> > ++
> > ++IF(NOT DEFINED _MANAGE_TRANSLATION_CMAKE_)
> > ++    SET(_MANAGE_TRANSLATION_CMAKE_ "DEFINED")
> > ++    SET(XGETTEXT_OPTIONS_C
> > ++      --language=C --keyword=_ --keyword=N_ --keyword=C_:1c,2 --keyword=NC_:1c,2 -s
> > ++      --package-name=${PROJECT_NAME} --package-version=${PRJ_VER})
> > ++    SET(MANAGE_TRANSLATION_GETTEXT_MSGMERGE_OPTIONS "--indent" "--update" "--backup=none" CACHE STRING "msgmerge options")
> > ++    SET_DIRECTORY_PROPERTIES(PROPERTIES CLEAN_NO_CUSTOM "1")
> > ++
> > ++    INCLUDE(ManageMessage)
> > ++    IF(NOT TARGET translations)
> > ++      ADD_CUSTOM_TARGET(translations
> > ++          COMMENT "Making translations"
> > ++          )
> > ++    ENDIF(NOT TARGET translations)
> > ++
> > ++    #========================================
> > ++    # GETTEXT support
> > ++
> > ++    MACRO(MANAGE_GETTEXT_INIT)
> > ++      FIND_PROGRAM(XGETTEXT_CMD xgettext)
> > ++      IF(XGETTEXT_CMD STREQUAL "XGETTEXT_CMD-NOTFOUND")
> > ++          SET(_gettext_dependency_missing 1)
> > ++          M_MSG(${M_OFF} "xgettext not found! gettext support disabled.")
> > ++      ENDIF(XGETTEXT_CMD STREQUAL "XGETTEXT_CMD-NOTFOUND")
> > ++
> > ++      FIND_PROGRAM(GETTEXT_MSGMERGE_CMD msgmerge)
> > ++      IF(GETTEXT_MSGMERGE_CMD STREQUAL "GETTEXT_MSGMERGE_CMD-NOTFOUND")
> > ++          SET(_gettext_dependency_missing 1)
> > ++          M_MSG(${M_OFF} "msgmerge not found! gettext support disabled.")
> > ++      ENDIF(GETTEXT_MSGMERGE_CMD STREQUAL "GETTEXT_MSGMERGE_CMD-NOTFOUND")
> > ++
> > ++      FIND_PROGRAM(GETTEXT_MSGFMT_CMD msgfmt)
> > ++      IF(GETTEXT_MSGFMT_CMD STREQUAL "GETTEXT_MSGFMT_CMD-NOTFOUND")
> > ++          SET(_gettext_dependency_missing 1)
> > ++          M_MSG(${M_OFF} "msgfmt not found! gettext support disabled.")
> > ++      ENDIF(GETTEXT_MSGFMT_CMD STREQUAL "GETTEXT_MSGFMT_CMD-NOTFOUND")
> > ++
> > ++    ENDMACRO(MANAGE_GETTEXT_INIT)
> > ++
> > ++    FUNCTION(MANAGE_GETTEXT)
> > ++      SET(_gettext_dependency_missing 0)
> > ++      MANAGE_GETTEXT_INIT()
> > ++      IF(NOT _gettext_dependency_missing)
> > ++          SET(_stage "")
> > ++          SET(_all "")
> > ++          SET(_srcList "")
> > ++          SET(_srcList_abs "")
> > ++          SET(_localeList "")
> > ++          SET(_potFile "")
> > ++          SET(_xgettext_option_list "")
> > ++          FOREACH(_arg ${ARGN})
> > ++              IF(_arg STREQUAL "ALL")
> > ++                  SET(_all "ALL")
> > ++              ELSEIF(_arg STREQUAL "SRCS")
> > ++                  SET(_stage "SRCS")
> > ++              ELSEIF(_arg STREQUAL "LOCALES")
> > ++                  SET(_stage "LOCALES")
> > ++              ELSEIF(_arg STREQUAL "XGETTEXT_OPTIONS")
> > ++                  SET(_stage "XGETTEXT_OPTIONS")
> > ++              ELSEIF(_arg STREQUAL "POTFILE")
> > ++                  SET(_stage "POTFILE")
> > ++              ELSE(_arg STREQUAL "ALL")
> > ++                  IF(_stage STREQUAL "SRCS")
> > ++                      FILE(RELATIVE_PATH _relFile ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${_arg})
> > ++                      LIST(APPEND _srcList ${_relFile})
> > ++                      GET_FILENAME_COMPONENT(_absPoFile ${_arg} ABSOLUTE)
> > ++                      LIST(APPEND _srcList_abs ${_absPoFile})
> > ++                  ELSEIF(_stage STREQUAL "LOCALES")
> > ++                      LIST(APPEND _localeList ${_arg})
> > ++                  ELSEIF(_stage STREQUAL "XGETTEXT_OPTIONS")
> > ++                      LIST(APPEND _xgettext_option_list ${_arg})
> > ++                  ELSEIF(_stage STREQUAL "POTFILE")
> > ++                      SET(_potFile "${_arg}")
> > ++                  ELSE(_stage STREQUAL "SRCS")
> > ++                      M_MSG(${M_WARN} "MANAGE_GETTEXT: not recognizing arg ${_arg}")
> > ++                  ENDIF(_stage STREQUAL "SRCS")
> > ++              ENDIF(_arg STREQUAL "ALL")
> > ++          ENDFOREACH(_arg ${ARGN})
> > ++
> > ++          # Default values
> > ++          IF(_xgettext_option_list STREQUAL "")
> > ++              SET(_xgettext_option_list ${XGETTEXT_OPTIONS_C})
> > ++          ENDIF(_xgettext_option_list STREQUAL "")
> > ++
> > ++          IF(_potFile STREQUAL "")
> > ++              SET(_potFile "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pot")
> > ++          ENDIF(_potFile STREQUAL "")
> > ++
> > ++          IF(NOT _localeList)
> > ++              FILE(GLOB _poFiles "*.po")
> > ++              FOREACH(_poFile ${_poFiles})
> > ++                  GET_FILENAME_COMPONENT(_locale "${_poFile}" NAME_WE)
> > ++                  LIST(APPEND _localeList "${_locale}")
> > ++              ENDFOREACH(_poFile ${_poFiles})
> > ++          ENDIF(NOT _localeList)
> > ++
> > ++          M_MSG(${M_INFO2} "XGETTEXT=${XGETTEXT_CMD} ${_xgettext_option_list} -o ${_potFile} ${_srcList}")
> > ++          ADD_CUSTOM_COMMAND(OUTPUT ${_potFile}
> > ++              COMMAND ${XGETTEXT_CMD} ${_xgettext_option_list} -o ${_potFile} ${_srcList}
> > ++              DEPENDS ${_srcList_abs}
> > ++              WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
> > ++              COMMENT "Extract translatable messages to ${_potFile}"
> > ++              )
> > ++
> > ++          ADD_CUSTOM_TARGET(pot_file ${_all}
> > ++              DEPENDS ${_potFile}
> > ++              )
> > ++
> > ++          ### Generating gmo files
> > ++          SET(_gmoFileList "")
> > ++          SET(_absGmoFileList "")
> > ++          SET(_absPoFileList "")
> > ++          GET_FILENAME_COMPONENT(_potBasename ${_potFile} NAME_WE)
> > ++          GET_FILENAME_COMPONENT(_potDir ${_potFile} PATH)
> > ++          GET_FILENAME_COMPONENT(_absPotFile ${_potFile} ABSOLUTE)
> > ++          GET_FILENAME_COMPONENT(_absPotDir ${_absPotFile} PATH)
> > ++          FOREACH(_locale ${_localeList})
> > ++              SET(_absGmoFile ${_absPotDir}/${_locale}.gmo)
> > ++              SET(_absPoFile ${_absPotDir}/${_locale}.po)
> > ++
> > ++              ADD_CUSTOM_COMMAND(OUTPUT ${_absPoFile}
> > ++                  COMMAND ${GETTEXT_MSGMERGE_CMD}
> > ++                  ${MANAGE_TRANSLATION_GETTEXT_MSGMERGE_OPTIONS} ${_absPoFile} ${_potFile}
> > ++                  DEPENDS ${_potFile}
> > ++                  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
> > ++                  COMMENT "${GETTEXT_MSGMERGE_CMD} ${MANAGE_TRANSLATION_GETTEXT_MSGMERGE_OPTIONS} ${_absPoFile} ${_potFile}"
> > ++                  )
> > ++
> > ++              ADD_CUSTOM_COMMAND(OUTPUT ${_absGmoFile}
> > ++                  COMMAND ${GETTEXT_MSGFMT_CMD} -o ${_absGmoFile} ${_absPoFile}
> > ++                  DEPENDS ${_absPoFile}
> > ++                  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
> > ++                  COMMENT "${GETTEXT_MSGFMT_CMD} -o ${_absGmoFile} ${_absPoFile}"
> > ++                  )
> > ++
> > ++              #MESSAGE("_absPoFile=${_absPoFile} _absPotDir=${_absPotDir} _lang=${_lang} curr_bin=${CMAKE_CURRENT_BINARY_DIR}")
> > ++              INSTALL(FILES ${_absGmoFile} DESTINATION share/locale/${_locale}/LC_MESSAGES RENAME ${_potBasename}.mo)
> > ++              LIST(APPEND _absGmoFileList ${_absGmoFile})
> > ++              LIST(APPEND _absPoFileList ${_absPoFile})
> > ++          ENDFOREACH(_locale ${_localeList})
> > ++          SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${_absGmoFileList};${_potFile}" )
> > ++
> > ++          SET(MANAGE_TRANSLATION_GETTEXT_PO_FILES ${_absPoFileList} CACHE STRING "PO files")
> > ++
> > ++          ADD_CUSTOM_TARGET(gmo_files ${_all}
> > ++              DEPENDS ${_absGmoFileList}
> > ++              COMMENT "Generate gmo files for translation"
> > ++              )
> > ++
> > ++          ADD_DEPENDENCIES(translations gmo_files)
> > ++      ENDIF(NOT _gettext_dependency_missing)
> > ++    ENDFUNCTION(MANAGE_GETTEXT)
> > ++
> > ++
> > ++    #========================================
> > ++    # ZANATA support
> > ++    MACRO(MANAGE_ZANATA serverUrl)
> > ++      SET(ZANATA_SERVER "${serverUrl}")
> > ++      FIND_PROGRAM(ZANATA_CMD zanata)
> > ++      SET(_manage_zanata_dependencies_missing 0)
> > ++      IF(ZANATA_CMD STREQUAL "ZANATA_CMD-NOTFOUND")
> > ++          SET(_manage_zanata_dependencies_missing 1)
> > ++          M_MSG(${M_OFF} "zanata (python client) not found! zanata support disabled.")
> > ++      ENDIF(ZANATA_CMD STREQUAL "ZANATA_CMD-NOTFOUND")
> > ++
> > ++      SET(ZANATA_XML_FILE "${CMAKE_CURRENT_SOURCE_DIR}/zanata.xml" CACHE FILEPATH "zanata.xml")
> > ++      IF(NOT EXISTS "${ZANATA_XML_FILE}")
> > ++          SET(_manage_zanata_dependencies_missing 1)
> > ++          M_MSG(${M_OFF} "zanata.xml is not found! Zanata support disabled.")
> > ++      ENDIF(NOT EXISTS "${ZANATA_XML_FILE}")
> > ++
> > ++      SET(ZANATA_INI_FILE "$ENV{HOME}/.config/zanata.ini" CACHE FILEPATH "zanata.ni")
> > ++      IF(NOT EXISTS "${ZANATA_INI_FILE}")
> > ++          SET(_manage_zanata_dependencies_missing 1)
> > ++          M_MSG(${M_OFF} "zanata.ini is not found! Zanata support disabled.")
> > ++      ENDIF(NOT EXISTS "${ZANATA_INI_FILE}")
> > ++
> > ++      IF(NOT _manage_zanata_dependencies_missing)
> > ++          SET(_zanata_args --url "${ZANATA_SERVER}"
> > ++              --project-config "${ZANATA_XML_FILE}" --user-config "${ZANATA_INI_FILE}")
> > ++
> > ++          # Parsing arguments
> > ++          SET(_yes "")
> > ++          FOREACH(_arg ${ARGN})
> > ++              IF(_arg STREQUAL "YES")
> > ++                  SET(_yes "yes" "|")
> > ++              ENDIF(_arg STREQUAL "YES")
> > ++          ENDFOREACH(_arg ${ARGN})
> > ++
> > ++          ADD_CUSTOM_TARGET(zanata_project_create
> > ++              COMMAND ${ZANATA_CMD} project create ${PROJECT_NAME} ${_zanata_args}
> > ++              --project-name "${PROJECT_NAME}" --project-desc "${PRJ_SUMMARY}"
> > ++              COMMENT "Creating project ${PROJECT_NAME} on Zanata server ${serverUrl}"
> > ++              VERBATIM
> > ++              )
> > ++
> > ++          ADD_CUSTOM_TARGET(zanata_version_create
> > ++              COMMAND ${ZANATA_CMD} version create
> > ++              ${PRJ_VER} ${_zanata_args} --project-id "${PROJECT_NAME}"
> > ++              COMMENT "Creating version ${PRJ_VER} on Zanata server ${serverUrl}"
> > ++              VERBATIM
> > ++              )
> > ++
> > ++          SET(_po_files_depend "")
> > ++          IF(MANAGE_TRANSLATION_GETTEXT_PO_FILES)
> > ++              SET(_po_files_depend "DEPENDS" ${MANAGE_TRANSLATION_GETTEXT_PO_FILES})
> > ++          ENDIF(MANAGE_TRANSLATION_GETTEXT_PO_FILES)
> > ++          # Zanata push
> > ++          ADD_CUSTOM_TARGET(zanata_push
> > ++              COMMAND ${_yes}
> > ++              ${ZANATA_CMD} push ${_zanata_args} ${ZANATA_PUSH_OPTIONS}
> > ++              ${_po_files_depend}
> > ++              COMMENT "Push source messages to zanata server ${ZANATA_SERVER}"
> > ++              VERBATIM
> > ++              )
> > ++          ADD_DEPENDENCIES(zanata_push pot_file)
> > ++
> > ++          # Zanata push with translation
> > ++          ADD_CUSTOM_TARGET(zanata_push_trans
> > ++              COMMAND ${_yes}
> > ++              ${ZANATA_CMD} push ${_zanata_args} --push-type both ${ZANATA_PUSH_OPTIONS}
> > ++              ${_po_files_depend}
> > ++              COMMENT "Push source messages and translations to zanata server ${ZANATA_SERVER}"
> > ++              VERBATIM
> > ++              )
> > ++
> > ++          ADD_DEPENDENCIES(zanata_push_trans pot_file)
> > ++
> > ++          # Zanata pull
> > ++          ADD_CUSTOM_TARGET(zanata_pull
> > ++              COMMAND ${_yes}
> > ++              ${ZANATA_CMD} pull ${_zanata_args} ${ZANATA_PULL_OPTIONS}
> > ++              COMMENT "Pull translations fro zanata server ${ZANATA_SERVER}"
> > ++              VERBATIM
> > ++              )
> > ++
> > ++      ENDIF(NOT _manage_zanata_dependencies_missing)
> > ++    ENDMACRO(MANAGE_ZANATA serverUrl)
> > ++
> > ++ENDIF(NOT DEFINED _MANAGE_TRANSLATION_CMAKE_)
> > ++
> > +--- /dev/null
> > ++++ b/Modules/ManageUninstall.cmake
> > +@@ -0,0 +1,28 @@
> > ++# - Uninstall target.
> > ++# Use this module to provide uninstall target.
> > ++#
> > ++# Define following targets
> > ++#   uninstall: For uninstalling the package.
> > ++#
> > ++
> > ++IF(NOT DEFINED _MANAGE_UNINSTALL_CMAKE_)
> > ++    SET(_MANAGE_UNINSTALL_CMAKE_ "DEFINED")
> > ++    SET(CMAKE_UNINSTALL_IN_SEARCH_PATH ${CMAKE_MODULE_PATH} ${CMAKE_ROOT}/Modules ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/Modules)
> > ++    FIND_FILE(CMAKE_UNINSTALL_IN cmake_uninstall.cmake.in
> > ++      PATHS ${CMAKE_UNINSTALL_IN_SEARCH_PATH})
> > ++
> > ++    # MESSAGE("CMAKE_UNINSTALL_IN=${CMAKE_UNINSTALL_IN}")
> > ++    IF(CMAKE_UNINSTALL_IN STREQUAL "CMAKE_UNINSTALL_IN-NOTFOUND")
> > ++      MESSAGE(FATAL_ERROR "Cannot find cmake_uninstall.cmake.in in"
> > ++          "${CMAKE_UNINSTALL_IN_SEARCH_PATH}")
> > ++    ENDIF(CMAKE_UNINSTALL_IN STREQUAL "CMAKE_UNINSTALL_IN-NOTFOUND")
> > ++
> > ++    CONFIGURE_FILE("${CMAKE_UNINSTALL_IN}"
> > ++      "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
> > ++      IMMEDIATE @ONLY)
> > ++
> > ++    ADD_CUSTOM_TARGET(uninstall
> > ++      "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
> > ++      )
> > ++ENDIF(NOT DEFINED _MANAGE_UNINSTALL_CMAKE_)
> > ++
> > +--- /dev/null
> > ++++ b/Modules/ManageUpload.cmake
> > +@@ -0,0 +1,184 @@
> > ++# - Upload files to hosting services.
> > ++# You can either use sftp, scp or supply custom command for upload.
> > ++# The custom command should be in following format:
> > ++#    cmd [OPTIONS] [url]
> > ++#
> > ++# This module defines following macros:
> > ++#   MACRO(MANAGE_UPLOAD_MAKE_TARGET varPrefix fileAlias [uploadOptions])
> > ++#   - Make a target for upload files.
> > ++#     If <varPrefix>_HOST_ALIAS is not empty, the target is
> > ++#     upload_${${varPrefix}_HOST_ALIAS}_${fileAlias}, otherwise, the target is
> > ++#     upload_${${varPrefix}_HOST_ALIAS}_${fileAlias}
> > ++#     Arguments:
> > ++#     + varPrefix: Variable prefix
> > ++#     + fileAlias: File alias which will be used as part of target name
> > ++#     + uploadOptions: Options for the upload command
> > ++#     Reads following variables:
> > ++#     + <varPrefix>_CMD: Upload command
> > ++#     + <varPrefix>_DEPENDS: Extra files that the upload load target depends on.
> > ++#     + <varPrefix>_HOST_ALIAS: (Optional) Host alias which will be used as part of target name.
> > ++#     + <varPrefix>_HOST_URL: Host URL
> > ++#     + <varPrefix>_REMOTE_DIR: (Optional) Remote dir/
> > ++#     + <varPrefix>_UPLOAD_FILES: Files to be uploaded. The target depends on these files.
> > ++#     + <varPrefix>_UPLOAD_OPTIONS: Options for upload command.
> > ++#     + <varPrefix>_USER: (Optional) User for uploading
> > ++#
> > ++# This module defines following macros:
> > ++#   MANAGE_UPLOAD_CMD(cmd fileAlias [USER user] [HOST_URL hostUrl]
> > ++#     [HOST_ALIAS hostAlias] [UPLOAD_FILES files] [REMOTE_DIR remoteDir]
> > ++#     [UPLOAD_OPTIONS options] [DEPENDS files])
> > ++#   - Make a upload target for a upload command
> > ++#     Arguments:
> > ++#     + cmd: Command to do the
> > ++#     + fileAlias: File alias which will be used as part of target name
> > ++#     + DEPENDS files: Extra files that the upload load target depends on.
> > ++#     + HOST_ALIAS hostAlias: (Optional) Host alias which will be used as part of target name.
> > ++#     + HOST_URL hostUrl: Host URL
> > ++#     + REMOTE_DIR remoteDir: (Optional) Remote dir/
> > ++#     + UPLOAD_FILES files : Files to be uploaded. The target depends on these files.
> > ++#     + UPLOAD_OPTIONS options: Options for upload command.
> > ++#     + USER user: (Optional) User for uploading
> > ++#
> > ++#   MANAGE_UPLOAD_SFTP(fileAlias [USER user] [HOST_URL hostUrl]
> > ++#     [HOST_ALIAS hostAlias] [UPLOAD_FILES files] [REMOTE_DIR remoteDir]
> > ++#     [UPLOAD_OPTIONS options] [DEPENDS files])
> > ++#   - Make a upload target for sftp
> > ++#     Arguments: See section MANAGE_UPLOAD_CMD
> > ++#
> > ++#   MANAGE_UPLOAD_SCP(fileAlias [USER user] [HOST_URL hostUrl]
> > ++#     [HOST_ALIAS hostAlias] [UPLOAD_FILES files] [REMOTE_DIR remoteDir]
> > ++#     [UPLOAD_OPTIONS options] [DEPENDS files])
> > ++#   - Make a upload target for scp
> > ++#     Arguments: See section MANAGE_UPLOAD_CMD
> > ++#
> > ++#   MANAGE_UPLOAD_FEDORAHOSTED(fileAlias [USER user]
> > ++#     [UPLOAD_FILES files] [REMOTE_DIR remoteDir]
> > ++#     [UPLOAD_OPTIONS options] [DEPENDS files])
> > ++#   - Make a upload target for uploading to FedoraHosted
> > ++#     Arguments: See section MANAGE_UPLOAD_CMD
> > ++#
> > ++#   MANAGE_UPLOAD_SOURCEFORGE(fileAlias [USER user]
> > ++#     [UPLOAD_FILES files] [REMOTE_DIR remoteDir]
> > ++#     [UPLOAD_OPTIONS options] [DEPENDS files])
> > ++#   - Make a upload target for uploading to SourceForge
> > ++#     Arguments: See section MANAGE_UPLOAD_CMD
> > ++#
> > ++#
> > ++
> > ++IF(NOT DEFINED _MANAGE_UPLOAD_CMAKE_)
> > ++    SET(_MANAGE_UPLOAD_CMAKE_ "DEFINED")
> > ++    INCLUDE(ManageMessage)
> > ++
> > ++    # MANAGE_UPLOAD_GET_OPTIONS cmd [USER user] [HOST_URL hostUrl] [HOST_ALIAS hostAlias]
> > ++    #  [UPLOAD_FILES files] [REMOTE_DIR remoteDir] [UPLOAD_OPTIONS sftpOptions] [DEPENDS files]
> > ++
> > ++    MACRO(_MANAGE_UPLOAD_GET_OPTIONS varList varPrefix)
> > ++      SET(_optName "")        ## OPTION name
> > ++      SET(_opt "")            ## Variable that hold option values
> > ++      SET(VALID_OPTIONS "USER" "HOST_URL" "HOST_ALIAS" "UPLOAD_FILES" "REMOTE_DIR" "UPLOAD_OPTIONS" "DEPENDS")
> > ++      FOREACH(_arg ${ARGN})
> > ++          LIST(FIND VALID_OPTIONS "${_arg}" _optIndex)
> > ++          IF(_optIndex EQUAL -1)
> > ++              IF(NOT _optName STREQUAL "")
> > ++                  ## Append to existing variable
> > ++                  LIST(APPEND ${_opt} "${_arg}")
> > ++                  SET(${_opt} "${_opt}" PARENT_SCOPE)
> > ++              ENDIF(NOT _optName STREQUAL "")
> > ++          ELSE(_optIndex EQUAL -1)
> > ++              ## Obtain option name and variable name
> > ++              LIST(GET VALID_OPTIONS  ${_optIndex} _optName)
> > ++              SET(_opt "${varPrefix}_${_optName}")
> > ++
> > ++              ## If variable is not in varList, then set cache and add it to varList
> > ++              LIST(FIND ${varList} "${_opt}" _varIndex)
> > ++              IF(_varIndex EQUAL -1)
> > ++                  SET(${_opt} "" PARENT_SCOPE)
> > ++                  LIST(APPEND ${varList} "${_opt}")
> > ++              ENDIF(_varIndex EQUAL -1)
> > ++          ENDIF(_optIndex EQUAL -1)
> > ++      ENDFOREACH(_arg ${ARGN})
> > ++    ENDMACRO(_MANAGE_UPLOAD_GET_OPTIONS varPrefix varList)
> > ++
> > ++    MACRO(MANAGE_UPLOAD_MAKE_TARGET varPrefix fileAlias)
> > ++      SET(_target "upload")
> > ++      IF(NOT "${varPrefix}_HOST_ALIAS" STREQUAL "")
> > ++          SET(_target "${_target}_${${varPrefix}_HOST_ALIAS}")
> > ++      ENDIF(NOT "${varPrefix}_HOST_ALIAS" STREQUAL "")
> > ++      SET(_target "${_target}_${fileAlias}")
> > ++
> > ++      ## Determine url for upload
> > ++      IF(NOT "${varPrefix}_HOST_URL" STREQUAL "")
> > ++          IF("${varPrefix}_USER" STREQUAL "")
> > ++              SET(UPLOAD_URL "${${varPrefix}_USER}@${${varPrefix}_HOST_URL}")
> > ++          ELSE("${varPrefix}_USER" STREQUAL "")
> > ++              SET(UPLOAD_URL "${${varPrefix}_HOST_URL}")
> > ++          ENDIF("${varPrefix}_USER" STREQUAL "")
> > ++      ELSE(NOT "${varPrefix}_HOST_URL" STREQUAL "")
> > ++          SET(UPLOAD_URL "")
> > ++      ENDIF(NOT "${varPrefix}_HOST_URL" STREQUAL "")
> > ++
> > ++      IF(NOT "${varPrefix}_REMOTE_DIR" STREQUAL "")
> > ++          SET(UPLOAD_URL "${UPLOAD_URL}:${${varPrefix}_REMOTE_DIR}")
> > ++      ENDIF(NOT "${varPrefix}_REMOTE_DIR" STREQUAL "")
> > ++
> > ++      ADD_CUSTOM_TARGET(${_target}
> > ++          COMMAND ${${varPrefix}_UPLOAD_CMD} ${${varPrefix}_UPLOAD_OPTIONS} ${ARGN} ${UPLOAD_URL}
> > ++          DEPENDS ${${varPrefix}_UPLOAD_FILES} ${${varPrefix}_DEPENDS}
> > ++          ${_DEPENDS}
> > ++          COMMENT "${${varPrefix}_HOST_ALIAS} uploading ${fileAlias}."
> > ++          VERBATIM
> > ++          )
> > ++    ENDMACRO(MANAGE_UPLOAD_MAKE_TARGET varPrefix fileAlias)
> > ++
> > ++    FUNCTION(MANAGE_UPLOAD_CMD cmd fileAlias)
> > ++      FIND_PROGRAM(UPLOAD_CMD "${cmd}")
> > ++      IF(UPLOAD_CMD STREQUAL "UPLOAD_CMD-NOTFOUND")
> > ++          M_MSG(${M_OFF} "Program ${cmd} is not found! Upload with ${cmd} disabled.")
> > ++      ELSE(UPLOAD_CMD STREQUAL "UPLOAD_CMD-NOTFOUND")
> > ++          _MANAGE_UPLOAD_GET_OPTIONS(varList "upload_${fileAlias}" ${ARGN})
> > ++          SET(upload_UPLOAD_CMD ${UPLOAD_CMD})
> > ++          MANAGE_UPLOAD_MAKE_TAGET("upload" "${fileAlias}")
> > ++      ENDIF(UPLOAD_CMD STREQUAL "UPLOAD_CMD-NOTFOUND")
> > ++    ENDFUNCTION(MANAGE_UPLOAD_CMD cmd fileAlias)
> > ++
> > ++    FUNCTION(MANAGE_UPLOAD_SFTP fileAlias)
> > ++      MANAGE_UPLOAD_CMD(sftp ${fileAlias} ${ARGN})
> > ++    ENDFUNCTION(MANAGE_UPLOAD_SFTP fileAlias)
> > ++
> > ++    FUNCTION(MANAGE_UPLOAD_SCP fileAlias)
> > ++      MANAGE_UPLOAD_CMD(scp ${fileAlias} ${ARGN})
> > ++    ENDFUNCTION(MANAGE_UPLOAD_SCP fileAlias)
> > ++
> > ++    #MACRO(MANAGE_UPLOAD_GOOGLE_UPLOAD)
> > ++    # FIND_PROGRAM(CURL_CMD curl)
> > ++    # IF(CURL_CMD STREQUAL "CURL_CMD-NOTFOUND")
> > ++    #     MESSAGE(FATAL_ERROR "Need curl to perform google upload")
> > ++    # ENDIF(CURL_CMD STREQUAL "CURL_CMD-NOTFOUND")
> > ++    #ENDMACRO(MANAGE_UPLOAD_GOOGLE_UPLOAD)
> > ++    FUNCTION(MANAGE_UPLOAD_FEDORAHOSTED fileAlias)
> > ++      FIND_PROGRAM(fedorahosted_${fileAlias}_UPLOAD_CMD "scp")
> > ++      IF(fedorahosted_${fileAlias}_UPLOAD_CMD STREQUAL "fedorahosted_${fileAlias}_UPLOAD_CMD-NOTFOUND")
> > ++          M_MSG(${M_OFF} "Program ${cmd} is not found! Upload with fedorahost disabled.")
> > ++      ELSE(fedorahosted_${fileAlias}_UPLOAD_CMD STREQUAL "fedorahosted_${fileAlias}_UPLOAD_CMD-NOTFOUND")
> > ++          _MANAGE_UPLOAD_GET_OPTIONS(varList "fedorahosted_${fileAlias}" HOST_ALIAS "fedorahosted"
> > ++              HOST_URL "fedorahosted.org" REMOTE_DIR  "${PROJECT_NAME}" ${ARGN})
> > ++      MANAGE_UPLOAD_MAKE_TARGET("fedorahosted_${fileAlias}" "${fileAlias}" ${fedorahosted_${fileAlias}_UPLOAD_FILES})
> > ++      ENDIF(fedorahosted_${fileAlias}_UPLOAD_CMD STREQUAL "fedorahosted_${fileAlias}_UPLOAD_CMD-NOTFOUND")
> > ++    ENDFUNCTION(MANAGE_UPLOAD_FEDORAHOSTED fileAlias)
> > ++
> > ++    FUNCTION(MANAGE_UPLOAD_SOURCEFORGE_FILE_RELEASE fileAlias)
> > ++      FIND_PROGRAM(sourceforge_${fileAlias}_UPLOAD_CMD "sftp")
> > ++      IF(sourceforge_${fileAlias}_UPLOAD_CMD STREQUAL "sourceforge_${fileAlias}_UPLOAD_CMD-NOTFOUND")
> > ++          M_MSG(${M_OFF} "Program ${cmd} is not found! Upload with sourceforge disabled.")
> > ++      ELSE(sourceforge_${fileAlias}_UPLOAD_CMD STREQUAL "sourceforge_${fileAlias}_UPLOAD_CMD-NOTFOUND")
> > ++          _MANAGE_UPLOAD_GET_OPTIONS(varList "sourceforge_${fileAlias}" ${ARGN} HOST_ALIAS "sourceforge"
> > ++              HOST_URL "frs.sourceforge.net")
> > ++          IF(sourceforge_${fileAlias}_USER)
> > ++              SET(sourceforge_${fileAlias}_REMOTE_DIR "/home/frs/project/${PROJECT_NAME}")
> > ++          ENDIF(sourceforge_${fileAlias}_USER)
> > ++          SET("sourceforge_${fileAlias}_UPLOAD_CMD" "sftp")
> > ++      MANAGE_UPLOAD_MAKE_TARGET("sourceforge_${fileAlias}" "${fileAlias}")
> > ++    ENDIF(sourceforge_${fileAlias}_UPLOAD_CMD STREQUAL "sourceforge_${fileAlias}_UPLOAD_CMD-NOTFOUND")
> > ++    ENDFUNCTION(MANAGE_UPLOAD_SOURCEFORGE_FILE_RELEASE fileAlias)
> > ++ENDIF(NOT DEFINED _MANAGE_UPLOAD_CMAKE_)
> > ++
> > +--- /dev/null
> > ++++ b/Modules/ManageVariable.cmake
> > +@@ -0,0 +1,326 @@
> > ++# - Get or set variables from various sources.
> > ++#
> > ++# Includes:
> > ++#   ManageString
> > ++#
> > ++# Included by:
> > ++#   ManageVersion
> > ++#   PackRPM
> > ++#
> > ++# Defines following functions:
> > ++#   SETTING_STRING_GET_VARIABLE(var value str [NOUNQUOTE] [NOREPLACE] [setting_sign])
> > ++#     - Get a variable and a value from a setting in string format.
> > ++#       i.e.  VAR=Value
> > ++#       pattern. '#' is used for comment.
> > ++#       * Parameters:
> > ++#         + var: Variable name extracted from str.
> > ++#         + value: Value extracted from str
> > ++#         + str: String to be extracted variable and value from.
> > ++#         + NOUNQUOTE: (Optional) do not remove the double quote mark around the string.
> > ++#         + NOREPLACE (Optional) Without this parameter, this macro replaces
> > ++#           previous defined variables, use NOREPLACE to prevent this.
> > ++#         + NOESCAPE_SEMICOLON: (Optional) do not escape semicolons.
> > ++#         + setting_sign: (Optional) The symbol that separate attribute name and its value.
> > ++#           Default value: "="
> > ++#
> > ++# Defines following macros:
> > ++#   COMMAND_OUTPUT_TO_VARIABLE(var cmd)
> > ++#     - Store command output to a variable, without new line characters (\n and \r).
> > ++#       This macro is suitable for command that output one line result.
> > ++#       Note that the var will be set to ${var_name}-NOVALUE if cmd does not have
> > ++#       any output.
> > ++#       * Parameters:
> > ++#         var: A variable that stores the result.
> > ++#         cmd: A command.
> > ++#
> > ++#   SETTING_FILE_GET_VARIABLES_PATTERN(var attr_pattern setting_file [NOUNQUOTE] [NOREPLACE]
> > ++#     [NOESCAPE_SEMICOLON] [setting_sign])
> > ++#     - Get variable values from a setting file if their names matches given
> > ++#       pattern. '#' is used for comment.
> > ++#       * Parameters:
> > ++#         + var: Variable to store the attribute value.
> > ++#           Set to "" to set attribute under matched variable name.
> > ++#         + attr_pattern: Regex pattern of variable name.
> > ++#         + setting_file: Setting filename.
> > ++#         + NOUNQUOTE: (Optional) do not remove the double quote mark around the string.
> > ++#         + NOREPLACE (Optional) Without this parameter, this macro replaces
> > ++#           previous defined variables, use NOREPLACE to prevent this.
> > ++#         + NOESCAPE_SEMICOLON: (Optional) do not escape semicolons.
> > ++#         + setting_sign: (Optional) The symbol that separate attribute name and its value.
> > ++#           Default value: "="
> > ++#
> > ++#   SETTING_FILE_GET_ALL_VARIABLES(setting_file [NOUNQUOTE] [NOREPLACE]
> > ++#     [NOESCAPE_SEMICOLON] [setting_sign])
> > ++#     - Get all variable values from a setting file.
> > ++#       It is equivalent to:
> > ++#       SETTING_FILE_GET_VARIABLES_PATTERN("" "[A-Za-z_][A-Za-z0-9_]*"
> > ++#        "${setting_file}" ${ARGN})
> > ++#      '#' is used to comment out setting.
> > ++#       * Parameters:
> > ++#         + setting_file: Setting filename.
> > ++#         + NOUNQUOTE: (Optional) do not remove the double quote mark around the string.
> > ++#         + NOREPLACE (Optional) Without this parameter, this macro replaces
> > ++#           previous defined variables, use NOREPLACE to prevent this.
> > ++#         + NOESCAPE_SEMICOLON: (Optional) Do not escape semicolons.
> > ++#         + setting_sign: (Optional) The symbol that separate attribute name and its value.
> > ++#           Default value: "="
> > ++#
> > ++#   SETTING_FILE_GET_VARIABLE(var attr_name setting_file [NOUNQUOTE] [NOREPLACE]
> > ++#     [NOESCAPE_SEMICOLON] [setting_sign])
> > ++#     - Get a variable value from a setting file.
> > ++#       It is equivalent to:
> > ++#     SETTING_FILE_GET_VARIABLES_PATTERN(${var} "${attr_name}"
> > ++#         "${setting_file}" ${ARGN})
> > ++#      '#' is used to comment out setting.
> > ++#       * Parameters:
> > ++#         + var: Variable to store the attribute value.
> > ++#         + attr_name: Name of the variable.
> > ++#         + setting_file: Setting filename.
> > ++#         + NOUNQUOTE: (Optional) do not remove the double quote mark around the string.
> > ++#         + NOREPLACE (Optional) Without this parameter, this macro replaces
> > ++#           previous defined variables, use NOREPLACE to prevent this.
> > ++#         + NOESCAPE_SEMICOLON: (Optional) do not escape semicolons.
> > ++#         + setting_sign: (Optional) The symbol that separate attribute name and its value.
> > ++#           Default value: "="
> > ++#
> > ++#   SETTING_FILE_GET_ALL_VARIABLES(setting_file [NOUNQUOTE] [NOREPLACE]
> > ++#     [NOESCAPE_SEMICOLON] [setting_sign])
> > ++#     - Get all attribute values from a setting file.
> > ++#       '#' is used to comment out setting.
> > ++#       * Parameters:
> > ++#         + setting_file: Setting filename.
> > ++#         + NOUNQUOTE: (Optional) do not remove the double quote mark around the string.
> > ++#         + NOREPLACE (Optional) Without this parameter, this macro replaces
> > ++#           previous defined variables, use NOREPLACE to prevent this.
> > ++#         + NOESCAPE_SEMICOLON: (Optional) Do not escape semicolons.
> > ++#         + setting_sign: (Optional) The symbol that separate attribute name and its value.
> > ++#           Default value: "="
> > ++#
> > ++#   GET_ENV(var default_value [env])
> > ++#     - Get the value of a environment variable, or use default
> > ++#       if the environment variable does not exist or is empty.
> > ++#       * Parameters:
> > ++#         var: Variable to be set
> > ++#         default_value: Default value of the var
> > ++#         env: (Optional) The name of environment variable. Only need if different from var.
> > ++#
> > ++#   SET_VAR(var untrimmed_value)
> > ++#     - Trim an set the value to a variable.
> > ++#       * Parameters:
> > ++#         var: Variable to be set
> > ++#         untrimmed_value: Untrimmed values that may have space, \t, \n, \r in the front or back of the string.
> > ++#
> > ++
> > ++IF(NOT DEFINED _MANAGE_VARIABLE_CMAKE_)
> > ++    SET(_MANAGE_VARIABLE_CMAKE_ "DEFINED")
> > ++    INCLUDE(ManageString)
> > ++
> > ++    MACRO(COMMAND_OUTPUT_TO_VARIABLE var cmd)
> > ++      EXECUTE_PROCESS(
> > ++          COMMAND ${cmd} ${ARGN}
> > ++          OUTPUT_VARIABLE _cmd_output
> > ++          OUTPUT_STRIP_TRAILING_WHITESPACE
> > ++          )
> > ++      IF(_cmd_output)
> > ++          SET(${var} ${_cmd_output})
> > ++      ELSE(_cmd_output)
> > ++          SET(var "${var}-NOVALUE")
> > ++      ENDIF(_cmd_output)
> > ++      #SET(value ${${var}})
> > ++      #MESSAGE("var=${var} _cmd_output=${_cmd_output} value=|${value}|" )
> > ++    ENDMACRO(COMMAND_OUTPUT_TO_VARIABLE var cmd)
> > ++
> > ++    # This macro is meant to be internal.
> > ++    MACRO(_MANAGE_VARIABLE_SET var value)
> > ++      SET(${var} "${value}")
> > ++    ENDMACRO(_MANAGE_VARIABLE_SET var value)
> > ++
> > ++    # it deals the "encoded" line.
> > ++    FUNCTION(SETTING_STRING_GET_VARIABLE var value str )
> > ++      SET(setting_sign "=")
> > ++      SET(_NOUNQUOTE "")
> > ++      SET(_NOREPLACE "")
> > ++      FOREACH(_arg ${ARGN})
> > ++          IF (${_arg} STREQUAL "NOUNQUOTE")
> > ++              SET(_NOUNQUOTE "NOUNQUOTE")
> > ++          ELSEIF (${_arg} STREQUAL "NOREPLACE")
> > ++              SET(_NOREPLACE "NOREPLACE")
> > ++          ELSE(${_arg} STREQUAL "NOUNQUOTE")
> > ++              SET(setting_sign ${_arg})
> > ++          ENDIF(${_arg} STREQUAL "NOUNQUOTE")
> > ++      ENDFOREACH(_arg ${ARGN})
> > ++
> > ++      STRING_SPLIT(_tokens "${setting_sign}" "${str}" 2)
> > ++      #MESSAGE("_tokens=${_tokens}")
> > ++      SET(_varName "")
> > ++      SET(_val "")
> > ++      FOREACH(_token ${_tokens})
> > ++          #MESSAGE("_varName=${_varName} _token=${_token}")
> > ++          IF(_varName STREQUAL "")
> > ++              SET(_varName "${_token}")
> > ++          ELSE(_varName STREQUAL "")
> > ++              SET(_val "${_token}")
> > ++          ENDIF(_varName STREQUAL "")
> > ++      ENDFOREACH(_token ${_tokens})
> > ++      #MESSAGE("_varName=${_varName} _val=${_val}")
> > ++
> > ++      SET(${var} "${_varName}" PARENT_SCOPE)
> > ++      # Set var when
> > ++      # 1. NOREPLACE is not set, or
> > ++      # 2. var has value already.
> > ++      SET(_setVar 0)
> > ++      IF(_NOREPLACE STREQUAL "")
> > ++          STRING_TRIM(_value "${_val}" ${_NOUNQUOTE})
> > ++      ELSEIF(${var} STREQUAL "")
> > ++          STRING_TRIM(_value "${_val}" ${_NOUNQUOTE})
> > ++      ELSE(_NOREPLACE STREQUAL "")
> > ++          SET(_value "${${var}}")
> > ++      ENDIF(_NOREPLACE STREQUAL "")
> > ++      SET(${value} "${_value}" PARENT_SCOPE)
> > ++      #MESSAGE("_varName=${_varName} _value=${_value}")
> > ++
> > ++    ENDFUNCTION(SETTING_STRING_GET_VARIABLE var str)
> > ++
> > ++    # Internal macro
> > ++    # Similar to STRING_ESCAPE, but read directly from file,
> > ++    # This avoid the variable substitution
> > ++    # Variable escape is enforced.
> > ++    MACRO(FILE_READ_ESCAPE var filename)
> > ++      # '$' is very tricky.
> > ++      # '$' => '#D'
> > ++      GET_FILENAME_COMPONENT(_filename_abs "${filename}" ABSOLUTE)
> > ++      EXECUTE_PROCESS(COMMAND cat ${filename}
> > ++          COMMAND sed -e "s/#/#H/g"
> > ++          COMMAND sed -e "s/[$]/#D/g"
> > ++          COMMAND sed -e "s/;/#S/g"
> > ++          COMMAND sed -e "s/[\\]/#B/g"
> > ++          OUTPUT_VARIABLE _ret
> > ++          OUTPUT_STRIP_TRAILING_WHITESPACE)
> > ++
> > ++      STRING(REGEX REPLACE "\n" ";" _ret "${_ret}")
> > ++      #MESSAGE("_ret=|${_ret}|")
> > ++      SET(${var} "${_ret}")
> > ++    ENDMACRO(FILE_READ_ESCAPE var filename)
> > ++
> > ++    MACRO(SETTING_FILE_GET_VARIABLES_PATTERN var attr_pattern setting_file)
> > ++      IF("${setting_file}" STREQUAL "")
> > ++          M_MSG(${M_FATAL} "SETTING_FILE_GET_VARIABLES_PATTERN: setting_file ${setting_file} is empty")
> > ++      ENDIF("${setting_file}" STREQUAL "")
> > ++      SET(setting_sign "=")
> > ++      SET(_noUnQuoted "")
> > ++      SET(_noEscapeSemicolon "")
> > ++      SET(_noReplace "")
> > ++      SET(_escapeVariable "")
> > ++      FOREACH(_arg ${ARGN})
> > ++          IF (${_arg} STREQUAL "NOUNQUOTE")
> > ++              SET(_noUnQuoted "NOUNQUOTE")
> > ++          ELSEIF (${_arg} STREQUAL "NOREPLACE")
> > ++              SET(_noReplace "NOREPLACE")
> > ++          ELSEIF (${_arg} STREQUAL "NOESCAPE_SEMICOLON")
> > ++              SET(_noEscapeSemicolon "NOESCAPE_SEMICOLON")
> > ++          ELSEIF (${_arg} STREQUAL "ESCAPE_VARIABLE")
> > ++              SET(_escapeVariable "ESCAPE_VARIABLE")
> > ++          ELSE(${_arg} STREQUAL "NOUNQUOTE")
> > ++              SET(setting_sign ${_arg})
> > ++          ENDIF(${_arg} STREQUAL "NOUNQUOTE")
> > ++      ENDFOREACH(_arg)
> > ++
> > ++      # Escape everything to be safe.
> > ++      FILE_READ_ESCAPE(_lines "${setting_file}")
> > ++
> > ++      #STRING_SPLIT(_lines "\n" "${_txt_content}")
> > ++      #MESSAGE("_lines=|${_lines}|")
> > ++      SET(_actual_line "")
> > ++      SET(_join_next 0)
> > ++      FOREACH(_line ${_lines})
> > ++          #MESSAGE("_line=|${_line}|")
> > ++          IF(NOT _line MATCHES "^[ \\t]*#H")
> > ++              # Not a comment line.
> > ++              IF(_join_next EQUAL 1)
> > ++                  SET(_actual_line "${_actual_line}${_line}" )
> > ++              ELSE(_join_next EQUAL 1)
> > ++                  SET(_actual_line "${_line}")
> > ++              ENDIF(_join_next EQUAL 1)
> > ++              #MESSAGE("_actual_line=|${_actual_line}|")
> > ++
> > ++              IF(_actual_line MATCHES "#B$")
> > ++                  #Join the lines that end with \\
> > ++                  SET(_join_next 1)
> > ++                  STRING(REGEX REPLACE "#B$" "" _actual_line "${_actual_line}")
> > ++              ELSE(_actual_line MATCHES "#B$")
> > ++                  SET(_join_next 0)
> > ++                  IF(_actual_line MATCHES "[ \\t]*${attr_pattern}[ \\t]*${setting_sign}")
> > ++                      #MESSAGE("*** matched_line=|${_actual_line}|")
> > ++                      SETTING_STRING_GET_VARIABLE(_attr _value
> > ++                          "${_actual_line}" ${setting_sign} ${_noUnQuoted} )
> > ++                      #MESSAGE("*** _attr=${_attr} _value=${_value}")
> > ++                      IF(_noReplace STREQUAL "" OR NOT DEFINED ${_attr})
> > ++                          # Unencoding
> > ++                          _STRING_UNESCAPE(_value "${_value}" ${_noEscapeSemicolon} ESCAPE_VARIABLE)
> > ++                          IF(_escapeVariable STREQUAL "")
> > ++                              # Variable should not be escaped
> > ++                              # i.e. need substitution
> > ++                              _MANAGE_VARIABLE_SET(_value "${_value}")
> > ++                          ENDIF(_escapeVariable STREQUAL "")
> > ++                          IF("${var}" STREQUAL "")
> > ++                              SET(${_attr} "${_value}")
> > ++                          ELSE("${var}" STREQUAL "")
> > ++                              SET(${var} "${_value}")
> > ++                          ENDIF("${var}" STREQUAL "")
> > ++                      ENDIF(_noReplace STREQUAL "" OR NOT DEFINED ${_attr})
> > ++                  ENDIF(_actual_line MATCHES "[ \\t]*${attr_pattern}[ \\t]*${setting_sign}")
> > ++
> > ++              ENDIF(_actual_line MATCHES "#B$")
> > ++
> > ++          ENDIF(NOT _line MATCHES "^[ \\t]*#H")
> > ++      ENDFOREACH(_line ${_lines})
> > ++      #SET(${var} "${_value}")
> > ++
> > ++    ENDMACRO(SETTING_FILE_GET_VARIABLES_PATTERN var attr_pattern setting_file)
> > ++
> > ++    MACRO(SETTING_FILE_GET_VARIABLE var attr_name setting_file)
> > ++      SETTING_FILE_GET_VARIABLES_PATTERN(${var} "${attr_name}"
> > ++          "${setting_file}" ${ARGN})
> > ++    ENDMACRO(SETTING_FILE_GET_VARIABLE var attr_name setting_file)
> > ++
> > ++    MACRO(SETTING_FILE_GET_ALL_VARIABLES setting_file)
> > ++      SETTING_FILE_GET_VARIABLES_PATTERN("" "[A-Za-z_][A-Za-z0-9_.]*"
> > ++          "${setting_file}" ${ARGN})
> > ++    ENDMACRO(SETTING_FILE_GET_ALL_VARIABLES setting_file)
> > ++
> > ++    MACRO(GET_ENV var default_value)
> > ++      IF(${ARGC} GREATER 2)
> > ++          SET(_env "${ARGV2}")
> > ++      ELSE(${ARGC} GREATER 2)
> > ++          SET(_env "${var}")
> > ++      ENDIF(${ARGC} GREATER 2)
> > ++
> > ++      IF ("$ENV{${_env}}" STREQUAL "")
> > ++          SET(${var} "${default_value}")
> > ++      ELSE("$ENV{${_env}}" STREQUAL "")
> > ++          SET(${var} "$ENV{${_env}}")
> > ++      ENDIF("$ENV{${_env}}" STREQUAL "")
> > ++      # MESSAGE("Variable ${var}=${${var}}")
> > ++    ENDMACRO(GET_ENV var default_value)
> > ++
> > ++    MACRO(SET_VAR var untrimmedValue)
> > ++      SET(_noUnQuoted "")
> > ++      FOREACH(_arg ${ARGN})
> > ++          IF (${_arg} STREQUAL "NOUNQUOTE")
> > ++              SET(_noUnQuoted "NOUNQUOTE")
> > ++          ENDIF(${_arg} STREQUAL "NOUNQUOTE")
> > ++      ENDFOREACH(_arg ${ARGN})
> > ++      #MESSAGE("untrimmedValue=${untrimmedValue}")
> > ++      IF ("${untrimmedValue}" STREQUAL "")
> > ++          SET(${var} "")
> > ++      ELSE("${untrimmedValue}" STREQUAL "")
> > ++          STRING_TRIM(trimmedValue "${untrimmedValue}" ${_noUnQuoted})
> > ++          #MESSAGE("***SET_VAR: trimmedValue=${trimmedValue}")
> > ++          SET(${var} "${trimmedValue}")
> > ++      ENDIF("${untrimmedValue}" STREQUAL "")
> > ++      #SET(value "${${var}}")
> > ++      #MESSAGE("***SET_VAR: ${var}=|${value}|")
> > ++    ENDMACRO(SET_VAR var untrimmedValue)
> > ++
> > ++ENDIF(NOT DEFINED _MANAGE_VARIABLE_CMAKE_)
> > ++
> > +--- /dev/null
> > ++++ b/Modules/ManageVersion.cmake
> > +@@ -0,0 +1,137 @@
> > ++# - Modules for manipulate version and ChangeLogs
> > ++#
> > ++# Includes:
> > ++#   ManageVariable
> > ++#   DateTimeFormat
> > ++#
> > ++# Included by:
> > ++#   PackSource
> > ++#
> > ++# Defines following functions:
> > ++#   RELEASE_NOTES_READ_FILE([releaseFile])
> > ++#   - Load release file information.
> > ++#     Arguments:
> > ++#     + releaseFile: (Optional) release file to be read.
> > ++#       This file should contain following definition:
> > ++#       + PRJ_VER: Release version.
> > ++#       + SUMMARY: Summary of the release. Will be output as CHANGE_SUMMARY.
> > ++#          and a [Changes] section tag, below which listed the change in the
> > ++#          release.
> > ++#       Default:RELEASE-NOTES.txt
> > ++#     This macro reads or define following variables:
> > ++#     + RELEASE_TARGETS: Sequence of release targets.
> > ++#     This macro outputs following files:
> > ++#     + ChangeLog: Log of changes.
> > ++#       Depends on ChangeLog.prev and releaseFile.
> > ++#     This macro sets following variables:
> > ++#     + PRJ_VER: Release version.
> > ++#     + CHANGE_SUMMARY: Summary of changes.
> > ++#     + CHANGELOG_ITEMS: Lines below the [Changes] tag.
> > ++#     + RELEASE_NOTES_FILE: The loaded release file.
> > ++#     + PRJ_DOC_DIR: Documentation for the project.
> > ++#       Default: ${DOC_DIR}/${PROJECT_NAME}-${PRJ_VER}
> > ++#
> > ++#
> > ++
> > ++IF(NOT DEFINED _MANAGE_VERSION_CMAKE_)
> > ++    SET(_MANAGE_VERSION_CMAKE_ "DEFINED")
> > ++    INCLUDE(ManageMessage)
> > ++    INCLUDE(ManageVariable)
> > ++
> > ++    SET(CHANGELOG_FILE "${CMAKE_BINARY_DIR}/ChangeLog" CACHE FILEPATH
> > ++      "ChangeLog")
> > ++    SET(CHANGELOG_PREV_FILE "${CMAKE_SOURCE_DIR}/ChangeLog.prev" CACHE FILEPATH
> > ++      "ChangeLog.prev")
> > ++
> > ++    ADD_CUSTOM_TARGET(changelog_prev_update
> > ++      COMMAND ${CMAKE_COMMAND} -E copy ${CHANGELOG_FILE} ${CHANGELOG_PREV_FILE}
> > ++      DEPENDS ${CHANGELOG_FILE}
> > ++      COMMENT "${CHANGELOG_FILE} are saving as ${CHANGELOG_PREV_FILE}"
> > ++      )
> > ++
> > ++    FUNCTION(RELEASE_NOTES_READ_FILE)
> > ++      FOREACH(_arg ${ARGN})
> > ++          IF(EXISTS ${_arg})
> > ++              SET(RELEASE_NOTES_FILE ${_arg} CACHE FILEPATH "Release File")
> > ++          ENDIF(EXISTS ${_arg})
> > ++      ENDFOREACH(_arg ${ARGN})
> > ++
> > ++      IF(NOT RELEASE_NOTES_FILE)
> > ++          SET(RELEASE_NOTES_FILE "RELEASE-NOTES.txt" CACHE FILEPATH "Release Notes")
> > ++      ENDIF(NOT RELEASE_NOTES_FILE)
> > ++
> > ++      FILE(STRINGS "${RELEASE_NOTES_FILE}" _release_lines)
> > ++
> > ++      SET(_changeItemSection 0)
> > ++      SET(_changeItems "")
> > ++      ## Parse release file
> > ++      FOREACH(_line ${_release_lines})
> > ++          IF(_changeItemSection)
> > ++              ### Append lines in change section
> > ++              IF(_changeItems)
> > ++                  SET(_changeItems  "${_changeItems}\n${_line}")
> > ++              ELSE(_changeItems)
> > ++                  SET(_changeItems  "${_line}")
> > ++              ENDIF(_changeItems)
> > ++          ELSEIF("${_line}" MATCHES "^[[]Changes[]]")
> > ++              ### Start the change section
> > ++              SET(_changeItemSection 1)
> > ++          ELSE(_changeItemSection)
> > ++              ### Variable Setting section
> > ++              SETTING_STRING_GET_VARIABLE(var value "${_line}")
> > ++              #MESSAGE("var=${var} value=${value}")
> > ++              IF(NOT var MATCHES "#")
> > ++                  IF(var STREQUAL "PRJ_VER")
> > ++                      SET_COMPILE_ENV(${var} "${value}" CACHE STRING "Project Version" FORCE)
> > ++                  ELSEIF(var STREQUAL "SUMMARY")
> > ++                      SET(CHANGE_SUMMARY "${value}" CACHE STRING "Change Summary" FORCE)
> > ++                  ELSE(var STREQUAL "PRJ_VER")
> > ++                      SET(${var} "${value}" CACHE STRING "${var}" FORCE)
> > ++                  ENDIF(var STREQUAL "PRJ_VER")
> > ++              ENDIF(NOT var MATCHES "#")
> > ++          ENDIF(_changeItemSection)
> > ++      ENDFOREACH(_line ${_release_line})
> > ++
> > ++      IF(_changeSection EQUAL 0)
> > ++          MESSAGE(FATAL_ERROR "${RELEASE_NOTES_FILE} does not have a [Changes] tag!")
> > ++      ELSEIF("${_changeItems}" STREQUAL "")
> > ++          MESSAGE(FATAL_ERROR "${RELEASE_NOTES_FILE} does not have ChangeLog items!")
> > ++      ENDIF(_changeSection EQUAL 0)
> > ++
> > ++      FILE(WRITE "${CMAKE_FEDORA_TMP_DIR}/ChangeLog.this" "${_changeItems}")
> > ++
> > ++      SET_COMPILE_ENV(PRJ_DOC_DIR "${DOC_DIR}/${PROJECT_NAME}-${PRJ_VER}"
> > ++          CACHE PATH "Project docdir prefix" FORCE)
> > ++
> > ++      CHANGELOG_WRITE_FILE()
> > ++    ENDFUNCTION(RELEASE_NOTES_READ_FILE)
> > ++
> > ++    FUNCTION(CHANGELOG_WRITE_FILE)
> > ++      INCLUDE(DateTimeFormat)
> > ++
> > ++      FILE(WRITE ${CHANGELOG_FILE} "* ${TODAY_CHANGELOG} ${MAINTAINER} - ${PRJ_VER}\n")
> > ++      FILE(READ "${CMAKE_FEDORA_TMP_DIR}/ChangeLog.this" _changeLog_items)
> > ++
> > ++      FILE(APPEND ${CHANGELOG_FILE} "${_changeLog_items}\n\n")
> > ++      FILE(READ ${CHANGELOG_PREV_FILE} CHANGELOG_PREV)
> > ++      FILE(APPEND ${CHANGELOG_FILE} "${CHANGELOG_PREV}")
> > ++      SET(CMAKE_CACHE_TXT "${CMAKE_BINARY_DIR}/CMakeCache.txt")
> > ++
> > ++      ADD_CUSTOM_COMMAND(OUTPUT ${CHANGELOG_FILE}
> > ++          COMMAND ${CMAKE_COMMAND} ${CMAKE_SOURCE_DIR}
> > ++          DEPENDS ${RELEASE_NOTES_FILE} ${CHANGELOG_PREV_FILE}
> > ++          COMMENT "Building ${CHANGELOG_FILE}"
> > ++          VERBATIM
> > ++          )
> > ++
> > ++      ADD_CUSTOM_TARGET(changelog ALL
> > ++          DEPENDS ${CHANGELOG_FILE}
> > ++          VERBATIM
> > ++          )
> > ++
> > ++    ENDFUNCTION(CHANGELOG_WRITE_FILE)
> > ++
> > ++
> > ++
> > ++ENDIF(NOT DEFINED _MANAGE_VERSION_CMAKE_)
> > ++
> > +--- /dev/null
> > ++++ b/Modules/cmake_uninstall.cmake.in
> > +@@ -0,0 +1,21 @@
> > ++IF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
> > ++  MESSAGE(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"")
> > ++ENDIF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
> > ++
> > ++FILE(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files)
> > ++STRING(REGEX REPLACE "\n" ";" files "${files}")
> > ++FOREACH(file ${files})
> > ++  MESSAGE(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"")
> > ++  IF(EXISTS "$ENV{DESTDIR}${file}")
> > ++    EXEC_PROGRAM(
> > ++      "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\""
> > ++      OUTPUT_VARIABLE rm_out
> > ++      RETURN_VALUE rm_retval
> > ++      )
> > ++    IF(NOT "${rm_retval}" STREQUAL 0)
> > ++      MESSAGE(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"")
> > ++    ENDIF(NOT "${rm_retval}" STREQUAL 0)
> > ++  ELSE(EXISTS "$ENV{DESTDIR}${file}")
> > ++    MESSAGE(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.")
> > ++  ENDIF(EXISTS "$ENV{DESTDIR}${file}")
> > ++ENDFOREACH(file)
> > diff --git a/meta-oe/recipes-support/ibus/ibus-table-chinese/0003-add-ChangeLog.prev.patch b/meta-oe/recipes-support/ibus/ibus-table-chinese/0003-add-ChangeLog.prev.patch
> > new file mode 100644
> > index 000000000..27c585847
> > --- /dev/null
> > +++ b/meta-oe/recipes-support/ibus/ibus-table-chinese/0003-add-ChangeLog.prev.patch
> > @@ -0,0 +1,58 @@
> > +--- /dev/null
> > ++++ b/ChangeLog.prev
> > +@@ -0,0 +1,55 @@
> > ++* Mon Nov 26 2012 Ding-Yi Chen <dchen at redhat.com> - 1.4.5
> > ++- Table build scripts has been refactored.
> > ++- cmake-fedora is added as submodule.
> > ++- Fixed Bug 855250 - Change the default filtering for Quick and Cangjie by
> > ++  merging maxiaojun's repository
> > ++- Fixed Google Issue 1405: failed to build ibus-table-chinese due to missing db files
> > ++- Fixed Google issue 1507: Add CJKV Extension C/D support for Array30
> > ++- Merge GitHub Pull request 3: Added the inter punct
> > ++- Merge GitHub Pull request 4: Give Cangjie and Quick users 9 candidates per page
> > ++
> > ++* Fri Sep 07 2012 Ding-Yi Chen <dchen at redhat.com> - 1.4.0
> > ++- Table build scripts has been refactored.
> > ++- cmake-fedora is added as submodule.
> > ++- Fixed Bug 855250 - Change the default filtering for Quick and Cangjie by
> > ++  merging maxiaojun's repository
> > ++- Fixed Google Issue 1405: failed to build ibus-table-chinese due to missing db files
> > ++
> > ++* Fri Oct 28 2011 Ding-Yi Chen <dchen at redhat.com> - 1.3.5
> > ++- Merge Caius Chance's branch for DYNAMIC_ADJUST
> > ++- Dependency update to cmake-0.8.1
> > ++
> > ++* Wed Aug 31 2011 Ding-Yi Chen <dchen at redhat.com> - 1.3.4
> > ++- Fixed Bug 715707 - FTBFS ibus-table-chinese-1.3.0.20110114-2.fc15
> > ++- Fixed Bug 629212 - bad candidate orders in ibus-table-quick
> > ++- Merged patch from sagara @ github, which address IBus issue 787
> > ++- Make it compatible with cmake-fedora-0.7.994
> > ++- Move the cmake policies to the front
> > ++- Suppress the misleading warning from rpm -V
> > ++
> > ++* Fri Jan 14 2011 Ding-Yi Chen <dchen at redhat.com> - 1.3.0.20110114
> > ++- Fix Bug 667877: ibus-table-yinma and ibus-table-xingma have been obsoleted.
> > ++- Now depends on cmake-fedora
> > ++
> > ++* Mon Dec 06 2010 Ding-Yi Chen <dchen at redhat.com> - 1.3.0.20101206
> > ++- New tables which was not include in original:
> > ++  + array30, array30-big, wubi-haifeng
> > ++- Table removed from original version because of license issues:
> > ++  + zhengma, ziranma
> > ++- Add package review ID
> > ++- Add build tag for el6
> > ++
> > ++* Fri Dec 03 2010 Ding-Yi Chen <dchen at redhat.com> - 1.3.0.20101201
> > ++- Support out-of-source build
> > ++- Remove ibus-table-chinese-all
> > ++
> > ++* Wed Jan 06 2010 Caius 'kaio' Chance <k at kaio.me> - 1.3.0.20100527
> > ++- Added Quick 3, 5, Classic tables and icons.
> > ++- Added Easy (big) table and icon.
> > ++- Updated AUTHORS, COPYING, license and its declarations.
> > ++- Added CangJie (big) table.
> > ++
> > ++* Wed Aug 19 2008 Yu Yuwei <acevery at gmail.com> - 1.3.0.20100527
> > ++- The first version.
> > ++
> > ++
> > diff --git a/meta-oe/recipes-support/ibus/ibus-table-chinese/0005-fix-cmake-cross-compile.patch b/meta-oe/recipes-support/ibus/ibus-table-chinese/0005-fix-cmake-cross-compile.patch
> > new file mode 100644
> > index 000000000..0f814b765
> > --- /dev/null
> > +++ b/meta-oe/recipes-support/ibus/ibus-table-chinese/0005-fix-cmake-cross-compile.patch
> > @@ -0,0 +1,130 @@
> > +diff -u -r ibus-table-chinese-1.8.2/tables/array/CMakeLists.txt new/tables/array/CMakeLists.txt
> > +--- ibus-table-chinese-1.8.2/tables/array/CMakeLists.txt       2018-10-30 01:56:21.474548447 +0100
> > ++++ new/tables/array/CMakeLists.txt    2018-10-29 23:39:57.770116668 +0100
> > +@@ -16,7 +16,7 @@
> > +
> > + CONFIGURE_FILE(${ARRAY30_HEAD_IN} ${ARRAY30_BASE_HEAD} @ONLY)
> > +
> > +-CONVERT_ENCODING(${ARRAY30_BASE_UTF8} UTF16 array30_27489.txt)
> > ++CONVERT_ENCODING(${ARRAY30_BASE_UTF8} UTF16 ${CMAKE_CURRENT_SOURCE_DIR}/array30_27489.txt)
> > + GENERATE_FREQ(${ARRAY30_BASE_FREQ}
> > +     ${ARRAY30_BASE_UTF8}
> > +     )
> > +@@ -41,10 +41,10 @@
> > + CONFIGURE_FILE(${ARRAY30_HEAD_IN} ${ARRAY30_BIG_HEAD} @ONLY)
> > +
> > + SET(ARRAY30_EXT_B_UTF8 ${CMAKE_CURRENT_BINARY_DIR}/array30_ExtB.utf8)
> > +-CONVERT_ENCODING(${CMAKE_CURRENT_BINARY_DIR}/array30_ExtB.utf8 UTF16 array30_ExtB.txt)
> > ++CONVERT_ENCODING(${CMAKE_CURRENT_BINARY_DIR}/array30_ExtB.utf8 UTF16 ${CMAKE_CURRENT_SOURCE_DIR}/array30_ExtB.txt)
> > +
> > + SET(ARRAY30_EXT_CD_UTF8 ${CMAKE_CURRENT_BINARY_DIR}/array30_ExtCD.utf8)
> > +-CONVERT_ENCODING(${CMAKE_CURRENT_BINARY_DIR}/array30_ExtCD.utf8 UTF16 array30_ExtCD_V2012A.txt)
> > ++CONVERT_ENCODING(${CMAKE_CURRENT_BINARY_DIR}/array30_ExtCD.utf8 UTF16 ${CMAKE_CURRENT_SOURCE_DIR}/array30_ExtCD_V2012A.txt)
> > +
> > + ADD_CUSTOM_COMMAND(OUTPUT ${ARRAY30_BIG_UTF8}
> > +     COMMAND cat ${ARRAY30_BASE_UTF8}
> > +Only in new/tables/array: .CMakeLists.txt.swp
> > +diff -u -r ibus-table-chinese-1.8.2/tables/cangjie/CMakeLists.txt new/tables/cangjie/CMakeLists.txt
> > +--- ibus-table-chinese-1.8.2/tables/cangjie/CMakeLists.txt     2018-10-30 01:56:50.506773198 +0100
> > ++++ new/tables/cangjie/CMakeLists.txt  2018-10-30 00:15:41.319903050 +0100
> > +@@ -1,2 +1,2 @@
> > +-CONVERT_DB(cangjie "cangjie3.txt" "cangjie5.txt" "cangjie-big.txt")
> > ++CONVERT_DB(cangjie "${CMAKE_CURRENT_SOURCE_DIR}/cangjie3.txt" "${CMAKE_CURRENT_SOURCE_DIR}/cangjie5.txt" "${CMAKE_CURRENT_SOURCE_DIR}/cangjie-big.txt")
> > +
> > +Only in new/tables/cangjie: .CMakeLists.txt.swp
> > +diff -u -r ibus-table-chinese-1.8.2/tables/cantonese/CMakeLists.txt new/tables/cantonese/CMakeLists.txt
> > +--- ibus-table-chinese-1.8.2/tables/cantonese/CMakeLists.txt   2018-10-30 01:56:29.464408649 +0100
> > ++++ new/tables/cantonese/CMakeLists.txt        2018-10-30 00:05:51.026038238 +0100
> > +@@ -1,2 +1,2 @@
> > +-CONVERT_DB(cantonese "cantonese.txt" "cantonhk.txt" "jyutping.txt")
> > ++CONVERT_DB(cantonese "${CMAKE_CURRENT_SOURCE_DIR}/cantonese.txt" "${CMAKE_CURRENT_SOURCE_DIR}/cantonhk.txt" "${CMAKE_CURRENT_SOURCE_DIR}/jyutping.txt")
> > +
> > +Only in new/tables/cantonese: .CMakeLists.txt.swp
> > +diff -u -r ibus-table-chinese-1.8.2/tables/CMakeLists.txt new/tables/CMakeLists.txt
> > +--- ibus-table-chinese-1.8.2/tables/CMakeLists.txt     2018-10-30 01:56:08.781947707 +0100
> > ++++ new/tables/CMakeLists.txt  2018-10-30 01:53:51.086824367 +0100
> > +@@ -87,7 +87,7 @@
> > +           DEPENDS ${_tabFile}
> > +           COMMENT "Building ${_tabName} table"
> > +           )
> > +-      LIST(APPEND _dependDb "${_dbF}")
> > ++      LIST(APPEND _dependDb "${CMAKE_CURRENT_BINARY_DIR}/${_dbF}")
> > +       IF(EXISTS "${CMAKE_SOURCE_DIR}/icons/${_tabName}.png")
> > +           LIST(APPEND _dependIcon "${CMAKE_SOURCE_DIR}/icons/${_tabName}.png")
> > +       ELSEIF(EXISTS "${CMAKE_SOURCE_DIR}/icons/${_tabName}.svg")
> > +Only in new/tables: .CMakeLists.txt.swp
> > +diff -u -r ibus-table-chinese-1.8.2/tables/easy/CMakeLists.txt new/tables/easy/CMakeLists.txt
> > +--- ibus-table-chinese-1.8.2/tables/easy/CMakeLists.txt        2018-10-30 01:56:35.966667250 +0100
> > ++++ new/tables/easy/CMakeLists.txt     2018-10-30 00:07:49.806217968 +0100
> > +@@ -1,2 +1,2 @@
> > +-CONVERT_DB(easy "easy-big.txt")
> > ++CONVERT_DB(easy "${CMAKE_CURRENT_SOURCE_DIR}/easy-big.txt")
> > +
> > +Only in new/tables/easy: .CMakeLists.txt.swp
> > +diff -u -r ibus-table-chinese-1.8.2/tables/erbi/CMakeLists.txt new/tables/erbi/CMakeLists.txt
> > +--- ibus-table-chinese-1.8.2/tables/erbi/CMakeLists.txt        2018-10-30 01:56:39.921608060 +0100
> > ++++ new/tables/erbi/CMakeLists.txt     2018-10-30 00:08:14.355641341 +0100
> > +@@ -1,2 +1,2 @@
> > +-CONVERT_DB(erbi "erbi.txt" "erbi-qs.txt")
> > ++CONVERT_DB(erbi "${CMAKE_CURRENT_SOURCE_DIR}/erbi.txt" "${CMAKE_CURRENT_SOURCE_DIR}/erbi-qs.txt")
> > +
> > +Only in new/tables/erbi: .CMakeLists.txt.swp
> > +diff -u -r ibus-table-chinese-1.8.2/tables/quick/CMakeLists.txt new/tables/quick/CMakeLists.txt
> > +--- ibus-table-chinese-1.8.2/tables/quick/CMakeLists.txt       2018-10-30 01:56:43.592624907 +0100
> > ++++ new/tables/quick/CMakeLists.txt    2018-10-30 00:14:13.643389364 +0100
> > +@@ -1,2 +1,2 @@
> > +-CONVERT_DB(quick "quick3.txt" "quick5.txt" "quick-classic.txt")
> > ++CONVERT_DB(quick "${CMAKE_CURRENT_SOURCE_DIR}/quick3.txt" "${CMAKE_CURRENT_SOURCE_DIR}/quick5.txt" "${CMAKE_CURRENT_SOURCE_DIR}/quick-classic.txt")
> > +
> > +Only in new/tables/quick: .CMakeLists.txt.swp
> > +diff -u -r ibus-table-chinese-1.8.2/tables/scj/CMakeLists.txt new/tables/scj/CMakeLists.txt
> > +--- ibus-table-chinese-1.8.2/tables/scj/CMakeLists.txt 2018-10-30 01:56:47.079691021 +0100
> > ++++ new/tables/scj/CMakeLists.txt      2018-10-30 00:00:14.404215150 +0100
> > +@@ -1,2 +1,2 @@
> > +-CONVERT_DB(scj "scj6.txt")
> > ++CONVERT_DB(scj "${CMAKE_CURRENT_SOURCE_DIR}/scj6.txt")
> > +
> > +Only in new/tables/scj: .CMakeLists.txt.swp
> > +diff -u -r ibus-table-chinese-1.8.2/tables/stroke5/CMakeLists.txt new/tables/stroke5/CMakeLists.txt
> > +--- ibus-table-chinese-1.8.2/tables/stroke5/CMakeLists.txt     2018-10-30 01:56:32.727534736 +0100
> > ++++ new/tables/stroke5/CMakeLists.txt  2018-10-30 00:07:28.132024331 +0100
> > +@@ -1,2 +1,2 @@
> > +-CONVERT_DB(stroke5 "stroke5.txt")
> > ++CONVERT_DB(stroke5 "${CMAKE_CURRENT_SOURCE_DIR}/stroke5.txt")
> > +
> > +Only in new/tables/stroke5: .CMakeLists.txt.swp
> > +diff -u -r ibus-table-chinese-1.8.2/tables/wu/CMakeLists.txt new/tables/wu/CMakeLists.txt
> > +--- ibus-table-chinese-1.8.2/tables/wu/CMakeLists.txt  2018-10-30 01:56:53.921858589 +0100
> > ++++ new/tables/wu/CMakeLists.txt       2018-10-30 00:16:38.080698934 +0100
> > +@@ -1,2 +1,2 @@
> > +-CONVERT_DB(wu "wu.txt")
> > ++CONVERT_DB(wu "${CMAKE_CURRENT_SOURCE_DIR}/wu.txt")
> > +
> > +Only in new/tables/wu: .CMakeLists.txt.swp
> > +diff -u -r ibus-table-chinese-1.8.2/tables/wubi-haifeng/CMakeLists.txt new/tables/wubi-haifeng/CMakeLists.txt
> > +--- ibus-table-chinese-1.8.2/tables/wubi-haifeng/CMakeLists.txt        2018-10-30 01:56:15.560132413 +0100
> > ++++ new/tables/wubi-haifeng/CMakeLists.txt     2018-10-29 23:30:12.746818405 +0100
> > +@@ -5,6 +5,6 @@
> > + #    COMMENT "Building wubi-haifeng86.UTF-8"
> > + #    )
> > +
> > +-MAKE_TABLE_SOURCE_TXT(wubi-haifeng86.txt wubi-haifeng86.head wubi-haifeng86.UTF-8 wubi-haifeng86.tail)
> > ++MAKE_TABLE_SOURCE_TXT(wubi-haifeng86.txt ${CMAKE_CURRENT_SOURCE_DIR}/wubi-haifeng86.head ${CMAKE_CURRENT_SOURCE_DIR}/wubi-haifeng86.UTF-8 ${CMAKE_CURRENT_SOURCE_DIR}/wubi-haifeng86.tail)
> > + CONVERT_DB(wubi-haifeng "wubi-haifeng86.txt")
> > +
> > +Only in new/tables/wubi-haifeng: .CMakeLists.txt.swp
> > +diff -u -r ibus-table-chinese-1.8.2/tables/wubi-jidian/CMakeLists.txt new/tables/wubi-jidian/CMakeLists.txt
> > +--- ibus-table-chinese-1.8.2/tables/wubi-jidian/CMakeLists.txt 2018-10-30 01:56:25.921357528 +0100
> > ++++ new/tables/wubi-jidian/CMakeLists.txt      2018-10-30 00:01:13.876283460 +0100
> > +@@ -1,2 +1,2 @@
> > +-CONVERT_DB(wubi-jidian "wubi-jidian86.txt")
> > ++CONVERT_DB(wubi-jidian "${CMAKE_CURRENT_SOURCE_DIR}/wubi-jidian86.txt")
> > +
> > +Only in new/tables/wubi-jidian: .CMakeLists.txt.swp
> > +diff -u -r ibus-table-chinese-1.8.2/tables/yong/CMakeLists.txt new/tables/yong/CMakeLists.txt
> > +--- ibus-table-chinese-1.8.2/tables/yong/CMakeLists.txt        2018-10-30 01:56:57.568881862 +0100
> > ++++ new/tables/yong/CMakeLists.txt     2018-10-30 00:17:30.326704114 +0100
> > +@@ -1,2 +1,2 @@
> > +-CONVERT_DB(yong "yong.txt")
> > ++CONVERT_DB(yong "${CMAKE_CURRENT_SOURCE_DIR}/yong.txt")
> > +
> > diff --git a/meta-oe/recipes-support/ibus/ibus-table-chinese_1.8.2.bb b/meta-oe/recipes-support/ibus/ibus-table-chinese_1.8.2.bb
> > new file mode 100644
> > index 000000000..0c33e4f44
> > --- /dev/null
> > +++ b/meta-oe/recipes-support/ibus/ibus-table-chinese_1.8.2.bb
> > @@ -0,0 +1,82 @@
> > +DESCRIPTION = "It is a Japanese input engine for IBus."
> > +LICENSE = "GPLv3"
> > +LIC_FILES_CHKSUM = "file://COPYING;md5=86bfc594f9971fb2797f5aea1a49d316"
> > +SECTION = "inputmethods"
> > +
> > +SRC_URI = "https://github.com/definite/${PN}/archive/${PV}.tar.gz \
> > +           file://0001-revert-CMakeLists.txt.patch \
> > +           file://0002-add-Modules.patch \
> > +           file://0003-add-ChangeLog.prev.patch \
> > +           file://0005-fix-cmake-cross-compile.patch \
> > +"
> > +
> > +SRC_URI[md5sum] = "6360649580363bb3627a11e32057f6b1"
> > +SRC_URI[sha256sum] = "ef62c22ef4e8f9085fc40fcbc14c30f6dac458817df98e9f90f883a3e2080089"
> > +
> > +inherit cmake
> > +
> > +DEPENDS = " ibus-table "
> > +
> > +BBCLASSEXTEND = "native"
> > +
> > +# The supported options are "Unix Makefiles" or "Ninja".
> > +OECMAKE_GENERATOR = "Unix Makefiles"
> > +
> > +cmake_do_generate_toolchain_file() {
> > +    if [ "${BUILD_SYS}" = "${HOST_SYS}" ]; then
> > +        cmake_crosscompiling="set( CMAKE_CROSSCOMPILING FALSE )"
> > +    fi
> > +    cat > ${WORKDIR}/toolchain.cmake <<EOF
> > +# CMake system name must be something like "Linux".
> > +# This is important for cross-compiling.
> > +$cmake_crosscompiling
> > +set( CMAKE_SYSTEM_NAME `echo ${TARGET_OS} | sed -e 's/^./\u&/' -e
> > +'s/^\(Linux\).*/\1/'` )
> > +set( CMAKE_SYSTEM_PROCESSOR
> > +${@map_target_arch_to_uname_arch(d.getVar('TARGET_ARCH'))} )
> > +set( CMAKE_C_COMPILER ${OECMAKE_C_COMPILER} )
> > +set( CMAKE_CXX_COMPILER ${OECMAKE_CXX_COMPILER} )
> > +set( CMAKE_ASM_COMPILER ${OECMAKE_C_COMPILER} )
> > +set( CMAKE_AR ${OECMAKE_AR} CACHE FILEPATH "Archiver" )
> > +set( CMAKE_C_FLAGS "${OECMAKE_C_FLAGS}" CACHE STRING "CFLAGS" )
> > +set( CMAKE_CXX_FLAGS "${OECMAKE_CXX_FLAGS}" CACHE STRING "CXXFLAGS" )
> > +set( CMAKE_ASM_FLAGS "${OECMAKE_C_FLAGS}" CACHE STRING "ASM FLAGS" )
> > +set( CMAKE_C_FLAGS_RELEASE "${OECMAKE_C_FLAGS_RELEASE}" CACHE STRING
> > +"Additional CFLAGS for release" )
> > +set( CMAKE_CXX_FLAGS_RELEASE "${OECMAKE_CXX_FLAGS_RELEASE}" CACHE STRING
> > +"Additional CXXFLAGS for release" )
> > +set( CMAKE_ASM_FLAGS_RELEASE "${OECMAKE_C_FLAGS_RELEASE}" CACHE STRING
> > +"Additional ASM FLAGS for release" )
> > +set( CMAKE_C_LINK_FLAGS "${OECMAKE_C_LINK_FLAGS}" CACHE STRING "LDFLAGS" )
> > +set( CMAKE_CXX_LINK_FLAGS "${OECMAKE_CXX_LINK_FLAGS}" CACHE STRING "LDFLAGS" )
> > +
> > +# only search in the paths provided so cmake doesnt pick
> > +# up libraries and tools from the native build machine
> > +set( CMAKE_FIND_ROOT_PATH ${STAGING_DIR_HOST} ${STAGING_DIR_NATIVE}
> > +${CROSS_DIR} ${OECMAKE_PERLNATIVE_DIR} ${OECMAKE_EXTRA_ROOT_PATH}
> > +${EXTERNAL_TOOLCHAIN})
> > +set( CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY )
> > +# set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ${OECMAKE_FIND_ROOT_PATH_MODE_PROGRAM} )
> > +set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
> > +# set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
> > +
> > +# Use qt.conf settings
> > +set( ENV{QT_CONF_PATH} ${WORKDIR}/qt.conf )
> > +
> > +# We need to set the rpath to the correct directory as cmake does not provide
> > +# any
> > +# directory as rpath by default
> > +set( CMAKE_INSTALL_RPATH ${OECMAKE_RPATH} )
> > +
> > +# Use native cmake modules
> > +list(APPEND CMAKE_MODULE_PATH "${STAGING_DATADIR}/cmake/Modules/")
> > +
> > +# add for non /usr/lib libdir, e.g. /usr/lib64
> > +set( CMAKE_LIBRARY_PATH ${libdir} ${base_libdir})
> > +
> > +EOF
> > +}
> > +
> > +FILES_${PN} += "${datadir}/ibus-table/icons/* \
> > +    ${datadir}/ibus-table/tables/* \
> > +"
> > --
> > 2.11.0
> >
> > --
> > _______________________________________________
> > Openembedded-devel mailing list
> > Openembedded-devel at lists.openembedded.org
> > http://lists.openembedded.org/mailman/listinfo/openembedded-devel


More information about the Openembedded-devel mailing list