Openwrtの構造とHelloWorldプログラムの作成
6824 ワード
今回はopenwrtの仕組みについてお話しします.
1.コードにはいくつかの重要なディレクトリpackage,target,build_があります.root, bin, dl....
---build_dir/hostディレクトリは、ツールチェーンを構築する際の一時ディレクトリです.
---build_dir/toolchain-*は、ハードウェアに対応するツールチェーンのディレクトリです.
---staging_dir/toolchain-*はツールチェーンの取り付け位置です
---target/linux/ディレクトリには各プラットフォーム(arch)の関連コードが入っています
---target/linux//config-3.10ファイルがプロファイルです
---dlディレクトリは「download」の略で、コンパイル前期には、ネットワークからダウンロードする必要があるパケットがこのディレクトリの下に置かれていました.これらのパッケージの特徴の一つは、コンパイルされたファームウェアに自動的にインストールされることです.つまり、make menuconfigのときに、ファームウェアに配置されたいくつかのパッケージです.これらのソースパケットを変更する必要がある場合は、変更したソースパケットを同じ名前にパッケージしてこのディレクトリの下に置いてコンパイルを開始するだけです.コンパイル時にパッケージがbuild_に解凍されます.dirディレクトリの下.
---build_dir/ディレクトリの下で解凍、コンパイル、パッチ適用などを行います.
---パッケージディレクトリには、プロファイルで設定したすべてのコンパイルされたパッケージが含まれています.デフォルトでは、デフォルトで選択されているパッケージがあります.Openwrtではipkがすべてで、私たちは使用することができます.
$ ./scripts/feeds updateでパッケージを更新する.
$ ./scripts/feeds search nmapパッケージ'nmap'を検索
Search results in feed ’packages’: nmap Network exploration and/or security auditing utility
$ ./scripts/feeds install nmapインストール'nmap'このソフトウェア
$make package/symlinks//ソフトウェアソースの更新などを意味すると推定されます
---binディレクトリの下で多くのbinファイルが生成され、異なるプラットフォームによって区別されます.またbin//packageディレクトリには、ipk接尾辞のファイルがたくさん入っていて、packageディレクトリの下のソースコードがbuild_にあります.dirディレクトリの下でコンパイルした結果.
2.自分のpackagesを新しくする自分の新しいpackageに対して、このpackageはファームウェアと一緒にインストールする必要はありません.言い換えれば、オプションのパッケージとして使用することができます.SDK環境を利用して単独でコンパイルでき、コンパイルするとipkのパッケージが生成されます.そしてopkg install xxxを利用する.ipkはこのソフトウェアをインストールします.
次に、hellowordのパッケージをどのようにコンパイルするかを具体的に説明します.(1)まず,helloworldプログラムを記述するhelloworld.c/**************** * Helloworld.c * The most simplistic C program ever written. * An epileptic monkey on crack could write this code. *****************/#include #include int main(void) { printf("Hell! O' world, why won't my code compile?"); return 0; }
Makefileファイルを作成するo $(CC) $(LDFLAGS) helloworld.o -o helloworld helloworld.o: helloworld.c $(CC) $(CFLAGS) -c helloworld.c# remove object files and executable when user executes "make clean"clean: rm *.o helloworldこの2つのファイルのディレクトリの下で、makeを実行するとhelloworldの実行可能ファイルを生成できるはずです.ハローワールドを実行すると、「Hell!O'world,why won't my code compile?」と印刷できます.このステップでは、主に私たちのソースプログラムが正常にコンパイルできることを保証します.
次にOpenWRTに移植します.(2)OpenWrt-SDK-brcm 47 xx-for-Linux-x 86_を64-gcc-4.3.3+cs_uClibc-0.9.30.1.tar.bz 2解凍tar–xvf OpenWrt-SDK-brcm 47 xx-for-Linux-x 86_64-gcc-4.3.3+cs_uClibc-0.9.30.1.tar.bz 2(3)SDK cd OpenWrt-SDK-brcm 47 xx-for-Linux-x 86_へ64-gcc-4.3.3+cs_uClibc-0.9.30.1中のディレクトリ構造は私たちの前のsourceのディレクトリ構造とほぼ同じで、コンパイルする必要があるパッケージは、packageディレクトリの下に置く必要があります(4)packageディレクトリの下にhelloworldディレクトリcd package mkdir helloworld cd helloworld(5)srcディレクトリを作成し、helloworldファイルmkdir src cp/home/wrt/test/helloworld.c src cp/home/wrt/test/Makefile src(6)helloworldディレクトリの下にMakefileファイルを作成するこのMakefileファイルはOpenWRTに読まれたもので、前に書いたMakefileファイルはhelloworldに対してコンパイルされたものです.2つのMakefileは同じ階層のディレクトリの下にありません.
touch Makefile vim Makefile
Makefileファイルテンプレートの内容は次のとおりです.
(7)SDKのルートディレクトリに戻る
makeをコンパイルする
コンパイルプロセスはbuild_dirディレクトリで完了
コンパイル結果はbin/[yourtarget]/packageディレクトリの下にhelloworld_1_bcm47xx.ipk
(8)helloworldをアップロード_1_bcm47xx.ipk
ハローワールドをアップロード1_bcm47xx.ipkからルータ
実行#opkg install helloworld_1_bcm47xx.ipk
次にhelloを入力してTabキーを押すとopenwrtにhelloworld実行可能なコマンドが既に存在します.
helloworldコマンドを実行してプログラムの効果を表示します.
Hell! O' world, why won't my code compile?
まとめ:私も初心者なので、分からないことが多いので、高い人に教えてもらいたいです.
1.コードにはいくつかの重要なディレクトリpackage,target,build_があります.root, bin, dl....
---build_dir/hostディレクトリは、ツールチェーンを構築する際の一時ディレクトリです.
---build_dir/toolchain-
---staging_dir/toolchain-
---target/linux/
---target/linux/
---dlディレクトリは「download」の略で、コンパイル前期には、ネットワークからダウンロードする必要があるパケットがこのディレクトリの下に置かれていました.これらのパッケージの特徴の一つは、コンパイルされたファームウェアに自動的にインストールされることです.つまり、make menuconfigのときに、ファームウェアに配置されたいくつかのパッケージです.これらのソースパケットを変更する必要がある場合は、変更したソースパケットを同じ名前にパッケージしてこのディレクトリの下に置いてコンパイルを開始するだけです.コンパイル時にパッケージがbuild_に解凍されます.dirディレクトリの下.
---build_dir/ディレクトリの下で解凍、コンパイル、パッチ適用などを行います.
---パッケージディレクトリには、プロファイルで設定したすべてのコンパイルされたパッケージが含まれています.デフォルトでは、デフォルトで選択されているパッケージがあります.Openwrtではipkがすべてで、私たちは使用することができます.
$ ./scripts/feeds updateでパッケージを更新する.
$ ./scripts/feeds search nmapパッケージ'nmap'を検索
Search results in feed ’packages’: nmap Network exploration and/or security auditing utility
$ ./scripts/feeds install nmapインストール'nmap'このソフトウェア
$make package/symlinks//ソフトウェアソースの更新などを意味すると推定されます
---binディレクトリの下で多くのbinファイルが生成され、異なるプラットフォームによって区別されます.またbin/
2.自分のpackagesを新しくする自分の新しいpackageに対して、このpackageはファームウェアと一緒にインストールする必要はありません.言い換えれば、オプションのパッケージとして使用することができます.SDK環境を利用して単独でコンパイルでき、コンパイルするとipkのパッケージが生成されます.そしてopkg install xxxを利用する.ipkはこのソフトウェアをインストールします.
次に、hellowordのパッケージをどのようにコンパイルするかを具体的に説明します.(1)まず,helloworldプログラムを記述するhelloworld.c/**************** * Helloworld.c * The most simplistic C program ever written. * An epileptic monkey on crack could write this code. *****************/#include
Makefileファイルを作成するo $(CC) $(LDFLAGS) helloworld.o -o helloworld helloworld.o: helloworld.c $(CC) $(CFLAGS) -c helloworld.c# remove object files and executable when user executes "make clean"clean: rm *.o helloworldこの2つのファイルのディレクトリの下で、makeを実行するとhelloworldの実行可能ファイルを生成できるはずです.ハローワールドを実行すると、「Hell!O'world,why won't my code compile?」と印刷できます.このステップでは、主に私たちのソースプログラムが正常にコンパイルできることを保証します.
次にOpenWRTに移植します.(2)OpenWrt-SDK-brcm 47 xx-for-Linux-x 86_を64-gcc-4.3.3+cs_uClibc-0.9.30.1.tar.bz 2解凍tar–xvf OpenWrt-SDK-brcm 47 xx-for-Linux-x 86_64-gcc-4.3.3+cs_uClibc-0.9.30.1.tar.bz 2(3)SDK cd OpenWrt-SDK-brcm 47 xx-for-Linux-x 86_へ64-gcc-4.3.3+cs_uClibc-0.9.30.1中のディレクトリ構造は私たちの前のsourceのディレクトリ構造とほぼ同じで、コンパイルする必要があるパッケージは、packageディレクトリの下に置く必要があります(4)packageディレクトリの下にhelloworldディレクトリcd package mkdir helloworld cd helloworld(5)srcディレクトリを作成し、helloworldファイルmkdir src cp/home/wrt/test/helloworld.c src cp/home/wrt/test/Makefile src(6)helloworldディレクトリの下にMakefileファイルを作成するこのMakefileファイルはOpenWRTに読まれたもので、前に書いたMakefileファイルはhelloworldに対してコンパイルされたものです.2つのMakefileは同じ階層のディレクトリの下にありません.
touch Makefile vim Makefile
Makefileファイルテンプレートの内容は次のとおりです.
##############################################
# OpenWrt Makefile for HelloWorld program
#
#
# Most of the variables used here are defined in
# the include directives below. We just need to
# specify a basic description of the package,
# where to build our program, where to find
# the source files, and where to install the
# compiled program on the router.
#
# Be very careful of spacing in this file.
# Indents should be tabs, not spaces, and
# there should be no trailing whitespace in
# lines that are not commented.
#
##############################################
include $(TOPDIR)/rules.mk
# Name and release number of this package
PKG_NAME:=HelloWorld
PKG_RELEASE:=1
# This specifies the directory where we're going to build the program.
# The root build directory, $(BUILD_DIR), is by default the build_mipsel
# directory in your OpenWrt SDK directory
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
include $(INCLUDE_DIR)/package.mk
# Specify package information for this program.
# The variables defined here should be self explanatory.
# If you are running Kamikaze, delete the DESCRIPTION
# variable below and uncomment the Kamikaze define
# directive for the description below
define Package/HelloWorld
SECTION:=utils
CATEGORY:=Utilities
TITLE:=HelloWorld -- prints a snarky message
endef
# Uncomment portion below for Kamikaze and delete DESCRIPTION variable above
define Package/HelloWorld/description
If you can't figure out what this program does, you're probably brain-dead and need immediate medical attention.
endef
# Specify what needs to be done to prepare for building the package.
# In our case, we need to copy the source files to the build directory.
# This is NOT the default. The default uses the PKG_SOURCE_URL and the
# PKG_SOURCE which is not defined here to download the source from the web.
# In order to just build a simple program that we have just written, it is
# much easier to do it this way.
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
$(CP) ./src/* $(PKG_BUILD_DIR)/
endef
# We do not need to define Build/Configure or Build/Compile directives
# The defaults are appropriate for compiling a simple program such as this one
# Specify where and how to install the program. Since we only have one file,
# the HelloWorld executable, install it by copying it to the /bin directory on
# the router. The $(1) variable represents the root directory on the router running
# OpenWrt. The $(INSTALL_DIR) variable contains a command to prepare the install
# directory if it does not already exist. Likewise $(INSTALL_BIN) contains the
# command to copy the binary file from its current location (in our case the build
# directory) to the install directory.
define Package/HelloWorld/install
$(INSTALL_DIR) $(1)/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/HelloWorld $(1)/bin/
endef
# This line executes the necessary commands to compile our program.
# The above define directives specify all the information needed, but this
# line calls BuildPackage which in turn actually uses this information to
# build a package.
$(eval $(call BuildPackage,HelloWorld))
(7)SDKのルートディレクトリに戻る
makeをコンパイルする
コンパイルプロセスはbuild_dirディレクトリで完了
コンパイル結果はbin/[yourtarget]/packageディレクトリの下にhelloworld_1_bcm47xx.ipk
(8)helloworldをアップロード_1_bcm47xx.ipk
ハローワールドをアップロード1_bcm47xx.ipkからルータ
実行#opkg install helloworld_1_bcm47xx.ipk
次にhelloを入力してTabキーを押すとopenwrtにhelloworld実行可能なコマンドが既に存在します.
helloworldコマンドを実行してプログラムの効果を表示します.
Hell! O' world, why won't my code compile?
まとめ:私も初心者なので、分からないことが多いので、高い人に教えてもらいたいです.