Makefile自分で書いてみた
Orange Piを使ってGPIOを制御するプログラムを作る予定だが、C++はBuildroot標準でコンパイラがないようなので言語はCにする方向になった。
コンパイラを直接使ってOrange Piで動く"Hello World"はできたが、実際にはソースファイルが複数になってコンパイラの引数が多くなってわからなくなるのでmake使ってみることにした。
makeは同じディレクトリのMakefileに従ってコンパイルするマクロ的なもんだが、
:の左側にターゲット名、右側にスペース区切りで依存ファイルを書く。(依存ファイルは1つでもいいし多数でも。)
次の行に先頭からタブを空けてコマンドを書く。(コマンドは複数行書けると思う。)
参考にしたサイトだとどこも:の後にスペースがあったが必要ないみたい。
コマンド行のタブは必須。
単に
まあとりあえず、
CCは変数みたいなものだがマクロと言うらしい。
gccを定義してあるが、ここ変えればクロスコンパイルできる。
定義の際はそのまま書いて使うときは$をつけるが、マクロ名が2文字以上の場合は$(CC)の様に()で囲む必要があるみたい。
$@ $^$<は内部マクロで、
$@=ターゲット名
$^=依存ファイルすべて
$<=依存ファイルの先頭1個
$(RM)は定義済みマクロで rm -f と同じ。
.c.oはサフィックスルールというもので、拡張子を2つ続けて書く感じでワイルドカード的に使える。
今回はソースファイルが main.c 1つなんで main.o は作る必要ないが今後のためにも main.o を作ってから hello コマンドを作る感じにした。
先頭のターゲットがhelloなんでmakeしたらhelloを作ろうとするが main.o がなければサフィックスルールに基づきmain.cからmain.oが作られ、main.oからhelloが作られる。
って感じかな。
コンパイラを直接使ってOrange Piで動く"Hello World"はできたが、実際にはソースファイルが複数になってコンパイラの引数が多くなってわからなくなるのでmake使ってみることにした。
makeは同じディレクトリのMakefileに従ってコンパイルするマクロ的なもんだが、
ターゲット名:依存ファイル1 依存ファイル2
コマンド
のような感じで、コマンド
:の左側にターゲット名、右側にスペース区切りで依存ファイルを書く。(依存ファイルは1つでもいいし多数でも。)
次の行に先頭からタブを空けてコマンドを書く。(コマンドは複数行書けると思う。)
参考にしたサイトだとどこも:の後にスペースがあったが必要ないみたい。
コマンド行のタブは必須。
単に
$ make
とした場合は最初に記載されたターゲットが処理されるらしい。まあとりあえず、
CC=gcc
hello:main.o
$(CC) -o $@ $^
.c.o:
$(CC) -c $<
clean:
$(RM) hello main.o
こんな感じで"Hello World"をmakeできるようにしてみた。hello:main.o
$(CC) -o $@ $^
.c.o:
$(CC) -c $<
clean:
$(RM) hello main.o
CCは変数みたいなものだがマクロと言うらしい。
gccを定義してあるが、ここ変えればクロスコンパイルできる。
定義の際はそのまま書いて使うときは$をつけるが、マクロ名が2文字以上の場合は$(CC)の様に()で囲む必要があるみたい。
$@ $^$<は内部マクロで、
$@=ターゲット名
$^=依存ファイルすべて
$<=依存ファイルの先頭1個
$(RM)は定義済みマクロで rm -f と同じ。
.c.oはサフィックスルールというもので、拡張子を2つ続けて書く感じでワイルドカード的に使える。
今回はソースファイルが main.c 1つなんで main.o は作る必要ないが今後のためにも main.o を作ってから hello コマンドを作る感じにした。
先頭のターゲットがhelloなんでmakeしたらhelloを作ろうとするが main.o がなければサフィックスルールに基づきmain.cからmain.oが作られ、main.oからhelloが作られる。
って感じかな。
モーターとかMOSFETがまだ届いてないが、とりあえずCでLEDを制御してみようかと。
あとMOSFETはNチャネルしか買わなかったが、Nチャネルのみでステッピングモーターを1個制御するのにGPIOは基本的に4本必要になると思うが、GPIOは最大17本しか無いのでモーター1個に4本も使えない。
で、0の時に流れる回路と1の時に流れる回路があればいいわけで、
Nチャネルに1の時に電流流れるとして、半分Pチャネルにすれば0のときにも流せるよね。
だから半分PチャネルならGPIO2本でモーター1個制御できるよね。ということに気づいた。
まあとりあえずNチャネルで動かしてみる。
それと、モーターは12Vのやつだが、12Vを用意するの難しい。
とりあえず無負荷だし5Vで動かんかな?
あとMOSFETはNチャネルしか買わなかったが、Nチャネルのみでステッピングモーターを1個制御するのにGPIOは基本的に4本必要になると思うが、GPIOは最大17本しか無いのでモーター1個に4本も使えない。
で、0の時に流れる回路と1の時に流れる回路があればいいわけで、
Nチャネルに1の時に電流流れるとして、半分Pチャネルにすれば0のときにも流せるよね。
だから半分PチャネルならGPIO2本でモーター1個制御できるよね。ということに気づいた。
まあとりあえずNチャネルで動かしてみる。
それと、モーターは12Vのやつだが、12Vを用意するの難しい。
とりあえず無負荷だし5Vで動かんかな?