1*4882a593Smuzhiyunimport os 2*4882a593Smuzhiyunimport infra 3*4882a593Smuzhiyun 4*4882a593SmuzhiyunBASIC_CONFIG = \ 5*4882a593Smuzhiyun """ 6*4882a593Smuzhiyun BR2_TARGET_ROOTFS_CPIO=y 7*4882a593Smuzhiyun # BR2_TARGET_ROOTFS_TAR is not set 8*4882a593Smuzhiyun """ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun 11*4882a593Smuzhiyundef has_broken_links(path): 12*4882a593Smuzhiyun for root, dirs, files in os.walk(path): 13*4882a593Smuzhiyun for f in files: 14*4882a593Smuzhiyun fpath = os.path.join(root, f) 15*4882a593Smuzhiyun if not os.path.exists(fpath): 16*4882a593Smuzhiyun return True 17*4882a593Smuzhiyun return False 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun 20*4882a593Smuzhiyunclass TestExternalToolchain(infra.basetest.BRTest): 21*4882a593Smuzhiyun def common_check(self): 22*4882a593Smuzhiyun # Check for broken symlinks 23*4882a593Smuzhiyun for d in ["lib", "usr/lib"]: 24*4882a593Smuzhiyun path = os.path.join(self.builddir, "staging", d) 25*4882a593Smuzhiyun self.assertFalse(has_broken_links(path)) 26*4882a593Smuzhiyun path = os.path.join(self.builddir, "target", d) 27*4882a593Smuzhiyun self.assertFalse(has_broken_links(path)) 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun with open(os.path.join(self.builddir, ".config"), 'r') as configf: 30*4882a593Smuzhiyun configlines = [line.strip() for line in configf.readlines()] 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun if "BR2_BINFMT_ELF=y" in configlines: 33*4882a593Smuzhiyun interp = infra.get_elf_prog_interpreter(self.builddir, 34*4882a593Smuzhiyun self.toolchain_prefix, 35*4882a593Smuzhiyun "bin/busybox") 36*4882a593Smuzhiyun interp_path = os.path.join(self.builddir, "target", interp[1:]) 37*4882a593Smuzhiyun self.assertTrue(os.path.exists(interp_path)) 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun 40*4882a593Smuzhiyunclass TestExternalToolchainSourceryArmv4(TestExternalToolchain): 41*4882a593Smuzhiyun config = BASIC_CONFIG + \ 42*4882a593Smuzhiyun """ 43*4882a593Smuzhiyun BR2_arm=y 44*4882a593Smuzhiyun BR2_arm920t=y 45*4882a593Smuzhiyun BR2_TOOLCHAIN_EXTERNAL=y 46*4882a593Smuzhiyun BR2_TOOLCHAIN_EXTERNAL_CODESOURCERY_ARM=y 47*4882a593Smuzhiyun """ 48*4882a593Smuzhiyun toolchain_prefix = "arm-none-linux-gnueabi" 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun def test_run(self): 51*4882a593Smuzhiyun TestExternalToolchain.common_check(self) 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun # Check the architecture variant 54*4882a593Smuzhiyun arch = infra.get_file_arch(self.builddir, 55*4882a593Smuzhiyun self.toolchain_prefix, 56*4882a593Smuzhiyun "lib/libc.so.6") 57*4882a593Smuzhiyun self.assertEqual(arch, "v4T") 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun # Check the sysroot symlink 60*4882a593Smuzhiyun symlink = os.path.join(self.builddir, "staging", "armv4t") 61*4882a593Smuzhiyun self.assertTrue(os.path.exists(symlink)) 62*4882a593Smuzhiyun self.assertEqual(os.readlink(symlink), "./") 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun # Boot the system 65*4882a593Smuzhiyun img = os.path.join(self.builddir, "images", "rootfs.cpio") 66*4882a593Smuzhiyun self.emulator.boot(arch="armv5", 67*4882a593Smuzhiyun kernel="builtin", 68*4882a593Smuzhiyun options=["-initrd", img]) 69*4882a593Smuzhiyun self.emulator.login() 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun 72*4882a593Smuzhiyunclass TestExternalToolchainSourceryArmv5(TestExternalToolchain): 73*4882a593Smuzhiyun config = BASIC_CONFIG + \ 74*4882a593Smuzhiyun """ 75*4882a593Smuzhiyun BR2_arm=y 76*4882a593Smuzhiyun BR2_TOOLCHAIN_EXTERNAL=y 77*4882a593Smuzhiyun BR2_TOOLCHAIN_EXTERNAL_CODESOURCERY_ARM=y 78*4882a593Smuzhiyun """ 79*4882a593Smuzhiyun toolchain_prefix = "arm-none-linux-gnueabi" 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun def test_run(self): 82*4882a593Smuzhiyun TestExternalToolchain.common_check(self) 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun # Check the architecture variant 85*4882a593Smuzhiyun arch = infra.get_file_arch(self.builddir, 86*4882a593Smuzhiyun self.toolchain_prefix, 87*4882a593Smuzhiyun "lib/libc.so.6") 88*4882a593Smuzhiyun self.assertEqual(arch, "v5TE") 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun # Boot the system 91*4882a593Smuzhiyun img = os.path.join(self.builddir, "images", "rootfs.cpio") 92*4882a593Smuzhiyun self.emulator.boot(arch="armv5", 93*4882a593Smuzhiyun kernel="builtin", 94*4882a593Smuzhiyun options=["-initrd", img]) 95*4882a593Smuzhiyun self.emulator.login() 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun 98*4882a593Smuzhiyunclass TestExternalToolchainSourceryArmv7(TestExternalToolchain): 99*4882a593Smuzhiyun config = BASIC_CONFIG + \ 100*4882a593Smuzhiyun """ 101*4882a593Smuzhiyun BR2_arm=y 102*4882a593Smuzhiyun BR2_cortex_a8=y 103*4882a593Smuzhiyun BR2_ARM_EABI=y 104*4882a593Smuzhiyun BR2_ARM_INSTRUCTIONS_THUMB2=y 105*4882a593Smuzhiyun BR2_TOOLCHAIN_EXTERNAL=y 106*4882a593Smuzhiyun BR2_TOOLCHAIN_EXTERNAL_CODESOURCERY_ARM=y 107*4882a593Smuzhiyun """ 108*4882a593Smuzhiyun toolchain_prefix = "arm-none-linux-gnueabi" 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun def test_run(self): 111*4882a593Smuzhiyun TestExternalToolchain.common_check(self) 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun # Check the architecture variant 114*4882a593Smuzhiyun arch = infra.get_file_arch(self.builddir, 115*4882a593Smuzhiyun self.toolchain_prefix, 116*4882a593Smuzhiyun "lib/libc.so.6") 117*4882a593Smuzhiyun self.assertEqual(arch, "v7") 118*4882a593Smuzhiyun isa = infra.get_elf_arch_tag(self.builddir, 119*4882a593Smuzhiyun self.toolchain_prefix, 120*4882a593Smuzhiyun "lib/libc.so.6", 121*4882a593Smuzhiyun "Tag_THUMB_ISA_use") 122*4882a593Smuzhiyun self.assertEqual(isa, "Thumb-2") 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun # Check we have the sysroot symlink 125*4882a593Smuzhiyun symlink = os.path.join(self.builddir, "staging", "thumb2") 126*4882a593Smuzhiyun self.assertTrue(os.path.exists(symlink)) 127*4882a593Smuzhiyun self.assertEqual(os.readlink(symlink), "./") 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun # Boot the system 130*4882a593Smuzhiyun img = os.path.join(self.builddir, "images", "rootfs.cpio") 131*4882a593Smuzhiyun self.emulator.boot(arch="armv7", 132*4882a593Smuzhiyun kernel="builtin", 133*4882a593Smuzhiyun options=["-initrd", img]) 134*4882a593Smuzhiyun self.emulator.login() 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun 137*4882a593Smuzhiyunclass TestExternalToolchainLinaroArm(TestExternalToolchain): 138*4882a593Smuzhiyun config = BASIC_CONFIG + \ 139*4882a593Smuzhiyun """ 140*4882a593Smuzhiyun BR2_arm=y 141*4882a593Smuzhiyun BR2_cortex_a8=y 142*4882a593Smuzhiyun BR2_TOOLCHAIN_EXTERNAL=y 143*4882a593Smuzhiyun BR2_TOOLCHAIN_EXTERNAL_LINARO_ARM=y 144*4882a593Smuzhiyun """ 145*4882a593Smuzhiyun toolchain_prefix = "arm-linux-gnueabihf" 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun def test_run(self): 148*4882a593Smuzhiyun TestExternalToolchain.common_check(self) 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun # Check the architecture variant 151*4882a593Smuzhiyun arch = infra.get_file_arch(self.builddir, 152*4882a593Smuzhiyun self.toolchain_prefix, 153*4882a593Smuzhiyun "lib/libc.so.6") 154*4882a593Smuzhiyun self.assertEqual(arch, "v7") 155*4882a593Smuzhiyun isa = infra.get_elf_arch_tag(self.builddir, 156*4882a593Smuzhiyun self.toolchain_prefix, 157*4882a593Smuzhiyun "lib/libc.so.6", 158*4882a593Smuzhiyun "Tag_THUMB_ISA_use") 159*4882a593Smuzhiyun self.assertEqual(isa, "Thumb-2") 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun # Boot the system 162*4882a593Smuzhiyun img = os.path.join(self.builddir, "images", "rootfs.cpio") 163*4882a593Smuzhiyun self.emulator.boot(arch="armv7", 164*4882a593Smuzhiyun kernel="builtin", 165*4882a593Smuzhiyun options=["-initrd", img]) 166*4882a593Smuzhiyun self.emulator.login() 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun 169*4882a593Smuzhiyunclass TestExternalToolchainBuildrootMusl(TestExternalToolchain): 170*4882a593Smuzhiyun config = BASIC_CONFIG + \ 171*4882a593Smuzhiyun """ 172*4882a593Smuzhiyun BR2_arm=y 173*4882a593Smuzhiyun BR2_cortex_a9=y 174*4882a593Smuzhiyun BR2_ARM_ENABLE_VFP=y 175*4882a593Smuzhiyun BR2_TOOLCHAIN_EXTERNAL=y 176*4882a593Smuzhiyun BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y 177*4882a593Smuzhiyun BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y 178*4882a593Smuzhiyun BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-arm-cortex-a9-musl-2017.05-1078-g95b1dae.tar.bz2" 179*4882a593Smuzhiyun BR2_TOOLCHAIN_EXTERNAL_GCC_6=y 180*4882a593Smuzhiyun BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_12=y 181*4882a593Smuzhiyun BR2_TOOLCHAIN_EXTERNAL_CUSTOM_MUSL=y 182*4882a593Smuzhiyun BR2_TOOLCHAIN_EXTERNAL_CXX=y 183*4882a593Smuzhiyun """ 184*4882a593Smuzhiyun toolchain_prefix = "arm-linux" 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun def test_run(self): 187*4882a593Smuzhiyun TestExternalToolchain.common_check(self) 188*4882a593Smuzhiyun img = os.path.join(self.builddir, "images", "rootfs.cpio") 189*4882a593Smuzhiyun self.emulator.boot(arch="armv7", 190*4882a593Smuzhiyun kernel="builtin", 191*4882a593Smuzhiyun options=["-initrd", img]) 192*4882a593Smuzhiyun self.emulator.login() 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun 195*4882a593Smuzhiyunclass TestExternalToolchainCtngMusl(TestExternalToolchain): 196*4882a593Smuzhiyun config = BASIC_CONFIG + \ 197*4882a593Smuzhiyun """ 198*4882a593Smuzhiyun BR2_arm=y 199*4882a593Smuzhiyun BR2_cortex_a9=y 200*4882a593Smuzhiyun BR2_ARM_ENABLE_VFP=y 201*4882a593Smuzhiyun BR2_TOOLCHAIN_EXTERNAL=y 202*4882a593Smuzhiyun BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y 203*4882a593Smuzhiyun BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y 204*4882a593Smuzhiyun BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.net/toolchains/tarballs/arm-ctng-linux-musleabihf.tar.xz" 205*4882a593Smuzhiyun BR2_TOOLCHAIN_EXTERNAL_CUSTOM_PREFIX="arm-ctng-linux-musleabihf" 206*4882a593Smuzhiyun BR2_TOOLCHAIN_EXTERNAL_GCC_7=y 207*4882a593Smuzhiyun BR2_TOOLCHAIN_EXTERNAL_HEADERS_3_10=y 208*4882a593Smuzhiyun BR2_TOOLCHAIN_EXTERNAL_CUSTOM_MUSL=y 209*4882a593Smuzhiyun BR2_TOOLCHAIN_EXTERNAL_CXX=y 210*4882a593Smuzhiyun """ 211*4882a593Smuzhiyun toolchain_prefix = "arm-ctng-linux-musleabihf" 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun def test_run(self): 214*4882a593Smuzhiyun TestExternalToolchain.common_check(self) 215*4882a593Smuzhiyun img = os.path.join(self.builddir, "images", "rootfs.cpio") 216*4882a593Smuzhiyun self.emulator.boot(arch="armv7", 217*4882a593Smuzhiyun kernel="builtin", 218*4882a593Smuzhiyun options=["-initrd", img]) 219*4882a593Smuzhiyun self.emulator.login() 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun 222*4882a593Smuzhiyunclass TestExternalToolchainBuildrootuClibc(TestExternalToolchain): 223*4882a593Smuzhiyun config = BASIC_CONFIG + \ 224*4882a593Smuzhiyun """ 225*4882a593Smuzhiyun BR2_arm=y 226*4882a593Smuzhiyun BR2_TOOLCHAIN_EXTERNAL=y 227*4882a593Smuzhiyun BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y 228*4882a593Smuzhiyun BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y 229*4882a593Smuzhiyun BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-arm-full-2017.05-1078-g95b1dae.tar.bz2" 230*4882a593Smuzhiyun BR2_TOOLCHAIN_EXTERNAL_GCC_4_9=y 231*4882a593Smuzhiyun BR2_TOOLCHAIN_EXTERNAL_HEADERS_3_10=y 232*4882a593Smuzhiyun BR2_TOOLCHAIN_EXTERNAL_LOCALE=y 233*4882a593Smuzhiyun # BR2_TOOLCHAIN_EXTERNAL_HAS_THREADS_DEBUG is not set 234*4882a593Smuzhiyun BR2_TOOLCHAIN_EXTERNAL_CXX=y 235*4882a593Smuzhiyun """ 236*4882a593Smuzhiyun toolchain_prefix = "arm-linux" 237*4882a593Smuzhiyun 238*4882a593Smuzhiyun def test_run(self): 239*4882a593Smuzhiyun TestExternalToolchain.common_check(self) 240*4882a593Smuzhiyun img = os.path.join(self.builddir, "images", "rootfs.cpio") 241*4882a593Smuzhiyun self.emulator.boot(arch="armv7", 242*4882a593Smuzhiyun kernel="builtin", 243*4882a593Smuzhiyun options=["-initrd", img]) 244*4882a593Smuzhiyun self.emulator.login() 245*4882a593Smuzhiyun 246*4882a593Smuzhiyun 247*4882a593Smuzhiyunclass TestExternalToolchainCCache(TestExternalToolchainBuildrootuClibc): 248*4882a593Smuzhiyun extraconfig = \ 249*4882a593Smuzhiyun """ 250*4882a593Smuzhiyun BR2_CCACHE=y 251*4882a593Smuzhiyun BR2_CCACHE_DIR="{builddir}/ccache-dir" 252*4882a593Smuzhiyun """ 253*4882a593Smuzhiyun 254*4882a593Smuzhiyun def __init__(self, names): 255*4882a593Smuzhiyun super(TestExternalToolchainBuildrootuClibc, self).__init__(names) 256*4882a593Smuzhiyun self.config += self.extraconfig.format(builddir=self.builddir) 257