makefile 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. #====================================================================================
  2. # makeESPArduino
  3. #
  4. # A makefile for ESP8286 Arduino projects.
  5. # Edit the contents of this file to suit your project
  6. # or just include it and override the applicable macros.
  7. #
  8. # License: GPL 2.1
  9. # General and full license information is available at:
  10. # https://github.com/plerup/makeEspArduino
  11. #
  12. # Copyright (c) 2016 Peter Lerup. All rights reserved.
  13. #
  14. #====================================================================================
  15. #====================================================================================
  16. # User editable area
  17. #====================================================================================
  18. #=== Project specific definitions: sketch and list of needed libraries
  19. SKETCH ?= $(HOME)/makeEspArduino/WiFi_Temp_Logger/wifi_temp_logger.cpp
  20. LIBS ?= \
  21. $(ESP_LIBS)/ESP8266WiFi \
  22. $(ESP_LIBS)/OneWire \
  23. $(ESP_LIBS)/DNSServer \
  24. $(ESP_LIBS)/ESP8266WebServer \
  25. $(ESP_LIBS)/WiFiManager \
  26. $(ESP_LIBS)/ESP8266HTTPClient
  27. # Esp8266 Arduino git location
  28. ESP_ROOT ?= $(HOME)/esp8266
  29. # Output directory
  30. BUILD_ROOT ?= $(HOME)/makeEspArduino/WiFi_Temp_Logger/tmp/$(MAIN_NAME)
  31. # Board definitions
  32. FLASH_SIZE ?= 4M
  33. FLASH_MODE ?= dio
  34. FLASH_SPEED ?= 40
  35. FLASH_LAYOUT ?= eagle.flash.4m.ld
  36. # Upload parameters
  37. UPLOAD_SPEED ?= 230400
  38. #UPLOAD_SPEED ?= 9600
  39. UPLOAD_PORT ?= /dev/cu.usbserial-A104VFS5
  40. #UPLOAD_PORT ?= /dev/tty.wchusbserialfd120
  41. UPLOAD_VERB ?= -v
  42. UPLOAD_RESET ?= ck
  43. # OTA parameters
  44. ESP_ADDR ?= ESP_DA6ABC
  45. ESP_PORT ?= 8266
  46. ESP_PWD ?= 123
  47. # HTTP update parameters
  48. HTTP_ADDR ?= ESP_DA6ABC
  49. HTTP_URI ?= /update
  50. HTTP_PWD ?= user
  51. HTTP_USR ?= password
  52. #====================================================================================
  53. # The area below should normally not need to be edited
  54. #====================================================================================
  55. MKESPARD_VERSION = 1.0.0
  56. START_TIME := $(shell perl -e "print time();")
  57. # Main output definitions
  58. MAIN_NAME = $(basename $(notdir $(SKETCH)))
  59. MAIN_EXE = $(BUILD_ROOT)/$(MAIN_NAME).bin
  60. MAIN_ELF = $(OBJ_DIR)/$(MAIN_NAME).elf
  61. SRC_GIT_VERSION = $(call git_description,$(dir $(SKETCH)))
  62. # esp8266 arduino directories
  63. ESP_GIT_VERSION = $(call git_description,$(ESP_ROOT))
  64. ESP_LIBS = $(ESP_ROOT)/libraries
  65. TOOLS_ROOT = $(ESP_ROOT)/tools
  66. TOOLS_BIN = $(TOOLS_ROOT)/xtensa-lx106-elf/bin
  67. SDK_ROOT = $(ESP_ROOT)/tools/sdk
  68. # Directory for intermedite build files
  69. OBJ_DIR = $(BUILD_ROOT)/obj
  70. OBJ_EXT = .o
  71. DEP_EXT = .d
  72. # Compiler definitions
  73. CC = $(TOOLS_BIN)/xtensa-lx106-elf-gcc
  74. CPP = $(TOOLS_BIN)/xtensa-lx106-elf-g++
  75. LD = $(CC)
  76. AR = $(TOOLS_BIN)/xtensa-lx106-elf-ar
  77. ESP_TOOL = $(TOOLS_ROOT)/esptool/esptool
  78. OTA_TOOL = $(TOOLS_ROOT)/espota.py
  79. HTTP_TOOL = curl
  80. INCLUDE_DIRS += $(SDK_ROOT)/include $(SDK_ROOT)/lwip/include $(CORE_DIR) $(ESP_ROOT)/variants/generic $(OBJ_DIR)
  81. C_DEFINES = -D__ets__ -DICACHE_FLASH -U__STRICT_ANSI__ -DF_CPU=80000000L -DARDUINO=10605 -DARDUINO_ESP8266_ESP01 -DARDUINO_ARCH_ESP8266 -DESP8266
  82. C_INCLUDES = $(foreach dir,$(INCLUDE_DIRS) $(USER_DIRS),-I$(dir))
  83. C_FLAGS ?= -c -Os -g -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
  84. CPP_FLAGS ?= -c -Os -g -mlongcalls -mtext-section-literals -fno-exceptions -fno-rtti -falign-functions=4 -std=c++11 -MMD -ffunction-sections -fdata-sections
  85. S_FLAGS ?= -c -g -x assembler-with-cpp -MMD
  86. LD_FLAGS ?= -g -w -Os -nostdlib -Wl,--no-check-sections -u call_user_start -Wl,-static -L$(SDK_ROOT)/lib -L$(SDK_ROOT)/ld -T$(FLASH_LAYOUT) -Wl,--gc-sections -Wl,-wrap,system_restart_local -Wl,-wrap,register_chipv6_phy
  87. LD_STD_LIBS ?= -lm -lgcc -lhal -lphy -lnet80211 -llwip -lwpa -lmain -lpp -lsmartconfig -lwps -lcrypto -laxtls
  88. # stdc++ used in later versions of esp8266 Arduino
  89. LD_STD_CPP = lstdc++
  90. ifneq ($(shell grep $(LD_STD_CPP) $(ESP_ROOT)/platform.txt),)
  91. LD_STD_LIBS += -$(LD_STD_CPP)
  92. endif
  93. # Core source files
  94. CORE_DIR = $(ESP_ROOT)/cores/esp8266
  95. CORE_SRC = $(shell find $(CORE_DIR) -name "*.S" -o -name "*.c" -o -name "*.cpp")
  96. CORE_OBJ = $(patsubst %,$(OBJ_DIR)/%$(OBJ_EXT),$(notdir $(CORE_SRC)))
  97. CORE_LIB = $(OBJ_DIR)/core.ar
  98. # User defined compilation units
  99. USER_SRC = $(SKETCH) $(shell find $(LIBS) -name "*.S" -o -name "*.c" -o -name "*.cpp")
  100. # Object file suffix seems to be significant for the linker...
  101. USER_OBJ = $(subst .ino,.cpp,$(patsubst %,$(OBJ_DIR)/%$(OBJ_EXT),$(notdir $(USER_SRC))))
  102. USER_DIRS = $(sort $(dir $(USER_SRC)))
  103. VPATH += $(shell find $(CORE_DIR) -type d) $(USER_DIRS)
  104. # Automatically generated build information data
  105. # Makes the build date and git descriptions at the actual build
  106. # event available as string constants in the program
  107. BUILD_INFO_H = $(OBJ_DIR)/buildinfo.h
  108. BUILD_INFO_CPP = $(OBJ_DIR)/buildinfo.cpp
  109. BUILD_INFO_OBJ = $(BUILD_INFO_CPP)$(OBJ_EXT)
  110. $(BUILD_INFO_H): | $(OBJ_DIR)
  111. echo "typedef struct { const char *date, *time, *src_version, *env_version;} _tBuildInfo; extern _tBuildInfo _BuildInfo;" >$@
  112. # Utility functions
  113. git_description = $(shell git -C $(1) describe --tags --always --dirty 2>/dev/null)
  114. time_string = $(shell perl -e 'use POSIX qw(strftime); print strftime($(1), localtime());')
  115. MEM_USAGE = \
  116. 'while (<>) { \
  117. $$r += $$1 if /^\.(?:data|rodata|bss)\s+(\d+)/;\
  118. $$f += $$1 if /^\.(?:irom0\.text|text|data|rodata)\s+(\d+)/;\
  119. }\
  120. print "\nMemory usage\n";\
  121. print sprintf(" %-6s %6d bytes\n" x 2 ."\n", "Ram:", $$r, "Flash:", $$f);'
  122. # Build rules
  123. $(OBJ_DIR)/%.cpp$(OBJ_EXT): %.cpp $(BUILD_INFO_H)
  124. echo $(<F)
  125. $(CPP) $(C_DEFINES) $(C_INCLUDES) $(CPP_FLAGS) $< -o $@
  126. $(OBJ_DIR)/%.cpp$(OBJ_EXT): %.ino $(BUILD_INFO_H)
  127. echo $(<F)
  128. $(CPP) -x c++ -include $(CORE_DIR)/Arduino.h $(C_DEFINES) $(C_INCLUDES) $(CPP_FLAGS) $< -o $@
  129. $(OBJ_DIR)/%.c$(OBJ_EXT): %.c
  130. echo $(<F)
  131. $(CC) $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) $< -o $@
  132. $(OBJ_DIR)/%.S$(OBJ_EXT): %.S
  133. echo $(<F)
  134. $(CC) $(C_DEFINES) $(C_INCLUDES) $(S_FLAGS) $< -o $@
  135. $(CORE_LIB): $(CORE_OBJ)
  136. echo Creating core archive
  137. rm -f $@
  138. $(AR) cru $@ $^
  139. BUILD_DATE = $(call time_string,"%Y-%m-%d")
  140. BUILD_TIME = $(call time_string,"%H:%M:%S")
  141. $(MAIN_EXE): $(CORE_LIB) $(USER_OBJ)
  142. echo Linking $(MAIN_EXE)
  143. echo " Versions: $(SRC_GIT_VERSION), $(ESP_GIT_VERSION)"
  144. echo '#include <buildinfo.h>' >$(BUILD_INFO_CPP)
  145. echo '_tBuildInfo _BuildInfo = {"$(BUILD_DATE)","$(BUILD_TIME)","$(SRC_GIT_VERSION)","$(ESP_GIT_VERSION)"};' >>$(BUILD_INFO_CPP)
  146. $(CPP) $(C_DEFINES) $(C_INCLUDES) $(CPP_FLAGS) $(BUILD_INFO_CPP) -o $(BUILD_INFO_OBJ)
  147. $(LD) $(LD_FLAGS) -Wl,--start-group $^ $(BUILD_INFO_OBJ) $(LD_STD_LIBS) -Wl,--end-group -L$(OBJ_DIR) -o $(MAIN_ELF)
  148. $(ESP_TOOL) -eo $(ESP_ROOT)/bootloaders/eboot/eboot.elf -bo $@ -bm $(FLASH_MODE) -bf $(FLASH_SPEED) -bz $(FLASH_SIZE) -bs .text -bp 4096 -ec -eo $(MAIN_ELF) -bs .irom0.text -bs .text -bs .data -bs .rodata -bc -ec
  149. $(TOOLS_BIN)/xtensa-lx106-elf-size -A $(MAIN_ELF) | perl -e $(MEM_USAGE)
  150. perl -e 'print "Build complete. Elapsed time: ", time()-$(START_TIME), " seconds\n\n"'
  151. upload: all
  152. #$(ESP_TOOL) -v -cd nodemcu -cb $(UPLOAD_SPEED) -cp $(UPLOAD_PORT) -ca 0x00000 -cf $(MAIN_EXE)
  153. $(ESP_TOOL) -v -cd ck -cb $(UPLOAD_SPEED) -cp $(UPLOAD_PORT) -ca 0x00000 -cf $(MAIN_EXE)
  154. ota: all
  155. $(OTA_TOOL) -i $(ESP_ADDR) -p $(ESP_PORT) -a $(ESP_PWD) -f $(MAIN_EXE)
  156. http: all
  157. $(HTTP_TOOL) --verbose -F image=@$(MAIN_EXE) --user $(HTTP_USR):$(HTTP_PWD) http://$(HTTP_ADDR)$(HTTP_URI)
  158. echo "\n"
  159. clean:
  160. echo Removing all intermediate build files...
  161. rm -f $(OBJ_DIR)/*
  162. $(OBJ_DIR):
  163. mkdir -p $(OBJ_DIR)
  164. .PHONY: all
  165. all: $(OBJ_DIR) $(BUILD_INFO_H) $(MAIN_EXE)
  166. # Include all available dependencies
  167. -include $(wildcard $(OBJ_DIR)/*$(DEP_EXT))
  168. .DEFAULT_GOAL = all
  169. ifndef VERBOSE
  170. # Set silent mode as default
  171. MAKEFLAGS += --silent
  172. endif