gnucash/po/CMakeLists.txt
Geert Janssens 99ebeb6b5d gnucash.pot target improvements
- add simple target called 'pot' so translators can run 'make pot'
- make gnucash.pot depend on all files with translatable strings. So whenever
  one of these files is changed the potfile will automatically be regenerated
  (if the current target depends on it, like 'pot' or 'dist')

Note the default target (make without anything) does not depend on gnucash.pot
so the potfile will not automatically be (re)generated when building that target.
2018-01-29 21:51:38 +01:00

191 lines
6.7 KiB
CMake

ADD_SUBDIRECTORY(glossary)
# Set of available languages.
SET (TP_LINGUAS az ca cs da eu fa ja nl rw sk sr sv tr uk zh_CN)
# already marked as external at TP:
SET (GC_LINGUAS ar bg de el en_GB es fi fr gu he hi hu it kn ko lt lv mr nb ne pl pt pt_BR ro ru ta te ur vi zh_TW)
# not marked or no TP team:
SET (NEW_LINGUAS as brx doi es_NI kok kok@latin ks mai mni mni@bengali)
SET (ALL_LINGUAS ${TP_LINGUAS} ${GC_LINGUAS} ${NEW_LINGUAS})
SET (CATALOGS "")
SET (BUILD_CATALOGS "")
SET(CMAKE_COMMAND_TMP "")
IF (${CMAKE_VERSION} VERSION_GREATER 3.1)
SET(CMAKE_COMMAND_TMP ${CMAKE_COMMAND} -E env)
ENDIF()
SET(po_SOURCES "")
FOREACH(lingua ${ALL_LINGUAS})
LIST(APPEND po_SOURCES ${lingua}.po)
ENDFOREACH()
SET_LOCAL_DIST(po_DIST_local ${po_SOURCES} CMakeLists.txt ChangeLog Makevars
POTFILES.ignore POTFILES.in POTFILES.skip README check-po.cmake gnucash-pot.cmake)
SET(po_DIST ${po_DIST_local} ${po_glossary_DIST} PARENT_SCOPE)
FOREACH(lingua ${ALL_LINGUAS})
SET(_OUTPUT_FILE ${lingua}.mo)
LIST(APPEND CATALOGS ${_OUTPUT_FILE})
ADD_CUSTOM_COMMAND(
OUTPUT ${_OUTPUT_FILE}
COMMAND ${CMAKE_COMMAND_TMP} ${MSGFMT} -o ${_OUTPUT_FILE} ${CMAKE_CURRENT_SOURCE_DIR}/${lingua}.po
)
SET(_BUILD_FILE_DIR ${DATADIR_BUILD}/locale/${lingua}/LC_MESSAGES)
MAKE_DIRECTORY(${_BUILD_FILE_DIR})
SET(_BUILD_FILE ${_BUILD_FILE_DIR}/gnucash.mo)
LIST(APPEND BUILD_CATALOGS ${_BUILD_FILE})
ADD_CUSTOM_COMMAND(
OUTPUT ${_BUILD_FILE}
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/${lingua}.mo ${_BUILD_FILE}
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${_OUTPUT_FILE}
#APPEND
)
ENDFOREACH(lingua)
ADD_CUSTOM_TARGET(po-gmo ALL DEPENDS ${CATALOGS})
ADD_CUSTOM_TARGET(po-gmo-build ALL DEPENDS ${BUILD_CATALOGS})
FOREACH(lingua ${ALL_LINGUAS})
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${lingua}.mo RENAME gnucash.mo DESTINATION ${CMAKE_INSTALL_DATADIR}/locale/${lingua}/LC_MESSAGES)
ENDFOREACH(lingua)
FUNCTION(READ_FILE_REMOVING_COMMENTS OUTPUT PATH)
SET(RESULT "")
FILE(STRINGS "${PATH}" LINES_IN)
FOREACH(line ${LINES_IN})
STRING(REGEX REPLACE "#.*" "" line2 ${line})
LIST(APPEND RESULT ${line2})
ENDFOREACH()
SET(${OUTPUT} ${RESULT} PARENT_SCOPE)
ENDFUNCTION()
FUNCTION(MAKE_GNUCASH_POTFILES)
SET(IGNORE_PATTERNS "gw-" "test" "experimental" "python-bindings" "swig-.*\\.c")
# Create a list of candidate translation files
FILE(GLOB_RECURSE FILES_IN RELATIVE ${CMAKE_SOURCE_DIR}
${CMAKE_SOURCE_DIR}/*.c ${CMAKE_SOURCE_DIR}/*.cpp ${CMAKE_SOURCE_DIR}/*.glade ${CMAKE_SOURCE_DIR}/*.desktop.in
${CMAKE_SOURCE_DIR}/*.keys.in ${CMAKE_SOURCE_DIR}/*.gschema.xml.in.in ${CMAKE_SOURCE_DIR}/*.scm)
# Only consider files in the common, libgnucash, and gnucash/ directories. Also check against list of ignore patterns
SET(FILES "")
FOREACH(path ${FILES_IN})
STRING(REGEX MATCH "^(bindings/|common/|borrowed/|libgnucash/|gnucash/)" IS_SRC ${path})
IF (IS_SRC)
SET(IS_IGNORED FALSE)
FOREACH(pattern ${IGNORE_PATTERNS})
STRING(REGEX MATCH ${pattern} YES_IGNORE ${path})
IF (YES_IGNORE)
SET(IS_IGNORED TRUE)
ENDIF()
ENDFOREACH(pattern)
IF (NOT IS_IGNORED)
LIST(APPEND FILES ${path})
ENDIF(NOT IS_IGNORED)
ENDIF(IS_SRC)
ENDFOREACH(path)
# Read in list of paths to skip from POTFILES.{skip,ignore}
READ_FILE_REMOVING_COMMENTS(SKIP_LINES POTFILES.skip)
READ_FILE_REMOVING_COMMENTS(IGNORE_LINES POTFILES.ignore)
# Remove the paths that are skipped or ignored
FOREACH(path ${SKIP_LINES} ${IGNORE_LINES})
list(REMOVE_ITEM FILES ${path})
ENDFOREACH()
# CMake sorting is different from UNIX sorting. Use perl to
# sort POTFILES.in universally. This may no longer be needed
# now we have dropped autotools support.
STRING(REPLACE ";" "\n" SORT_IN "${FILES}")
SET(SORT_IN "${SORT_IN}\n")
FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/POTFILES.in.in "${SORT_IN}")
EXECUTE_PROCESS(COMMAND "${PERL_EXECUTABLE}" "${CMAKE_SOURCE_DIR}/util/elegant-sort.pl"
INPUT_FILE ${CMAKE_CURRENT_BINARY_DIR}/POTFILES.in.in
OUTPUT_VARIABLE POTFILES_IN
)
STRING(REPLACE "\n" ";" POTFILES "${POTFILES_IN}")
# These are manually added, because they're not picked up by the generation script
list(APPEND POTFILES
"gnucash/gnome/gnucash.appdata.xml.in"
"gnucash/gnome/gnucash.desktop.in.in"
"libgnucash/engine/qofbookslots.h"
"doc/tip_of_the_day.list.in")
# Write out the final list.
# intltool-update insists that this file be in the source directory. :-(
SET(POTFILES_IN_PATH ${CMAKE_CURRENT_BINARY_DIR}/POTFILES.in)
FILE(WRITE ${POTFILES_IN_PATH} "# This is a list of files which contain translatable strings.
# This file was autogenerated by cmake.
")
set(POTFILE_DEPS "")
FOREACH(path ${POTFILES})
list(APPEND POTFILE_DEPS ${CMAKE_SOURCE_DIR}/${path})
STRING(REGEX MATCH gschema.xml.in.in IS_GSCHEMA ${path})
IF(IS_GSCHEMA)
# Force parse type for gsettings files
SET(path "[type: gettext/gsettings]${path}")
ENDIF()
FILE(APPEND ${POTFILES_IN_PATH} "${path}\n")
ENDFOREACH()
CONFIGURE_FILE(${POTFILES_IN_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/POTFILES.in NEWLINE_STYLE LF)
set(gnucash_pot_depends ${POTFILE_DEPS} CACHE INTERNAL "List of files with translatable strings. If any of these change, gnucash.pot should be regenerated")
ENDFUNCTION()
find_program(INTLTOOL_UPDATE NAMES intltool-update)
IF (${INTLTOOL_UPDATE} STREQUAL "INTLTOOL_UPDATE-NOTFOUND")
MESSAGE(FATAL_ERROR "Can't find the 'intltool-update' program.")
ENDIF ()
IF(BUILDING_FROM_VCS)
MAKE_GNUCASH_POTFILES()
find_program(INTLTOOL_EXTRACT NAMES intltool-extract)
find_program(XGETTEXT xgettext)
IF (${INTLTOOL_EXTRACT} STREQUAL "INTLTOOL_EXTRACT-NOTFOUND")
MESSAGE(FATAL_ERROR "Can't find the 'intltool-extract' program.")
ENDIF ()
IF (${XGETTEXT} STREQUAL "XGETTEXT-NOTFOUND")
MESSAGE(FATAL_ERROR "Can't find the 'xgettext' program.")
ENDIF ()
add_custom_command(OUTPUT gnucash.pot
COMMAND ${CMAKE_COMMAND}
-D INTLTOOL_EXTRACT=${INTLTOOL_EXTRACT}
-D INTLTOOL_UPDATE=${INTLTOOL_UPDATE}
-D PO_SRC_DIR=${CMAKE_CURRENT_SOURCE_DIR}
-D PO_BIN_DIR=${CMAKE_CURRENT_BINARY_DIR}
-D PACKAGE=${PACKAGE}
-D PERL=${PERL_EXECUTABLE}
-D XGETTEXT=${XGETTEXT}
-P ${CMAKE_CURRENT_SOURCE_DIR}/gnucash-pot.cmake
DEPENDS ${gnucash_pot_depends}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)
add_custom_target (pot DEPENDS gnucash.pot)
ENDIF()
dist_add_generated(gnucash.pot)
ADD_CUSTOM_TARGET(check-po
COMMAND ${CMAKE_COMMAND}
-D INTLTOOL_UPDATE=${INTLTOOL_UPDATE}
-D PO_DIR=${CMAKE_CURRENT_SOURCE_DIR}
-P check-po.cmake
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)