Last active
March 29, 2021 07:45
-
-
Save jcmvbkbc/795b51494aea52bf2d1e to your computer and use it in GitHub Desktop.
Makefile for ESP8266 that can build both C and C++
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# tnx to mamalala | |
# Changelog | |
# Changed the variables to include the header file directory | |
# Added global var for the XTENSA tool root | |
# | |
# This make file still needs some work. | |
# | |
# Updated for SDK 0.9.2 | |
# | |
# Output directors to store intermediate compiled files | |
# relative to the project directory | |
ROOT = $(HOME)/tmp/esp-shit/opt/Espressif | |
BUILD_BASE = build | |
FW_BASE = firmware | |
# Base directory for the compiler | |
XTENSA_TOOLS_ROOT ?= $(ROOT)/crosstool-NG/builds/xtensa-lx106-elf/bin | |
# base directory of the ESP8266 SDK package, absolute | |
SDK_BASE ?= $(ROOT)/ESP8266_SDK | |
#Esptool.py path and port | |
ESPTOOL ?= esptool.py | |
ESPPORT ?= /dev/ttyUSB0 | |
# name for the target project | |
TARGET = app | |
# which modules (subdirectories) of the project to include in compiling | |
MODULES = driver user | |
EXTRA_INCDIR = include $(ROOT)/include/ | |
# libraries used in this project, mainly provided by the SDK | |
LIBS = c gcc hal phy net80211 lwip wpa upgrade upgrade_ssl main pp | |
# compiler flags using during compilation of source files | |
CFLAGS = -Os -g -O2 -Wpointer-arith -Wundef -Werror -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mtext-section-literals -D__ets__ -DICACHE_FLASH | |
CXXFLAGS = $(CFLAGS) -fno-rtti -fno-exceptions | |
# linker flags used to generate the main object file | |
LDFLAGS = -nostdlib -Wl,--no-check-sections -u call_user_start -Wl,-static | |
# linker script used for the above linkier step | |
LD_SCRIPT = eagle.app.v6.ld | |
# various paths from the SDK used in this project | |
SDK_LIBDIR = lib | |
SDK_LDDIR = ld | |
SDK_INCDIR = include include/json | |
# we create two different files for uploading into the flash | |
# these are the names and options to generate them | |
FW_FILE_1 = 0x00000 | |
FW_FILE_1_ARGS = -bo $@ -bs .text -bs .data -bs .rodata -bc -ec | |
FW_FILE_2 = 0x40000 | |
FW_FILE_2_ARGS = -es .irom0.text $@ -ec | |
# select which tools to use as compiler, librarian and linker | |
CC := $(XTENSA_TOOLS_ROOT)/xtensa-lx106-elf-gcc | |
CXX := $(XTENSA_TOOLS_ROOT)/xtensa-lx106-elf-g++ | |
AR := $(XTENSA_TOOLS_ROOT)/xtensa-lx106-elf-ar | |
LD := $(XTENSA_TOOLS_ROOT)/xtensa-lx106-elf-gcc | |
#### | |
#### no user configurable options below here | |
#### | |
FW_TOOL ?= /usr/bin/esptool | |
SRC_DIR := $(MODULES) | |
BUILD_DIR := $(addprefix $(BUILD_BASE)/,$(MODULES)) | |
SDK_LIBDIR := $(addprefix $(SDK_BASE)/,$(SDK_LIBDIR)) | |
SDK_INCDIR := $(addprefix -I$(SDK_BASE)/,$(SDK_INCDIR)) | |
SRC := $(foreach sdir,$(SRC_DIR),$(wildcard $(sdir)/*.c*)) | |
C_OBJ := $(patsubst %.c,%.o,$(SRC)) | |
CXX_OBJ := $(patsubst %.cpp,%.o,$(C_OBJ)) | |
OBJ := $(patsubst %.o,$(BUILD_BASE)/%.o,$(CXX_OBJ)) | |
LIBS := $(addprefix -l,$(LIBS)) | |
APP_AR := $(addprefix $(BUILD_BASE)/,$(TARGET)_app.a) | |
TARGET_OUT := $(addprefix $(BUILD_BASE)/,$(TARGET).out) | |
LD_SCRIPT := $(addprefix -T$(SDK_BASE)/$(SDK_LDDIR)/,$(LD_SCRIPT)) | |
INCDIR := $(addprefix -I,$(SRC_DIR)) | |
EXTRA_INCDIR := $(addprefix -I,$(EXTRA_INCDIR)) | |
MODULE_INCDIR := $(addsuffix /include,$(INCDIR)) | |
FW_FILE_1 := $(addprefix $(FW_BASE)/,$(FW_FILE_1).bin) | |
FW_FILE_2 := $(addprefix $(FW_BASE)/,$(FW_FILE_2).bin) | |
V ?= $(VERBOSE) | |
ifeq ("$(V)","1") | |
Q := | |
vecho := @true | |
else | |
Q := @ | |
vecho := @echo | |
endif | |
vpath %.c $(SRC_DIR) | |
vpath %.cpp $(SRC_DIR) | |
define compile-objects | |
$1/%.o: %.c | |
$(vecho) "CC $$<" | |
$(Q) $(CC) $(INCDIR) $(MODULE_INCDIR) $(EXTRA_INCDIR) $(SDK_INCDIR) $(CFLAGS) -c $$< -o $$@ | |
$1/%.o: %.cpp | |
$(vecho) "C+ $$<" | |
$(Q) $(CXX) $(INCDIR) $(MODULE_INCDIR) $(EXTRA_INCDIR) $(SDK_INCDIR) $(CXXFLAGS) -c $$< -o $$@ | |
endef | |
.PHONY: all checkdirs clean | |
all: checkdirs $(TARGET_OUT) $(FW_FILE_1) $(FW_FILE_2) | |
$(FW_FILE_1): $(TARGET_OUT) | |
$(vecho) "FW $@" | |
$(Q) $(FW_TOOL) -eo $(TARGET_OUT) $(FW_FILE_1_ARGS) | |
$(FW_FILE_2): $(TARGET_OUT) | |
$(vecho) "FW $@" | |
$(Q) $(FW_TOOL) -eo $(TARGET_OUT) $(FW_FILE_2_ARGS) | |
$(TARGET_OUT): $(APP_AR) | |
$(vecho) "LD $@" | |
$(Q) $(LD) -L$(SDK_LIBDIR) $(LD_SCRIPT) $(LDFLAGS) -Wl,--start-group $(LIBS) $(APP_AR) -Wl,--end-group -o $@ | |
$(APP_AR): $(OBJ) | |
$(vecho) "AR $@" | |
$(Q) $(AR) cru $@ $^ | |
checkdirs: $(BUILD_DIR) $(FW_BASE) | |
$(BUILD_DIR): | |
$(Q) mkdir -p $@ | |
firmware: | |
$(Q) mkdir -p $@ | |
flash: firmware/0x00000.bin firmware/0x40000.bin | |
-$(ESPTOOL) --port $(ESPPORT) write_flash 0x00000 firmware/0x00000.bin | |
sleep 3 | |
-$(ESPTOOL) --port $(ESPPORT) write_flash 0x40000 firmware/0x40000.bin | |
clean: | |
$(Q) rm -f $(APP_AR) | |
$(Q) rm -f $(TARGET_OUT) | |
$(Q) rm -rf $(BUILD_DIR) | |
$(Q) rm -rf $(BUILD_BASE) | |
$(Q) rm -f $(FW_FILE_1) | |
$(Q) rm -f $(FW_FILE_2) | |
$(Q) rm -rf $(FW_BASE) | |
$(foreach bdir,$(BUILD_DIR),$(eval $(call compile-objects,$(bdir)))) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I've tried compiling with this makefile and got an error saying that couldn't find -lupgrade_ssl
make
-nostdlib -Wl,--no-check-sections -u call_user_start -Wl,-static
LD build/app.out
/media/rinaldi/Excess/Dropbox/new-projects/esp-open-sdk/xtensa-lx106-elf/lib/gcc/xtensa-lx106-elf/4.8.5/../../../../xtensa-lx106-elf/bin/ld:
cannot find -lupgrade_ssl
collect2: error: ld returned 1 exit status
Makefile:125: recipe for target 'build/app.out' failed
make: *** [build/app.out] Error 1
after removing it from LIBS variable it throws an error in sdk/lib/limain.a
make
LD build/app.out
/media/rinaldi/Excess/Dropbox/new-projects/esp-open-sdk/sdk/lib/libmain.a(app_main.o): In function 'flash_data_check':
(.irom0.text+0x770): undefined reference to 'user_init'
/media/rinaldi/Excess/Dropbox/new-projects/esp-open-sdk/sdk/lib/libmain.a(app_main.o): In function 'flash_data_check':
(.irom0.text+0xb27): undefined reference to 'user_init'
collect2: error: ld returned 1 exit status
Makefile:125: recipe for target 'build/app.out' failed
make: *** [build/app.out] Error 1