如何为现有的openwrt编译一个opkg上没有的软件

如何为现有的openwrt编译一个opkg上没有的软件,第1张

一、安装编译环境(以ubuntu10.10为例)

依次输入以下命令:

1.ubuntu开发环境需要的软件:

sudo

apt-get install gcc g++ binutils patch bzip2 flex bison make autoconf

gettext texinfo unzip sharutils subversion libncurses5-dev ncurses-term

zlib1g-dev gawk

sudo apt-get update

2.创建目录

mkdir openwrt

3.获取OpenWrt源代码和安装包,更新

svn checkout svn://svn.openwrt.org/openwrt/backfire

cd backfire

./scripts/feeds update -a

./scripts/feeds install -a

4.配置编译选项

make menuconfig

在target system里选择Broadcom BCM63xx,根据需要选择其他的软件,

*:表示该模块直接编译到核心中

M:该模块以被核心支持,可以后再安装

空白:不支持该模块

具体模块的起什么作用需要多google;

5.编译选项配置保存后,开始编译

make V=99

V=99表示输出详细的debug信息;

二、编译准备

1.下载源文件

下载地址:http://ftp.awk.cz/cntlm/ ,最新的版本是0.91rc6;

2.获取md5sum码

进入下载文件目录,在终端里输入

md5sum cntlm-0.91rc6.tar.gz

获得md5验证码:21ccd60294269cb8fbe3e2e49374ab1b

3.编写makefile文件

在openwrt/backfire目录中的package目录下新建cntlm目录,在cntlm目录下新建文件,命名为makefile,编辑makefile文件,加入如下内容:

---------------------------------------------------------------------------------------------------------------------------

#

# Copyright (C) 2006-2008 OpenWrt.org

#

# This is free software, licensed under the GNU General Public License v2.

# See /LICENSE for more information.

#

include $(TOPDIR)/rules.mk

PKG_NAME:=cntlm

PKG_VERSION:=0.91rc6

PKG_RELEASE:=1

PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz

PKG_SOURCE_URL:=http://ftp.awk.cz/cntlm/

PKG_MD5SUM:=21ccd60294269cb8fbe3e2e49374ab1b

PKG_INSTALL:=1

include $(INCLUDE_DIR)/package.mk

define Package/cntlm

SUBMENU:=Proxy Servers

SECTION:=net

CATEGORY:=Network

TITLE:=Cntlm is a Fast NTLM Authentication Proxy

URL:=http://cntlm.sourceforge.net/

endef

define Package/cntlm/install

$(INSTALL_DIR) $(1)/usr/sbin

$(CP) $(PKG_INSTALL_DIR)/usr/sbin/cntlm $(1)/usr/sbin/

$(INSTALL_DIR) $(1)/usr/share/man/man1

$(CP) $(PKG_INSTALL_DIR)/usr/share/man/man1/$(PKG_NAME).1 $(1)/usr/share/man/man1

$(INSTALL_DIR) $(1)/etc/

$(CP) $(PKG_INSTALL_DIR)/etc/cntlm.conf $(1)/etc/

endef

$(eval $(call BuildPackage,cntlm))

---------------------------------------------------------------------------------------------------------------------------

4.编写patch文件

由于BCM63xx核心是big

endian,而我们常用的intel或AMD的cpu都是little

endian的,cntlm虽然能够自己检测编译环境的endian,但我们是在交叉编译环境中编译,cntlm检测出来的还是ubuntu系统的endian,因此需要设置手动endian为big

endian。具体就是将源码文件中的config/endian.c文件的rc设定为0.

将源码文件中的endian.c文件分别复制到a目录下的config目录和b目录下的config目录,打开b目录下的config目录中的endian.c文件,并将其修改为:

-------------------------------------------------------------------------------------------------------------------------

#include

#include

int main(int argc, char **argv) {

int rc

rc = 0

printf("%s\n", rc ? "little endian" : "big endian")

return rc

}

---------------------------------------------------------------------------------------------------------------------------

然后保存。

运行:

diff -Naur a/config/endian.c b/config/endian.c >endian.patch

endian.patch文件内容如下:

---------------------------------------------------------------------------------------------------------------------------

--- a/config/endian.c2007-08-20 07:23:17.000000000 +0800

+++ b/config/endian.c2010-11-01 18:36:32.000000000 +0800

@@ -1,15 +1,11 @@

#include

#include

-uint8_t num[] = { 0xEF, 0xBE }

-/*

- * RC: 1 = LE, 0 = BE

- */

int main(int argc, char **argv) {

int rc

-rc = (*((uint16_t *)num) == 0xBEEF)

+rc = 0

printf("%s\n", rc ? "little endian" : "big endian")

return rc

---------------------------------------------------------------------------------------------------------------------------

将endian.patch文件复制到package/cntlm/patches/目录下(没有patches目录就新建一个)。

三、编译

1.选定安装包

终端输入:

make menuconfig

在Network——》Proxy Severs中选择cntlm;

2.开始编译

终端输入:

make package/cntlm/compile V=99

中间可能会出现一些提示(Note),可以不用理会。编译完成后在bin/packages目录下可以看到cntlm_0.91rc6-1_brcm63xx.ipk文件啦。

四、补充

上面提到在编译过程中出会现提示(Note),一般如下:

utils.c:1: note: someone does not honour COPTS correctly, passed 0 times

这是由于cntlm源码文件中CFLAG的设置是覆盖而不是续接,与openwrt要求不同,在openwrt一般写成CFLAG += 的方式。可以通过如下修改去除note:

将源码包中的Makefile文件复制到a目录和b目录,打开b目录下的Makefile文件,作如下修改:

CFLAGS+=$(FLAGS)

即增加上面的“+”号,保存。

运行:

diff -Naur a/Makefile b/Makefile >makefile.patch

得到的makefile.patch文件如下:

---------------------------------------------------------------------------------------------------------------------------

--- a/Makefile2010-04-29 19:18:58.000000000 +0800

+++ b/Makefile2010-11-09 20:17:33.405177000 +0800

@@ -16,7 +16,7 @@

CC=gcc

VER=`cat VERSION`

OBJS=utils.o ntlm.o xcrypt.o config.o socket.o acl.o auth.o http.o forward.o direct.o scanner.o pages.o main.o

-CFLAGS=$(FLAGS)

-std=c99 -Wall -pedantic -O3 -D__BSD_VISIBLE -D_ALL_SOURCE

-D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=200112 -D_ISOC99_SOURCE

-D_REENTRANT -DVERSION=\"`cat VERSION`\" -g

+CFLAGS+=$(FLAGS)

-std=c99 -Wall -pedantic -O3 -D__BSD_VISIBLE -D_ALL_SOURCE

-D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=200112 -D_ISOC99_SOURCE

-D_REENTRANT -DVERSION=\"`cat VERSION`\" -g

OS=$(shell uname -s)

OSLDFLAGS=$(shell [ $(OS) = "SunOS" ] &&echo "-lrt -lsocket -lnsl")

LDFLAGS:=-lpthread $(OSLDFLAGS)

---------------------------------------------------------------------------------------------------------------------------

将makefile.patch文件复制到package/cntlm/patches目录下,重新编译即可。

openwrt就好比redhot,ubuntu,fedora等都是linux。所以肯定支持gcc。

如果你要编译编译你自己定义的C/C++程序到你的无线路由器上,如果你的路由器具有烧写的条件,当然是可以往里面烧写的。

首先声明:这是一个很复杂的过程,如果只是偶尔的玩玩,我建议你不要看下边的了。

1. 首先装一个linux虚拟机(redhot,ubuntu,fedora都可以);

2. 然后下载openwrt的bsp源码,根据你的路由器选择合适和架构和板子型号,然后编译生成开发环境;

3. 再然后上openwrt官网上学习如何在bsp中创建一个自己的程序包,从尔编译你自己的c/c++程序。

4. 然后编译生成linux镜像和文件系统,然后再到你的路由器上使用uboot在对应的位置上烧写你生成的文件系统。

5. 然后重启就能运行你写的c/c++程序了。

(当然也可以在编译好了之后通过NFS服务进行运行你的程序。)

最后温馨提示:刷机须谨慎,小心变砖头。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/7983622.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-12
下一篇 2023-04-12

发表评论

登录后才能评论

评论列表(0条)

保存