標籤:編譯 android makefile
Makefile檔案的規則格式TARGET:PREFEQUISTES COMMANDS
main.c #include <stdio.h>#include <utility.h>int main(int argc,char *argv[]){ printf("%d",getNumber()); return 0;}utility.hint getNumber();utility.cint getNumber(){ return 2;}
例子
SimpleMakefile:main.o utility.o gcc -o SimpleMakefile main.o utility.omain.o:main.c gcc -c main.cutility.o:utility.c gcc -c utility.cMakefile(另一種寫法)OBEJCT=main.o utility.oSimpleMakefile:$(OBEJCT)gcc -o SimpleMakefile $(OBEJCT)
Android 系統的編譯:
- 1.Makefile->build/core/main.mk
main.mk的droid流程
APP:droid->app_only->$(unbunled_build_modules)
系統:droid->droidcore
->dist_files
main.mk的定製檔案(處理屬性 零件)
vendorsetup.sh (出現在envsetup.sh)
AndroidProducts.mk
BoardConfig.mk
Android.mk (出現在main.mk)
- droidcore編譯過程
# 產生droidcore的過程 主要files 與最後一個產生的installed-files.txt記錄預先安裝程式模組# 負責產生系統的所有可執行程式包 如system.img boot.img recovery.img等.PHONY: droidcoredroidcore: files systemimage $(INSTALLED_BOOTIMAGE_TARGET) $(INSTALLED_RECOVERYIMAGE_TARGET) $(INSTALLED_USERDATAIMAGE_TARGET) $(INSTALLED_CACHEIMAGE_TARGET) $(INSTALLED_VENDORIMAGE_TARGET) $(INSTALLED_FILES_FILE)------------------------------files-----------------------------------------# 重點看files產生過程# prebuilt 該機制用於早期版本.PHONY: filesfiles: prebuilt $(modules_to_install) $(INSTALLED_ANDROID_INFO_TXT_TARGET)# 描述系統需要安裝的模組# product_FILES各modules安裝檔案的列表# tags_to_install 通過標誌選擇性編譯的模組# get-tagged-modules 判斷目標是否有“拒絕”標籤,如果有 則不被編譯modules_to_install := $(sort $(ALL_DEFAULT_INSTALLED_MODULES) $(product_FILES) $(foreach tag,$(tags_to_install),$($(tag)_MODULES)) $(call get-tagged-modules, shell_$(TARGET_SHELL)) $(CUSTOM_MODULES) )----------------------------------------------------------------------------------------------------------systemimage-----------------------------------# 該定義在build/core/Makefile# BUILT_SYSTEMIMAGE := $(systemimage_intermediates)/system.img 最終產生system.img檔案# [email protected] 代表target的集合$(INSTALLED_SYSTEMIMAGE): $(BUILT_SYSTEMIMAGE) $(RECOVERY_FROM_BOOT_PATCH) | $(ACP) @echo "Install system fs image: [email protected]" $(copy-file-to-target) $(hide) $(call assert-max-image-size,[email protected] $(RECOVERY_FROM_BOOT_PATCH),$(BOARD_SYSTEMIMAGE_PARTITION_SIZE),yaffs)systemimage: $(INSTALLED_SYSTEMIMAGE)----------------------------------------------------------------------------
- dist_files編譯過程
# 在out目錄下產生dist檔案夾用於儲存多種分發包 # dist_files only for putting your library into the dist directory with a full build..PHONY: dist_files
Android.mk系統例子
- 以 $(源碼)\system\core\adb 項目的android.mk為例
# Copyright 2005 The Android Open Source Project## Android.mk for adb#LOCAL_PATH:= $(call my-dir)# adb host tool# =========================================================# CLEAR_VARS清除上百個LOCAL_PATH外的變數include $(CLEAR_VARS)# Default to a virtual (sockets) usb interface# 定義usb驅動USB_SRCS :=EXTRA_SRCS :=ifeq ($(HOST_OS),linux) USB_SRCS := usb_linux.c EXTRA_SRCS := get_my_path_linux.c LOCAL_LDLIBS += -lrt -ldl -lpthread LOCAL_CFLAGS += -DWORKAROUND_BUG6558362endififeq ($(HOST_OS),darwin) USB_SRCS := usb_osx.c EXTRA_SRCS := get_my_path_darwin.c LOCAL_LDLIBS += -lpthread -framework CoreFoundation -framework IOKit -framework Carbonendififeq ($(HOST_OS),freebsd) USB_SRCS := usb_libusb.c EXTRA_SRCS := get_my_path_freebsd.c LOCAL_LDLIBS += -lpthread -lusbendififeq ($(HOST_OS),windows) USB_SRCS := usb_windows.c EXTRA_SRCS := get_my_path_windows.c ../libcutils/list.c EXTRA_STATIC_LIBS := AdbWinApi ifneq ($(strip $(USE_CYGWIN)),) # Pure cygwin case LOCAL_LDLIBS += -lpthread -lgdi32 LOCAL_C_INCLUDES += /usr/include/w32api/ddk endif ifneq ($(strip $(USE_MINGW)),) # MinGW under Linux case LOCAL_LDLIBS += -lws2_32 -lgdi32 USE_SYSDEPS_WIN32 := 1 LOCAL_C_INCLUDES += /usr/i586-mingw32msvc/include/ddk endif LOCAL_C_INCLUDES += development/host/windows/usb/api/endif# 定義本模組所用到的所有源檔案 包括上面用的驅動變數LOCAL_SRC_FILES := adb.c console.c transport.c transport_local.c transport_usb.c commandline.c adb_client.c adb_auth_host.c sockets.c services.c file_sync_client.c $(EXTRA_SRCS) $(USB_SRCS) usb_vendors.cLOCAL_C_INCLUDES += external/openssl/includeifneq ($(USE_SYSDEPS_WIN32),) LOCAL_SRC_FILES += sysdeps_win32.celse LOCAL_SRC_FILES += fdevent.cendifLOCAL_CFLAGS += -O2 -g -DADB_HOST=1 -Wall -Wno-unused-parameterLOCAL_CFLAGS += -D_XOPEN_SOURCE -D_GNU_SOURCE# 所要產生的模組名稱LOCAL_MODULE := adbLOCAL_MODULE_TAGS := debug# 編譯需要用到的庫LOCAL_STATIC_LIBRARIES := libzipfile libunz libcrypto_static $(EXTRA_STATIC_LIBS)ifeq ($(USE_SYSDEPS_WIN32),) LOCAL_STATIC_LIBRARIES += libcutilsendif# 表示產生一個Host可執行檔include $(BUILD_HOST_EXECUTABLE)$(call dist-for-goals,dist_files sdk,$(LOCAL_BUILT_MODULE))ifeq ($(HOST_OS),windows)$(LOCAL_INSTALLED_MODULE): $(HOST_OUT_EXECUTABLES)/AdbWinApi.dll $(HOST_OUT_EXECUTABLES)/AdbWinUsbApi.dllendif# adbd device daemon# =========================================================# 第二個模組編譯開始標誌include $(CLEAR_VARS)LOCAL_SRC_FILES := adb.c backup_service.c fdevent.c transport.c transport_local.c transport_usb.c adb_auth_client.c sockets.c services.c file_sync_service.c jdwp_service.c framebuffer_service.c remount_service.c usb_linux_client.c log_service.cLOCAL_CFLAGS := -O2 -g -DADB_HOST=0 -Wall -Wno-unused-parameterLOCAL_CFLAGS += -D_XOPEN_SOURCE -D_GNU_SOURCEifneq (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT)))LOCAL_CFLAGS += -DALLOW_ADBD_ROOT=1endif# 所要產生的模組名稱LOCAL_MODULE := adbdLOCAL_FORCE_STATIC_EXECUTABLE := trueLOCAL_MODULE_PATH := $(TARGET_ROOT_OUT_SBIN)LOCAL_UNSTRIPPED_PATH := $(TARGET_ROOT_OUT_SBIN_UNSTRIPPED)LOCAL_STATIC_LIBRARIES := liblog libcutils libc libmincrypt# 產生adbd可執行檔include $(BUILD_EXECUTABLE)
Android.mk變數解析
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Android編譯系統初涉