diff cmake/MolkoBuildTranslations.cmake @ 241:76afe639fd72

misc: add support for NLS, closes #22510 @4h While here cleanup the path functions in sys.c/sys.h
author David Demelier <markand@malikania.fr>
date Sat, 28 Nov 2020 18:00:05 +0100
parents
children 4c24604efcab
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cmake/MolkoBuildTranslations.cmake	Sat Nov 28 18:00:05 2020 +0100
@@ -0,0 +1,113 @@
+#
+# MolkoBuildTranslations.cmake -- CMake build system for molko
+#
+# Copyright (c) 2020 David Demelier <markand@malikania.fr>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+
+if (MOLKO_WITH_NLS)
+	find_program(XGETTEXT_EXE xgettext)
+	find_program(MSGMERGE_EXE msgmerge)
+	find_program(MSGFMT_EXE msgfmt)
+endif ()
+
+if (MOLKO_WITH_NLS AND XGETTEXT_EXE AND MSGMERGE_EXE)
+	macro(molko_build_translations)
+		set(options)
+		set(oneValueArgs TARGET OUTPUTS)
+		set(multiValueArgs SOURCES TRANSLATIONS)
+
+		cmake_parse_arguments(NLS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
+
+		if (NOT NLS_OUTPUTS)
+			message(FATAL_ERROR "Missing OUTPUTS argument")
+		endif ()
+		if (NOT NLS_TARGET)
+			message(FATAL_ERROR "Missing TARGET argument")
+		endif ()
+		if (NOT NLS_SOURCES)
+			message(FATAL_ERROR "Missing SOURCES argument")
+		endif ()
+
+		# Remove non C files.
+		list(FILTER NLS_SOURCES INCLUDE REGEX "\\.[ch$]")
+		set(pot ${CMAKE_CURRENT_SOURCE_DIR}/nls/${NLS_TARGET}.pot)
+
+		# Generate .pot file.
+		add_custom_target(
+			${NLS_TARGET}-pot
+			ALL
+			VERBATIM
+			COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_SOURCE_DIR}/nls
+			COMMAND ${XGETTEXT_EXE} -cj -k_ -kN_ -LC -s -o ${pot} ${NLS_SOURCES}
+			COMMENT "Generating reference translation ${pot}"
+		)
+		set_target_properties(${NLS_TARGET}-pot PROPERTIES FOLDER translations)
+
+		# For every translation create a msgmerge target and output file.
+		set(outputs)
+
+		foreach (t ${NLS_TRANSLATIONS})
+			set(po ${CMAKE_CURRENT_SOURCE_DIR}/nls/${t}.po)
+			set(mo ${CMAKE_CURRENT_BINARY_DIR}/${t}.mo)
+
+			if (NOT EXISTS ${po})
+				message(WARNING "Missing translation ${po}")
+			endif ()
+
+			add_custom_target(
+				${NLS_TARGET}-po-${t}
+				VERBATIM
+				DEPENDS ${NLS_TARGET}-pot
+				COMMAND ${MSGMERGE_EXE} --backup=off -U ${po} ${pot}
+				COMMENT "Merging translation in ${po}"
+			)
+			set_target_properties(${NLS_TARGET}-po-${t} PROPERTIES FOLDER translations)
+
+			list(APPEND po-targets ${NLS_TARGET}-po-${t})
+
+			# Finally generate a .mo output from po file.
+			add_custom_command(
+				OUTPUT ${mo}
+				VERBATIM
+				COMMAND ${MSGFMT_EXE} -o ${mo} ${po}
+				DEPENDS ${po}
+				COMMENT "Generating translation binary ${mo}"
+			)
+
+			list(APPEND outputs ${mo})
+
+			# TODO: naming should be changed maybe.
+			install(
+				FILES ${mo}
+				DESTINATION ${CMAKE_INSTALL_LOCALEDIR}/${t}/LC_MESSAGES
+				RENAME mlk-${NLS_TARGET}.mo
+			)
+		endforeach ()
+
+		set(${NLS_OUTPUTS} ${outputs})
+		source_group("mo" FILES ${outputs})
+
+		add_custom_target(
+			${NLS_TARGET}-po
+			DEPENDS ${po-targets}
+			COMMENT "Merging all po files"
+		)
+
+		set_target_properties(${NLS_TARGET}-po PROPERTIES FOLDER translations)
+	endmacro()
+else ()
+	function(molko_build_translations)
+	endfunction()
+endif ()