是否有cmake函数来更新.pot文件?

时间:2010-04-22 21:43:40

标签: cmake

我正在将项目从autotools迁移到cmake。我有关于gettext支持的问题。

现有的FindGettext.cmake模块提供了一个很好的功能:

GETTEXT_CREATE_TRANSLATIONS(foo.pot ALL fr.po de.po)

你提供一个底池文件和翻译po fil;该函数负责将po文件转换为gmo文件,并添加正确的安装目标以确保可以在运行时找到文件。一切都很好。

现在出现的问题是:在添加新邮件时,如何更新您的底池文件和po文件?

为此,autotools将生成一个“update-po”目标,(根据我的理解),使用包含翻译字符串的所有文件的列表读取POTFILES.in,将其与其他信息混合,并最终调用xgetext生成po。我认为相应的Makefile任务是包含以下内容的任务:

case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
  '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \
 $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
   --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS)  \
   --files-from=$(srcdir)/POTFILES.in \
   --copyright-holder='$(COPYRIGHT_HOLDER)' \
   --msgid-bugs-address="$$msgid_bugs_address" \
 ;; \
*) \
 $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
   --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS)  \
   --files-from=$(srcdir)/POTFILES.in \
   --copyright-holder='$(COPYRIGHT_HOLDER)' \
   --package-name="$${package_gnu}ube" \
   --package-version='0.4.0-dev' \
   --msgid-bugs-address="$$msgid_bugs_address" \
 ;; \
 esac

所以,在我重新发明轮子之前,是否有一个现有的cmake函数来做同样的事情? 或者我是否必须找到xgettext可执行文件,列出文件,并手动执行此操作? makefile版本似乎相当复杂(虽然它似乎处理了很多情况);我不介意必须写cmake等价物;)

由于

PH

2 个答案:

答案 0 :(得分:6)

不要让autotool臃肿吓唬你。 : - )

您可以使用以下代码:

SET(_potFile ${PROJECT_NAME}.pot)
ADD_CUSTOM_COMMAND(OUTPUT ${_potFile}
    COMMAND ${XGETTEXT_CMD} ${_xgettext_option_list} -o ${_potFile} ${_src_list}
    DEPENDS ${_src_list}
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
    COMMENT "Extract translatable messages to ${_potFile}"
)

ADD_CUSTOM_TARGET(pot_file ${_all}
DEPENDS ${_potFile}
)

对于C程序,我使用的是_xgettext_option_list

--language=C --keyword=_ --keyword=N_ --keyword=C_:1c,2 --keyword=NC_:1c,2 -s
--package-name=${PROJECT_NAME} --package-version=${PRJ_VER}

当FindGettext没有选项ALL时(当它是cmake-2.4时),我确实重新发明了轮子: - )

答案 1 :(得分:2)

根据this kde wiki页面,使用cmake编辑源代码并不是一个好主意。最好使用独立脚本来更新翻译。

  

事实上,消息的提取和合并并没有很好地映射到源外构建的CMake概念,而且CMake不能   为这一步提供太多帮助。

     

因此,在本教程中,我们将使用a处理第一步   独立shell脚本,只有第二步将由处理   CMake的。