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