bootloader: Mark jump_to_application() as noreturn.
[gps-watch.git] / SConscript.target
index 6dd2f413d66fa60b2684d3c648c21b1ec11bdda1..1e5f40299db24dddac0bd645cf7ae25436c96fab 100644 (file)
@@ -1,3 +1,4 @@
+import subprocess
 import os
 
 Import('env')
@@ -33,6 +34,10 @@ env.Append(LINKFLAGS = [
     '-nostartfiles',
 ])
 
+libgcc_path = \
+    subprocess.check_output('{} -print-libgcc-file-name'.format(env['CC']),
+                            shell=True).strip()
+
 env.Append(RUSTCFLAGS = [
     '-C', 'opt-level=s',
     '--target=thumbv6m-none-eabi',
@@ -47,24 +52,78 @@ SConscript('SConscript.libcommon', exports='env', duplicate=0)
 
 libbootloader_source_files = [
     'src/bootloader/main.rs', # Must be listed first (see below).
+    'src/bootloader/bootloader.rs',
+    'src/bootloader/flash.rs',
+]
+
+start_o = env.Object('src/bootloader/start.c')
+
+for s in ['intermediate', 'final']:
+    libbootloader_env = env.Clone()
+
+    libbootloader_env.Append(RUSTCFLAGS = [
+        '--cfg',
+        'bootloader_type=\\"{}\\"'.format(s)
+    ])
+
+    libbootloader = libbootloader_env.Rustc('libbootloader-{}.a'.format(s),
+                                            libbootloader_source_files[0])
+
+    for f in libbootloader_source_files:
+        Depends(libbootloader, f)
+
+    Depends(libbootloader, 'libcommon.rlib')
+    Depends(libbootloader, 'libcommon.a')
+
+    bootloader_env = env.Clone()
+
+    bootloader_env.Append(LINKFLAGS = [
+        '-Tsrc/bootloader/bootloader-{}.ld'.format(s),
+    ])
+
+    bootloader_libs = [
+        'bootloader-{}'.format(s),
+        'common',
+        File(libgcc_path),
+    ]
+
+    bootloader_elf = \
+        bootloader_env.Program('gps-watch-bootloader-{}.elf'.format(s),
+                               start_o, LIBS = bootloader_libs)
+
+    bootloader_bin = bootloader_env.Objcopy(bootloader_elf)
+
+    Default(bootloader_bin)
+
+libapplication_source_files = [
+    'src/application/main.rs', # Must be listed first (see below).
 ]
 
-libbootloader = env.Rustc('libbootloader.a', libbootloader_source_files[0])
+libapplication = env.Rustc('libapplication.a', libapplication_source_files[0])
+
+for f in libapplication_source_files:
+    Depends(libapplication, f)
 
-for f in libbootloader_source_files:
-    Depends(libbootloader, f)
+Depends(libapplication, 'libcommon.rlib')
+Depends(libapplication, 'libcommon.a')
 
-Depends(libbootloader, 'libcommon.rlib')
-Depends(libbootloader, 'libcommon.a')
+start_o = env.Object('src/application/start.c')
 
-bootloader_env = env.Clone()
+application_env = env.Clone()
 
-bootloader_env.Append(LINKFLAGS = [
-    '-Tsrc/bootloader/bootloader.ld',
+application_env.Append(LINKFLAGS = [
+    '-Tsrc/application/application.ld'
 ])
 
-bootloader_elf = bootloader_env.Program('gps-watch-bootloader.elf', 'src/bootloader/start.c', LIBS = ['bootloader', 'common'])
+application_libs = [
+    'application',
+    'common',
+    File(libgcc_path),
+]
+
+application_elf = application_env.Program('gps-watch-application.elf',
+                                          start_o, LIBS = application_libs)
 
-bootloader_bin = bootloader_env.Objcopy(bootloader_elf)
+application_bin = application_env.Objcopy(application_elf)
 
-Default(bootloader_bin)
+Default(application_bin)