You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
705 lines
23 KiB
705 lines
23 KiB
# |
|
# cmake/Gettext.cmake |
|
# Copyright (C) 2012, 2013, Valama development team |
|
# |
|
# Valama is free software: you can redistribute it and/or modify it |
|
# under the terms of the GNU General Public License as published by the |
|
# Free Software Foundation, either version 3 of the License, or |
|
# (at your option) any later version. |
|
# |
|
# Valama is distributed in the hope that it will be useful, but |
|
# WITHOUT ANY WARRANTY; without even the implied warranty of |
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
|
# See the GNU General Public License for more details. |
|
# |
|
# You should have received a copy of the GNU General Public License along |
|
# with this program. If not, see <http://www.gnu.org/licenses/>. |
|
# |
|
## |
|
# |
|
# Heavily based on Jim Nelson's Gettext.cmake in Geary project: |
|
# https://github.com/ypcs/geary |
|
# |
|
## |
|
# Add find_package handler for gettext programs msgmerge, msgfmt, msgcat and |
|
# xgettext. |
|
## |
|
# Constant: |
|
# XGETTEXT_OPTIONS_DEFAULT: Provide common xgettext options. |
|
# XGETTEXT_VALA_OPTIONS_DEFAULT: Provide common xgettext options for Vala files. |
|
# XGETTEXT_GLADE_OPTIONS_DEFAULT: Provide common xgettext options for glade. |
|
## |
|
# The gettext_create_pot macro creates .pot files with xgettext from multiple |
|
# source files. |
|
# Provide target 'pot' to generate .pot file. |
|
# |
|
# Supported sections: |
|
# |
|
# PACKAGE (optional) |
|
# Gettext package name. Get exported to parent scope. |
|
# Default: ${PROJECT_NAME} |
|
# |
|
# VERSION (optional) |
|
# Gettext package version. Get exported to parent scope. |
|
# Default: ${${GETTEXT_PACKAGE_NAME}_VERSION} |
|
# (${GETTEXT_PACKAGE_NAME} is package name from option above) |
|
# |
|
# OPTIONS (optional) |
|
# Pass list of xgettext options (you can use XGETTEXT_OPTIONS_DEFAULT, |
|
# XGETTEXT_VALA_OPTIONS_DEFAULT and XGETTEXT_GLADE_OPTIONS_DEFAULT |
|
# constants). |
|
# Default: ${XGETTEXT_{,VALA,GLADE}_OPTIONS_DEFAULT} |
|
# |
|
# SRCFILES (optional/mandatory) |
|
# List of source files to extract gettext strings from. Globbing is |
|
# supported. |
|
# |
|
# GLADEFILES (optional/mandatory) |
|
# List of glade source files to extract gettext strings from. Globbing is |
|
# supported. |
|
# |
|
# DESKTOPFILES (optional/mandatory) |
|
# List of .desktop files to extract gettext strings from. Globbing is |
|
# supported. |
|
# intltool required. |
|
# |
|
# GSETTINGSFILES (optional/mandatory) |
|
# List of gsettings (.gschema.xml) files to extract gettext strings from. |
|
# Globbing is supported. |
|
# intltool required. |
|
# |
|
# Either SRCFILES or GLADEFILES or DESKTOPFILES or GSETTINGSFILES (or all) |
|
# have to be filled with some files. |
|
# |
|
## |
|
# The gettext_create_translations function generates .gmo files from .po files |
|
# and install them as .mo files. |
|
# Provide target 'translations' to build .gmo files. |
|
# |
|
# Supported sections: |
|
# |
|
# ALL (optional) |
|
# Make translations target a dependency of the 'all' target. (Build |
|
# translations with every build.) |
|
# |
|
# PODIR (optional) |
|
# Directory with .po files. |
|
# Default: ${CMAKE_CURRENT_SOURCE_DIR} |
|
# |
|
# LOCALEDIR (optional) |
|
# Base directory where to install translations. |
|
# Default: share/cmake |
|
# |
|
# LANGUAGES (optional) |
|
# List of language 'short names'. This is in generel the part before the .po. |
|
# With English locale this is e.g. 'en_GB' or 'en_US' etc. |
|
# |
|
# POFILES (optional) |
|
# List of .po files. |
|
# |
|
## |
|
# |
|
# The following call is a simple example (within project po directory): |
|
# |
|
# include(Gettext) |
|
# if(XGETTEXT_FOUND) |
|
# set(potfile "${CMAKE_CURRENT_SOURCE_DIR}/my_project.pot") |
|
# gettext_create_pot("${potfile}" |
|
# SRCFILES |
|
# "${PROJECT_SOURCE_DIR}/src/*.vala" |
|
# ) |
|
# gettext_create_translations("${potfile}" ALL) |
|
# endif() |
|
# |
|
## |
|
|
|
#### Changed GLOB to GLOB_RECURSE on line 246 |
|
|
|
find_program(GETTEXT_MSGMERGE_EXECUTABLE msgmerge) |
|
find_program(GETTEXT_MSGFMT_EXECUTABLE msgfmt) |
|
find_program(GETTEXT_MSGCAT_EXECUTABLE msgcat) |
|
find_program(XGETTEXT_EXECUTABLE xgettext) |
|
mark_as_advanced(GETTEXT_MSGMERGE_EXECUTABLE) |
|
mark_as_advanced(GETTEXT_MSGFMT_EXECUTABLE) |
|
mark_as_advanced(GETTEXT_MSGCAT_EXECUTABLE) |
|
mark_as_advanced(XGETTEXT_EXECUTABLE) |
|
|
|
if(XGETTEXT_EXECUTABLE) |
|
execute_process( |
|
COMMAND |
|
"${XGETTEXT_EXECUTABLE}" "--version" |
|
OUTPUT_VARIABLE |
|
gettext_version |
|
ERROR_QUIET |
|
OUTPUT_STRIP_TRAILING_WHITESPACE |
|
) |
|
if(gettext_version MATCHES "^xgettext \\(.*\\) [0-9]") |
|
string(REGEX REPLACE "^xgettext \\([^\\)]*\\) ([0-9\\.]+[^ \n]*).*" "\\1" GETTEXT_VERSION_STRING "${gettext_version}") |
|
endif() |
|
unset(gettext_version) |
|
endif() |
|
|
|
|
|
include(FindPackageHandleStandardArgs) |
|
find_package_handle_standard_args(Gettext |
|
REQUIRED_VARS |
|
XGETTEXT_EXECUTABLE |
|
GETTEXT_MSGMERGE_EXECUTABLE |
|
GETTEXT_MSGFMT_EXECUTABLE |
|
GETTEXT_MSGCAT_EXECUTABLE |
|
VERSION_VAR |
|
GETTEXT_VERSION_STRING |
|
) |
|
|
|
if(XGETTEXT_EXECUTABLE AND GETTEXT_MSGMERGE_EXECUTABLE AND GETTEXT_MSGFMT_EXECUTABLE AND GETTEXT_MSGCAT_EXECUTABLE) |
|
set(XGETTEXT_FOUND TRUE) |
|
# Export variable to use it as status info. |
|
set(TRANSLATION_BUILD TRUE PARENT_SCOPE) |
|
else() |
|
set(XGETTEXT_FOUND FALSE) |
|
set(TRANSLATION_BUILD FALSE PARENT_SCOPE) |
|
endif() |
|
|
|
|
|
set(XGETTEXT_OPTIONS_DEFAULT |
|
"-s" |
|
"--escape" |
|
"--add-comments=TRANSLATORS:" #TODO: Make this configurable. |
|
"--from-code=UTF-8" |
|
) |
|
set(XGETTEXT_VALA_OPTIONS_DEFAULT |
|
"--language" "C" |
|
"--keyword=_" |
|
"--keyword=N_" |
|
"--keyword=C_:1c,2" |
|
"--keyword=NC_:1c,2" |
|
) |
|
set(XGETTEXT_GLADE_OPTIONS_DEFAULT |
|
"--language" "Glade" |
|
"--omit-header" |
|
) |
|
set(XGETTEXT_INTLTOOL_OPTIONS |
|
"--language" "C" |
|
"--keyword=N_:1" |
|
) |
|
set(_INTLTOOL_DESKTOPFILES) |
|
|
|
|
|
if(XGETTEXT_FOUND) |
|
macro(gettext_create_pot potfile) |
|
cmake_parse_arguments(ARGS "" "PACKAGE;VERSION;WORKING_DIRECTORY" |
|
"OPTIONS;VALA_OPTIONS;GLADE_OPTIONS;SRCFILES;GLADEFILES;DESKTOPFILES;GSETTINGSFILES" ${ARGN}) |
|
|
|
if(ARGS_PACKAGE) |
|
set(package_name "${ARGS_PACKAGE}") |
|
elseif(GETTEXT_PACKAGE) |
|
set(package_name "${GETTEXT_PACKAGE}") |
|
else() |
|
set(package_name "${PROJECT_NAME}") |
|
endif() |
|
|
|
if(ARGS_VERSION) |
|
set(package_version "${ARGS_VERSION}") |
|
elseif(VERSION) |
|
set(package_version "${VERSION}") |
|
else() |
|
set(package_version "${${package_name}_VERSION}") |
|
endif() |
|
# Export for status information. |
|
set(GETTEXT_PACKAGE_NAME "${package_name}" PARENT_SCOPE) |
|
set(GETTEXT_PACKAGE_VERSION "${package_version}" PARENT_SCOPE) |
|
|
|
if(NOT ARGS_WORKING_DIRECTORY) |
|
set(ARGS_WORKING_DIRECTORY "../") |
|
endif() |
|
|
|
set(xgettext_options "--package-name" "${package_name}") |
|
if(package_version) |
|
list(APPEND xgettext_options "--package-version" "${package_version}") |
|
endif() |
|
if(ARGS_OPTIONS) |
|
list(APPEND xgettext_options ${ARGS_OPTIONS}) |
|
else() |
|
list(APPEND xgettext_options ${XGETTEXT_OPTIONS_DEFAULT}) |
|
endif() |
|
|
|
if(ARGS_XGETTEXT_VALA_OPTIONS_DEFAULT) |
|
set(xgettext_vala_options ${ARGS_XGETTEXT_VALA_OPTIONS_DEFAULT}) |
|
else() |
|
set(xgettext_vala_options ${XGETTEXT_VALA_OPTIONS_DEFAULT}) |
|
endif() |
|
if(ARGS_XGETTEXT_GLADE_OPTIONS_DEFAULT) |
|
set(xgettext_glade_options ${ARGS_XGETTEXT_GLADE_OPTIONS_DEFAULT}) |
|
else() |
|
set(xgettext_glade_options ${XGETTEXT_GLADE_OPTIONS_DEFAULT}) |
|
endif() |
|
|
|
if(ARGS_SRCFILES OR ARGS_GLADEFILES OR ARGS_DESKTOPFILES OR ARGS_GSETTINGSFILES) |
|
set(src_list) |
|
set(src_list_abs) |
|
foreach(globexpr ${ARGS_SRCFILES}) |
|
if(NOT IS_ABSOLUTE "${globexpr}") |
|
get_filename_component(absDir "${ARGS_WORKING_DIRECTORY}" ABSOLUTE) |
|
set(globexpr "${absDir}/${globexpr}") |
|
endif() |
|
set(tmpsrcfiles) |
|
file(GLOB_RECURSE tmpsrcfiles ${globexpr}) |
|
if (tmpsrcfiles) |
|
foreach(absFile ${tmpsrcfiles}) |
|
file(RELATIVE_PATH relFile "${CMAKE_CURRENT_SOURCE_DIR}" "${absFile}") |
|
list(APPEND src_list "${relFile}") |
|
list(APPEND src_list_abs "${absFile}") |
|
endforeach() |
|
else() |
|
file(RELATIVE_PATH relFile "${CMAKE_CURRENT_SOURCE_DIR}" "${globexpr}") |
|
list(APPEND src_list "${relFile}") |
|
list(APPEND src_list_abs "${globexpr}") |
|
endif() |
|
endforeach() |
|
|
|
set(glade_list) |
|
set(glade_list_abs) |
|
foreach(globexpr ${ARGS_GLADEFILES}) |
|
if(NOT IS_ABSOLUTE "${globexpr}") |
|
get_filename_component(absDir "${ARGS_WORKING_DIRECTORY}" ABSOLUTE) |
|
set(globexpr "${absDir}/${globexpr}") |
|
endif() |
|
set(tmpgladefiles) |
|
file(GLOB tmpgladefiles ${globexpr}) |
|
if (tmpgladefiles) |
|
foreach(absFile ${tmpgladefiles}) |
|
file(RELATIVE_PATH relFile "${CMAKE_CURRENT_SOURCE_DIR}" "${absFile}") |
|
list(APPEND glade_list "${relFile}") |
|
list(APPEND glade_list_abs "${absFile}") |
|
endforeach() |
|
else() |
|
file(RELATIVE_PATH relFile "${CMAKE_CURRENT_SOURCE_DIR}" "${globexpr}") |
|
list(APPEND glade_list "${relFile}") |
|
list(APPEND glade_list_abs "${globexpr}") |
|
endif() |
|
endforeach() |
|
|
|
if(ARGS_DESKTOPFILES OR ARGS_GSETTINGSFILES) |
|
find_package(Intltool REQUIRED) |
|
endif() |
|
set(desktop_list) |
|
set(desktop_list_abs) |
|
set(desktop_list_b) |
|
set(desktop_list_b_abs) |
|
set(desktop_list_h) |
|
set(desktop_list_h_abs) |
|
foreach(globexpr ${ARGS_DESKTOPFILES}) |
|
if(NOT IS_ABSOLUTE "${globexpr}") |
|
get_filename_component(absDir "${ARGS_WORKING_DIRECTORY}" ABSOLUTE) |
|
set(globexpr "${absDir}/${globexpr}") |
|
endif() |
|
set(tmpdesktopfiles) |
|
file(GLOB tmpdesktopfiles ${globexpr}) |
|
if (tmpdesktopfiles) |
|
foreach(absFile ${tmpdesktopfiles}) |
|
file(RELATIVE_PATH relFile "${CMAKE_CURRENT_SOURCE_DIR}" "${absFile}") |
|
list(APPEND desktop_list "${relFile}") |
|
list(APPEND desktop_list_abs "${absFile}") |
|
|
|
file(RELATIVE_PATH relFile_b "${PROJECT_SOURCE_DIR}" "${absFile}") |
|
list(APPEND desktop_list_b "${relFile_b}") |
|
get_filename_component(absFile_b "${PROJECT_BINARY_DIR}/${relFile_b}" ABSOLUTE) |
|
list(APPEND desktop_list_b_abs "${absFile_b}") |
|
file(RELATIVE_PATH relFile_h "${CMAKE_CURRENT_SOURCE_DIR}" "${absFile_b}.h") |
|
list(APPEND desktop_list_h "${relFile_h}") |
|
list(APPEND desktop_list_h_abs "${absFile_b}.h") |
|
add_custom_command( |
|
OUTPUT |
|
"${absFile_b}" |
|
COMMAND |
|
"${CMAKE_COMMAND}" -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/${relFile}" "${absFile_b}" |
|
DEPENDS |
|
"${absFile}" |
|
VERBATIM |
|
) |
|
endforeach() |
|
else() |
|
file(RELATIVE_PATH relFile "${CMAKE_CURRENT_SOURCE_DIR}" "${globexpr}") |
|
list(APPEND desktop_list "${relFile}") |
|
list(APPEND desktop_list_abs "${globexpr}") |
|
|
|
file(RELATIVE_PATH relFile_b "${PROJECT_SOURCE_DIR}" "${globexpr}") |
|
list(APPEND desktop_list_b "${relFile_b}") |
|
get_filename_component(absFile_b "${PROJECT_BINARY_DIR}/${relFile_b}" ABSOLUTE) |
|
list(APPEND desktop_list_b_abs "${absFile_b}") |
|
file(RELATIVE_PATH relFile_h "${CMAKE_CURRENT_SOURCE_DIR}" "${absFile_b}.h") |
|
list(APPEND desktop_list_h "${relFile_h}") |
|
list(APPEND desktop_list_h_abs "${absFile_b}.h") |
|
add_custom_command( |
|
OUTPUT |
|
"${absFile_b}" |
|
COMMAND |
|
"${CMAKE_COMMAND}" -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/${relFile}" "${absFile_b}" |
|
DEPENDS |
|
"${absFile}" |
|
VERBATIM |
|
) |
|
endif() |
|
endforeach() |
|
set(_INTLTOOL_DESKTOPFILES ${desktop_list_b}) |
|
|
|
set(gsettings_list) |
|
set(gsettings_list_abs) |
|
set(gsettings_list_b) |
|
set(gsettings_list_b_abs) |
|
set(gsettings_list_h) |
|
set(gsettings_list_h_abs) |
|
foreach(globexpr ${ARGS_GSETTINGSFILES}) |
|
if(NOT IS_ABSOLUTE "${globexpr}") |
|
get_filename_component(absDir "${ARGS_WORKING_DIRECTORY}" ABSOLUTE) |
|
set(globexpr "${absDir}/${globexpr}") |
|
endif() |
|
set(tmpgsettingsfiles) |
|
file(GLOB tmpgsettingsfiles ${globexpr}) |
|
if (tmpgsettingsfiles) |
|
foreach(absFile ${tmpgsettingsfiles}) |
|
file(RELATIVE_PATH relFile "${CMAKE_CURRENT_SOURCE_DIR}" "${absFile}") |
|
list(APPEND gsettings_list "${relFile}") |
|
list(APPEND gsettings_list_abs "${absFile}") |
|
|
|
file(RELATIVE_PATH relFile_b "${PROJECT_SOURCE_DIR}" "${absFile}") |
|
list(APPEND gsettings_list_b "${relFile_b}") |
|
get_filename_component(absFile_b "${PROJECT_BINARY_DIR}/${relFile_b}" ABSOLUTE) |
|
list(APPEND gsettings_list_b_abs "${absFile_b}") |
|
file(RELATIVE_PATH relFile_h "${CMAKE_CURRENT_SOURCE_DIR}" "${absFile_b}.h") |
|
list(APPEND gsettings_list_h "${relFile_h}") |
|
list(APPEND gsettings_list_h_abs "${absFile_b}.h") |
|
add_custom_command( |
|
OUTPUT |
|
"${absFile_b}" |
|
COMMAND |
|
"${CMAKE_COMMAND}" -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/${relFile}" "${absFile_b}" |
|
DEPENDS |
|
"${absFile}" |
|
VERBATIM |
|
) |
|
endforeach() |
|
else() |
|
file(RELATIVE_PATH relFile "${CMAKE_CURRENT_SOURCE_DIR}" "${globexpr}") |
|
list(APPEND gsettings_list "${relFile}") |
|
list(APPEND gsettings_list_abs "${globexpr}") |
|
|
|
file(RELATIVE_PATH relFile_b "${PROJECT_SOURCE_DIR}" "${globexpr}") |
|
list(APPEND gsettings_list_b "${relFile_b}") |
|
get_filename_component(absFile_b "${PROJECT_BINARY_DIR}/${relFile_b}" ABSOLUTE) |
|
list(APPEND gsettings_list_b_abs "${absFile_b}") |
|
file(RELATIVE_PATH relFile_h "${CMAKE_CURRENT_SOURCE_DIR}" "${absFile_b}.h") |
|
list(APPEND gsettings_list_h "${relFile_h}") |
|
list(APPEND gsettings_list_h_abs "${absFile_b}.h") |
|
add_custom_command( |
|
OUTPUT |
|
"${absFile_b}" |
|
COMMAND |
|
"${CMAKE_COMMAND}" -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/${relFile}" "${absFile_b}" |
|
VERBATIM |
|
) |
|
endif() |
|
endforeach() |
|
|
|
|
|
if(ARGS_SRCFILES) |
|
add_custom_command( |
|
OUTPUT |
|
"${CMAKE_CURRENT_BINARY_DIR}/_source.pot" |
|
COMMAND |
|
"${XGETTEXT_EXECUTABLE}" ${xgettext_options} ${xgettext_vala_options} "-o" "${CMAKE_CURRENT_BINARY_DIR}/_source.pot" ${src_list} |
|
COMMAND |
|
# Make sure file exists even if no translatable strings available. |
|
"${CMAKE_COMMAND}" -E touch "${CMAKE_CURRENT_BINARY_DIR}/_source.pot" |
|
DEPENDS |
|
${src_list_abs} |
|
WORKING_DIRECTORY |
|
"${CMAKE_CURRENT_SOURCE_DIR}" |
|
VERBATIM |
|
) |
|
else() |
|
add_custom_command( |
|
OUTPUT |
|
"${CMAKE_CURRENT_BINARY_DIR}/_source.pot" |
|
COMMAND |
|
"${CMAKE_COMMAND}" -E touch "${CMAKE_CURRENT_BINARY_DIR}/_source.pot" |
|
VERBATIM |
|
) |
|
endif() |
|
if(ARGS_GLADEFILES) |
|
add_custom_command( |
|
OUTPUT |
|
"${CMAKE_CURRENT_BINARY_DIR}/_glade.pot" |
|
COMMAND |
|
"${XGETTEXT_EXECUTABLE}" ${xgettext_options} ${xgettext_glade_options} "-o" "${CMAKE_CURRENT_BINARY_DIR}/_glade.pot" ${glade_list} |
|
COMMAND |
|
"${CMAKE_COMMAND}" -E touch "${CMAKE_CURRENT_BINARY_DIR}/_glade.pot" |
|
DEPENDS |
|
${glade_list_abs} |
|
WORKING_DIRECTORY |
|
"${CMAKE_CURRENT_SOURCE_DIR}" |
|
VERBATIM |
|
) |
|
else() |
|
add_custom_command( |
|
OUTPUT |
|
"${CMAKE_CURRENT_BINARY_DIR}/_glade.pot" |
|
COMMAND |
|
"${CMAKE_COMMAND}" -E touch "${CMAKE_CURRENT_BINARY_DIR}/_glade.pot" |
|
VERBATIM |
|
) |
|
endif() |
|
if(ARGS_DESKTOPFILES) |
|
add_custom_command( |
|
OUTPUT |
|
${desktop_list_h_abs} |
|
COMMAND |
|
"${INTLTOOL_EXTRACT_EXECUTABLE}" ${INTLTOOL_OPTIONS_DEFAULT} "--type" "gettext/ini" ${desktop_list_b} |
|
DEPENDS |
|
${desktop_list_b_abs} |
|
WORKING_DIRECTORY |
|
"${PROJECT_BINARY_DIR}" |
|
VERBATIM |
|
) |
|
add_custom_command( |
|
OUTPUT |
|
"${CMAKE_CURRENT_BINARY_DIR}/_desktop.pot" |
|
COMMAND |
|
"${XGETTEXT_EXECUTABLE}" ${xgettext_options} ${XGETTEXT_INTLTOOL_OPTIONS} "-o" "${CMAKE_CURRENT_BINARY_DIR}/_desktop.pot" ${desktop_list_h} |
|
COMMAND |
|
"${CMAKE_COMMAND}" -E touch "${CMAKE_CURRENT_BINARY_DIR}/_desktop.pot" |
|
DEPENDS |
|
${desktop_list_h_abs} |
|
WORKING_DIRECTORY |
|
"${CMAKE_CURRENT_SOURCE_DIR}" |
|
VERBATIM |
|
) |
|
else() |
|
add_custom_command( |
|
OUTPUT |
|
"${CMAKE_CURRENT_BINARY_DIR}/_desktop.pot" |
|
COMMAND |
|
"${CMAKE_COMMAND}" -E touch "${CMAKE_CURRENT_BINARY_DIR}/_desktop.pot" |
|
VERBATIM |
|
) |
|
endif() |
|
if(ARGS_GSETTINGSFILES) |
|
add_custom_command( |
|
OUTPUT |
|
${gsettings_list_h_abs} |
|
COMMAND |
|
"${INTLTOOL_EXTRACT_EXECUTABLE}" ${INTLTOOL_OPTIONS_DEFAULT} "--type" "gettext/gsettings" ${gsettings_list_b} |
|
DEPENDS |
|
${gsettings_list_b_abs} |
|
WORKING_DIRECTORY |
|
"${PROJECT_BINARY_DIR}" |
|
VERBATIM |
|
) |
|
add_custom_command( |
|
OUTPUT |
|
"${CMAKE_CURRENT_BINARY_DIR}/_gsettings.pot" |
|
COMMAND |
|
"${XGETTEXT_EXECUTABLE}" ${xgettext_options} ${XGETTEXT_INTLTOOL_OPTIONS} "-o" "${CMAKE_CURRENT_BINARY_DIR}/_gsettings.pot" ${gsettings_list_h} |
|
COMMAND |
|
"${CMAKE_COMMAND}" -E touch "${CMAKE_CURRENT_BINARY_DIR}/_gsettings.pot" |
|
DEPENDS |
|
${gsettings_list_h_abs} |
|
WORKING_DIRECTORY |
|
"${CMAKE_CURRENT_SOURCE_DIR}" |
|
VERBATIM |
|
) |
|
else() |
|
add_custom_command( |
|
OUTPUT |
|
"${CMAKE_CURRENT_BINARY_DIR}/_gsettings.pot" |
|
COMMAND |
|
"${CMAKE_COMMAND}" -E touch "${CMAKE_CURRENT_BINARY_DIR}/_gsettings.pot" |
|
VERBATIM |
|
) |
|
endif() |
|
|
|
add_custom_target(pot |
|
COMMAND |
|
"${GETTEXT_MSGCAT_EXECUTABLE}" "-o" "${potfile}" "--use-first" "${CMAKE_CURRENT_BINARY_DIR}/_source.pot" "${CMAKE_CURRENT_BINARY_DIR}/_glade.pot" "${CMAKE_CURRENT_BINARY_DIR}/_desktop.pot" "${CMAKE_CURRENT_BINARY_DIR}/_gsettings.pot" |
|
DEPENDS |
|
"${CMAKE_CURRENT_BINARY_DIR}/_source.pot" |
|
"${CMAKE_CURRENT_BINARY_DIR}/_glade.pot" |
|
"${CMAKE_CURRENT_BINARY_DIR}/_desktop.pot" |
|
"${CMAKE_CURRENT_BINARY_DIR}/_gsettings.pot" |
|
WORKING_DIRECTORY |
|
"${CMAKE_CURRENT_SOURCE_DIR}" |
|
COMMENT |
|
"Extract translatable messages to ${potfile}" |
|
VERBATIM |
|
) |
|
endif() |
|
endmacro() |
|
|
|
|
|
function(gettext_create_translations potfile) |
|
cmake_parse_arguments(ARGS "ALL;NOUPDATE;DESKTOPFILES_INSTALL" |
|
"PODIR;LOCALEDIR" "LANGUAGES;POFILES" ${ARGN}) |
|
|
|
get_filename_component(_potBasename "${potfile}" NAME_WE) |
|
get_filename_component(_absPotFile "${potfile}" ABSOLUTE) |
|
|
|
if(ARGS_ALL) |
|
set(make_all "ALL") |
|
else() |
|
set(make_all) |
|
endif() |
|
|
|
if(ARGS_LOCALEDIR) |
|
set(_localedir "${ARGS_LOCALEDIR}") |
|
elseif(localedir) |
|
set(_localedir "${localedir}") |
|
else() |
|
set(_localedir "share/locale") |
|
endif() |
|
|
|
set(langs) |
|
list(APPEND langs ${ARGS_LANGUAGES}) |
|
|
|
foreach(globexpr ${ARGS_POFILES}) |
|
set(tmppofiles) |
|
file(GLOB tmppofiles ${globexpr}) |
|
if(tmppofiles) |
|
foreach(tmppofile ${tmppofiles}) |
|
string(REGEX REPLACE ".*/([a-zA-Z_]+)(\\.po)?$" "\\1" lang "${tmppofile}") |
|
list(APPEND langs "${lang}") |
|
endforeach() |
|
else() |
|
string(REGEX REPLACE ".*/([a-zA-Z_]+)(\\.po)?$" "\\1" lang "${globexpr}") |
|
list(APPEND langs "${lang}") |
|
endif() |
|
endforeach() |
|
|
|
if(NOT langs AND NOT ARGS_PODIR) |
|
set(ARGS_PODIR "${CMAKE_CURRENT_SOURCE_DIR}") |
|
endif() |
|
if(ARGS_PODIR) |
|
file(GLOB pofiles "${ARGS_PODIR}/*.po") |
|
foreach(pofile ${pofiles}) |
|
string(REGEX REPLACE ".*/([a-zA-Z_]+)\\.po$" "\\1" lang "${pofile}") |
|
list(APPEND langs "${lang}") |
|
endforeach() |
|
endif() |
|
|
|
if(langs) |
|
list(REMOVE_DUPLICATES langs) |
|
endif() |
|
|
|
|
|
set(_gmoFile) |
|
set(_gmoFiles) |
|
foreach (lang ${langs}) |
|
get_filename_component(_absFile "${lang}.po" ABSOLUTE) |
|
set(_gmoFile "${CMAKE_CURRENT_BINARY_DIR}/${lang}.gmo") |
|
|
|
if(ARGS_NOUPDATE) |
|
set(_absFile_new "${CMAKE_CURRENT_BINARY_DIR}/${lang}.po") |
|
add_custom_command( |
|
OUTPUT |
|
"${_absFile_new}" |
|
COMMAND |
|
"${CMAKE_COMMAND}" -E copy "${_absFile}" "${_absFile_new}" |
|
DEPENDS |
|
"${_absPotFile}" |
|
"${_absFile}" |
|
VERBATIM |
|
) |
|
set(_absFile "${_absFile_new}") |
|
endif() |
|
add_custom_command( |
|
OUTPUT |
|
"${_gmoFile}" |
|
COMMAND |
|
"${GETTEXT_MSGMERGE_EXECUTABLE}" "--quiet" "--update" "--backup=none" "-s" "${_absFile}" "${_absPotFile}" |
|
COMMAND |
|
"${GETTEXT_MSGFMT_EXECUTABLE}" "-o" "${_gmoFile}" "${_absFile}" |
|
DEPENDS |
|
"${_absPotFile}" |
|
"${_absFile}" |
|
WORKING_DIRECTORY |
|
"${CMAKE_CURRENT_BINARY_DIR}" |
|
VERBATIM |
|
) |
|
|
|
install( |
|
FILES |
|
"${_gmoFile}" |
|
DESTINATION |
|
"${_localedir}/${lang}/LC_MESSAGES" |
|
RENAME |
|
"${_potBasename}.mo" |
|
) |
|
list(APPEND _gmoFiles "${_gmoFile}") |
|
endforeach() |
|
|
|
set(desktopfiles) |
|
if(langs AND _INTLTOOL_DESKTOPFILES) |
|
file(RELATIVE_PATH cursrcdir_rel "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}") |
|
if(cursrcdir_rel STREQUAL "") |
|
set(cursrcdir_rel ".") |
|
endif() |
|
foreach(desktopfiletmp ${_INTLTOOL_DESKTOPFILES}) |
|
string(REGEX REPLACE "(\\.desktop).*$" "\\1" desktopfile "${desktopfiletmp}") |
|
set(desktopfile_abs "${PROJECT_BINARY_DIR}/${desktopfile}") |
|
list(APPEND desktopfiles "${desktopfile_abs}") |
|
file(RELATIVE_PATH desktopfile_rel "${CMAKE_CURRENT_BINARY_DIR}" "${desktopfile_abs}") |
|
file(RELATIVE_PATH desktopfiletmp_rel "${CMAKE_CURRENT_BINARY_DIR}" "${PROJECT_BINARY_DIR}/${desktopfiletmp}") |
|
add_custom_command( |
|
OUTPUT |
|
"${desktopfile_abs}" |
|
COMMAND |
|
"${INTLTOOL_MERGE_EXECUTABLE}" ${INTLTOOL_OPTIONS_DEFAULT} "--desktop-style" "${cursrcdir_rel}" "${desktopfiletmp_rel}" "${desktopfile_rel}" |
|
DEPENDS |
|
"${PROJECT_BINARY_DIR}/${desktopfiletmp}" |
|
VERBATIM |
|
) |
|
if(ARGS_DESKTOPFILES_INSTALL AND NOT cursrcdir_rel STREQUAL ".") |
|
add_custom_command( |
|
OUTPUT |
|
"${CMAKE_SOURCE_DIR}/${desktopfile}" |
|
"desktopinstall.stamp" |
|
COMMAND |
|
"${CMAKE_COMMAND}" -E copy_if_different "${desktopfile_abs}" "${CMAKE_SOURCE_DIR}/${desktopfile}" |
|
COMMAND |
|
"${CMAKE_COMMAND}" -E touch "desktopinstall.stamp" |
|
DEPENDS |
|
"${desktopfile_abs}" |
|
VERBATIM |
|
) |
|
else() |
|
add_custom_command( |
|
OUTPUT |
|
"desktopinstall.stamp" |
|
COMMAND |
|
"${CMAKE_COMMAND}" -E touch "desktopinstall.stamp" |
|
DEPENDS |
|
"${desktopfile_abs}" |
|
VERBATIM |
|
) |
|
endif() |
|
list(APPEND desktopfiles "desktopinstall.stamp") |
|
install( |
|
FILES |
|
"${desktopfile_abs}" |
|
DESTINATION |
|
"share/applications" |
|
) |
|
endforeach() |
|
endif() |
|
|
|
add_custom_target(translations |
|
"${make_all}" |
|
DEPENDS |
|
${_gmoFiles} |
|
${desktopfiles} |
|
COMMENT |
|
"Build translations." |
|
) |
|
endfunction() |
|
endif() |
|
|
|
# vim: set ai ts=2 sts=2 et sw=2
|
|
|