Skip to content

Instantly share code, notes, and snippets.

@h-nari
Created August 31, 2016 07:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save h-nari/66cb3e6b4b0dd13282f39ab0938a716c to your computer and use it in GitHub Desktop.
Save h-nari/66cb3e6b4b0dd13282f39ab0938a716c to your computer and use it in GitHub Desktop.
modified esp8266Arduino.mk , just comment out ULIBDIRS parts, original (https://github.com/thunderace/Esp8266-Arduino-Makefile)
TARGET = $(notdir $(realpath .))
ARCH = $(shell uname)
ifeq ($(ARCH), Linux)
ROOT_DIR := $(shell dirname $(abspath $(lastword $(MAKEFILE_LIST))))
else
# The extensa tools cannot use cygwin paths, so convert /cygdrive/c/abc/... to c:/cygwin64/abc/...
ROOT_DIR_RAW := $(shell dirname $(abspath $(lastword $(MAKEFILE_LIST))))
ROOT_DIR := $(shell cygpath -m $(ROOT_DIR_RAW))
EXEC_EXT = ".exe"
endif
SERIAL_PORT ?= /dev/tty.nodemcu
ARDUINO_HOME ?= $(ROOT_DIR)/esp8266
ARDUINO_ARCH = esp8266
ARDUINO_VARIANT ?= nodemcu
ARDUINO_VERSION ?= 10605
BOARDS_TXT = $(ARDUINO_HOME)/boards.txt
PARSE_BOARD = $(ROOT_DIR)/bin/ard-parse-boards
PARSE_BOARD_OPTS = --boards_txt=$(BOARDS_TXT)
PARSE_BOARD_CMD = $(PARSE_BOARD) $(PARSE_BOARD_OPTS)
ARDUINO_BOARD = $(shell $(PARSE_BOARD_CMD) $(ARDUINO_VARIANT) build.board)
VARIANT = $(shell $(PARSE_BOARD_CMD) $(ARDUINO_VARIANT) build.variant)
EAGLE_FILE_4M3M = $(shell $(PARSE_BOARD_CMD) $(ARDUINO_VARIANT) menu.FlashSize.4M3M.build.flash_ld)
EAGLE_FILE_4M1M = $(shell $(PARSE_BOARD_CMD) $(ARDUINO_VARIANT) menu.FlashSize.4M1M.build.flash_ld)
MCU = $(shell $(PARSE_BOARD_CMD) $(ARDUINO_VARIANT) build.mcu)
SERIAL_BAUD ?= 115200
F_CPU = $(shell $(PARSE_BOARD_CMD) $(ARDUINO_VARIANT) build.f_cpu)
FLASH_SIZE ?= $(shell $(PARSE_BOARD_CMD) $(ARDUINO_VARIANT) build.flash_size)
FLASH_MODE ?= $(shell $(PARSE_BOARD_CMD) $(ARDUINO_VARIANT) build.flash_mode)
FLASH_FREQ ?= $(shell $(PARSE_BOARD_CMD) $(ARDUINO_VARIANT) build.flash_freq)
UPLOAD_RESETMETHOD = $(shell $(PARSE_BOARD_CMD) $(ARDUINO_VARIANT) upload.resetmethod)
UPLOAD_SPEED = $(shell $(PARSE_BOARD_CMD) $(ARDUINO_VARIANT) upload.speed)
XTENSA_TOOLCHAIN ?= $(ROOT_DIR)/xtensa-lx106-elf/bin/
ESPRESSIF_SDK = $(ARDUINO_HOME)/tools/sdk
ESPTOOL ?= $(ROOT_DIR)/bin/esptool$(EXEC_EXT)
ESPOTA ?= $(ARDUINO_HOME)/tools/espota.py
CAT := cat$(EXEC_EXT)
SED := sed$(EXEC_EXT)
rwildcard=$(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d))
get_library_files = $(if $(and $(wildcard $(1)/src), $(wildcard $(1)/library.properties)), \
$(call rwildcard,$(1)/src/,*.$(2)), \
$(wildcard $(1)/*.$(2) $(1)/utility/*.$(2)))
FLASH_LD ?= $(EAGLE_FILE_4M3M)
ifdef SPIFFS_SIZE
ifeq ($(SPIFFS_SIZE),1)
FLASH_LD = $(EAGLE_FILE_4M1M)
endif
endif
LOCAL_USER_LIBDIR ?= ./libraries
GLOBAL_USER_LIBDIR ?= $(ROOT_DIR)/libraries
ifndef TAG
TAG := $(shell date --iso=seconds)
endif
ifdef NODENAME
BUILD_OUT ?= ./build.$(ARDUINO_VARIANT).$(NODENAME)
else
BUILD_OUT ?= ./build.$(ARDUINO_VARIANT)
endif
### ESP8266 CORE
CORE_SSRC = $(wildcard $(ARDUINO_HOME)/cores/$(ARDUINO_ARCH)/*.S)
CORE_SRC = $(wildcard $(ARDUINO_HOME)/cores/$(ARDUINO_ARCH)/*.c)
CORE_SRC += $(wildcard $(ARDUINO_HOME)/cores/$(ARDUINO_ARCH)/*/*.c)
CORE_CXXSRC = $(wildcard $(ARDUINO_HOME)/cores/$(ARDUINO_ARCH)/*.cpp)
CORE_OBJS = $(addprefix $(BUILD_OUT)/core/, \
$(notdir $(CORE_SSRC:.S=.S.o) $(CORE_CXXSRC:.cpp=.cpp.o))) \
$(addprefix $(BUILD_OUT)/core/, $(patsubst $(ARDUINO_HOME)/cores/$(ARDUINO_ARCH)/%.c,%.c.o,$(CORE_SRC)))
CORE_DIRS = $(sort $(dir $(CORE_OBJS)))
USRCDIRS = .
USER_SRC := $(wildcard $(addsuffix /*.c,$(USRCDIRS)))
USER_CXXSRC := $(wildcard $(addsuffix /*.cpp,$(USRCDIRS)))
USER_HSRC := $(wildcard $(addsuffix /*.h,$(USRCDIRS)))
USER_HPPSRC := $(wildcard $(addsuffix /*.hpp,$(USRCDIRS)))
USER_INOSRC := $(wildcard $(addsuffix /*.ino,$(USRCDIRS)))
LOCAL_SRCS = $(USER_SRC) $(USER_CXXSRC) $(USER_INOSRC) $(USER_HSRC) $(USER_HPPSRC)
#autodetect arduino libs and user libs
ifndef ARDUINO_LIBS
# automatically determine included libraries
ARDUINO_LIBS = $(sort $(filter $(notdir $(wildcard $(ARDUINO_HOME)/libraries/*)), \
$(shell $(SED) -ne 's/^ *\# *include *[<\"]\(.*\)\.h[>\"]/\1/p' $(LOCAL_SRCS))))
endif
ifndef USER_LIBS
# automatically determine included user libraries
USER_LIBS = $(sort $(filter $(notdir $(wildcard $(LOCAL_USER_LIBDIR)/*)), \
$(shell $(SED) -ne 's/^ *\# *include *[<\"]\(.*\)\.h[>\"]/\1/p' $(LOCAL_SRCS))))
USER_LIBS += $(sort $(filter $(notdir $(wildcard $(GLOBAL_USER_LIBDIR)/*)), \
$(shell $(SED) -ne 's/^ *\# *include *[<\"]\(.*\)\.h[>\"]/\1/p' $(LOCAL_SRCS))))
endif
# arduino libraries
ALIBDIRS = $(sort $(dir $(wildcard \
$(ARDUINO_LIBS:%=$(ARDUINO_HOME)/libraries/%/*.c) \
$(ARDUINO_LIBS:%=$(ARDUINO_HOME)/libraries/%/*.cpp) \
$(ARDUINO_LIBS:%=$(ARDUINO_HOME)/libraries/%/src/*.c) \
$(ARDUINO_LIBS:%=$(ARDUINO_HOME)/libraries/%/src/*.cpp))))
# user libraries and sketch code
# ULIBDIRS = $(sort $(dir $(wildcard \
# $(USER_LIBS:%=$(LOCAL_USER_LIBDIR)/%/*.c) \
# $(USER_LIBS:%=$(LOCAL_USER_LIBDIR)/%/src/*.c) \
# $(USER_LIBS:%=$(LOCAL_USER_LIBDIR)/%/src/*/*.c) \
# $(USER_LIBS:%=$(LOCAL_USER_LIBDIR)/%/src/*/*/*.c) \
# $(USER_LIBS:%=$(LOCAL_USER_LIBDIR)/%/*.cpp) \
# $(USER_LIBS:%=$(LOCAL_USER_LIBDIR)/%/src/*.cpp) \
# $(USER_LIBS:%=$(LOCAL_USER_LIBDIR)/%/src/*/*.cpp) \
# $(USER_LIBS:%=$(LOCAL_USER_LIBDIR)/%/src/*/*/*.cpp) \
# $(USER_LIBS:%=$(GLOBAL_USER_LIBDIR)/%/*.c) \
# $(USER_LIBS:%=$(GLOBAL_USER_LIBDIR)/%/src/*.c) \
# $(USER_LIBS:%=$(GLOBAL_USER_LIBDIR)/%/src/*/*.c) \
# $(USER_LIBS:%=$(GLOBAL_USER_LIBDIR)/%/src/*/*/*.c) \
# $(USER_LIBS:%=$(GLOBAL_USER_LIBDIR)/%/*.cpp) \
# $(USER_LIBS:%=$(GLOBAL_USER_LIBDIR)/%/src/*.cpp) \
# $(USER_LIBS:%=$(GLOBAL_USER_LIBDIR)/%/src/*/*.cpp) \
# $(USER_LIBS:%=$(GLOBAL_USER_LIBDIR)/%/src/*/*/*.cpp))))
LIB_SRC = $(wildcard $(addsuffix /*.c,$(ULIBDIRS))) \
$(wildcard $(addsuffix /*.c,$(ALIBDIRS)))
LIB_CXXSRC = $(wildcard $(addsuffix /*.cpp,$(ULIBDIRS))) \
$(wildcard $(addsuffix /*.cpp,$(ALIBDIRS)))
# object files
OBJ_FILES = $(addprefix $(BUILD_OUT)/,$(notdir $(LIB_SRC:.c=.c.o) $(LIB_CXXSRC:.cpp=.cpp.o) $(TARGET).fullino.o $(USER_SRC:.c=.c.o) $(USER_CXXSRC:.cpp=.cpp.o)))
CPREPROCESSOR_FLAGS = -D__ets__ -DICACHE_FLASH -U__STRICT_ANSI__ -I$(ESPRESSIF_SDK)/include -I$(ESPRESSIF_SDK)/lwip/include
DEFINES = $(CPREPROCESSOR_FLAGS) -DLWIP_OPEN_SRC \
-DF_CPU=$(F_CPU) -DARDUINO=$(ARDUINO_VERSION) \
-DARDUINO_$(ARDUINO_BOARD) -DESP8266 \
-DARDUINO_ARCH_$(shell echo "$(ARDUINO_ARCH)" | tr '[:lower:]' '[:upper:]') \
CORE_INC = $(ARDUINO_HOME)/cores/$(ARDUINO_ARCH) \
$(ARDUINO_HOME)/variants/$(VARIANT)
INCLUDES = -include Arduino.h $(CORE_INC:%=-I%) $(ALIBDIRS:%=-I%) $(ULIBDIRS:%=-I%) $(USRCDIRS:%=-I%)
VPATH = . $(CORE_INC) $(ALIBDIRS) $(ULIBDIRS)
ASFLAGS = -c -g -x assembler-with-cpp -MMD -mlongcalls $(DEFINES)
CFLAGS = -c -Os -Wpointer-arith -Wno-implicit-function-declaration -Wl,-EL \
-fno-inline-functions -nostdlib -mlongcalls -mtext-section-literals \
-falign-functions=4 -MMD -std=gnu99 -ffunction-sections -fdata-sections
CXXFLAGS = -c -Os -mlongcalls -mtext-section-literals -fno-exceptions \
-fno-rtti -falign-functions=4 -std=c++11 -MMD -ffunction-sections -fdata-sections
ELFLIBS = -lm -lgcc -lhal -lphy -lpp -lnet80211 -lwpa -lcrypto -lmain -lwps -laxtls -lsmartconfig -lmesh -lwpa2 -llwip_gcc -lstdc++
ELFFLAGS = -g -w -Os -nostdlib -Wl,--no-check-sections -u call_user_start -Wl,-static \
-L$(ESPRESSIF_SDK)/lib -L$(ESPRESSIF_SDK)/ld \
-T$(ESPRESSIF_SDK)/ld/$(FLASH_LD) \
-Wl,--gc-sections -Wl,-wrap,system_restart_local -Wl,-wrap,register_chipv6_phy
CC := $(XTENSA_TOOLCHAIN)xtensa-lx106-elf-gcc
CXX := $(XTENSA_TOOLCHAIN)xtensa-lx106-elf-g++
AR := $(XTENSA_TOOLCHAIN)xtensa-lx106-elf-ar
LD := $(XTENSA_TOOLCHAIN)xtensa-lx106-elf-gcc
OBJDUMP := $(XTENSA_TOOLCHAIN)xtensa-lx106-elf-objdump
SIZE := $(XTENSA_TOOLCHAIN)xtensa-lx106-elf-size
.PHONY: all dirs clean upload
all: show_variables dirs core libs bin size
show_variables:
$(info [ARDUINO_LIBS] : $(ARDUINO_LIBS))
$(info [USER_LIBS] : $(USER_LIBS))
$(info [ALIBDIRS] : $(ALIBDIRS))
$(info [ULIBDIRS] : $(ULIBDIRS))
dirs:
@mkdir -p $(CORE_DIRS)
clean:
rm -rf $(BUILD_OUT)
core: dirs $(BUILD_OUT)/core/core.a
libs: dirs $(OBJ_FILES)
bin: $(BUILD_OUT)/$(TARGET).bin
$(BUILD_OUT)/core/%.S.o: $(ARDUINO_HOME)/cores/$(ARDUINO_ARCH)/%.S
$(CC) $(ASFLAGS) -o $@ $<
$(BUILD_OUT)/core/core.a: $(CORE_OBJS)
$(AR) cru $@ $(CORE_OBJS)
$(BUILD_OUT)/core/%.c.o: %.c
$(CC) $(CORE_DEFINE) $(DEFINES) $(CORE_INC:%=-I%) $(CFLAGS) -o $@ $<
$(BUILD_OUT)/core/%.cpp.o: %.cpp
$(CXX) $(CORE_DEFINE) $(DEFINES) $(CORE_INC:%=-I%) $(CXXFLAGS) $< -o $@
$(BUILD_OUT)/%.c.o: %.c
$(CXX) -x c++ -D_TAG_=\"$(TAG)\" $(USER_DEFINE) $(DEFINES) $(CXXFLAGS) $(INCLUDES) $< -o $@
# $(CC) -D_TAG_=\"$(TAG)\" $(DEFINES) $(CFLAGS) $(INCLUDES) -o $@ $<
$(BUILD_OUT)/%.cpp.o: %.cpp
$(CXX) -D_TAG_=\"$(TAG)\" $(USER_DEFINE) $(DEFINES) $(CXXFLAGS) $(INCLUDES) $< -o $@
$(BUILD_OUT)/%.fullino: $(USER_INOSRC)
-cat $(TARGET).ino $(filter-out $(TARGET).ino,$^) > $@
$(BUILD_OUT)/%.fullino.o: $(BUILD_OUT)/%.fullino
$(CXX) -x c++ -D_TAG_=\"$(TAG)\" $(USER_DEFINE) $(DEFINES) $(CXXFLAGS) $(INCLUDES) $< -o $@
$(BUILD_OUT)/$(TARGET).elf: core libs
$(LD) $(ELFFLAGS) -o $@ \
-Wl,--start-group $(OBJ_FILES) $(BUILD_OUT)/core/core.a \
$(ELFLIBS) \
-Wl,--end-group -L$(BUILD_OUT)
size: $(BUILD_OUT)/$(TARGET).elf
@$(SIZE) -A $(BUILD_OUT)/$(TARGET).elf | grep -E '^(?:\.text|\.data|\.rodata|\.irom0\.text|)\s+([0-9]+).*'
$(BUILD_OUT)/$(TARGET).bin: $(BUILD_OUT)/$(TARGET).elf
$(ESPTOOL) -eo $(ARDUINO_HOME)/bootloaders/eboot/eboot.elf -bo $(BUILD_OUT)/$(TARGET).bin \
-bm $(FLASH_MODE) -bf $(FLASH_FREQ) -bz $(FLASH_SIZE) \
-bs .text -bp 4096 -ec -eo $(BUILD_OUT)/$(TARGET).elf -bs .irom0.text -bs .text -bs .data -bs .rodata -bc -ec
upload: $(BUILD_OUT)/$(TARGET).bin size
$(ESPTOOL) $(ESPTOOL_VERBOSE) -cd $(UPLOAD_RESETMETHOD) -cb $(UPLOAD_SPEED) -cp $(SERIAL_PORT) -ca 0x00000 -cf $(BUILD_OUT)/$(TARGET).bin
ota: $(BUILD_OUT)/$(TARGET).bin
$(ESPOTA) -i $(OTA_IP) -p $(OTA_PORT) -a $(OTA_AUTH) -f $(BUILD_OUT)/$(TARGET).bin
term:
minicom -D $(SERIAL_PORT) -b $(SERIAL_BAUD)
print-%: ; @echo $* = $($*)
-include $(OBJ_FILES:.o=.d)
@h-nari
Copy link
Author

h-nari commented Aug 31, 2016

自分の cygwin上の環境で動くように、修正しました。
といっても、111行目からのULIBDIRSの定義をコメントアウトしたたけです。

インクルードするライブラリのパス等は、すべてMakefile側で定義するようにしました。

オリジナルは、以下です。
https://github.com/thunderace/Esp8266-Arduino-Makefile

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment