Warning, /office/kexi/cmake/modules/KexiMacros.cmake is written in an unsupported language. File is not indexed.
0001 # Additional CMake macros
0002 #
0003 # Copyright (C) 2015-2018 Jarosław Staniek <staniek@kde.org>
0004 #
0005 # Redistribution and use is allowed according to the terms of the BSD license.
0006 # For details see the accompanying COPYING-CMAKE-SCRIPTS file.
0007
0008 if(__kexi_macros)
0009 return()
0010 endif()
0011 set(__kexi_macros YES)
0012
0013 #unused: include(KDbCreateSharedDataClasses) # from KDb
0014 include(CheckFunctionExists)
0015 include(GenerateExportHeader)
0016 include(GetGitRevisionDescription)
0017 include(MacroBoolTo01)
0018 include(KexiAddSimpleOption)
0019
0020 string(TOUPPER ${PROJECT_NAME} PROJECT_NAME_UPPER)
0021 string(TOLOWER ${PROJECT_NAME} PROJECT_NAME_LOWER)
0022 string(COMPARE EQUAL "${CMAKE_CXX_COMPILER_ID}" "Clang" CMAKE_COMPILER_IS_CLANG)
0023
0024 # Keep apps in the same bin dir so resources that are kept relative to this dir can be found
0025 # without installing.
0026 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
0027
0028 macro(ensure_out_of_source_build _extra_message)
0029 string(COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" _isBuildInSource)
0030 if(isBuildInSource)
0031 message(FATAL_ERROR "Compiling ${PROJECT_NAME} inside the source directory is not possible. "
0032 "${_extra_message}")
0033 endif()
0034 unset(_isBuildInSource)
0035 endmacro()
0036
0037 # Sets RELEASE_BUILD to TRUE for release builds
0038 macro(detect_release_build)
0039 if(NOT DEFINED RELEASE_BUILD)
0040 # estimate mode by CMAKE_BUILD_TYPE content if not set on cmdline
0041 string(TOLOWER "${CMAKE_BUILD_TYPE}" _CMAKE_BUILD_TYPE_TOLOWER)
0042 set(_RELEASE_BUILD_TYPES "release" "relwithdebinfo" "minsizerel")
0043 list(FIND _RELEASE_BUILD_TYPES "${CMAKE_BUILD_TYPE_TOLOWER}" INDEX)
0044 if (INDEX EQUAL -1)
0045 set(RELEASE_BUILD FALSE)
0046 else()
0047 set(RELEASE_BUILD TRUE)
0048 endif()
0049 unset(_RELEASE_BUILD_TYPES)
0050 unset(_CMAKE_BUILD_TYPE_TOLOWER)
0051 endif()
0052 endmacro()
0053
0054 set(ICONS_INSTALL_DIR "${DATA_INSTALL_DIR}/${KEXI_BASE_PATH}/icons")
0055
0056 # Fetches git revision and branch from the source dir of the current build if possible.
0057 # Sets ${PROJECT_NAME_UPPER}_GIT_SHA1_STRING and ${PROJECT_NAME_UPPER}_GIT_BRANCH_STRING variables.
0058 # If git information is not available but ${CMAKE_SOURCE_DIR}/GIT_VERSION file exists,
0059 # it is parsed. This file can be created by scripts while preparing tarballs and is
0060 # supposed to contain two lines: hash and branch.
0061 macro(get_git_revision_and_branch)
0062 set(${PROJECT_NAME_UPPER}_GIT_SHA1_STRING "")
0063 set(${PROJECT_NAME_UPPER}_GIT_BRANCH_STRING "")
0064 get_git_head_revision(GIT_REFSPEC ${PROJECT_NAME_UPPER}_GIT_SHA1_STRING)
0065 get_git_branch(${PROJECT_NAME_UPPER}_GIT_BRANCH_STRING)
0066 if(NOT ${PROJECT_NAME_UPPER}_GIT_SHA1_STRING OR NOT ${PROJECT_NAME_UPPER}_GIT_BRANCH_STRING)
0067 if(EXISTS "${CMAKE_SOURCE_DIR}/GIT_VERSION")
0068 file(READ "${CMAKE_SOURCE_DIR}/GIT_VERSION" _ver)
0069 string(REGEX REPLACE "\n" ";" _ver "${_ver}")
0070 list(GET _ver 0 ${PROJECT_NAME_UPPER}_GIT_SHA1_STRING)
0071 list(GET _ver 1 ${PROJECT_NAME_UPPER}_GIT_BRANCH_STRING)
0072 endif()
0073 endif()
0074 if(${PROJECT_NAME_UPPER}_GIT_SHA1_STRING OR ${PROJECT_NAME_UPPER}_GIT_BRANCH_STRING)
0075 string(SUBSTRING ${${PROJECT_NAME_UPPER}_GIT_SHA1_STRING} 0 7 ${PROJECT_NAME_UPPER}_GIT_SHA1_STRING)
0076 else()
0077 set(${PROJECT_NAME_UPPER}_GIT_SHA1_STRING "")
0078 set(${PROJECT_NAME_UPPER}_GIT_BRANCH_STRING "")
0079 endif()
0080 endmacro()
0081
0082 # Adds ${PROJECT_NAME_UPPER}_UNFINISHED option. If it is ON, unfinished features
0083 # (useful for testing but may confuse end-user) are compiled-in.
0084 # This option is OFF by default.
0085 macro(add_unfinished_features_option)
0086 simple_option(${PROJECT_NAME_UPPER}_UNFINISHED
0087 "Include unfinished features (useful for testing but may confuse end-user)" OFF)
0088 endmacro()
0089
0090 # Adds commands that generate ${_filename}${KEXI_DISTRIBUTION_VERSION}.pc file
0091 # out of ${_filename}.pc.cmake file and installs the .pc file to ${LIB_INSTALL_DIR}/pkgconfig.
0092 # These commands are not executed for WIN32.
0093 # ${CMAKE_SOURCE_DIR}/${_filename}.pc.cmake should exist.
0094 macro(add_pc_file _filename)
0095 if (NOT WIN32)
0096 set(_name ${_filename}${KEXI_DISTRIBUTION_VERSION})
0097 configure_file(${CMAKE_SOURCE_DIR}/${_filename}.pc.cmake ${CMAKE_BINARY_DIR}/${_name}.pc @ONLY)
0098 install(FILES ${CMAKE_BINARY_DIR}/${_name}.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig)
0099 endif()
0100 endmacro()
0101
0102 # Sets detailed version information for library co-installability.
0103 # - adds PROJECT_STABLE_VERSION_MAJOR to the lib name
0104 # - sets VERSION to PROJECT_STABLE_VERSION_MAJOR.PROJECT_STABLE_VERSION_MINOR.PROJECT_STABLE_VERSION_RELEASE
0105 # - sets SOVERSION to KEXI_DISTRIBUTION_VERSION
0106 # - sets OUTPUT_NAME to ${_target}${KEXI_DISTRIBUTION_VERSION}
0107 # - sets ${_target_upper}_BASE_NAME variable to the final lib name
0108 # - sets ${_target_upper}_BASE_NAME_LOWER variable to the final lib name, lowercase
0109 # - sets ${_target_upper}_INCLUDE_INSTALL_DIR to include dir for library headers
0110 # - (where _target_upper is uppercase ${_target}
0111 macro(set_coinstallable_lib_version _target)
0112 set(_name ${_target}${KEXI_DISTRIBUTION_VERSION})
0113 set(_version "${PROJECT_STABLE_VERSION_MAJOR}.${PROJECT_STABLE_VERSION_MINOR}.${PROJECT_STABLE_VERSION_RELEASE}")
0114 set(_soversion ${KEXI_DISTRIBUTION_VERSION})
0115 set_target_properties(${_target}
0116 PROPERTIES VERSION ${_version}
0117 SOVERSION ${_soversion}
0118 EXPORT_NAME ${_target}
0119 OUTPUT_NAME ${_name}
0120 )
0121 string(TOUPPER ${_target} _target_upper)
0122 string(TOUPPER ${_target_upper}_BASE_NAME _var)
0123 set(${_var} ${_name})
0124 string(TOLOWER ${_name} ${_var}_LOWER)
0125 set(${_target_upper}_INCLUDE_INSTALL_DIR ${INCLUDE_INSTALL_DIR}/${_name})
0126 unset(_soversion)
0127 unset(_version)
0128 unset(_target_upper)
0129 unset(_var)
0130 endmacro()
0131
0132 # Combines add_library() with set_coinstallable_lib_version()
0133 macro(kexi_add_library)
0134 set(args ${ARGV})
0135 list(GET args 0 _target)
0136 add_library(${args})
0137 set_coinstallable_lib_version(${_target})
0138 unset(_target)
0139 endmacro()
0140
0141 # Sets detailed version information for executable co-installability.
0142 # - sets OUTPUT_NAME to ${_target}-${KEXI_DISTRIBUTION_VERSION}
0143 macro(set_coinstallable_executable_version _target)
0144 set_target_properties(${_target}
0145 PROPERTIES OUTPUT_NAME ${_target}-${KEXI_DISTRIBUTION_VERSION}
0146 )
0147 endmacro()
0148
0149 # Combines add_executable() with set_coinstallable_executable_version()
0150 macro(kexi_add_executable)
0151 set(args ${ARGV})
0152 list(GET args 0 _target)
0153 add_executable(${args})
0154 set_coinstallable_executable_version(${_target})
0155 unset(_target)
0156 endmacro()
0157
0158 # Adds custom target that updates given file in the current working dir using specified
0159 # command and adds its source files to the project files.
0160 # The target is not executed by default, if dependencies to/from other targets are needed
0161 # they can be set separately using add_dependencies().
0162 # Execution of the command shows status "Updating <filename>".
0163 # Options:
0164 # TARGET - name of the new custom target
0165 # FILE - <filename> - name of the file that is updated using the command
0166 # COMMAND <cmd> [args...] - command to be executed
0167 # SOURCES [files...] - source files that are used by the command
0168 function(add_update_file_target)
0169 set(options)
0170 set(oneValueArgs TARGET FILE)
0171 set(multiValueArgs COMMAND SOURCES)
0172 cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
0173 add_custom_target(${ARG_TARGET}
0174 COMMAND ${ARG_COMMAND}
0175 SOURCES ${ARG_SOURCES}
0176 DEPENDS ${ARG_SOURCES}
0177 WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
0178 COMMENT "Updating ${ARG_FILE}"
0179 VERBATIM
0180 )
0181 endfunction()
0182
0183 if(WIN32)
0184 set(_chmod_name attrib)
0185 else()
0186 set(_chmod_name chmod)
0187 endif()
0188 find_program(kexi_chmod_program ${_chmod_name} DOC "chmod program")
0189 if(kexi_chmod_program)
0190 message(STATUS "Found program for changing file permissions: ${kexi_chmod_program}")
0191 else()
0192 message(WARNING "Could not find \"${_chmod_name}\" program for changing file permissions")
0193 endif()
0194
0195 # Sets file or directory read-only for all (non-root) users.
0196 # The _path should exist. If it is not absolute, ${CMAKE_CURRENT_SOURCE_DIR} path is prepended.
0197 function(kexi_set_file_read_only _path)
0198 if(NOT kexi_chmod_program)
0199 return()
0200 endif()
0201 if(IS_ABSOLUTE ${_path})
0202 set(_fullpath ${_path})
0203 else()
0204 set(_fullpath ${CMAKE_CURRENT_SOURCE_DIR}/${_path})
0205 endif()
0206 if(NOT EXISTS ${_fullpath})
0207 message(FATAL_ERROR "File or directory \"${_fullpath}\" does not exist")
0208 return()
0209 endif()
0210 if(WIN32)
0211 set(_command "${kexi_chmod_program}" +R "${_fullpath}")
0212 else()
0213 set(_command "${kexi_chmod_program}" a-w "${_fullpath}")
0214 endif()
0215 execute_process(
0216 COMMAND ${_command}
0217 RESULT_VARIABLE _result
0218 OUTPUT_VARIABLE _output
0219 ERROR_VARIABLE _output
0220 )
0221 if(NOT _result EQUAL 0)
0222 message(FATAL_ERROR "Command failed (${_result}): ${_command}\n\nOutput:\n${_output}")
0223 endif()
0224 endfunction()
0225
0226 # Adds example KEXI project (.kexi file)
0227 # - sets it read-only in the source directory
0228 # - installs to ${KEXI_EXAMPLES_INSTALL_DIR} as read-only for everyone
0229 macro(kexi_add_example_project _path)
0230 #DISABLED - source code should not be modified even regarding the read-only flag
0231 #TODO: port the shell scripts from src/examples to cmake to generate .kexi file(s)
0232 # into build dirs and remove the .kexi example files from git. Keep .kexi.sql only in git.
0233 #kexi_set_file_read_only(${_path})
0234
0235 install(FILES ${_path} DESTINATION ${KEXI_EXAMPLES_INSTALL_DIR}
0236 PERMISSIONS OWNER_READ GROUP_READ WORLD_READ)
0237 endmacro()