AOSP build on ARM for ARM 2일차


전에 만들었던 AZURE ARM VM 인스턴스를 다시 시작시키고, 돈도 확인하고 214,015원 크레딧 남았다고 뜨네요. 하루 만원씩 꼬박꼬박 나가는것 같기도 하고요.. 9월에 이 프로젝트는 끝내야 겠네요.

여러가지 Build error를 만나고 일단 prebuilts 툴들부터 ARM64용으로 싹 다 교체를 들어갑니다.. 일단 lunch를 통과해야하니.. 급한 go부터 갈아치워봅시다.
go는 다행스럽게도 메인 프로젝트에서 ARM용 바이너리를 만들고 있습니다.
https://go.dev/dl/에서
go1.19.linux-arm64.tar.gz 다운로드
현재 AOSP master branch에서 사용하는 go는 최신 1.19이므로(ubuntu 20.04에서는 1.13을 설치해서 별 도움 안되고. 22.04 도 기대하긴 힘드니. 그냥 바이너리를 받아서 /prebuilts/go/linux-aarch64 에 다가 몽땅 풀어줍시다. 풀면 go 디렉토리가 나오는데 이걸 linux-aarch64로 변환

그리고 각종 스크립트를 뜯어 고치기 시작합니다. 최종 목표는 prebuilts/linux-x86에 들어 있는 모든 바이너리, 라이브러리에 상응하는 prebuilts/linux-aarch64로 똑같이 만들어 넣어주는 것입니다.

  • build/soong/scripts/microfactory.bash
    lunch실행 못 하는게 go때문이라서, 우선 잡아줘야 하고요.
    diff --git a/scripts/microfactory.bash b/scripts/microfactory.bash
    index 192b38f23..67230c73c 100644
    --- a/scripts/microfactory.bash
    +++ b/scripts/microfactory.bash
    @@ -23,8 +23,15 @@
    # Ensure GOROOT is set to the in-tree version.
    case $(uname) in
    Linux)
    - export GOROOT="${TOP}/prebuilts/go/linux-x86/"
    - ;;
    + case $(uname -m) in
    + aarch64)
    + export GOROOT="${TOP}/prebuilts/go/linux-aarch64/"
    + ;;
    + *)
    + export GOROOT="${TOP}/prebuilts/go/linux-x86/"
    + ;;
    + esac
    + ;; Darwin) export GOROOT="${TOP}/prebuilts/go/darwin-x86/" ;;
  • prebuilts/build-tools/build-prebuilts.sh
    그 뒤 자동으로 prebuilts 파일들을 만들어 줄 것으로 기대했으나. 역시나 누가 만들다가 말았던가 없앤 모양입니다. x86과 이해관계가 있는 사람들일것으로 의심을 하지만, x86이 주류 개발 플랫폼인건 어쩔 수 없으니.. 에휴.. Darwin도 뭔가 지원이 이상하고.. Apple형님들이 M1에서 쓸 걸로 좀 만들어 주면 좋은데… AOSP니 안하겠죠?? MS형님들에게 기대해야하나… 싶지만, 그래서 제가 합니다. 이 파일에서는 arm64로 machine 이름을 이미 musl 라이브러리 빌드시 사용하고 있어서. 그대로 일단 차용은 했는데. 글쎄요. 나중에 다시 정리하도록 하죠. 근데… 워드프레스 편집기 바꾸고 싶은 마음이 심히 샘솟는 군요.

    ID@AOSPonARM:/mnt/bsp/prebuilts/build-tools$ git diff
    diff --git a/build-prebuilts.sh b/build-prebuilts.sh
    index 7973148..a9dd177 100755
    --- a/build-prebuilts.sh
    +++ b/build-prebuilts.sh
    @@ -35,6 +35,7 @@ build_soong=1
    use_musl=false
    clean=true
    +host_arch="x86_64"
    while getopts ":-:" opt; do
    case "$opt" in
    -)
    @@ -43,6 +44,9 @@ while getopts ":-:" opt; do
    musl) use_musl=true ;;
    skip-go) unset build_go ;;
    skip-soong-tests) skip_soong_tests=--skip-soong-tests ;;
    armonarm) use_armhost=true
    use_musl=true
    host_arch="arm64" ;;
    *) echo "Unknown option --${OPTARG}"; exit 1 ;;
    esac;;
    *) echo "'${opt}' '${OPTARG}'"
    @@ -71,18 +75,26 @@ EOF
    fi Use toybox and other prebuilts even outside of the build (test running, go, etc) -export PATH=${TOP}/prebuilts/build-tools/path/${OS}-x86:$PATH
    +if [ -n "${use_armhost}" ]; then

    export PATH=${TOP}/prebuilts/build-tools/path/${OS}-arm64:$PATH
    +else

    export PATH=${TOP}/prebuilts/build-tools/path/${OS}-x86:$PATH
    +fi if [ -n "${build_soong}" ]; then
    SOONG_OUT=${OUT_DIR}/soong

    SOONG_HOST_OUT=${OUT_DIR}/soong/host/${OS}-x86
    if [ -n "${use_armhost}" ]; then
    SOONG_HOST_OUT=${OUT_DIR}/soong/host/${OS}-arm64
    else
    SOONG_HOST_OUT=${OUT_DIR}/soong/host/${OS}-x86
    fi
    [[ -z "${clean}" ]] || rm -rf ${SOONG_OUT}
    mkdir -p ${SOONG_OUT}
    rm -rf ${SOONG_OUT}/dist ${SOONG_OUT}/dist-common
    cat > ${SOONG_OUT}/soong.variables << EOF
    {
    "Allow_missing_dependencies": true,

    "HostArch":"x86_64",
    "HostArch":${host_arch},
    ${secondary_arch}
    ${cross_compile}
    "HostMusl": $use_musl,
    @@ -237,7 +249,7 @@ EOF
    cat > ${SOONG_OUT}/soong.variables << EOF
    {
    "Allow_missing_dependencies": true,

    "HostArch":"x86_64",
    "HostArch":${host_arch},
    ${secondary_arch}
    "SanitizeHost": ["address"],
    "VendorVars": {
    @@ -248,7 +260,11 @@ EOF
    }
    EOF

    export ASAN_SYMBOLIZER_PATH=${PWD}/prebuilts/clang/host/linux-x86/llvm-binutils-stable/llvm-symbolizer
    if [ -n "${use_armhost}" ]; then
    export ASAN_SYMBOLIZER_PATH=${PWD}/prebuilts/clang/host/linux-arm64/llvm-binutils-stable/llvm-symbolizer
    else
    export ASAN_SYMBOLIZER_PATH=${PWD}/prebuilts/clang/host/linux-x86/llvm-binutils-stable/llvm-symbolizer
    fi # Clean up non-ASAN installed versions
    rm -rf ${SOONG_HOST_OUT}
    @@ -292,8 +308,14 @@ if [ -n "${build_go}" ]; then
    cp -a ${TOP}/toolchain/go/* ${GO_OUT}/
    (
    cd ${GO_OUT}/src
    export GOROOT_BOOTSTRAP=${TOP}/prebuilts/go/${OS}-x86
    export GOROOT_FINAL=./prebuilts/go/${OS}-x86
    +

    if [ -n "${use_armhost}" ]; then
    export GOROOT_BOOTSTRAP=${TOP}/prebuilts/go/${OS}-x86
    export GOROOT_FINAL=./prebuilts/go/${OS}-x86
    else
    export GOROOT_BOOTSTRAP=${TOP}/prebuilts/go/${OS}-arm64
    export GOROOT_FINAL=./prebuilts/go/${OS}-arm64
    fi
    export GO_TEST_TIMEOUT_SCALE=100
    ./make.bash
    rm -rf ../pkg/bootstrap

이 정도 수정하고 lunch 하면 ckati가 딴지겁니다..

You're building on Linux

Warning: Cannot display lunch menu.

Note: You can invoke lunch with an explicit target:

usage: lunch [target]

Which would you like? [aosp_arm-eng]
Pick from common choices above (e.g. 13) or specify your own (e.g. aosp_barbet-eng):
16:01:46 Build sandboxing disabled due to nsjail error.
16:01:46 Failed to run dumpvars: fork/exec prebuilts/build-tools/linux-x86/bin/ckati: exec format error

그래서 AOSP소스 루트에서 prebuilts/build-tools/build-prebuilts.sh –armonarm 을 호기롭게 실행시켜보면, 딱 수정한만큼 보람차게 마음엔 안내키지만 그래도 반가운 Warning을 보게 되고, soong_ui.bash실행에서 ninja가 딴지 거는 것을 볼 수 있습니다. 이제 다음 타겟은 이 두 녀석이 되겠네요…

16:03:39 ****
16:03:39 You are building on a machine with 15.6GB of RAM
16:03:39
16:03:39 The minimum required amount of free memory is around 16GB,
16:03:39 and even with that, some configurations may not work.
16:03:39
16:03:39 If you run into segfaults or other errors, try reducing your
16:03:39 -j value.
16:03:39 **
16:03:40 Build sandboxing disabled due to nsjail error.
16:03:40 Failed to run soong bootstrap: fork/exec prebuilts/build-tools/linux-x86/bin/ninja: exec format error