[MakeFile] Linuxでのプロジェクト管理(BSP)と一般的なmakefileの書き込み

1.BSPエンジニアリング管理の原則

BSPプロジェクト管理の目的はコードをモジュール化することであり、同じ属性を持つファイルは同じディレクトリに保存されます。

1.必要なフォルダを作成し、同じ属性のファイルを対応するフォルダに配置します。

2. clk、led、delayドライバーを変更し、対応するドライバーファイルを作成して、対応するディレクトリに配置します。

3.書き込まれた新しいドライバーファイルに従って、main.cファイルの内容を変更します。

2.Makefileの準備

API関数の説明:

patsubst関数:

フォーマット:

$(patsubst pattern,replacement,text)

機能の概要:

これは、パターンルールに従ってテキストのテキストを順番に置換する置換機能です。

置き換える場合、テキストのテキストは「スペース」、「TAB」、「キャリッジリターン、ラインフィード」で分割され、パターンパターンに準拠しているかどうかに関係なく、1つずつ一致します。一致が成功すると、次のように置き換えられます。置換。パターンと置換の両方で、%をワイルドカードとして使用できます(必要に応じて、元の%を%でエスケープする必要があります)

例:INCLUDES変数のすべての文字フィールドに-Iを追加します。

$(patsubst %, -I %, $(INCLUDES))

foreach関数:

フォーマット:

$(foreach <var>,<list>,<text> )

機能の概要:

指定された関数をループで実行し、リスト内の単語を1つずつ取り出し、パラメーターvarで指定された変数に入れてから、テキストの関数を実行します。関数の戻り値はすべてのテキスト文字列の組み合わせであり、varは関数の実行後に解放されるローカル一時変数です。

例:

src := 1 2 3 4
out := $(foreach i, $(src), i.c)

今回のアウトは

1.c 2.c 3.c 4.c

ワイルドカード関数:

フォーマット:

$(wildcard PATTERN...) 

関数の説明:
ワイルドカードを展開します。$は変数を参照するため、ワイルドカードは無効になります。これを使用して、ワイルドカードと一致する文字を展開します。

例:ディレクトリに4つのCファイル1.c 2.c3.c4.cがあります

obj := $(patsubst %.c, %o,$(wildcard *.c))

ワイルドカード*がこれらの4つのcファイルに順番に割り当てられ、$(ワイルドカード* .c)が1.c 2.c 3.c 4.c文字列に展開され、patsubst関数が.cを.oに置き換えます。置換結果を返します。この時点で:objは1.o 2.o 3.o 4.o

notdir関数

フォーマット:

$(notdir <names...> )

機能の概要:

接尾辞を保持しながら、ファイルパスを削除する関数。

例:

dir :=./led/led.c
src :=$(notdir $(dir))

パスを削除します。この時点で、srcの結果がled.cになります。

VPATH

Makefileファイルの特別な変数「VPATH」はこの機能を完了するためのものです。この変数が指定されていない場合、makeは現在のディレクトリ内の依存ファイルとオブジェクトファイルのみを検索します。この変数が定義されている場合、現在のディレクトリが見つからない場合、makeは指定されたディレクトリに移動してファイルを検索します。

静的モード

機能の説明:多目的ルールの定義が簡単です。
フォーマット:

<targets ...>:<target-pattern>:<prereq-patterns>
<commands>
...

ターゲットは、コレクションであり、ワイルドカードを持つことができる一連のターゲットファイルを定義します。
target-patternは、ターゲットのパターンを指定します。つまり、target set pattern
prereq-patternsは、ターゲットの依存関係パターンであり、target-patternによって形成されるパターンは、ターゲットに応じて順番に定義されます。
$(SOBJS):obj /%。o:%。Sは、すべての.Sを.oにコンパイルし、objディレクトリに保存することを意味します。

プロジェクトファイルの構造

.
├── bsp                              # 板级支持包
│   ├── clk                          # 时钟驱动
│   │   ├── bsp_clk.c
│   │   └── bsp_clk.h
│   ├── delay                        # 延时驱动
│   │   ├── bsp_delay.c
│   │   └── bsp_delay.h
│   └── led                          # 链接驱动                 
│       ├── bsp_led.c
│       └── bsp_led.h
├── imx6ul                           # imx6ul官方库函数
│   ├── cc.h
│   ├── fsl_common.h
│   ├── fsl_iomuxc.h
│   ├── imx6ul.h
│   └── MCIMX6Y2.h
├── imx6ul.lds                       # 链接脚本
├── imxdownload                      # 下载脚本
├── ledc_bsp.code-workspace          # vsc工程
├── load.imx
├── Makefile                         
├── obj                              # 存放obj文件
└── project                          # 工程main和start文件
    ├── main.c
    └── start.S

リンクスクリプト:

SECTIONS{
        . = 0X87800000;
        .text :
        {
                obj/start.o
                *(.text)
        }
        .rodata ALIGN(4) : {*(.rodata*)}
        .data ALIGN(4)   : { *(.data) }
        __bss_start = .;
        .bss ALIGN(4)  : { *(.bss)  *(COMMON) }
        __bss_end = .;
}

Makefile

手順の記述:
1。オブジェクトファイルとクロスコンパイルチェーン
の変数を定義します2.ソースファイルパスとヘッダーファイルパスの変数を定義します
3.ヘッダーファイルを参照して-I(patsubst)を追加します
4.検索対応するパスのソースファイル、cおよびSファイル。(foreachワイルドカード)
5。パスなしでソースファイル名に変換します
6.オブジェクトファイルを定義します
7. VPATHパスを指定し、依存関係ファイルとオブジェクトファイルを探す場所をmakeに指示します8.9.clearを書き込んで
コンパイル
済みファイルをクリアします。(.PHONY)

TARGET                          ?= test
CROSS_COMPILER                  ?= arm-linux-gnueabihf-
																	
CC                              := $(CROSS_COMPILER)gcc
LD                              := $(CROSS_COMPILER)ld

OBJCOPY                         := $(CROSS_COMPILER)objcopy
OBJDUMP                         := $(CROSS_COMPILER)objdump

INCDIRS                         := imx6ul\
                                   project\
                                   bsp/led\
								   bsp/delay\
								   bsp/clk
							
SRCDIRS                         := imx6ul\
                                   project\
                                   bsp/led\
								   bsp/delay\
								   bsp/clk
                                   

INCLUDE                         := $(patsubst %, -I %,$(INCDIRS))

# 所有C、S文件的路径及文件名
CFILES                          := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))
SFILES                          := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))

# 所有C、S文件
CFILENDIR                       := $(notdir $(CFILES))
SFILENDIR                       := $(notdir $(SFILES))

# 所有C -> obj文件,放在obj目录下
COBJS                           := $(patsubst %, obj/%, $(CFILENDIR:.c=.o))
SOBJS                           := $(patsubst %, obj/%, $(SFILENDIR:.S=.o))

# 所有的.o文件
OBJS                            := $(SOBJS) $(COBJS)

VPATH                           := $(SRCDIRS)

$(TARGET).bin : $(OBJS)
	$(LD) -Timx6ul.lds -o $(TARGET).elf $^
	$(OBJCOPY) -O binary -S $(TARGET).elf $@
	$(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis

$(SOBJS) : obj/%.o : %.S
	$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<


$(COBJS) : obj/%.o : %.c
	$(CC) -Wall -nostdlib -c -O2  $(INCLUDE) -o $@ $<



.PHONY:clear
clear:
	rm -rf $(OBJS) $(TARGET).bin  $(TARGET).elf  $(TARGET).dis

print:
	@echo INCLUDE = $(INCLUDE)
	@echo CFILES  = $(CFILES) $(SFILES)
	@echo CFILENDIR  = $(CFILENDIR)
	@echo SFILENDIR  = $(SFILENDIR)
	@echo ---OBJ = $(OBJS)

要約:

1.VPATHは、ソースファイルのディレクトリを指定するために使用されます。(現在のディレクトリが見つからない場合は、VPATHディレクトリで探します)それより少なくすることはできません。

2. -o問題、元々输入-o输出入力と出力のブロックを書き込む場合、次のように-oのみを書き込むことができます。输出 输入

3. gccパラメーターの説明:

-Wall编译后显示所有警告
-nostdlib 不链接标准库(启动文件)
-O2 优化编译及效率

4.静的モード

<targets ...>: <target-pattern>: <prereq-patterns ...>

$(OBJS): obj/%.o : %.S 表示将所有的.S文件编译为.o并且存放到obj目录下去。

おすすめ

転載: blog.csdn.net/qq_44078824/article/details/119948816