How to configure and make a open source code

How to make a open source code

        或许我们经常会遇到这样的问题,就是如何去把我们使用到的一个open source 的code 放入自己的代码库,方便自己的编译,有多方便呢?就是当新人来的时候,可以不用这里找找,那里改改。当服务器突然被某个新手一不小心搞挂的时候,重新搭建服务器后,依旧可以快速顺利的编译完整个工程代码.(我记得我那时候是小白的时候也曾三次搞挂公司编译服务器.然后每次重新装一次编译服务器都要搞个半天一天的,还被骂.

以下是我编译的经验.

1. 如果你要新加入一个open source 的code,那么你可以新建一个open source 的code相关的目录,一般就直接建成open source的名字就好了,记得不要加任何版本相关的信息.

2. 把下载下来的 open source XXXX.tar.gz 的原始包放进目录,然后解压文件.

3. 在 自己建立的目录加一个Makefile 作为自己的编译,所有你需要配置的,clean  install  distclean 的选项都从新自己写一遍.

4.  这时候在现有的Makefile 中编写configure 的脚本,当然我们每次git clone code 的时候,可能每台机器,或者自己的目录都不一样,这时候可能在自己这台机器配置完的,然后git push上去仓库的代码,再别人那里又编译不过了,所以configure 最好是每次git clone code的时候都做一次配置,确保每台机器都是更加机器的现有配置来配置open source code, 但是还有一个问题就是,我们自己git clone 代码的时候,应该配置完一次后,第二次则不应该再重新配置,除非使用make distclean 清楚配置后. 这里我们可以根据open source code 目录下面是否有Makefile 文件来判断是否进行configure ,因为很多的open source code Makefile是动态生成的.

5. 每个我们编译的open source code 基本都是默认配置在用户编译的机器使用,所以采用的编译选项和安装选项基本都是x86 的配置,这时候如果你做的是嵌入式的东西,使用到交叉编译记得配置使用 cross cc 交叉编译环变量,另外一个需要注意的就是配置prefix 选项,这个选项会涉及到你在make install 的时候应该安装到哪里,以及当你的程序运行时,应该在你的嵌入式环境中哪里去链接动态库, 所以这里我比较建议的是配置成自己的嵌入式环境的目录结构下,open source 运行的目录结构. 然后在你建立的目录结构中增加一个 BIN 相关的目录,在Makefile中做make install 的时候把编译的版本需要的binary 自己写cp 命令拷贝到BIN 目录下边,在打包的时候再拷贝到自己是target下面。

6. 基本编译的问题解决了,这时候可能你还会涉及到改动open source code 相关的东西. 建议大家可以首先考虑配置是否能解决(我记得我曾经就编一个rip 的时候本来可以用配置解决的,我却搞了半天想去改代码,最后发现配置一下配置文件就搞定了),如果非要改open source的代码的时候,可以先把现有的刚刚解压出来,没有编译和configure的代码先上库,然后再在Makefile中添加一个macro 宏定义 ,用宏定义包含自己要修改的代码范围,这样可以控制编译的时候编原始代码还是编译自己修改过的代码.  还有一个比较重要的问题,就是我发现很多小企业不重视LICENSE 这种问题(我个人觉得这是一个比较重要的问题,就像小米被告一样,如果一个企业要想搞大,那就必须注意license 问题,注意给出GPL ,也可以定义自己的license),如果涉及到license ,可能我们还需要在建立的目录下添加一个GPL 的目录作为编译GPL release用.

7. 然后如果要做版本升级的时候,只需要重新下载一下新版本的open source XXX.tar.gz 然后合一下你自己的改动(去查commit log),然后改动一下Makefile 编译的版本即可解决升级的问题,而且还不用创建一大堆的各种版本的目录,和配置各种版本。

8. 我给出一个我配置lighttpd 写的Makefile 做一个example:

目前我还存在的疑问:现在我编译samba的时候,我发现我配置完prefix后,编译可以通过了,但是当我做make install 的时候,install到自己的目录的时候会出错,也就是:make install DESTDIR=”samba/BIN/”
但是如果我配置prefix目录为 “samba/bin/” 的时候,我make install 的时候回正常,但是当我放进去板子跑的时候又会出现连接库文件的时候找不到,出现运行出错.

目前这个问题我还不知道怎么解决,还期待有人可以指导指导这样的问题该怎么配置会比较好。

写得不对的欢迎拍砖.
本文章版权归作者所有,如有转载,请注原始出处,并通知作者.

About Daylight time Info

本文引用:http://zhidao.baidu.com/question/1881583924190384708.html

夏令时,又称“日光节约时制”或“夏时制”,是一种为节约能源而人为规定地方时间的制度,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮早的夏季人为将时间提前一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。各个采纳夏令时的国家具体规定不同。目前全世界有近110个国家每年要实行夏令时。(各时区多数位于其理想边界之西,导致实际上全年实施夏令时。)

夏令时的历史
据称最早有夏令时构思的是本杰明·富兰克林(被印在100元美钞上的人物),他在任美国驻法国大使期间,由于习惯于当时美国农村贵族的早睡早起生活,早上散步时看到法国人10点才起床,夜生活过到深夜。于是他在1784年给《巴黎杂志》的编辑写了一封信,信上说法国人的生活习惯浪费了大好的阳光,建议他们早睡早起,说每年可以节约6千4百万磅蜡烛。但他当时并没有建议实行夏令时,只是建议人们应该早睡早起。因为当时根本还没有统一的时区划分。不过夏令时在英语里就是“节约阳光时间”的意思。

直到1907年,英国建筑师威廉·维莱特(William Willett)才正式向英国议会提出夏令时的构思,主要是为了节省能源和提供更多的时间用来训练士兵,但议会经过辩论没有采纳。由于名声不及本杰明·富兰克林,所以人们很多都将本杰明·富兰克林当为夏令时的发明者而忽略了威廉·维莱特。

1916年,德国首先实行夏令时,英国因为怕德国会从中得到更大的效益,因此紧跟着也采取了夏令时,夏令时节约了约15%的煤气和电力,但为了弥补损失,电力和煤气公司也将价格提高了15%。法国不久也效仿实行。1917年,俄罗斯第一次实行了夏令时,但直到1981年才成为一项经常性的制度。1918年,参加了第一次世界大战的美国也实行了夏令时,但战后立即取消了。

1942年,第二次世界大战期间,美国又实行了夏令时,1945年战争结束后取消。1966年,美国重新实行夏令时。欧洲大部分国家从1976年,即第四次中东战争导致首次石油危机3年后(1973年)开始实行夏令时。

根据联合国 欧洲经济委员会的建议,从1996年起夏令时的有效期推迟到10月份的最后一个星期日。

世界各国的夏令时
美国和墨西哥的实行与否,完全由各州各县自己决定。美国不实行夏令时的地区包括:
亚利桑那州
夏威夷州
波多黎各和维京群岛
美属萨摩亚、关岛和北马里亚纳群岛

美国和加拿大原本于每年10月的最后一个星期日凌晨2时起实施冬令时间;4月的第一个星期日凌晨2时起,恢复夏令时间。

但是根据美国国会最新通过的能源法案,为加强日光节约,自2007年起延长夏令时间,开始日期从每年4月的第一个星期日,提前到3月的第二个星期日,结束日期从每年10月的最后一个星期日,延后到11月的第一个星期日。换言之,冬令时间将缩短约一个月。之所以安排在周日,是为了便于生活的调整不至于受到较大的影响。

从来没有实行过夏令时间的地区欧盟国家、俄罗斯和瑞士都是从3月最后一个星期日到10月最后一个星期日实行夏令时。在格林尼治时间三月最后一个星期日的2:00欧盟国家同时进行时间更改,根据所在时区不同,西欧时区(UTC)国家(如:英国、爱尔兰和葡萄牙)、中欧时区(UTC+1)国家(如:法国、德国和意大利)和东欧时区(UTC+2)国家(如:芬兰和希腊)的当地时间分别从02:00/03:00调整到03:00/04:00。在格林尼治时间十月的最后一个星期日03:00进行相反的调整。

加拿大从3月第二个星期日到11月第一个星期日实行夏令时,不过萨斯喀彻温省大部分地区不实行;

墨西哥从4月第一个星期日到10月最后一个星期日实行夏令时,不过在首都墨西哥城,由于市长不同意总统实行夏令时的决定,有的区服从总统实行夏令时,有的区则服从市长不实行夏令时;

新西兰由于处于南半球,所以夏季和北半球相反。它从9月最后一个星期日到4月第一个星期天实行夏时;

澳大利亚除北部地区和昆士兰州 之外全部实行夏令时;西澳夏令时于十月的最后一个周日开始,到次年三月的最后一个周日结束;其余各州夏令时于十月的第一个周日开始,到次年四月的第一个周日结束。

中国的夏令时
夏令时实施期间,将时间向前调快一小时。
1919年,中华民国在上海和天津曾短暂地实行了一年夏令时。在台湾地区也曾实行过;香港曾于1941年4月1日至1979年10月21日期间,多在夏季时段实施夏令时间(1977年和1978年未实行),香港夏令时间的计算方法为香港标准时间加1小时。在日治时期的几年间(1942年至1945年)曾全年实施,当时香港时间与日本本土时间实际上一致,1980年后不再实行,详情请参阅香港时间;

1986年至1991年,中华人民共和国在全国范围实行了六年夏令时,每年从4月中旬的第一个星期日2时整(北京时间)到9月中旬第一个星期日的凌晨2时整(北京夏令时)。除1986年因是实行夏令时的第一年,从5月4日开始到9月14日结束外,其它年份均按规定的时段施行。1992年4月5日后不再实行;

实行夏令时的建议最早由窦星元提出。1986年4月,中共中央办公厅和国务院办公厅发出《在全国范围内实行夏令时的通知》,通知动员全国人民为节约能源而早睡早起,并要求全国各部门做好宣传和安排工作。具体作法是:每年从四月中旬第一个星期日的凌晨2时整(北京时间),将时钟拨快一小时,即将表针由2时拨至3时,夏令时开始;到九月中旬第一个星期日的凌晨2时整(北京夏令时间),再将时钟拨回一小时,即将表针由2时拨至1时,夏令时结束。在夏令时开始和结束前几天,新闻媒体均刊登有关部门的通告。值得注意的是,夏令时中出生的人,生时须减去1小时。 从1986年到1991年的六个年度,除1986年因是实行夏时制的第一年,从5月4日开始到9月14日结束外,其它年份均按规定的时段施行。在夏令时开始和结束前几天,新闻媒体均刊登有关部门的通告。1992年起,夏令时暂停实行。

我国实行夏令时的时间:
1986年至1991年,每年4月中旬的第一个星期日1时起至9月中旬的第一个星期日1时止。
1986年4月13日至9月14日,
1987年4月12日至9月13日,
1988年4月10日至9月11日,
1989年4月16日至9月17日,
1990年4月15日至9月16日,
1991年4月14日至9月15日。

夏令时的利弊
优点
高纬度地区由于夏季太阳升起时间明显比冬季早,夏令时确实起到节省照明时间的作用。
不少零售商对夏令时持肯定态度。美国的糖果商院集团已经游说美国国会将夏令时延长到11月,因为万圣节是糖果销售最旺的季节,而家长们不希望孩子们在天黑以后还在外面游逛。
有人认为夏令时对患有夜盲症的人大有好处。

弊端
对低纬度地区,夏令时作用不大。尤其这些地方在夏天十分湿热,夜晚降临时闷热无法入眠,而清晨正是睡眠的好时间。
当夏令时开始和结束时,人们必须将所有计时仪器调快或调慢;当夏令时结束时,某些时间会在当天出现两次,这些都容易构成混乱。
夏令时违背了设定时区的原意──尽量使中午贴近太阳上中天的时间[1]。

其他争议
夏令时让俄罗斯每年能够节约20亿千瓦小时的电量,但这个数字只相当于两三个火力发电厂的发电量。该制度也使法国用于照明的能源消耗减少4%。有人认为夏令时在旅游业和能源消耗上获利不明显,还扰乱了儿童和老年人的生物钟,违反人的正常生理节奏。

About linux TZ 时区问题

本文引用:http://blog.csdn.net/epicyong333/article/details/5258152

tzset

#incude

void tzset(void);

设置时间环境变量。

说明
tzset()函数使用环境变量TZ的当前设置把值赋给三个全局变量:daylight,timezone和tzname。
这些变量由ftime和localtime函数使用校正格林威治(UTC)时间为本地时间,通过time函数从系统时间计算UTC,使用如下语法设置TZ环境变量:

set TZ=tzn[+|-]hh[:mm[:ss]][dzn]

tzn:三字母时区名,例如PST,你必须指出本地时间距UTC的偏移量。
hh:UTC与本地时间的时差,任选带符号的。
mm:分钟,由冒号(:)与hh分隔开。
ss:秒钟,用冒号(:)与mm分隔开。
dzn:三字母夏令时时区例如PDT。如果夏令时没作用,设置TZ时不设置dzn的值。C运行库假设在计算夏令时(DST)时执行美国的规则。

其实tzn和dzn可为任意3个字母,只要中间的时差设置正确,localtime()和gmtime()函数调用都会处理正确。要注意一点,比如要将时区TZ设置为中国所在的东八区(即UTC+8:00),不使用夏令时,使用如下语句:

setenv(“TZ”, “GMT-8”, 1);

注意是GMT-8而不是GMT+8,要不就设为了西八区,要比UTC还慢8个小时,这一点比较令人费解。

例如,为了设置TZ环境为德国对应的当前时区,你可以使用如下语句之一:
set TZ=GST-1GDT
set TZ=GST+1GDT
这些字符串使用GST指出德国标准时间,假设德国是超前UTC一个小时,并假设夏令时起作用。
如果TZ值没设置,tzset试图使用操作系统指定的时区信息,在Windwos NT和Windows95之下,这个信息指定在控制面版的日期/时间应用中,如果tzset不能获取这些信息,它缺省使用PST8PDT,它指定为太平洋标准时间。

基于TZ环境变量的值,当调用tzset时把如下值赋给全局变量daylight、timezone和tzname:
全局变量 说明 缺省值
daylight 如果在TZ设置中指定夏令时时区 1则为非0值;否则为0
timezone UTC和本地时间之间的时差,单位为秒 28800(28800秒等于8小时)
tzname[0] TZ环境变量的时区名称的字符串值 如果TZ未设置则为空 PST
tzname[1] 夏令时时区的字符串值; 如果TZ环境变量中忽略夏令时时区则为空PDT在上表中daylight和tzname数组的缺省值对应于”PST8PDT”。

如果从TZ环境变量忽略DST时区,daylight的值为0,ftime,gmtime和localtime函数对于它们的DST标志返回0。
例子

/ *
TZSET.C: This program first sets up the time zone by*
placing the variable named TZ=EST5 in the environment*
table. It then uses tzset to set the global variables*
named daylight, timezone, and tzname.*/
#include
#include
#include
void main( void )
{
if( putenv( “TZ=EST5EDT” ) == -1 )
{
printf( “Unable to set TZ/n” );exit( 1 );
}
else
{
tzset(); printf( “daylight = %d/n”, daylight );
printf( “timezone = %ld/n”, timezone );
printf( “tzname[0] = %s/n”, tzname[0] );
}
exit( 0 );
}

输出
daylight = 1
timezone = 18000
tzname[0] = EST

参见
asctime,ftime,gmtime,localtime,time,utime

首先要说明的是我的系统是fedora,其他系统可能不完全相同。

1,时间保存在硬件实时钟(RTC)中,RTC由主板电池供电,即使关断电源也不会造成时间丢失。

2,系统启动时从RTC获取时间,这个步骤在rc.sysinit中做:

a,首先从/etc/sysconfig/clock中获取RTC相关参数UTC/ARC/SRM。UTC为true表示RTC保存的时间是UTC时间,false表示保存的是本地时间。ARC与SRM的含义参考hwclock的manpage,一般false即可;

b,根据上面获取的内容构造hwclock命令的参数,将时间由RTC读取到系统时钟。

*需要说明的一点是hwclock的输出是本地时间,localtime/utc参数只是用 来告诉hwclock命令COMS时区是哪个时区。比如Linux系统的系统时区设置为CST(中国标准时间),COMS时间采用墙上时间,即COMS时 区也是CST,这时如果使用–utc参数,会让hwclock误以为COMS时区为UTC,所以输出的时间会自动+8。

3,tzset():tzset在程序中用来初始化tzname等全局变量,它首先试图从环 境变量“TZ”中获取时区,如果TZ环境变量存在,即getenv(“TZ”)返回值不为NULL,且包含内容有效,则使用TZ值;如果该变量存在但内容 无效,比如包含错误的时区名字,则使用UTC;如果该变量不存在,即getenv(“TZ”)返回NULL,则查找系统时区设置文件,一般是/etc /localtime。localtime所指文件的内容格式可参考tzfile(5)。

4,time():返回自00:00:00 UTC, January 1, 1970到现在所经过的秒数,注意,是UTC。

5,ctime()/localtime()/mktime():这类和时区相关的函数内部会调用tzset,但只是第一次调用tzset会做实际初始化,后面的调用都是直接返回。

6,系统关闭时,如执行shutdown/reboot/poweroff/halt等操作后,系统时间会保存到RTC中,这是在halt脚本中完成的,参看/etc/init.d/halt内容。

ubuntu install googlepinyin

转载至:http://www.2cto.com/os/201211/172017.html

安装步骤(需要自己编译):

A. 获取代码:(没有git的先安装git:sudo apt-get install git-core)

$ git clone git://github.com/tchaikov/scim-googlepinyin.git

$ cd scim-googlepinyin

B. 编译前提:

上面给的链接里面有介绍怎么编译的,但少提了几个必需组件,这里列一下:

* autotools-dev

* libgtk2.0-dev

* libscim-dev

* libtool

* automake

用下面命令看看是不是安装了,如果没有,会自动帮你安装上:

$ aptitude install autotools-dev libgtk2.0-dev libscim-dev libtool automake

C. 编译:

记住系统必须先存在SCIM(没有的话 sudo apt-get install scim 一下)

$ ./autogen.sh

$ make

$ sudo make install

现在重启scim:

关闭scim:pkill scim

然后启动: scim -d

OK,去首选项里的“语言支持”的“输入法”选择scim作为默认输入法就OK了。