# --------------------------------------------------------------------------- # KWWidgets_CREATE_GETTEXT_TARGETS # This macro can be used to create all the custom commands (and optionally # targets) necessary to: # - create a translation template file (pot) out of a set of sources # files where translatable strings were marked. This template file # will be re-generated each time its sources dependencies are modified. # This template file has to be stored out-of-source (say, in the build tree), # it is then up to the user to commit it back to the source tree if needed. # - initialize translation files (po) for a set of locales, out of the # translation template file (pot). # - merge translation files (po) for a set of locales, out of a new or # re-generated translation template file (pot). Translations that were # in the po files are kept and new strings to translate found in the # pot file are copied to the po file for future translation. # Translation files are merged automatically each time the template file # is modified, either manually, or when it is re-generated from its sources # dependencies. # The translation files have to be stored out-of-source (say, in the build # tree), it is then up to the user to commit them back to the source tree # if needed. # - compile the translation files (po) for a set of locates into binary # translation files (mo). Binary files are re-compiled each time the # translation file are modified, either manually, or when they have been # merge against a modified template file (as a result of manually editing # it or modifying its sources dependencies). # The binary files are generated from po files that are out-of-source # (say, in the build tree). The po files in the source tree are only # used to initialize the one in the build tree the first time they # are needed. # - install the mo files. # # This macro accepts parameters as arg/value pairs or as a single arg if # the arg is described as boolean (same as setting the arg to 1). The # args can be specificied in any order and most of them are optionals. # # Required arguments: # DOMAIN_NAME (string): the translation domain name, i.e. the name of the # application or library the translations are created for. # Default to ${PROJECT_NAME} if not found. # PO_DIR (path): absolute path to the directory where the translation # files (po) are found. # Default to "${CMAKE_CURRENT_SOURCE_DIR}/po" if not found. # LOCALE_LIST (string): semicolon-separated list of locales to initialize, # merge or compile translation files for (ex: "fr;zh_CN;en"). # MO_BUILD_DIR (path): absolute path to the directory in the *build* tree # where the binary translation files (mo) should be saved. # Default "${EXECUTABLE_OUTPUT_PATH}/../locale" if EXECUTABLE_OUTPUT_PATH # is found, "${CMAKE_CURRENT_BINARY_DIR}/locale" otherwise. # # Optional arguments: # SOURCES (list): list of source files the translation template file (pot) # will be (re)-generated from. # POT_BUILD_DIR (path): absolute path to the directory in the *build* tree # where up-to-date translation template file (pot) should be stored. # Default to "${CMAKE_CURRENT_BINARY_DIR}/po" if not found. # PO_BUILD_DIR (path): absolute path to the directory in the *build* tree # where up-to-date translation files (po) should be stored. # Default to "${CMAKE_CURRENT_BINARY_DIR}/po" if not found. # PO_PREFIX (string): string that will be used to prefix the filename of # each translation file. # Default to the value of "${DOMAIN_NAME}_" # MO_INSTALL_DIR (path): directory where the binary translation files (mo) # should be installed to. # COPYRIGHT_HOLDER (string): copyright holder string that will be stored in # the translation template file (pot). # Default to the empty string if not found. # MSGID_BUGS_ADDRESS (string): report address for msgid bugs that will be stored in # the translation template file (pot). # Default to the empty string if not found. # DEFAULT_PO_ENCODING (string): default encoding to be used when initializing # new translation file (po) for each locale. This will not change the # encoding of existing translation file (po). # Default to "utf-8" (Unicode) if not found. # EXTRA_GETTEXT_KEYWORDS (string): semicolon-separated list of extra keywords # that should be recognized as a call to the gettext() function. # EXTRA_DGETTEXT_KEYWORDS (string): semicolon-separated list of extra keywords # that should be recognized as a call to the dgettext() function. # # Target arguments: # By default, custom commands are created to create all the files, as well # as *one* custom target that can be triggered to refresh all the files. # This custom target can be added to the 'ALL' target, but is not by default # as modifying any source file would trigger: re-generating the template # file (pot), merging all translation files (po), and compiling them into # binary files (mo). # TARGET_BASENAME (string): basename of all targets (a suffix is added # depending of each target). # Default to ${DOMAIN_NAME} if specified, ${PROJECT_NAME} otherwise. # CREATE_POT_TARGET (boolean): create a target for the template file (pot), # using the '_pot' suffix. # Default to 0. # CREATE_PO_TARGET (boolean): create one unique target for all translation # files (po), using the '_po' suffix. Can be used to refresh all PO files. # Depends on the pot file. # Default to 0. # CREATE_PO_LOCALE_TARGETS (boolean): create one target per locale # translation file (po), using the '_po_locale' suffix (say '_po_fr'). Can # be used to refresh a single PO file. Depends on the pot file. # Default to 0. # CREATE_MO_TARGET (boolean): create one unique target for all binary # translation files (mo), using the '_mo' suffix. Can be used to refresh all # MO files (i.e. everything in the translation pipeline). Depends on each # single po file. Can be added to the 'ALL' target using # ADD_MO_TARGET_TO_ALL (CREATE_MO_TARGET will therefore be considered true). # Default to 1. # CREATE_MO_LOCALE_TARGETS (boolean): create one target per locale binary # translation file (mo), using the '_mo_locale' suffix (say '_mo_fr'). Can # be used to refresh a single MO file. Depends on the same po file. # Default to 0. # ADD_MO_TARGET_TO_ALL: add the unique MO target to the 'ALL' target. Doing # so is likely to trigger all translation targets each time a source # file is modified and compiled. This automatically creates the unique # target for all binary translation files (mo), just like if # CREATE_MO_TARGET was true. # Default to 0. cmake_minimum_required(VERSION 2.4) if(COMMAND cmake_policy) cmake_policy(SET CMP0003 NEW) endif(COMMAND cmake_policy) macro(KWWidgets_CREATE_GETTEXT_TARGETS) set(notset_value "__not_set__") # Provide some reasonable defaults set(domain_name ${PROJECT_NAME}) set(po_dir "${CMAKE_CURRENT_SOURCE_DIR}/po") set(po_build_dir "${CMAKE_CURRENT_BINARY_DIR}/po") set(pot_build_dir "${CMAKE_CURRENT_BINARY_DIR}/po") set(locale_list "") set(default_po_encoding "utf-8") set(mo_install_dir "") set(copyright_holder "") set(msgid_bugs_address "foo@bar.com") set(sources ) set(po_prefix ${notset_value}) set(extra_gettext_keywords "") set(extra_dgettext_keywords "") set(target_basename ${notset_value}) set(create_pot_target 0) set(create_po_target 0) set(create_po_locale_targets 0) set(create_mo_target 1) set(create_mo_locale_targets 0) set(add_mo_target_to_all 0) if(EXECUTABLE_OUTPUT_PATH) get_filename_component( mo_build_dir "${EXECUTABLE_OUTPUT_PATH}/../locale" ABSOLUTE) else(EXECUTABLE_OUTPUT_PATH) set(mo_build_dir "${CMAKE_CURRENT_BINARY_DIR}/locale") endif(EXECUTABLE_OUTPUT_PATH) # Parse the arguments set(valued_parameter_names "^(TARGET_BASENAME|DOMAIN_NAME|POT_BUILD_DIR|PO_DIR|PO_BUILD_DIR|DEFAULT_PO_ENCODING|MO_BUILD_DIR|MO_INSTALL_DIR|COPYRIGHT_HOLDER|MSGID_BUGS_ADDRESS|PO_PREFIX)$") set(boolean_parameter_names "^(ADD_MO_TARGET_TO_ALL|CREATE_POT_TARGET|CREATE_PO_TARGET|CREATE_PO_LOCALE_TARGETS|CREATE_MO_TARGET|CREATE_MO_LOCALE_TARGETS)$") set(list_parameter_names "^(SOURCES|LOCALE_LIST|EXTRA_GETTEXT_KEYWORDS|EXTRA_DGETTEXT_KEYWORDS)$") set(next_arg_should_be_value 0) set(prev_arg_was_boolean 0) set(prev_arg_was_list 0) set(unknown_parameters) string(REGEX REPLACE ";;" ";FOREACH_FIX;" parameter_list "${ARGV}") foreach(arg ${parameter_list}) if("${arg}" STREQUAL "FOREACH_FIX") set(arg "") endif("${arg}" STREQUAL "FOREACH_FIX") set(matches_valued 0) if("${arg}" MATCHES ${valued_parameter_names}) set(matches_valued 1) endif("${arg}" MATCHES ${valued_parameter_names}) set(matches_boolean 0) if("${arg}" MATCHES ${boolean_parameter_names}) set(matches_boolean 1) endif("${arg}" MATCHES ${boolean_parameter_names}) set(matches_list 0) if("${arg}" MATCHES ${list_parameter_names}) set(matches_list 1) endif("${arg}" MATCHES ${list_parameter_names}) if(matches_valued OR matches_boolean OR matches_list) if(prev_arg_was_boolean) string(TOLOWER ${prev_arg_name} prev_arg_name) set(${prev_arg_name} 1) else(prev_arg_was_boolean) if(next_arg_should_be_value AND NOT prev_arg_was_list) message(FATAL_ERROR "Found ${arg} instead of value for ${prev_arg_name}") endif(next_arg_should_be_value AND NOT prev_arg_was_list) endif(prev_arg_was_boolean) set(next_arg_should_be_value 1) set(prev_arg_was_boolean ${matches_boolean}) set(prev_arg_was_list ${matches_list}) set(prev_arg_name ${arg}) else(matches_valued OR matches_boolean OR matches_list) if(next_arg_should_be_value) if(prev_arg_was_boolean) if(NOT "${arg}" STREQUAL "1" AND NOT "${arg}" STREQUAL "0") message(FATAL_ERROR "Found ${arg} instead of 0 or 1 for ${prev_arg_name}") endif(NOT "${arg}" STREQUAL "1" AND NOT "${arg}" STREQUAL "0") endif(prev_arg_was_boolean) string(TOLOWER ${prev_arg_name} prev_arg_name) if(prev_arg_was_list) set(${prev_arg_name} ${${prev_arg_name}} ${arg}) else(prev_arg_was_list) set(${prev_arg_name} ${arg}) set(next_arg_should_be_value 0) endif(prev_arg_was_list) else(next_arg_should_be_value) set(unknown_parameters ${unknown_parameters} ${arg}) endif(next_arg_should_be_value) set(prev_arg_was_boolean 0) endif(matches_valued OR matches_boolean OR matches_list) endforeach(arg) if(next_arg_should_be_value) if(prev_arg_was_boolean) string(TOLOWER ${prev_arg_name} prev_arg_name) set(${prev_arg_name} 1) else(prev_arg_was_boolean) if(prev_arg_was_list) string(TOLOWER ${prev_arg_name} prev_arg_name) set(${prev_arg_name} ${${prev_arg_name}} ${arg}) else(prev_arg_was_list) message(FATAL_ERROR "Missing value for ${prev_arg_name}") endif(prev_arg_was_list) endif(prev_arg_was_boolean) endif(next_arg_should_be_value) if(unknown_parameters) message(FATAL_ERROR "Unknown parameter(s): ${unknown_parameters}") endif(unknown_parameters) # Fix some defaults if(${target_basename} STREQUAL ${notset_value}) set(target_basename ${domain_name}) endif(${target_basename} STREQUAL ${notset_value}) if(${po_prefix} STREQUAL ${notset_value}) set(po_prefix "${domain_name}_") endif(${po_prefix} STREQUAL ${notset_value}) # Create the targets if(NOT "${sources}" STREQUAL "") kwwidgets_create_pot_target( "${domain_name}" "${pot_build_dir}" "${po_dir}" "${copyright_holder}" "${msgid_bugs_address}" "${sources}" "${target_basename}" "${create_pot_target}" "${extra_gettext_keywords}" "${extra_dgettext_keywords}" ) endif(NOT "${sources}" STREQUAL "") kwwidgets_create_po_targets( "${domain_name}" "${pot_build_dir}" "${po_dir}" "${po_build_dir}" "${po_prefix}" "${locale_list}" "${default_po_encoding}" "${target_basename}" "${create_po_target}" "${create_po_locale_targets}" ) kwwidgets_create_mo_targets( "${domain_name}" "${po_dir}" "${po_build_dir}" "${po_prefix}" "${locale_list}" "${mo_build_dir}" "${mo_install_dir}" "${target_basename}" "${create_mo_target}" "${create_mo_locale_targets}" "${add_mo_target_to_all}" ) endmacro(KWWidgets_CREATE_GETTEXT_TARGETS) # --------------------------------------------------------------------------- # KWWidgets_GET_POT_FILENAME # Given a translation domain and the location of a directory, return the # filename to the domain template file (pot). # 'varname': name of the var the template filename should be stored into # 'domain_name': translation domain name (i.e. name of application or library) # 'pot_build_dir': path in the build tree where the template should be stored macro(KWWidgets_GET_POT_FILENAME varname domain_name pot_build_dir) set(${varname} "${pot_build_dir}/${domain_name}.pot") endmacro(KWWidgets_GET_POT_FILENAME) # --------------------------------------------------------------------------- # KWWidgets_GET_PO_FILENAME # Given a PO directory, a prefix and a locale, return the filename to the # translation file (po) for that locale. # 'varname': name of the var the translation filename should be stored into # 'po_dir': path to the po directory where the PO file are stored # 'po_prefix': string that is used to prefix each translation file. # 'locale': a locale (say, "fr") macro(KWWidgets_GET_PO_FILENAME varname po_dir po_prefix locale) set(${varname} "${po_dir}/${po_prefix}${locale}.po") endmacro(KWWidgets_GET_PO_FILENAME) # --------------------------------------------------------------------------- # KWWidgets_GET_PO_SAFE_BUILD_DIR # Given a PO directory, a PO build directory, returns either the # PO build directory if it is different than the PO directory, or # a directory in the build tree. This macro is used to get a safe place # to write PO related files # 'varname': name of the var the PO safe build dir should be stored into # 'po_dir': path to the po directory where the PO file are stored # 'po_build_dir': build path where up-to-date PO files should be stored macro(KWWidgets_GET_PO_SAFE_BUILD_DIR varname po_dir po_build_dir) if("${po_build_dir}" STREQUAL "${po_dir}") set(${varname} "${CMAKE_CURRENT_BINARY_DIR}/po") #SET_DIRECTORY_PROPERTIES(PROPERTIES CLEAN_NO_CUSTOM 1) else("${po_build_dir}" STREQUAL "${po_dir}") set(${varname} "${po_build_dir}") endif("${po_build_dir}" STREQUAL "${po_dir}") endmacro(KWWidgets_GET_PO_SAFE_BUILD_DIR) # --------------------------------------------------------------------------- # KWWidgets_GET_MO_FILENAME # Given a translation domain, a MO build directory, and a locale, return the # filename to the binary translation file (mo) for that locale and domain. # 'varname': name of the var the translation filename should be stored into # 'domain_name': translation domain name (i.e. name of application or library) # 'mo_build_dir': directory where the binary MO files should be saved to # 'locale': a locale (say, "fr") macro(KWWidgets_GET_MO_FILENAME varname domain_name mo_build_dir locale) set(${varname} "${mo_build_dir}/${locale}/LC_MESSAGES/${domain_name}.mo") endmacro(KWWidgets_GET_MO_FILENAME) # --------------------------------------------------------------------------- # KWWidgets_GET_ABSOLUTE_SOURCES # Given a list of sources, return the corresponding absolute paths # 'varname': name of the var the list of absolute paths should be stored into # 'sources': list of source files macro(KWWidgets_GET_ABSOLUTE_SOURCES varname sources) set(${varname}) foreach(file ${sources}) get_filename_component(abs_file ${file} ABSOLUTE) if(NOT EXISTS ${abs_file}) set(abs_file "${CMAKE_CURRENT_SOURCE_DIR}/${file}") endif(NOT EXISTS ${abs_file}) set(${varname} ${${varname}} ${abs_file}) endforeach(file) endmacro(KWWidgets_GET_ABSOLUTE_SOURCES) # --------------------------------------------------------------------------- # KWWidgets_GET_RELATIVE_SOURCES # Given a list of sources, return the corresponding relative paths to # a directory. # 'varname': name of the var the list of absolute paths should be stored into # 'dir': path to the dir we want relative path from # 'sources': list of *absolute* path to the source files macro(KWWidgets_GET_RELATIVE_SOURCES varname dir sources) get_filename_component(dir_abs ${dir} ABSOLUTE) set(${varname}) foreach(file ${sources}) file(RELATIVE_PATH rel_file "${dir}" "${file}") set(${varname} ${${varname}} ${rel_file}) endforeach(file) endmacro(KWWidgets_GET_RELATIVE_SOURCES) # --------------------------------------------------------------------------- # KWWidgets_CREATE_POT_TARGET # Given a domain name, the location of a PO directory, and a list of sources, # create a custom command/target to generate a translation template file (pot) # from the source files. # 'domain_name': translation domain name (i.e. name of application or library) # 'pot_build_dir': path in the build tree where the template should be stored # 'po_dir': path to the po directory where the original PO files are found # 'copyright_holder': optional copyright holder of the template file # 'msgid_bugs_address': report address for msgid bugs in the template file # 'sources': list of source files the template file will be generated from # 'target_basename': basename of the template file target # 'create_pot_target': if true, create pot target (on top of the command) # 'extra_gettext_keywords': semicolon-separated list of extra gettext keywords # 'extra_dgettext_keywords':semicolon-separated list of extra dgettext keywords macro(KWWidgets_CREATE_POT_TARGET domain_name pot_build_dir po_dir copyright_holder msgid_bugs_address sources target_basename create_pot_target extra_gettext_keywords extra_dgettext_keywords ) kwwidgets_get_pot_filename(pot_build_file "${domain_name}" "${pot_build_dir}") # We need the absolute path to each source file kwwidgets_get_absolute_sources(abs_sources "${sources}") # Put the list on sources to internationalize in an internal cache var # so that sub-projects can use it to create their own translation set(${domain_name}_INTERNATIONALIZED_SRCS_INTERNAL "${abs_sources}" CACHE INTERNAL "Sources that were internationalized for ${domain_name}") # Get relative sources to the PO files kwwidgets_get_relative_sources(rel_sources "${po_dir}" "${abs_sources}") # The extra keywords set(keywords) foreach(keyword ${extra_gettext_keywords}) set(keywords ${keywords} "--keyword=${keyword}" "--flag=${keyword}:1:pass-c-format") endforeach(keyword) foreach(keyword ${extra_dgettext_keywords}) set(keywords ${keywords} "--keyword=${keyword}:2" "--flag=${keyword}:2:pass-c-format") endforeach(keyword) # Define a symbol in each source file that can be used by dgettext set_source_files_properties(${sources} COMPILE_FLAGS "-DGETTEXT_DOMAIN=\\\"${domain_name}\\\"") file(MAKE_DIRECTORY ${pot_build_dir}) # Output the list of sources to a file. This fill will be read # by xgettext (so that we do not have to pass it as a huge command # line argument below) kwwidgets_get_po_safe_build_dir( safe_build_dir "${po_dir}" "${pot_build_dir}") set(files_from "${safe_build_dir}/${domain_name}_srcs.txt") string(REGEX REPLACE ";" "\n" contents "${rel_sources}") file(WRITE "${files_from}" "${contents}") #CONFIGURE_FILE(${KWWidgets_TEMPLATES_DIR}/KWWidgetsContents.in ${files_from}) # We need a dummy file that will just say: this POT target is up to date as # far as its dependencies are concerned. This will prevent the POT # target to be triggered again and again because the sources are older # than the POT, but the POT does not really need to be changed, etc. kwwidgets_get_pot_filename(pot_uptodate_file "${domain_name}" "${safe_build_dir}") set(pot_uptodate_file "${pot_uptodate_file}.upd") # Extract strings to translate to template file (pot) if(NOT "${GETTEXT_XGETTEXT_EXECUTABLE}" STREQUAL "") set(options "--foreign-user") set(keywords ${keyword} "--keyword=_" "--flag=_:1:pass-c-format" "--keyword=N_" "--flag=N_:1:pass-c-format" "--flag=autosprintf:1:c-format" "--keyword=kww_sgettext" "--flag=kww_sgettext:1:pass-c-format" "--keyword=kww_sdgettext:2" "--flag=kww_sdgettext:2:pass-c-format" "--keyword=k_" "--flag=k_:1:pass-c-format" "--keyword=ks_" "--flag=ks_:1:pass-c-format" "--keyword=s_" "--flag=s_:1:pass-c-format" "--flag=kww_printf:1:c-format" "--flag=kww_sprintf:2:c-format" "--flag=kww_fprintf:2:c-format") add_custom_command( OUTPUT "${pot_uptodate_file}" DEPENDS ${abs_sources} COMMAND ${CMAKE_COMMAND} ARGS -E chdir "${po_dir}" ${CMAKE_COMMAND} -DCMAKE_BACKWARDS_COMPATIBILITY:STRING=${CMAKE_BACKWARDS_COMPATIBILITY} -Dpot_build_file:STRING=${pot_build_file} -Dpot_uptodate_file:STRING=${pot_uptodate_file} -Dpo_dir:STRING=${po_dir} -Doptions:STRING="${options}" -Dkeywords:STRING="${keywords}" -Dcopyright_holder:STRING="${copyright_holder}" -Dmsgid_bugs_address:STRING="${msgid_bugs_address}" -Dfiles_from:STRING=${files_from} -DGETTEXT_XGETTEXT_EXECUTABLE:STRING=${GETTEXT_XGETTEXT_EXECUTABLE} -P "${KWWidgets_CMAKE_DIR}/KWWidgetsGettextExtract.cmake") if(create_pot_target) add_custom_target(${target_basename}_pot DEPENDS ${pot_build_file}) endif(create_pot_target) endif(NOT "${GETTEXT_XGETTEXT_EXECUTABLE}" STREQUAL "") endmacro(KWWidgets_CREATE_POT_TARGET) # --------------------------------------------------------------------------- # KWWidgets_CREATE_PO_TARGETS # Given a domain name, the location of a PO build directory, and a list of # locales create multiple custom commands/targets to initialize and/or merge # the translation files (po) for each locale. Each translation file # 'po_build_dir'/locale.po (say, 'po_build_dir'/fr.po) is either initialized # from or merged against the translation template file in the 'pot_build_dir' # directory for the same domain (say, 'pot_build_dir'/'domain_name'.pot). # The default encoding of each newly initialized PO file can be specified too. # 'domain_name': translation domain name (i.e. name of application or library) # 'pot_build_dir': path in the build tree where the template should be stored # 'po_dir': path to where the original PO file are found # 'po_build_dir': build path where up-to-date PO files should be stored # 'po_prefix': string that will be used to prefix each translation file. # 'locale_list': semicolon-separated list of locale to generate targets for. # 'default_po_encoding': default encoding for new initialized PO files. # 'target_basename': basename of the PO targets # 'create_po_target': create one unique target for all locale PO files # 'create_po_locale_targets': create one target per locale PO file macro(KWWidgets_CREATE_PO_TARGETS domain_name pot_build_dir po_dir po_build_dir po_prefix locale_list default_po_encoding target_basename create_po_target create_po_locale_targets ) kwwidgets_get_pot_filename(pot_build_file "${domain_name}" "${pot_build_dir}") file(MAKE_DIRECTORY ${po_build_dir}) # We need dummy files that will just say: this PO target is up to date as # far as its dependencies are concerned. This will prevent the PO # targets to be triggered again and again because the POT file is older # than the PO, but the PO does not really need to be changed, etc. kwwidgets_get_po_safe_build_dir(safe_build_dir "${po_dir}" "${po_build_dir}") kwwidgets_get_pot_filename(pot_uptodate_file "${domain_name}" "${safe_build_dir}") set(pot_uptodate_file "${pot_uptodate_file}.upd") set(po_build_files) foreach(locale ${locale_list}) kwwidgets_get_po_filename(po_file "${po_dir}" "${po_prefix}" "${locale}") kwwidgets_get_po_filename(po_build_file "${po_build_dir}" "${po_prefix}" "${locale}") kwwidgets_get_po_filename(po_uptodate_file "${safe_build_dir}" "${po_prefix}" "${locale}") set(po_uptodate_file "${po_uptodate_file}.upd") set(po_uptodate_files ${po_uptodate_files} ${po_uptodate_file}) set(depends "${pot_uptodate_file}") if(EXISTS "${po_file}") set(depends ${depends} "${po_file}") endif(EXISTS "${po_file}") add_custom_command( OUTPUT "${po_uptodate_file}" DEPENDS ${depends} COMMAND ${CMAKE_COMMAND} ARGS -DCMAKE_BACKWARDS_COMPATIBILITY:STRING=${CMAKE_BACKWARDS_COMPATIBILITY} -Dpo_file:STRING=${po_file} -Dpo_build_file:STRING=${po_build_file} -Dpo_uptodate_file:STRING=${po_uptodate_file} -Ddefault_po_encoding:STRING=${default_po_encoding} -Dpot_build_file:STRING=${pot_build_file} -Dlocale:STRING=${locale} -DGETTEXT_MSGINIT_EXECUTABLE:STRING=${GETTEXT_MSGINIT_EXECUTABLE} -DGETTEXT_MSGCONV_EXECUTABLE:STRING=${GETTEXT_MSGCONV_EXECUTABLE} -DGETTEXT_MSGMERGE_EXECUTABLE:STRING=${GETTEXT_MSGMERGE_EXECUTABLE} -DGETTEXT_MSGCAT_EXECUTABLE:STRING=${GETTEXT_MSGCAT_EXECUTABLE} -P "${KWWidgets_CMAKE_DIR}/KWWidgetsGettextInitOrMerge.cmake" ) if(create_po_locale_targets) add_custom_target( ${target_basename}_po_${locale} DEPENDS ${po_uptodate_file}) endif(create_po_locale_targets) endforeach(locale ${locale_list}) if(create_po_target) add_custom_target(${target_basename}_po DEPENDS ${po_uptodate_files}) endif(create_po_target) endmacro(KWWidgets_CREATE_PO_TARGETS) # --------------------------------------------------------------------------- # KWWidgets_CREATE_MO_TARGETS # Given a domain name, the location of a PO directory, a list of locales, the # location of a MO build and install dir, create multiple custom # commands/targets to compile the translation files (po) for each locale into # a binary translation files (mo). Each translation file is found in the # PO directory as 'locale.po' (say, fr.po) and compiled into a binary # translation file in 'mo_build_dir'/locale/LC_MESSAGES/'domain_name'.mo # (say, 'mo_build_dir'/fr/LC_MESSAGES/'domain_name'.mo). # 'domain_name': translation domain name (i.e. name of application or library) # 'po_dir': path to where the original PO file are found # 'po_build_dir': build path to where up-to-date PO files are stored # 'po_prefix': string that is used to prefix each translation file. # 'locale_list': semicolon-separated list of locale to generate targets for. # 'mo_build_dir': directory where the binary MO files should be saved to # 'mo_install_dir': directory where the binary MO files should be installed to # 'target_basename': basename of the MO targets # 'create_mo_target': create one unique target for all locale MO files # 'create_mo_locale_targets': create one target per locale MO file # 'add_mo_target_to_all': if true, add the unique MO target to the 'ALL' target macro(KWWidgets_CREATE_MO_TARGETS domain_name po_dir po_build_dir po_prefix locale_list mo_build_dir mo_install_dir target_basename create_mo_target create_mo_locale_targets add_mo_target_to_all ) set(mo_files) kwwidgets_get_po_safe_build_dir(safe_build_dir "${po_dir}" "${po_build_dir}") if(NOT "${GETTEXT_MSGFMT_EXECUTABLE}" STREQUAL "") foreach(locale ${locale_list}) kwwidgets_get_po_filename(po_build_file "${po_build_dir}" "${po_prefix}" "${locale}") kwwidgets_get_po_filename(po_uptodate_file "${safe_build_dir}" "${po_prefix}" "${locale}") set(po_uptodate_file "${po_uptodate_file}.upd") kwwidgets_get_mo_filename(mo_file "${domain_name}" "${mo_build_dir}" "${locale}") get_filename_component(mo_dir "${mo_file}" PATH) file(MAKE_DIRECTORY ${mo_dir}) set(mo_files ${mo_files} ${mo_file}) # --check-accelerators add_custom_command( OUTPUT "${mo_file}" DEPENDS "${po_uptodate_file}" COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} ARGS --output-file=${mo_file} --check-format "${po_build_file}" ) if(create_mo_locale_targets) add_custom_target(${target_basename}_mo_${locale} DEPENDS ${mo_file}) endif(create_mo_locale_targets) if(NOT "${mo_install_dir}" STREQUAL "") install_files( "${mo_install_dir}/${locale}/LC_MESSAGES" FILES ${mo_file}) endif(NOT "${mo_install_dir}" STREQUAL "") endforeach(locale ${locale_list}) if(create_mo_target OR add_mo_target_to_all) set(target_name "${target_basename}_mo") if(add_mo_target_to_all) add_custom_target(${target_name} ALL DEPENDS ${mo_files}) else(add_mo_target_to_all) add_custom_target(${target_name} DEPENDS ${mo_files}) endif(add_mo_target_to_all) endif(create_mo_target OR add_mo_target_to_all) endif(NOT "${GETTEXT_MSGFMT_EXECUTABLE}" STREQUAL "") endmacro(KWWidgets_CREATE_MO_TARGETS)