Internationalization 具有自动生成的.desktop文件的Intltool

Internationalization 具有自动生成的.desktop文件的Intltool,internationalization,gettext,gnome,autoconf,automake,Internationalization,Gettext,Gnome,Autoconf,Automake,在这个项目中,在进行树外构建时,我遇到了一些让intltool工作的问题。当运行make distcheck的树外检查(make distcheck的功能之一)时,intltool会失败,因此: INTLTOOL_EXTRACT="/usr/bin/intltool-extract" XGETTEXT="/usr/bin/xgettext" srcdir=../../po /usr/bin/intltool-update --gettext-package emperor --pot can't

在这个项目中,在进行树外构建时,我遇到了一些让intltool工作的问题。当运行make distcheck的树外检查(make distcheck的功能之一)时,intltool会失败,因此:

INTLTOOL_EXTRACT="/usr/bin/intltool-extract" XGETTEXT="/usr/bin/xgettext" srcdir=../../po /usr/bin/intltool-update --gettext-package emperor --pot
can't open ../../po/../data/emperor.desktop.in: No such file or directory at /usr/bin/intltool-extract line 212.
intltool正在查找源代码树中po/POTFILES.in中列出的emperon.desktop.in。但是,emperon.desktop.in由配置脚本从名为emperon.desktop.in.in的文件生成,以便插入用户配置的已安装可执行路径,并在生成树中着陆

以下是相关的bootstrap.sh行:

data/emperon.desktop.in列在AC_CONFIG_文件中

data/Makefile.am包含以下行:

desktopdir = $(datadir)/applications
desktop_in_files = emperor.desktop.in
desktop_DATA = $(desktop_in_files:.desktop.in=.desktop)
@INTLTOOL_DESKTOP_RULE@
并且po/POTFILES.in包含该行

data/emperor.desktop.in
如果愿意,您可以查看中的所有详细信息


我可以告诉intltool这个文件将位于构建树中,而不是源树中吗?否则,我的选项似乎是:中断使distcheck不是一个好选项,或者发送一个不包含完整路径的桌面文件,并假设可执行文件安装在该路径中。同样凌乱的是,IMHO-还有其他选项吗?

在源代码中,您有emperon.desktop.In.In,这在任何规则中似乎都不是依赖项。必须先将该文件转换为emperon.desktop.in,然后再转换为emperon.desktop,在data/Makefile.am中似乎不是这样


$desktop_in_in_文件包含$desktop_in_in_文件,Makefile将知道如何处理它。

一些进一步的挖掘让我相信答案是:intltool不支持不是项目中源文件的源文件。因此,任何附加处理都必须在intltool完成后进行


Intltool要求POTFILES中的行与构建时工作目录相对。文件POTFILES由POTFILES.in中的配置脚本生成,其中包含一个简单的sed脚本,该脚本在IT_PO_SUBDIR autoconf宏中定义,该宏由IT_PROG_INTLTOOL调用,它只是将顶级源目录的相对位置前置到路径。唉,修改POTFILES没有任何帮助:intltool extract脚本尽其所能来获得正确的源目录。我不相信有时在源代码树内部,有时在源代码树外部的文件在不修改intltool本身的情况下都能得到支持。

能否显示用于调用intltool的configure.ac和Makefile.am代码?这不会改变任何东西。in是由configure脚本生成的,而不是由intltool或其他一些Makefile规则生成的。在树内构建中,一切都可以正常工作:empire.desktop.in在源树中创建,因为它与构建树相同,intltool会找到它。
desktopdir = $(datadir)/applications
desktop_in_files = emperor.desktop.in
desktop_DATA = $(desktop_in_files:.desktop.in=.desktop)
@INTLTOOL_DESKTOP_RULE@
data/emperor.desktop.in
desktopdir = $(datadir)/applications
desktop_in_in_files = emperor.desktop.in.in
desktop_in_files = $(desktop_in_in_files:.desktop.in.in=.desktop.in)
desktop_DATA = $(desktop_in_files:.desktop.in=.desktop)
@INTLTOOL_DESKTOP_RULE@

[...]
EXTRA_DIST =  \
    $(desktop_in_in_files) \
    [...]