runsisi

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  45 随笔 :: 15 文章 :: 26 评论 :: 0 Trackbacks

#


runsisi AT hust

http://www.cppblog.com/runsisi

 

前期将FreeBSDTCP栈移到用户态的时候没有参考项目已有的Makefile,主要是项目的Makefile写的太复杂,看上去有点晕,而且前期也基本上不需要依赖已有Makefile定义的变量,因此单独弄了个Makefile,自我感觉良好:),以后一些小东西也可以继续用~

关于Makefile可以参考:http://www.gnu.org/software/make/manual/

 

# author: runsisi AT hust

# date: 2013/08/24

 

.PHONY : all clean

 

CC := /opt/zte/x86_64_gcc4.5.2_glibc2.13.0/bin/x86_64-pc-linux-gnu-gcc

AR := /opt/zte/x86_64_gcc4.5.2_glibc2.13.0/bin/x86_64-pc-linux-gnu-ar

 

CODE_DIR := $(CURDIR)/../../..

ROOT_DIR := $(CURDIR)

TARGET := $(ROOT_DIR)/libbsdtcp.a

 

INC_DIRS := $(ROOT_DIR)/include \

           $(ROOT_DIR)/include/opt \

           $(ROOT_DIR)/include/amd64 \

           $(ROOT_DIR)/include/x86 \

           $(ROOT_DIR)/include/contrib/altq \

           $(CODE_DIR)/dps/pub/include

        

SRC_DIRS := $(ROOT_DIR)/source/kern \

           $(ROOT_DIR)/source/libkern \

           $(ROOT_DIR)/source/net \

           $(ROOT_DIR)/source/netinet \

           $(ROOT_DIR)/source/vm

          

INCS := $(addprefix -I, $(INC_DIRS))

SRCS := $(foreach dir, $(SRC_DIRS), $(wildcard $(dir)/*.c))

OBJS := $(SRCS:.c=.o)

DEPS := $(OBJS:.o=.d)

 

MACROS := -D_KERNEL

CFLAGS := -MD -MP $(INCS) $(MACROS)

 

all : $(TARGET)

    @printf "Compilation done:)\n"

   

$(TARGET) : $(OBJS)

    $(AR) -crs $@ $^

 

%.o : %.c

    $(CC) -c $(CFLAGS) -o $@ $<

   

-include $(DEPS)

 

clean:

    @rm -f $(OBJS) $(DEPS) $(TARGET)

/Files/runsisi/Makefile.pdf
/Files/runsisi/Makefile.rar

posted @ 2014-08-18 21:27 runsisi 阅读(1336) | 评论 (0)编辑 收藏


runsisi AT hust

http://www.cppblog.com/runsisi

1.     NTP系统简介

如图1,整个NTP系统以一种分层结构的形式存在,其中最顶层为原子钟等精确时钟设备,称作参考时钟(reference clock),NTP服务器按照距离参考时钟的远近被归入不同的层(stratum),处于顶层(stratum 1)的NTP服务器与参考时钟直连(黄色箭头所示),被称作主时间服务器(primary time server),处于其它层的NTP服务器通过网络从同层或上层NTP服务器处获取时间进行同步(红色箭头所示)。从图中可以看到NTP服务器既可以作为服务端向其它机器提供时间服务,也可以作为客户端从其他NTP服务器获取时间进行同步。

/Files/runsisi/内网环境ntp服务器搭建.pdf


posted @ 2014-08-12 19:17 runsisi 阅读(1082) | 评论 (0)编辑 收藏


runsisi AT hust

http://www.cppblog.com/runsisi

前言

本文只适用于ceph测试环境的搭建,实际生产环境下的部署请参考ceph官方相关文档。实际上ceph官方对测试环境的部署已有比较详细的介绍,本文内容主要参考了官方的文档,只是对部署过程稍作简化,如需参阅官方文档请点击:http://ceph.com/docs/master/start/

环境描述

由于缺少实际硬件环境,我们使用VMware模拟所需的硬件环境,对于测试环境而言,这样做无可厚非,理论上任意VMware版本应该都是可以的。

Ceph只能部署在linux系统上,其运行环境对发行版理论上无要求,但ceph官方提供的ceph测试环境部署工具(ceph-deploy)可能对发行版有要求,同时ceph客户端对内核以及glibc版本也有一定要求,具体环境要求请参阅官方文档:http://ceph.com/docs/master/start/os-recommendations/

Linux各发行版之间差异很大,官方的部署文档基本上是分debianredhat两种类型的发行版分别进行介绍,由于精力有限,本文不对debian系列(debian, ubuntu, linux mint, linuxdeepin等)进行介绍。

本文用到的环境清单如下:

硬件环境:VMware workstation 10.0.2

软件环境:Centos 7.0 x86_64

准备工作

cppblog对word2013的格式支持好像不好,直接上文档吧。

/Files/runsisi/ceph环境搭建.pdf

posted @ 2014-07-31 10:09 runsisi 阅读(3097) | 评论 (0)编辑 收藏

惭愧。。
posted @ 2014-07-05 12:31 runsisi 阅读(168) | 评论 (0)编辑 收藏


Powerline字体补丁

runsisi AT hust

 @2013/05/03

接上一篇。

 

使用spf13vim插件,如果当前系统的vim支持python的话,会安装 powerline插件,如果不支持的话则会安装vim-powerlinepowerline相当于vim-powerline的升级版,后者的效果可以参看上一篇,前者的效果可以看下图:


看的出powerlinevim-power的效果要炫的多,但是使用powerline的话需要对终端使用的字体打补丁,不然会显示乱码(当然乱码的原因也可能是终端编码设置不对,这里只考虑字体的原因)。

使用gnome-terminalkonsolelinux原生的终端也可以不给使用的字体打补丁,具体可以参考官方的文档,但如果使用puttysecurecrt等远程终端工具的话必须打补丁。

 

Powerline插件自带了补丁工具,如果直接使用spf13的脚本安装的powerline插件,该工具在spf13-vim/.vim/bundle/powerline/font文件夹下:fontpatcher.py

使用类似下面的命令,就可以给consola.ttf字体打补丁:

./fontpatcher.py consola.ttf

 

我在使用该工具对consolas字体打补丁时遇到了一些问题:

1.       The required FontForge modules could not be loaded.

该工具依赖fontforge,但使用系统的包管理工具安装了fontforge之后可能仍然出现该问题(至少在我的opensuse12.2 64bit下不能用),可以通过下载源码重新编译(configure时注意加上--enable-pyextension选项);

2.       虽然重新编译、安装了fontforge,执行该工具时仍然可能出现1中的问题

切换到fontforge源代码目录下的pyhook目录,然后执行python setup.py install安装fontforgepython模块(不知道为什么fontforgemakefile会缺这一步)

3.         打了补丁的字体puttysecurecrt等工具不认识,在字体设置无法选择打了补丁的字体,或者使用了打了补丁的字体后powerline插件显示的仍然是乱码

Github上有打了补丁的consolas等字体,但都有这个问题,可能只适用于linux下的原生终端使用,在网上找到了一个该字体工具的补丁,但是是针对老版的vim-powerline的,和新版工具差异太大,已经不能用了,参考它的思路,对新版的powerline字体工具打了个补丁如下:

--- fontpatcher/old/fontpatcher.py    2013-05-03 23:23:11.788069924 +0800
+++ fontpatcher/new/fontpatcher.py    2013-05-03 23:23:53.145073351 +0800
@@ -22,14 +22,16 @@
 parser.add_argument('target_fonts', help='font files to patch', metavar='font', nargs='+', type=argparse.FileType('rb'))
 parser.add_argument('--no-rename', help='don\'t add " for Powerline" to the font name', default=True, action='store_false', dest='rename_font')
 parser.add_argument('--source-font', help='source symbol font', metavar='font', dest='source_font', default='{0}/fontpatcher-symbols.sfd'.format(sys.path[0]), type=argparse.FileType('rb'))
+parser.add_argument('--fix-mono', help='fixes some mono-fonts which have glyphs of 0 widths', default=False, action='store_true', dest='fix_mono')
 args = parser.parse_args()
 
 
 class FontPatcher(object):
-    def __init__(self, source_font, target_fonts, rename_font=True):
+    def __init__(self, source_font, target_fonts, rename_font=True, fix_mono=False):
         self.source_font = fontforge.open(source_font.name)
         self.target_fonts = (fontforge.open(target_font.name) for target_font in target_fonts)
         self.rename_font = rename_font
+        self.fix_mono = fix_mono
 
     def patch(self):
         for target_font in self.target_fonts:
@@ -40,10 +42,10 @@
 
             # Rename font
             if self.rename_font:
-                target_font.familyname += ' for Powerline'
-                target_font.fullname += ' for Powerline'
+                target_font.familyname = 'Powerline ' + target_font.familyname
+                target_font.fullname = 'Powerline ' + target_font.fullname
                 fontname, style = re.match("^([^-]*)(?:(-.*))?$", target_font.fontname).groups()
-                target_font.fontname = fontname + 'ForPowerline'
+                target_font.fontname = 'Powerline ' + fontname
                 if style is not None:
                     target_font.fontname += style
                 target_font.appendSFNTName('English (US)''Preferred Family', target_font.familyname)
@@ -102,6 +104,11 @@
                 # Reset the font's glyph width so it's still considered monospaced
                 target_font[source_glyph.unicode].width = target_font_width
 
+            if self.fix_mono:
+                for target_glyph in target_font.glyphs():
+                    if target_glyph.width == 0:
+                        target_glyph.width = target_font_width
+
             target_font.em = target_font_em_original
 
             # Generate patched font
@@ -111,5 +118,5 @@
                 extension = '.otf'
             target_font.generate('{0}{1}'.format(target_font.fullname, extension))
 
-fp = FontPatcher(args.source_font, args.target_fonts, args.rename_font)
+fp = FontPatcher(args.source_font, args.target_fonts, args.rename_font, args.fix_mono)
 fp.patch()

使用如下的命令对consola字体打补丁,然后安装字体就可以在puttysecurecrt等工具中使用了:

./fontpatcher.py –fix-mono consola.ttf

 

我在github上传了一份打了补丁的consolas字体,下载之后可以直接使用:

https://github.com/runsisi/consolas-font-for-powerline

 

同时我也在github上上传了一份打包好了的spf13插件,只需要解压然后执行./install.sh即可(注意要求vim7.3,且vim支持python):

https://github.com/runsisi/a-ready-to-use-vimrc

/Files/runsisi/powerline_fontpatcher.pdf
/Files/runsisi/fontpatcher.rar
/Files/runsisi/fontpatcher_diff.rar
posted @ 2013-05-04 00:32 runsisi 阅读(7676) | 评论 (2)编辑 收藏

vim配置总结

                                                                                                                                        runsisi AT hust
 @2013/04/06

12年的最后一天配置了一下公司RHEL上的vim,公司的网络不允许上传东西和外发邮件,因此总结得回家写,没有RHEL的环境,不过用CentOSopenSUSE也是一样的。

毕业快一年了,虽然一直是在Linux下开发,但很多时候还是在Windows下面编码,然后用git pushRHEL上去编译,在学校的时候偶尔也照着网络上的博文给vim配置类似IDE的东东,但一个一个插件的来配置挺繁琐的,而且VCeclipse之类的用久了,终究用的不是很习惯,想想用linux这么多年了对vim的使用还停留在入门水平吧:)

给个在SecureCRT中的效果图,机器硬盘太小,只能用虚拟机将就了^^


看上去还不错,配色、自动补全、状态栏提示等功能都非常不错,对于代码编辑而言,应该是完全够用了,不过C/C++符号之间的定义、调用关系的跳转、查找等还是太弱,跟eclipsesource insight比感觉不是一个档次。

 

其实整个配置很简单,基本都是用的githubspf13大牛的vim配置,只是调整了个别选项以适应自己的环境。

先简单介绍下我自己的环境:CentOS 6.3 64bit / openSUSE 12.2 64bit,终端为SecureCRT 7.0,其中SecureCRT的终端模拟器选项选择的Linux,且勾选后面的两个复选框,外观选项中颜色样式选择的为Black / Floral White,如下图所示:



如果是直接使用的gnome-terminal/konsole的话,将背景颜色设置成如下就可以了:


 


有两种安装方法:1)自动安装模式;2)手动安装模式。但都要求vim的版本为7.3及以上并且要求在编译时加上某些功能模块,如果是自己编译的话需要将pythonmulti_byte等功能加上,可以使用如下的编译选项--enable-cscope --enable-multibyte --enable-perlinterp=yes --enable-pythoninterp=yes --enable-rubyinterp=yes。如果直接使用zypperyum等包管理器安装的话,可以安装vim-enhanced这个版本,不过centos6.3RHEL6.0自带的包都没有vim7.3需要自己手工编译,或者去网上下载已经编译好的版本。

 

1)自动安装模式

其实如果有网络,且能使用gitgithub.com拉版本的话,配置过程超级简单,因为github上有现成的配置脚本,可以点击该链接查看:https://github.com/spf13/spf13-vim,简单介绍一下配置流程:

1.       使用githttps://github.com/spf13/spf13-vim.git拉一个版本到本地;

2.       切换到本地版本工作目录,给目录下的bootstrap.sh添加上可执行权限;

3.       执行刚才的脚本,只需要等待就好了,会自动下载其他的vim插件的;

4.       然后修改~/.vimrc或者新建一个~/.vimrc.local,加上下面这一句,将终端颜色设置成256色:set t_Co=256,这样就可以了。

 

2)手动安装模式

如果网络环境不支持git的话,就什么都需要手动安装了。手动模式安装太繁琐了,其实就是参考spf13-vim/bootstrap.sh脚本的操作。

1.       访问https://github.com/spf13/spf13-vim,点击“zip”按钮,打包下载该插件,并解压

2.       参照spf13-vim/bootstrap.sh文件中的操作,将原有的vim配置文件备份,然后将新的配置文件链接到~/目录下

3.       手动下载https://github.com/gmarik/vundle这个插件,解压并去掉文件夹名中最后的”-master”,并将该文件夹拷贝到~/.vim/bundle文件夹下,没有该文件夹则新建

4.       修改spf13-vim/.vimrc.bundles文件,该配置文件中的类似Bundle 'xxx/yyy'的一行实际上就是github上的一个vim插件路径,如Bundle 'gmarik/vundle'URL路径就是https://github.com/gmarik/vundle。直接修改let g:spf13_bundle_groups可以去掉一些不需要的插件组,每个插件组包括的插件都在该配置文件的下面定义了,如果不想将整个插件组都去掉,可以在插件组的定义处删掉一些不需要的插件,但要注意在该配置文件开头,“Deps”注释下面的插件是必须的,不能删掉

5.       然后一个个将这些插件手动下载,解压,去掉文件夹名最后的”-master”,然后放到~/.vim/bundle/下面

6.       最后按照spf13-vim/bootstrap.sh最后的安装命令安装即可

7.       按照上面自动模式中的第4条,增加一条终端颜色配置即可。

/Files/runsisi/vim简单配置.pdf

posted @ 2013-04-06 16:17 runsisi 阅读(1210) | 评论 (0)编辑 收藏

今天终于发2月份的工资了,果然如天涯上所说加工资了,不过又是250。。。
因为年前和年后各调休一天又扣了700,即使平时的加班不能用来调休了,但当时不是说可以用年假调的吗。。
去年11月被评为优秀员工,以为有奖金,结果12月份工资一出来,啥都没有,以为半年考核优秀的才有。。
年前被评为12年下半年优秀员工,对2月份的工资满心期待,结果还是啥都没有。。
作为优秀员工中唯一的新人,也只有精神鼓励了,但没有任何一点点的物质奖励,有点点失望。。
天涯上说3月还要裁员,这样的话,在进来还不到一年的时间内马上就会经历第三次裁员了。。
posted @ 2013-03-11 21:58 runsisi 阅读(562) | 评论 (2)编辑 收藏

年前说给scienceluo写一个这样的脚本,很简单的逻辑,实现的功能为在linux下建一个svn的版本库,考虑的条件也很简单,只能用在平时写代码的时候为了方便临时建个svn的版本库用用~~
在openSUSE-12.2, CentOS-6.3, 以及RHEL6.0(均为64bit环境)下简单测试通过:),ubuntu-12.10默认的shell为dash(当然可以指定使用bash),且对awk的gensub函数不支持,所以该脚本无法在ubuntu下使用(可以用sed实现同样的功能,但懒得弄了,平时也用不到ubuntu的环境)~
脚本支持建立多个版本库,但如果想要同时访问,则多个版本库要在相同的父目录下,否则的话就只能访问最新建的那个版本库了,因为启动svnserve服务器时指定的服务器根目录参数填的是用户最新建的那个svn版本库路径的父目录;
还一个需要注意的地方,建立的版本库必须用svn://127.0.0.1/test_repo类似这样的路径来访问,注意红色的svn://前缀,因为服务器用的是subversion自带的独立服务器~

/Files/runsisi/mksvn.rar


#! /bin/sh

# author runsisi@hust.edu.cn
#
 date 2013/02/05
#
 modified 2013/02/12

# variables forward declaration, it is not neccessary for shell script though
svn_repo_root_dir=""

function is_subversion_exist()
{
    which svnadmin > /dev/null 2>&1
    [ $? -eq 0 ] && return 1
    return 0
}

function is_sys_root_dir()
{
    echo $1 | awk '{if ($0 ~ /^\/$/) exit 1; else exit 0;}'
}

function is_relative_path()
{
    echo $1 | awk '{if ($0 ~ /^\//) exit 0; else exit 1;}'
}

function get_svn_root_dir()
{
    read -e -p "输入要创建的svn根目录:" svn_repo_root_dir
    [ -z "$svn_repo_root_dir" ] && echo "非法路径,abort!" && return 1
    # whitespaces at each end of the path are trimed
    svn_repo_root_dir=$(echo "$svn_repo_root_dir" | sed 's/^[[:blank:]]*\(\)[[:blank:]]*$/\1/g')
    is_sys_root_dir "$svn_repo_root_dir"
    [ $? -eq 1 ] && echo "非法路径,不能是根目录,abort!" && return 1
    # get rid of last / character(s) in path
    svn_repo_root_dir=$(echo "$svn_repo_root_dir" | sed 's/\(\)\/*$/\1/g')
    # escape whitespaces inside path
    svn_repo_root_dir=$(echo "$svn_repo_root_dir" | sed 's/ /\\ /g')
    # expand ~ character in path
    eval svn_repo_root_dir="$svn_repo_root_dir"
    # test if this path already exist
    [ -e "$svn_repo_root_dir" ] && echo "该svn路径已存在,请删除后再创建,abort!" && return 1
    # test if this path is a relative path or not
    is_relative_path "$svn_repo_root_dir"
    # convert to absolute path
    [ $? -eq 1 ] && svn_repo_root_dir=$(pwd)/$svn_repo_root_dir
    return 0
}

function create_svn_repo()
{
    mkdir -p $(dirname "$1")
    svnadmin create "$1"
    return 0
}

function edit_svn_conf_file()
{
    svn_repo_conf_dir="$1/conf"
    awk '{
        if ($0 ~ /^#[[:blank:]]*anon-access/)
            print gensub(/^#[[:blank:]]*(anon-access)/, "\\1", "g");
        else if ($0 ~ /^#[[:blank:]]*auth-access/)
            print gensub(/^#[[:blank:]]*(auth-access)/, "\\1", "g");
        else if ($0 ~ /^#[[:blank:]]*password-db/)
            print gensub(/^#[[:blank:]]*(password-db)/, "\\1", "g");
        else print;}' "$svn_repo_conf_dir/svnserve.conf" > "$svn_repo_conf_dir/tmp_svnserve.conf"
    rm -f "$svn_repo_conf_dir/svnserve.conf"
    mv "$svn_repo_conf_dir/tmp_svnserve.conf" "$svn_repo_conf_dir/svnserve.conf"
    vi "$svn_repo_conf_dir/passwd"
    return 0
}

function start_svn_server()
{
    killall -9 svnserve 2&> /dev/null
    svnserve -d -r $(dirname "$1")
    return 0
}

function main()
{
    is_subversion_exist
    [ $? -eq 0 ] && echo "subversion不存在,需要先安装subversion" && return 1
    get_svn_root_dir
    [ ! $? -eq 0 ] && return 1
    create_svn_repo "$svn_repo_root_dir"
    [ ! $? -eq 0 ] && return 1
    edit_svn_conf_file "$svn_repo_root_dir"
    [ ! $? -eq 0 ] && return 1
    start_svn_server "$svn_repo_root_dir"
    [ ! $? -eq 0 ] && return 1
    return 0
}

main
posted @ 2013-02-16 21:44 runsisi 阅读(987) | 评论 (0)编辑 收藏

php-gd扩展库交叉编译

runsisi AT hust
 @2012/10/05

为了给一做web的同事解决交叉编译的问题,长假的第一天看了下,所以有了这个东东~

1. 编译环境

OS: LinuxDeepin 12.06 (based on ubuntu 12.04) 32bit(以下的讨论亦只限于GNU/Linux环境下)

HW: Intel Pentium processor T4300, DDRII 667 3GB

编译器:arm-linux-gnueabi-gcc,理论上其他powerpc,mingw等GCC均可以

Src version:

Php: v5.4.7 zlib: v1.2.7 libpng: v1.5.12 libjpeg: v8d


2. 交叉编译和本地编译的区别

1)输入

相同,同样是那些源代码,配置脚本

2)输出

不同,交叉编译的输出一般为在其他cpu架构/系统上(更确切的说是具有不同ABI接口的系统上)运行或加载的可执行文件或库,它的输出一般情况下不能在交叉编译器运行的平台下运行或被加载

3)工具

不能简单的说相同或者不同,对于编译链接等用到的工具链肯定不同,例如在我的机器上装了四个针对不同目标平台的gcc编译器:

①runsisi@runsisi-Aspire-4736Z:~/Desktop$ gcc -v

Using built-in specs.

COLLECT_GCC=gcc

COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-linux-gnu/4.6/lto-wrapper

Target: i686-linux-gnu

②runsisi@runsisi-Aspire-4736Z:~/Desktop$ arm-linux-gnueabi-gcc -v

Using built-in specs.

COLLECT_GCC=arm-linux-gnueabi-gcc

COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabi/4.6/lto-wrapper

Target: arm-linux-gnueabi

③COLLECT_GCC=/opt/eldk-5.2.1/powerpc/sysroots/i686-eldk-linux/usr/bin/powerpc-linux/powerpc-linux-gcc

COLLECT_LTO_WRAPPER=/opt/eldk-5.2.1/powerpc/sysroots/i686-eldk-linux/usr/libexec/powerpc-linux/gcc/powerpc-linux/4.6.4/lto-wrapper

Target: powerpc-linux

④runsisi@runsisi-Aspire-4736Z:~/Desktop$ i686-w64-mingw32-gcc -v

Using built-in specs.

COLLECT_GCC=i686-w64-mingw32-gcc

COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-w64-mingw32/4.6/lto-wrapper

Target: i686-w64-mingw32

注意每一个打印的最后一行”Target“,表明该编译器的输出是针对该平台的。

编译用到的工具除了编译工具链之外,还有configure脚本等(当然对于不是使用autotools进行源代码发布的开源工程,本段就没有讨论的意义了),对于交叉编译而言,configure脚本需要使用不同的参数进行调用,有两个最重要的参数:1)指定交叉编译器,可以在执行configure脚本之前执行export CC=arm-linux-gnueabi-gcc,或者像这样:./configure CC=arm-linux-gnueabi-gcc作为configure脚本参数进行指定;2)由于交叉编译出来的可执行文件在当前的平台无法运行,所以另外一个参数是告诉configure脚本,我们当前是要进行交叉编译,一些需要通过编译测试程序然后运行测试程序才能得到编译参数的操作就不要进行了,当然还有其他一些编译参数可能针对不同的平台有默认值,该指定交叉编译目标平台的参数以configure脚本参数的形式进行指定,如:./configure –-host=arm-linux,具体—host之后指定的目标平台是arm-linux, powerpc-linux还是别的貌似不是太重要,只要不是当前编译器所在平台可以运行的平台就可以了,但是我们还是针对自己需要的目标平台指定为好

4)gcc默认搜索路径

gcc编译器在编译和调用ld进行链接的时候会去默认路径下搜索头文件和库文件,可以使用gcc的 -print-search-dirs参数打印当前的默认搜索路径,如:

runsisi@runsisi-Aspire-4736Z:~/Desktop$ i686-w64-mingw32-gcc -print-search-dirs

install: /usr/lib/gcc/i686-w64-mingw32/4.6/

programs: =/usr/lib/gcc/i686-w64-mingw32/4.6/:/usr/lib/gcc/i686-w64-mingw32/4.6/:/usr/lib/gcc/i686-w64-mingw32/:/usr/lib/gcc/i686-w64-mingw32/4.6/:/usr/lib/gcc/i686-w64-mingw32/:/usr/lib/gcc/i686-w64-mingw32/4.6/../../../../i686-w64-mingw32/bin/i686-w64-mingw32/4.6/:/usr/lib/gcc/i686-w64-mingw32/4.6/../../../../i686-w64-mingw32/bin/

libraries: =/usr/lib/gcc/i686-w64-mingw32/4.6/:/usr/lib/gcc/i686-w64-mingw32/4.6/../../../../i686-w64-mingw32/lib/i686-w64-mingw32/4.6/:/usr/lib/gcc/i686-w64-mingw32/4.6/../../../../i686-w64-mingw32/lib/../lib/:/usr/lib/gcc/i686-w64-mingw32/4.6/../../../../i686-w64-mingw32/lib/

从打印可以看出,交叉编译器并不会从当前系统目录下搜索头文件和库,所以不需要担心在交叉编译器会搞混。注意:如果在CFLAGS中使用—sysroot指定root的位置的话,用户自定义的-I,-L都会以--sysroot指定的root为root


3. gd扩展库编译方式

对于编译gd扩展库,存在两种方法,下面分别说明:

1)直接和php集成,编译进最终的php可执行文件中,在php v4.x.x版本之后php的源代码里面就带了gd扩展库的源代码(在源代码树ext/gd下面)(具体版本为多少不关心,我也不是搞php的,反正v5.x.x肯定是这样的~),在执行./configure编译php时带上—with-gd的选项就表明将gd编译进php,不过php官方说gd库还依赖libpng和libjpeg,而libpng又依赖libz,所以在./configure的选项中必须同时指定这三个库的位置,以下为我的编译选项:

runsisi@runsisi-Aspire-4736Z:~/Desktop/php/php-5.4.7$ export CC=arm-linux-gnueabi-gcc

runsisi@runsisi-Aspire-4736Z:~/Desktop/php/php-5.4.7$./configure --prefix=/home/runsisi/target --with-gd --disable-libxml --disable-dom --with-zlib-dir=/home/runsisi/target --with-jpeg-dir=/home/runsisi/target --with-png-dir=/home/runsisi/target --host=arm-linux --disable-simplexml --disable-xml --disable-xmlreader --disable-xmlwriter --without-pear –disable-phar

注意五个用特殊颜色标记出来了的部分,紫色部分指定交叉编译器;粉红色—prefix指定make install时php被安装到的位置,这个非常重要,如果不指定,会安装到系统默认的/usr/local下面,而我们交叉编译的php在当前系统是根本无法执行的,这会把系统的php搞乱,所以一定要指定自己的安装路径;绿色的—with-gd表示我们要集成gd库;深红色的选项指定zlib,jpeg,png三个库的位置,注意这三个库也必须是使用交叉编译器编译出来的库;蓝色的—host表明我们现在在进行交叉编译;其他选项不要问我,我只是为了在编译时不出现找不到相应库的错误所以屏蔽掉了那些扩展,具体这些扩展是做什么我也不懂~,最后一个–disable-phar选项简单说下,如果不屏蔽掉,在make最后阶段会出错,解决方法是使用本机的php去打包(具体打包什么我也不知道,makefile里面用到了phar这个扩展功能),因为交叉编译的php不可能运行,所以肯定会出错,phar应该就是个和jar,rar类似的功能,屏蔽掉应该也没什么问题。

2)既然gd库只是个扩展,那么肯定可以单独编译,这应该就是网上所说的什么追加方式进行编译。gd的官网都已经挂了,那么肯定直接使用php维护的gd进行编译。

编译的步骤如下:①切换到php源代码目录ext/gd下面,执行php安装目录下的phpize ②执行configure,make一系列操作,在ext/gd/modules目录下就有gd.so存在了,如果在configure时指定prefix为php的安装目录,那么make install就会把gd的头文件和gd.so都拷贝到php安装目录下去.

所有人都说在编译之前需要执行phpize这个脚本,但是从来没人说为什么,其实这个脚本做的就是得到一些宏定义,为扩展库生成configure脚本等,注意要打开这个文件,对最开始两行的prefix和datarootdir根据当前php实际所在的位置进行修改,比如我当初是把php make install安装在/home/runsisi/target下面,但是后来我把它移到/home/runsisi/Desktop/php-target下面了,那就要做下面相应的修改:

orig:

prefix='/home/runsisi/target'

datarootdir='/home/runsisi/target/php'

modified:

prefix='/home/runsisi/Desktop/php-target'

datarootdir='/home/runsisi/Desktop/php-target/php'


4. 几点讨论

1)使用直接集成gd库的方法时,zlib,png,jpeg库可以是静态库,也可以是动态库,但单独编译gd库时zlib,png,jpeg必须全部是动态库,因为此时gd被编译成动态库,具体原因我这点linker&loader的知识还不够解释:),但拿windows下生成库的种类来看,可以知道具体链接什么库是很很有讲究的。。。

windows下vc生成库时,一般有如下几种选择:

静态库/动态库 Ⓧ debug版/release版 Ⓧ 静态链接/动态链接C运行时库

2)在php的Makefile中有一处宏定义CFLAGS_CLEAN硬编码成了-I/usr/include -g -O2 -fvisibility=hidden,这个地方可能需要修改,其实把-I/usr/include这句去掉都无所谓;在EXTRA_LDFLAGS_PROGRAM后面要加上-ldl,不然会链接出错

3)查看交叉编译好的程序依赖什么库,由于没有现成的ldd,可以使用其他工具,如:

runsisi@runsisi-Aspire-4736Z:~/Desktop/target/bin$ arm-linux-gnueabi-readelf -d php | grep NEEDED

0x00000001 (NEEDED) Shared library: [libdl.so.2]

0x00000001 (NEEDED) Shared library: [libm.so.6]

0x00000001 (NEEDED) Shared library: [libgcc_s.so.1]

0x00000001 (NEEDED) Shared library: [libc.so.6]

0x00000001 (NEEDED) Shared library: [ld-linux.so.3]

4)静态库的链接顺序很重要,如果liba依赖libb,请以这样指定链接顺序:-la -lb

5)如果静态库的链接存在循环依赖问题,请使用ld的--start-group archives –end-group选项


5. 具体的编译步骤,分上述的两种方式进行

1)集成进php的方式(默认都动态链接zlib,png,jpeg等库,如果目录下同时存在静态库和动态库,gcc会默认选择静态库进行链接)(假设php,libz,libpng,libjpeg的源代码压缩包都在同一个目录下)

首先设置交叉编译器(以arm gcc为例)

$ export CC=arm-linux-gnueabi-gcc

①编译zlib

$ tar xvzf zlib-1.2.7.tar.gz

$ cd zlib-1.2.7/

$ ./configure –prefix=/home/runsisi/target

出现错误:

./ztest8154: 1: ./ztest8154: Syntax error: word unexpected (expecting ")")

Looking for a four-byte integer type... Not found.

由于zlib并非使用的标准autotools,没有考虑交叉编译的情况,这个错误是执行测试程序导致的,用于检测32bit整型是int还是long还是别的,该错误无关紧要,忽略即可

$ make

$ make install

②编译libpng

$ cd ..

$ tar xvzf libpng-1.5.12.tar.gz

$ cd libpng-1.5.12/

注意使用CFLAGS指定zlib的位置

$ ./configure --prefix=/home/runsisi/target CFLAGS="-I/home/runsisi/target/include -L/home/runsisi/target/lib" –host=arm-linux

$ make

$ make install

③编译libjpeg

$ cd ..

$ tar xvzf jpegsrc.v8d.tar.gz

$ cd jpeg-8d/

$ ./configure --prefix=/home/runsisi/target –host=arm-linux

$ make

$ make install

④编译php

$ cd ..

$ tar xvf php-5.4.7.tar

$ ./configure --prefix=/home/runsisi/target --with-gd --disable-libxml --disable-dom --with-zlib-dir=/home/runsisi/target --with-jpeg-dir=/home/runsisi/target --with-png-dir=/home/runsisi/target --host=arm-linux --disable-simplexml --disable-xml --disable-xmlreader --disable-xmlwriter --without-pear –disable-phar

打开php-5.4.7/Makefile

修改67行附近CFLAGS_CLEAN = -I/usr/include -g -O2 -fvisibility=hidden为:

CFLAGS_CLEAN = -g -O2 -fvisibility=hidden

修改76行附近EXTRA_LDFLAGS_PROGRAM = -L/home/runsisi/target/lib为:

EXTRA_LDFLAGS_PROGRAM = -L/home/runsisi/target/lib -ldl

$ make

$ make install

⑤将/home/runsisi/target目录下php及依赖的动态库libz,libpng,libjpeg等打包好即可

查看php依赖的动态库如下:

runsisi@runsisi-Aspire-4736Z:~/target/bin$ arm-linux-gnueabi-readelf -d php | grep NEEDED

0x00000001 (NEEDED) Shared library: [libdl.so.2]

0x00000001 (NEEDED) Shared library: [libpng15.so.15]

0x00000001 (NEEDED) Shared library: [libz.so.1]

0x00000001 (NEEDED) Shared library: [libjpeg.so.8]

0x00000001 (NEEDED) Shared library: [libm.so.6]

0x00000001 (NEEDED) Shared library: [libgcc_s.so.1]

0x00000001 (NEEDED) Shared library: [libc.so.6]

0x00000001 (NEEDED) Shared library: [ld-linux.so.3]

整个安装目录(/home/runsisi/target)下的文件如下:

.

├── bin

│   ├── cjpeg

│   ├── djpeg

│   ├── jpegtran

│   ├── libpng15-config

│   ├── libpng-config -> libpng15-config

│   ├── php

│   ├── php-cgi

│   ├── php-config

│   ├── phpize

│   ├── rdjpgcom

│   └── wrjpgcom

├── include

│   ├── jconfig.h

│   └── ...

├── lib

│   ├── libjpeg.a

│   ├── libjpeg.la

│   ├── libjpeg.so -> libjpeg.so.8.4.0

│   ├── libjpeg.so.8 -> libjpeg.so.8.4.0

│   ├── libjpeg.so.8.4.0

│   ├── libpng15.a

│   ├── libpng15.la

│   ├── libpng15.so -> libpng15.so.15.12.0

│   ├── libpng15.so.15 -> libpng15.so.15.12.0

│   ├── libpng15.so.15.12.0

│   ├── libpng.a -> libpng15.a

│   ├── libpng.la -> libpng15.la

│   ├── libpng.so -> libpng15.so

│   ├── libz.a

│   ├── libz.so -> libz.so.1.2.7

│   ├── libz.so.1 -> libz.so.1.2.7

│   ├── libz.so.1.2.7

│   ├── php

│   │   └── build

│   │   ├── acinclude.m4

│   │   ├── config.guess

│   │   ├── config.sub

│   │   ├── libtool.m4

│   │   ├── ltmain.sh

│   │   ├── Makefile.global

│   │   ├── mkdep.awk

│   │   ├── phpize.m4

│   │   ├── run-tests.php

│   │   ├── scan_makefile_in.awk

│   │   └── shtool

│   └── pkgconfig

│   ├── libpng15.pc

│   ├── libpng.pc -> libpng15.pc

│   └── zlib.pc

├── php

│   └── ...

└── share

└── ...

42 directories, 309 files

2)单独编译gd扩展库的方式

①首先设置交叉编译器

②libz,libpng,libjpeg同样需要按照第一种方式进行交叉编译

③假设libz,libpng,libjpeg安装在/home/runsisi/libs-target中,而php编译make install时的位置在/home/runsisi/target中,但后来移动至/home/runsisi/Desktop/php-target中

④打开/home/runsisi/Desktop/php-target/bin/phpize,在第4行附近,修改:

prefix='/home/runsisi/target'

datarootdir='/home/runsisi/target/php'

为:

prefix='/home/runsisi/Desktop/php-target'

datarootdir='/home/runsisi/Desktop/php-target/php'

⑤打开/home/runsisi/Desktop/php-target/bin/php-config
第4行附近,修改:

prefix="/home/runsisi/target"

datarootdir="/home/runsisi/target/php"

为:

prefix="/home/runsisi/Desktop/php-target"

datarootdir="/home/runsisi/Desktop/php-target/php"

在第11行附近,修改:

ldflags=" -L/home/runsisi/target/lib"

为指向libz,libpng,libjpeg的安装位置

ldflags=" -L/home/runsisi/target/libs-target"

在13行附近,修改

extension_dir='/home/runsisi/target/lib/php/extensions/no-debug-non-zts-20100525'

为:

extension_dir='/home/runsisi/Desktop/php-target/lib/php/extensions/no-debug-non-zts-20100525'

⑥开始编译gd扩展库

$ tar xvf php-5.4.7.tar

$ cd php-5.4.7/ext/gd

$ /home/runsisi/Desktop/php-target/bin/phpize

$ ./configure --prefix=/home/runsisi/Desktop/php-target --host=arm-linux --with-php-config=/home/runsisi/Desktop/php-target/bin/php-config --with-zlib-dir=/home/runsisi/libs-target --with-png-dir=/home/runsisi/libs-target --with-jpeg-dir=/home/runsisi/libs-target

$ make

$ make install

查看gd.so依赖的动态库如下:

runsisi@runsisi-Aspire-4736Z:~/Desktop/php-target/lib/php/extensions/no-debug-non-zts-20100525$ arm-linux-gnueabi-readelf -d gd.so | grep NEEDED

0x00000001 (NEEDED) Shared library: [libpng15.so.15]

0x00000001 (NEEDED) Shared library: [libz.so.1]

0x00000001 (NEEDED) Shared library: [libjpeg.so.8]

0x00000001 (NEEDED) Shared library: [libc.so.6]

0x00000001 (NEEDED) Shared library: [ld-linux.so.3]

php-target下面的文件如下:

.

├── bin

│   ├── php

│   ├── php-cgi

│   ├── php-config

│   └── phpize

├── include

│   └── ...

├── lib

│   └── php

│   ├── build

│   │   ├── acinclude.m4

│   │   ├── config.guess

│   │   ├── config.sub

│   │   ├── libtool.m4

│   │   ├── ltmain.sh

│   │   ├── Makefile.global

│   │   ├── mkdep.awk

│   │   ├── phpize.m4

│   │   ├── run-tests.php

│   │   ├── scan_makefile_in.awk

│   │   └── shtool

│   └── extensions

│   └── no-debug-non-zts-20100525

│   └── gd.so

└── php

└── ...

37 directories, 263 files


/Files/runsisi/php-gd安装.pdf

 

posted @ 2012-10-08 22:09 runsisi 阅读(2937) | 评论 (0)编辑 收藏

好久没来啦~
posted @ 2012-08-30 22:47 runsisi 阅读(147) | 评论 (0)编辑 收藏

仅列出标题
共5页: 1 2 3 4 5