summaryrefslogtreecommitdiff
path: root/recipes-toolchain/gcc.recipe
blob: de616a9a47287da4ed395a7cff42405c9e0ae35c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import shutil

class Recipe(recipe.Recipe):
    name = 'gcc'
    version = '8.2.0'
    licenses = [License.GPLv3Plus]
    stype = SourceType.CUSTOM
    make = 'make all'
    make_install = 'make install-strip'
    add_host_build_target = False
    override_libtool = False
    deps = ['gcc-sources', 'mingw-w64-crt', 'winpthreads', 'gmp', 'mpc', 'mpfr',
            'isl']

    configure_options = '--with-host-libstdcxx=\'-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm\' ' \
                        '--disable-maintainer-mode' \
                        '--disable-shared ' \
                        '--disable-libgomp ' \
                        '--disable-libquadmath ' \
                        '--disable-libquadmath-support ' \
                        '--disable-libmudflap ' \
                        '--disable-libmpx ' \
                        '--disable-libssp ' \
                        '--disable-nls ' \
                        '--enable-threads=posix ' \
                        '--enable-__cxa_atexit ' \
                        '--enable-lto ' \
                        '--enable-plugin ' \
                        '--enable-multiarch ' \
                        '--enable-languages=c,c++ ' \
                        '--enable-long-long ' \
                        ''

    def prepare(self):
        if self.config.target_arch == Architecture.X86:
            raise InvalidRecipeError(self)
        # The configure checks are failing on this function
        # which ends in a double definition, so let's override it.
        self.set_env ('ac_cv_func_powf', 'yes')
        self.set_env ('CPP')
        self._target = 'x86_64-w64-mingw32'
        sysroot = os.path.join(self.config.prefix, self._target, 'sysroot')
        self.configure_options += ' --with-sysroot=%s ' % sysroot
        self.configure_options += ' --with-local-prefix=%s ' % sysroot
        self.configure_options += ' --target=%s' % self._target
        if self.config.target_platform == Platform.WINDOWS:
            self.configure_options += ' --host=%s' % self._target
        self.build_dir = os.path.join(self.config.sources,
                'gcc-%s' % self.version)
        self.make_dir = os.path.join(self.build_dir, 'gcc_build_final')
        self.config_sh = '../configure'

    async def configure(self):
        try:
            os.mkdir(self.make_dir)
        except:
            pass
        await super(Recipe, self).configure()

    def post_install(self):
        if self.config.target_platform == Platform.WINDOWS:
            bindir = os.path.join(self.config.prefix, 'bin')
            libdir = os.path.join(self.config.prefix, 'lib')
            lib32dir = os.path.join(self.config.prefix, 'lib32')
            # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89044
            os.remove(os.path.join(bindir, 'libstdc++-6.dll'))
            stdc64 = 'x86_64-w64-mingw32/libstdc++-v3/src/.libs/libstdc++-6.dll'
            stdc32 = 'x86_64-w64-mingw32/32/libstdc++-v3/src/.libs/libstdc++-6.dll'
            shutil.copy(os.path.join(self.make_dir, stdc64), libdir)
            shutil.copy(os.path.join(self.make_dir, stdc32), lib32dir)
        super().post_install()