zoukankan      html  css  js  c++  java
  • 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)	estin>set LANG=en_GB
    C:Program Files (x86)	estin>glibGettext.exe
    English
    
  • 相关阅读:
    PHP应用目录结构设计
    php 项目性能优化
    Zend Framework的PHP编码规范【1】
    php 如何做在线人数统计
    linux 文件权限
    总结:常用的通用数据处理指令
    全排列(含递归和非递归的解法)
    局部变量,静态局部变量,全局变量,静态全局变量在内存中的存放区别(转)
    C++中引用详解
    Pascal三角形
  • 原文地址:https://www.cnblogs.com/silvermagic/p/7665925.html
Copyright © 2011-2022 走看看