Automake使用(高级)

工程地址

automake语言国际化

最初工程目录结构

$ ls -l
total 16
drwxrwxr-x. 2 fedora fedora 4096 May 10 10:38 build-aux
drwxrwxr-x. 2 fedora fedora 4096 May 10 10:38 m4
drwxrwxr-x. 2 fedora fedora 4096 May 10 10:38 po
drwxrwxr-x. 2 fedora fedora 4096 May 10 10:38 src
$ ls -l src/
total 4
-rw-rw-r--. 1 fedora fedora 572 May 10 10:38 main.cpp

源文件剖析

$ cat src/main.cpp
#include <glib/gi18n.h>
#include <locale.h>
#include <stdio.h>
#include "config.h"

int main(int argc, char *argv[])
{
    setlocale (LC_ALL, "");
    bindtextdomain (GETTEXT_PACKAGE, LOCALE_DIR);
    bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
    textdomain (GETTEXT_PACKAGE);
    printf(_("gettext"));
    return 0;
}

将工程改造成automake

运行autoscan & 修改configure.ac文件

与中级篇不同点

  • 使用AM_GLIB_GNU_GETTEXT宏代替AM_GNU_GETTEXT宏
  • 使用PKG_CHECK_MODULES获取glib-2.0库的编译连接参数

运行aclocal

生成autoconf所需的宏文件aclocal.m4

$ aclocal

运行autoconf

根据configure.ac生成configure脚本

$ autoconf

运行autoheader

生成 config.h.in 文件,用于生成 config.h 文件,此文件保存了configure.ac中定义的宏,可被程序使用

$ autoheader

编写Makefile.am

顶层目录的Makefile.am
  • Makefile.ambuild-aux/gitlog-to-changelog 以及 AUTHORS.in 取自 Virt Viewer ,可以当做模板来使用
  • 一般情况下我们只需要根据 configure.acAC_CONFIG_FILES 来修改 Makefile.am 模板的 SUBDIRS 来决定需要生成Makefile的子目录,每个Makefile.am只需要包含子目录即可,如果有嵌套目录需要生成Makefile,则在子目录的Makefile.am设置 SUBDIRS
  • 这边的Makefile.am比中级篇更加简洁
$ cat Makefile.am
NULL =

ACLOCAL_AMFLAGS = -I m4

SUBDIRS = src po

EXTRA_DIST =                    \
    build-aux/gitlog-to-changelog        \
    AUTHORS.in                \
    $(NULL)

DISTCLEAN_FILES =                \
    $(NULL)

MAINTAINERCLEANFILES =                \
    $(srcdir)/AUTHORS            \
    $(srcdir)/INSTALL            \
    aclocal.m4                \
    config.h.in                \
    m4/intltool.m4                \
    m4/libtool.m4                \
    m4/ltoptions.m4                \
    m4/ltsugar.m4                \
    m4/ltversion.m4                \
    m4/lt~obsolete.m4            \
    build-aux/compile            \
    build-aux/config.guess            \
    build-aux/config.rpath            \
    build-aux/config.sub            \
    build-aux/depcomp            \
    build-aux/install-sh            \
    build-aux/ltmain.sh            \
    build-aux/missing            \
    $(NULL)

dist-hook: gen-ChangeLog gen-AUTHORS

# Generate the ChangeLog file (with all entries since the switch to git)
# and insert it into the directory we're about to use to create a tarball.
if OS_WIN32
.PHONY: gen-ChangeLog gen-AUTHORS nsis
else
.PHONY: gen-ChangeLog gen-AUTHORS
endif

gen-ChangeLog:
    if test -d .git || test -d ../.git; then        \
      $(top_srcdir)/build-aux/gitlog-to-changelog        \
        > $(distdir)/cl-t;                    \
      rm -f $(distdir)/ChangeLog;                \
      mv $(distdir)/cl-t $(distdir)/ChangeLog;        \
    fi

gen-AUTHORS:
    $(AM_V_GEN)if test -d $(srcdir)/.git; then                      \
       out="`cd $(srcdir) && git log --pretty=format:'%aN <%aE>' | sort -u`" && \
       perl -p -e "s/#authorslist#// and print '$$out'"            \
         < $(srcdir)/AUTHORS.in > $(distdir)/AUTHORS-tmp &&        \
       mv -f $(distdir)/AUTHORS-tmp $(distdir)/AUTHORS ;           \
    fi

if OS_WIN32
.PHONY: nsis
nsis:
    make -C $(builddir)/data virt-viewer-$(VERSION).exe
endif
src目录的Makefile.am
$ cat src/Makefile.am
NULL =
SUBDIRS =

EXTRA_DIST =                    \
    $(NULL)

DISTCLEANFILES =

bin_PROGRAMS = glibGettext
glibGettext_LDADD =

glibGettext_CPPFLAGS = \
    $(NULL)

glibGettext_CXXFLAGS = -ggdb3 -Wall -MMD  -fpermissive -g
MAINTAINERCLEANFILES =

COMMON_LIBS = \
    $(GLIB2_LIBS)                           \
    $(NULL)

# linux下程序运行的当前目录不确定所以无法使用相对路径
if !OS_WIN32
COMMON_CPPFLAGS = \
        -DLOCALE_DIR=\""$(datadir)/locale"\"    \
    $(GLIB2_CFLAGS)                         \
    $(NULL)
else
COMMON_CPPFLAGS = \
        -DLOCALE_DIR=\""./../share/locale"\"    \
    $(GLIB2_CFLAGS)                         \
    $(NULL)
endif

glibGettext_SOURCES = \
        main.cpp                                \
        $(NULL)

glibGettext_LDFLAGS = \
    $(COMMON_LIBS)                \
    $(NULL)

glibGettext_CPPFLAGS += \
    $(COMMON_CPPFLAGS)             \
    $(NULL)

创建automake必要文件

COPYING 文件可以从一些开源项目下面复制过来,其他文件NEWSREADMEChangeLogAUTHORS使用 touch 命令生成

运行automake

生成 Makefile.in 文件

$ automake -a

编辑po/POTFILES.in文件

填入需要进行国际化字符转换的源文件,即包含文件中包含 _() 的源文件

$ cat po/POTFILES.in
src/main.cpp

执行autogen.sh

  • autogen.sh 取自 Virt Viewer ,可以当做模板来使用
  • 根据实际情况修改 echo "Now type 'make' to compile glibGettext." 即可

生成po文件

  • 执行 make -C po/ update-po 生成程序对应的POT文件 gettext.pot
  • 在po目录下执行 msginit --locale zh_CN.utf8 生成对应语言的PO文件
  • 编辑PO文件完成翻译
  • 创建 LINGUAS 文件,并填入PO文件中的"Language"属性
  • 此处和中级篇一致

运行make

  • 不需要拷贝gettext.h文件
# Linux平台下
$ ./autogen.sh
$ make
$ sudo make install
# windows平台下
$ ./autogen.sh
$ mingw32-configure
$ make
$ sudo make install

测试glibGettext

# Linux平台下
$ LANG=en_GB glibGettext
English
$ LANG=zh_CN glibGettext
中文
  • 怎么把fedora下编译的程序部署到windows平台会在其他章节介绍
# windows平台下
C:\Program Files (x86)\test\bin>set LANG=en_GB
C:\Program Files (x86)\test\bin>glibGettext.exe
English
posted @ 2017-10-14 10:35  银魔术师  阅读(975)  评论(0编辑  收藏  举报