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_磁盘及文 ...
随机推荐
- 性能测试--yslow
YSlow YSlow可以对网站的页面进行分析,并告诉你为了提高网站性能,如何基于某些规则而进行优化. YSlow可以分析任何网站,并为每一个规则产生一个整体报告,如果页面可以进行优化,则YSlow会 ...
- ddchuxing——php面试题及答案
1. echo和print的区别 echo没有返回值,print有返回值1,执行失败时返回false:echo输出的速度比print快,因为没有返回值:echo可以输出一个或多个字符串,print只 ...
- 【题解】T54037 最开始
传送门 题目大意: 对于\(a+ \frac 1{a^{}}=n\)求$a^{m}+ \frac 1{a^{m}} $,对\(10^9+7\)取模. 题目做法: 乍看此题,没有思路,但是如果用数学办法 ...
- pm2 的使用
pm2.json 代码如下 [{ "name" : "dingtalk-mobile", "script" : "app.js&q ...
- 关于jquery-weui.js中时间控件datetimepicker的使用
今天第一次接触jquery-weui,不太了解用法,然而官方文档写的也很简略,只好打开源代码进行研究,我想要的是设置开始日期大于当前日期,然后在源码中发现有min这个默认为undefined的属性,于 ...
- 将socket通信实现多进程
我们知道,使用TCP协议需要提前建立连接,这样就只能一对一的传输,但是这样感觉十分单一,如果实现一个服务器能同时和多个客户端同信了? 这里就需要用到多线程. 处理的不同之处就在于:每一个接进来的客户都 ...
- gradle 添加依赖
files 添加libs下的 project 添加一个module compile 去下载一个
- 20145239 杜文超 实验四 Android开发基础
20145239实验四 Android开发基础 实验内容 基于Android Studio开发简单的Android应用并部署测试 了解Android组件.布局管理器的使用 掌握Android中事件处理 ...
- 笔记 jsp/ajax/js/jquery/html5/css+div->table
1. jsp 1).jsp(39,33) equal symbol expected: 这个异常是说第39行有 " '( 冒号单引号)问题 2)${map[key]} map和key换 ...
- Python爬虫 —— 抓取美女图片
代码如下: #coding:utf-8 # import datetime import requests import os import sys from lxml import etree im ...