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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
LIGHTTPD_DIR=$(shell pwd) SRC_DIR=$(LIGHTTPD_DIR)/lighttpd-1.4.43 BASE_LIB=$(LIGHTTPD_DIR)/../SGA_3.5.2.0/code/base_lib #CL_CFLAGS += -D__CL_DEBUG_ENABLE__ CL_CFLAGS += -D_CL_BUILD_ all: echo $LIGHTTPD_DIR$SRC_DIR test -f $(SRC_DIR)/Makefile || { cd $(SRC_DIR); CFLAGS="-I$(BASE_LIB) $(CL_CFLAGS)" LDFLAGS="-L$(BASE_LIB) -lbase" $(SRC_DIR)/configure --prefix=/app/lighty/ --with-openssl --with-pcre --no-recursion --disable-ipv6 ;} make -C $(SRC_DIR) cp -af $(SRC_DIR)/src/.libs/*.so ./libs/ cp -af $(SRC_DIR)/src/lighttpd . install: cp -af $(SRC_DIR)/src/.libs/*.so ./libs/ cp -af $(SRC_DIR)/src/lighttpd . clean: rm -rf $(LIGHTTPD_DIR)/libs/* rm -rf $(LIGHTTPD_DIR)/lighttpd make -C $(SRC_DIR) clean distclean: make -C $(SRC_DIR) distclean |
目前我还存在的疑问:现在我编译samba的时候,我发现我配置完prefix后,编译可以通过了,但是当我做make install 的时候,install到自己的目录的时候会出错,也就是:make install DESTDIR=”samba/BIN/”
但是如果我配置prefix目录为 “samba/bin/” 的时候,我make install 的时候回正常,但是当我放进去板子跑的时候又会出现连接库文件的时候找不到,出现运行出错.
目前这个问题我还不知道怎么解决,还期待有人可以指导指导这样的问题该怎么配置会比较好。
写得不对的欢迎拍砖.
本文章版权归作者所有,如有转载,请注原始出处,并通知作者.