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.am、- build-aux/gitlog-to-changelog以及- AUTHORS.in取自- Virt Viewer,可以当做模板来使用
- 一般情况下我们只需要根据 configure.ac的AC_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 文件可以从一些开源项目下面复制过来,其他文件NEWS、README、ChangeLog、AUTHORS使用 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
Automake使用(高级)的更多相关文章
- 大型项目使用Automake/Autoconf完成编译配置
		http://www.cnblogs.com/xf-linux-arm-java-android/p/3590770.htmlhttp://blog.csdn.net/zengraoli/articl ... 
- C实战:项目构建Make,Automake,CMake
		C实战:项目构建Make,Automake,CMake 在本系列文章<C实战:强大的程序调试工具GDB>中我们简要学习了流行的调试工具GDB的使用方法.本文继续"C实战" ... 
- C实战:项目构建Make,Automake,CMake【转】
		转自:https://blog.csdn.net/dc_726/article/details/48978849 版权声明:本文为博主原创文章,未经博主允许不得转载.欢迎访问 http://blog. ... 
- 大数据技术之_08_Hive学习_04_压缩和存储(Hive高级)+ 企业级调优(Hive优化)
		第8章 压缩和存储(Hive高级)8.1 Hadoop源码编译支持Snappy压缩8.1.1 资源准备8.1.2 jar包安装8.1.3 编译源码8.2 Hadoop压缩配置8.2.1 MR支持的压缩 ... 
- Spring Boot高级
		Spring Boot高级内容概要一.Spring Boot与缓存二.Spring Boot与消息三.Spring Boot与检索四.Spring Boot与任务五.Spring Boot与安全六.S ... 
- 大型项目使用Automake/Autoconf完成编译配置(标准的编译过程已经变成了简单的三部曲:configure/make/make install,)
		使用过开源C/C++项目的同学们都知道,标准的编译过程已经变成了简单的三部曲:configure/make/make install, 使用起来很方便,不像平时自己写代码,要手写一堆复杂的Makefi ... 
- MySQL高级知识- MySQL的架构介绍
		[TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ... 
- PayPal高级工程总监:读完这100篇论文 就能成大数据高手(附论文下载)
		100 open source Big Data architecture papers for data professionals. 读完这100篇论文 就能成大数据高手 作者 白宁超 2016年 ... 
- 马哥linux运维初级+中级+高级 视频教程 教学视频 全套下载(近50G)
		马哥linux运维初级+中级+高级 视频教程 教学视频 全套下载(近50G)目录详情:18_02_ssl协议.openssl及创建私有CA18_03_OpenSSH服务及其相关应用09_01_磁盘及文 ... 
随机推荐
- 题解 P3372 【【模板】线段树 1】
			发一篇不需要O2就能过的分块. 基本思路: 分块的思路,大段维护,小段朴素. 维护几个数组: 区块\(block[maxn]\) 懒标记\(tag[maxn]\) 真实数据\(data[maxn]\) ... 
- AsyncHttpClien访问网络案例分析
			Android数据存储的四种方式分别是:SharedPreferences存储.File文件存储.Network网络存储和sqlite数据库存储,网络存储需要使用AsyncHttpClient发送请求 ... 
- java读取TXT文件中的数据
			将文件放在一个指定的磁盘目录下: File file = new File("指定的文件路径"); try{ BufferedReader br = new BufferedRea ... 
- testng testcase失败重试
			简单介绍 需求场景:测试移动端应用,常会因为点击失效.网络延迟大等原因导致测试脚本失败.这时,需要自动重新运行失败的脚本,直到脚本成功通过或者到达限定重试次数. 解决方案:实现testng的IRetr ... 
- mysql优化之 EXPLAIN(一)
			数据库优化最常用的命令就是用explain查看一下写的sql是否用到了索引: 如: (root@localhost) [akapp]>explain select * from sc_activ ... 
- nginx高可用配置
			可参考资料: http://www.cnblogs.com/holbrook/archive/2012/10/25/2738475.html http://blog.csdn.net/e4210834 ... 
- WPF区时浏览小程序
			在深圳已经工作了一个月了,之前做WinForm的,现在做WPF,每天加班到晚上10点,比之前累.学习新技术也是有个过程的,我就从基础的语法和 界面布局做起.这是我仿着做一个小软件. 效果图赏析 在原基 ... 
- BZOJ 3671 NOI2014 随机数生成器
			这题其实是个暴力. 首先那一堆如何构造n*m方格的东西都是在玩你. 构造出来方阵后,由于是一个排列,不存在重复,可以大力贪心. 每次将选出一个最小的元素,然后将它右上左下的元素全部打上标记(记得bre ... 
- .NET中Eval()方法大全
			<%# Bind("Subject") %> //绑定字段<%# Container.DataItemIndex + 1%> //实现自动编号<%# ... 
- Java_泛型_01_T与?
			二.参考文档 1.JAVA泛型通配符T,E,K,V区别,T以及Class<T>,Class<?>的区别 
