メニュー 閉じる

GitHub からドライバーのソースファイルを入手して、ビルドに挑戦したときの覚書。Makefileについて。

USB 無線LANアダプタ「Corega K.K. CG-WLUSBNM(ID 07aa:0047)」こいつをRaspberry Pi で動かしたい。

このサイトにたどりつくが、意味が分からない。
CONFIG_R8712U: RealTek RTL8712U (RTL8192SU) Wireless LAN NIC driver

なんか、ビルドするんだよーって雰囲気だし。

結局、ビルドはうまくいかずにはあきらめましたが、いろいろと覚えたのでメモ。
初心者がそう簡単にビルドできるものではないな。

GitHub からドライバーのソースを入手して、ビルドに挑戦したときの覚書。Makefileについて。

GITHUB からソースコードを入手する。

Paspberry Pi にgit がインストールされていることを確認。
autoconf をインストール。
gcc はインストール済み。

root@raspberrypi:/home/uniuni# apt list autoconf
一覧表示... 完了
autoconf/stable,now 2.69-11 all [インストール済み]

root@raspberrypi:/home/uniuni# git --version
git version 2.20.1

root@raspberrypi:/home/uniuni# apt list gcc
一覧表示... 完了
gcc/stable,now 4:8.3.0-1+rpi2 armhf [インストール済み]
root@raspberrypi:/home/uniuni# 

ダウンロードしてなんとなくコンパイルしてみるも、エラー続出。

include で失敗している。きっとライブラリが足らない。

巨大なGitHub をフォークしてクローンする。

git をクローンしてコンパイルしている記事を見つけたので、
このLinux のGitHub をクローンしておけば、ビルド出来るのではと考えた。

Ubuntu 18.04 で USB Wi-Fi アダプタを認識させる

で、クローンするためのURL を取得したいので、
いろいろとGitHub を触っていたら、fork というリポジトリをコピーする方法を発見。

これで、コピーしたリポジトリをRaspberry Pi にクローン出来そうです。
自分のGITHUB ならクローンする.git が取得できるもんね。

いい感じです。

エラーで止まる。
というか、デカすぎて固まるみたい。

error: RPC failed; curl 56 GnuTLS recv error (-54): Error in the pull function.
fatal: the remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed

キャッシュを増やすんだ。という記事を発見したので、増やしてみる。
(https でクローンしてるから、ssh はいらなかった。。。と思う)

git config --global ssh.postBuffer 5242880000
git config --global http.postBuffer 5242880000

効果が多少あった気はするが結局止まる。

解決:–depth 1 のオプションを指定してクローンする。

世代管理しているGitHub の最新版だけを取得してクローンする「–depth 1」のオプションをつけることで、解決できました。

Makefile の基本を確認。

make コマンドを実行するも、include のエラーが止まらない。

そもそも自分が「make」が正しく使えているか、このPaspberry Pi できちんと動くのか確認したかったので、
テスト用のコードとMakefile を作ってビルドしてみる事にしました。

ソースコードとMakefile の配置と、Makefile の内容。

# test フォルダにファイルを配置。
uniuni@raspberrypi:~ $ ls build_test/temp
Makefile  main.c  test.c

# Makefile
myfunc:test.o main.o
	cc -o myfunc test.o main.o

# main.c
int main(int argc,char *argv[]){
	int test();
}

# test.c
#include <stdio.h>
int test(){
	printf("test----------------->\n");
	return(0);
}

Makefile 覚書

「ターゲット:依存ファイル1 依存ファイル2」 
依存ファイルを「.o」にしておくと、「.c」から作ってくれる。

「cc -o myfunc 依存ファイル1 依存ファイル2 」
cc はgcc の短縮、-o myfunc を入れると実行ファイル名がmyfunc になる。

「Makefile:2: *** 分離記号を欠いています. 中止.」
実行コマンドの前はタブにしないとエラーになる。

実行と、確認。
ビルドできました。
「-C」は実行するディレクトリを移動するオプションでした。

uniuni@raspberrypi:~/build_test/temp $ make
cc    -c -o test.o test.c
cc    -c -o main.o main.c
main.c: In function ‘main’:
main.c:2:2: warning: implicit declaration of function ‘test’ [-Wimplicit-function-declaration]
  test();
  ^~~~
cc -o myfunc test.o main.o

uniuni@raspberrypi:~/build_test/temp $ ls
Makefile  main.c  main.o  myfunc  test.c  test.o

uniuni@raspberrypi:~/build_test/temp $ ./myfunc
test----------------->

Make ファイルの指定の基本的な使い方は確認したので、改めてビルドを試みる。
やっぱり、include でエラーが出た。

uniuni@raspberrypi:~ $ make -C linux/drivers/staging/rtl8712
make: ディレクトリ '/home/uniuni/linux/drivers/staging/rtl8712' に入ります
cc    -c -o rtl871x_cmd.o rtl871x_cmd.c
rtl871x_cmd.c:19:10: fatal error: linux/compiler.h: そのようなファイルやディレクトリはありません
 #include <linux/compiler.h>
          ^~~~~~~~~~~~~~~~~~
compilation terminated.
make: *** [<ビルトイン>: rtl871x_cmd.o] エラー 1
make: ディレクトリ '/home/uniuni/linux/drivers/staging/rtl8712' から出ます

ライブラリをマージしてみる。

クローンしたGit の中に要求されているファイルがあったので、
「 <xxx / ***.h> 」がそれなりの場所にリンクとかできればいけると思う。

シンボリックリンクを追加すればいいかも。

ln -s /home/uniuni/linux/include/linux linux

ファイル名が被って都合が悪そうなので。
ln -s /home/uniuni/test/include/linux linux

シンボリックリンクではうまくいかなかったので、直接システムのlinux にGit 内のファイルをマージしていく事にしました。

この時点で、Git をクローンした意味がなくなったなと思う。

cp -r linux/include/linux/. /usr/include/linux
cp -r /home/uniuni/linux/arch/arm64/include/asm /usr/include/
cp -r /home/uniuni/linux/include/asm-generic/. /usr/include/asm-generic
cp -r /home/uniuni/linux/include/uapi /usr/include
cp -r /home/uniuni/linux/include/vdso /usr/include
cp -r /home/uniuni/linux/arch/arm/include/asm/. /usr/include/asm
cp /home/uniuni/linux/include/asm-generic/mmiowb.h /usr/include/asm

見つからないファイルが出てきた。もうあきらめることにしました。

/usr/include/linux/page-flags-layout.h:6:10: fatal error: generated/bounds.h: そのようなファイルやディレクトリはありません
 #include <generated/bounds.h>
          ^~~~~~~~~~~~~~~~~~~~
compilation terminated.
make: *** [<ビルトイン>: rtl871x_cmd.o] エラー 1

参考

覚えたコマンド

コマンドリファレンス

make :Makefile を実行する。

gcc :C 言語をコンパイルする。

cp -r  :コピーする。「-r」は再帰的にコピーする。

mv :フォルダとかファイルを移動。リネームとしても使える。

git clone <url> –depth 1 :GitHub で自分のリポジトリをクローンする。

git config –global ssh.postBuffer 5242880000 :git clone するときのバッファーを設定する。

Posted in Linux

関連投稿

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です