안녕하세요. 앤디라이언입니다.
오랜만에 개발 관련 글을 올리게 되네요.
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
...
'개발 이야기' 카테고리의 다른 글
WSL - su: Authentication failure (0) | 2023.01.30 |
---|---|
[linux] WSL (Windows Subsystem Linux) (0) | 2023.01.30 |
[파이썬 완전정복] nltk package (0) | 2020.07.23 |
[파이썬 완전정복] Matplotlib를 이용한 다양한 그래프 (0) | 2020.07.19 |
[파이썬 완전정복] Matplotlib (0) | 2020.07.19 |