Intltool与autoconf生成的.desktop文件

时间:2012-09-02 20:47:41

标签: internationalization gettext gnome autoconf automake

Emperor项目中,在进行树外构建时,我遇到了一些使intltool工作的问题。当运行make check out of-tree时,这是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正在源代码树中查找emperor.desktop.in中列出的po/POTFILES.in。但是,emperor.desktop.in是由配置脚本从名为emperor.desktop.in.in的文件生成的,以便按用户配置插入已安装的可执行路径,并登陆构建树。

这些是相关的bootstrap.sh行:

echo +++ Running intltoolize ... &&
intltoolize --force --copy &&
cat >>po/Makefile.in.in <<EOF

../data/_column_names.h:
    cd ../data && \$(MAKE) _column_names.h

EOF

configure.ac中的设置代码:

IT_PROG_INTLTOOL([0.35.0])

GETTEXT_PACKAGE=emperor
AC_SUBST(GETTEXT_PACKAGE)
AC_DEFINE_UNQUOTED([GETTEXT_PACKAGE], ["$GETTEXT_PACKAGE"],
                                      [The domain to use with gettext])
AM_GLIB_GNU_GETTEXT

data/emperor.desktop.in列在AC_CONFIG_FILES

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

如果您愿意,可以查看public git repository中的所有详细信息。

我能以某种方式告诉intltool这个文件将位于构建树中,而不是源代码树中吗?否则,我的选项似乎是要打破make distcheck(不是很好)选项),或者发送不包含完整路径的桌面文件,并假定可执行文件安装在PATH中。 (同样麻烦,恕我直言) - 还有其他选择吗?

2 个答案:

答案 0 :(得分:0)

在您的源代码中,您拥有emperor.desktop.in.in,它似乎不在任何规则中作为依赖项。该文件必须先转换为emperor.desktop.in,然后转换为emperor.desktopdata/Makefile.am中的情况似乎并非如此。

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) \
    [...]

$(desktop_in_in_files)包含$(desktop_in_in_files),Makefile将知道如何处理。

答案 1 :(得分:0)

进一步的挖掘让我相信答案是:intltool不支持项目中不是源文件的源文件。因此,任何额外的处理必须在intltool通过

之后完成

Intltool要求POTFILES中的行相对于(构建时)工作目录。文件POTFILESPOTFILES.in的配置脚本生成,并在sed autoconf宏(由IT_PO_SUBDIR调用)中定义了一个简单的IT_PROG_INTLTOOL脚本。顶级源目录与路径的相对位置。唉,修改POTFILES没有帮助:intltool-extract脚本尽其所能使源目录正确。我不相信有时在内部,有时在源树之外的文件可以支持,而无需修改intltool本身。