全部博文(83)
分类: 系统运维
2009-07-14 13:24:40
引用请注明出处:http://blog.chinaunix.net/u1/45185/showart_1995662.html
最近在添加LDAP的Client function到vxworks OS去,但网上找了很久没有找到vxworks相应的Open Source,所以只好用OpenLDAP进行移植了,
但网上也没有找到关于OpenLDAP移植到vxworks的文章.所以把我的移植之路共享出来,供大家参考。
1. 先讲讲OpenLDAP在linux下面的build&install过程。
1.1 ./configure
后面添加一些参数,如--prefix,--enable-xxxx,--build,--target,--host 这个可以按照需求添加. configure的作用包括:
1.1.1 通过头文件来找目标系统所支持的功能和module,检测完成以后会把宏定义写在xxxx/include/portable.h 头文件里面,在后面的Compile时候会用到。接下来的移植工作也会用到这个头文件。
1.1.2 在每个文件夹下自动生成Makefile,其中使用的模版就是xxx/build/top.mk. 这些Makefile 是compile 资源文件的必要条件。
1.2. make depend
这个就是在每个文件夹下面自动生成的Makefile里面添加依赖.
1.3. make
用上面生成的Makefile文件真正的Compile资源文件。
1.4. make test
自动生成example的server配置.这个要用root 权限。
1.5. make install
把生产的elf可执行文件添加到系统目录,以后要运行OpenLDAP server不用去安装目录去执行操作,而是任何目录。
上面的5步是移植过程中必须知道的东西。下面的移植也是按照上面步骤来的。
2. 现在普及下交叉编译的知识。
详情请看:http://blog.chinaunix.net/u1/45185/showart_527681.html
现在要Build vxworks 认得的lib,这个时候就不能用原来的gcc,ar,ld,ranlib,...了,而是需要与vxworks对应的编译环境。
幸好vxworks已经给了我们编译好了的编译环境gcc->ccmips, ar->armips, ld->ldmips, ranlib->ranlibmips, ...
在后面的compile就需要重载这些编译器.
3. 现在构建下如何把OpenLDAP 放到vxworks里面去.
3.1 直接添加文件,并手动添加Makefile,然后统一build出Image.
这种方法可行,但在以后的build新的image时候,每次都要跑这个模块,太费时间了,而且手痛添加Makefile 很累,这种方法不推荐.
3.2 先build出OpenLDAP的 LIB,然后在build出vxworks Image 之前link 进去。
这种方法简便快捷,也减少了以后build vxwoks image 的时间,有所谓build一次后人无限享用。
4.下面就进入正题了---Porting OpenLDAP to vxworks
4.1. 我当前的交叉编译环境是Cygwin。同时也要设置环境变量,把PATH环境变量添加vxworks编译环境的bin目录。这样可以直接运行bin下面的编译器了。其中OpenLdap版本是
4.2. 进入OpenLDAP source code目录下,打开configure文件并修改其中的一部分,因为OpenLDAP没有添加Vxworks编译器的条件判断。结果请看附件
|
4.2.1
|
上面的意思就是重载原来的Cygwin编译环境为Vxworks编译环境。
4.2.2 搜索----echo "$as_me:$LINENO: result: $ac_cv_func_select" >&5---,并更改如下:
|
上面的意思就是忽略select函数check,因为vxworks的select()函数存在的头文件位置和linux下的存放位置不同。
4.2.3 搜索----error: POSIX regex required.----并更改如下:
|
上面的意思就是忽略正则表达式(regex)功能,这个功能server用得到,Client用不到.
4.2.4 搜索----error: broken POSIX regex!----并更改如下:
|
上面的意思就是忽略POSIX regex正则表达式的check,这个功能server用得到,Client用不到.
4.2.5
|
上面的意思就是忽略POSIX Threads的check,因为vxworks的select()函数存在的头文件位置和linux下的存放位置不同。不过在重新修改portable.h文件时候要改下。
4.2.6 搜索----BDB/HDB: BerkeleyDB not available----并修改如下:
|
上面的意思就是忽略BerkeleyDB的check,这个功能server用得到,Client用不到.
4.3 进入OpenLDAP目录进行环境参数配置,会在每个目录下面生成Makefile和xx/include/portable.h检测结果。
|
4.4 修改portable.h文件,请参考附件:
文件:
portable.rar
大小:
6KB
下载:
下载
4.5 搜索Makefile和Makefile.in里面的的PROGRAMS关键字,然后删除资源文件定义,因为它里面的资源文件都是test用的,对我们只需要build LIB无关。
4.6 make depend;make 2>&1 | tee ${GG_DIR}/image/${PRODUCT}/BuildLog/ldap.log;
如compile的时候有出错就靠大家自己更改了,只需要更改很小部分,一般都是头文件。
4.7 如果编译成功的话就可以得到想要的LIB了
a) xx/libraries/liblber/.libs/liblber.a
b) xx/libraries/libldap/.libs/libldap.a
c) xx/libraries/libldap_r/.libs/libldap_r.a
4.8 接下来怎么用就不用我说了吧!---^_^
5.在修改code时候碰到的问题。
5.1 显示message:"ldap_pvt_connect: -1"
这时是有个select函数出了问题,在函数ldap_int_poll&ldap_int_select里面具体不明白为什么select里面的第一个参数不能是一个最大值,如:2048,而应该是当前的Socket ID的值+1.即:
|
|
5.2 测试下你们的vxworks下面time()是否有效,如果不能得到值的话就把time()-> tickGet()/sysClkRateGet()
5.3 更改vxworks环境下config文件放置的位置,ldap_config.h
如果有什么问题,大家可以再讨论讨论,QQ:42082806,URL:http://blog.chinaunix.net/u1/45185/showart_1995662.html