|
@@ -15,6 +15,16 @@
|
|
|
# Carlos Lamas
|
|
# Carlos Lamas
|
|
|
#
|
|
#
|
|
|
|
|
|
|
|
|
|
+# Enable vpath seraching for source files only
|
|
|
|
|
+# Without this, output files, could be read from the wrong .build directories
|
|
|
|
|
+VPATH_SRC := $(VPATH)
|
|
|
|
|
+vpath %.c $(VPATH_SRC)
|
|
|
|
|
+vpath %.h $(VPATH_SRC)
|
|
|
|
|
+vpath %.cpp $(VPATH_SRC)
|
|
|
|
|
+vpath %.hpp $(VPATH_SRC)
|
|
|
|
|
+vpath %.S $(VPATH_SRC)
|
|
|
|
|
+VPATH :=
|
|
|
|
|
+
|
|
|
|
|
|
|
|
# Output format. (can be srec, ihex, binary)
|
|
# Output format. (can be srec, ihex, binary)
|
|
|
FORMAT = ihex
|
|
FORMAT = ihex
|
|
@@ -35,11 +45,6 @@ ifeq ($(COLOR),true)
|
|
|
BOLD=\033[1m
|
|
BOLD=\033[1m
|
|
|
endif
|
|
endif
|
|
|
|
|
|
|
|
-ifdef quick
|
|
|
|
|
- QUICK = $(quick)
|
|
|
|
|
-endif
|
|
|
|
|
-
|
|
|
|
|
-QUICK ?= false
|
|
|
|
|
AUTOGEN ?= false
|
|
AUTOGEN ?= false
|
|
|
|
|
|
|
|
ifneq ($(shell awk --version 2>/dev/null),)
|
|
ifneq ($(shell awk --version 2>/dev/null),)
|
|
@@ -71,7 +76,7 @@ BUILD_CMD = LOG=$$($(CMD) 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR); elif [
|
|
|
# Each directory must be seperated by a space.
|
|
# Each directory must be seperated by a space.
|
|
|
# Use forward slashes for directory separators.
|
|
# Use forward slashes for directory separators.
|
|
|
# For a directory that has spaces, enclose it in quotes.
|
|
# For a directory that has spaces, enclose it in quotes.
|
|
|
-EXTRAINCDIRS += $(subst :, ,$(VPATH))
|
|
|
|
|
|
|
+EXTRAINCDIRS += $(subst :, ,$(VPATH_SRC))
|
|
|
|
|
|
|
|
|
|
|
|
|
# Compiler flag to set the C Standard level.
|
|
# Compiler flag to set the C Standard level.
|
|
@@ -268,22 +273,21 @@ LST = $(patsubst %.c,$(OBJDIR)/%.lst,$(patsubst %.cpp,$(OBJDIR)/%.lst,$(patsubst
|
|
|
|
|
|
|
|
# Compiler flags to generate dependency files.
|
|
# Compiler flags to generate dependency files.
|
|
|
#GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
|
|
#GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
|
|
|
-GENDEPFLAGS = -MMD -MP -MF $(BUILD_DIR)/.dep/$(subst /,_,$(subst $(BUILD_DIR)/,,$@)).d
|
|
|
|
|
|
|
+GENDEPFLAGS = -MMD -MP -MF $(patsubst %.o,%.td,$@)
|
|
|
|
|
|
|
|
|
|
|
|
|
# Combine all necessary flags and optional flags.
|
|
# Combine all necessary flags and optional flags.
|
|
|
# Add target processor to flags.
|
|
# Add target processor to flags.
|
|
|
# You can give extra flags at 'make' command line like: make EXTRAFLAGS=-DFOO=bar
|
|
# You can give extra flags at 'make' command line like: make EXTRAFLAGS=-DFOO=bar
|
|
|
-ALL_CFLAGS = $(MCUFLAGS) $(CFLAGS) $(GENDEPFLAGS) $(EXTRAFLAGS)
|
|
|
|
|
-ALL_CPPFLAGS = $(MCUFLAGS) -x c++ $(CPPFLAGS) $(GENDEPFLAGS) $(EXTRAFLAGS)
|
|
|
|
|
|
|
+ALL_CFLAGS = $(MCUFLAGS) $(CFLAGS) $(EXTRAFLAGS)
|
|
|
|
|
+ALL_CPPFLAGS = $(MCUFLAGS) -x c++ $(CPPFLAGS) $(EXTRAFLAGS)
|
|
|
ALL_ASFLAGS = $(MCUFLAGS) -x assembler-with-cpp $(ASFLAGS) $(EXTRAFLAGS)
|
|
ALL_ASFLAGS = $(MCUFLAGS) -x assembler-with-cpp $(ASFLAGS) $(EXTRAFLAGS)
|
|
|
|
|
|
|
|
|
|
+MOVE_DEP = mv -f $(patsubst %.o,%.td,$@) $(patsubst %.o,%.d,$@)
|
|
|
|
|
+
|
|
|
# Default target.
|
|
# Default target.
|
|
|
all: build sizeafter
|
|
all: build sizeafter
|
|
|
|
|
|
|
|
-# Quick make that doesn't clean
|
|
|
|
|
-quick: build sizeafter
|
|
|
|
|
-
|
|
|
|
|
# Change the build target to build a HEX file or a library.
|
|
# Change the build target to build a HEX file or a library.
|
|
|
build: elf hex
|
|
build: elf hex
|
|
|
#build: elf hex eep lss sym
|
|
#build: elf hex eep lss sym
|
|
@@ -373,35 +377,62 @@ BEGIN = gccversion check_submodule sizebefore
|
|
|
# Link: create ELF output file from object files.
|
|
# Link: create ELF output file from object files.
|
|
|
.SECONDARY : $(BUILD_DIR)/$(TARGET).elf
|
|
.SECONDARY : $(BUILD_DIR)/$(TARGET).elf
|
|
|
.PRECIOUS : $(OBJ)
|
|
.PRECIOUS : $(OBJ)
|
|
|
-%.elf: $(OBJ) | $(BEGIN)
|
|
|
|
|
|
|
+# Note the obj.txt depeendency is there to force linking if a source file is deleted
|
|
|
|
|
+%.elf: $(OBJ) $(OBJDIR)/cflags.txt $(OBJDIR)/ldflags.txt $(OBJDIR)/obj.txt | $(BEGIN)
|
|
|
@$(SILENT) || printf "$(MSG_LINKING) $@" | $(AWK_CMD)
|
|
@$(SILENT) || printf "$(MSG_LINKING) $@" | $(AWK_CMD)
|
|
|
- $(eval CMD=$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS))
|
|
|
|
|
|
|
+ $(eval CMD=$(CC) $(ALL_CFLAGS) $(filter-out %.txt,$^) --output $@ $(LDFLAGS))
|
|
|
@$(BUILD_CMD)
|
|
@$(BUILD_CMD)
|
|
|
|
|
|
|
|
define GEN_OBJRULE
|
|
define GEN_OBJRULE
|
|
|
# Compile: create object files from C source files.
|
|
# Compile: create object files from C source files.
|
|
|
-$1/%.o : %.c | $(BEGIN)
|
|
|
|
|
|
|
+$1/%.o : %.c $1/%.d $1/cflags.txt $1/compiler.txt | $(BEGIN)
|
|
|
@mkdir -p $$(@D)
|
|
@mkdir -p $$(@D)
|
|
|
@$$(SILENT) || printf "$$(MSG_COMPILING) $$<" | $$(AWK_CMD)
|
|
@$$(SILENT) || printf "$$(MSG_COMPILING) $$<" | $$(AWK_CMD)
|
|
|
- $$(eval CMD=$$(CC) -c $$(ALL_CFLAGS) $$< -o $$@)
|
|
|
|
|
|
|
+ $$(eval CMD=$$(CC) -c $$(ALL_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
|
|
|
@$$(BUILD_CMD)
|
|
@$$(BUILD_CMD)
|
|
|
|
|
|
|
|
# Compile: create object files from C++ source files.
|
|
# Compile: create object files from C++ source files.
|
|
|
-$1/%.o : %.cpp | $(BEGIN)
|
|
|
|
|
|
|
+$1/%.o : %.cpp $1/%.d $1/cppflags.txt $1/compiler.txt | $(BEGIN)
|
|
|
@mkdir -p $$(@D)
|
|
@mkdir -p $$(@D)
|
|
|
@$$(SILENT) || printf "$$(MSG_COMPILING_CPP) $$<" | $$(AWK_CMD)
|
|
@$$(SILENT) || printf "$$(MSG_COMPILING_CPP) $$<" | $$(AWK_CMD)
|
|
|
- $$(eval CMD=$$(CC) -c $$(ALL_CPPFLAGS) $$< -o $$@)
|
|
|
|
|
|
|
+ $$(eval CMD=$$(CC) -c $$(ALL_CPPFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
|
|
|
@$(BUILD_CMD)
|
|
@$(BUILD_CMD)
|
|
|
|
|
|
|
|
# Assemble: create object files from assembler source files.
|
|
# Assemble: create object files from assembler source files.
|
|
|
-$1/%.o : %.S | $(BEGIN)
|
|
|
|
|
|
|
+$1/%.o : %.S $1/asflags.txt $1/compiler.txt | $(BEGIN)
|
|
|
@mkdir -p $$(@D)
|
|
@mkdir -p $$(@D)
|
|
|
@$(SILENT) || printf "$$(MSG_ASSEMBLING) $$<" | $$(AWK_CMD)
|
|
@$(SILENT) || printf "$$(MSG_ASSEMBLING) $$<" | $$(AWK_CMD)
|
|
|
$$(eval CMD=$$(CC) -c $$(ALL_ASFLAGS) $$< -o $$@)
|
|
$$(eval CMD=$$(CC) -c $$(ALL_ASFLAGS) $$< -o $$@)
|
|
|
@$$(BUILD_CMD)
|
|
@$$(BUILD_CMD)
|
|
|
|
|
|
|
|
|
|
+$1/force:
|
|
|
|
|
+
|
|
|
|
|
+$1/cflags.txt: $1/force
|
|
|
|
|
+ echo '$$(ALL_CFLAGS)' | cmp -s - $$@ || echo '$$(ALL_CFLAGS)' > $$@
|
|
|
|
|
+
|
|
|
|
|
+$1/cppflags.txt: $1/force
|
|
|
|
|
+ echo '$$(ALL_CPPFLAGS)' | cmp -s - $$@ || echo '$$(ALL_CPPFLAGS)' > $$@
|
|
|
|
|
+
|
|
|
|
|
+$1/asflags.txt: $1/force
|
|
|
|
|
+ echo '$$(ALL_ASFLAGS)' | cmp -s - $$@ || echo '$$(ALL_ASFLAGS)' > $$@
|
|
|
|
|
+
|
|
|
|
|
+$1/ldflags.txt: $1/force
|
|
|
|
|
+ echo '$$(LDFLAGS)' | cmp -s - $$@ || echo '$$(LDFLAGS)' > $$@
|
|
|
|
|
+
|
|
|
|
|
+$1/obj.txt: $1/force
|
|
|
|
|
+ echo '$$(OBJ)' | cmp -s - $$@ || echo '$$(OBJ)' > $$@
|
|
|
|
|
+
|
|
|
|
|
+$1/compiler.txt: $1/force
|
|
|
|
|
+ $$(CC) --version | cmp -s - $$@ || $$(CC) --version > $$@
|
|
|
endef
|
|
endef
|
|
|
|
|
|
|
|
|
|
+# We have to use static rules for the .d files for some reason
|
|
|
|
|
+DEPS = $(patsubst %.o,%.d,$(OBJ))
|
|
|
|
|
+# Keep the .d files
|
|
|
|
|
+.PRECIOUS: $(DEPS)
|
|
|
|
|
+# Empty rule to force recompilation if the .d file is missing
|
|
|
|
|
+$(DEPS):
|
|
|
|
|
+
|
|
|
# Since the object files could be in two different folders, generate
|
|
# Since the object files could be in two different folders, generate
|
|
|
# separate rules for them, rather than having too generic rules
|
|
# separate rules for them, rather than having too generic rules
|
|
|
$(eval $(call GEN_OBJRULE,$(OBJDIR)))
|
|
$(eval $(call GEN_OBJRULE,$(OBJDIR)))
|
|
@@ -424,7 +455,10 @@ $(eval $(call GEN_OBJRULE,$(KBOBJDIR)))
|
|
|
$(CC) -E -mmcu=$(MCU) $(CFLAGS) $< -o $@
|
|
$(CC) -E -mmcu=$(MCU) $(CFLAGS) $< -o $@
|
|
|
|
|
|
|
|
# Target: clean project.
|
|
# Target: clean project.
|
|
|
-clean:
|
|
|
|
|
|
|
+clean:
|
|
|
|
|
+ $(REMOVE) -r $(OBJDIR) 2>/dev/null
|
|
|
|
|
+ $(REMOVE) -r $(KBOBJDIR) 2>/dev/null
|
|
|
|
|
+ $(REMOVE) $(BUILD_DIR)/$(TARGET).*
|
|
|
|
|
|
|
|
show_path:
|
|
show_path:
|
|
|
@echo VPATH=$(VPATH)
|
|
@echo VPATH=$(VPATH)
|
|
@@ -444,7 +478,6 @@ all-keyboards-defaults: all-keyboards-defaults-all
|
|
|
|
|
|
|
|
KEYBOARDS := $(SUBDIRS:$(TOP_DIR)/keyboards/%/=/keyboards/%)
|
|
KEYBOARDS := $(SUBDIRS:$(TOP_DIR)/keyboards/%/=/keyboards/%)
|
|
|
all-keyboards-all: $(addsuffix -all,$(KEYBOARDS))
|
|
all-keyboards-all: $(addsuffix -all,$(KEYBOARDS))
|
|
|
-all-keyboards-quick: $(addsuffix -quick,$(KEYBOARDS))
|
|
|
|
|
all-keyboards-clean: $(addsuffix -clean,$(KEYBOARDS))
|
|
all-keyboards-clean: $(addsuffix -clean,$(KEYBOARDS))
|
|
|
all-keyboards: all-keyboards-all
|
|
all-keyboards: all-keyboards-all
|
|
|
|
|
|
|
@@ -461,12 +494,10 @@ done
|
|
|
endef
|
|
endef
|
|
|
|
|
|
|
|
define make_keyboard_helper
|
|
define make_keyboard_helper
|
|
|
-# Just remove the -quick, -all and so on from the first argument and pass it forward
|
|
|
|
|
|
|
+# Just remove the -all and so on from the first argument and pass it forward
|
|
|
$(call make_keyboard,$(subst -$2,,$1),$2)
|
|
$(call make_keyboard,$(subst -$2,,$1),$2)
|
|
|
endef
|
|
endef
|
|
|
|
|
|
|
|
-/keyboards/%-quick:
|
|
|
|
|
- $(call make_keyboard_helper,$@,quick)
|
|
|
|
|
/keyboards/%-all:
|
|
/keyboards/%-all:
|
|
|
$(call make_keyboard_helper,$@,all)
|
|
$(call make_keyboard_helper,$@,all)
|
|
|
/keyboards/%-clean:
|
|
/keyboards/%-clean:
|
|
@@ -484,19 +515,6 @@ all-keymaps-%:
|
|
|
|
|
|
|
|
all-keymaps: all-keymaps-all
|
|
all-keymaps: all-keymaps-all
|
|
|
|
|
|
|
|
-GOAL=$(MAKECMDGOALS)
|
|
|
|
|
-ifeq ($(MAKECMDGOALS),)
|
|
|
|
|
-GOAL = all
|
|
|
|
|
-endif
|
|
|
|
|
-CLEANING_GOALS=clean clean_list all
|
|
|
|
|
-ifneq ($(findstring $(GOAL),$(CLEANING_GOALS)),)
|
|
|
|
|
-$(shell $(REMOVE) -r $(BUILD_DIR) 2>/dev/null)
|
|
|
|
|
-$(shell $(REMOVE) -r $(TOP_DIR)/$(BUILD_DIR))
|
|
|
|
|
-$(shell $(REMOVE) -r $(KEYBOARD_PATH)/$(BUILD_DIR))
|
|
|
|
|
-$(shell if $$SUBPROJECT; then $(REMOVE) -r $(SUBPROJECT_PATH)/$(BUILD_DIR); fi)
|
|
|
|
|
-$(shell $(REMOVE) -r $(KEYMAP_PATH)/$(BUILD_DIR))
|
|
|
|
|
-endif
|
|
|
|
|
-
|
|
|
|
|
# Create build directory
|
|
# Create build directory
|
|
|
$(shell mkdir $(BUILD_DIR) 2>/dev/null)
|
|
$(shell mkdir $(BUILD_DIR) 2>/dev/null)
|
|
|
|
|
|
|
@@ -505,11 +523,11 @@ $(shell mkdir $(OBJDIR) 2>/dev/null)
|
|
|
$(shell mkdir $(KBOBJDIR) 2>/dev/null)
|
|
$(shell mkdir $(KBOBJDIR) 2>/dev/null)
|
|
|
|
|
|
|
|
# Include the dependency files.
|
|
# Include the dependency files.
|
|
|
--include $(shell mkdir $(BUILD_DIR)/.dep 2>/dev/null) $(wildcard $(BUILD_DIR)/.dep/*)
|
|
|
|
|
|
|
+-include $(patsubst %.o,%.d,$(OBJ))
|
|
|
|
|
|
|
|
|
|
|
|
|
# Listing of phony targets.
|
|
# Listing of phony targets.
|
|
|
-.PHONY : all quick finish sizebefore sizeafter gccversion \
|
|
|
|
|
|
|
+.PHONY : all finish sizebefore sizeafter gccversion \
|
|
|
build elf hex eep lss sym coff extcoff check_submodule \
|
|
build elf hex eep lss sym coff extcoff check_submodule \
|
|
|
clean clean_list debug gdb-config show_path \
|
|
clean clean_list debug gdb-config show_path \
|
|
|
program teensy dfu flip dfu-ee flip-ee dfu-start \
|
|
program teensy dfu flip dfu-ee flip-ee dfu-start \
|