diff --git a/Makefile.include b/Makefile.include
index e772741d4d6cbd67c719482b586c1775cabfce38..3b325ec727695a88b91e21f5af633f68628e5bc2 100644
--- a/Makefile.include
+++ b/Makefile.include
@@ -41,6 +41,12 @@ ifdef CI
   endif
 endif
 
+ifndef IAR
+  ifneq (, $(shell which ccache))
+    CCACHE ?= ccache
+  endif
+endif
+
 BUILD_DIR = build
 BUILD_DIR_TARGET = $(BUILD_DIR)/$(TARGET)
 BUILD_DIR_TARGET_BOARD = $(BUILD_DIR_TARGET)/$(BOARD)
@@ -366,14 +372,14 @@ distclean:
 ifndef CUSTOM_RULE_C_TO_OBJECTDIR_O
 $(OBJECTDIR)/%.o: %.c | $(OBJECTDIR)
 	$(TRACE_CC)
-	$(Q)$(CC) $(CFLAGS) -MMD -c $< -o $@
+	$(Q)$(CCACHE) $(CC) $(CFLAGS) -MMD -c $< -o $@
 	@$(FINALIZE_DEPENDENCY)
 endif
 
 ifndef CUSTOM_RULE_CPP_TO_OBJECTDIR_O
 $(OBJECTDIR)/%.o: %.cpp | $(OBJECTDIR)
 	$(TRACE_CXX)
-	$(Q)$(CXX) $(CXXFLAGS) -MMD -c $< -o $@
+	$(Q)$(CCACHE) $(CXX) $(CXXFLAGS) -MMD -c $< -o $@
 	@$(FINALIZE_DEPENDENCY)
 endif
 
@@ -389,55 +395,55 @@ endif
 ifndef CUSTOM_RULE_C_TO_OBJECTDIR_S
 $(OBJECTDIR)/%.s: %.c | $(OBJECTDIR)
 	$(TRACE_CC)
-	$(Q)$(CC) $(CFLAGS) -S $< -o $@
+	$(Q)$(CCACHE) $(CC) $(CFLAGS) -S $< -o $@
 endif
 
 ifndef CUSTOM_RULE_CPP_TO_OBJECTDIR_S
 $(OBJECTDIR)/%.s: %.cpp | $(OBJECTDIR)
 	$(TRACE_CXX)
-	$(Q)$(CXX) $(CXXFLAGS) -S $< -o $@
+	$(Q)$(CCACHE) $(CXX) $(CXXFLAGS) -S $< -o $@
 endif
 
 ifndef CUSTOM_RULE_C_TO_OBJECTDIR_E
 $(OBJECTDIR)/%.e: %.c | $(OBJECTDIR)
 	$(TRACE_CC)
-	$(Q)$(CC) $(CFLAGS) -E $< -o $@
+	$(Q)$(CCACHE) $(CC) $(CFLAGS) -E $< -o $@
 endif
 
 ifndef CUSTOM_RULE_CPP_TO_OBJECTDIR_E
 $(OBJECTDIR)/%.e: %.cpp | $(OBJECTDIR)
 	$(TRACE_CXX)
-	$(Q)$(CXX) $(CXXFLAGS) -E $< -o $@
+	$(Q)$(CCACHE) $(CXX) $(CXXFLAGS) -E $< -o $@
 endif
 
 ifndef CUSTOM_RULE_C_TO_O
 %.o: %.c
 	$(TRACE_CC)
-	$(Q)$(CC) $(CFLAGS) -c $< -o $@
+	$(Q)$(CCACHE) $(CC) $(CFLAGS) -c $< -o $@
 endif
 
 ifndef CUSTOM_RULE_CPP_TO_O
 %.o: %.cpp
 	$(TRACE_CXX)
-	$(Q)$(CXX) $(CXXFLAGS) -c $< -o $@
+	$(Q)$(CCACHE) $(CXX) $(CXXFLAGS) -c $< -o $@
 endif
 
 ifndef CUSTOM_RULE_C_TO_S
 %.s: %.c
 	$(TRACE_CC)
-	$(Q)$(CC) $(CFLAGS) -S $< -o $@
+	$(Q)$(CCACHE) $(CC) $(CFLAGS) -S $< -o $@
 endif
 
 ifndef CUSTOM_RULE_C_TO_E
 %.e: %.c
 	$(TRACE_CC)
-	$(Q)$(CC) $(CFLAGS) -E $< -o $@
+	$(Q)$(CCACHE) $(CC) $(CFLAGS) -E $< -o $@
 endif
 
 ifndef CUSTOM_RULE_CPP_TO_E
 %.e: %.cpp
 	$(TRACE_CXX)
-	$(Q)$(CXX) $(CXXFLAGS) -E $< -o $@
+	$(Q)$(CCACHE) $(CXX) $(CXXFLAGS) -E $< -o $@
 endif
 
 ifndef AROPTS