This is an archive of the discontinued LLVM Phabricator instance.

lldb: Don't check for CMAKE_SYSTEM_NAME==Android.
Needs ReviewPublic

Authored by pcc on May 25 2021, 4:57 PM.

Details

Summary

CMAKE_SYSTEM_NAME seems to be unreliable for detecting whether the
target is Android. At least on my machine it always turns out to
have the value Linux when targeting Android. Even explicitly passing
-DCMAKE_SYSTEM_NAME=Android to CMake doesn't seem to help. It seems
that CMake is overriding the value that I pass in with a value that
it computed somehow.

To avoid relying on whichever fragile mechanism is used to detect
Android targets, let's just compile the Android source files
unconditionally and use the preprocessor to exclude their contents
on non-Android platforms.

Diff Detail

Event Timeline

pcc created this revision.May 25 2021, 4:57 PM
pcc requested review of this revision.May 25 2021, 4:57 PM
Herald added a project: Restricted Project. · View Herald TranscriptMay 25 2021, 4:57 PM
labath added a comment.Sep 6 2021, 6:00 AM

How exactly are you building this? CMAKE_SYSTEM_NAME is set in the official android cmake toolchain file (https://android.googlesource.com/platform/ndk/+/refs/heads/ndk-release-r23/build/cmake/android.toolchain.cmake#213)

pcc added a comment.Sep 8 2021, 1:12 PM

How exactly are you building this? CMAKE_SYSTEM_NAME is set in the official android cmake toolchain file (https://android.googlesource.com/platform/ndk/+/refs/heads/ndk-release-r23/build/cmake/android.toolchain.cmake#213)

I configured cmake using a script that looks like this:

#!/bin/sh

target_flags='--target=aarch64-linux-android21 --sysroot=/path/to/android-ndk-r21-beta1/toolchains/llvm/prebuilt/linux-x86_64/sysroot --gcc-toolchain=/path/to/android-ndk-r21-beta1/toolchains/llvm/prebuilt/linux-x86_64 -mno-outline-atomics'

cmake \
  -GNinja \
  -DCMAKE_BUILD_TYPE=Release \
  -DLLVM_ENABLE_ASSERTIONS=ON \
  -DCMAKE_C_COMPILER=`pwd`/../ra/bin/clang \
  -DCMAKE_CXX_COMPILER=`pwd`/../ra/bin/clang++ \
  -DLLVM_ENABLE_THREADS=OFF \
  -DLLVM_CONFIG_PATH=`pwd`/../ra/bin/llvm-config \
  "-DCMAKE_C_FLAGS=$target_flags" \
  "-DCMAKE_CXX_FLAGS=$target_flags" \
  "-DCMAKE_ASM_FLAGS=$target_flags" \
  -DSANITIZER_CXX_ABI=none \
  -DSANITIZER_CXX_ABI_LIBRARY=c++abi \
  -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=lld -Wl,-lstdc++ -static-libstdc++ --rtlib=libgcc" \
  -DCMAKE_SHARED_LINKER_FLAGS=-Wl,-u__cxa_demangle \
  -DANDROID=1 \
  -DCOMPILER_RT_INCLUDE_TESTS=ON \
  "-DCOMPILER_RT_TEST_COMPILER_CFLAGS=$target_flags" \
  -DLLVM_TABLEGEN=`pwd`/../ra/bin/llvm-tblgen \
  -DLLDB_TABLEGEN=`pwd`/../ra/bin/lldb-tblgen \
  -DCLANG_TABLEGEN=`pwd`/../ra/bin/clang-tblgen \
  -DLLVM_ENABLE_PROJECTS='clang;lldb' \
  -DLLDB_ENABLE_LIBEDIT=0 \
  -DLLDB_ENABLE_LIBXML2=0 \
  -DLLVM_HOST_TRIPLE=aarch64-linux-android21 \
  -DCMAKE_SYSTEM_NAME=Android \
  -DLLVM_TARGETS_TO_BUILD='X86;AArch64' \
  ../../llvm

But now I'm switching to gn to build LLDB, so I don't need to worry about this any more.

How exactly are you building this? CMAKE_SYSTEM_NAME is set in the official android cmake toolchain file (https://android.googlesource.com/platform/ndk/+/refs/heads/ndk-release-r23/build/cmake/android.toolchain.cmake#213)

I configured cmake using a script that looks like this:

#!/bin/sh

target_flags='--target=aarch64-linux-android21 --sysroot=/path/to/android-ndk-r21-beta1/toolchains/llvm/prebuilt/linux-x86_64/sysroot --gcc-toolchain=/path/to/android-ndk-r21-beta1/toolchains/llvm/prebuilt/linux-x86_64 -mno-outline-atomics'

cmake \
  -GNinja \
  -DCMAKE_BUILD_TYPE=Release \
  -DLLVM_ENABLE_ASSERTIONS=ON \
  -DCMAKE_C_COMPILER=`pwd`/../ra/bin/clang \
  -DCMAKE_CXX_COMPILER=`pwd`/../ra/bin/clang++ \
  -DLLVM_ENABLE_THREADS=OFF \
  -DLLVM_CONFIG_PATH=`pwd`/../ra/bin/llvm-config \
  "-DCMAKE_C_FLAGS=$target_flags" \
  "-DCMAKE_CXX_FLAGS=$target_flags" \
  "-DCMAKE_ASM_FLAGS=$target_flags" \
  -DSANITIZER_CXX_ABI=none \
  -DSANITIZER_CXX_ABI_LIBRARY=c++abi \
  -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=lld -Wl,-lstdc++ -static-libstdc++ --rtlib=libgcc" \
  -DCMAKE_SHARED_LINKER_FLAGS=-Wl,-u__cxa_demangle \
  -DANDROID=1 \
  -DCOMPILER_RT_INCLUDE_TESTS=ON \
  "-DCOMPILER_RT_TEST_COMPILER_CFLAGS=$target_flags" \
  -DLLVM_TABLEGEN=`pwd`/../ra/bin/llvm-tblgen \
  -DLLDB_TABLEGEN=`pwd`/../ra/bin/lldb-tblgen \
  -DCLANG_TABLEGEN=`pwd`/../ra/bin/clang-tblgen \
  -DLLVM_ENABLE_PROJECTS='clang;lldb' \
  -DLLDB_ENABLE_LIBEDIT=0 \
  -DLLDB_ENABLE_LIBXML2=0 \
  -DLLVM_HOST_TRIPLE=aarch64-linux-android21 \
  -DCMAKE_SYSTEM_NAME=Android \
  -DLLVM_TARGETS_TO_BUILD='X86;AArch64' \
  ../../llvm

But now I'm switching to gn to build LLDB, so I don't need to worry about this any more.

Yeah, that's not really the right way to use cmake. You're supposed to create a toolchain file (similar to the android one), and use appropriate cmake variables (like CMAKE_SYSROOT) instead of putting everything inside CXXFLAGS. From within the toolchain file, you could also set the right value of CMAKE_SYSTEM_NAME, and then everything would work.

JDevlieghere resigned from this revision.Sep 20 2021, 3:56 PM