From a23f35973592831c6e37b14d46d95077f957565a Mon Sep 17 00:00:00 2001 From: bricky149 Date: Thu, 5 Oct 2023 12:22:09 +0100 Subject: [PATCH] Add support for clang builds --- Makefile | 49 +++++++++++++++++++++++++++++++++++++++---------- README.md | 4 ++++ 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index dc15861..040bda0 100644 --- a/Makefile +++ b/Makefile @@ -3,6 +3,7 @@ # 0 = disable # 1 = enable # +ENABLE_CLANG := 0 ENABLE_SWD := 0 ENABLE_OVERLAY := 0 ENABLE_LTO := 1 @@ -39,7 +40,12 @@ ENABLE_COPY_CHAN_TO_VFO := 1 TARGET = firmware -ifeq ($(ENABLE_LTO), 1) +ifeq ($(ENABLE_CLANG),1) + # GCC's linker, ld, doesn't understand LLVM's generated bytecode + ENABLE_LTO := 0 +endif + +ifeq ($(ENABLE_LTO),1) # can't have LTO and OVERLAY enabled at same time ENABLE_OVERLAY := 0 endif @@ -144,8 +150,20 @@ else endif AS = arm-none-eabi-gcc -CC = arm-none-eabi-gcc + +CC = LD = arm-none-eabi-gcc +ifeq ($(ENABLE_CLANG),0) + CC += arm-none-eabi-gcc +# Use GCC's linker to avoid undefined symbol errors +# LD += arm-none-eabi-gcc +else +# May need to adjust this to match your system + CC += clang --sysroot=/usr/arm-none-eabi --target=arm-none-eabi +# Bloats binaries to 512MB +# LD = ld.lld +endif + OBJCOPY = arm-none-eabi-objcopy SIZE = arm-none-eabi-size @@ -161,13 +179,18 @@ ifeq ($(ENABLE_OVERLAY),1) ASFLAGS += -DENABLE_OVERLAY endif -CFLAGS = -Os -Wall -Werror -mcpu=cortex-m0 -fno-builtin -fshort-enums -fno-delete-null-pointer-checks -std=c11 -MMD -#CFLAGS = -Os -Wall -Werror -mcpu=cortex-m0 -fno-builtin -fshort-enums -fno-delete-null-pointer-checks -std=c99 -MMD -#CFLAGS = -Os -Wall -Werror -mcpu=cortex-m0 -fno-builtin -fshort-enums -fno-delete-null-pointer-checks -std=gnu99 -MMD -#CFLAGS = -Os -Wall -Werror -mcpu=cortex-m0 -fno-builtin -fshort-enums -fno-delete-null-pointer-checks -std=gnu11 -MMD +CFLAGS = +ifeq ($(ENABLE_CLANG),0) + CFLAGS += -Os -Wall -Werror -mcpu=cortex-m0 -fno-builtin -fshort-enums -fno-delete-null-pointer-checks -std=c11 -MMD +# CFLAGS += -Os -Wall -Werror -mcpu=cortex-m0 -fno-builtin -fshort-enums -fno-delete-null-pointer-checks -std=c99 -MMD +# CFLAGS += -Os -Wall -Werror -mcpu=cortex-m0 -fno-builtin -fshort-enums -fno-delete-null-pointer-checks -std=gnu99 -MMD +# CFLAGS += -Os -Wall -Werror -mcpu=cortex-m0 -fno-builtin -fshort-enums -fno-delete-null-pointer-checks -std=gnu11 -MMD +else +# Oz needed to make it fit on flash + CFLAGS += -Oz -Wall -Werror -mcpu=cortex-m0 -fno-builtin -fshort-enums -fno-delete-null-pointer-checks -std=c11 -MMD +endif -ifeq ($(ENABLE_LTO), 1) -# CFLAGS += -flto +ifeq ($(ENABLE_LTO),1) CFLAGS += -flto=2 else # We get most of the space savings if LTO creates problems @@ -276,12 +299,18 @@ ifeq ($(ENABLE_BAND_SCOPE),1) CFLAGS += -DENABLE_BAND_SCOPE endif -LDFLAGS = -mcpu=cortex-m0 -nostartfiles -Wl,-T,firmware.ld +LDFLAGS = +ifeq ($(ENABLE_CLANG),0) + LDFLAGS += -mcpu=cortex-m0 -nostartfiles -Wl,-T,firmware.ld +else +# Fix warning about implied executable stack + LDFLAGS += -z noexecstack -mcpu=cortex-m0 -nostartfiles -Wl,-T,firmware.ld +endif # Use newlib-nano instead of newlib LDFLAGS += --specs=nano.specs -ifeq ($(ENABLE_LTO), 0) +ifeq ($(ENABLE_LTO),0) # Throw away unneeded func/data sections like LTO does LDFLAGS += -Wl,--gc-sections endif diff --git a/README.md b/README.md index dbdf86f..069b0f0 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ You can customize the firmware by enabling/disabling various compile options. You'll find the options at the top of "Makefile" ('0' = disable, '1' = enable) .. ``` +ENABLE_CLANG := 0 experimental, builds with clang instead of gcc (LTO will be disabled if you enable this) ENABLE_SWD := 0 only needed if using CPU's SWD port (debugging/programming) ENABLE_OVERLAY := 0 cpu FLASH stuff, not needed ENABLE_LTO := 0 **experimental, reduces size of compiled firmware but might break EEPROM reads (overlay will be disabled if you enable this) @@ -88,6 +89,9 @@ arm-none-eabi GCC version 10.3.1 is recommended, which is the current version on Other versions may generate a flash file that is too big. You can get an appropriate version from: https://developer.arm.com/downloads/-/gnu-rm +clang may be used but isn't fully supported. Resulting binaries may also be bigger. +You can get it from: https://releases.llvm.org/download.html + # Building To build the firmware, you need to fetch the submodules and then run make: