include build/config.mak # Disable default Make rules .SUFFIXES: object_for = $(addprefix $(BUILD_DIR)/,$(addsuffix .o,$(basename $(1)))) # Define the default recipe default: # Define a standard rule helper # If passed a last parameter value of with_local_version, we also define an # extra rule that can build source files within the $(BUILD_DIR). This is useful # for rules that can be applied for intermediate objects (for example, when # going .png -> .cpp -> .o). define rule_label @ echo "$(shell printf "%-8s" $(strip $(1)))$(@:$(BUILD_DIR)/%=%)" endef define rule_for ifeq ($(strip $(5)),with_local_version) $(addprefix $$(BUILD_DIR)/,$(strip $(2))): $(addprefix $$(BUILD_DIR)/,$(strip $(3))) @ echo "$(shell printf "%-8s" $(strip $(1)))$$(@:$$(BUILD_DIR)/%=%)" $(Q) $(4) endif $(addprefix $$(BUILD_DIR)/,$(strip $(2))): $(strip $(3)) | $$$$(@D)/. @ echo "$(shell printf "%-8s" $(strip $(1)))$$(@:$$(BUILD_DIR)/%=%)" $(Q) $(4) endef .PHONY: info info: @echo "========= Building Flags =========" @echo "EPSILON_VERSION = $(EPSILON_VERSION)" @echo "EPSILON_APPS = $(EPSILON_APPS)" @echo "EPSILON_I18N = $(EPSILON_I18N)" @echo "PLATFORM" = $(PLATFORM) @echo "DEBUG" = $(DEBUG) @echo "EPSILON_GETOPT" = $(EPSILON_GETOPT) @echo "ESCHER_LOG_EVENTS_BINARY" = $(ESCHER_LOG_EVENTS_BINARY) @echo "QUIZ_USE_CONSOLE" = $(QUIZ_USE_CONSOLE) @echo "ION_STORAGE_LOG" = $(ION_STORAGE_LOG) @echo "POINCARE_TREE_LOG" = $(POINCARE_TREE_LOG) @echo "POINCARE_TESTS_PRINT_EXPRESSIONS" = $(POINCARE_TESTS_PRINT_EXPRESSIONS) @echo "==================================" @echo "" @echo "============= Targets ============" @echo "--------- Cross-platforms --------" @echo "epsilon" @echo "epsilon.on-boarding" @echo "epsilon.on-boarding.update" @echo "epsilon.on-boarding.beta" @echo "test" @echo "PHONY:" @echo " clean" @echo " clean_for_apps_selection (use this 'light' clean before changing the flag EPSILON_APPS)" @echo "----------------------------------" @echo "" @echo "------------- Device -------------" @echo "flasher.light" @echo "flasher.verbose" @echo "bench.ram" @echo "bench.flash" @echo "PHONY:" @echo " binpack" @echo " %_two_binaries" @echo " %_size" @echo " %_run" @echo " %_memory_map" @echo " %_flash" @echo " clean_for_apps_selection (use this 'light' clean before changing the flag EPSILON_APPS)" @echo ".............N0110................" @echo "test.external_flash.write" @echo "test.external_flash.read" @echo ".................................." @echo "----------------------------------" @echo "" @echo "----------- emscripten -----------" @echo "simulator.zip" @echo "----------------------------------" @echo "" @echo "----------- blackbox -------------" @echo "compare" @echo "PHONY:" @echo " tests/%.run" @echo " tests/%.render" @echo " integration_tests" @echo " epsilon_fuzz" @echo " compare_fuzz" @echo "----------------------------------" @echo "" @echo "==================================" # Since we're building out-of-tree, we need to make sure the output directories # are created, otherwise the receipes will fail (e.g. gcc will fail to create # "output/foo/bar.o" because the directory "output/foo" doesn't exist). # We need to mark those directories as precious, otherwise Make will try to get # rid of them upon completion (and fail, since those folders won't be empty). .PRECIOUS: $(BUILD_DIR)/. $(BUILD_DIR)%/. $(BUILD_DIR)/.: $(Q) mkdir -p $(dir $@) $(BUILD_DIR)%/.: $(Q) mkdir -p $(dir $@) # To make objects dependent on their directory, we need a second expansion .SECONDEXPANSION: # Each sub-Makefile can either add sources to $(%_src) variables or define a # new executable target. The $(%_src) variables list the sources that can be # built and linked to executables being generated. ifeq ($(USE_LIBA),0) include liba/Makefile.bridge else SFLAGS += -ffreestanding -nostdinc -nostdlib include liba/Makefile include libaxx/Makefile endif include ion/Makefile include kandinsky/Makefile include poincare/Makefile include python/Makefile include escher/Makefile # Executable Makefiles include apps/Makefile include build/struct_layout/Makefile include build/scenario/Makefile include quiz/Makefile # Quiz needs to be included at the end all_src = $(app_src) $(escher_src) $(ion_src) $(kandinsky_src) $(liba_src) $(libaxx_src) $(poincare_src) $(python_src) $(ion_device_dfu_relocated_src) $(ion_device_dfu_xip) $(epsilon_src) $(runner_src) $(flasher_src) $(bench_src) $(tests_src) all_objs = $(call object_for,$(all_src)) .SECONDARY: $(all_objs) # Load source-based dependencies # Compilers can generate Makefiles that states the dependencies of a given # objet to other source and headers. This serve no purpose for a clean build, # but allows correct yet optimal incremental builds. -include $(all_objs:.o=.d) # Define main and shortcut targets include build/targets.mak # Fill in the default recipe DEFAULT ?= $(BUILD_DIR)/epsilon.$(EXE) default: $(DEFAULT) # Load standard build rules include build/rules.mk .PHONY: clean clean: @echo "CLEAN" $(Q) rm -rf $(BUILD_DIR) .PHONY: cowsay_% cowsay_%: @echo " -------" @echo "| $(*F) |" @echo " -------" @echo " \\ ^__^" @echo " \\ (oo)\\_______" @echo " (__)\\ )\\/\\" @echo " ||----w |" @echo " || ||" .PHONY: clena clena: cowsay_CLENA clean