[RK3399] [Android7.1] Android Ninja 컴파일링 시스템 소개

Platform: rk3399 OS: Android 7.1 Kernel: v4.4.83
Android7.0 이후부터 GNU make 컴파일 시스템 대신 Ninja를 사용합니다.
개념:
Ninja: 컴파일 속도를 높이는 컴파일 시스템입니다.실행 가능한 파일은prebuilts/ninja/linux-x86/ninja에 있습니다
Kati: Makefiel을 ninja file로 변환하는 데 사용되며, 자체적으로 컴파일 능력이 없으며, 변환 후 Ninja로 컴파일합니다.원본 코드는:build/kati 실행 가능한 파일로 생성됩니다:out/host/linux-x86/bin/ckati 사용 방법은 README를 참고할 수 있습니다.md
Soong: 블루프린트 파일(Android.bp)을 니나 파일로 만들고 니나로 컴파일하는 데 사용되며, 현재 rk3399는 이 기능을 사용하지 않습니다.Soong은 시스템의 모든 안드로이드를 교체하는 장기적인 계획입니다.mk.
따라서 Kati는 모든 안드로이드를 포함하는 Google 전환 도구와 비슷합니다.mk가 안드로이드로 바뀌었습니다.bp 이후 Kati를 대체하기 위해 Soong 도구가 열릴 것이라고 믿습니다.
Ninja 사용:
현재android시스템이 모두ninja컴파일러로 전환되지 않았기 때문에 컴파일 입구는 이전의 방법과 마찬가지로make명령을 사용합니다.
source build/envsetup.sh
lunch
make -j8

kati readme의 요구 사항에 따라 ninja를 사용하려면 USE 를 정의해야 합니다.NINJA는 true이고 android에서는 기본적으로 USE가 정의되어 있지 않지만NINJA, 그러나 relaunchwith_ninja는true입니다.build/core/ninja를 포함합니다.mk, 니자컴파일을 사용합니다.
main.mk:
relaunch_with_ninja :=
ifneq ($(USE_NINJA),false)
ifndef BUILDING_WITH_NINJA
relaunch_with_ninja := true
endif
endif

ifeq ($(relaunch_with_ninja),true)
# Mark this is a ninja build.
$(shell mkdir -p $(OUT_DIR) && touch $(OUT_DIR)/ninja_build)
include build/core/ninja.mk
else # !relaunch_with_ninja
......
endif

ckati의 생성:
kati의 경로는 ninja에 정의되어 있습니다.mk 중
KATI ?= $(HOST_OUT_EXECUTABLES)/ckati
HOST_OUT_EXECUTABLES  out/host/linux-x86/bin

ckati를 생성하는 규칙은build/kati/Makefile입니다.ckati 중:
$(KATI_BIN_PATH)/ckati: $(KATI_CXX_OBJS) $(KATI_CXX_GENERATED_OBJS)
    @mkdir -p $(dir $@)
    $(KATI_LD) -std=c++11 $(KATI_CXXFLAGS) -o $@ $^ $(KATI_LIBS)

ninja.mk는 이 파일을 포함하고 kati 원본의 변수 KATI 바꾸기BIN_PATH에서 생성된 ckati 경로 사용자 정의
KATI_INTERMEDIATES_PATH := $(HOST_OUT_INTERMEDIATES)/EXECUTABLES/ckati_intermediates
KATI_BIN_PATH := $(HOST_OUT_EXECUTABLES)
include build/kati/Makefile.ckati

ninja 파일 생성:
카티가 생기면 니나 파일을 만들 수 있어요.
$(KATI_BUILD_NINJA): $(KATI) $(MAKEPARALLEL) $(DUMMY_OUT_MKS) $(SOONG_ANDROID_MK) FORCE
    @echo Running kati to generate build$(KATI_NINJA_SUFFIX).ninja...
    #kati        
    +$(hide) $(KATI_MAKEPARALLEL) $(KATI) --ninja --ninja_dir=$(OUT_DIR) --ninja_suffix=$(KATI_NINJA_SUFFIX) --regen --ignore_dirty=$(OUT_DIR)/% --no_ignore_dirty=$(SOONG_ANDROID_MK) --ignore_optional_include=$(OUT_DIR)/%.P --detect_android_echo $(KATI_FIND_EMULATOR) -f build/core/main.mk $(KATI_GOALS) --gen_all_targets BUILDING_WITH_NINJA=true SOONG_ANDROID_MK=$(SOONG_ANDROID_MK)

KATI_BUILD_NINJA 값: KATI_BUILD_NINJA := $(OUT_DIR)/build$(KATI_NINJA_SUFFIX).ninjaKATI_NINJA_SUFFIX 값: KATI_NINJA_SUFFIX := -$(TARGET_PRODUCT)build android에서 Log:
Running kati to generate build-rk3399_firefly_edp_box.ninja...
/home/kris/firefly_rk3399/out/host/linux-x86/bin/ckati was modified, regenerating...

Ninja 컴파일링:
.PHONY: ninja_wrapper
ninja_wrapper: $(COMBINED_BUILD_NINJA) $(MAKEPARALLEL)
    @echo Starting build with ninja
    +$(hide) export NINJA_STATUS="$(NINJA_STATUS)" && source $(KATI_ENV_SH) && $(NINJA_MAKEPARALLEL) $(NINJA) $(NINJA_GOALS) -C $(TOP) -f $(COMBINED_BUILD_NINJA) $(NINJA_ARGS)

make 시 아래 명령은 니자wrapper
$(sort $(DEFAULT_GOAL) $(ANDROID_GOALS)) : ninja_wrapper
    @#empty

참조:
Android now builds with ninja는 Soong을 사용하여 Android 모듈의 구축 soong Android 7.0 Ninja 컴파일 원리 Ninja 안드로이드의 Ninja 소개 안드로이드의 Kati

좋은 웹페이지 즐겨찾기