Add new experimental version of the pot-update.

This commit is contained in:
Mark de Wever 2009-03-27 20:05:52 +00:00
parent c5d68984ef
commit a77c757235
2 changed files with 344 additions and 0 deletions

View file

@ -0,0 +1,77 @@
# Update the source file dependencies of the pot file.
#
# This globs all files cpp in the src directory and looks for the text domain
# definition in that file and outputs these dependencies in POTFILES.in.
# Remove the old input file.
# Dummy target with a non existing (and not created file) is always executed.
add_custom_command(
OUTPUT ${PROJECT_SOURCE_DIR}/po/${DOMAIN}/POTFILES.in.dummy
# remove the old file.
COMMAND ${CMAKE_COMMAND}
-E remove ${PROJECT_SOURCE_DIR}/po/${DOMAIN}/POTFILES.in
COMMENT "pot-update [${DOMAIN}]: Removed existing POTFILES.in."
)
# Recreate the input file.
if(DOMAIN STREQUAL ${DEFAULT_DOMAIN})
# For the default text domain.
add_custom_command(
OUTPUT ${PROJECT_SOURCE_DIR}/po/${DOMAIN}/POTFILES.in
# Create an empty new one, to be sure it will exist.
COMMAND ${CMAKE_COMMAND}
-E touch ${PROJECT_SOURCE_DIR}/po/${DOMAIN}/POTFILES.in
# Find all cpp files which are not in a .svn directory.
COMMAND find src -name .svn -prune -o -name '*cpp' -print |
sort |
while read file\; do
# If the file doesn't contain a GETTEXT_DOMAIN
# definition it should be added to the default domain.
if ! grep \"^\#define *GETTEXT_DOMAIN\"
$$file &>/dev/null\; then
echo $$file >>
${PROJECT_SOURCE_DIR}/po/${DOMAIN}/POTFILES.in \;
fi
done
DEPENDS ${PROJECT_SOURCE_DIR}/po/${DOMAIN}/POTFILES.in.dummy
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
COMMENT
"pot-update [${DOMAIN}]: Created POTFILES.in for default domain."
)
else(DOMAIN STREQUAL ${DEFAULT_DOMAIN})
# For the other text domains.
add_custom_command(
OUTPUT ${PROJECT_SOURCE_DIR}/po/${DOMAIN}/POTFILES.in
# Create an empty new one, to be sure it will exist.
COMMAND ${CMAKE_COMMAND}
-E touch ${PROJECT_SOURCE_DIR}/po/${DOMAIN}/POTFILES.in
# Find all cpp files which are not in a .svn directory.
COMMAND find src -name .svn -prune -o -name '*cpp' -print |
sort |
while read file\; do
# If the file contains a GETTEXT_DOMAIN definition for
# the current domain add it to the domain.
if grep \"^\#define *GETTEXT_DOMAIN *\\\"${DOMAIN}\\\"\"
$$file &>/dev/null\; then
echo $$file >>
${PROJECT_SOURCE_DIR}/po/${DOMAIN}/POTFILES.in \;
fi
done
DEPENDS ${PROJECT_SOURCE_DIR}/po/${DOMAIN}/POTFILES.in.dummy
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
COMMENT "pot-update [${DOMAIN}]: Created POTFILES.in."
)
endif(DOMAIN STREQUAL ${DEFAULT_DOMAIN})

View file

@ -38,3 +38,270 @@ set(TRANSLATION_DIRS
foreach(DIR ${TRANSLATION_DIRS})
add_subdirectory(${DIR})
endforeach(DIR ${TRANSLATION_DIRS})
############ Settings. ###########
# Available languages.
set(LANGUAGES
af
ar
bg
ca
ca_ES@valencia
cs
da
de
el
en_GB
es
eo
et
eu
fi
fr
fur_IT
gl
he
hr
hu
id
is
it
ja
ko
la
lt
lv
mk
mr
nl
nb_NO
pl
pt
pt_BR
racv
ro
ru
sk
sl
sr
sr@latin
sv
tl
tr
zh_CN
zh_TW
)
# The normal domains use cpp and cfg files.
set(NORMAL_DOMAINS
wesnoth
wesnoth-anl
wesnoth-aoi
wesnoth-did
wesnoth-editor
wesnoth-ei
wesnoth-httt
wesnoth-l
wesnoth-lib
wesnoth-low
wesnoth-multiplayer
wesnoth-nr
wesnoth-sof
wesnoth-sotbe
wesnoth-tb
wesnoth-test
wesnoth-thot
wesnoth-trow
wesnoth-tsg
wesnoth-tutorial
wesnoth-units
wesnoth-utbs
)
# All available domains.
set(DOMAINS
${NORMAL_DOMAINS}
wesnoth-manpages
wesnoth-manual
)
# If a source file has not GETTEXT_DOMAIN it belongs to this domain.
set(DEFAULT_DOMAIN wesnoth)
############ Validation. ###########
find_program(GETTEXT_MSGINIT_EXECUTABLE msginit)
if(NOT GETTEXT_MSGINIT_EXECUTABLE)
message(FATAL_ERROR "msginit not found")
endif(NOT GETTEXT_MSGINIT_EXECUTABLE)
find_program(GETTEXT_XGETTEXT_EXECUTABLE xgettext)
if(NOT GETTEXT_XGETTEXT_EXECUTABLE )
message(FATAL_ERROR "xgettext not found")
endif(NOT GETTEXT_XGETTEXT_EXECUTABLE )
find_program(GETTEXT_MSGCAT_EXECUTABLE msgcat)
if(NOT GETTEXT_MSGCAT_EXECUTABLE )
message(FATAL_ERROR "msgcat not found")
endif(NOT GETTEXT_MSGCAT_EXECUTABLE )
set(WMLXGETTEXT ${PROJECT_SOURCE_DIR}/utils/wmlxgettext)
############ pot update. ###########
if(ENABLE_POT_UPDATE_TARGET)
foreach(DOMAIN ${NORMAL_DOMAINS})
# Update the source file dependencies.
include(update_pot_source_dependencies)
# Generate pot file for c++ data.
add_custom_command(
# misses bug address
OUTPUT ${PROJECT_SOURCE_DIR}/po/${DOMAIN}/${DOMAIN}.cpp.pot
# create the pot file make sure we always get output.
COMMAND ${GETTEXT_XGETTEXT_EXECUTABLE}
--force-po
--add-comments=TRANSLATORS
--files-from=${PROJECT_SOURCE_DIR}/po/${DOMAIN}/POTFILES.in
--copyright-holder=\"Wesnoth development team\"
--from-code=UTF-8
--sort-by-file
--keyword=_
--keyword=N_
--keyword=sgettext
--keyword=vgettext
--keyword=_n:1,2
--keyword=sngettext:1,2
--keyword=vngettext:1,2
--output=${PROJECT_SOURCE_DIR}/po/${DOMAIN}/${DOMAIN}.cpp.pot
# replace the chartype
COMMAND sed -i
s/charset=CHARSET/charset=UTF-8/
${PROJECT_SOURCE_DIR}/po/${DOMAIN}/${DOMAIN}.cpp.pot
# Remove some header info - Need to test whether needed.
# COMMAND sed -i
# -f po/remove-potcdate.sed
# ${PROJECT_SOURCE_DIR}/po/${DOMAIN}/${DOMAIN}.cpp.pot
DEPENDS ${PROJECT_SOURCE_DIR}/po/${DOMAIN}/POTFILES.in
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
COMMENT "pot-update [${DOMAIN}]: Generated source pot file."
)
# Generate pot file for wml data.
# if(EXISTS ${PROJECT_SOURCE_DIR}/po/${DOMAIN}/FINDCFG)
add_custom_command(
OUTPUT ${PROJECT_SOURCE_DIR}/po/${DOMAIN}/${DOMAIN}.wml.pot
COMMAND ${WMLXGETTEXT}
--directory=${PROJECT_SOURCE_DIR}
--domain=${DOMAIN}
`cd ${PROJECT_SOURCE_DIR} &&
sh ${PROJECT_SOURCE_DIR}/po/${DOMAIN}/FINDCFG`
> ${PROJECT_SOURCE_DIR}/po/${DOMAIN}/${DOMAIN}.wml.pot
DEPENDS ${PROJECT_SOURCE_DIR}/po/${DOMAIN}/FINDCFG
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
COMMENT "pot-update [${DOMAIN}]: Generated wml pot file."
)
# else(EXISTS ${PROJECT_SOURCE_DIR}/po/${DOMAIN}/FINDCFG)
# add_custom_command(
# OUTPUT ${PROJECT_SOURCE_DIR}/po/${DOMAIN}/${DOMAIN}.wml.pot
#
# COMMAND touch
# ${PROJECT_SOURCE_DIR}/po/${DOMAIN}/${DOMAIN}.wml.pot
# WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
# COMMENT "pot-update [${DOMAIN}]: Generated dummy wml pot file."
# )
# endif(EXISTS ${PROJECT_SOURCE_DIR}/po/${DOMAIN}/FINDCFG)
# Merge both pot files
add_custom_command(
# The old function checked for differences in the time in the header see
# what we need to do with it.
OUTPUT ${PROJECT_SOURCE_DIR}/po/${DOMAIN}/${DOMAIN}.pot
COMMAND ${GETTEXT_MSGCAT_EXECUTABLE}
--sort-by-file
${PROJECT_SOURCE_DIR}/po/${DOMAIN}/${DOMAIN}.cpp.pot
${PROJECT_SOURCE_DIR}/po/${DOMAIN}/${DOMAIN}.wml.pot
--output ${PROJECT_SOURCE_DIR}/po/${DOMAIN}/${DOMAIN}.pot
COMMAND ${CMAKE_COMMAND} -E remove
${PROJECT_SOURCE_DIR}/po/${DOMAIN}/${DOMAIN}.cpp.pot
${PROJECT_SOURCE_DIR}/po/${DOMAIN}/${DOMAIN}.wml.pot
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
DEPENDS
${PROJECT_SOURCE_DIR}/po/${DOMAIN}/${DOMAIN}.cpp.pot
${PROJECT_SOURCE_DIR}/po/${DOMAIN}/${DOMAIN}.wml.pot
COMMENT "pot-update [${DOMAIN}]: Generated pot file."
)
# Update / generate the po files for all languages
foreach(LANG ${LANGUAGES})
### Generate new po file.
# For some reason CMake is rather happy to delete the po file in
# some cases. Too avoid that problem only generate the init rule
# if the po file doesn't exist. The case where a po file used to
# exist and no longer exists should never occur
if(NOT EXISTS ${PROJECT_SOURCE_DIR}/po/${DOMAIN}/${LANG}.po)
add_custom_command(
OUTPUT ${PROJECT_SOURCE_DIR}/po/${DOMAIN}/${LANG}.po
COMMAND ${GETTEXT_MSGINIT_EXECUTABLE}
--no-translator
--input=${DOMAIN}.pot
--output-file=${LANG}.po
--locale=${LANG}
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/po/${DOMAIN}
DEPENDS
${PROJECT_SOURCE_DIR}/po/${DOMAIN}/${DOMAIN}.pot
COMMENT
"pot-update [${DOMAIN}-${LANG}]: Initialized po file."
)
endif(NOT EXISTS ${PROJECT_SOURCE_DIR}/po/${DOMAIN}/${LANG}.po)
### Update existing po file.
add_custom_command(
# The pot-update depends on a dummy file which we promise to
# make. We don't make this dummy file but the pot-update
# still works.
OUTPUT ${PROJECT_SOURCE_DIR}/po/${DOMAIN}/${LANG}.po.dummy
COMMAND ${GETTEXT_MSGMERGE_EXECUTABLE}
--backup=none
-U ${LANG}.po
${DOMAIN}.pot
DEPENDS
${PROJECT_SOURCE_DIR}/po/${DOMAIN}/${DOMAIN}.pot
${PROJECT_SOURCE_DIR}/po/${DOMAIN}/${LANG}.po
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/po/${DOMAIN}
COMMENT "pot-update [${DOMAIN}-${LANG}]: Updated po file."
)
SET(pot-update-SRC ${pot-update-SRC} ${DOMAIN}/${LANG}.po.dummy)
endforeach(LANG ${LANGUAGES})
# Add to target list
SET(pot-update-SRC
${pot-update-SRC}
${PROJECT_SOURCE_DIR}/po/${DOMAIN}/${DOMAIN}.pot # should depend on languages
)
endforeach(DOMAIN ${NORMAL_DOMAINS})
# The target to call
add_custom_target(pot-update2
COMMENT "pot-update: Done."
DEPENDS ${pot-update-SRC}
)
endif(ENABLE_POT_UPDATE_TARGET)