转载请标明出处: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))