1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-04-19 23:22:16 +03:00

emulation on host: makefile rework (#7738)

Rework emualtion on host's Makefile: Avoid to spread object files everywhere by generating them into a single directory
* everything is now in bin/ or bin32/ directories, coverage in lcov/
* optional running exec with valgrind + gdb
This commit is contained in:
david gauchard 2020-12-02 10:01:56 +01:00 committed by GitHub
parent 8565ac8fbc
commit 2c178235c2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 199 additions and 174 deletions

View File

@ -1,13 +1,14 @@
BINDIR := bin CORE_PATH := $(abspath ../../cores/esp8266)
LCOV_DIRECTORY := lcov LIBRARIES_PATH := $(abspath ../../libraries)
OUTPUT_BINARY := $(BINDIR)/host_tests common = common
CORE_PATH := ../../cores/esp8266 HOST_COMMON_ABSPATH := $(abspath $(common))
LIBRARIES_PATH := ../../libraries
FORCE32 ?= 1 FORCE32 ?= 1
OPTZ ?= -Os OPTZ ?= -Os
V ?= 0 V ?= 0
R ?= noexec R ?= noexec
TERM ?= xterm
DEFSYM_FS ?= -Wl,--defsym,_FS_start=0x40300000 -Wl,--defsym,_FS_end=0x411FA000 -Wl,--defsym,_FS_page=0x100 -Wl,--defsym,_FS_block=0x2000 -Wl,--defsym,_EEPROM_start=0x411fb000 DEFSYM_FS ?= -Wl,--defsym,_FS_start=0x40300000 -Wl,--defsym,_FS_end=0x411FA000 -Wl,--defsym,_FS_page=0x100 -Wl,--defsym,_FS_block=0x2000 -Wl,--defsym,_EEPROM_start=0x411fb000
RANLIB ?= ranlib
MAKEFILE = $(word 1, $(MAKEFILE_LIST)) MAKEFILE = $(word 1, $(MAKEFILE_LIST))
@ -33,7 +34,7 @@ CXX ?= g++
endif endif
GCOV ?= gcov GCOV ?= gcov
VALGRIND ?= valgrind VALGRIND ?= valgrind
LCOV ?= lcov LCOV ?= lcov --gcov-tool $(GCOV)
GENHTML ?= genhtml GENHTML ?= genhtml
ifeq ($(FORCE32),1) ifeq ($(FORCE32),1)
@ -43,15 +44,18 @@ $(warning Cannot compile in 32 bit mode (g++-multilib is missing?), switching to
else else
N32 = 32 N32 = 32
M32 = -m32 M32 = -m32
E32 = .32
endif endif
endif endif
ifeq ($(N32),32) ifeq ($(N32),32)
$(warning compiling in 32 bits mode) $(warning compiling in 32 bits mode)
BINDIR := $(abspath bin32)
else else
$(warning compiling in native mode) $(warning compiling in native mode)
BINDIR := $(abspath bin)
endif endif
OUTPUT_BINARY := $(BINDIR)/host_tests
LCOV_DIRECTORY := $(BINDIR)/../lcov
ifeq ($(V), 0) ifeq ($(V), 0)
VERBC = @echo "C $@"; VERBC = @echo "C $@";
@ -67,29 +71,30 @@ endif
$(shell mkdir -p $(BINDIR)) $(shell mkdir -p $(BINDIR))
CORE_CPP_FILES := $(addprefix $(CORE_PATH)/,\ CORE_CPP_FILES := \
StreamString.cpp \ $(addprefix $(abspath $(CORE_PATH))/,\
Stream.cpp \ StreamString.cpp \
WString.cpp \ Stream.cpp \
Print.cpp \ WString.cpp \
FS.cpp \ Print.cpp \
spiffs_api.cpp \ FS.cpp \
MD5Builder.cpp \ spiffs_api.cpp \
../../libraries/LittleFS/src/LittleFS.cpp \ MD5Builder.cpp \
core_esp8266_noniso.cpp \ ../../libraries/LittleFS/src/LittleFS.cpp \
spiffs/spiffs_cache.cpp \ core_esp8266_noniso.cpp \
spiffs/spiffs_check.cpp \ spiffs/spiffs_cache.cpp \
spiffs/spiffs_gc.cpp \ spiffs/spiffs_check.cpp \
spiffs/spiffs_hydrogen.cpp \ spiffs/spiffs_gc.cpp \
spiffs/spiffs_nucleus.cpp \ spiffs/spiffs_hydrogen.cpp \
libb64/cencode.cpp \ spiffs/spiffs_nucleus.cpp \
libb64/cdecode.cpp \ libb64/cencode.cpp \
Schedule.cpp \ libb64/cdecode.cpp \
HardwareSerial.cpp \ Schedule.cpp \
crc32.cpp \ HardwareSerial.cpp \
Updater.cpp \ crc32.cpp \
Updater.cpp \
) \ ) \
$(addprefix $(LIBRARIES_PATH)/ESP8266SdFat/src/, \ $(addprefix $(abspath $(LIBRARIES_PATH)/ESP8266SdFat/src)/, \
FatLib/FatFile.cpp \ FatLib/FatFile.cpp \
FatLib/FatFileLFN.cpp \ FatLib/FatFileLFN.cpp \
FatLib/FatFilePrint.cpp \ FatLib/FatFilePrint.cpp \
@ -98,56 +103,63 @@ CORE_CPP_FILES := $(addprefix $(CORE_PATH)/,\
FatLib/FmtNumber.cpp \ FatLib/FmtNumber.cpp \
FatLib/StdioStream.cpp \ FatLib/StdioStream.cpp \
) \ ) \
$(LIBRARIES_PATH)/SDFS/src/SDFS.cpp \ $(abspath $(LIBRARIES_PATH)/SDFS/src/SDFS.cpp) \
$(LIBRARIES_PATH)/SD/src/SD.cpp $(abspath $(LIBRARIES_PATH)/SD/src/SD.cpp) \
CORE_C_FILES := $(addprefix $(CORE_PATH)/,\ CORE_C_FILES := \
../../libraries/LittleFS/src/lfs.c \ $(addprefix $(abspath $(CORE_PATH))/,\
../../libraries/LittleFS/src/lfs_util.c \ ../../libraries/LittleFS/src/lfs.c \
) ../../libraries/LittleFS/src/lfs_util.c \
)
MOCK_CPP_FILES_COMMON := $(addprefix common/,\ MOCK_CPP_FILES_COMMON := \
Arduino.cpp \ $(addprefix $(abspath $(HOST_COMMON_ABSPATH))/,\
flash_hal_mock.cpp \ Arduino.cpp \
spiffs_mock.cpp \ flash_hal_mock.cpp \
littlefs_mock.cpp \ spiffs_mock.cpp \
sdfs_mock.cpp \ littlefs_mock.cpp \
WMath.cpp \ sdfs_mock.cpp \
MockUART.cpp \ WMath.cpp \
MockTools.cpp \ MockUART.cpp \
MocklwIP.cpp \ MockTools.cpp \
MockDigital.cpp \ MocklwIP.cpp \
) MockDigital.cpp \
)
MOCK_CPP_FILES := $(MOCK_CPP_FILES_COMMON) $(addprefix common/,\ MOCK_CPP_FILES := $(MOCK_CPP_FILES_COMMON) \
ArduinoCatch.cpp \ $(addprefix $(HOST_COMMON_ABSPATH)/,\
) ArduinoCatch.cpp \
)
MOCK_CPP_FILES_EMU := $(MOCK_CPP_FILES_COMMON) $(addprefix common/,\ MOCK_CPP_FILES_EMU := $(MOCK_CPP_FILES_COMMON) \
ArduinoMain.cpp \ $(addprefix $(HOST_COMMON_ABSPATH)/,\
ArduinoMainUdp.cpp \ ArduinoMain.cpp \
ArduinoMainSpiffs.cpp \ ArduinoMainUdp.cpp \
ArduinoMainLittlefs.cpp \ ArduinoMainSpiffs.cpp \
user_interface.cpp \ ArduinoMainLittlefs.cpp \
) user_interface.cpp \
)
MOCK_C_FILES := $(addprefix common/,\ MOCK_C_FILES := \
md5.c \ $(addprefix $(HOST_COMMON_ABSPATH)/,\
noniso.c \ md5.c \
) noniso.c \
)
INC_PATHS += $(addprefix -I, \ INC_PATHS += \
. \ $(addprefix -I, \
common \ . \
$(CORE_PATH) \ $(common) \
) $(CORE_PATH) \
)
INC_PATHS += $(addprefix -I,\ INC_PATHS += \
$(shell echo ../../libraries/*/src) \ $(addprefix -I,\
$(shell echo ../../libraries/*) \ $(shell echo ../../libraries/*/src) \
../../tools/sdk/include \ $(shell echo ../../libraries/*) \
../../tools/sdk/lwip2/include \ ../../tools/sdk/include \
) ../../tools/sdk/lwip2/include \
)
TEST_CPP_FILES := \ TEST_CPP_FILES := \
fs/test_fs.cpp \ fs/test_fs.cpp \
@ -159,8 +171,8 @@ TEST_CPP_FILES := \
core/test_Updater.cpp core/test_Updater.cpp
PREINCLUDES := \ PREINCLUDES := \
-include common/mock.h \ -include $(common)/mock.h \
-include common/c_types.h \ -include $(common)/c_types.h \
ifneq ($(D),) ifneq ($(D),)
OPTZ=-O0 OPTZ=-O0
@ -180,7 +192,7 @@ FLAGS += -Wimplicit-fallthrough=2 # allow "// fall through" comments to stop spu
FLAGS += $(USERCFLAGS) FLAGS += $(USERCFLAGS)
CXXFLAGS += -fno-rtti $(FLAGS) -funsigned-char CXXFLAGS += -fno-rtti $(FLAGS) -funsigned-char
CFLAGS += $(FLAGS) -funsigned-char CFLAGS += $(FLAGS) -funsigned-char
LDFLAGS += -coverage $(OPTZ) -g $(M32) LDFLAGS += $(OPTZ) -g $(M32)
LDFLAGS += $(USERLDFLAGS) LDFLAGS += $(USERLDFLAGS)
VALGRINDFLAGS += --leak-check=full --track-origins=yes --error-limit=no --show-leak-kinds=all --error-exitcode=999 VALGRINDFLAGS += --leak-check=full --track-origins=yes --error-limit=no --show-leak-kinds=all --error-exitcode=999
CXXFLAGS += -Wno-error=format-security # cores/esp8266/Print.cpp:42:24: error: format not a string literal and no format arguments [-Werror=format-security] -- (os_printf_plus(not_the_best_way)) CXXFLAGS += -Wno-error=format-security # cores/esp8266/Print.cpp:42:24: error: format not a string literal and no format arguments [-Werror=format-security] -- (os_printf_plus(not_the_best_way))
@ -190,48 +202,50 @@ remduplicates = $(strip $(if $1,$(firstword $1) $(call remduplicates,$(filter-ou
C_SOURCE_FILES = $(MOCK_C_FILES) $(CORE_C_FILES) C_SOURCE_FILES = $(MOCK_C_FILES) $(CORE_C_FILES)
CPP_SOURCE_FILES = $(MOCK_CPP_FILES) $(CORE_CPP_FILES) $(TEST_CPP_FILES) CPP_SOURCE_FILES = $(MOCK_CPP_FILES) $(CORE_CPP_FILES) $(TEST_CPP_FILES)
C_OBJECTS = $(C_SOURCE_FILES:.c=.c$(E32).o) C_OBJECTS = $(C_SOURCE_FILES:.c=.c.o)
CPP_OBJECTS_CORE = $(MOCK_CPP_FILES:.cpp=.cpp$(E32).o) $(CORE_CPP_FILES:.cpp=.cpp$(E32).o) CPP_OBJECTS_CORE = $(MOCK_CPP_FILES:.cpp=.cpp.o) $(CORE_CPP_FILES:.cpp=.cpp.o)
CPP_OBJECTS_TESTS = $(TEST_CPP_FILES:.cpp=.cpp$(E32).o) CPP_OBJECTS_TESTS = $(TEST_CPP_FILES:.cpp=.cpp.o)
CPP_OBJECTS = $(CPP_OBJECTS_CORE) $(CPP_OBJECTS_TESTS) CPP_OBJECTS = $(CPP_OBJECTS_CORE) $(CPP_OBJECTS_TESTS)
OBJECTS = $(C_OBJECTS) $(CPP_OBJECTS) OBJECTS = $(C_OBJECTS) $(CPP_OBJECTS)
COVERAGE_FILES = $(OBJECTS:.o=.gc*) COVERAGE_FILES = $(OBJECTS:.o=.gc*)
.PHONY: all
all: help all: help
.PHONY: CI
CI: # run CI CI: # run CI
$(MAKE) -f $(MAKEFILE) MKFLAGS="-Werror -coverage" FORCE32=0 OPTZ=-O0 doCI $(MAKE) -f $(MAKEFILE) MKFLAGS="-Werror --coverage" LDFLAGS="--coverage" FORCE32=0 OPTZ=-O0 doCI
.PHONY: doCI
doCI: build-info $(OUTPUT_BINARY) valgrind test gcov doCI: build-info $(OUTPUT_BINARY) valgrind test gcov
test: $(OUTPUT_BINARY) # run host test for CI test: $(OUTPUT_BINARY) # run host test for CI
$(OUTPUT_BINARY) $(OUTPUT_BINARY)
clean: .PHONY: clean
make FORCE32=0 cleanarch; make FORCE32=1 cleanarch clean: clean-objects
rm -rf $(LCOV)
cleanarch: clean-objects clean-coverage # clean everything
rm -rf $(BINDIR)
.PHONY: clean-objects
clean-objects: clean-objects:
rm -rf $(C_OBJECTS) $(CPP_OBJECTS_CORE) $(CPP_OBJECTS_CORE_EMU) $(CPP_OBJECTS_TESTS) rm -rf bin bin32
clean-coverage:
rm -rf $(COVERAGE_FILES) $(LCOV_DIRECTORY) *.gcov
.PHONY: test
gcov: test # run coverage for CI gcov: test # run coverage for CI
find $(CORE_PATH) -name "*.gcno" -exec $(GCOV) -r -pb {} + ( mkdir -p $(BINDIR)/gcov; cd $(BINDIR)/gcov; find . -name "*.gcno" -exec $(GCOV) -s ../.. -r -pb {} + )
.PHONY: valgrind
valgrind: $(OUTPUT_BINARY) valgrind: $(OUTPUT_BINARY)
mkdir -p $(LCOV_DIRECTORY) mkdir -p $(LCOV_DIRECTORY)
$(LCOV) --directory ../../cores/esp8266/ --zerocounters $(LCOV) --directory $(BINDIR) --zerocounters
$(VALGRIND) $(VALGRINDFLAGS) $(OUTPUT_BINARY) ( cd $(LCOV_DIRECTORY); $(VALGRIND) $(VALGRINDFLAGS) $(OUTPUT_BINARY) )
$(LCOV) --directory $(CORE_PATH) --capture --output-file $(LCOV_DIRECTORY)/app.info $(LCOV) --directory $(BINDIR) --capture --output-file $(LCOV_DIRECTORY)/app.info
-$(GENHTML) $(LCOV_DIRECTORY)/app.info -o $(LCOV_DIRECTORY) -$(GENHTML) $(LCOV_DIRECTORY)/app.info -o $(LCOV_DIRECTORY)
.PHONY: build-info
build-info: # show toolchain version build-info: # show toolchain version
@echo "-------- build tools info --------" @echo "-------- build tools info --------"
@echo "CC: " $(CC) @echo "CC: " $(CC)
@ -242,22 +256,33 @@ build-info: # show toolchain version
@echo "CXXFLAGS: " $(CXXFLAGS) @echo "CXXFLAGS: " $(CXXFLAGS)
@echo "----------------------------------" @echo "----------------------------------"
-include $(BINDIR)/.*.d include $(shell find $(BINDIR) -name "*.d" -print)
.SUFFIXES: .SUFFIXES:
.PRECIOUS: %.c$(E32).o .PRECIOUS: %.c.o
%.c$(E32).o: %.c
$(VERBC) $(CC) $(PREINCLUDES) $(CFLAGS) $(INC_PATHS) -MD -MF $(BINDIR)/.$(notdir $<).d -c -o $@ $<
.PRECIOUS: %.cpp$(E32).o $(BINDIR)/%.c.o: %.c
%.cpp$(E32).o: %.cpp @mkdir -p $(dir $@)
$(VERBCXX) $(CXX) $(PREINCLUDES) $(CXXFLAGS) $(INC_PATHS) -MD -MF $(BINDIR)/.$(notdir $<).d -c -o $@ $< $(VERBC) $(CC) $(PREINCLUDES) $(CFLAGS) $(INC_PATHS) -MD -MF $@.d -c -o $@ $<
$(BINDIR)/core.a: $(C_OBJECTS) $(CPP_OBJECTS_CORE) %.c.o: %.c
ar -rcu $@ $^ $(VERBC) $(CC) $(PREINCLUDES) $(CFLAGS) $(INC_PATHS) -MD -MF $@.d -c -o $@ $<
ranlib $@
$(OUTPUT_BINARY): $(CPP_OBJECTS_TESTS) $(BINDIR)/core.a .PRECIOUS: %.cpp.o
$(BINDIR)/%.cpp.o: %.cpp
@mkdir -p $(dir $@)
$(VERBCXX) $(CXX) $(PREINCLUDES) $(CXXFLAGS) $(INC_PATHS) -MD -MF $@.d -c -o $@ $<
%.cpp.o: %.cpp
$(VERBCXX) $(CXX) $(PREINCLUDES) $(CXXFLAGS) $(INC_PATHS) -MD -MF $@.d -c -o $@ $<
$(BINDIR)/core.a: $(C_OBJECTS:%=$(BINDIR)/%) $(CPP_OBJECTS_CORE:%=$(BINDIR)/%)
$(AR) rc $@ $^
$(RANLIB) $@
$(OUTPUT_BINARY): $(CPP_OBJECTS_TESTS:%=$(BINDIR)/%) $(BINDIR)/core.a
$(VERBLD) $(CXX) $(DEFSYM_FS) $(LDFLAGS) $^ -o $@ $(VERBLD) $(CXX) $(DEFSYM_FS) $(LDFLAGS) $^ -o $@
################################################# #################################################
@ -270,7 +295,7 @@ ARDUINO_LIBS := \
base64.cpp \ base64.cpp \
LwipIntfCB.cpp \ LwipIntfCB.cpp \
) \ ) \
$(addprefix ../../libraries/ESP8266WiFi/src/,\ $(addprefix $(abspath ../../libraries/ESP8266WiFi/src)/,\
ESP8266WiFi.cpp \ ESP8266WiFi.cpp \
ESP8266WiFiAP.cpp \ ESP8266WiFiAP.cpp \
ESP8266WiFiGeneric.cpp \ ESP8266WiFiGeneric.cpp \
@ -286,42 +311,44 @@ ARDUINO_LIBS := \
CertStoreBearSSL.cpp \ CertStoreBearSSL.cpp \
) )
OPT_ARDUINO_LIBS ?= $(addprefix ../../libraries/,\ OPT_ARDUINO_LIBS ?= \
$(addprefix ESP8266WebServer/src/,\ $(addprefix $(abspath ../../libraries)/,\
detail/mimetable.cpp \ $(addprefix ESP8266WebServer/src/,\
) \ detail/mimetable.cpp \
$(addprefix ESP8266mDNS/src/,\ ) \
LEAmDNS.cpp \ $(addprefix ESP8266mDNS/src/,\
LEAmDNS_Control.cpp \ LEAmDNS.cpp \
LEAmDNS_Helpers.cpp \ LEAmDNS_Control.cpp \
LEAmDNS_Structs.cpp \ LEAmDNS_Helpers.cpp \
LEAmDNS_Transfer.cpp \ LEAmDNS_Structs.cpp \
ESP8266mDNS.cpp \ LEAmDNS_Transfer.cpp \
LEAmDNS2Host.cpp \ ESP8266mDNS.cpp \
LEAmDNS2Host_Control.cpp \ LEAmDNS2Host.cpp \
LEAmDNS2Host_Debug.cpp \ LEAmDNS2Host_Control.cpp \
LEAmDNS2Host_Structs.cpp \ LEAmDNS2Host_Debug.cpp \
LEAmDNS2Host_Transfer.cpp \ LEAmDNS2Host_Structs.cpp \
LEAmDNS2_Backbone.cpp \ LEAmDNS2Host_Transfer.cpp \
) \ LEAmDNS2_Backbone.cpp \
ArduinoOTA/ArduinoOTA.cpp \ ) \
DNSServer/src/DNSServer.cpp \ ArduinoOTA/ArduinoOTA.cpp \
ESP8266AVRISP/src/ESP8266AVRISP.cpp \ DNSServer/src/DNSServer.cpp \
ESP8266HTTPClient/src/ESP8266HTTPClient.cpp \ ESP8266AVRISP/src/ESP8266AVRISP.cpp \
) ESP8266HTTPClient/src/ESP8266HTTPClient.cpp \
)
MOCK_ARDUINO_LIBS := $(addprefix common/,\ MOCK_ARDUINO_LIBS := \
ClientContextSocket.cpp \ $(addprefix $(HOST_COMMON_ABSPATH)/,\
ClientContextTools.cpp \ ClientContextSocket.cpp \
MockWiFiServerSocket.cpp \ ClientContextTools.cpp \
MockWiFiServer.cpp \ MockWiFiServerSocket.cpp \
UdpContextSocket.cpp \ MockWiFiServer.cpp \
HostWiring.cpp \ UdpContextSocket.cpp \
MockEsp.cpp \ HostWiring.cpp \
MockEEPROM.cpp \ MockEsp.cpp \
MockSPI.cpp \ MockEEPROM.cpp \
strl.cpp \ MockSPI.cpp \
) strl.cpp \
)
CPP_SOURCES_CORE_EMU = \ CPP_SOURCES_CORE_EMU = \
$(MOCK_CPP_FILES_EMU) \ $(MOCK_CPP_FILES_EMU) \
@ -344,48 +371,43 @@ USERLIBDIRS = $(shell test -z "$(ULIBPATHS)" || for d in $(ULIBPATHS); do for dd
USERLIBSRCS = $(shell test -z "$(ULIBPATHS)" || for d in $(ULIBPATHS); do for ss in $$d/*.cpp $$d/src/*.cpp $$d/src/libmad/*.c; do test -r $$ss && echo $$ss; done; done) USERLIBSRCS = $(shell test -z "$(ULIBPATHS)" || for d in $(ULIBPATHS); do for ss in $$d/*.cpp $$d/src/*.cpp $$d/src/libmad/*.c; do test -r $$ss && echo $$ss; done; done)
INC_PATHS += $(USERLIBDIRS) INC_PATHS += $(USERLIBDIRS)
INC_PATHS += -I$(INODIR)/.. INC_PATHS += -I$(INODIR)/..
CPP_OBJECTS_CORE_EMU = $(CPP_SOURCES_CORE_EMU:.cpp=.cpp$(E32).o) $(USERLIBSRCS:.cpp=.cpp$(E32).o) $(USERCXXSOURCES:.cpp=.cpp$(E32).o) CPP_OBJECTS_CORE_EMU = $(CPP_SOURCES_CORE_EMU:.cpp=.cpp.o) $(USERLIBSRCS:.cpp=.cpp.o) $(USERCXXSOURCES:.cpp=.cpp.o)
C_OBJECTS_CORE_EMU = $(USERCSOURCES:.c=.c$(E32).o) C_OBJECTS_CORE_EMU = $(USERCSOURCES:.c=.c.o)
bin/fullcore$(E32).a: $(C_OBJECTS) $(CPP_OBJECTS_CORE_EMU) $(C_OBJECTS_CORE_EMU) FULLCORE_OBJECTS = $(C_OBJECTS) $(CPP_OBJECTS_CORE_EMU) $(C_OBJECTS_CORE_EMU)
$(VERBAR) ar -rcu $@ $^ FULLCORE_OBJECTS_ISOLATED = $(FULLCORE_OBJECTS:%.o=$(BINDIR)/%.o)
$(VERBAR) ranlib $@
%: %.ino.cpp$(E32).o bin/fullcore$(E32).a $(BINDIR)/fullcore.a: $(FULLCORE_OBJECTS_ISOLATED)
$(VERBLD) $(CXX) $(LDFLAGS) $< bin/fullcore$(E32).a $(LIBSSL) -o $@ $(VERBAR) $(AR) rc $@ $^
@echo "----> $@ <----" $(VERBAR) $(RANLIB) $@
#################################################
# are we in primary make call ?
ifeq ($(INO),) ifeq ($(INO),)
%: %.ino %:
@# recursive 'make' with paths make INO=$@.ino $(BINDIR)/$(abspath $@)
$(MAKE) -f $(MAKEFILE) MKFLAGS=-Wextra INODIR=$(dir $@) INO=$(notdir $@) $(BINDIR)/$(notdir $@)/$(notdir $@) \
USERCFLAGS="$(USERCFLAGS)" \
USERCSOURCES="$(USERCSOURCES)" \
USERCXXSOURCES="$(USERCXXSOURCES)" \
USERLDFLAGS="$(USERLDFLAGS)"
test "$(R)" = noexec || $(BINDIR)/$(notdir $@)/$(notdir $@) $(R)
@# see below the new build rule with fixed output path outside from core location
#####################
# recursive call on ino target
else else
$(BINDIR)/$(INO)/$(INO).ino.cpp: %: %.ino.cpp.o $(BINDIR)/fullcore.a FORCE
@# arduino builder would come around here (.ino -> .ino.cpp) $(VERBLD) $(CXX) $(LDFLAGS) $< $(BINDIR)/fullcore.a $(LIBSSL) -o $@
@mkdir -p $(BINDIR)/$(INO); \ mkdir -p $(BINDIR)/$(lastword $(subst /, ,$@))
( \ ln -sf $@ $(BINDIR)/$(lastword $(subst /, ,$@))
echo "#include <$(INODIR)/$(INO).ino>"; \ @echo "----> $(BINDIR)/ <----"
for i in $(INODIR)/*.ino; do \ @[ "$(R)" = noexec ] && echo '(not running it, use `make R="[<options>]" ...` for valgrind+gdb)' || $(dir $(MAKEFILE))/valgdb $@ $(R)
test "$$i" = $(INODIR)/$(INO).ino || echo "#include \"$$i\""; \
done; \
) > $(BINDIR)/$(INO)/$(INO).ino.cpp
endif # recursive
#####################
FORCE:
endif
$(BINDIR)/$(abspath $(INO)).cpp: $(INO)
@# arduino builder would come around here - .ino -> .ino.cpp
@mkdir -p $(dir $@); \
( \
for i in $(dir $<)/*.ino; do \
echo "#include \"$$i\""; \
done; \
) > $@
################################################# #################################################
.PHONY: list .PHONY: list

View File

@ -42,8 +42,8 @@ run it:
Optional 'V=1' enables makefile verbosity Optional 'V=1' enables makefile verbosity
Optional 'D=1' enables core debug (same as IDE's tools menu) Optional 'D=1' enables core debug messages (same as Arduino IDE's tools/debug menu)
Optional 'OPTZ=-O2' will update gcc -O option (default is -Os, D=1 implies -O0) Optional 'OPTZ=-O2' will update gcc -O option (default is -Os, -D=1 implies -O0)
Optional 'FORCE32=0' will use native/default gcc (default is FORCE32=1 unless gcc-multilib is not detected) Optional 'FORCE32=0' will use native/default gcc (default is FORCE32=1 unless gcc-multilib is not detected)
Optional 'R="<options>"' (ex: R="-b -v") runs the executable with given options after build Optional 'R="<options>"' (ex: R="-b -v") runs the executable with given options after build

3
tests/host/valgdb Executable file
View File

@ -0,0 +1,3 @@
valgrind --vgdb=full --vgdb-error=0 "$@" & pid=$!
echo "======== TUI: ^p='^' ^n='v' ^f='>' ^b='<' ========"
xterm -e "gdb -ex \"target remote | vgdb --pid=$pid\" -ex \"tui enable\" -ex cont $1; kill -9 $pid"