diff --git a/modules/TDEMacros.cmake b/modules/TDEMacros.cmake index ef49af0..6eb6cf4 100644 --- a/modules/TDEMacros.cmake +++ b/modules/TDEMacros.cmake @@ -1771,13 +1771,13 @@ endmacro( ) macro( tde_create_translated_desktop ) - unset( _src ) + unset( _srcs ) + unset( _arg_out_name ) + unset( _arg_po_dir ) unset( _keywords_add ) - unset( _po_dir ) unset( _dest ) - unset( _out_name ) unset( _directive ) - set( _var _src ) + set( _var _srcs ) set( _keywords_desktop_default "Name" "GenericName" "Comment" "Keywords" "Description" "ExtraNames" "X-TDE-Submenu" ) @@ -1786,8 +1786,8 @@ macro( tde_create_translated_desktop ) # found directive "SOURCE" if( "+${_arg}" STREQUAL "+SOURCE" ) - unset( _src ) - set( _var _src ) + unset( _srcs ) + set( _var _srcs ) set( _directive 1 ) endif( ) @@ -1800,8 +1800,8 @@ macro( tde_create_translated_desktop ) # found directive "PO_DIR" if( "+${_arg}" STREQUAL "+PO_DIR" ) - unset( _po_dir ) - set( _var _po_dir ) + unset( _arg_po_dir ) + set( _var _arg_po_dir ) set( _directive 1 ) endif( ) @@ -1814,8 +1814,8 @@ macro( tde_create_translated_desktop ) # found directive "OUTPUT_NAME" if( "+${_arg}" STREQUAL "+OUTPUT_NAME" ) - unset( _out_name ) - set( _var _out_name ) + unset( _arg_out_name ) + set( _var _arg_out_name ) set( _directive 1 ) endif( ) @@ -1828,6 +1828,22 @@ macro( tde_create_translated_desktop ) 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 @@ -1868,132 +1884,131 @@ macro( tde_create_translated_desktop ) endif( ) endforeach( ) - # no source file specified! - if( NOT _src ) - tde_message_fatal( "no source desktop file specified" ) - endif( ) - get_filename_component( _basename ${_src} ABSOLUTE ) - get_filename_component( _basedir ${_basename} PATH ) - file( RELATIVE_PATH _basename "${CMAKE_CURRENT_SOURCE_DIR}" "${_basename}" ) - - # prepare the binary directory according to source directory - file( RELATIVE_PATH _binary_basedir "${CMAKE_CURRENT_SOURCE_DIR}" "${_basedir}" ) - set( _binary_basedir "${CMAKE_CURRENT_BINARY_DIR}/${_binary_basedir}" ) - file( MAKE_DIRECTORY "${_binary_basedir}" ) + # process source files + foreach( _src IN LISTS _srcs ) - # 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() + # get a base name and a directory + get_filename_component( _basename ${_src} ABSOLUTE ) + get_filename_component( _basedir ${_basename} PATH ) + file( RELATIVE_PATH _basename "${CMAKE_CURRENT_SOURCE_DIR}" "${_basename}" ) - # if no output name specified, use the same as source - if( NOT _out_name ) - get_filename_component( _out_name ${_basename} NAME ) - endif( ) + # prepare the binary directory according to source directory + file( RELATIVE_PATH _binary_basedir "${CMAKE_CURRENT_SOURCE_DIR}" "${_basedir}" ) + set( _binary_basedir "${CMAKE_CURRENT_BINARY_DIR}/${_binary_basedir}" ) + file( MAKE_DIRECTORY "${_binary_basedir}" ) - # determine po directory - if( _po_dir ) - set( _po_base ${_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} ) + # 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() - 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} ) + # 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() - set( _po_dir ${CMAKE_SOURCE_DIR}/translations/desktop_files ) + 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( ) - endif( ) - # if no destination directory specified, install as application link - if( NOT _dest ) - set( _dest ${XDG_APPS_INSTALL_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( ) + if( _translations ) - # 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( ) - if( _translations ) + # prepare a full name for the target + get_filename_component( _target ${_basename} ABSOLUTE ) + file( RELATIVE_PATH _target "${CMAKE_SOURCE_DIR}" "${_target}" ) + string( REPLACE "/" "+" _target "${_target}-translated" ) - # prepare a full name for the target - get_filename_component( _target ${_basename} ABSOLUTE ) - file( RELATIVE_PATH _target "${CMAKE_SOURCE_DIR}" "${_target}" ) - string( REPLACE "/" "+" _target "${_target}-translated" ) + if( NOT TARGET ${_target} ) - if( NOT TARGET ${_target} ) + if( DESKTOP_MERGE_MSGFMT ) - 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( ) - # 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( ) - # prepare keywords for msgfmt - set( _keywords_arg "--keyword=" ) - foreach( _keyword ${_keywords_desktop} ) - list( APPEND _keywords_arg "--keyword=\"${_keyword}\"" ) - endforeach( ) + # merge translations command + get_filename_component( _src ${_src} ABSOLUTE ) + add_custom_command( + OUTPUT ${_basename} + COMMAND ${CMAKE_COMMAND} -E env "LINGUAS=${_linguas}" ${MSGFMT_EXECUTABLE} --desktop --template ${_src} -d ${_po_dir} -o ${_basename} ${_keywords_arg} + DEPENDS ${_src} + ) - # merge translations command - get_filename_component( _src ${_src} ABSOLUTE ) - add_custom_command( - OUTPUT ${_basename} - COMMAND ${CMAKE_COMMAND} -E env "LINGUAS=${_linguas}" ${MSGFMT_EXECUTABLE} --desktop --template ${_src} -d ${_po_dir} -o ${_basename} ${_keywords_arg} - DEPENDS ${_src} - ) + else( ) - else( ) + # create template for intltool-merge + file( READ ${_src} _src_data ) + string( REPLACE ";" "|" _keywords_match "(${_keywords_desktop})" ) + string( REGEX REPLACE "(^|\n)${_keywords_match}[ ]*=[ ]*" "\\1_\\2=" _src_data "${_src_data}" ) + file( WRITE ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.in "${_src_data}" ) - # create template for intltool-merge - file( READ ${_src} _src_data ) - string( REPLACE ";" "|" _keywords_match "(${_keywords_desktop})" ) - string( REGEX REPLACE "(^|\n)${_keywords_match}[ ]*=[ ]*" "\\1_\\2=" _src_data "${_src_data}" ) - file( WRITE ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.in "${_src_data}" ) + # merge translations command + add_custom_command( + OUTPUT ${_basename} + COMMAND ${INTLTOOL_MERGE_EXECUTABLE} -d ${_po_dir} ${_basename}.in ${_basename} + DEPENDS ${_src} + ) - # merge translations command - add_custom_command( - OUTPUT ${_basename} - COMMAND ${INTLTOOL_MERGE_EXECUTABLE} -d ${_po_dir} ${_basename}.in ${_basename} - DEPENDS ${_src} - ) + endif( ) - endif( ) + # merge translations target + add_custom_target( "${_target}" ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${_basename} ) - # merge translations target - add_custom_target( "${_target}" ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${_basename} ) + endif() - endif() + else( ) - else( ) + # just write the original file without translations + file( READ ${_src} _src_data ) + file( WRITE ${CMAKE_CURRENT_BINARY_DIR}/${_basename} "${_src_data}" ) - # just write the original file without translations - file( READ ${_src} _src_data ) - file( WRITE ${CMAKE_CURRENT_BINARY_DIR}/${_basename} "${_src_data}" ) + endif( ) - endif( ) + # install traslated desktop file + install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/${_basename} + RENAME ${_out_name} + DESTINATION ${_dest} + ) - # install traslated desktop file - install( - FILES ${CMAKE_CURRENT_BINARY_DIR}/${_basename} - RENAME ${_out_name} - DESTINATION ${_dest} - ) + endforeach() endmacro( )