Android.mkプロファイルモジュールコンパイルMakefile作成

7699 ワード

やっと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
[python] view plain copy print ?
LOCAL_PATH:=$(call my-dir)#現在のディレクトリを指定
  •     

  • include$(CLEAR_VARS)#コンパイル変数を導入
  •  

  • LOCAL_MODULE_TAGS:=optional#コンパイルオプションをコンパイルする場合
  •  

  • LOCAL_SRC_FILES := hello.c#ソースファイル(複数指定可能)
  •   

  • LOCAL_MODULE:=hello#コンパイルされたモジュール名
  •  

  • LOCAL_MODULE_CLASS:=EXECUTABLES#コンパイル後に配置する場所(ここではシステム/binの下に配置することを示す)
  •  

  • include$(BUILD_EXECUTABLE)#実行可能ファイルにコンパイルするルールを導入する.
    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
    [plain] view plain copy print ?
    ########################################################## 
  • ## 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)) 
    ##########################################################
    ## 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について
    [plain] view plain copy print ?
    ifneq($(KERNELRELEASE)#表示Yes kernelバージョンが定義されています.
  •  

  • obj-m := gps_onoff.o#定義されている場合にコンパイルされたモジュール名はgps_onoff.o 
  • #(linux 2.6モジュールをコンパイルするとmodule_name.ko module_name.o
  • が生成されます.
    #insmod moduleを使用name.モジュールmoudule_をマウントするkoname.o 廃棄済み
  • #moudule_name.koは最終生成物)
  •  
  • else#最初の実行時にこのブランチ
  • が実行されます.
     
  • PWD:=$(shell pwd)#ソースファイルディレクトリ
  • を指定
     
  • KDIR ?=/home/zk/POP_TD/marvell-pxa 920-kernel#コンパイル済みカーネルのディレクトリ
  • に指定
    #コンパイルPCマシンのモジュールが現在実行中のカーネルに指定されている場合
  • #(uname-r現在のカーネルバージョンを表示)
  • #(この時点でカーネルバージョンも定義されているKERNELLRELEASEは空ではない)
  •                                

  • #カーネルコンパイルコマンドここでは、ハードウェアアーキテクチャとクロスコンパイルツールを指定できます.
  • 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 
    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を設定して真のカーネルモジュールを構築します.