goahead移植到Android

转载请标明出处:http://blog.csdn.net/u013752202/article/details/78569470
goahead简介:
goahead是嵌入式开发常用的开源的http服务器(Web Server),作为针对嵌入式设计的服务程序,goahead体积小巧、内存消耗低、CPU占用少,支持跨平台。作为开源的http服务器,goahead功能强大,版本更新速度快,兼容最新的Web技术。(个人测试觉得比boa好用,在嵌入式资源跑Apache吃力的时候goahead绝对是很好的选择)
移植到Android系统:
这里的说的Android开发,是指嵌入式Android系统开发,跟Android app开发不同的是,嵌入式Android开发需要自己对Android源代码进行裁剪定制。
1.libgo.so 编译
(1)保持原来的Makefile中的变量等不变,找到libgo.so的所有依赖文件,和编译FLAG(包括CFLAGS/DFLAGS/LDFLAGS等),然后依赖文件赋值给LOCAL_SRC_FILES,所有的FLAG赋值给LOCAL_CFLAGS,再指定LOCAL_C_INCLUDES的目录,其他的按照Android.mk的规则就行。其中-lrt,-lpthread,-ldl,-lm等Android会自动链接,无需显示的指定。
(2)编译过程中可能会遇到一些问题:
a. error: storage class specified for parameter "..."
error: expected declaration specifiers before "..."
源文件中有无法识别的符号导致,很有可能linux系统下的宏被Android裁剪掉了。找到这个宏,要么重新定义,要么删除。
比如: extern int pthread_mutexattr_settype (pthread_mutexattr_t *__attr, int __kind) __THROW;
__THROW这个宏在Android里面被裁剪掉了,所以直接去掉即可。
b. static char *getpass(char *prompt)这个函数本来是linux下unistd.h里面声明的函数,在Android中的unistd.h中也被裁剪掉了,这个函数不能直接删除,那么就必须重新实现。
在Android.mk中的LOCAL_CFLAG里面加上-DANDROID,然后在代码中实现static char *getpass(char *prompt)。
#ifdef ANDROID
#define MAX_PASS    64
static char *getpass(char *prompt)
{
    static char password[MAX_PASS];
    int     c, i;
 
    fputs(prompt, stdout);
    for (i = 0; i < (int) sizeof(password) - 1; i++) {
 
        c = getchar();
 
        if (c == '\r' || c == EOF) {
            break;
        }
        if ((c == '\b' || c == 127) && i > 0) {
            password[--i] = '\0';
            fputs("\b \b", stdout);
            i--;
        } else if (c == 26) {           /* Control Z */
            c = EOF;
            break;
        } else if (c == 3) {            /* Control C */
            fputs("^C\n", stdout);
            exit(255);
        } else if (!iscntrl((uchar) c) && (i < (int) sizeof(password) - 1)) {
            password[i] = c;
            fputc('*', stdout);
        } else {
            fputc('', stdout);
            i--;
        }
    }
    if (c == EOF) {
        return "";
    }
    fputc('\n', stdout);
    password[i] = '\0';
    return sclone(password);
}
#endif
下面是Android.mk的libgo.so部分
#
#   goahead-linux-default.mk -- Makefile to build Embedthis GoAhead for linux
#
LOCAL_PATH:= $(call my-dir)
###########################################libgo.go############################################
include $(CLEAR_VARS)
NAME                  := goahead
VERSION               := 3.6.3
PROFILE               ?= default
ARCH                  ?= $(shell uname -m | sed 's/i.86/x86/;s/x86_64/x64/;s/arm.*/arm/;s/mips.*/mips/')
CC_ARCH               ?= $(shell echo $(ARCH) | sed 's/x86/i686/;s/x64/x86_64/')
OS                    ?= linux
CC                    ?= gcc
CONFIG                ?= $(OS)-$(ARCH)-$(PROFILE)
BUILD                 ?= build/$(CONFIG)
LBIN                  ?= $(BUILD)/bin
PATH                  := $(LBIN):$(PATH)
ME_COM_COMPILER       ?= 1
ME_COM_LIB            ?= 1
ME_COM_MATRIXSSL      ?= 0
ME_COM_MBEDTLS        ?= 1
ME_COM_NANOSSL        ?= 0
ME_COM_OPENSSL        ?= 0
ME_COM_OSDEP          ?= 1
ME_COM_SSL            ?= 1
ME_COM_VXWORKS        ?= 0
ME_COM_OPENSSL_PATH   ?= "/usr/lib"
ifeq ($(ME_COM_LIB),1)
    ME_COM_COMPILER := 1
endif
ifeq ($(ME_COM_MBEDTLS),1)
    ME_COM_SSL := 1
endif
ifeq ($(ME_COM_OPENSSL),1)
    ME_COM_SSL := 1
endif
CFLAGS                += -fPIC -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Wl,-z,relro,-z,now -Wl,--as-needed -Wl,--no-copy-dt-needed-entries -Wl,-z,noexecstatck -Wl,-z,noexecheap -w
DFLAGS                += -DME_DEBUG=1 -D_REENTRANT -DPIC -D_FORTIFY_SOURCE=2 $(patsubst %,-D%,$(filter ME_%,$(MAKEFLAGS))) -DME_COM_COMPILER=$(ME_COM_COMPILER) -DME_COM_LIB=$(ME_COM_LIB) -DME_COM_MATRIXSSL=$(ME_COM_MATRIXSSL) -DME_COM_MBEDTLS=$(ME_COM_MBEDTLS) -DME_COM_NANOSSL=$(ME_COM_NANOSSL) -DME_COM_OPENSSL=$(ME_COM_OPENSSL) -DME_COM_OSDEP=$(ME_COM_OSDEP) -DME_COM_SSL=$(ME_COM_SSL) -DME_COM_VXWORKS=$(ME_COM_VXWORKS)
IFLAGS                += "-I$(BUILD)/inc"
LDFLAGS               += '-rdynamic' '-Wl,--enable-new-dtags' '-Wl,-rpath,$$ORIGIN/'
LIBPATHS              += -L$(BUILD)/bin
LIBS                  += -lrt -ldl -lpthread -lm
DEBUG                 ?= debug
CFLAGS-debug          ?= -g
DFLAGS-debug          ?= -DME_DEBUG
LDFLAGS-debug         ?= -g
DFLAGS-release        ?=
CFLAGS-release        ?= -O2
LDFLAGS-release       ?=
CFLAGS                += $(CFLAGS-$(DEBUG))
DFLAGS                += $(DFLAGS-$(DEBUG))
LDFLAGS               += $(LDFLAGS-$(DEBUG))
LDFLAGS+=-D_FILE_OFFSET_BITS=64 -D_FILE_OFFSET_BITS=64 -DMBEDTLS_USER_CONFIG_FILE=\"embedtls.h\"
#defined by myself
LDFLAGS+=-DANDROID
LOCAL_SRC_FILES:=  src/action.c \
               src/alloc.c \
               src/auth.c \
               src/cgi.c \
               src/crypt.c \
               src/file.c \
               src/fs.c \
               src/http.c \
               src/js.c \
               src/jst.c \
               src/options.c \
               src/osdep.c \
               src/rom.c \
               src/route.c \
               src/runtime.c \
               src/socket.c \
               src/time.c \
               src/upload.c \
               src/mbedtls/mbedtls.c \
               src/goahead-mbedtls/goahead-mbedtls.c \
               src/goahead-openssl/goahead-openssl.c
LOCAL_C_INCLUDES:=$(LOCAL_PATH)/src/ \                       $(LOCAL_PATH)/build/linux-x64-default/inc/
LOCAL_CFLAGS:=$(CFLAGS)
LOCAL_CFLAGS+=$(DFLAGS)
LOCAL_CFLAGS+=$(LDFLAGS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_OWNER := zhanghw
LOCAL_MODULE := libgo
include $(BUILD_SHARED_LIBRARY)
2.goahead编译
紧接上面的写,这里需要依赖上面生成的libgo.so,
LOCAL_SHARED_LIBRARIES:=libgo
下面是 goahead部分:
################################goahead####################################
include $(CLEAR_VARS)
LOCAL_SRC_FILES=src/goahead.c \
        src/mbedtls/mbedtls.c \
        src/goahead-mbedtls/goahead-mbedtls.c \
        src/goahead-openssl/goahead-openssl.c
LOCAL_C_INCLUDES:=$(LOCAL_PATH)/src/ \
                               $(LOCAL_PATH)/build/linux-x64-default/inc/
LOCAL_SHARED_LIBRARIES:=libgo
LOCAL_CFLAGS:=$(CFLAGS)
LOCAL_CFLAGS+=$(DFLAGS)
LOCAL_CFLAGS+=$(LDFLAGS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_OWNER := zhanghw
LOCAL_MODULE := goahead
include $(BUILD_EXECUTABLE)
3.goahead-test和gopass的编译也是一样,这里用不到,所以不编译进去。
4.配置文件拷贝和相关目录建立
紧接上面的Android.mk:
##################################copy config files###########################
include $(CLEAR_VARS)
$(shell mkdir -p $(TARGET_OUT_DATA))
$(shell cp -rf $(LOCAL_PATH)/goaheadconf/goahead/ $(TARGET_OUT_DATA)) 

猜你喜欢

转载自blog.csdn.net/u013752202/article/details/78569470