diff --git a/Makefile.base b/Makefile.base
index 8bbe3e39ad564f5f3322a10be33b9d5c55167b38..582ae88f33dafbaad978b72a25ec14fa32edf9c3 100644
--- a/Makefile.base
+++ b/Makefile.base
@@ -53,8 +53,8 @@ $(BINDIR)/$(MODULE).a $(OBJ): | $(BINDIR)/$(MODULE)/
 $(BINDIR)/$(MODULE).a: $(OBJ) | ${DIRS:%=ALL--%}
 	$(Q)$(AR) $(ARFLAGS) $@ $?
 
-
 CXXFLAGS = $(filter-out $(CXXUWFLAGS), $(CFLAGS)) $(CXXEXFLAGS)
+CCASFLAGS = $(filter-out $(CCASUWFLAGS), $(CFLAGS)) $(CCASEXFLAGS)
 
 # compile and generate dependency info
 
@@ -76,7 +76,7 @@ $(ASMOBJ): $(BINDIR)/$(MODULE)/%.o: %.s
 	$(Q)$(AS) $(ASFLAGS) -o $@ $(abspath $<)
 
 $(ASSMOBJ): $(BINDIR)/$(MODULE)/%.o: %.S
-	$(Q)$(CC) $(CFLAGS) $(INCLUDES) -MD -MP -c -o $@ $(abspath $<)
+	$(Q)$(CCAS) $(CCASFLAGS) $(INCLUDES) -MD -MP -c -o $@ $(abspath $<)
 
 # pull in dependency info for *existing* .o files
 # deleted header files will be silently ignored
diff --git a/Makefile.vars b/Makefile.vars
index 39e3abf0921dee6a6338cf7e7e6d082ae8f1756f..68372649c543025307bc547ae2a6bb7dd5690bc4 100644
--- a/Makefile.vars
+++ b/Makefile.vars
@@ -27,9 +27,12 @@ export TARGET_ARCH           # The target platform name, in GCC triple notation,
 export PREFIX                # The prefix of the toolchain commands, usually "$(TARGET_ARCH)-", e.g. "arm-none-eabi-" or "msp430-".
 export CC                    # The C compiler to use.
 export CXX                   # The CXX compiler to use.
+export CCAS                  # The C compiler to use for assembler files, typically the same as CC.
 export CFLAGS                # The compiler flags. Must only ever be used with `+=`.
-export CXXUWFLAGS            # (Patters of) flags in CFLAGS, that should not be passed to CXX.
+export CXXUWFLAGS            # (Patterns of) flags in CFLAGS that should not be passed to CXX.
 export CXXEXFLAGS            # Additional flags that should be passed to CXX.
+export CCASUWFLAGS           # (Patterns of) flags in CFLAGS that should not be passed to CCAS.
+export CCASEXFLAGS           # Additional flags that should be passed to CCAS.
 export AR                    # The command to create the object file archives.
 export ARFLAGS               # Command-line options to pass to AR, default `rcs`.
 export AS                    # The assembler.
diff --git a/cpu/Makefile.include.gnu b/cpu/Makefile.include.gnu
index ea61b4cc762834e49f8230cc4a75170d30320514..afa205eb506eeb795e44dd6405e025157fccc753 100644
--- a/cpu/Makefile.include.gnu
+++ b/cpu/Makefile.include.gnu
@@ -1,18 +1,19 @@
 export GDBPREFIX ?= $(PREFIX)
-export CC = $(PREFIX)gcc
-export CXX = $(PREFIX)g++
+export CC         = $(PREFIX)gcc
+export CXX        = $(PREFIX)g++
+export CCAS      ?= $(CC)
 ifeq ($(LTO),1)
-export AR = $(PREFIX)gcc-ar
+export AR         = $(PREFIX)gcc-ar
 else
-export AR = $(PREFIX)ar
+export AR         = $(PREFIX)ar
 endif
-export AS = $(PREFIX)as
-export LINK = $(PREFIX)gcc
-export SIZE = $(PREFIX)size
-export OBJCOPY = $(shell command -v $(PREFIX)objcopy gobjcopy objcopy | head -n 1)
+export AS         = $(PREFIX)as
+export LINK       = $(PREFIX)gcc
+export SIZE       = $(PREFIX)size
+export OBJCOPY   ?= $(shell command -v $(PREFIX)objcopy gobjcopy objcopy | head -n 1)
 ifeq ($(OBJCOPY),)
 $(warning objcopy not found. Hex file will not be created.)
-export OBJCOPY = true
+export OBJCOPY    = true
 endif
-export OBJDUMP = $(PREFIX)objdump
-export DBG = $(GDBPREFIX)gdb
+export OBJDUMP    = $(PREFIX)objdump
+export DBG        = $(GDBPREFIX)gdb
diff --git a/cpu/Makefile.include.llvm b/cpu/Makefile.include.llvm
index 222c27e90717002104037363f1545aab00eb224b..f797f6fa0464bfe584fcd2aa275b63bd12776b2d 100644
--- a/cpu/Makefile.include.llvm
+++ b/cpu/Makefile.include.llvm
@@ -9,6 +9,7 @@ export LLVMPREFIX :=
 endif
 export CC          = clang
 export CXX         = clang++
+export CCAS       ?= $(CC)
 export LINK        = $(CC)
 export AS          = $(LLVMPREFIX)as
 export AR          = $(LLVMPREFIX)ar