xref: /OK3568_Linux_fs/buildroot/support/testing/tests/toolchain/test_external.py (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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