################################################# # # (C) 2010-2012 Serghei Amelian # serghei (DOT) amelian (AT) gmail.com # # (C) 2011-2012 Timothy Pearson # kb9vqf (AT) pearsoncomputing.net # # (C) 2012-2020 Slávek Banko # slavek (DOT) banko (AT) axis.cz # # Improvements and feedback are welcome # # This file is released under GPL >= 2 # ################################################# ################################################# ##### ##### Need cmake minimum version include( TDEVersion ) ################################################# ##### ##### initialization... if( NOT TDE_CMAKE_ROOT ) if( "${CMAKE_VERSION}" VERSION_LESS "${TDE_CMAKE_MINIMUM_VERSION}" ) message( FATAL_ERROR "CMake >= ${TDE_CMAKE_MINIMUM_VERSION} required" ) endif() if( ${CMAKE_CURRENT_LIST_DIR} STREQUAL ${CMAKE_ROOT}/Modules ) # TDE CMake is installed in the system directory set( TDE_CMAKE_ROOT ${CMAKE_ROOT} CACHE FILEPATH "TDE CMake root" ) set( TDE_CMAKE_MODULES ${TDE_CMAKE_ROOT}/Modules CACHE FILEPATH "TDE CMake modules" ) set( TDE_CMAKE_TEMPLATES ${TDE_CMAKE_ROOT}/Templates CACHE FILEPATH "TDE CMake templates" ) else() # TDE CMake is part of the source code get_filename_component( TDE_CMAKE_ROOT ${CMAKE_CURRENT_LIST_DIR} PATH ) set( TDE_CMAKE_ROOT ${TDE_CMAKE_ROOT} CACHE FILEPATH "TDE CMake root" ) set( TDE_CMAKE_MODULES ${TDE_CMAKE_ROOT}/modules CACHE FILEPATH "TDE CMake modules" ) set( TDE_CMAKE_TEMPLATES ${TDE_CMAKE_ROOT}/templates CACHE FILEPATH "TDE CMake templates" ) endif() option( FORCE_COLORED_OUTPUT "Always produce ANSI-colored output (GNU/Clang only)." FALSE ) if( ${FORCE_COLORED_OUTPUT} ) if( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" ) if( NOT "${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS "4.9" ) add_compile_options (-fdiagnostics-color=always) endif() elseif( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" ) add_compile_options (-fcolor-diagnostics) endif() endif() endif() ################################################# ##### ##### set necessary CMake policies cmake_policy( PUSH ) if( POLICY CMP0057 ) # necessary for CheckLinkerFlag cmake_policy( SET CMP0057 NEW ) endif() ################################################# ##### ##### necessary includes include( CheckCXXCompilerFlag ) include( CheckCXXSourceCompiles ) include( CheckLinkerFlag OPTIONAL ) include( CheckSymbolExists ) include( CheckTypeSize ) ################################################# ##### ##### tde_concat_msg macro( tde_concat_msg _msg ) unset( ${_msg} ) foreach( _arg ${ARGN} ) string( APPEND ${_msg} " ${_arg}\n" ) endforeach() endmacro( tde_concat_msg ) ################################################# ##### ##### tde_message_author_warning function( tde_message_author_warning ) tde_concat_msg( _msg ${ARGV} ) message( AUTHOR_WARNING "-------------------------------------------------\n" "${_msg}" "-------------------------------------------------" ) endfunction( tde_message_author_warning ) ################################################# ##### ##### tde_message_fatal macro( tde_message_fatal ) tde_concat_msg( _msg ${ARGV} ) message( FATAL_ERROR "#################################################\n" "${_msg}" "#################################################" ) endmacro( tde_message_fatal ) ################################################# ##### ##### tde_get_arg( ) ##### ARG_NAME(string): name of an argument to find in ARGS ##### COUNT(number): argument dimension, a number of items returned in RETURN ##### RETURN(list ref): items returned for argument as they found in ARGS ##### REST(list ref): rest of items except argument name and items returned in RETURN ##### ARGS(list): source list of arguments macro( tde_get_arg ARG_NAME COUNT RETURN REST ) unset( ${RETURN} ) unset( ${REST} ) list( APPEND ${REST} ${ARGN} ) list( FIND ${REST} ${ARG_NAME} _arg_idx) if( NOT ${_arg_idx} EQUAL -1 ) list( REMOVE_AT ${REST} ${_arg_idx} ) set( _i 0 ) while( ${_i} LESS ${COUNT} ) list( GET ${REST} ${_arg_idx} _arg ) list( REMOVE_AT ${REST} ${_arg_idx} ) list( APPEND ${RETURN} ${_arg} ) math( EXPR _i "${_i} + 1" ) endwhile() endif() endmacro( tde_get_arg ) ################################################ ##### ##### tde_execute_process( [MESSAGE ] ) ##### MSG: fatal error message (standard message will be written if not supplied) ##### ARGS: execute_process arguments macro( tde_execute_process ) tde_get_arg( MESSAGE 1 _message _rest_args ${ARGV} ) tde_get_arg( RESULT_VARIABLE 1 _result_variable _tmp ${_rest_args} ) tde_get_arg( COMMAND 1 _command _tmp ${_rest_args} ) tde_get_arg( OUTPUT_VARIABLE 1 _output_variable _tmp ${_rest_args} ) tde_get_arg( CACHE 3 _cache _rest_args2 ${_rest_args} ) # handle optional FORCE parameter if( DEFINED _cache ) list( GET _cache 2 _tmp ) if( _tmp STREQUAL FORCE ) set( _rest_args ${_rest_args2} ) else() tde_get_arg( CACHE 2 _cache _rest_args ${_rest_args} ) endif() endif() if( NOT DEFINED _result_variable ) list( APPEND _rest_args RESULT_VARIABLE _exec_result ) set( _result_variable _exec_result ) endif() execute_process( ${_rest_args} ) if( DEFINED _output_variable AND DEFINED _cache ) set( ${_output_variable} ${${_output_variable}} CACHE ${_cache} ) endif() if( ${_result_variable} ) if( DEFINED _message ) tde_message_fatal( ${_message} ) else() if( ${${_result_variable}} MATCHES "^[0-9]+$" ) set( ${_result_variable} "status ${${_result_variable}} returned!" ) endif() tde_message_fatal( "Error executing '${_command}': ${${_result_variable}}" ) endif() endif() endmacro( tde_execute_process ) ################################################ ##### ##### tde_read_src_metadata macro( tde_read_src_metadata ) # look for SCM data if present if( EXISTS "${CMAKE_SOURCE_DIR}/.tdescminfo" ) file( READ "${CMAKE_SOURCE_DIR}/.tdescminfo" TDE_SCM_INFO ) string( REGEX MATCH "(^|\n)Name: ([^\n]*)" TDE_SCM_MODULE_NAME "${TDE_SCM_INFO}" ) string( REGEX REPLACE "^[^:]*: " "" TDE_SCM_MODULE_NAME "${TDE_SCM_MODULE_NAME}" ) string( REGEX MATCH "(^|\n)Revision: ([^\n]*)" TDE_SCM_MODULE_REVISION "${TDE_SCM_INFO}" ) string( REGEX REPLACE "^[^:]*: " "" TDE_SCM_MODULE_REVISION "${TDE_SCM_MODULE_REVISION}" ) string( REGEX MATCH "(^|\n)DateTime: ([^\n]*)" TDE_SCM_MODULE_DATETIME "${TDE_SCM_INFO}" ) string( REGEX REPLACE "^[^:]*: " "" TDE_SCM_MODULE_DATETIME "${TDE_SCM_MODULE_DATETIME}" ) else( ) if( EXISTS "${CMAKE_SOURCE_DIR}/.tdescmmodule" ) file( STRINGS "${CMAKE_SOURCE_DIR}/.tdescmmodule" TDE_SCM_MODULE_NAME ) endif( EXISTS "${CMAKE_SOURCE_DIR}/.tdescmmodule" ) if( EXISTS "${CMAKE_SOURCE_DIR}/.tdescmrevision" ) file( STRINGS "${CMAKE_SOURCE_DIR}/.tdescmrevision" TDE_SCM_MODULE_REVISION ) endif( EXISTS "${CMAKE_SOURCE_DIR}/.tdescmrevision" ) endif( ) # look for package data if present if( EXISTS "${CMAKE_SOURCE_DIR}/.tdepkginfo" ) file( READ "${CMAKE_SOURCE_DIR}/.tdepkginfo" TDE_PKG_INFO ) endif( ) if( EXISTS "${CMAKE_BINARY_DIR}/.tdepkginfo" ) file( READ "${CMAKE_BINARY_DIR}/.tdepkginfo" TDE_PKG_INFO ) endif( ) if( TDE_PKG_INFO ) string( REGEX MATCH "(^|\n)Name: ([^\n]*)" TDE_PKG_NAME "${TDE_PKG_INFO}" ) string( REGEX REPLACE "^[^:]*: " "" TDE_PKG_NAME "${TDE_PKG_NAME}" ) string( REGEX MATCH "(^|\n)Version: ([^\n]*)" TDE_PKG_VERSION "${TDE_PKG_INFO}" ) string( REGEX REPLACE "^[^:]*: " "" TDE_PKG_VERSION "${TDE_PKG_VERSION}" ) string( REGEX MATCH "(^|\n)DateTime: ([^\n]*)" TDE_PKG_DATETIME "${TDE_PKG_INFO}" ) string( REGEX REPLACE "^[^:]*: " "" TDE_PKG_DATETIME "${TDE_PKG_DATETIME}" ) endif( ) endmacro( tde_read_src_metadata ) ################################################ ##### ##### finalization as a slave part if( DEFINED MASTER_SOURCE_DIR ) cmake_policy( POP ) return( ) endif( ) ########### slave part ends here ############### ################################################ ##### ##### tde_install_icons( THEME DESTINATION ) ##### default theme: hicolor ##### default destination: ${SHARE_INSTALL_DIR}/icons macro( tde_install_icons ) tde_get_arg( DESTINATION 1 _dest _args ${ARGV} ) tde_get_arg( THEME 1 _req_theme _icons ${_args} ) #defaults if( NOT _icons ) set( _icons "*" ) endif( NOT _icons ) if( NOT _dest ) set( _dest "${ICON_INSTALL_DIR}" ) endif( NOT _dest ) foreach( _icon ${_icons} ) unset( _theme ) # clearing file(GLOB _icon_files *-${_icon}.png *-${_icon}.mng _icon_files *-${_icon}.svg* ) foreach( _icon_file ${_icon_files} ) # FIXME need a review string( REGEX MATCH "^.*/([a-zA-Z][a-zA-Z])([0-9a-zA-Z]+)\\-([a-z]+)\\-([^/]+)$" _dummy "${_icon_file}" ) set( _type "${CMAKE_MATCH_1}" ) set( _size "${CMAKE_MATCH_2}" ) set( _group "${CMAKE_MATCH_3}" ) set( _name "${CMAKE_MATCH_4}" ) # we must ignore invalid icon names if( _type AND _size AND _group AND _name ) # autodetect theme if( NOT _req_theme ) unset( _theme ) if( "${_type}" STREQUAL "cr" ) set( _theme crystalsvg ) elseif( "${_type}" STREQUAL "lo" ) set( _theme locolor ) endif( "${_type}" STREQUAL "cr" ) # defaulting if( NOT _theme ) set( _theme hicolor ) endif( NOT _theme ) else( NOT _req_theme ) set( _theme ${_req_theme} ) endif( NOT _req_theme ) # fix "group" name if( "${_group}" STREQUAL "mime" ) set( _group "mimetypes" ) endif( "${_group}" STREQUAL "mime" ) if( "${_group}" STREQUAL "filesys" ) set( _group "places" ) endif( "${_group}" STREQUAL "filesys" ) if( "${_group}" STREQUAL "category" ) set( _group "categories" ) endif( "${_group}" STREQUAL "category" ) if( "${_group}" STREQUAL "device" ) set( _group "devices" ) endif( "${_group}" STREQUAL "device" ) if( "${_group}" STREQUAL "app" ) set( _group "apps" ) endif( "${_group}" STREQUAL "app" ) if( "${_group}" STREQUAL "action" ) set( _group "actions" ) endif( "${_group}" STREQUAL "action" ) if( "${_size}" STREQUAL "sc" ) install( FILES ${_icon_file} DESTINATION ${_dest}/${_theme}/scalable/${_group}/ RENAME ${_name} ) else( "${_size}" STREQUAL "sc" ) install( FILES ${_icon_file} DESTINATION ${_dest}/${_theme}/${_size}x${_size}/${_group}/ RENAME ${_name} ) endif( "${_size}" STREQUAL "sc" ) endif( _type AND _size AND _group AND _name ) endforeach( _icon_file ) endforeach( _icon ) endmacro( tde_install_icons ) ################################################# ##### ##### tde_add_lut( [depends] ) ##### default depends: source macro( tde_add_lut _src _lut _dep ) set( create_hash_table ${CMAKE_SOURCE_DIR}/kjs/create_hash_table ) if( NOT _dep ) set( _dep ${_src} ) endif( NOT _dep ) add_custom_command( OUTPUT ${_lut} COMMAND perl ARGS ${create_hash_table} ${CMAKE_CURRENT_SOURCE_DIR}/${_src} -i > ${_lut} DEPENDS ${_src} ) set_source_files_properties( ${_dep} PROPERTIES OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${_lut} ) unset( _dep ) endmacro( tde_add_lut ) ################################################# ##### ##### tde_add_luts( ) macro( tde_add_luts ) foreach( _src ${ARGV} ) get_filename_component( _lut ${_src} NAME_WE ) set( _lut "${_lut}.lut.h" ) tde_add_lut( ${_src} ${_lut} ${_src} ) endforeach( _src ) endmacro( tde_add_luts ) ################################################# ##### ##### tde_file_to_cpp( ) macro( tde_file_to_cpp _src _dst _var ) if( IS_ABSOLUTE ${_dst} ) set( dst ${_dst} ) else( ) set( dst "${CMAKE_CURRENT_BINARY_DIR}/${_dst}" ) endif( ) file( READ ${_src} text ) string( REGEX REPLACE "\n" "\\\\n\"\n\"" text "${text}" ) set( text "/* Generated by CMake */\n\nconst char *${_var} = \n\n\"${text}\";\n" ) string( REGEX REPLACE "\n\"\";\n$" ";\n" text "${text}" ) file( WRITE ${dst} "${text}" ) endmacro( ) ################################################# ##### ##### tde_get_library_filename( ) function( tde_get_library_filename _filename _target ) get_target_property( _type ${_target} TYPE ) if( "${_type}" MATCHES "_LIBRARY" ) get_target_property( _output_prefix ${_target} PREFIX ) if( "${_output_prefix}" STREQUAL "_output_prefix-NOTFOUND" ) if( "${_type}" MATCHES "STATIC_" ) set( _output_prefix "${CMAKE_STATIC_LIBRARY_PREFIX}" ) elseif( "${_type}" MATCHES "SHARED_" ) set( _output_prefix "${CMAKE_SHARED_LIBRARY_PREFIX}" ) elseif( "${_type}" MATCHES "MODULE_" ) set( _output_prefix "${CMAKE_SHARED_MODULE_PREFIX}" ) else( ) set( _output_prefix "" ) endif( ) endif( ) get_target_property( _output_suffix ${_target} SUFFIX ) if( "${_output_suffix}" STREQUAL "_output_suffix-NOTFOUND" ) if( "${_type}" MATCHES "STATIC_" ) set( _output_suffix "${CMAKE_STATIC_LIBRARY_SUFFIX}" ) elseif( "${_type}" MATCHES "SHARED_" ) set( _output_suffix "${CMAKE_SHARED_LIBRARY_SUFFIX}" ) elseif( "${_type}" MATCHES "MODULE_" ) set( _output_suffix "${CMAKE_SHARED_MODULE_SUFFIX}" ) else( ) set( _output_suffix "" ) endif( ) endif( ) get_target_property( _output ${_target} OUTPUT_NAME ) set( ${_filename} "${_output_prefix}${_output}${_output_suffix}" PARENT_SCOPE ) else( ) set( ${_filename} "" PARENT_SCOPE ) endif( ) endfunction( ) ################################################# ##### ##### tde_install_la_file( ) macro( tde_install_la_file _target _destination ) tde_get_library_filename( _soname ${_target} ) get_target_property( _target_release ${_target} RELEASE ) if( _target_release ) string( REPLACE "-${_target_release}" "" _soname_base "${_soname}" ) else( ) set( _soname_base ${_soname} ) endif( ) string( REGEX REPLACE "\\.so(\\.[0-9]+)*$" "" _laname "${_soname_base}" ) set( _laname ${CMAKE_CURRENT_BINARY_DIR}/${_laname}.la ) file( WRITE ${_laname} "# ${_laname} - a libtool library file, generated by cmake # The name that we can dlopen(3). dlname='${_soname}' # Names of this library library_names='${_soname} ${_soname} ${_soname_base}' # The name of the static archive old_library='' # Libraries that this one depends upon. dependency_libs='' # Version information.\ncurrent=0\nage=0\nrevision=0 # Is this an already installed library?\ninstalled=yes # Should we warn about portability when linking against -modules?\nshouldnotlink=yes # Files to dlopen/dlpreopen\ndlopen=''\ndlpreopen='' # Directory that this library needs to be installed in: libdir='${_destination}' " ) install( FILES ${_laname} DESTINATION ${_destination} ) endmacro( tde_install_la_file ) ################################################# ##### ##### tde_add_ui_files macro( tde_add_ui_files _sources ) if( TDE_FOUND OR "${CMAKE_PROJECT_NAME}" STREQUAL "tdelibs" ) set( HAVE_TDE 1 ) endif() foreach( _ui_file ${ARGN} ) get_filename_component( _ui_basename ${_ui_file} NAME_WE ) get_filename_component( _ui_absolute_path ${_ui_file} ABSOLUTE ) list( APPEND ${_sources} ${_ui_basename}.cpp ) add_custom_command( OUTPUT ${_ui_basename}.h ${_ui_basename}.cpp COMMAND ${CMAKE_COMMAND} -DUIC_EXECUTABLE:FILEPATH=${UIC_EXECUTABLE} -DTQT_REPLACE_SCRIPT:FILEPATH=${TQT_REPLACE_SCRIPT} -DTDE_TQTPLUGINS_DIR:FILEPATH=${TDE_TQTPLUGINS_DIR} -DMOC_EXECUTABLE:FILEPATH=${MOC_EXECUTABLE} -DUI_FILE:FILEPATH=${_ui_absolute_path} -DMASTER_SOURCE_DIR:FILEPATH=${CMAKE_SOURCE_DIR} -DMASTER_BINARY_DIR:FILEPATH=${CMAKE_BINARY_DIR} -DTDE_FOUND=${HAVE_TDE} -DTQT_ONLY=${TQT_ONLY} -P ${TDE_CMAKE_MODULES}/tde_uic.cmake DEPENDS ${_ui_absolute_path} ) endforeach( _ui_file ) endmacro( tde_add_ui_files ) ################################################# ##### ##### tde_moc macro( tde_moc _sources ) foreach( _input_file ${ARGN} ) get_filename_component( _input_file "${_input_file}" ABSOLUTE ) get_filename_component( _basename ${_input_file} NAME_WE ) set( _output_file "${_basename}.moc.cpp" ) add_custom_command( OUTPUT ${_output_file} COMMAND ${TMOC_EXECUTABLE} ${_input_file} -o ${_output_file} DEPENDS ${_input_file} ) list( APPEND ${_sources} ${_output_file} ) endforeach( ) endmacro( ) ################################################# ##### ##### tde_automoc macro( tde_automoc ) foreach( _src_file ${ARGN} ) get_filename_component( _src_file "${_src_file}" ABSOLUTE ) if( EXISTS "${_src_file}" ) # read source file and check if have moc include file( READ "${_src_file}" _src_content ) string( REGEX MATCHALL "#include +[^ ]+\\.moc[\">]" _moc_includes "${_src_content}" ) # found included moc(s)? if( _moc_includes ) foreach( _moc_file ${_moc_includes} ) # extracting moc filename string( REGEX MATCH "[^ <\"]+\\.moc" _moc_file "${_moc_file}" ) set( _moc_file "${CMAKE_CURRENT_BINARY_DIR}/${_moc_file}" ) # create header filename get_filename_component( _src_path "${_src_file}" ABSOLUTE ) get_filename_component( _src_path "${_src_path}" PATH ) get_filename_component( _src_header "${_moc_file}" NAME_WE ) set( _header_file "${_src_path}/${_src_header}.h" ) # if header doesn't exists, check in META_INCLUDES if( NOT EXISTS "${_header_file}" ) unset( _found ) foreach( _src_path ${_meta_includes} ) set( _header_file "${_src_path}/${_src_header}.h" ) if( EXISTS "${_header_file}" ) set( _found 1 ) break( ) endif( ) endforeach( ) if( NOT _found ) get_filename_component( _moc_file "${_moc_file}" NAME ) tde_message_fatal( "AUTOMOC error: '${_moc_file}' cannot be generated.\n Reason: '${_src_header}.h' not found." ) endif( ) endif( ) # moc-ing header file( RELATIVE_PATH _moc_file_relative "${CMAKE_BINARY_DIR}" "${_moc_file}" ) add_custom_command( OUTPUT ${_moc_file} COMMAND ${TMOC_EXECUTABLE} ${_header_file} -o ${_moc_file} COMMENT "Generating ${_moc_file_relative}" DEPENDS ${_header_file} ) # create dependency between source file and moc file set_property( SOURCE ${_src_file} APPEND PROPERTY OBJECT_DEPENDS ${_moc_file} ) endforeach( _moc_file ) endif( _moc_includes ) else( EXISTS "${_src_file}" ) # for generated file, the path must match the binary directory string( LENGTH "${CMAKE_BINARY_DIR}" CMAKE_BINARY_DIR_LEN ) string( LENGTH "${_src_file}" _basename_len ) if( ${_basename_len} LESS ${CMAKE_BINARY_DIR_LEN} ) set( _basedir_prefix "${CMAKE_SOURCE_DIR}" ) else( ) string( SUBSTRING "${_src_file}" 0 ${CMAKE_BINARY_DIR_LEN} _basedir_prefix ) endif( ) if( ${_basedir_prefix} STREQUAL "${CMAKE_BINARY_DIR}" ) file( RELATIVE_PATH _sourcename "${CMAKE_BINARY_DIR}" "${_src_file}" ) file( RELATIVE_PATH _basename "${CMAKE_CURRENT_BINARY_DIR}" "${_src_file}" ) else( ) file( RELATIVE_PATH _sourcename "${CMAKE_SOURCE_DIR}" "${_src_file}" ) file( RELATIVE_PATH _basename "${CMAKE_CURRENT_SOURCE_DIR}" "${_src_file}" ) endif( ) # automocing generated file get_filename_component( _automoc_file "${_src_file}+automoc" NAME ) set( _automoc_file "${CMAKE_CURRENT_BINARY_DIR}/${_automoc_file}" ) add_custom_command( OUTPUT ${_automoc_file} COMMAND ${CMAKE_COMMAND} -DTMOC_EXECUTABLE:FILEPATH=${TMOC_EXECUTABLE} -DSRC_FILE:FILEPATH=${CMAKE_CURRENT_BINARY_DIR}/${_basename} -DMETA_INCLUDES:STRING="${_meta_includes}" -DMASTER_SOURCE_DIR:FILEPATH=${CMAKE_SOURCE_DIR} -DMASTER_BINARY_DIR:FILEPATH=${CMAKE_BINARY_DIR} -P ${TDE_CMAKE_MODULES}/tde_automoc.cmake COMMENT "Automocing ${_sourcename}" DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${_basename}" ) # create dependency between source file and moc file set_property( SOURCE "${CMAKE_CURRENT_BINARY_DIR}/${_basename}" APPEND PROPERTY OBJECT_DEPENDS ${_automoc_file} ) endif( EXISTS "${_src_file}" ) endforeach( _src_file ) endmacro( tde_automoc ) ################################################# ##### ##### tde_create_dcop_kidl macro( tde_create_dcop_kidl _kidl _kidl_source ) get_filename_component( _kidl_source ${_kidl_source} ABSOLUTE ) get_filename_component( _kidl_basename ${_kidl_source} NAME_WE ) set( _kidl_output ${CMAKE_CURRENT_BINARY_DIR}/${_kidl_basename}.kidl ) file( RELATIVE_PATH _kidl_target "${CMAKE_BINARY_DIR}" "${_kidl_output}" ) string( REPLACE "/" "+" _kidl_target "${_kidl_target}" ) if( NOT TARGET ${_kidl_target} ) add_custom_command( OUTPUT ${_kidl_output} COMMAND ${KDE3_DCOPIDLNG_EXECUTABLE} ARGS ${_kidl_source} > ${_kidl_output} DEPENDS ${_kidl_source} ) add_custom_target( ${_kidl_target} DEPENDS ${_kidl_output} ) endif( ) set( ${_kidl} ${_kidl_output} ) endmacro( tde_create_dcop_kidl ) ################################################# ##### ##### tde_add_dcop_skels macro( tde_add_dcop_skels _sources ) foreach( _current_FILE ${ARGN} ) get_filename_component( _tmp_FILE ${_current_FILE} ABSOLUTE ) get_filename_component( _basename ${_tmp_FILE} NAME_WE ) set( _skel ${CMAKE_CURRENT_BINARY_DIR}/${_basename}_skel.cpp ) file( RELATIVE_PATH _skel_target "${CMAKE_BINARY_DIR}" "${_skel}" ) string( REPLACE "/" "+" _skel_target "${_skel_target}" ) tde_create_dcop_kidl( _kidl ${_tmp_FILE} ) if( NOT TARGET ${_skel_target} ) add_custom_command( OUTPUT ${_skel} COMMAND ${KDE3_DCOPIDL2CPP_EXECUTABLE} ARGS --c++-suffix cpp --no-signals --no-stub ${_kidl} DEPENDS ${_kidl_target} ) add_custom_target( ${_skel_target} DEPENDS ${_skel} ) endif( ) list( APPEND ${_sources} ${_skel} ) endforeach( _current_FILE ) endmacro( tde_add_dcop_skels ) ################################################# ##### ##### tde_add_dcop_stubs macro( tde_add_dcop_stubs _sources ) foreach( _current_FILE ${ARGN} ) get_filename_component( _tmp_FILE ${_current_FILE} ABSOLUTE ) get_filename_component( _basename ${_tmp_FILE} NAME_WE ) set( _stub_CPP ${CMAKE_CURRENT_BINARY_DIR}/${_basename}_stub.cpp ) set( _stub_HEADER ${CMAKE_CURRENT_BINARY_DIR}/${_basename}_stub.h ) file( RELATIVE_PATH _stub_target "${CMAKE_BINARY_DIR}" "${_stub_CPP}" ) string( REPLACE "/" "+" _stub_target "${_stub_target}" ) tde_create_dcop_kidl( _kidl ${_tmp_FILE} ) if( NOT TARGET ${_stub_target} ) add_custom_command( OUTPUT ${_stub_CPP} ${_stub_HEADER} COMMAND ${KDE3_DCOPIDL2CPP_EXECUTABLE} ARGS --c++-suffix cpp --no-signals --no-skel ${_kidl} DEPENDS ${_kidl_target} ) add_custom_target( ${_stub_target} DEPENDS ${_stub_CPP} ${_stub_HEADER} ) endif( ) list( APPEND ${_sources} ${_stub_CPP} ) endforeach( _current_FILE ) endmacro( tde_add_dcop_stubs ) ################################################# ##### ##### tde_add_kcfg_files macro( tde_add_kcfg_files _sources ) foreach( _current_FILE ${ARGN} ) get_filename_component( _tmp_FILE ${_current_FILE} ABSOLUTE ) get_filename_component( _basename ${_tmp_FILE} NAME_WE ) file( READ ${_tmp_FILE} _contents ) string( REGEX REPLACE "^(.*\n)?File=([^\n]+)\n.*$" "\\2" _kcfg_FILE "${_contents}" ) set( _src_FILE ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.cpp ) set( _header_FILE ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.h ) file( RELATIVE_PATH _kcfg_target "${CMAKE_BINARY_DIR}" "${_src_FILE}" ) string( REPLACE "/" "+" _kcfg_target "${_kcfg_target}" ) if( NOT TARGET ${_kcfg_target} ) add_custom_command( OUTPUT ${_src_FILE} ${_header_FILE} COMMAND ${KDE3_KCFGC_EXECUTABLE} ARGS ${CMAKE_CURRENT_SOURCE_DIR}/${_kcfg_FILE} ${_tmp_FILE} DEPENDS ${_tmp_FILE} ${CMAKE_CURRENT_SOURCE_DIR}/${_kcfg_FILE} ) add_custom_target( ${_kcfg_target} DEPENDS ${_src_FILE} ${_header_FILE} ) endif( ) list( APPEND ${_sources} ${_src_FILE} ) endforeach( _current_FILE ) endmacro( tde_add_kcfg_files ) ################################################# ##### ##### __tde_internal_process_sources macro( __tde_internal_process_sources _sources ) unset( ${_sources} ) foreach( _arg ${ARGN} ) get_filename_component( _ext ${_arg} EXT ) get_filename_component( _name ${_arg} NAME_WE ) get_filename_component( _path ${_arg} PATH ) # if not path, set it to "." if( NOT _path ) set( _path "./" ) endif( NOT _path ) # handle .ui files if( ${_ext} STREQUAL ".ui" ) tde_add_ui_files( ${_sources} ${_arg} ) # handle .skel files elseif( ${_ext} STREQUAL ".skel" ) tde_add_dcop_skels( ${_sources} ${_path}/${_name}.h ) # handle .stub files elseif( ${_ext} STREQUAL ".stub" ) tde_add_dcop_stubs( ${_sources} ${_path}/${_name}.h ) # handle .kcfgc files elseif( ${_ext} STREQUAL ".kcfgc" ) tde_add_kcfg_files( ${_sources} ${_arg} ) # handle any other files else( ${_ext} STREQUAL ".ui" ) list(APPEND ${_sources} ${_arg} ) endif( ${_ext} STREQUAL ".ui" ) endforeach( _arg ) endmacro( __tde_internal_process_sources ) ################################################# ##### ##### tde_install_libtool_file macro( tde_install_libtool_file _target _destination ) # get .so name tde_get_library_filename( _soname ${_target} ) get_target_property( _target_release ${_target} RELEASE ) if( _target_release ) string( REPLACE "-${_target_release}" "" _soname_base "${_soname}" ) else( ) set( _soname_base ${_soname} ) endif( ) # get .la name string( REGEX REPLACE "\\.so(\\.[0-9]+)*$" "" _laname "${_soname_base}" ) set( _laname ${_laname}.la ) # get version of target get_target_property( _target_version ${_target} VERSION ) get_target_property( _target_soversion ${_target} SOVERSION ) # we have so version if( _target_version ) set( _library_name_1 "${_soname}.${_target_version}" ) set( _library_name_2 "${_soname}.${_target_soversion}" ) set( _library_name_3 "${_soname_base}" ) string( REGEX MATCH "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" _dummy "${_target_version}" ) set( _version_current "${CMAKE_MATCH_1}" ) set( _version_age "${CMAKE_MATCH_2}" ) set( _version_revision "${CMAKE_MATCH_3}" ) # we have no so version (module?) else( _target_version ) set( _library_name_1 "${_soname}" ) set( _library_name_2 "${_soname}" ) set( _library_name_3 "${_soname_base}" ) set( _version_current "0" ) set( _version_age "0" ) set( _version_revision "0" ) endif( _target_version ) if( IS_ABSOLUTE ${_destination} ) set( _libdir "${_destination}" ) else( IS_ABSOLUTE ${_destination} ) set( _libdir "${CMAKE_INSTALL_PREFIX}/${_destination}" ) endif( IS_ABSOLUTE ${_destination} ) configure_file( ${TDE_CMAKE_TEMPLATES}/tde_libtool_file.cmake "${_laname}" @ONLY ) install( FILES "${CMAKE_CURRENT_BINARY_DIR}/${_laname}" DESTINATION ${_destination} ) endmacro( tde_install_libtool_file ) ################################################# ##### ##### tde_install_export / tde_import function( tde_install_export ) file( GLOB export_files ${CMAKE_CURRENT_BINARY_DIR}/export-*.cmake ) list( SORT export_files ) set( mode "WRITE" ) foreach( filename ${export_files} ) file( READ ${filename} content ) file( ${mode} "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.cmake" "${content}" ) set( mode "APPEND" ) endforeach( ) install( FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.cmake" DESTINATION ${CMAKE_INSTALL_DIR} ) endfunction( ) macro( tde_import _library ) if( NOT DEFINED TDE_IMPORT_${_library} ) message( STATUS "Checking for '${_library}'" ) string( TOUPPER "BUILD_${_library}" _build ) if( ${_build} ) message( STATUS "Checking for '${_library}' - ok, activated for build" ) set( TDE_IMPORT_${_library} "build" CACHE INTERNAL "Library ${_library} activated for build" ) else() if( EXISTS "${TDE_CMAKE_DIR}/${_library}.cmake" ) include( "${TDE_CMAKE_DIR}/${_library}.cmake" ) elseif( EXISTS "${TQT_CMAKE_DIR}/${_library}.cmake" ) include( "${TQT_CMAKE_DIR}/${_library}.cmake" ) else() tde_message_fatal( "'${_library}' is required, but is not installed nor selected for build" ) endif() message( STATUS "Checking for '${_library}' - ok, found import file" ) set( TDE_IMPORT_${_library} "import" CACHE INTERNAL "Library ${_library} imported" ) endif() endif() endmacro() ################################################# ##### ##### tde_add_library macro( tde_add_library _arg_target ) unset( _target ) unset( _type ) unset( _static_pic ) unset( _automoc ) unset( _meta_includes ) unset( _no_libtool_file ) unset( _no_export ) unset( _version ) unset( _release ) unset( _sources ) unset( _cxx_features ) unset( _cxx_features_private ) unset( _destination ) unset( _embed ) unset( _link ) unset( _link_private ) unset( _dependencies ) unset( _storage ) unset( _exclude_from_all ) set( _shouldnotlink no ) # metadata unset( _description ) unset( _license ) unset( _copyright ) unset( _authors ) unset( _product ) unset( _organization ) unset( _version ) unset( _datetime ) unset( _notes ) # default metadata set( _product "Trinity Desktop Environment" ) tde_curdatetime( _datetime ) foreach( _arg ${ARGV} ) # this variable help us to skip # storing unapropriate values (i.e. directives) unset( _skip_store ) # found one of directives: "SHARED", "STATIC", "MODULE" if( "+${_arg}" STREQUAL "+SHARED" OR "+${_arg}" STREQUAL "+STATIC" OR "+${_arg}" STREQUAL "+MODULE" ) set( _skip_store 1 ) set( _type "${_arg}" ) endif( "+${_arg}" STREQUAL "+SHARED" OR "+${_arg}" STREQUAL "+STATIC" OR "+${_arg}" STREQUAL "+MODULE" ) # found directive "STATIC_PIC" if( "+${_arg}" STREQUAL "+STATIC_PIC" ) set( _skip_store 1 ) set( _type "STATIC" ) set( _static_pic 1 ) endif( "+${_arg}" STREQUAL "+STATIC_PIC" ) # found directive "AUTOMOC" if( "+${_arg}" STREQUAL "+AUTOMOC" ) set( _skip_store 1 ) set( _automoc 1 ) endif( "+${_arg}" STREQUAL "+AUTOMOC" ) # found directive "META_INCLUDES" if( "+${_arg}" STREQUAL "+META_INCLUDES" ) set( _skip_store 1 ) set( _storage "_meta_includes" ) endif( ) # found directive "NO_LIBTOOL_FILE" if( "+${_arg}" STREQUAL "+NO_LIBTOOL_FILE" ) set( _skip_store 1 ) set( _no_libtool_file 1 ) endif( "+${_arg}" STREQUAL "+NO_LIBTOOL_FILE" ) # found directive "NO_EXPORT" if( "+${_arg}" STREQUAL "+NO_EXPORT" ) set( _skip_store 1 ) set( _no_export 1 ) endif( "+${_arg}" STREQUAL "+NO_EXPORT" ) # found directive "VERSION" if( "+${_arg}" STREQUAL "+VERSION" ) set( _skip_store 1 ) set( _storage "_version" ) endif( "+${_arg}" STREQUAL "+VERSION" ) # found directive "RELEASE" if( "+${_arg}" STREQUAL "+RELEASE" ) set( _skip_store 1 ) set( _storage "_release" ) endif( "+${_arg}" STREQUAL "+RELEASE" ) # found directive "SOURCES" if( "+${_arg}" STREQUAL "+SOURCES" ) set( _skip_store 1 ) set( _storage "_sources" ) endif( "+${_arg}" STREQUAL "+SOURCES" ) # found directive "CXX_FEATURES" if( "+${_arg}" STREQUAL "+CXX_FEATURES" ) set( _skip_store 1 ) set( _storage "_cxx_features" ) endif( "+${_arg}" STREQUAL "+CXX_FEATURES" ) # found directive "CXX_FEATURES_PRIVATE" if( "+${_arg}" STREQUAL "+CXX_FEATURES_PRIVATE" ) set( _skip_store 1 ) set( _storage "_cxx_features_private" ) endif( "+${_arg}" STREQUAL "+CXX_FEATURES_PRIVATE" ) # found directive "EMBED" if( "+${_arg}" STREQUAL "+EMBED" ) set( _skip_store 1 ) set( _storage "_embed" ) endif( "+${_arg}" STREQUAL "+EMBED" ) # found directive "LINK" if( "+${_arg}" STREQUAL "+LINK" ) set( _skip_store 1 ) set( _storage "_link" ) endif( "+${_arg}" STREQUAL "+LINK" ) # found directive "LINK_PRIVATE" if( "+${_arg}" STREQUAL "+LINK_PRIVATE" ) set( _skip_store 1 ) set( _storage "_link_private" ) endif( "+${_arg}" STREQUAL "+LINK_PRIVATE" ) # found directive "DEPENDENCIES" if( "+${_arg}" STREQUAL "+DEPENDENCIES" ) set( _skip_store 1 ) set( _storage "_dependencies" ) endif( "+${_arg}" STREQUAL "+DEPENDENCIES" ) # found directive "DESTINATION" if( "+${_arg}" STREQUAL "+DESTINATION" ) set( _skip_store 1 ) set( _storage "_destination" ) unset( ${_storage} ) endif( "+${_arg}" STREQUAL "+DESTINATION" ) # found directive "EXCLUDE_FROM_ALL" if( "+${_arg}" STREQUAL "+EXCLUDE_FROM_ALL" ) set( _skip_store 1 ) set( _exclude_from_all "EXCLUDE_FROM_ALL" ) endif( "+${_arg}" STREQUAL "+EXCLUDE_FROM_ALL" ) # metadata if( "+${_arg}" STREQUAL "+DESCRIPTION" ) set( _skip_store 1 ) set( _storage "_description" ) endif( ) if( "+${_arg}" STREQUAL "+LICENSE" ) set( _skip_store 1 ) set( _storage "_license" ) endif( ) if( "+${_arg}" STREQUAL "+COPYRIGHT" ) set( _skip_store 1 ) set( _storage "_copyright" ) endif( ) if( "+${_arg}" STREQUAL "+AUTHORS" ) set( _skip_store 1 ) set( _storage "_authors" ) endif( ) if( "+${_arg}" STREQUAL "+PRODUCT" ) set( _skip_store 1 ) set( _storage "_product" ) endif( ) if( "+${_arg}" STREQUAL "+ORGANIZATION" ) set( _skip_store 1 ) set( _storage "_organization" ) endif( ) if( "+${_arg}" STREQUAL "+VERSION" ) set( _skip_store 1 ) set( _storage "_version" ) endif( ) if( "+${_arg}" STREQUAL "+DATETIME" ) set( _skip_store 1 ) set( _storage "_datetime" ) endif( ) if( "+${_arg}" STREQUAL "+NOTES" ) set( _skip_store 1 ) set( _storage "_notes" ) endif( ) # storing value if( _storage AND NOT _skip_store ) list( APPEND ${_storage} ${_arg} ) list( REMOVE_DUPLICATES ${_storage} ) endif( _storage AND NOT _skip_store ) endforeach( _arg ) # if no type is set, we choose one # based on BUILD_SHARED_LIBS if( NOT _type ) if( BUILD_SHARED_LIBS ) set( _type "SHARED" ) else( BUILD_SHARED_LIBS ) set( _type "STATIC" ) endif( BUILD_SHARED_LIBS ) endif( NOT _type ) # change target name, based on type string( TOLOWER "${_type}" _type_lower ) set( _target "${_arg_target}-${_type_lower}" ) # create variables like "LIB_xxx" for convenience if( ${_type} STREQUAL "SHARED" ) string( TOUPPER "${_arg_target}" _tmp ) set( LIB_${_tmp} ${_target} CACHE INTERNAL LIB_${tmp} FORCE ) endif( ${_type} STREQUAL "SHARED" ) # disallow target without sources if( NOT _sources ) message( FATAL_ERROR "\nTarget [$_target] have no sources." ) endif( NOT _sources ) # processing different types of sources __tde_internal_process_sources( _sources ${_sources} ) # set automoc if( _automoc ) tde_automoc( ${_sources} ) endif( _automoc ) # add target add_library( ${_target} ${_type} ${_exclude_from_all} ${_sources} ) # set cxx features if( _cxx_features ) target_compile_features( ${_target} PUBLIC ${_cxx_features} ) endif( ) if( TDE_CXX_FEATURES OR PROJECT_CXX_FEATURES OR _cxx_features_private ) target_compile_features( ${_target} PRIVATE ${TDE_CXX_FEATURES} ${PROJECT_CXX_FEATURES} ${_cxx_features_private} ) endif( ) # we assume that modules have no prefix and no version # also, should not link if( ${_type} STREQUAL "MODULE" ) set_target_properties( ${_target} PROPERTIES PREFIX "" ) unset( _version ) set( _shouldnotlink yes ) endif( ${_type} STREQUAL "MODULE" ) # set real name of target if( _release ) # add release number to output name set_target_properties( ${_target} PROPERTIES RELEASE ${_release} ) set_target_properties( ${_target} PROPERTIES OUTPUT_NAME "${_arg_target}-${_release}" ) else( _release ) set_target_properties( ${_target} PROPERTIES OUTPUT_NAME ${_arg_target} ) endif( _release ) # set -fPIC flag for static libraries if( _static_pic ) set_target_properties( ${_target} PROPERTIES POSITION_INDEPENDENT_CODE ON ) endif( _static_pic ) # set version if( _version ) if( ${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD" ) # OpenBSD: _soversion and _version both contains only major and minor string( REGEX MATCH "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" _dummy "${_version}" ) set( _version "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}" ) set( _soversion "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}" ) else( ${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD" ) # General (Linux) case: _soversion contains only the major number of version string( REGEX MATCH "^[0-9]+" _soversion ${_version} ) endif( ${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD" ) set_target_properties( ${_target} PROPERTIES VERSION ${_version} SOVERSION ${_soversion} ) endif( _version ) # set interface libraries (only for shared) unset( _shared_libs ) if( NOT ${_type} STREQUAL "STATIC" ) foreach( _lib ${_link} ) #get_target_property( _lib_type ${_lib} TYPE ) #if( NOT "STATIC_LIBRARY" STREQUAL "${_lib_type}" ) if( NOT ${_lib} MATCHES ".+-static" ) list( APPEND _shared_libs ${_lib} ) endif( NOT ${_lib} MATCHES ".+-static" ) #endif( NOT "STATIC_LIBRARY" STREQUAL "${_lib_type}" ) endforeach( _lib ) endif( NOT ${_type} STREQUAL "STATIC" ) # set embedded archives if( _embed ) if( ${CMAKE_SYSTEM_NAME} MATCHES "SunOS" ) list( INSERT _link_private 0 -Wl,-zallextract ${_embed} -Wl,-zdefaultextract ) else( ) list( INSERT _link_private 0 -Wl,-whole-archive ${_embed} -Wl,-no-whole-archive ) endif( ) endif( _embed ) # set private linked libraries if( _link_private ) if( _link ) list( INSERT _link 0 "PUBLIC" ) endif() list( INSERT _link_private 0 "PRIVATE" ) list( INSERT _link 0 ${_link_private} ) endif( _link_private ) # set link libraries if( _link ) target_link_libraries( ${_target} ${_link} ) endif( ) if( _shared_libs ) string( TOUPPER "${CMAKE_BUILD_TYPE}" _build_type ) set_target_properties( ${_target} PROPERTIES LINK_INTERFACE_LIBRARIES "${_shared_libs}" LINK_INTERFACE_LIBRARIES_${_build_type} "${_shared_libs}" INTERFACE_LINK_LIBRARIES "${_shared_libs}" INTERFACE_LINK_LIBRARIES_${_build_type} "${_shared_libs}" ) endif( _shared_libs ) # set dependencies if( _dependencies ) add_dependencies( ${_target} ${_dependencies} ) endif( _dependencies ) # if destination directory is set if( _destination ) # we export only shared libs (no static, no modules); # also, do not export targets marked as "NO_EXPORT" (usually for tdeinit) if( "SHARED" STREQUAL ${_type} AND NOT _no_export ) # get target properties: output name, version, soversion tde_get_library_filename( _output ${_target} ) get_target_property( _version ${_target} VERSION ) get_target_property( _soversion ${_target} SOVERSION ) if( _version ) set( _location "${_destination}/${_output}.${_version}" ) set( _soname "${_output}.${_soversion}" ) else( ) set( _location "${_destination}/${_output}" ) set( _soname "${_output}" ) unset( _version ) endif( ) configure_file( ${TDE_CMAKE_TEMPLATES}/tde_export_library.cmake "${PROJECT_BINARY_DIR}/export-${_target}.cmake" @ONLY ) endif( ) # install target install( TARGETS ${_target} DESTINATION ${_destination} ) # install base soname if( _release AND NOT "STATIC" STREQUAL ${_type} ) tde_get_library_filename( _soname ${_target} ) string( REPLACE "-${_release}" "" _soname_base "${_soname}" ) if( _version ) get_target_property( _soversion ${_target} SOVERSION ) set( _soname "${_soname}.${_soversion}" ) endif( ) if( NOT _exclude_from_all ) add_custom_command( OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${_soname_base}" COMMAND ln -s ${_soname} "${CMAKE_CURRENT_BINARY_DIR}/${_soname_base}" DEPENDS ${_target} ) add_custom_target( ${_target}+base-so ALL DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${_soname_base}" ) else( ) add_custom_command( TARGET ${_target} POST_BUILD COMMAND ln -s ${_soname} "${CMAKE_CURRENT_BINARY_DIR}/${_soname_base}" ) endif( ) install( FILES "${CMAKE_CURRENT_BINARY_DIR}/${_soname_base}" DESTINATION ${_destination} ) endif( ) # install .la files for dynamic libraries if( NOT "STATIC" STREQUAL ${_type} AND NOT _no_libtool_file ) tde_install_libtool_file( ${_target} ${_destination} ) endif( ) endif( _destination ) # embed name and metadata set( ELF_EMBEDDING_METADATA "\"${_target}\" \"${_description}\" \"${_license}\" \"${_copyright}\" \"${_authors}\" \"${_product}\" \"${_organization}\" \"${_version}\" \"${_datetime}\" \"x-sharedlib\" \"${TDE_SCM_MODULE_NAME}\" \"${TDE_SCM_MODULE_REVISION}\" \"${_notes}\"" ) separate_arguments( ELF_EMBEDDING_METADATA ) if( TDELFEDITOR_EXECUTABLE AND _soname ) if( _version ) get_filename_component( _target_lib ${CMAKE_CURRENT_BINARY_DIR}/${_soname}.${_version} ABSOLUTE ) else( ) get_filename_component( _target_lib ${CMAKE_CURRENT_BINARY_DIR}/${_soname} ABSOLUTE ) endif( ) file( RELATIVE_PATH _target_path "${CMAKE_BINARY_DIR}" "${_target_lib}" ) if( TARGET ${TDELFEDITOR_EXECUTABLE} AND NOT _exclude_from_all ) # create target for all metadata writes if( NOT TARGET tdelfeditor-write ) add_custom_target( tdelfeditor-write WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" DEPENDS ${TDELFEDITOR_EXECUTABLE} COMMENT "Write metadata to binaries..." ) endif( ) add_custom_target( ${_target}+metadata ALL COMMAND ${TDELFEDITOR_EXECUTABLE} -m ${_target_lib} ${ELF_EMBEDDING_METADATA} || true COMMAND ${TDELFEDITOR_EXECUTABLE} -e ${_target_lib} || true COMMENT "Storing SCM metadata in ${_target_path}" DEPENDS tdelfeditor-write ) add_dependencies( tdelfeditor-write ${_target} ) else( ) add_custom_command( TARGET ${_target} POST_BUILD COMMAND ${TDELFEDITOR_EXECUTABLE} -m ${_target_lib} ${ELF_EMBEDDING_METADATA} || true COMMAND ${TDELFEDITOR_EXECUTABLE} -e ${_target_lib} || true COMMENT "Storing SCM metadata in ${_target_path}" ) if( TARGET ${TDELFEDITOR_EXECUTABLE} ) add_dependencies( ${_target} ${TDELFEDITOR_EXECUTABLE} ) endif() endif( ) endif( TDELFEDITOR_EXECUTABLE AND _soname ) endmacro( tde_add_library ) ################################################# ##### ##### tde_add_kpart macro( tde_add_kpart _target ) tde_add_library( ${_target} ${ARGN} MODULE ) endmacro( tde_add_kpart ) ################################################# ##### ##### tde_curdatetime macro( tde_curdatetime result ) if( TDE_PKG_DATETIME ) set( ${result} ${TDE_PKG_DATETIME} ) elseif( TDE_SCM_MODULE_DATETIME ) set( ${result} ${TDE_SCM_MODULE_DATETIME} ) else( ) tde_execute_process( COMMAND "date" "-u" "+%m/%d/%Y %H:%M:%S" OUTPUT_VARIABLE ${result} ) string( REGEX REPLACE "(..)/(..)/(....) (........).*" "\\1/\\2/\\3 \\4" ${result} ${${result}} ) endif( ) endmacro( tde_curdatetime ) ################################################# ##### ##### tde_add_executable macro( tde_add_executable _arg_target ) unset( _target ) unset( _automoc ) unset( _meta_includes ) unset( _setuid ) unset( _sources ) unset( _cxx_features ) unset( _destination ) unset( _link ) unset( _dependencies ) unset( _storage ) # metadata unset( _description ) unset( _license ) unset( _copyright ) unset( _authors ) unset( _product ) unset( _organization ) unset( _version ) unset( _datetime ) unset( _notes ) # default metadata set( _product "Trinity Desktop Environment" ) set( _version "${TDE_VERSION}" ) if( TDE_PKG_VERSION ) set( _version "${_version} (${TDE_PKG_VERSION})" ) endif( ) tde_curdatetime( _datetime ) foreach( _arg ${ARGV} ) # this variable help us to skip # storing unapropriate values (i.e. directives) unset( _skip_store ) # found directive "AUTOMOC" if( "+${_arg}" STREQUAL "+AUTOMOC" ) set( _skip_store 1 ) set( _automoc 1 ) endif( "+${_arg}" STREQUAL "+AUTOMOC" ) # found directive "META_INCLUDES" if( "+${_arg}" STREQUAL "+META_INCLUDES" ) set( _skip_store 1 ) set( _storage "_meta_includes" ) endif( ) # found directive "SETUID" if( "+${_arg}" STREQUAL "+SETUID" ) set( _skip_store 1 ) set( _setuid 1 ) endif( "+${_arg}" STREQUAL "+SETUID" ) # found directive "SOURCES" if( "+${_arg}" STREQUAL "+SOURCES" ) set( _skip_store 1 ) set( _storage "_sources" ) endif( "+${_arg}" STREQUAL "+SOURCES" ) # found directive "CXX_FEATURES" if( "+${_arg}" STREQUAL "+CXX_FEATURES" ) set( _skip_store 1 ) set( _storage "_cxx_features" ) endif( "+${_arg}" STREQUAL "+CXX_FEATURES" ) # found directive "LINK" if( "+${_arg}" STREQUAL "+LINK" ) set( _skip_store 1 ) set( _storage "_link" ) endif( "+${_arg}" STREQUAL "+LINK" ) # found directive "DEPENDENCIES" if( "+${_arg}" STREQUAL "+DEPENDENCIES" ) set( _skip_store 1 ) set( _storage "_dependencies" ) endif( "+${_arg}" STREQUAL "+DEPENDENCIES" ) # found directive "DESTINATION" if( "+${_arg}" STREQUAL "+DESTINATION" ) set( _skip_store 1 ) set( _storage "_destination" ) unset( ${_storage} ) endif( "+${_arg}" STREQUAL "+DESTINATION" ) # metadata if( "+${_arg}" STREQUAL "+DESCRIPTION" ) set( _skip_store 1 ) set( _storage "_description" ) endif( ) if( "+${_arg}" STREQUAL "+LICENSE" ) set( _skip_store 1 ) set( _storage "_license" ) endif( ) if( "+${_arg}" STREQUAL "+COPYRIGHT" ) set( _skip_store 1 ) set( _storage "_copyright" ) endif( ) if( "+${_arg}" STREQUAL "+AUTHORS" ) set( _skip_store 1 ) set( _storage "_authors" ) endif( ) if( "+${_arg}" STREQUAL "+PRODUCT" ) set( _skip_store 1 ) set( _storage "_product" ) endif( ) if( "+${_arg}" STREQUAL "+ORGANIZATION" ) set( _skip_store 1 ) set( _storage "_organization" ) endif( ) if( "+${_arg}" STREQUAL "+VERSION" ) set( _skip_store 1 ) set( _storage "_version" ) endif( ) if( "+${_arg}" STREQUAL "+DATETIME" ) set( _skip_store 1 ) set( _storage "_datetime" ) endif( ) if( "+${_arg}" STREQUAL "+NOTES" ) set( _skip_store 1 ) set( _storage "_notes" ) endif( ) # storing value if( _storage AND NOT _skip_store ) #set( ${_storage} "${${_storage}} ${_arg}" ) list( APPEND ${_storage} ${_arg} ) endif( _storage AND NOT _skip_store ) endforeach( _arg ) set( _target "${_arg_target}" ) # disallow target without sources if( NOT _sources ) message( FATAL_ERROR "\nTarget [$_target] have no sources." ) endif( NOT _sources ) # processing different types of sources __tde_internal_process_sources( _sources ${_sources} ) # set automoc if( _automoc ) tde_automoc( ${_sources} ) endif( _automoc ) # add target add_executable( ${_target} ${_sources} ) # set cxx features if( TDE_CXX_FEATURES OR PROJECT_CXX_FEATURES OR _cxx_features ) target_compile_features( ${_target} PRIVATE ${TDE_CXX_FEATURES} ${PROJECT_CXX_FEATURES} ${_cxx_features} ) endif( ) # set link libraries if( _link ) target_link_libraries( ${_target} ${_link} ) endif( _link ) # set dependencies if( _dependencies ) add_dependencies( ${_target} ${_dependencies} ) endif( _dependencies ) # set PIE flags for setuid binaries if( _setuid ) set_target_properties( ${_target} PROPERTIES COMPILE_FLAGS "${TDE_PIE_CFLAGS}" ) set_target_properties( ${_target} PROPERTIES LINK_FLAGS "${TDE_PIE_LDFLAGS}" ) endif( _setuid ) # set destination directory if( _destination ) if( _setuid ) install( TARGETS ${_target} DESTINATION ${_destination} PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_EXECUTE WORLD_EXECUTE SETUID ) else( _setuid ) install( TARGETS ${_target} DESTINATION ${_destination} ) endif( _setuid ) endif( _destination ) # embed icon, name, and metadata set( ELF_EMBEDDING_METADATA "\"${_target}\" \"${_description}\" \"${_license}\" \"${_copyright}\" \"${_authors}\" \"${_product}\" \"${_organization}\" \"${_version}\" \"${_datetime}\" \"${_target}\" \"${TDE_SCM_MODULE_NAME}\" \"${TDE_SCM_MODULE_REVISION}\" \"${_notes}\"" ) separate_arguments( ELF_EMBEDDING_METADATA ) if( TDELFEDITOR_EXECUTABLE ) get_filename_component( _target_path ${CMAKE_CURRENT_BINARY_DIR}/${_target} ABSOLUTE ) file( RELATIVE_PATH _target_path "${CMAKE_BINARY_DIR}" "${_target_path}" ) if( TARGET ${TDELFEDITOR_EXECUTABLE} ) # create target for all metadata writes if( NOT TARGET tdelfeditor-write ) add_custom_target( tdelfeditor-write WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" DEPENDS ${TDELFEDITOR_EXECUTABLE} COMMENT "Write metadata to binaries..." ) endif( ) add_custom_target( ${_target}+metadata ALL COMMAND ${TDELFEDITOR_EXECUTABLE} -m ${CMAKE_CURRENT_BINARY_DIR}/${_target} ${ELF_EMBEDDING_METADATA} || true COMMAND ${TDELFEDITOR_EXECUTABLE} -e ${CMAKE_CURRENT_BINARY_DIR}/${_target} || true COMMENT "Storing SCM metadata in ${_target_path}" DEPENDS tdelfeditor-write ) add_dependencies( tdelfeditor-write ${_target} ) else() add_custom_command( TARGET ${_target} POST_BUILD COMMAND ${TDELFEDITOR_EXECUTABLE} -m ${CMAKE_CURRENT_BINARY_DIR}/${_target} ${ELF_EMBEDDING_METADATA} || true COMMAND ${TDELFEDITOR_EXECUTABLE} -e ${CMAKE_CURRENT_BINARY_DIR}/${_target} || true COMMAND ${TDELFEDITOR_EXECUTABLE} -t ${CMAKE_CURRENT_BINARY_DIR}/${_target} ${_target} || true COMMENT "Storing SCM metadata in ${_target_path}" ) endif() endif( TDELFEDITOR_EXECUTABLE ) endmacro( tde_add_executable ) ################################################# ##### ##### tde_add_check_executable macro( tde_add_check_executable _arg_target ) unset( _target ) unset( _automoc ) unset( _test ) unset( _test_args ) unset( _meta_includes ) unset( _sources ) unset( _cxx_features ) unset( _destination ) unset( _link ) unset( _dependencies ) unset( _storage ) foreach( _arg ${ARGV} ) # this variable help us to skip # storing unapropriate values (i.e. directives) unset( _skip_store ) # found directive "AUTOMOC" if( "+${_arg}" STREQUAL "+AUTOMOC" ) set( _skip_store 1 ) set( _automoc 1 ) endif( "+${_arg}" STREQUAL "+AUTOMOC" ) # found directive "TEST" if( "+${_arg}" STREQUAL "+TEST" ) set( _skip_store 1 ) set( _test 1 ) set( _storage "_test_args" ) endif( "+${_arg}" STREQUAL "+TEST" ) # found directive "META_INCLUDES" if( "+${_arg}" STREQUAL "+META_INCLUDES" ) set( _skip_store 1 ) set( _storage "_meta_includes" ) endif( ) # found directive "SOURCES" if( "+${_arg}" STREQUAL "+SOURCES" ) set( _skip_store 1 ) set( _storage "_sources" ) endif( "+${_arg}" STREQUAL "+SOURCES" ) # found directive "CXX_FEATURES" if( "+${_arg}" STREQUAL "+CXX_FEATURES" ) set( _skip_store 1 ) set( _storage "_cxx_features" ) endif( "+${_arg}" STREQUAL "+CXX_FEATURES" ) # found directive "LINK" if( "+${_arg}" STREQUAL "+LINK" ) set( _skip_store 1 ) set( _storage "_link" ) endif( "+${_arg}" STREQUAL "+LINK" ) # found directive "DEPENDENCIES" if( "+${_arg}" STREQUAL "+DEPENDENCIES" ) set( _skip_store 1 ) set( _storage "_dependencies" ) endif( "+${_arg}" STREQUAL "+DEPENDENCIES" ) # storing value if( _storage AND NOT _skip_store ) #set( ${_storage} "${${_storage}} ${_arg}" ) list( APPEND ${_storage} ${_arg} ) endif( _storage AND NOT _skip_store ) endforeach( _arg ) set( _target "${_arg_target}" ) # try to autodetect sources if( NOT _sources ) file( GLOB _sources "${_target}.cpp" "${_target}.cxx" "${_target}.c" ) if( NOT _sources ) message( FATAL_ERROR "\nNo sources found for test executable \"${_target}\"." ) endif( ) endif( NOT _sources ) # processing different types of sources __tde_internal_process_sources( _sources ${_sources} ) # set automoc if( _automoc ) tde_automoc( ${_sources} ) endif( _automoc ) # add target add_executable( ${_target} EXCLUDE_FROM_ALL ${_sources} ) # set cxx features if( TDE_CXX_FEATURES OR PROJECT_CXX_FEATURES OR _cxx_features ) target_compile_features( ${_target} PRIVATE ${TDE_CXX_FEATURES} ${PROJECT_CXX_FEATURES} ${_cxx_features} ) endif( ) # set link libraries if( _link ) target_link_libraries( ${_target} ${_link} ) endif( _link ) # set dependencies if( _dependencies ) add_dependencies( ${_target} ${_dependencies} ) endif( _dependencies ) # create make check target if(NOT TARGET check) add_custom_target( check COMMAND ${CMAKE_CTEST_COMMAND} WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" COMMENT "Running tests..." ) endif(NOT TARGET check) add_dependencies( check ${_target} ) # add test target if( _test ) # get relative path to current directory and strip end tests dir file( RELATIVE_PATH _test_prefix ${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ) string( REGEX REPLACE "(^\\.+/?|(^|/)tests?$|/$)" "" _test_prefix "${_test_prefix}" ) if( _test_prefix ) set( _test_prefix "${_test_prefix}/" ) endif( _test_prefix ) add_test( NAME "${_test_prefix}${_target}" COMMAND "${_target}" ${_test_args} ) endif( _test ) endmacro( tde_add_check_executable ) ################################################# ##### ##### tde_add_tdeinit_executable macro( tde_add_tdeinit_executable _target ) configure_file( ${TDE_CMAKE_TEMPLATES}/tde_tdeinit_executable.cmake ${_target}_tdeinit_executable.cpp COPYONLY ) configure_file( ${TDE_CMAKE_TEMPLATES}/tde_tdeinit_module.cmake ${_target}_tdeinit_module.cpp COPYONLY ) unset( _sources ) unset( _runtime_destination ) unset( _library_destination ) unset( _plugin_destination ) # default storage is _sources set( _storage _sources ) # set default export to NO_EXPORT set( _export "NO_EXPORT" ) foreach( _arg ${ARGN} ) # this variable help us to skip # storing unapropriate values (i.e. directives) unset( _skip_store ) # found directive "EXPORT" if( "+${_arg}" STREQUAL "+EXPORT" ) set( _skip_store 1 ) unset( _export ) endif( "+${_arg}" STREQUAL "+EXPORT" ) # found directive "RUNTIME_DESTINATION" if( "+${_arg}" STREQUAL "+RUNTIME_DESTINATION" ) set( _skip_store 1 ) set( _storage "_runtime_destination" ) unset( ${_storage} ) endif( "+${_arg}" STREQUAL "+RUNTIME_DESTINATION" ) # found directive "LIBRARY_DESTINATION" if( "+${_arg}" STREQUAL "+LIBRARY_DESTINATION" ) set( _skip_store 1 ) set( _storage "_library_destination" ) unset( ${_storage} ) endif( "+${_arg}" STREQUAL "+LIBRARY_DESTINATION" ) # found directive "PLUGIN_DESTINATION" if( "+${_arg}" STREQUAL "+PLUGIN_DESTINATION" ) set( _skip_store 1 ) set( _storage "_plugin_destination" ) unset( ${_storage} ) endif( "+${_arg}" STREQUAL "+PLUGIN_DESTINATION" ) # storing value if( _storage AND NOT _skip_store ) list( APPEND ${_storage} ${_arg} ) set( _storage "_sources" ) endif( _storage AND NOT _skip_store ) endforeach( _arg ) # if destinations are not set, we using some defaults # we assume that tdeinit executable MUST be installed # (otherwise why we build it?) if( NOT _runtime_destination ) set( _runtime_destination ${BIN_INSTALL_DIR} ) endif( NOT _runtime_destination ) if( NOT _library_destination ) set( _library_destination ${LIB_INSTALL_DIR} ) endif( NOT _library_destination ) if( NOT _plugin_destination ) set( _plugin_destination ${PLUGIN_INSTALL_DIR} ) endif( NOT _plugin_destination ) # create the library tde_add_library( tdeinit_${_target} ${_sources} SHARED ${_export} DESTINATION ${_library_destination} ) # create the executable tde_add_executable( ${_target} SOURCES ${CMAKE_CURRENT_BINARY_DIR}/${_target}_tdeinit_executable.cpp LINK tdeinit_${_target}-shared DESTINATION ${_runtime_destination} ) # create the plugin tde_add_kpart( ${_target} SOURCES ${CMAKE_CURRENT_BINARY_DIR}/${_target}_tdeinit_module.cpp LINK tdeinit_${_target}-shared DESTINATION ${_plugin_destination} ) endmacro( tde_add_tdeinit_executable ) ################################################# ##### ##### tde_conditional_add_project_translations ##### tde_add_project_translations ##### ##### Macro for standard processing and installation of translations. ##### This is designed for ordinary modules - as an applications, not for core modules. function( tde_conditional_add_project_translations _cond ) if( ${_cond} ) tde_add_project_translations() endif() endfunction() function( tde_add_project_translations ) if( ${CMAKE_CURRENT_SOURCE_DIR} STREQUAL ${PROJECT_SOURCE_DIR} ) set( TRANSLATIONS_SOURCE_DIR ${PROJECT_SOURCE_DIR}/translations/messages ) else() set( TRANSLATIONS_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} ) endif() file( GLOB_RECURSE po_files RELATIVE ${TRANSLATIONS_SOURCE_DIR} ${TRANSLATIONS_SOURCE_DIR}/*.po ) string( REGEX REPLACE "[ \r\n\t]+" ";" _linguas "$ENV{LINGUAS}" ) foreach( _po ${po_files} ) get_filename_component( _lang ${_po} NAME_WE ) if( "${_linguas}" MATCHES "^;*$" OR ";${_linguas};" MATCHES ";${_lang};" ) if( "${_po}" MATCHES "^([^/]*)/.*" ) string( REGEX REPLACE "^([^/]*)/.*" "\\1" _component "${_po}" ) else( ) set( _component "${PROJECT_NAME}" ) endif( ) tde_create_translation( FILES ${TRANSLATIONS_SOURCE_DIR}/${_po} LANG ${_lang} OUTPUT_NAME ${_component} ) endif( ) endforeach( ) endfunction() ################################################# ##### ##### tde_create_translation macro( tde_create_translation ) unset( _srcs ) unset( _lang ) unset( _dest ) unset( _out_name ) unset( _directive ) unset( _var ) foreach( _arg ${ARGN} ) # found directive "FILES" if( "+${_arg}" STREQUAL "+FILES" ) unset( _srcs ) set( _var _srcs ) set( _directive 1 ) endif( ) # found directive "LANG" if( "+${_arg}" STREQUAL "+LANG" ) unset( _lang ) set( _var _lang ) set( _directive 1 ) endif( ) # found directive "DESTINATION" if( "+${_arg}" STREQUAL "+DESTINATION" ) unset( _dest ) set( _var _dest ) set( _directive 1 ) endif( ) # found directive "OUTPUT_NAME" if( "+${_arg}" STREQUAL "+OUTPUT_NAME" ) unset( _out_name ) set( _var _out_name ) set( _directive 1 ) endif( ) # collect data if( _directive ) unset( _directive ) elseif( _var ) list( APPEND ${_var} ${_arg} ) endif() endforeach( ) if( NOT MSGFMT_EXECUTABLE ) tde_setup_msgfmt( ) endif( ) if( NOT _lang ) tde_message_fatal( "missing LANG directive" ) endif( ) # if no file specified, include all *.po files if( NOT _srcs ) file( GLOB _srcs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.po ) endif( ) if( NOT _srcs ) tde_message_fatal( "no source files" ) endif( ) if( NOT _lang STREQUAL "auto") set( _real_lang ${_lang} ) if( NOT _dest ) set( _dest "${LOCALE_INSTALL_DIR}/${_lang}/LC_MESSAGES" ) endif( ) # OUTPUT_NAME can only be used if we have only one file list( LENGTH _srcs _srcs_num) if( _out_name AND _srcs_num GREATER 1 ) tde_message_fatal( "OUTPUT_NAME can be supplied only with single file or LANG=auto" ) endif( ) elseif( NOT _out_name ) tde_message_fatal( "LANG=auto reqires OUTPUT_NAME directive to be set" ) elseif( _dest ) tde_message_fatal( "DESTINATION cannot be used with LANG=auto" ) endif( ) # generate *.mo files foreach( _src ${_srcs} ) get_filename_component( _src ${_src} ABSOLUTE ) if( _out_name ) set( _out ${_out_name} ) if( _lang STREQUAL "auto" ) get_filename_component( _real_lang ${_src} NAME_WE ) set( _dest "${LOCALE_INSTALL_DIR}/${_real_lang}/LC_MESSAGES" ) endif( ) else( ) get_filename_component( _out ${_src} NAME_WE ) endif( ) string( REPLACE "@" "_" _target ${_real_lang} ) set( _out_filename "${_out}-${_real_lang}.mo" ) set( _install_filename "${_out}.mo" ) add_custom_command( OUTPUT ${_out_filename} COMMAND ${MSGFMT_EXECUTABLE} ${_src} -o ${_out_filename} DEPENDS ${_src} ) add_custom_target( "${_out}-${_target}-translation" ALL DEPENDS ${_out_filename} ) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/${_out_filename} RENAME ${_install_filename} DESTINATION ${_dest} ) endforeach( ) endmacro( ) ################################################# ##### ##### tde_create_translated_desktop ##### ##### Macro is used to merge translations into desktop file ##### ##### Syntax: ##### tde_create_translated_desktop( ##### [SOURCE] file_name ##### [KEYWORDS keyword [keyword]] ##### [FORMAT (desktop|xml)] ##### [PO_DIR po_directory] ##### [DESTINATION directory] ##### [OUTPUT_NAME file_name] ##### ) macro( tde_create_translated_desktop ) unset( _srcs ) unset( _arg_out_name ) unset( _arg_po_dir ) unset( _keywords_add ) unset( _dest ) unset( _directive ) set( _var _srcs ) set( _keywords_desktop_default "Name" "GenericName" "Comment" "Keywords" "Description" "ExtraNames" "X-TDE-Submenu" ) set( _format "desktop" ) foreach( _arg ${ARGN} ) # found directive "SOURCE" if( "+${_arg}" STREQUAL "+SOURCE" ) unset( _srcs ) set( _var _srcs ) set( _directive 1 ) endif( ) # found directive "KEYWORDS" if( "+${_arg}" STREQUAL "+KEYWORDS" ) unset( _keywords_add ) set( _var _keywords_add ) set( _directive 1 ) endif( ) # found directive "FORMAT" if( "+${_arg}" STREQUAL "+FORMAT" ) unset( _format ) set( _var _format ) set( _directive 1 ) endif( ) # found directive "PO_DIR" if( "+${_arg}" STREQUAL "+PO_DIR" ) unset( _arg_po_dir ) set( _var _arg_po_dir ) set( _directive 1 ) endif( ) # found directive "DESTINATION" if( "+${_arg}" STREQUAL "+DESTINATION" ) unset( _dest ) set( _var _dest ) set( _directive 1 ) endif( ) # found directive "OUTPUT_NAME" if( "+${_arg}" STREQUAL "+OUTPUT_NAME" ) unset( _arg_out_name ) set( _var _arg_out_name ) set( _directive 1 ) endif( ) # collect data if( _directive ) unset( _directive ) elseif( _var ) list( APPEND ${_var} ${_arg} ) endif() endforeach( ) # no source file specified! if( NOT _srcs ) tde_message_fatal( "no source desktop file specified" ) endif( ) # OUTPUT_NAME can only be used if we have only one file list( LENGTH _srcs _srcs_num ) if( _arg_out_name AND _srcs_num GREATER 1 ) tde_message_fatal( "OUTPUT_NAME can be supplied only with single file" ) endif( ) # if no destination directory specified, install as application link if( NOT _dest ) set( _dest ${XDG_APPS_INSTALL_DIR} ) endif( ) # select a tool for merging desktop file translations # # Because some of our desktop files contain underscores in variable # names (for example eventsrc), which is not an allowed character # for names of entries in desktop style files, we can't use msgfmt, # so we need intltool-merge. # #if( NOT MSGFMT_EXECUTABLE OR NOT MSGFMT_VERSION ) # tde_setup_msgfmt( ) #endif( ) #if( "${MSGFMT_VERSION}" VERSION_LESS "0.19" ) if( TRUE ) if( NOT PERL_EXECUTABLE ) include( FindPerl ) endif( ) if( NOT INTLTOOL_MERGE_EXECUTABLE ) find_file( INTLTOOL_MERGE_EXECUTABLE NAMES tde_l10n_merge.pl HINTS ${TDE_CMAKE_MODULES} ) if( "${INTLTOOL_MERGE_EXECUTABLE}" STREQUAL "INTLTOOL_MERGE_EXECUTABLE-NOTFOUND" ) #tde_message_fatal( "xgettext >= 0.19 or tde_l10n_merge.pl is required but not found" ) tde_message_fatal( "tde_l10n_merge.pl is required but not found" ) endif( ) message( STATUS "Found intltool: ${INTLTOOL_MERGE_EXECUTABLE}" ) endif( ) set( DESKTOP_MERGE_INTLTOOL 1 ) else( ) set( DESKTOP_MERGE_MSGFMT 1 ) endif( ) # pick keywords unset( _keywords_desktop ) foreach( _keyword ${_keywords_desktop_default} ${_keywords_add} ) if( "${_keyword}" STREQUAL "-" ) unset( _keywords_desktop ) unset( _keyword ) endif( ) if( _keyword ) list( APPEND _keywords_desktop "${_keyword}" ) endif( ) endforeach( ) # prepare the length of the binary path prefix string( LENGTH "${CMAKE_BINARY_DIR}" CMAKE_BINARY_DIR_LEN ) # process source files foreach( _src IN LISTS _srcs ) # get a base name and a directory get_filename_component( _basename ${_src} ABSOLUTE ) get_filename_component( _basedir ${_basename} PATH ) file( RELATIVE_PATH _sourcename "${CMAKE_SOURCE_DIR}" "${_basename}" ) string( LENGTH "${_basename}" _basename_len ) if( ${_basename_len} LESS ${CMAKE_BINARY_DIR_LEN} ) set( _basedir_prefix "${CMAKE_SOURCE_DIR}" ) else( ) string( SUBSTRING "${_basename}" 0 ${CMAKE_BINARY_DIR_LEN} _basedir_prefix ) endif( ) if( ${_basedir_prefix} STREQUAL "${CMAKE_BINARY_DIR}" ) file( RELATIVE_PATH _basename "${CMAKE_CURRENT_BINARY_DIR}" "${_basename}" ) set( _binsuffix ".out" ) else( ) file( RELATIVE_PATH _basename "${CMAKE_CURRENT_SOURCE_DIR}" "${_basename}" ) set( _binsuffix "" ) endif( ) # prepare the binary directory according to source directory if( ${_basedir_prefix} STREQUAL "${CMAKE_BINARY_DIR}" ) file( RELATIVE_PATH _binary_basedir "${CMAKE_CURRENT_BINARY_DIR}" "${_basedir}" ) else( ) file( RELATIVE_PATH _binary_basedir "${CMAKE_CURRENT_SOURCE_DIR}" "${_basedir}" ) endif( ) set( _binary_basedir "${CMAKE_CURRENT_BINARY_DIR}/${_binary_basedir}" ) file( MAKE_DIRECTORY "${_binary_basedir}" ) # process source file as a configuration file if necessary if( "+${_src}" MATCHES "\\.cmake$" ) configure_file( ${_src} ${_basename} @ONLY ) set( _src "${CMAKE_CURRENT_BINARY_DIR}/${_basename}" ) string( REGEX REPLACE "\\.cmake$" "" _basename "${_basename}" ) endif() # determine output name if( _arg_out_name ) set( _out_name ${_arg_out_name} ) else() get_filename_component( _out_name ${_basename} NAME ) endif( ) # determine po directory if( _arg_po_dir ) set( _po_base ${_arg_po_dir} ) else() get_filename_component( _po_base ${_basename} NAME ) endif() if( IS_ABSOLUTE ${_po_base} ) set( _po_dir ${_po_base} ) else() if( EXISTS ${CMAKE_SOURCE_DIR}/translations/desktop_files/${_po_base} AND IS_DIRECTORY ${CMAKE_SOURCE_DIR}/translations/desktop_files/${_po_base} ) set( _po_dir ${CMAKE_SOURCE_DIR}/translations/desktop_files/${_po_base} ) elseif( EXISTS ${CMAKE_SOURCE_DIR}/po/desktop_files/${_po_base} AND IS_DIRECTORY ${CMAKE_SOURCE_DIR}/po/desktop_files/${_po_base} ) set( _po_dir ${CMAKE_SOURCE_DIR}/po/desktop_files/${_po_base} ) else() set( _po_dir ${CMAKE_SOURCE_DIR}/translations/desktop_files ) endif( ) endif( ) # if the translated desktop file is not installed, generate to the specified output name if( "${_dest}" STREQUAL "-" ) set( _basename "${_out_name}" ) set( _binsuffix "" ) get_filename_component( _out_dir "${CMAKE_CURRENT_BINARY_DIR}/${_out_name}" PATH ) file( MAKE_DIRECTORY "${_out_dir}" ) endif( ) # are there any translations available? unset( _translations ) if( EXISTS "${_po_dir}" AND IS_DIRECTORY "${_po_dir}" ) file( GLOB _translations RELATIVE "${_po_dir}" "${_po_dir}/*.po" ) endif( ) # prepare a full name for the target get_filename_component( _target ${_basename} ABSOLUTE ) file( RELATIVE_PATH _target "${CMAKE_SOURCE_DIR}" "${_target}-translated" ) string( REPLACE "/" "+" _target "${_target}" ) string( REPLACE "@" "_" _target "${_target}" ) if( NOT TARGET ${_target} ) # use absolute path for src get_filename_component( _src ${_src} ABSOLUTE ) if( _translations ) if( DESKTOP_MERGE_MSGFMT ) # Decide which translations to build; the ones selected in the # LINGUAS environment variable, or all that are available. if( DEFINED ENV{LINGUAS} ) set( _linguas "$ENV{LINGUAS}" ) else( ) string( REPLACE ".po;" " " _linguas "${_translations};" ) endif( ) # prepare keywords for msgfmt set( _keywords_arg "--keyword=" ) foreach( _keyword ${_keywords_desktop} ) list( APPEND _keywords_arg "--keyword=\"${_keyword}\"" ) endforeach( ) # merge translations command add_custom_command( OUTPUT ${_basename}${_binsuffix} COMMAND ${CMAKE_COMMAND} -E env "LINGUAS=${_linguas}" ${MSGFMT_EXECUTABLE} --desktop --template ${_src} -d ${_po_dir} -o ${_basename}${_binsuffix} ${_keywords_arg} DEPENDS ${_src} COMMENT "Merging translations into ${_sourcename}" ) else( ) # prepare keywords for intltool string( REPLACE ";" "|" _keywords_match "(${_keywords_desktop})" ) # merge translations command if( _format STREQUAL "desktop" ) add_custom_command( OUTPUT ${_basename}${_binsuffix} COMMAND ${PERL_EXECUTABLE} -p -e "'s/^${_keywords_match}[ ]*=[ ]*/_\\1=/'" < ${_src} > ${_basename}.in COMMAND ${PERL_EXECUTABLE} ${INTLTOOL_MERGE_EXECUTABLE} -q -d ${_po_dir} ${_basename}.in ${_basename}${_binsuffix} DEPENDS ${_src} COMMENT "Merging translations into ${_sourcename}" ) elseif( _format STREQUAL "xml" ) add_custom_command( OUTPUT ${_basename}${_binsuffix} COMMAND ${PERL_EXECUTABLE} -p -e "'s/(<\\/?)${_keywords_match}([ >])/\\1_\\2\\3/g'" < ${_src} > ${_basename}.in COMMAND ${PERL_EXECUTABLE} ${INTLTOOL_MERGE_EXECUTABLE} -q -x ${_po_dir} ${_basename}.in ${_basename}${_binsuffix} DEPENDS ${_src} COMMENT "Merging translations into ${_sourcename}" ) else() tde_message_fatal( "Unknown file format for merging translations." ) endif() endif( ) else( ) # just copy the original file without translations add_custom_command( OUTPUT ${_basename}${_binsuffix} COMMAND ${CMAKE_COMMAND} -E copy ${_src} ${_basename}${_binsuffix} DEPENDS ${_src} COMMENT "Skiping translation and copying source file to ${_sourcename}" ) endif( ) # merge translations target add_custom_target( "${_target}" ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${_basename}${_binsuffix} ) endif( ) # install traslated desktop file if( NOT "${_dest}" STREQUAL "-" ) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/${_basename}${_binsuffix} RENAME ${_out_name} DESTINATION ${_dest} ) endif() endforeach() endmacro( ) ################################################# ##### ##### tde_conditional_add_project_docs ##### tde_add_project_docs ##### ##### Macro for standard processing and installation of documentation and man pages. ##### This is designed for ordinary modules - as an applications, not for core modules. function( tde_conditional_add_project_docs _cond ) if( ${_cond} ) tde_add_project_docs() endif() endfunction() function( tde_add_project_docs ) if( ${CMAKE_CURRENT_SOURCE_DIR} STREQUAL ${PROJECT_SOURCE_DIR} ) set( DOCS_SOURCE_DIR ${PROJECT_SOURCE_DIR}/doc ) else() set( DOCS_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} ) endif() file( GLOB_RECURSE _doc_files RELATIVE ${DOCS_SOURCE_DIR} ${DOCS_SOURCE_DIR}/* ) foreach( _doc_file IN LISTS _doc_files ) get_filename_component( _dir ${_doc_file} PATH ) list( APPEND _dirs ${_dir} ) endforeach() if( _dirs ) list( SORT _dirs ) list( REMOVE_DUPLICATES _dirs ) endif() string( REGEX REPLACE "[ \r\n\t]+" ";" _linguas "$ENV{LINGUAS}" ) unset( _skip_subdir ) foreach( _dir IN LISTS _dirs ) string( REGEX REPLACE "/.*" "" _lang ${_dir} ) if( NOT ${_lang} MATCHES "^(html|man|misc|other)$" AND ( NOT DEFINED _skip_subdir OR NOT ${_dir} MATCHES "^${_skip_subdir}/" ) AND ( ${_lang} STREQUAL "en" OR "${_linguas}" MATCHES "^;*$" OR ";${_linguas};" MATCHES ";${_lang};" )) if( EXISTS ${DOCS_SOURCE_DIR}/${_dir}/CMakeLists.txt ) set( _skip_subdir ${_dir} ) add_subdirectory( ${DOCS_SOURCE_DIR}/${_dir} ) else() unset( _skip_subdir ) if( ${_dir} MATCHES "/[^/]*/" ) string( REGEX REPLACE "^[^/]*/(.*)" "\\1" _doc_dest "${_dir}" ) else() string( REGEX REPLACE "^[^/]*/(.*)" "\\1" _doc_dest "${_dir}/${PROJECT_NAME}" ) endif() file( GLOB _doc_files RELATIVE ${DOCS_SOURCE_DIR}/${_dir} ${DOCS_SOURCE_DIR}/${_dir}/*.docbook ) if( _doc_files ) list( FIND _doc_files "index.docbook" _find_index ) if( -1 EQUAL _find_index ) set( _noindex "NOINDEX" ) else() unset( _noindex ) endif() tde_create_handbook( SOURCE_BASEDIR ${DOCS_SOURCE_DIR}/${_dir} ${_noindex} LANG ${_lang} DESTINATION ${_doc_dest} ) else() file( GLOB _html_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${DOCS_SOURCE_DIR}/${_dir}/*.html ) if( _html_files ) file( GLOB _htmldoc_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${DOCS_SOURCE_DIR}/${_dir}/*.css ${DOCS_SOURCE_DIR}/${_dir}/*.gif ${DOCS_SOURCE_DIR}/${_dir}/*.jpg ${DOCS_SOURCE_DIR}/${_dir}/*.png ) install( FILES ${_html_files} ${_htmldoc_files} DESTINATION ${HTML_INSTALL_DIR}/${_lang}/${_doc_dest} ) endif() endif() endif() endif() endforeach() if( EXISTS ${DOCS_SOURCE_DIR}/man AND NOT EXISTS ${DOCS_SOURCE_DIR}/man/CMakeLists.txt ) file( GLOB_RECURSE _man_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${DOCS_SOURCE_DIR}/man/* ) foreach( _man_file IN LISTS _man_files ) if( ${_man_file} MATCHES "\\.[0-9]$" ) string( REGEX REPLACE ".*\\.([0-9])$" "\\1" _man_section "${_man_file}" ) list( APPEND _man_files_${_man_section} "${_man_file}" ) list( APPEND _man_sections "${_man_section}" ) endif() endforeach() foreach( _man_section IN LISTS _man_sections ) INSTALL( FILES ${_man_files_${_man_section}} DESTINATION ${MAN_INSTALL_DIR}/man${_man_section} COMPONENT doc ) endforeach() endif() if( EXISTS ${DOCS_SOURCE_DIR}/misc AND NOT EXISTS ${DOCS_SOURCE_DIR}/misc/CMakeLists.txt ) install( DIRECTORY ${DOCS_SOURCE_DIR}/misc/ DESTINATION ${SHARE_INSTALL_PREFIX}/doc/${PROJECT_NAME} COMPONENT doc PATTERN Makefile.am EXCLUDE ) endif() foreach( _dir html man misc other ) if( EXISTS ${DOCS_SOURCE_DIR}/${_dir}/CMakeLists.txt ) add_subdirectory( ${DOCS_SOURCE_DIR}/${_dir} ) endif() endforeach() endfunction( ) ################################################# ##### ##### tde_create_handbook macro( tde_create_handbook ) unset( _target ) unset( _dest ) unset( _noindex ) unset( _srcs ) unset( _extra ) unset( _srcdir ) get_filename_component( _source_basedir "${CMAKE_CURRENT_SOURCE_DIR}" ABSOLUTE ) set( _lang en ) set( _first_arg 1 ) set( _var _target ) foreach( _arg ${ARGN} ) # found directive "SOURCE_BASEDIR" if( "+${_arg}" STREQUAL "+SOURCE_BASEDIR" ) unset( _source_basedir ) set( _var _source_basedir ) set( _directive 1 ) endif() # found directive "NOINDEX" if( "+${_arg}" STREQUAL "+NOINDEX" ) set( _noindex 1 ) set( _directive 1 ) endif() # found directive "FILES" if( "+${_arg}" STREQUAL "+FILES" ) unset( _srcs ) set( _var _srcs ) set( _directive 1 ) endif() # found directive "EXTRA" if( "+${_arg}" STREQUAL "+EXTRA" ) unset( _extra ) set( _var _extra ) set( _directive 1 ) endif() # found directive "SRCDIR" if( "+${_arg}" STREQUAL "+SRCDIR" ) unset( _srcdir ) set( _var _srcdir ) set( _directive 1 ) endif() # found directive DESTINATION if( "+${_arg}" STREQUAL "+DESTINATION" ) unset( _dest ) set( _var _dest ) set( _directive 1 ) endif() # found directive "LANG" if( "+${_arg}" STREQUAL "+LANG" ) unset( _lang ) set( _var _lang ) set( _directive 1 ) endif() # collect data if( _directive ) unset( _directive ) elseif( _var ) if( _first_arg ) set( _target "${_arg}" ) else() list( APPEND ${_var} ${_arg} ) endif() endif() unset( _first_arg ) endforeach() # if source_basedir is relative, complete the path to absolute if( NOT IS_ABSOLUTE ${_source_basedir} ) get_filename_component( _source_basedir "${_source_basedir}" ABSOLUTE ) endif() # prepare the binary directory according to source_basedir file( RELATIVE_PATH _binary_basedir "${CMAKE_CURRENT_SOURCE_DIR}" "${_source_basedir}" ) set( _binary_basedir "${CMAKE_CURRENT_BINARY_DIR}/${_binary_basedir}" ) file( MAKE_DIRECTORY "${_binary_basedir}" ) # if no target specified, try to guess it from DESTINATION if( NOT _target ) if( NOT _dest ) tde_message_fatal( "target name cannot be determined because DESTINATION is not set" ) endif() string( REPLACE "/" "-" _target "${_dest}" ) endif() set( _target "${_target}-${_lang}-handbook" ) # if sources are listed, complete the path to absolute if( _srcs ) foreach( _src ${_srcs} ) if( NOT IS_ABSOLUTE ${_src} ) list( REMOVE_ITEM _srcs ${_src} ) get_filename_component( _src "${_source_basedir}/${_src}" ABSOLUTE ) list( APPEND _srcs ${_src} ) endif() endforeach() endif() # if no file specified, include all docbooks, stylesheets and images if( NOT _srcs ) file( GLOB _srcs ${_source_basedir}/*.docbook ${_source_basedir}/*.css ${_source_basedir}/*.gif ${_source_basedir}/*.jpg ${_source_basedir}/*.png ) endif() # if no destination specified, defaulting to HTML_INSTALL_DIR if( NOT _dest ) set( _dest "${HTML_INSTALL_DIR}/${_lang}" ) # if destination is NOT absolute path, # we assume that is relative to HTML_INSTALL_DIR elseif( NOT IS_ABSOLUTE ${_dest} ) set( _dest "${HTML_INSTALL_DIR}/${_lang}/${_dest}" ) endif() if( NOT _srcs ) tde_message_fatal( "no source files" ) endif() if( NOT _noindex ) # check for index.docbook list( FIND _srcs "${_source_basedir}/index.docbook" _find_index ) if( -1 EQUAL _find_index ) tde_message_fatal( "missing index.docbook file" ) endif() # check for srcdir if( _srcdir ) set( _srcdir "--srcdir=${_srcdir}" ) endif() add_custom_command( OUTPUT ${_binary_basedir}/index.cache.bz2 COMMAND ${KDE3_MEINPROC_EXECUTABLE} ${_srcdir} --check --cache index.cache.bz2 ${_source_basedir}/index.docbook COMMENT "Generating ${_target}" DEPENDS ${_srcs} WORKING_DIRECTORY "${_binary_basedir}" ) string( REPLACE "@" "_" _target "${_target}" ) add_custom_target( ${_target} ALL DEPENDS ${_binary_basedir}/index.cache.bz2 ) list( APPEND _srcs ${_binary_basedir}/index.cache.bz2 ) if( NOT TDE_HTML_DIR ) set( TDE_HTML_DIR ${HTML_INSTALL_DIR} ) endif( ) tde_install_empty_directory( ${_dest} ) file( RELATIVE_PATH _common_link_target "${_dest}" "${TDE_HTML_DIR}/${_lang}/common" ) tde_install_symlink( ${_common_link_target} ${_dest} ) endif() install( FILES ${_srcs} ${_extra} DESTINATION ${_dest} ) endmacro( ) ################################################# ##### ##### tde_create_tarball ##### ##### Macro is used to create tarball. ##### macro( tde_create_tarball ) unset( _target ) unset( _files ) unset( _destination ) set( _sourcedir "${CMAKE_CURRENT_SOURCE_DIR}" ) set( _compression "gzip" ) set( _var _target ) foreach( _arg ${ARGN} ) # found directive "TARGET" if( "+${_arg}" STREQUAL "+TARGET" ) unset( _target ) set( _var _target ) set( _directive 1 ) endif( ) # found directive "SOURCEDIR" if( "+${_arg}" STREQUAL "+SOURCEDIR" ) unset( _sourcedir ) set( _var _sourcedir ) set( _directive 1 ) endif( ) # found directive "FILES" if( "+${_arg}" STREQUAL "+FILES" ) unset( _files ) set( _var _files ) set( _directive 1 ) endif( ) # found directive "DESTINATION" if( "+${_arg}" STREQUAL "+DESTINATION" ) unset( _destination ) set( _var _destination ) set( _directive 1 ) endif( ) # found directive "COMPRESSION" if( "+${_arg}" STREQUAL "+COMPRESSION" ) unset( _compression ) set( _var _compression ) set( _directive 1 ) endif( ) # collect data if( _directive ) unset( _directive ) elseif( _var ) list( APPEND ${_var} ${_arg} ) endif( ) endforeach( ) if( NOT _target ) tde_message_fatal( "Target tarball name not specified." ) endif( ) if( NOT IS_ABSOLUTE ${_sourcedir} ) set( _sourcedir "${CMAKE_CURRENT_SOURCE_DIR}/${_sourcedir}" ) endif( ) if( NOT _files ) file( GLOB_RECURSE _files RELATIVE ${_sourcedir} "${_sourcedir}/*" ) list( SORT _files ) endif( ) unset( _files_deps ) foreach( _file ${_files} ) list( APPEND _files_deps "${_sourcedir}/${_file}" ) endforeach( ) if( NOT DEFINED TAR_EXECUTABLE ) find_program( TAR_EXECUTABLE NAMES tar ) if( "${TAR_EXECUTABLE}" STREQUAL "TAR_EXECUTABLE-NOTFOUND" ) tde_message_fatal( "tar executable is required but not found on your system" ) endif( ) endif( ) if( NOT DEFINED TAR_SETOWNER ) execute_process( COMMAND ${TAR_EXECUTABLE} --version OUTPUT_VARIABLE TAR_VERSION ) string( REGEX REPLACE "^([^\n]*)\n.*" "\\1" TAR_VERSION "${TAR_VERSION}" ) if( "${TAR_VERSION}" MATCHES "GNU *tar" ) set( TAR_SETOWNER "--owner=root;--group=root" ) set( TAR_REPRODUCIBLE "--pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime" ) list( APPEND TAR_REPRODUCIBLE "--mode=u+rw,go=rX,a-s" ) tde_read_src_metadata() if( TDE_PKG_DATETIME ) list( APPEND TAR_REPRODUCIBLE --mtime "${TDE_PKG_DATETIME} UTC" ) elseif( TDE_SCM_MODULE_DATETIME ) list( APPEND TAR_REPRODUCIBLE --mtime "${TDE_SCM_MODULE_DATETIME} UTC" ) endif( ) elseif( "${TAR_VERSION}" MATCHES "bsd *tar" ) set( TAR_SETOWNER "--uname=root;--gname=root" ) else( ) set( TAR_SETOWNER "" ) endif( ) endif( ) if( "${_compression}" STREQUAL "-" ) unset( _compression ) endif( ) if( _compression ) if( "${_compression}" STREQUAL "gzip" ) set( TAR_COMPRESSION "|" ${_compression} "-n" ) else( ) set( TAR_COMPRESSION "|" ${_compression} ) endif( ) endif( ) get_filename_component( _target_path "${CMAKE_CURRENT_BINARY_DIR}/${_target}" ABSOLUTE ) file( RELATIVE_PATH _target_path "${CMAKE_BINARY_DIR}" "${_target_path}" ) string( REPLACE "/" "+" _target_name "${_target_path}" ) add_custom_target( "${_target_name}-tarball" ALL DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${_target}" ) add_custom_command( COMMAND ${TAR_EXECUTABLE} cf - ${TAR_SETOWNER} ${TAR_REPRODUCIBLE} -- ${_files} ${TAR_COMPRESSION} > ${CMAKE_CURRENT_BINARY_DIR}/${_target} WORKING_DIRECTORY "${_sourcedir}" OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${_target}" DEPENDS ${_files_deps} COMMENT "Create tarball ${_target_path}" ) if( _destination ) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/${_target} DESTINATION ${_destination} ) endif( ) endmacro() ################################################# ##### ##### tde_include_tqt macro( tde_include_tqt ) foreach( _cpp ${ARGN} ) set_source_files_properties( ${_cpp} PROPERTIES COMPILE_FLAGS "-include tqt.h" ) endforeach() endmacro( ) ################################################# ##### ##### tde_install_symlink macro( tde_install_symlink _target _link ) # if path is relative, we must to prefix it with CMAKE_INSTALL_PREFIX if( IS_ABSOLUTE "${_link}" ) set( _destination "${_link}" ) else( IS_ABSOLUTE "${_link}" ) set( _destination "${CMAKE_INSTALL_PREFIX}/${_link}" ) endif( IS_ABSOLUTE "${_link}" ) get_filename_component( _path "${_destination}" PATH ) if( NOT IS_DIRECTORY "\$ENV{DESTDIR}${_path}" ) install( CODE "file( MAKE_DIRECTORY \"\$ENV{DESTDIR}${_path}\" )" ) endif( NOT IS_DIRECTORY "\$ENV{DESTDIR}${_path}" ) install( CODE "execute_process( COMMAND ln -s ${_target} \$ENV{DESTDIR}${_destination} )" ) endmacro( tde_install_symlink ) ################################################# ##### ##### tde_install_empty_directory macro( tde_install_empty_directory _path ) # if path is relative, we must to prefix it with CMAKE_INSTALL_PREFIX if( IS_ABSOLUTE "${_path}" ) set( _destination "${_path}" ) else( IS_ABSOLUTE "${_path}" ) set( _destination "${CMAKE_INSTALL_PREFIX}/${_path}" ) endif( IS_ABSOLUTE "${_path}" ) install( CODE "file( MAKE_DIRECTORY \"\$ENV{DESTDIR}${_destination}\" )" ) endmacro( tde_install_empty_directory ) ################################################# ##### ##### tde_conditional_add_subdirectory macro( tde_conditional_add_subdirectory _cond _path ) if( ${_cond} ) add_subdirectory( "${_path}" ) endif( ${_cond} ) endmacro( tde_conditional_add_subdirectory ) ################################################# ##### ##### tde_auto_add_subdirectories macro( tde_auto_add_subdirectories ) file( GLOB _dirs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} * ) foreach( _dir ${_dirs} ) if( IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${_dir} ) if( NOT ${_dir} STREQUAL ".svn" AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${_dir}/CMakeLists.txt ) add_subdirectory( ${_dir} ) endif() endif() endforeach() endmacro() ################################################# ##### ##### tde_save / tde_restore macro( tde_save ) foreach( _var ${ARGN} ) set( __bak_${_var} ${${_var}} ) endforeach() endmacro() macro( tde_save_and_set _var ) set( __bak_${_var} ${${_var}} ) set( ${_var} ${ARGN} ) endmacro( ) macro( tde_restore ) foreach( _var ${ARGN} ) set( ${_var} ${__bak_${_var}} ) unset( __bak_${_var} ) endforeach() endmacro() ################################################# ##### ##### tde_setup_install_path macro( tde_setup_install_path _path _default ) if( DEFINED ${_path} ) set( ${_path} "${${_path}}" CACHE INTERNAL "" FORCE ) else( ) set( ${_path} "${_default}" ) endif( ) endmacro( ) ################################################## if( ${CMAKE_SOURCE_DIR} MATCHES ${CMAKE_BINARY_DIR} ) tde_message_fatal( "Please use out-of-source building, like this: \n rm ${CMAKE_SOURCE_DIR}/CMakeCache.txt mkdir /tmp/${PROJECT_NAME}.build cd /tmp/${PROJECT_NAME}.build cmake ${CMAKE_SOURCE_DIR} [arguments...]" ) endif( ) ################################################# ##### ##### tde_setup_architecture_flags macro( tde_setup_architecture_flags ) if( NOT DEFINED LINKER_IMMEDIATE_BINDING_FLAGS ) message( STATUS "Detected ${CMAKE_SYSTEM_PROCESSOR} CPU architecture" ) ## Immediate symbol binding is available only for gcc but not on ARM architectures if( ${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU" AND NOT ${CMAKE_SYSTEM_PROCESSOR} MATCHES arm* AND NOT ${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD" ) set( LINKER_IMMEDIATE_BINDING_FLAGS "-z\ now" CACHE INTERNAL "" FORCE ) else( ) set( LINKER_IMMEDIATE_BINDING_FLAGS "" CACHE INTERNAL "" FORCE ) endif( ) check_cxx_compiler_flag( -fPIE HAVE_PIE_SUPPORT ) if( HAVE_PIE_SUPPORT ) set( TDE_PIE_CFLAGS -fPIE ) if( ${CMAKE_VERSION} VERSION_LESS "3.18" ) execute_process(COMMAND "${CMAKE_LINKER}" --help OUTPUT_VARIABLE __linker_help ERROR_VARIABLE __linker_help) if( "${__linker_help}" MATCHES "-pie" ) set( LINKER_PIE_SUPPORT 1 ) elseif( "${__linker_help}" MATCHES "type=type.*pie" ) set( LINKER_ZTYPE_PIE_SUPPORT 1 ) endif( ) unset(__linker_help) else( ) check_linker_flag(CXX -pie LINKER_PIE_SUPPORT) if( NOT LINKER_PIE_SUPPORT ) check_linker_flag(CXX -ztype=pie LINKER_ZTYPE_PIE_SUPPORT) endif() endif() if( LINKER_PIE_SUPPORT ) set( TDE_PIE_LDFLAGS -pie ) endif( LINKER_PIE_SUPPORT ) if( LINKER_ZTYPE_PIE_SUPPORT ) set( TDE_PIE_LDFLAGS -ztype=pie ) endif( LINKER_ZTYPE_PIE_SUPPORT ) endif( HAVE_PIE_SUPPORT ) set( _reproducible_cxxflags "-fdebug-prefix-map=${CMAKE_SOURCE_DIR}=." "-fmacro-prefix-map=${CMAKE_SOURCE_DIR}=." ) foreach( _flag ${_reproducible_cxxflags} ) string( REGEX REPLACE "=.*" "" _flag_name "${_flag}" ) string( REGEX REPLACE "[^a-zA-Z0-9]+" "_" _flag_var "CXXFLAG_${_flag_name}" ) if( NOT "${CMAKE_CXX_FLAGS}" MATCHES "(^| )${_flag_name}" ) check_cxx_compiler_flag( "${_flag}" ${_flag_var} ) if( ${_flag_var} ) set( CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS} ${_flag}" ) set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_flag}" ) endif() endif() endforeach() endif( ) endmacro( ) ################################################# ##### ##### tde_setup_gcc_visibility macro( tde_setup_gcc_visibility ) if( NOT DEFINED __KDE_HAVE_GCC_VISIBILITY ) if( NOT UNIX ) tde_message_fatal( "gcc visibility support was requested, but your system is not *NIX" ) endif( NOT UNIX ) if( TQT_FOUND AND NOT DEFINED HAVE_TQT_VISIBILITY ) find_library( TQT_LIBFILE tqt-mt HINTS "${TQT_LIBRARY_DIRS}" ) if( NOT "${TQT_LIBFILE}" STREQUAL "TQT_LIBFILE-NOTFOUND" ) message( STATUS "Performing Test HAVE_TQT_VISIBILITY" ) execute_process( COMMAND readelf --syms "${TQT_LIBFILE}" OUTPUT_VARIABLE HAVE_TQT_VISIBILITY ) if( "${HAVE_TQT_VISIBILITY}" STREQUAL "" OR "${HAVE_TQT_VISIBILITY}" MATCHES "GLOBAL[\t ]+DEFAULT[^\n]+QSettingsPrivate" ) message( STATUS "Performing Test HAVE_TQT_VISIBILITY - Failed" ) tde_message_fatal( "gcc visibility support was requested, but not supported in tqt library" ) endif( ) set( HAVE_TQT_VISIBILITY 1 CACHE INTERNAL "" ) message( STATUS "Performing Test HAVE_TQT_VISIBILITY - Success" ) endif( ) endif( TQT_FOUND AND NOT DEFINED HAVE_TQT_VISIBILITY ) if( TDE_FOUND AND NOT DEFINED HAVE_TDE_VISIBILITY ) find_file( TDEMACROS_H tdemacros.h HINTS "${TDE_INCLUDE_DIR}" ) if( NOT "${TDEMACROS_H}" STREQUAL "TDEMACROS_H-NOTFOUND" ) tde_save_and_set( CMAKE_REQUIRED_INCLUDES "${TDE_INCLUDE_DIR}" ) check_cxx_source_compiles( " #include <${TDEMACROS_H}> #ifndef __KDE_HAVE_GCC_VISIBILITY #error gcc visibility is not enabled in tdelibs #endif int main() { return 0; } " HAVE_TDE_VISIBILITY ) tde_restore( CMAKE_REQUIRED_INCLUDES ) if( NOT HAVE_TDE_VISIBILITY ) tde_message_fatal( "gcc visibility support was requested, but not supported in tdelibs" ) endif( NOT HAVE_TDE_VISIBILITY ) endif( ) endif( TDE_FOUND AND NOT DEFINED HAVE_TDE_VISIBILITY ) set( __KDE_HAVE_GCC_VISIBILITY 1 CACHE INTERNAL "" ) set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden") set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden -fvisibility-inlines-hidden") endif( ) endmacro( ) ################################################# ##### ##### tde_setup_msgfmt macro( tde_setup_msgfmt ) if( NOT DEFINED MSGFMT_EXECUTABLE ) include( FindGettext ) if( GETTEXT_FOUND ) set( MSGFMT_EXECUTABLE ${GETTEXT_MSGFMT_EXECUTABLE} CACHE FILEPATH "path to msgfmt executable" ) if( GETTEXT_VERSION_STRING ) set( MSGFMT_VERSION ${GETTEXT_VERSION_STRING} CACHE STRING "version of msgfmt executable" ) endif( ) endif( GETTEXT_FOUND ) if( NOT MSGFMT_EXECUTABLE ) tde_message_fatal( "msgfmt is required but was not found on your system." ) endif( NOT MSGFMT_EXECUTABLE ) endif( ) if( NOT MSGFMT_VERSION ) execute_process( COMMAND ${MSGFMT_EXECUTABLE} --version OUTPUT_VARIABLE _msgfmt_version ERROR_VARIABLE _msgfmt_version ) string( REGEX REPLACE "^msgfmt[^\n]* ([^ ]*)\n.*" "\\1" _msgfmt_version ${_msgfmt_version} ) set( MSGFMT_VERSION ${_msgfmt_version} CACHE STRING "version of msgfmt executable" ) endif( ) endmacro( ) ################################################ ##### ##### tde_setup_largefiles macro( tde_setup_largefiles ) if( NOT DEFINED HAVE_LARGEFILES ) message( STATUS "Check support for large files" ) unset( LARGEFILES_DEFINITIONS ) # check without special definitions unset( HAVE_SIZEOF_T CACHE ) check_type_size( off_t SIZEOF_OFF_T ) if( SIZEOF_OFF_T GREATER 7 ) set( HAVE_LARGEFILES 1 ) endif( ) # check with definition _FILE_OFFSET_BITS=64 if( NOT HAVE_LARGEFILES ) unset( HAVE_SIZEOF_OFF_T CACHE ) tde_save_and_set( CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -D_FILE_OFFSET_BITS=64" ) check_type_size( off_t SIZEOF_OFF_T ) tde_restore( CMAKE_REQUIRED_DEFINITIONS ) if( SIZEOF_OFF_T GREATER 7 ) set( LARGEFILES_DEFINITIONS "-D_FILE_OFFSET_BITS=64" ) set( HAVE_LARGEFILES 1 ) endif( ) endif( ) # check with definition _LARGE_FILES if( NOT HAVE_LARGEFILES ) unset( HAVE_SIZEOF_OFF_T CACHE ) tde_save_and_set( CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -D_LARGE_FILES" ) check_type_size( off_t SIZEOF_OFF_T ) tde_restore( CMAKE_REQUIRED_DEFINITIONS ) if( SIZEOF_OFF_T GREATER 7 ) set( LARGEFILES_DEFINITIONS "-D_LARGE_FILES" ) set( HAVE_LARGEFILES 1 ) endif( ) endif( ) # check with definition _LARGEFILE_SOURCE if( NOT HAVE_LARGEFILES ) unset( HAVE_SIZEOF_OFF_T CACHE ) tde_save_and_set( CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -D_LARGEFILE_SOURCE" ) check_type_size( off_t SIZEOF_OFF_T ) tde_restore( CMAKE_REQUIRED_DEFINITIONS ) if( SIZEOF_OFF_T GREATER 7 ) set( LARGEFILES_DEFINITIONS "-D_LARGEFILE_SOURCE" ) set( HAVE_LARGEFILES 1 ) endif( ) endif( ) # check for fseeko/ftello if( HAVE_LARGEFILES ) tde_save_and_set( CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} ${LARGEFILES_DEFINITIONS}" ) check_symbol_exists( "fseeko" "stdio.h" HAVE_FSEEKO ) tde_restore( CMAKE_REQUIRED_DEFINITIONS ) if( NOT HAVE_FSEEKO ) tde_save_and_set( CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} ${LARGEFILES_DEFINITIONS} -D_LARGEFILE_SOURCE" ) check_symbol_exists( "fseeko" "stdio.h" HAVE_FSEEKO ) tde_restore( CMAKE_REQUIRED_DEFINITIONS ) if( HAVE_FSEEKO ) set( LARGEFILES_DEFINITIONS "${LARGEFILES_DEFINITIONS} -D_LARGEFILE_SOURCE" ) else( ) unset( HAVE_LARGEFILES ) endif( ) endif( ) endif( ) # check results if( HAVE_LARGEFILES ) if( "${LARGEFILES_DEFINITIONS}" STREQUAL "" ) message( STATUS "Check support for large files - Success" ) else( ) add_definitions( ${LARGEFILES_DEFINITIONS} ) message( STATUS "Check support for large files - Success with ${LARGEFILES_DEFINITIONS}" ) endif( ) set( HAVE_LARGEFILES 1 CACHE INTERNAL "Support for large files enabled" ) else( ) message( STATUS "Check support for large files - Failed" ) tde_message_fatal( "Cannot find a way to enable support for large files." ) endif( ) endif( ) endmacro( ) ################################################# ##### ##### tde_setup_dbus macro( tde_setup_dbus ) if( NOT DBUS_FOUND ) pkg_search_module( DBUS dbus-1 ) if( NOT DBUS_FOUND ) tde_message_fatal( "dbus-1 is required, but not found on your system" ) endif( ) endif( ) if( NOT DEFINED DBUS_SYSTEM_CONF_DIRECTORY ) execute_process( COMMAND ${PKG_CONFIG_EXECUTABLE} dbus-1 --variable=sysconfdir OUTPUT_VARIABLE DBUS_SYSTEM_CONF_BASE OUTPUT_STRIP_TRAILING_WHITESPACE ) if( DBUS_SYSTEM_CONF_BASE ) set( DBUS_SYSTEM_CONF_DIRECTORY "${DBUS_SYSTEM_CONF_BASE}/dbus-1/system.d" CACHE PATH "Path for DBUS system configuration files" ) message( STATUS "Using " ${DBUS_SYSTEM_CONF_DIRECTORY} " for DBUS system configuration files" ) else( ) tde_message_fatal( "Can not find the base directory for the dbus-1 configuration" ) endif( ) endif( ) if( NOT DEFINED DBUS_SESSION_CONF_DIRECTORY ) execute_process( COMMAND ${PKG_CONFIG_EXECUTABLE} dbus-1 --variable=sysconfdir OUTPUT_VARIABLE DBUS_SYSTEM_CONF_BASE OUTPUT_STRIP_TRAILING_WHITESPACE ) if( DBUS_SYSTEM_CONF_BASE ) set( DBUS_SESSION_CONF_DIRECTORY "${DBUS_SYSTEM_CONF_BASE}/dbus-1/session.d" CACHE PATH "Path for DBUS session configuration files" ) message( STATUS "Using " ${DBUS_SESSION_CONF_DIRECTORY} " for DBUS session configuration files" ) else( ) tde_message_fatal( "Can not find the base directory for the dbus-1 configuration" ) endif( ) endif( ) if( NOT DEFINED DBUS_SESSION_DIRECTORY ) execute_process( COMMAND ${PKG_CONFIG_EXECUTABLE} dbus-1 --variable=session_bus_services_dir OUTPUT_VARIABLE DBUS_SESSION_DIRECTORY OUTPUT_STRIP_TRAILING_WHITESPACE ) set( DBUS_SESSION_DIRECTORY "${DBUS_SESSION_DIRECTORY}" CACHE PATH "Path for DBUS session service files" ) message( STATUS "Using " ${DBUS_SESSION_DIRECTORY} " for DBUS session service files" ) endif( ) if( NOT DEFINED DBUS_SERVICE_DIRECTORY ) execute_process( COMMAND ${PKG_CONFIG_EXECUTABLE} dbus-1 --variable=system_bus_services_dir OUTPUT_VARIABLE DBUS_SERVICE_DIRECTORY OUTPUT_STRIP_TRAILING_WHITESPACE ) if( "${DBUS_SERVICE_DIRECTORY}" STREQUAL "" ) if( "${DBUS_SESSION_DIRECTORY}" MATCHES "/services$" ) string( REGEX REPLACE "/services$" "/system-services" DBUS_SERVICE_DIRECTORY "${DBUS_SESSION_DIRECTORY}" ) else( ) tde_message_fatal( "Directory for DBUS system service files can not be determined." ) endif( ) endif( ) set( DBUS_SERVICE_DIRECTORY "${DBUS_SERVICE_DIRECTORY}" CACHE PATH "Path for DBUS system service files" ) message( STATUS "Using " ${DBUS_SERVICE_DIRECTORY} " for DBUS system service files" ) endif( ) if( NOT "${ARGV}" STREQUAL "" AND NOT DBUS_TQT_FOUND ) pkg_search_module( DBUS_TQT ${ARGV} ) if( NOT DBUS_TQT_FOUND ) tde_message_fatal( "${ARGV} is required, but not found on your system" ) endif( ) endif( ) if( "${ARGV}" STREQUAL "dbus-1-tqt" AND NOT DEFINED DBUSXML2QT3_EXECUTABLE ) find_program( DBUSXML2QT3_EXECUTABLE NAMES dbusxml2qt3 HINTS "${TDE_PREFIX}/bin" ${BIN_INSTALL_DIR} ) endif( ) endmacro( ) ################################################# ##### ##### tde_setup_polkit macro( tde_setup_polkit ) if( NOT POLKIT_GOBJECT_FOUND ) pkg_search_module( POLKIT_GOBJECT polkit-gobject-1 ) if( NOT POLKIT_GOBJECT_FOUND ) tde_message_fatal( "polkit-gobject-1 is required, but not found on your system" ) endif( ) endif( ) foreach( _arg ${ARGV} ) if( NOT "${_arg}" MATCHES "^polkit-" ) set( _arg "polkit-${_arg}" ) endif( ) string( TOUPPER "${_arg}" _polkit_module ) if( "${_polkit_module}" MATCHES "-[0-9]+$" ) string( REGEX REPLACE "-[0-9]+$" "" _polkit_module "${_polkit_module}" ) endif( ) string( REPLACE "-" "_" _polkit_module "${_polkit_module}" ) if( NOT "${_arg}" MATCHES "-[0-9]+$" ) set( _arg "${_arg}-1" ) endif( ) if( NOT ${_polkit_module}_FOUND ) pkg_search_module( ${_polkit_module} ${_arg} ) if( NOT ${_polkit_module}_FOUND ) tde_message_fatal( "${_arg} is required, but not found on your system" ) endif( ) endif( ) endforeach( ) if( NOT DEFINED POLKIT_ACTIONS_DIRECTORY ) execute_process( COMMAND ${PKG_CONFIG_EXECUTABLE} polkit-gobject-1 --variable=actiondir OUTPUT_VARIABLE POLKIT_ACTIONS_DIRECTORY OUTPUT_STRIP_TRAILING_WHITESPACE ) set( POLKIT_ACTIONS_DIRECTORY "${POLKIT_ACTIONS_DIRECTORY}" CACHE PATH "Path for PolicyKit action files" ) message( STATUS "Using " ${POLKIT_ACTIONS_DIRECTORY} " for PolicyKit action files" ) endif( ) endmacro( ) ################################################# ##### ##### restore CMake policies cmake_policy( POP ) #################################################