build: Link libgcc from the command line instead of the linker script.
[gps-watch.git] / SConscript.target
1 import subprocess
2 import os
3
4 Import('env')
5 env = env.Clone()
6
7 host = os.environ.get('HOST', 'arm-none-eabi-')
8
9 d = {
10     'CC': 'gcc',
11     'LD': 'ld',
12     'AR': 'ar',
13     'RANLIB': 'ranlib',
14     'OBJCOPY': 'objcopy',
15 }
16
17 for k, v in d.items():
18     env[k] = host + v
19
20 env.Append(CCFLAGS = [
21     '-mcpu=cortex-m0plus',
22     '-mthumb',
23     '-ffunction-sections',
24     '-fdata-sections',
25     '-Os',
26 ])
27
28 env.Append(LINKFLAGS = [
29     '-mcpu=cortex-m0plus',
30     '-mthumb',
31     '-specs=nano.specs',
32     '-specs=nosys.specs',
33     '-nostdlib',
34     '-nostartfiles',
35 ])
36
37 libgcc_path = \
38     subprocess.check_output('{} -print-libgcc-file-name'.format(env['CC']),
39                             shell=True).strip()
40
41 env.Append(RUSTCFLAGS = [
42     '-C', 'opt-level=s',
43     '--target=thumbv6m-none-eabi',
44     '-L', '$LIBPATH',
45 ])
46
47 env.Append(LINKFLAGS = [
48     '-Wl,--gc-sections'
49 ])
50
51 SConscript('SConscript.libcommon', exports='env', duplicate=0)
52
53 libbootloader_source_files = [
54     'src/bootloader/main.rs', # Must be listed first (see below).
55     'src/bootloader/bootloader.rs',
56     'src/bootloader/flash.rs',
57 ]
58
59 start_o = env.Object('src/bootloader/start.c')
60
61 for s in ['intermediate', 'final']:
62     libbootloader_env = env.Clone()
63
64     libbootloader_env.Append(RUSTCFLAGS = [
65         '--cfg',
66         'bootloader_type=\\"{}\\"'.format(s)
67     ])
68
69     libbootloader = libbootloader_env.Rustc('libbootloader-{}.a'.format(s),
70                                             libbootloader_source_files[0])
71
72     for f in libbootloader_source_files:
73         Depends(libbootloader, f)
74
75     Depends(libbootloader, 'libcommon.rlib')
76     Depends(libbootloader, 'libcommon.a')
77
78     bootloader_env = env.Clone()
79
80     bootloader_env.Append(LINKFLAGS = [
81         '-Tsrc/bootloader/bootloader-{}.ld'.format(s),
82     ])
83
84     bootloader_libs = [
85         'bootloader-{}'.format(s),
86         'common',
87         File(libgcc_path),
88     ]
89
90     bootloader_elf = \
91         bootloader_env.Program('gps-watch-bootloader-{}.elf'.format(s),
92                                start_o, LIBS = bootloader_libs)
93
94     bootloader_bin = bootloader_env.Objcopy(bootloader_elf)
95
96     Default(bootloader_bin)
97
98 libapplication_source_files = [
99     'src/application/main.rs', # Must be listed first (see below).
100 ]
101
102 libapplication = env.Rustc('libapplication.a', libapplication_source_files[0])
103
104 for f in libapplication_source_files:
105     Depends(libapplication, f)
106
107 Depends(libapplication, 'libcommon.rlib')
108 Depends(libapplication, 'libcommon.a')
109
110 start_o = env.Object('src/application/start.c')
111
112 application_env = env.Clone()
113
114 application_env.Append(LINKFLAGS = [
115     '-Tsrc/application/application.ld'
116 ])
117
118 application_libs = [
119     'application',
120     'common',
121     File(libgcc_path),
122 ]
123
124 application_elf = application_env.Program('gps-watch-application.elf',
125                                           start_o, LIBS = application_libs)
126
127 application_bin = application_env.Objcopy(application_elf)
128
129 Default(application_bin)