개발 이야기

How to use Android.bp using Soong build system

ANDYLION 2022. 2. 5. 18:56
728x90
반응형

안녕하세요. 앤디라이언입니다.
오랜만에 개발 관련 글을 올리게 되네요. 
google AOSP11 작업 중에 Android.mk로 작성된 내용을
Android.bp로 변환하는 작업할 진행했습니다.
 

Soong build system

Google의 Android Version 업데이트마다 다양한 변경점에 대해 공지를 해주고 있습니다.
Android 11(R)의 경우 Android.mk와 Android.bp를 같이 사용할 수 있지만,
앞으로 추세가 Android.mk를 지원하지 않고, Android.bp만 지원할 것으로 예상됩니다.
soong build system은 Make를 대체하기 위해 Android 7.0 (Nouget)에 처음 도입되었습니다.
이 시스템은 Kati GNU Make 클론 도구와 Ninja 빌드 시스템 구성요소를 활용하여
Android 빌드 속도를 높입니다.
 

Make and Soong

다음은 google에서 만든 예시입니다.
Example for Make

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := libxmlrpc++
LOCAL_MODULE_HOST_OS := linux

LOCAL_RTTI_FLAG := -frtti
LOCAL_CPPFLAGS := -Wall -Werror -fexceptions
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/src

LOCAL_SRC_FILES := $(call \
     all-cpp-files-under,src)
include $(BUILD_SHARED_LIBRARY)

 
Example for Soong

cc_library_shared {
     name: “libxmlrpc++”,

     rtti: true,
     cppflags: [
           “-Wall”,
           “-Werror”,
           “-fexceptions”,
     ],
     export_include_dirs: [“src”],
     srcs: [“src/**/*.cpp”],

     target: {
           darwin: {
                enabled: false,
           },
     },
}

 
 

Namespace Module

Android가 Make에서 Soong으로 전환될 때까지는 Make 제품 구성에서
PRODUCT_SOONG_NAMESPACES 값을 지정해야 합니다.
이 값은 Soong이 m 명령어로 빌드하기 위해 Make로 내보내는,
공백으로 구분된 네임스페이스 목록이어야 합니다.
Android의 Soong 전환이 완료되면 네임스페이스를
사용하는 세부사항이 변경될 수 있습니다.

# example for android.googlesource.com

SOONG_CONFIG_NAMESPACES += acme
SOONG_CONFIG_acme += \
    board \
    feature \
    width \

SOONG_CONFIG_acme_board := soc_c

 

Usage Example

실제 사용 사례입니다.
먼저 기존 Android.mk에 있는 condition flag 입니다.

ifeq ($(ANDY_BOARD_FLAG), true)
CFLAGS += MODULE_TEST
endif

CFLAGS를 제어하기 위한 조건 플레그는 Android.bp를 통해 제어할 수 없었습니다.
그래서 먼저 Android.mk가 아닌 andy_module.mk에
soong build system 관련 내용을 추가합니다.
 
andy_module.mk

 MODULE_TEST ?= 0 # First Value set
 
 ifeq ($(ANDY_BOARD_FLAG), true)
 MODULE_TEST := 1 # If the condition is satisfied
 endif
 
 
 # Setup configuration in Soong namespace
 SOONG_CONFIG_NAMESPACES += andy_module
 SOONG_CONFIG_andy_module := \
 		m_use_test
        
 SOONG_CONFIG_andy_module_m_use_test := $(MODULE_TEST)

 
Android.bp에 해당 cflags가 동작할 수 있도록 android.bp에 추가해줍니다.
 
Android.bp

...

soong_config_module_type {
	...
    	[
        	...
            # andy add code
            "m_use_test",
        ],
        
        properties: [
        	"cflags",
            ...,
        ],
        
        ...
}

# andy add code
soong_config_bool_variable {
	name : "m_use_test",
}

# cc_default example
cc_defaults {
    name: "gzip_defaults",
    shared_libs: ["libz"],
    stl: "none",
    ...
    # andy add code
    m_use_test: {
    	cflags: [
    		"-DMODULE_TEST",
        ],
    },
}

 
코드에 정의 관련 내용을 추가하고 동작시키면 로그를 확인할 수 있다.
 
example.cpp

...

#if defined(MODULE_TEST) && (MODULE_TEST == 1)
	ALOGE("Andy : MODULE_TEST=%d",MODULE_TEST); // MODULE_TEST=1
#else
	ALOGE("Andy : MODULE_TEST=%d",MODULE_TEST); // MODULE_TEST=0
#endif

...

 

728x90
반응형
SMALL