Makefile理解(4)【Android.mk浅析モジュールコンパイルMakefile作成】


やっとC++コードportingをbootloaderに着いて、唯一の収穫はMakefileに熟知して、工場のある会社は怪我をすることができなくて、毎回すべて先にいくつかのものをして工場の端のテストの需要を満たさなければならなくて、工場がbootの中でテストする要求をやり遂げるために、チップ会社と討論したことがあって、C++をbootの中に入れただけで、本当に2つの決定bootは最終的に2 Mを達成していくつかのkernelよりも大きいです.しかし、ボスがそうするには無理にやったので、今は心の中で喜んでいます.追い詰められた後の人の潜在能力は大きいですね.
Makefileで使われている関数についてはまだ検討中で、後で主な関数の使い方を書きます.
Androidドライバ開発に従事しているので毎日Androidに触れています.mk. 1、運転中です.build/envsetup.shは、chooseproduct mmm 2、chooseproduct projectを実行してコンパイルするプロジェクトを選択し、makeを実行し、android source全体をコンパイルするなどの操作を生成します.
Android Sourceをコンパイルする方法についてどう言いましたか?
テーマに切り込んで簡単なAndroidを書きます.mk
LOCAL_PATH := $(call my-dir)             #      
   
include $(CLEAR_VARS)                    #      

LOCAL_MODULE_TAGS := optional            #              

LOCAL_SRC_FILES := hello.c               #   (      ) 
 
LOCAL_MODULE := hello                    #        

LOCAL_MODULE_CLASS := EXECUTABLES        #           (      system/bin )

include $(BUILD_EXECUTABLE)              #              

以上のAndroid.mkはhelloの実行可能ファイルをコンパイルしsystem/binに入れます
LOCAL_PATH:ディレクトリを指定し、以上が一般的な使い方で現在のディレクトリを示す(my-dir関数がAndroidコンパイル時.build/envsetup.shコマンドで生成された現在のディレクトリを取得できるパス)
CLEAR_VARS:androidには独自のコードコンパイルルールやコンパイルオプションなどの変数の定義があります.この変数は導入されます.実際にはandroid/build/coreの下のclear_vas.mk,
clear_vas.mk
##########################################################
## Clear out values of all variables used by rule templates.
###########################################################

LOCAL_MODULE:=                                                                          
LOCAL_MODULE_PATH:=
LOCAL_MODULE_STEM:=
LOCAL_DONT_CHECK_MODULE:=
LOCAL_CHECKED_MODULE:= 
.
.
.
LOCAL_CERTIFICATE:=
LOCAL_SDK_VERSION:=
LOCAL_NDK_VERSION:=
LOCAL_NO_EMMA_INSTRUMENT:=
LOCAL_NO_EMMA_COMPILE:=
LOCAL_PROGUARD_ENABLED:= # '',optonly,full,custom
LOCAL_PROGUARD_FLAGS:=
LOCAL_PROGUARD_FLAG_FILES:=
LOCAL_EMMA_COVERAGE_FILTER:=
LOCAL_MANIFEST_FILE:=
LOCAL_BUILD_HOST_DEX:=
LOCAL_DEX_PREOPT:=
LOCAL_DEX_PREOPT:=

# Trim MAKEFILE_LIST so that $(call my-dir) doesn't need to
# iterate over thousands of entries every time.
# Leave the current makefile to make sure we don't break anything
# that expects to be able to find the name of the current makefile.
MAKEFILE_LIST := $(lastword $(MAKEFILE_LIST))
C/C++コードをコンパイルするときによく使われる変数定義
LOCAL_MODULEは現在コンパイルされているモジュール名を示します
LOCAL_MODULE_TAGS IDがどのような状況でモジュールをコンパイルするか
いくつかの選択肢があります
user
モジュールはuserでのみコンパイルされます
eng
モジュールはengモードでコンパイルされます
tests
test状態でコンパイル
optional
このモジュールはすべてのバージョンでコンパイルされています
つまりTARGET_BUILD_VARIANT=engコンパイルTAGSはengとoptionalのモジュール
LOCAL_SRC_FILESは、このモジュールをコンパイルするために必要なソースプログラムが複数あることを示す
LOCAL_C_INCLUDE標準ライブラリヘッダファイルと現在のディレクトリのヘッダファイルを呼び出さない場合は、ヘッダファイルの場所を指定し、ヘッダファイルのディレクトリを指定する必要があります.
LOCAL_STATIC_LIBRARIES:接続が必要な静的ライブラリを指定します.一般的な標準ライブラリのように指定する必要はありません.
LOCAL_SHARED_LIBRARIES:接続が必要なダイナミックライブラリを指定する
最後にinclude$(BUILD_XXX)はコンパイルされたモジュールタイプを表し、3種類ある
BUILD_EXECUTABLE
実行可能モジュールにコンパイル
build/core/host_executable.mk
BUILD_STATIC_LIBRARY
静的ライブラリにコンパイル
build/core/host_static_library.mk
BUILD_SHARED_LIBRARY
ダイナミックライブラリにコンパイル
build/core/host_shared_library.mk
LOCAL_MODULE_CLASSは、コンパイルされたモジュールが最後に配置された場所を識別し、指定しないとシステムに配置されず、最後のobjディレクトリの下にある対応するディレクトリに配置されます.
LOCAL_MODULE_CLASS:=ETC#はシステム/etcディレクトリに格納されていることを示します
LOCAL_MODULE_CLASS:=EXECUTABLES#を/system/binに配置
LOCAL_MODULE_CLASS := SHARED_LIBRARIES#を/system/libの下に置く
build/coreの下にはコンパイルC/C++ルールdefinitionsのようなコンパイルされたグローバルなmkがたくさんあります.mk ......
カーネルモジュールをコンパイルするMakefileについて
ifneq ($(KERNELRELEASE),)  #       kernel  

obj-m := gps_onoff.o       #              gps_onoff.o
                           #( linux2.6        module_name.ko module_name.o 
                           #  insmod module_name.ko     moudule_name.o     
                           # moudule_name.ko      )

else                       #            

PWD := $(shell pwd)        #               

KDIR ?= /home/zk/POP_TD/marvell-pxa920-kernel      #             
                           #    PC                
                           #(uname -r          )
                           #(          KERNELRELEASE  )
                              
#                        
all: 
    $(MAKE) -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-eabi- 

#          make clean                  
clean: 
    rm -rf .* *.ko *.o *.cmd *.tmp_version *.mod.c *.order Module.*endif

コンパイルモジュールのMkefileは2回読み込まれますが、Makefileがコマンドラインから呼び出されたときにKERNELLRELEASEは設定されていません.
KDIRで実行するとカーネル構造ツリーを指し、
$(MAKE)を実行するとmakeコマンドが2回目に実行され、obj-mを設定して真のカーネルモジュールを構築します.