參考文章:
http://wenku.baidu.com/view/94e08a20a5e9856a561260e2.html
http://httpd.apache.org/docs/2.4/install.html
工作中需要在MIPS平臺(tái)的板子上移植apache,折騰一個(gè)星期,初步搞定,移植過程記錄如下:
開發(fā)機(jī)軟硬件平臺(tái):
開發(fā)板軟硬件平臺(tái):
移植的宏觀思路是:
1.開發(fā)機(jī)端
1)配置:./configure
2)交叉編譯:make
3)安裝:makeinstall
2.開發(fā)板端
1)下載apache安裝目錄到板子的/usr/local下
2)配置httpd.conf
3)驗(yàn)證
詳細(xì)移植過程如下:
1.開發(fā)機(jī)端
1.1配置:./configure
首先指定安裝目錄(PRefix),編譯器(CC),平臺(tái)名(host),庫(kù)的路徑(--with-included-apr)
./configure--prefix=/usr/local/apacheCC=mips64-octeon-linux-gnu-gcc--host=mips-linux--with-included-apr
提示錯(cuò)誤:checkingfor/dev/zero...configure:error:cannotcheckforfileexistencewhencrosscompiling
添加配置選項(xiàng):ac_cv_file__dev_zero=yes
繼續(xù)
./configure--prefix=/usr/local/apacheCC=mips64-octeon-linux-gnu-gcc--host=mips-linux--with-included-aprac_cv_file__dev_zero=yes
提示錯(cuò)誤:checkingwhethersetpgrptakesnoargument...configure:error:cannotchecksetpgrpwhencrosscompiling
添加配置選項(xiàng):ac_cv_func_setpgrp_void=yes
繼續(xù)
./configure--prefix=/usr/local/apacheCC=mips64-octeon-linux-gnu-gcc--host=mips-linux--with-included-aprac_cv_file__dev_zero=yesac_cv_func_setpgrp_void=yes
錯(cuò)誤提示:configure:error:cannotruntestprogramwhilecrosscompiling
進(jìn)入./srclib/apr目錄,修改configure文件,搜索cannotruntestprogramwhilecrosscompiling
一共三處,將下圖中陰影部分注釋掉
繼續(xù)
./configure--prefix=/usr/local/apacheCC=mips64-octeon-linux-gnu-gcc--host=mips-linux--with-included-aprac_cv_file__dev_zero=yesac_cv_func_setpgrp_void=yes
錯(cuò)誤提示:configure:error:Sizeof"void*"islessthansizeof"long"
添加配置參數(shù):ap_cv_void_ptr_lt_long=no
繼續(xù)
./configure--prefix=/usr/local/apacheCC=mips64-octeon-linux-gnu-gcc--host=mips-linux--with-included-aprac_cv_file__dev_zero=yesac_cv_func_setpgrp_void=yesap_cv_void_ptr_lt_long=no
配置通過
1.2交叉編譯:make
執(zhí)行make命令
錯(cuò)誤提示:/bin/sh:tools/gen_test_char:cannotexecutebinaryfile
進(jìn)入./srclib/apr/tools/
MIPS平臺(tái)的可執(zhí)行文件當(dāng)然不能在X86平臺(tái)運(yùn)行,手動(dòng)生成x86平臺(tái)的可執(zhí)行文件,執(zhí)行
gcc-Wall-O2-DCROSS_COMPILEgen_test_char.c-s-ogen_test_char
./gen_test_char>./include/private/apr_escape_test_char.h
修改./srclib/apr/下的Makefile文件,注釋掉圖示兩行
返回繼續(xù)make
錯(cuò)誤提示:./include/apr_want.h:95:error:redefinitionof'structiovec'
修改./srclib/apr/include/apr_want.h,注釋掉structiovec的定義
返回繼續(xù)make
錯(cuò)誤提示:./dftables:./dftables:cannotexecutebinaryfile
進(jìn)入./srclib/pcre/
執(zhí)行
gcc-Wall-O2-DCROSS_COMPILEdftables.c-s-odftables
返回繼續(xù)make
錯(cuò)誤提示:/bin/sh:./gen_test_char:cannotexecutebinaryfile
進(jìn)入./server
執(zhí)行
gcc-Wall-O2-DCROSS_COMPILEgen_test_char.c-s-ogen_test_char
返回繼續(xù)make
錯(cuò)誤提示:undefinedreferenceto`apr_procattr_limit_set'
好吧,這個(gè)錯(cuò)誤網(wǎng)上查了半天,發(fā)現(xiàn)是./configure的時(shí)候少了一個(gè)配置項(xiàng),從頭再來吧
makeclean
終極配置命令:
./configure--prefix=/usr/local/apacheCC=mips64-octeon-linux-gnu-gcc--host=mips-linux--with-included-aprac_cv_file__dev_zero=yesac_cv_func_setpgrp_void=yesap_cv_void_ptr_lt_long=noac_cv_struct_rlimit=yes
make
編譯通過
1.3安裝:makeinstall
理論上接下來的動(dòng)作應(yīng)該是:makeinstall
但是在makeinstall之前,我要臨時(shí)改一下安裝路徑(下面的路徑不固定,可根據(jù)自己的需要修改):
exportDESTDIR=$NPU_APP_DIR/portable/cavium/execute/local/apache_tmp
然后再
makeinstall
下面講一下原因:
apache依賴三個(gè)庫(kù),apr,apr-util,pcre,在httpd-2.2.27版本中,這三個(gè)庫(kù)的源碼均與apache源碼綁定在一起,在srclib目錄下,編譯apache的時(shí)候,這三個(gè)庫(kù)也一起被編譯了
上面./configure時(shí),我之所以要把安裝目錄指定為/usr/local/apache,是因?yàn)槲掖蛩惆補(bǔ)pache的安裝目錄放在板子的/usr/local/apache下,運(yùn)行/usr/local/apache/bin/httpd時(shí),程序會(huì)自動(dòng)在/usr/local/apache下搜尋依賴的庫(kù)文件。
要生成安裝目錄就必須makeinstall,makeinstall是將源碼目錄下的相應(yīng)文件拷貝到安裝目錄下,./configure時(shí)我指定的安裝路徑為/usr/local,但是我在開發(fā)機(jī)上并沒有root權(quán)限,無法寫/usr/local目錄,只能寫我的home目錄(/home/tanghuimin),怎樣臨時(shí)修改makeinstall的安裝路徑呢?
查看Makefile文件,搜索關(guān)鍵字“install”,發(fā)現(xiàn)安裝文件都是放在基于$DESTDIR的路徑下的,那修改$DESTDIR就能修改安裝路徑了,終端下執(zhí)行
exportDESTDIR=$NPU_APP_DIR/portable/cavium/execute/local/apache_tmp
再
makeinstall
$NPU_APP_DIR/portable/cavium/execute/local/apache_tmp/usr/local/apache下便是自動(dòng)生成的apache安裝目錄了
2開發(fā)板端
2.1下載apache安裝目錄到板子的/usr/local下
將$NPU_APP_DIR/portable/cavium/execute/local/apache_tmp/usr/local/下的apache目錄打個(gè)包,ftp或其他方式,下載到板子的/usr/local/下,解壓,進(jìn)入/usr/local/apache目錄
2.2配置httpd.conf
接下來修改相關(guān)配置文件:
apache無法以root用戶運(yùn)行,修改/etc/passwd和/etc/group文件,新增nobody用戶名和nobody工作組名。
在/etc/passwd中添加一行:
nobody::65534:65533:nobody:/:/bin/sh
在/etc/group中添加:
nobody::65533:
nogroup::65534:nobody
修改/usr/local/apache/conf/httpd.conf文件
1)修改用戶名和用戶組名為nobody
2)修改ServerName為板子的ip地址,我的為192.168.15.29
3)修改監(jiān)聽端口,我的為8080
2.3驗(yàn)證
在瀏覽器窗口輸入網(wǎng)址:http://192.168.15.29:8080/
成功!
后記:曾經(jīng)試過http 2.4.9的移植,但因?yàn)樵?.4.9版本中,三個(gè)庫(kù)(apr,apr-util, pcre)的源碼沒有包含在http源碼中,需要外部安裝,而我又沒有開發(fā)機(jī)的root權(quán)限,導(dǎo)致移植過程中有些動(dòng)作沒有辦法完成,故轉(zhuǎn)向低版本的http 2.2.7,http 2.2.7源碼中包含了三個(gè)庫(kù)文件的源碼,無需外部安裝庫(kù)文件。
附件:
MIPS平臺(tái)移植apache_2_2_7.zip
草稿_MIPS平臺(tái)移植apache_2_4_9.zip
新聞熱點(diǎn)
疑難解答
圖片精選