2009年6月5日 星期五

lighttpd web server - porting 篇

因為工作的關係,最近在研究一個很輕巧,很好用,而且功能算強大的web server - lighttpd (lighty)

在embedded system porting lighttpd 說實話算是很簡單,在這裡大約介紹一下

1. 到網路上下載 lighttpd,我的版本是 1.4.20. 下載連結請找google大神。
2. 如果只想在x86上面跑,沒有需要cross compile,或是不需要針對function做一些增減的話,可以直接make; make install.
3. 如果是要在embedded system上跑的話,必須要先編寫makefile, 我這裡提供一下範例

TARGETDIR=$(shell pwd)/target
SSL_CFLAGS += -I$(ROOTDIR)/lib/libssl/include/

CONFIGURE_CFG = \
--host=$(CROSS_COMPILE:-=) \
--target="" \
--build="" \
--htmldir="/www" \
--disable-ipv6 \
PCRECONFIG="$(ROOTDIR)/lib/pcre-7.8/pcre-config" \
PCRE_LIB="-L$(ROOTDIR)/lib/pcre-7.8/.libs -lpcre"

# --with-pcre="$(ROOTDIR)/lib/pcre-7.6" \

CONFIGURE_CFG += \
--with-pcre \
--without-bzip2 \
--without-zlib \
--with-openssl \
--with-openssl-libs=$(ROOTDIR)/lib/libssl/ \
--with-openssl-includes=$(ROOTDIR)/lib/libssl/include/

all: wwwlink Makefile
AM_MAKEFLAGS="-f Makefile" \
$(MAKE) -f Makefile

# CFLAGS="$(SSL_CFLAGS) -I$(ROOTDIR)/lib/pcre-7.6/" LDFLAGS="$(SSL_LDFLAGS) -L$(ROOTDIR)/lib/pcre-7.6/.libs -lpcre" LIBS="$(SSL_LIBS)" \
CFLAGS="$(SSL_CFLAGS) -I$(ROOTDIR)/lib/pcre-7.6 -DHAVE_PCRE_H=1 -DHAVE_LIBPCRE=1" \
LDFLAGS="$(SSL_LDFLAGS) -L$(ROOTDIR)/lib/pcre7.6/.lib -lpcre" LIBS="$(SSL_LIBS)" \
CFLAGS="$(SSL_CFLAGS) -I$(ROOTDIR)/lib/pcre-7.6 -DHAVE_PCRE_H=1 -DHAVE_LIBPCRE=1" LDFLAGS="$(SSL_LDFLAGS)" LIBS="$(SSL_LIBS)" \


wwwlink:
-rm -f www
ifeq ($(CONFIG_CTM_WWW_DIR),)
@if [ ! -d $(PRODUCTDIR)/www ] ; then \
echo "ERROR: There is no www directory in $(PRODUCTDIR)/www." ; \
exit 1 ; \
fi
ln -sf $(PRODUCTDIR)/www www
else
@if [ ! -d $(PRODUCTDIR)/$(CONFIG_CTM_WWW_DIR) ] ; then \
echo "ERROR: There is no $(CONFIG_CTM_WWW_DIR) directory in $(PRODUCTDIR)/$(CONFIG_CTM_WWW_DIR)." ; \
exit 1 ; \
fi
ln -sf $(PRODUCTDIR)/$(CONFIG_CTM_WWW_DIR) www
endif


Makefile:
chmod u+x ./configure; \
CFLAGS="$(SSL_CFLAGS) -I$(ROOTDIR)/lib/pcre-7.8/ -DHAVE_PCRE_H=1 -DHAVE_LIBPCRE=1" LDFLAGS="$(SSL_LDFLAGS)" LIBS="$(SSL_LIBS)" \
./configure $(CONFIGURE_CFG)

clean:
rm -rf $(TARGETDIR)
rm -f www
AM_MAKEFLAGS="-f Makefile" \
$(MAKE) -f Makefile distclean

preinstall:
rm -rf $(TARGETDIR)
mkdir -p $(TARGETDIR)
DESTDIR=$(TARGETDIR) \
AM_MAKEFLAGS="-f Makefile" \
$(MAKE) -f Makefile install

romfs:
$(ROMFSINST) -p 755 src/.libs/lighttpd /usr/bin/lighttpd
$(ROMFSINST) -p 755 src/lighttpd-angel /usr/bin/lighttpd-angel
mkdir -p $(ROMFSDIR)/lighttpd_www
$(ROMFSINST) www /lighttpd_www
$(ROMFSINST) -s /var/config.bin /lighttpd_www/config.bin
$(ROMFSINST) -p 755 lighttpd.conf /usr/lighttpd_old.conf
$(ROMFSINST) -p 755 lighttpd.user /usr/lighttpd.user
$(ROMFSINST) -p 755 src/.libs/mod_indexfile.so /usr/local/lib/mod_indexfile.so
$(ROMFSINST) -p 755 src/.libs/mod_access.so /usr/local/lib/mod_access.so
$(ROMFSINST) -p 755 src/.libs/mod_auth.so /usr/local/lib/mod_auth.so
$(ROMFSINST) -p 755 src/.libs/mod_cgi.so /usr/local/lib/mod_cgi.so
$(ROMFSINST) -p 755 src/.libs/mod_ssi.so /usr/local/lib/mod_ssi.so
$(ROMFSINST) -p 755 src/.libs/mod_dirlisting.so /usr/local/lib/mod_dirlisting.so
$(ROMFSINST) -p 755 src/.libs/mod_staticfile.so /usr/local/lib/mod_staticfile.so
$(ROMFSINST) -p 755 src/.libs/mod_evasive.so /usr/local/lib/mod_evasive.so
$(ROMFSINST) -p 755 src/.libs/mod_setenv.so /usr/local/lib/mod_setenv.so
$(ROMFSINST) -p 755 src/.libs/mod_redirect.so /usr/local/lib/mod_redirect.so
$(ROMFSINST) -p 755 server.pem /usr/server.pem

4. 請注意,我在這裡遇到的第1個問題是,pcre的問題,看的出來,lighttpd和pcre有dependence的關係,要能成功的讓lighttpd 找到 pcre的resource,你必須要像我這樣寫,不然,lighttpd會去reference到你本機的pcre,也就是說,就算你build 好了,丟到板子上,也不會動,因為他會說 pcre is not supported.

5. 在romfs方面,則要看你想包什麼功能進去,所以這裡建議,用到什麼包什麼,不要全部包包進去,除非沒有空間限制。

6. 到這裡,打make下去,應該在 src/ 下找到 lighttpd-angel, 和 src/.lib/ 下找到 lighttpd 和一堆 mod_xxx.so。 這些都是最後要等到target board上的必要檔案。

Porting 到這裡,應該算是成功,接下來就要看你把檔案等到target board上能不能動了。

1 則留言:

匿名 提到...

你好:請問一下,假若我porting完,出現lighttpd: symbol 'pcre_free': can't handle reloc type 0x7e的錯誤,會是哪邊有問題呢?謝謝。