ターゲット

makeコマンドとMakefileの作り方について。

Make - GNU Project - Free Software Foundation

Makefileにビルド手順となるコマンドを書いておくと、makeコマンドだけで一気にビルドできる。
CMakeとかもあるので、"GNU Make"カテゴリにしてる。

- 自動化のためのGNU Make入門講座 - Makefileの基本:ルール

基本的に、Makefileは、

生成するファイル:
	生成するために必要なコマンド

こう書く。
生成するファイルの後に':'、改行してタブした後にそのファイルを生成するコマンドを書く。
この"生成するファイル"のことを"ターゲット"という。

$ pwd
/home/bg1/project/cloud/github.com/Sample/make/target/target/src/target
$ vi Makefile

Makefileを開いて、

こう書く。
"echo 123"という文字列を、echoのリダイレクトでmain.shに書き込んでる。

Makefileのある場所でmakeコマンドを実行。

$ make
echo "echo 123" > main.sh
$

echoコマンドが実行された。

$ ls
Makefile  main.sh
$

main.shが生成された。
中身は、

こうなので、

$ bash main.sh
123
$

bashで実行するとこうなる。

Sample/make/target/target/src/target at master · bg1bgst333/Sample · GitHub

変数

Bashは、現在最も一般的なシェル。
最近は、他にもいろいろあるけど。

Bash - GNU Project - Free Software Foundation

で、ここではBashというよりシェルスクリプトについて扱う。
なんで"Bash"カテゴリなのかというと、他のシェルだとちょっと使い方が違う部分もあるので。
それにコマンドの種類自体は"UNIXシェル"カテゴリで扱うので。
まずは、変数。

変数を使用する | UNIX & Linux コマンド・シェルスクリプト リファレンス

シェルスクリプトはルールがちょっと厳しい。

$ pwd
/home/bg1/project/cloud/github.com/Sample/bash/variable/variable/src/variable
$ vi variable.sh

variable.shを開いて、

こう書く。
Perl同様、bashのパスを先頭に書いておく。
数値代入はそのまま、文字列代入はクォート。
代入の時点で'$'はいらない。
宣言もいらない。
'='の間にスペースを入れてはいけない。
変数の参照では'$'が要る。
echoで出力。

$ bash variable.sh
123
ABC
$

こういう出力になる。

Sample/bash/variable/variable/src/variable at master · bg1bgst333/Sample · GitHub

ソースコードの修正(Fedora31)

以前カーネルをビルドしただけの時から随分経ったが、今回はちょっとソースコードもいじってみる。
で、今回はFedora31にバージョンが上がっている。
前回の記事と、

Fedora 24: カーネルを再ビルドする - Narrow Escape

ここを参考に。ここを中心に。

$ sudo yum install rpmdevtools

まず、rpmdevtoolsのインストール。

$ rpmdev-setuptree

rpmdev-setuptreeの実行。

$ uname -a
Linux localhost.localdomain 5.3.7-301.fc31.x86_64 #1 SMP Mon Oct 21 19:18:58 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
$

バージョン確認しておく。

$ sudo yum install koji

kojiのインストール。

$ koji download-build --arch=src kernel-5.3.7-301.fc31.x86_64

ソースのダウンロード。

$ rpm -Uvh kernel-5.3.7-301.fc31.src.rpm

パッケージ更新。
警告が出るけど、気にしない。

SPECSの下のkernel.specをバックアップとって編集
SPECSの下のkernel.specをバックアップとって編集

SPECSの下のkernel.specをバックアップとって編集。

最初は別のだったが、今回も結局".bg1"にした。
最初は別のだったが、今回も結局".bg1"にした。

最初は別のだったが、今回も結局".bg1"にした。。

$ rpmbuild -bp SPECS/kernel.spec

"rpmbuild -bp"したら、

make入ってなかった
make入ってなかった

make入ってなかった。

$ sudo yum install make

make入れて再度やると、

flex入ってない
flex入ってない

flex入ってない。

$ sudo yum install flex

flex入れた。

$ sudo yum install fedpkg fedora-packager ncurses-devel pesign grubby

ついでに前回入れてたこの辺も入れてみた。
効果あったかはわからんけど。

今度はbisonが入ってない。
今度はbisonが入ってない。

今度はbisonが入ってない。

$ sudo yum install bison

bison入れた。

pathfix.pyがないってどういうこと。
pathfix.pyがないってどういうこと。

pathfix.pyがないってどういうこと。

command-not-found.com – pathfix.py

なるほど。

$ sudo yum install python3-devel

python3は入ってたけど、"python3-devel"が必要だったみたい。

$ rpmbuild -bp SPECS/kernel.spec
setting SOURCE_DATE_EPOCH=1571616000
実行中(%prep): /bin/sh -e /var/tmp/rpm-tmp.gfIMWn
.
.
.

+ exit 0
$

やっと"rpmbuild -bp"が成功。

linuxから始まるソースを見ていくとgitレポジトリになってる
linuxから始まるソースを見ていくとgitレポジトリになってる

linuxから始まるソースを見ていくとgitレポジトリになってる。

addとcommitしてみる
addとcommitしてみる

addとcommitしてみる。

新しいブランチ"bg1"を作って切り替える
新しいブランチ"bg1"を作って切り替える

新しいブランチ"bg1"を作って切り替える。

init/main.cを編集。
init/main.cを編集。

init/main.cを編集。

kernel_init関数の中で、printkで"bg1 in kernel_init"と出力。
kernel_init関数の中で、printkで"bg1 in kernel_init"と出力。

kernel_init関数の中で、printkで"bg1 in kernel_init"と出力。

patch用のcommit
patch用のcommit

patch用のcommit。

こうやってpatchを作るらしい
こうやってpatchを作るらしい

こうやってpatchを作るらしい。
SOURCEに格納されたみたい。

1000-custom.patchをkernel.specの"END OF PATCH DEFINITIONS"の前に追加するらしい。
1000-custom.patchをkernel.specの"END OF PATCH DEFINITIONS"の前に追加するらしい。

作った1000-custom.patchをkernel.specの"END OF PATCH DEFINITIONS"の前に追加するらしい。

BUILDの下を空にして、"rpmbuild -bp"する。
BUILDの下を空にして、"rpmbuild -bp"する。

BUILDの下を空にして、"rpmbuild -bp"する。

うまくいった
うまくいった

うまくいったので、

本体ビルドしようとしたら、まだ足りなかったので、いろいろ入れる。
本体ビルドしようとしたら、まだ足りなかったので、いろいろ入れる。

本体ビルドしようとしたら、まだ足りなかったので、いろいろ入れる。

今度こそビルド
今度こそビルド

今度こそビルド。

数時間後に出来た。
数時間後に出来た。

数時間後に出来た。

成果物を"/usr/src/kernels"にコピー。
成果物を"/usr/src/kernels"にコピー。

成果物を"/usr/src/kernels"にコピー。

シンボリックリンクを貼って
シンボリックリンクを貼って

シンボリックリンクを貼って、

インストール
インストール

インストール。
で前回と同様に再起動してShiftキーを押すと、

こうなるので"bg1"とあるやつを選ぶ
こうなるので"bg1"とあるやつを選ぶ

こうなるので"bg1"とあるやつを選ぶ。

カーネルがbg1バージョンになってる
カーネルがbg1バージョンになってる

カーネルがbg1バージョンになってる。
さて、いじったソースがどうなってるか確認する。

dmesgすると、
dmesgすると、

dmesgすると、起動時のいろいろなものが見える。

随分と下に行くと、"bg1 in kernel_init"があった。
随分と下に行くと、"bg1 in kernel_init"があった。

随分と下に行くと、"bg1 in kernel_init"があった。
ということで、修正したソースコードの部分が反映されてることがわかった。

<style>のname

定義した<style>タグのnameに、独自のスタイルの名前を指定する。

Style resource  |  Android Developers

まあ、当たり前の話だけど。
strings.xmlで、

Button1とButton2の2つに。
styles.xmlで、

nameの違う2つのButton用style。
CustomStyle_30dpButtonに加えて、新たに、幅も高さも100dpのCustomStyle_100dpButtonを定義。
activity_main.xmlで、

button1にはCustomStyle_30dpButton、button2にはCustomStyle_100dpButtonを指定。

Button1は30dpだから小さいけど、Button2は100dpだから大きい。
Button1は30dpだから小さいけど、Button2は100dpだから大きい。

Button1は30dpだから小さいけど、Button2は100dpだから大きい。

Sample/android/styleTag/name/src/styleTag at master · bg1bgst333/Sample · GitHub

<style>

Android XMLにおける、<style>タグについて。

Style resource  |  Android Developers
AndroidのTheme/Styleを理解する - Qiita

R.styleでもやったけど、改めて少しずつ。
<style>タグでさまざまなViewのスタイルをカスタマイズできるし、個別じゃなくてテーマという形で全体的に指定も出来る。
まず、strings.xmlで、

Buttonを1つ用意し、Button1という表示名に。
styles.xmlで、

<resources>タグの中に、<style>タグでそれぞれスタイルを定義していく。
上の2つはアプリケーションのテーマなので、それらは置いといて、下にCustomStyle_30dpButtonという名前のButton用のstyleを定義。
幅も高さも30dpになるようなstyle。
activity_main.xmlで、

Buttonのstyle(これはandroid名前空間ではない。)で、@styleの後に'/'を挟んでstyles.xmlに定義したstyleの名前、CustomStyle_30dpButtonを指定する。
layout_widthとlayout_heightを30dpにするstyleを指定したので、この2つはButton側では指定しない。

幅も高さも30dpのButtonに。
幅も高さも30dpのButtonに。

幅も高さも30dpのButtonに。

Sample/android/styleTag/styleTag/src/styleTag at master · bg1bgst333/Sample · GitHub

View.setAnimation

Animationは、Buttonに限らず、さまざまなViewにセット出来る。
だから、setAnimationは、Viewクラスのメソッド。

View  |  Android Developers

strings.xmlで、

TextView1にしてる。
activity_main.xmlで、

TextViewだけ配置。
textSizeをちょっと大きくしてる。
MainActivity.javaで、

textview1でもそのまま呼べるけど、あえてViewオブジェクトvに入れてから、v.setAnimationにanimationをセット。

大きいTextViewも透過アニメーションしてる
大きいTextViewも透過アニメーションしてる

大きいTextViewも透過アニメーションしてる。

Sample/android/View/setAnimation/src/View at master · bg1bgst333/Sample · GitHub

Animation.setDuration

Animation.setDurationで、アニメーションする時間を設定できる。

Animation  |  Android Developers

MainActivity.javaで、

5秒だったのを1秒にしてみた。

前回より、サッと出てくるようになった。
前回より、サッと出てくるようになった。

前回より、サッと出てくるようになった。

Sample/android/Animation/setDuration/src/Animation at master · bg1bgst333/Sample · GitHub