build: Use rustc to link the binaries instead of gcc.
authorTilman Sauerbeck <tilman@code-monkey.de>
Sun, 29 Dec 2019 11:55:24 +0000 (12:55 +0100)
committerTilman Sauerbeck <tilman@code-monkey.de>
Sun, 5 Jan 2020 19:38:11 +0000 (20:38 +0100)
This simplifies the build system by removing the need for
libapplication.a, libbootloader.a and the two start.c copies.

SConscript.target
src/application/main.rs
src/application/start.c [deleted file]
src/bootloader/bootloader-final.ld
src/bootloader/main.rs
src/bootloader/start.c [deleted file]

index 1e5f40299db24dddac0bd645cf7ae25436c96fab..7beba88a78c63874a50d09c424ee40852cc6453f 100644 (file)
@@ -40,8 +40,10 @@ libgcc_path = \
 
 env.Append(RUSTCFLAGS = [
     '-C', 'opt-level=s',
+    '-C', 'link-arg={}'.format(libgcc_path),
     '--target=thumbv6m-none-eabi',
     '-L', '$LIBPATH',
+    '-l', 'common',
 ])
 
 env.Append(LINKFLAGS = [
@@ -50,79 +52,53 @@ env.Append(LINKFLAGS = [
 
 SConscript('SConscript.libcommon', exports='env', duplicate=0)
 
-libbootloader_source_files = [
+bootloader_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()
+    bootloader_env = env.Clone()
 
-    libbootloader_env.Append(RUSTCFLAGS = [
+    bootloader_env.Append(RUSTCFLAGS = [
+        '-C', 'link-arg=-Tsrc/bootloader/bootloader-{}.ld'.format(s),
         '--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_elf = \
+        bootloader_env.Rustc('gps-watch-bootloader-{}.elf'.format(s),
+                             bootloader_source_files[0])
 
-    bootloader_libs = [
-        'bootloader-{}'.format(s),
-        'common',
-        File(libgcc_path),
-    ]
+    for f in bootloader_source_files:
+        Depends(bootloader_elf, f)
 
-    bootloader_elf = \
-        bootloader_env.Program('gps-watch-bootloader-{}.elf'.format(s),
-                               start_o, LIBS = bootloader_libs)
+    Depends(bootloader_elf, 'libcommon.rlib')
+    Depends(bootloader_elf, 'libcommon.a')
 
     bootloader_bin = bootloader_env.Objcopy(bootloader_elf)
 
     Default(bootloader_bin)
 
-libapplication_source_files = [
+application_source_files = [
     'src/application/main.rs', # Must be listed first (see below).
 ]
 
-libapplication = env.Rustc('libapplication.a', libapplication_source_files[0])
-
-for f in libapplication_source_files:
-    Depends(libapplication, f)
-
-Depends(libapplication, 'libcommon.rlib')
-Depends(libapplication, 'libcommon.a')
-
-start_o = env.Object('src/application/start.c')
-
 application_env = env.Clone()
 
-application_env.Append(LINKFLAGS = [
-    '-Tsrc/application/application.ld'
+application_env.Append(RUSTCFLAGS = [
+    '-C', 'link-arg=-Tsrc/application/application.ld',
 ])
 
-application_libs = [
-    'application',
-    'common',
-    File(libgcc_path),
-]
+application_elf = application_env.Rustc('gps-watch-application.elf',
+                                        application_source_files[0])
+
+for f in application_source_files:
+    Depends(application_elf, f)
 
-application_elf = application_env.Program('gps-watch-application.elf',
-                                          start_o, LIBS = application_libs)
+Depends(application_elf, 'libcommon.rlib')
+Depends(application_elf, 'libcommon.a')
 
 application_bin = application_env.Objcopy(application_elf)
 
index b1bf3afd24818147146c5a2a89e3773adcdd9372..d2e391de174791a71f9e1324070ee6c9271c850d 100644 (file)
@@ -22,7 +22,7 @@
  */
 
 #![no_std]
-#![crate_type="staticlib"]
+#![no_main]
 #[link(name="libcommon.rlib")]
 
 extern crate common;
@@ -44,7 +44,7 @@ extern {
 }
 
 #[no_mangle]
-pub unsafe extern fn main() {
+pub unsafe extern "C" fn _start() -> ! {
     clock::configure();
     systick::init();
     port::init();
diff --git a/src/application/start.c b/src/application/start.c
deleted file mode 100644 (file)
index 5363ac0..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (c) 2019 Tilman Sauerbeck (tilman at code-monkey de)
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-extern void main();
-
-__attribute__((noreturn)) void
-_start (void)
-{
-       main();
-
-       for (;;) {
-       }
-}
index 86837c42d8295236c39485d9c8779e83461a2a6e..a30e47d775a30837e6695c138bb5a735fd7c8bb1 100644 (file)
@@ -83,7 +83,7 @@ SECTIONS
                *(.rodata*)
 
                KEEP(*(.eh_frame*))
-       } > FLASH =0xff
+       } > FLASH =0xffffffff
 
        .ARM.extab :
        {
index 321166c55a55f9bde891b5ec32db1ae804d3f8ce..815429ed1410645a15910edbc56eaac5a719bd11 100644 (file)
@@ -22,7 +22,7 @@
  */
 
 #![no_std]
-#![crate_type="staticlib"]
+#![no_main]
 #[link(name="libcommon.rlib")]
 
 extern crate common;
@@ -84,7 +84,7 @@ fn bootloader_requested() -> bool {
 }
 
 #[no_mangle]
-pub unsafe extern fn main() {
+pub unsafe extern "C" fn _start() -> ! {
     watchdog::disable();
     clock::configure();
     systick::init();
diff --git a/src/bootloader/start.c b/src/bootloader/start.c
deleted file mode 100644 (file)
index 5363ac0..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (c) 2019 Tilman Sauerbeck (tilman at code-monkey de)
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-extern void main();
-
-__attribute__((noreturn)) void
-_start (void)
-{
-       main();
-
-       for (;;) {
-       }
-}