1.プロジェクトマネージャーを作る
プロジェクトマネージャーはより多くのファイルを管理する必要があります
make プロジェクト マネージャー: 「自動コンパイル マネージャー」とも呼ばれます。
効果:
1) Makefile ファイルのコンパイル内容を読み取り、特定のコンパイル作業を実行します。
2) ファイルのタイムスタンプに基づいて更新されたファイルを自動的に検出します
3) 完全にはコンパイルせず、変更されたコード ファイルのみをコンパイルします。
詳細については、以下を参照してください。
https://www.gnu.org/software/make/
2. メイクファイルの構文
Makefile は、make によって読み取られる唯一の設定ファイルです
target: dependency_files
<TAB> command
target: コンパイルされたターゲット、オブジェクト ファイル、または実行可能ファイル
dependency_files 依存ファイル
コマンド コンパイル済みコマンド
例えば:
hello.o: hello.c hello.h
gcc -c hello.c -o hello.o
コマンドラインの前に「TAB キー」がなければなりません。そうしないと、コンパイルでエラーが報告されます。
上記の 1 つの test.c ファイルだけの場合、上記の文法規則に従って、次の Makefile コンテンツが必要です。
test:test.o
gcc test.o -o test
test.o: test.c
gcc -c -Wall test.c -o test.o
メイクファイル変数
Makef は Makefile 内の変数を作成して使用します。変数は、変数の値と呼ばれるテキスト文字列の代わりに使用される、Makefile で定義された名前です。
ユーザー定義変数
事前定義された変数
自動変数
環境変数
1) カスタム変数: その値はユーザーによって設定されます
変数の値を使用して、ターゲット本体、依存ファイル、コマンド、および Makefile の他の部分を置き換えることができます。
2) 自動変数: コンパイル ステートメントに現れるターゲット ファイルと依存ファイルをローカルな意味で表すために使用されます。
一般的な自動変数:
$< 最初の依存ファイルの名前
$@ オブジェクトファイルのフルネーム
$^ すべての非反復ターゲット依存ファイル (スペースで区切る)
$? スペースで区切られた、ターゲット ファイルより後のタイムスタンプを持つすべての依存ファイル
3) 事前定義された変数: 一般的なコンパイラ、アセンブラ、およびコンパイル オプションの事前定義された名前
CC C コンパイラの名前。デフォルトは cc です。
RM ファイル削除プログラムの名前。デフォルトは rm -f です。
C コンパイラの CFLAGS オプション、デフォルトなし
AR ライブラリ ファイル メンテナンス プログラムの名前。デフォルトは ar です。
CPP C プリコンパイラの名前。デフォルトは $(CC) -E です。
CPPFLAGS C プリコンパイル済みオプション、デフォルトなし
ユーザーは、プログラムのパッケージ化、バックアップ、削除など、コンパイルに関係のないいくつかのコマンドを Makefile に定義できます。
注: .PHONY は擬似ターゲットを示します
例: Makefile に以下を追加します。
.PHONY: clean
clean:
-rm f1.o f2.o main.o test
使用方法:きれいにする
追加のルール:
1) 暗黙のルール 1: C プログラムのコンパイルに関する暗黙のルール
<n>.o ターゲットの依存ターゲットは、<n>.c として自動的に推定されます。
2) 暗黙のルール 2: オブジェクトファイルのリンクに関する暗黙のルール
<n> 個のターゲットの依存関係ターゲットは、自動的に <n> として推定されます。o
@echo $(SUBDIRS)
echo にプロンプトを表示させます
@(RM)
事前定義された変数、rm -f
-C $@ にする
指定されたディレクトリ内の Makefile を読み取ります
エクスポート CC OBJS BIN OBJS_DIR BIN_DIR
これらの変数を使用して submakefile を見つけられるようにします
これらの Makefile 文法規則により、次の Makefile になることができます。
gcc -Wall はすべての gcc アラートを有効にします
gcc -c は .o ファイルを生成します
OBJS= test.o
CFLAGS= -c -O -g -Wall
test:$(OBJS)
.PHONY:clean
clean:
-rm $(OBJS)
make clean を実行して test.o を削除します。実行プロセスは次のとおりです。
3. メイクツールのパラメータを使用する
makeの使い方:
1) make を直接実行する
2) オプションで作る
-C //dir读取指定目录下的Makefile
-f //file读取当前目录下的fiLe作为Makefile
-i //忽略所有的命令执行错误
-l //dir指定被包含的Makefile所在目录
-n //只打印要执行的命令,但不执行这些命令
-p //显示make变量数据库和隐含规则
-s //在执行命令时不显示命令
-w //如果make执行时改变目录,打印当前目录名
4. ドライバーの Makefile を生成する
カーネル hello.c を作成します。
#include <linux/module.h> //所有模块都需要的头文件
#include <linux/init.h> // init&exit相关宏
static int __init hello_init(void){
printk(KERN_ERR "hello world");
return 0;
}
static void __exit hello_exit(void){
printk(KERN_EMERG "hello exit!");
}
module_init(hello_init);
module_exit(hello_exit);
ifneq ($(KERNELRELEASE),)
obj-m :=hello.o // 来指定模块名,注意模块名加.o而不是加.ko
else
KERNELDIR ?=/lib/modules/$(shell uname -r)/build // 目标板linux内核源码顶层目录的绝对路径
all:
make -C $(KERNELDIR) M=$(PWD) modules
clean:
make -C $(KERNELDIR) M=$(PWD) clean
endif
obj-y := hello.o は hello.o をカーネルにコンパイルすることを意味します。仕様に従ってプロジェクトにはこれを記述しません。
Make -C は、カーネルに保存されているディレクトリがその Makefile を実行することを示します
「M=」の機能は次のとおりです。モジュールがカーネルに基づいて外部モジュールをコンパイルする必要がある場合、make modules コマンドに「M=dir」を追加する必要があります。これにより、プログラムは dir ディレクトリに移動して、コンパイル用のソース ファイル、make clean も同様で、現在のディレクトリに移動してクリーンアップします (コンパイルされたファイルをすべて削除します)。
make 後、hello.ko ファイルを生成でき、そのファイルは insmod (モジュール挿入) 操作を通じてカーネルにロードでき、ロード時の関連情報は dmesg を通じて表示できます。