mirror of
https://github.com/nodemcu/nodemcu-firmware.git
synced 2025-01-16 20:52:57 +08:00
6d3d95a271
This allows setting the path to esptool.py as an option on make, allowing the use of alternative tools, or modified esptool.py versions.
249 lines
6.6 KiB
Makefile
249 lines
6.6 KiB
Makefile
# copyright (c) 2010 Espressif System
|
|
#
|
|
ifndef PDIR
|
|
|
|
endif
|
|
|
|
#############################################################
|
|
# Select compile
|
|
#
|
|
ifeq ($(OS),Windows_NT)
|
|
# WIN32
|
|
# We are under windows.
|
|
ifeq ($(XTENSA_CORE),lx106)
|
|
# It is xcc
|
|
AR = xt-ar
|
|
CC = xt-xcc
|
|
NM = xt-nm
|
|
CPP = xt-cpp
|
|
OBJCOPY = xt-objcopy
|
|
#MAKE = xt-make
|
|
CCFLAGS += -Os --rename-section .text=.irom0.text --rename-section .literal=.irom0.literal
|
|
else
|
|
# It is gcc, may be cygwin
|
|
# Can we use -fdata-sections?
|
|
CCFLAGS += -Os -ffunction-sections -fno-jump-tables
|
|
AR = xtensa-lx106-elf-ar
|
|
CC = xtensa-lx106-elf-gcc
|
|
NM = xtensa-lx106-elf-nm
|
|
CPP = xtensa-lx106-elf-cpp
|
|
OBJCOPY = xtensa-lx106-elf-objcopy
|
|
endif
|
|
FIRMWAREDIR = ..\\bin\\
|
|
ifndef COMPORT
|
|
ESPPORT = com1
|
|
else
|
|
ESPPORT = $(COMPORT)
|
|
endif
|
|
ifeq ($(PROCESSOR_ARCHITECTURE),AMD64)
|
|
# ->AMD64
|
|
endif
|
|
ifeq ($(PROCESSOR_ARCHITECTURE),x86)
|
|
# ->IA32
|
|
endif
|
|
else
|
|
# We are under other system, may be Linux. Assume using gcc.
|
|
# Can we use -fdata-sections?
|
|
ifndef COMPORT
|
|
ESPPORT = /dev/ttyUSB0
|
|
else
|
|
ESPPORT = $(COMPORT)
|
|
endif
|
|
CCFLAGS += -Os -ffunction-sections -fno-jump-tables
|
|
AR = xtensa-lx106-elf-ar
|
|
CC = xtensa-lx106-elf-gcc
|
|
NM = xtensa-lx106-elf-nm
|
|
CPP = xtensa-lx106-elf-cpp
|
|
OBJCOPY = xtensa-lx106-elf-objcopy
|
|
FIRMWAREDIR = ../bin/
|
|
UNAME_S := $(shell uname -s)
|
|
ifeq ($(UNAME_S),Linux)
|
|
# LINUX
|
|
endif
|
|
ifeq ($(UNAME_S),Darwin)
|
|
# OSX
|
|
endif
|
|
UNAME_P := $(shell uname -p)
|
|
ifeq ($(UNAME_P),x86_64)
|
|
# ->AMD64
|
|
endif
|
|
ifneq ($(filter %86,$(UNAME_P)),)
|
|
# ->IA32
|
|
endif
|
|
ifneq ($(filter arm%,$(UNAME_P)),)
|
|
# ->ARM
|
|
endif
|
|
endif
|
|
#############################################################
|
|
ESPTOOL ?= ../tools/esptool.py
|
|
|
|
|
|
CSRCS ?= $(wildcard *.c)
|
|
ASRCs ?= $(wildcard *.s)
|
|
ASRCS ?= $(wildcard *.S)
|
|
SUBDIRS ?= $(patsubst %/,%,$(dir $(wildcard */Makefile)))
|
|
|
|
ODIR := .output
|
|
OBJODIR := $(ODIR)/$(TARGET)/$(FLAVOR)/obj
|
|
|
|
OBJS := $(CSRCS:%.c=$(OBJODIR)/%.o) \
|
|
$(ASRCs:%.s=$(OBJODIR)/%.o) \
|
|
$(ASRCS:%.S=$(OBJODIR)/%.o)
|
|
|
|
DEPS := $(CSRCS:%.c=$(OBJODIR)/%.d) \
|
|
$(ASRCs:%.s=$(OBJODIR)/%.d) \
|
|
$(ASRCS:%.S=$(OBJODIR)/%.d)
|
|
|
|
LIBODIR := $(ODIR)/$(TARGET)/$(FLAVOR)/lib
|
|
OLIBS := $(GEN_LIBS:%=$(LIBODIR)/%)
|
|
|
|
IMAGEODIR := $(ODIR)/$(TARGET)/$(FLAVOR)/image
|
|
OIMAGES := $(GEN_IMAGES:%=$(IMAGEODIR)/%)
|
|
|
|
BINODIR := $(ODIR)/$(TARGET)/$(FLAVOR)/bin
|
|
OBINS := $(GEN_BINS:%=$(BINODIR)/%)
|
|
|
|
CCFLAGS += \
|
|
-g \
|
|
-O2 \
|
|
-Wpointer-arith \
|
|
-Wundef \
|
|
-Werror \
|
|
-Wl,-EL \
|
|
-fno-inline-functions \
|
|
-nostdlib \
|
|
-mlongcalls \
|
|
-mtext-section-literals
|
|
# -Wall
|
|
|
|
CFLAGS = $(CCFLAGS) $(DEFINES) $(EXTRA_CCFLAGS) $(INCLUDES)
|
|
DFLAGS = $(CCFLAGS) $(DDEFINES) $(EXTRA_CCFLAGS) $(INCLUDES)
|
|
|
|
|
|
#############################################################
|
|
# Functions
|
|
#
|
|
|
|
define ShortcutRule
|
|
$(1): .subdirs $(2)/$(1)
|
|
endef
|
|
|
|
define MakeLibrary
|
|
DEP_LIBS_$(1) = $$(foreach lib,$$(filter %.a,$$(COMPONENTS_$(1))),$$(dir $$(lib))$$(LIBODIR)/$$(notdir $$(lib)))
|
|
DEP_OBJS_$(1) = $$(foreach obj,$$(filter %.o,$$(COMPONENTS_$(1))),$$(dir $$(obj))$$(OBJODIR)/$$(notdir $$(obj)))
|
|
$$(LIBODIR)/$(1).a: $$(OBJS) $$(DEP_OBJS_$(1)) $$(DEP_LIBS_$(1)) $$(DEPENDS_$(1))
|
|
@mkdir -p $$(LIBODIR)
|
|
$$(if $$(filter %.a,$$?),mkdir -p $$(EXTRACT_DIR)_$(1))
|
|
$$(if $$(filter %.a,$$?),cd $$(EXTRACT_DIR)_$(1); $$(foreach lib,$$(filter %.a,$$?),$$(AR) xo $$(UP_EXTRACT_DIR)/$$(lib);))
|
|
$$(AR) ru $$@ $$(filter %.o,$$?) $$(if $$(filter %.a,$$?),$$(EXTRACT_DIR)_$(1)/*.o)
|
|
$$(if $$(filter %.a,$$?),$$(RM) -r $$(EXTRACT_DIR)_$(1))
|
|
endef
|
|
|
|
define MakeImage
|
|
DEP_LIBS_$(1) = $$(foreach lib,$$(filter %.a,$$(COMPONENTS_$(1))),$$(dir $$(lib))$$(LIBODIR)/$$(notdir $$(lib)))
|
|
DEP_OBJS_$(1) = $$(foreach obj,$$(filter %.o,$$(COMPONENTS_$(1))),$$(dir $$(obj))$$(OBJODIR)/$$(notdir $$(obj)))
|
|
$$(IMAGEODIR)/$(1).out: $$(OBJS) $$(DEP_OBJS_$(1)) $$(DEP_LIBS_$(1)) $$(DEPENDS_$(1))
|
|
@mkdir -p $$(IMAGEODIR)
|
|
$$(CC) $$(LDFLAGS) $$(if $$(LINKFLAGS_$(1)),$$(LINKFLAGS_$(1)),$$(LINKFLAGS_DEFAULT) $$(OBJS) $$(DEP_OBJS_$(1)) $$(DEP_LIBS_$(1))) -o $$@
|
|
endef
|
|
|
|
$(BINODIR)/%.bin: $(IMAGEODIR)/%.out
|
|
@mkdir -p $(BINODIR)
|
|
$(ESPTOOL) elf2image $< -o $(FIRMWAREDIR)
|
|
|
|
#############################################################
|
|
# Rules base
|
|
# Should be done in top-level makefile only
|
|
#
|
|
|
|
all: .subdirs $(OBJS) $(OLIBS) $(OIMAGES) $(OBINS) $(SPECIAL_MKTARGETS)
|
|
|
|
clean:
|
|
$(foreach d, $(SUBDIRS), $(MAKE) -C $(d) clean;)
|
|
$(RM) -r $(ODIR)/$(TARGET)/$(FLAVOR)
|
|
|
|
clobber: $(SPECIAL_CLOBBER)
|
|
$(foreach d, $(SUBDIRS), $(MAKE) -C $(d) clobber;)
|
|
$(RM) -r $(ODIR)
|
|
|
|
flash:
|
|
ifndef PDIR
|
|
$(MAKE) -C ./app flash
|
|
else
|
|
$(ESPTOOL) --port $(ESPPORT) write_flash 0x00000 $(FIRMWAREDIR)0x00000.bin 0x10000 $(FIRMWAREDIR)0x10000.bin
|
|
endif
|
|
|
|
.subdirs:
|
|
@set -e; $(foreach d, $(SUBDIRS), $(MAKE) -C $(d);)
|
|
|
|
#.subdirs:
|
|
# $(foreach d, $(SUBDIRS), $(MAKE) -C $(d))
|
|
|
|
ifneq ($(MAKECMDGOALS),clean)
|
|
ifneq ($(MAKECMDGOALS),clobber)
|
|
ifdef DEPS
|
|
sinclude $(DEPS)
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
$(OBJODIR)/%.o: %.c
|
|
@mkdir -p $(OBJODIR);
|
|
$(CC) $(if $(findstring $<,$(DSRCS)),$(DFLAGS),$(CFLAGS)) $(COPTS_$(*F)) -o $@ -c $<
|
|
|
|
$(OBJODIR)/%.d: %.c
|
|
@mkdir -p $(OBJODIR);
|
|
@echo DEPEND: $(CC) -M $(CFLAGS) $<
|
|
@set -e; rm -f $@; \
|
|
$(CC) -M $(CFLAGS) $< > $@.$$$$; \
|
|
sed 's,\($*\.o\)[ :]*,$(OBJODIR)/\1 $@ : ,g' < $@.$$$$ > $@; \
|
|
rm -f $@.$$$$
|
|
|
|
$(OBJODIR)/%.o: %.s
|
|
@mkdir -p $(OBJODIR);
|
|
$(CC) $(CFLAGS) -o $@ -c $<
|
|
|
|
$(OBJODIR)/%.d: %.s
|
|
@mkdir -p $(OBJODIR); \
|
|
set -e; rm -f $@; \
|
|
$(CC) -M $(CFLAGS) $< > $@.$$$$; \
|
|
sed 's,\($*\.o\)[ :]*,$(OBJODIR)/\1 $@ : ,g' < $@.$$$$ > $@; \
|
|
rm -f $@.$$$$
|
|
|
|
$(OBJODIR)/%.o: %.S
|
|
@mkdir -p $(OBJODIR);
|
|
$(CC) $(CFLAGS) -D__ASSEMBLER__ -o $@ -c $<
|
|
|
|
$(OBJODIR)/%.d: %.S
|
|
@mkdir -p $(OBJODIR); \
|
|
set -e; rm -f $@; \
|
|
$(CC) -M $(CFLAGS) $< > $@.$$$$; \
|
|
sed 's,\($*\.o\)[ :]*,$(OBJODIR)/\1 $@ : ,g' < $@.$$$$ > $@; \
|
|
rm -f $@.$$$$
|
|
|
|
$(foreach lib,$(GEN_LIBS),$(eval $(call ShortcutRule,$(lib),$(LIBODIR))))
|
|
|
|
$(foreach image,$(GEN_IMAGES),$(eval $(call ShortcutRule,$(image),$(IMAGEODIR))))
|
|
|
|
$(foreach bin,$(GEN_BINS),$(eval $(call ShortcutRule,$(bin),$(BINODIR))))
|
|
|
|
$(foreach lib,$(GEN_LIBS),$(eval $(call MakeLibrary,$(basename $(lib)))))
|
|
|
|
$(foreach image,$(GEN_IMAGES),$(eval $(call MakeImage,$(basename $(image)))))
|
|
|
|
#############################################################
|
|
# Recursion Magic - Don't touch this!!
|
|
#
|
|
# Each subtree potentially has an include directory
|
|
# corresponding to the common APIs applicable to modules
|
|
# rooted at that subtree. Accordingly, the INCLUDE PATH
|
|
# of a module can only contain the include directories up
|
|
# its parent path, and not its siblings
|
|
#
|
|
# Required for each makefile to inherit from the parent
|
|
#
|
|
|
|
INCLUDES := $(INCLUDES) -I $(PDIR)include -I $(PDIR)include/$(TARGET)
|
|
PDIR := ../$(PDIR)
|
|
sinclude $(PDIR)Makefile
|