679a1ba24b
The TestExternalToolchain() base class implement a test checking if the ELF interpreter that is advertised by Busybox really exists in the rootfs. Of course, this only makes sense with ELF toolchains. Until now, only ELF toolchains were tested, but we are going to use TestExternalToolchain() with non-ELF toolchains as well, so let's make this conditional. Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com> [yann.morin.1998@free.fr: strip() lines during readlines()] Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
257 lines
8.8 KiB
Python
257 lines
8.8 KiB
Python
import os
|
|
import infra
|
|
|
|
BASIC_CONFIG = \
|
|
"""
|
|
BR2_TARGET_ROOTFS_CPIO=y
|
|
# BR2_TARGET_ROOTFS_TAR is not set
|
|
"""
|
|
|
|
|
|
def has_broken_links(path):
|
|
for root, dirs, files in os.walk(path):
|
|
for f in files:
|
|
fpath = os.path.join(root, f)
|
|
if not os.path.exists(fpath):
|
|
return True
|
|
return False
|
|
|
|
|
|
class TestExternalToolchain(infra.basetest.BRTest):
|
|
def common_check(self):
|
|
# Check for broken symlinks
|
|
for d in ["lib", "usr/lib"]:
|
|
path = os.path.join(self.builddir, "staging", d)
|
|
self.assertFalse(has_broken_links(path))
|
|
path = os.path.join(self.builddir, "target", d)
|
|
self.assertFalse(has_broken_links(path))
|
|
|
|
with open(os.path.join(self.builddir, ".config"), 'r') as configf:
|
|
configlines = [l.strip() for l in configf.readlines()]
|
|
|
|
if "BR2_BINFMT_ELF=y" in configlines:
|
|
interp = infra.get_elf_prog_interpreter(self.builddir,
|
|
self.toolchain_prefix,
|
|
"bin/busybox")
|
|
interp_path = os.path.join(self.builddir, "target", interp[1:])
|
|
self.assertTrue(os.path.exists(interp_path))
|
|
|
|
|
|
class TestExternalToolchainSourceryArmv4(TestExternalToolchain):
|
|
config = BASIC_CONFIG + \
|
|
"""
|
|
BR2_arm=y
|
|
BR2_arm920t=y
|
|
BR2_TOOLCHAIN_EXTERNAL=y
|
|
BR2_TOOLCHAIN_EXTERNAL_CODESOURCERY_ARM=y
|
|
"""
|
|
toolchain_prefix = "arm-none-linux-gnueabi"
|
|
|
|
def test_run(self):
|
|
TestExternalToolchain.common_check(self)
|
|
|
|
# Check the architecture variant
|
|
arch = infra.get_file_arch(self.builddir,
|
|
self.toolchain_prefix,
|
|
"lib/libc.so.6")
|
|
self.assertEqual(arch, "v4T")
|
|
|
|
# Check the sysroot symlink
|
|
symlink = os.path.join(self.builddir, "staging", "armv4t")
|
|
self.assertTrue(os.path.exists(symlink))
|
|
self.assertEqual(os.readlink(symlink), "./")
|
|
|
|
# Boot the system
|
|
img = os.path.join(self.builddir, "images", "rootfs.cpio")
|
|
self.emulator.boot(arch="armv5",
|
|
kernel="builtin",
|
|
options=["-initrd", img])
|
|
self.emulator.login()
|
|
|
|
|
|
class TestExternalToolchainSourceryArmv5(TestExternalToolchain):
|
|
config = BASIC_CONFIG + \
|
|
"""
|
|
BR2_arm=y
|
|
BR2_TOOLCHAIN_EXTERNAL=y
|
|
BR2_TOOLCHAIN_EXTERNAL_CODESOURCERY_ARM=y
|
|
"""
|
|
toolchain_prefix = "arm-none-linux-gnueabi"
|
|
|
|
def test_run(self):
|
|
TestExternalToolchain.common_check(self)
|
|
|
|
# Check the architecture variant
|
|
arch = infra.get_file_arch(self.builddir,
|
|
self.toolchain_prefix,
|
|
"lib/libc.so.6")
|
|
self.assertEqual(arch, "v5TE")
|
|
|
|
# Boot the system
|
|
img = os.path.join(self.builddir, "images", "rootfs.cpio")
|
|
self.emulator.boot(arch="armv5",
|
|
kernel="builtin",
|
|
options=["-initrd", img])
|
|
self.emulator.login()
|
|
|
|
|
|
class TestExternalToolchainSourceryArmv7(TestExternalToolchain):
|
|
config = BASIC_CONFIG + \
|
|
"""
|
|
BR2_arm=y
|
|
BR2_cortex_a8=y
|
|
BR2_ARM_EABI=y
|
|
BR2_ARM_INSTRUCTIONS_THUMB2=y
|
|
BR2_TOOLCHAIN_EXTERNAL=y
|
|
BR2_TOOLCHAIN_EXTERNAL_CODESOURCERY_ARM=y
|
|
"""
|
|
toolchain_prefix = "arm-none-linux-gnueabi"
|
|
|
|
def test_run(self):
|
|
TestExternalToolchain.common_check(self)
|
|
|
|
# Check the architecture variant
|
|
arch = infra.get_file_arch(self.builddir,
|
|
self.toolchain_prefix,
|
|
"lib/libc.so.6")
|
|
self.assertEqual(arch, "v7")
|
|
isa = infra.get_elf_arch_tag(self.builddir,
|
|
self.toolchain_prefix,
|
|
"lib/libc.so.6",
|
|
"Tag_THUMB_ISA_use")
|
|
self.assertEqual(isa, "Thumb-2")
|
|
|
|
# Check we have the sysroot symlink
|
|
symlink = os.path.join(self.builddir, "staging", "thumb2")
|
|
self.assertTrue(os.path.exists(symlink))
|
|
self.assertEqual(os.readlink(symlink), "./")
|
|
|
|
# Boot the system
|
|
img = os.path.join(self.builddir, "images", "rootfs.cpio")
|
|
self.emulator.boot(arch="armv7",
|
|
kernel="builtin",
|
|
options=["-initrd", img])
|
|
self.emulator.login()
|
|
|
|
|
|
class TestExternalToolchainLinaroArm(TestExternalToolchain):
|
|
config = BASIC_CONFIG + \
|
|
"""
|
|
BR2_arm=y
|
|
BR2_cortex_a8=y
|
|
BR2_TOOLCHAIN_EXTERNAL=y
|
|
BR2_TOOLCHAIN_EXTERNAL_LINARO_ARM=y
|
|
"""
|
|
toolchain_prefix = "arm-linux-gnueabihf"
|
|
|
|
def test_run(self):
|
|
TestExternalToolchain.common_check(self)
|
|
|
|
# Check the architecture variant
|
|
arch = infra.get_file_arch(self.builddir,
|
|
self.toolchain_prefix,
|
|
"lib/libc.so.6")
|
|
self.assertEqual(arch, "v7")
|
|
isa = infra.get_elf_arch_tag(self.builddir,
|
|
self.toolchain_prefix,
|
|
"lib/libc.so.6",
|
|
"Tag_THUMB_ISA_use")
|
|
self.assertEqual(isa, "Thumb-2")
|
|
|
|
# Boot the system
|
|
img = os.path.join(self.builddir, "images", "rootfs.cpio")
|
|
self.emulator.boot(arch="armv7",
|
|
kernel="builtin",
|
|
options=["-initrd", img])
|
|
self.emulator.login()
|
|
|
|
|
|
class TestExternalToolchainBuildrootMusl(TestExternalToolchain):
|
|
config = BASIC_CONFIG + \
|
|
"""
|
|
BR2_arm=y
|
|
BR2_cortex_a9=y
|
|
BR2_ARM_ENABLE_VFP=y
|
|
BR2_TOOLCHAIN_EXTERNAL=y
|
|
BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
|
|
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
|
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-arm-cortex-a9-musl-2017.05-1078-g95b1dae.tar.bz2"
|
|
BR2_TOOLCHAIN_EXTERNAL_GCC_6=y
|
|
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_12=y
|
|
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_MUSL=y
|
|
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
|
"""
|
|
toolchain_prefix = "arm-linux"
|
|
|
|
def test_run(self):
|
|
TestExternalToolchain.common_check(self)
|
|
img = os.path.join(self.builddir, "images", "rootfs.cpio")
|
|
self.emulator.boot(arch="armv7",
|
|
kernel="builtin",
|
|
options=["-initrd", img])
|
|
self.emulator.login()
|
|
|
|
|
|
class TestExternalToolchainCtngMusl(TestExternalToolchain):
|
|
config = BASIC_CONFIG + \
|
|
"""
|
|
BR2_arm=y
|
|
BR2_cortex_a9=y
|
|
BR2_ARM_ENABLE_VFP=y
|
|
BR2_TOOLCHAIN_EXTERNAL=y
|
|
BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
|
|
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
|
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.net/toolchains/tarballs/arm-ctng-linux-musleabihf.tar.xz"
|
|
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_PREFIX="arm-ctng-linux-musleabihf"
|
|
BR2_TOOLCHAIN_EXTERNAL_GCC_7=y
|
|
BR2_TOOLCHAIN_EXTERNAL_HEADERS_3_10=y
|
|
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_MUSL=y
|
|
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
|
"""
|
|
toolchain_prefix = "arm-ctng-linux-musleabihf"
|
|
|
|
def test_run(self):
|
|
TestExternalToolchain.common_check(self)
|
|
img = os.path.join(self.builddir, "images", "rootfs.cpio")
|
|
self.emulator.boot(arch="armv7",
|
|
kernel="builtin",
|
|
options=["-initrd", img])
|
|
self.emulator.login()
|
|
|
|
|
|
class TestExternalToolchainBuildrootuClibc(TestExternalToolchain):
|
|
config = BASIC_CONFIG + \
|
|
"""
|
|
BR2_arm=y
|
|
BR2_TOOLCHAIN_EXTERNAL=y
|
|
BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
|
|
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
|
|
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-arm-full-2017.05-1078-g95b1dae.tar.bz2"
|
|
BR2_TOOLCHAIN_EXTERNAL_GCC_4_9=y
|
|
BR2_TOOLCHAIN_EXTERNAL_HEADERS_3_10=y
|
|
BR2_TOOLCHAIN_EXTERNAL_LOCALE=y
|
|
# BR2_TOOLCHAIN_EXTERNAL_HAS_THREADS_DEBUG is not set
|
|
BR2_TOOLCHAIN_EXTERNAL_CXX=y
|
|
"""
|
|
toolchain_prefix = "arm-linux"
|
|
|
|
def test_run(self):
|
|
TestExternalToolchain.common_check(self)
|
|
img = os.path.join(self.builddir, "images", "rootfs.cpio")
|
|
self.emulator.boot(arch="armv7",
|
|
kernel="builtin",
|
|
options=["-initrd", img])
|
|
self.emulator.login()
|
|
|
|
|
|
class TestExternalToolchainCCache(TestExternalToolchainBuildrootuClibc):
|
|
extraconfig = \
|
|
"""
|
|
BR2_CCACHE=y
|
|
BR2_CCACHE_DIR="{builddir}/ccache-dir"
|
|
"""
|
|
|
|
def __init__(self, names):
|
|
super(TestExternalToolchainBuildrootuClibc, self).__init__(names)
|
|
self.config += self.extraconfig.format(builddir=self.builddir)
|