[Toybox] llvm regression test.
Rob Landley
rob at landley.net
Mon May 4 15:03:29 PDT 2020
So I'm trying to build under llvm again, and rather than download a new NDK I
thought I'd just repo sync and try using the AOSP compiler. Unfortunately, there
still isn't a consistent URL _to_ said compiler?
$ ls ~/android/aosp/prebuilts/clang/host/linux-x86/clang-stable/bin/
clang-format git-clang-format
Ok, grab the highest version clang-*/bin instead and:
$ ln -s clang
~/android/aosp/prebuilts/clang/host/linux-x86/clang-r377782d/bin/llvm-cc
$ make root
CROSS_COMPILE=~/android/aosp/prebuilts/clang/host/linux-x86/clang-r377782d/bin/llvm-
Make generated/config.h from .config.
generated/flags.h /usr/bin/env: 'python': No such file or directory
/usr/bin/env: 'python': No such file or directory
Um... what?
$ head -n 5 ~/android/aosp/prebuilts/clang/host/linux-x86/clang-r377782d/bin/llvm-cc
#!/usr/bin/env python
#
# Copyright (C) 2017 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
Really, AOSP? Python as a dependency to run the compiler? What is this script
doing...
def main(argv):
cw = CompilerWrapper(argv)
if BISECT_STAGE and BISECT_STAGE in bisect_driver.VALID_MODES\
and '-o' in argv:
cw.bisect()
else:
cw.invoke_compiler()
Bisect? What...
self.execargs += ['-fno-color-diagnostics'] + disabled_warnings
def process_gomacc_command(self):
"""Return the gomacc command if '--gomacc-path' is set."""
gomacc = self.custom_flags['--gomacc-path']
I am very confused.
BISECT_STAGE = os.environ.get('BISECT_STAGE')
# We do not need bisect functionality with Goma and clang.
# Goma server does not have bisect_driver, so we only import
# bisect_driver when needed. See http://b/34862041
# We should be careful when doing imports because of Goma.
if BISECT_STAGE:
import bisect_driver
What portion of this script does what when? Right, assuming all the bisect stuff
is ignorable and the command line editing isn't relevant, where's the real
binary it passes through to?
$ find clang-r377782d -name clang | xargs file
clang-r377782d/include/clang: directory
clang-r377782d/bin/clang: Python script, ASCII text executable
clang-r377782d/lib64/clang: directory
clang-r377782d/lib64/cmake/clang: directory
clang-r377782d/share/clang: directory
Right, back to the NDK...
$ find android-ndk-r21 -name clang
android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/bin/clang
android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/lib64/clang
android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64/share/clang
Oh darn, I remember this was nonobvious too. (And changed from how it _used_ to
work...)
Sigh. I googled "android ndk" and got a page of icons trying to look like a
phone (https://developer.android.com/ndk) from which the getting started guide
is entirely about the IDE GUI (https://developer.android.com/ndk/guides) with no
mention of the command line. I googled "how do I compile hello world with the
android ndk" and got a page about java
(https://www3.ntu.edu.sg/home/ehchua/programming/android/Android_NDK.html).
So I dug up my notes and the page I'd bookmarked says "obsolete":
https://developer.android.com/ndk/guides/standalone_toolchain
But it links to:
https://developer.android.com/ndk/guides/other_build_systems
Which... is wrong? It says:
$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/clang++ \
-target aarch64-linux-android21 foo.cpp
$ ls toolchains/llvm/prebuilt/linux-x86_64/
aarch64-linux-android lib NOTICE
AndroidVersion.txt lib64 prebuilt_include
arm-linux-androideabi libexec share
bin manifest_6317467.xml sysroot
i686-linux-android MODULE_LICENSE_BSD_LIKE test
include MODULE_LICENSE_MIT x86_64-linux-android
I guess $HOST_TAG should be set to "linux-x86_64/bin" perhaps? Because there's
no clang++ in the linux-x86_64/ directory, and using binaries out of the wrong
directory is the rathole I went down before... Alright, let's go back to
guessing whack-a-mole. (I REALLY hope I don't _have_ to specify --target on the
command line like the web page says, and can just use the prefixed compiler
names instead...)
$ ln -s x86_64-linux-android29-clang
~/android/android-ndk-21b/toolchains/llvm/prebuilt/linux-x86_64/bin/x86_64-linux-android-cc
$ make root LINUX=~/linux/linux
CROSS_COMPILE=~/android/android-ndk-r21b/toolchains/llvm/prebuilt/linux-x86_64/bin/x86_64-linux-android-
Yay, toybox built! The linux kernel did not:
scripts/Kconfig.include:45: compiler
'/home/landley/android/android-ndk-r21b/toolchains/llvm/prebuilt/linux-x86_64/bin/x86_64-linux-android-gcc'
not found
scripts/kconfig/Makefile:71: recipe for target 'allnoconfig' failed
Dear Linux: llvm is not gcc. It's a cc. What is... Oh good grief what's happened
to the kernel Makefile:
ifneq ($(LLVM),)
CC = clang
...
else
CC = $(CROSS_COMPILE)gcc
...
PERL = perl
PYTHON = python
PYTHON3 = python3
...
ifneq ($(shell $(CC) --version 2>&1 | head -n 1 | grep clang),)
ifneq ($(CROSS_COMPILE),)
CLANG_FLAGS += --target=$(notdir $(CROSS_COMPILE:%-=%))
GCC_TOOLCHAIN_DIR := $(dir $(shell which $(CROSS_COMPILE)elfedit))
CLANG_FLAGS += --prefix=$(GCC_TOOLCHAIN_DIR)
GCC_TOOLCHAIN := $(realpath $(GCC_TOOLCHAIN_DIR)/..)
endif
ifneq ($(GCC_TOOLCHAIN),)
CLANG_FLAGS += --gcc-toolchain=$(GCC_TOOLCHAIN)
endif
ifneq ($(LLVM_IAS),1)
CLANG_FLAGS += -no-integrated-as
endif
CLANG_FLAGS += -Werror=unknown-warning-option
KBUILD_CFLAGS += $(CLANG_FLAGS)
KBUILD_AFLAGS += $(CLANG_FLAGS)
export CLANG_FLAGS
endif
The vanilla kernel makes no attempt whatsoever to work with generic tools
anymore, does it? Even ones copying gcc's API. I need a flamethrower... But
that's a SEPARATE problem, so let's see...
$ root/x86_64/fs/bin/toybox echo hello
hello
$ sudo chroot root/x86_64/fs /init
Segmentation fault
Looks like I've still got some work to do before the release...
Rob
More information about the Toybox
mailing list