diff --git a/Makefile b/Makefile index 4ed85676..b3de4834 100644 --- a/Makefile +++ b/Makefile @@ -1,140 +1,44 @@ +ALL := +CLEAN := + ifeq ($(ERL_EI_INCLUDE_DIR),) -$(error ERL_EI_INCLUDE_DIR not set. Invoke via mix) + +$(warning ERL_EI_INCLUDE_DIR not set. Invoke via mix) + +else + +$(info Building NIF.) +ALL += fbos_build_calendar_nif +CLEAN += fbos_clean_build_calendar_nif endif -# Set Erlang-specific compile and linker flags -ERL_CFLAGS ?= -I$(ERL_EI_INCLUDE_DIR) -ERL_LDFLAGS ?= -L$(ERL_EI_LIBDIR) +ifeq ($(SKIP_ARDUINO_BUILD),) -NIF_LDFLAGS += -fPIC -shared -NIF_CFLAGS ?= -fPIC -O2 -Wall +FBARDUINO_FIRMWARE_OUT_DIR := $(PWD)/_build +FBARDUINO_FIRMWARE_SRC_DIR := $(PWD)/c_src/farmbot-arduino-firmware/src +FBARDUINO_FIRMWARE_BIN_DIR := $(PWD)/priv +$(info Building Arduino Firmware.) +ALL += fbos_arduino_firmware +CLEAN += fbos_clean_arduino_firmware -ifeq ($(CROSSCOMPILE),) -ifeq ($(shell uname),Darwin) -NIF_LDFLAGS += -undefined dynamic_lookup -endif +else +$(warning SKIP_ARDUINO_BUILD is set. No arduino assets will be built.) endif -NIF=priv/build_calendar.so -ARDUINO_FW=priv/arduino-firmware.hex -FARMDUINO_FW=priv/farmduino-firmware.hex -FARMDUINO_V14_FW=priv/farmduino_k14-firmware.hex -BLINK_FW=priv/blink.hex -CLEAR_EEPROM_FW=priv/clear_eeprom.hex +.PHONY: $(ALL) $(CLEAN) all clean -ARDUINO_INSTALL_DIR ?= $(HOME)/arduino-1.8.5 -ARDUINO_BUILDER=$(ARDUINO_INSTALL_DIR)/arduino-builder +all: $(ALL) -ARDUINO_HARDWARE_DIR = $(ARDUINO_INSTALL_DIR)/hardware -ARDUINO_HARDWARE_FLAGS = -hardware $(ARDUINO_HARDWARE_DIR) +clean: $(CLEAN) -ARDUINO_TOOLS_FLAGS = -tools $(ARDUINO_INSTALL_DIR)/tools-builder \ --tools $(ARDUINO_HARDWARE_DIR)/tools/avr +fbos_arduino_firmware: + cd c_src/farmbot-arduino-firmware && make all FBARDUINO_FIRMWARE_OUT_DIR=$(PWD)/_build FBARDUINO_FIRMWARE_SRC_DIR=$(PWD)/c_src/farmbot-arduino-firmware/src FBARDUINO_FIRMWARE_BIN_DIR=$(PWD)/priv -ARDUINO_LIBS_FLAGS = -built-in-libraries $(ARDUINO_INSTALL_DIR)/libraries +fbos_clean_arduino_firmware: + cd c_src/farmbot-arduino-firmware && make clean FBARDUINO_FIRMWARE_OUT_DIR=$(PWD)/_build FBARDUINO_FIRMWARE_SRC_DIR=$(PWD)/c_src/farmbot-arduino-firmware/src FBARDUINO_FIRMWARE_BIN_DIR=$(PWD)/priv -ARDUINO_PREFS_FLAGS = -prefs=build.warn_data_percentage=75 \ - -prefs=runtime.tools.avrdude.path=$(ARDUINO_INSTALL_DIR)/hardware/tools/avr \ - -prefs=runtime.tools.avr-gcc.path=$(ARDUINO_INSTALL_DIR)/hardware/tools/avr +fbos_build_calendar_nif: + make -f c_src/build_calendar/Makefile all ERL_EI_INCLUDE_DIR=$(ERL_EI_INCLUDE_DIR) ERL_EI_LIBDIR=$(ERL_EI_LIBDIR) -ARDUINO_ARCH_FLAGS = -fqbn=arduino:avr:mega:cpu=atmega2560 -ARDUINO_SRC_INO = c_src/farmbot-arduino-firmware/src/src.ino -ARDUINO_SRC_BLINK_INO = $(ARDUINO_INSTALL_DIR)/examples/01.Basics/Blink/Blink.ino -ARDUINO_SRC_CLEAR_EEPROM_INO = $(ARDUINO_HARDWARE_DIR)/arduino/avr/libraries/EEPROM/examples/eeprom_clear/eeprom_clear.ino - -ARDUINO_BUILD_DIR = $(PWD)/_build/arduino -ARDUINO_CACHE_DIR = $(PWD)/_build/arduino-cache -ARDUINO_BUILD_DIR_FLAGS = -build-path $(ARDUINO_BUILD_DIR) -build-cache $(ARDUINO_CACHE_DIR) - -ARDUINO_BUILD_COMMON = $(ARDUINO_BUILDER) \ - $(ARDUINO_HARDWARE_FLAGS) \ - $(ARDUINO_TOOLS_FLAGS) \ - $(ARDUINO_LIBS_FLAGS) \ - $(ARDUINO_ARCH_FLAGS) \ - $(ARDUINO_PREFS_FLAGS) \ - $(ARDUINO_BUILD_DIR_FLAGS) - -ARDUINO_BUILD = $(ARDUINO_BUILD_COMMON) $(ARDUINO_SRC_INO) > /dev/null 2>&1 -BLINK_BUILD = $(ARDUINO_BUILD_COMMON) $(ARDUINO_SRC_BLINK_INO) > /dev/null 2>&1 -CLEAR_EEPROM_BUILD = $(ARDUINO_BUILD_COMMON) $(ARDUINO_SRC_CLEAR_EEPROM_INO) > /dev/null 2>&1 - -ENV_STATE_FILE=.make_state -LAST_STATE = $(shell cat $(ENV_STATE_FILE) > /dev/null 2>&1) - -ifeq ($(LAST_STATE),) -$(shell echo $(MIX_TARGET) > .make_state) -LAST_STATE="" -endif - -ifneq ($(LAST_STATE), $(MIX_TARGET)) -$(shell echo $(MIX_TARGET) > .make_state) -$(shell rm -f $(NIF)) -endif - -all: priv $(NIF) farmbot_arduino_firmware - -farmbot_arduino_firmware_build_dirs: $(ARDUINO_BUILD_DIR) $(ARDUINO_CACHE_DIR) - -$(ARDUINO_BUILD_DIR): - mkdir -p $(ARDUINO_BUILD_DIR) - -$(ARDUINO_CACHE_DIR): - mkdir -p $(ARDUINO_CACHE_DIR) - -farmbot_arduino_firmware: arduino farmduino farmduino_k14 blink clear_eeprom - -arduino: farmbot_arduino_firmware_build_dirs $(ARDUINO_FW) - -farmduino: farmbot_arduino_firmware_build_dirs $(FARMDUINO_FW) - -farmduino_k14: farmbot_arduino_firmware_build_dirs $(FARMDUINO_V14_FW) - -blink: farmbot_arduino_firmware_build_dirs $(BLINK_FW) - -clear_eeprom: farmbot_arduino_firmware_build_dirs $(CLEAR_EEPROM_FW) - -priv: - mkdir -p priv - -$(NIF): c_src/build_calendar.c - $(CC) $(ERL_CFLAGS) $(NIF_CFLAGS) $(ERL_LDFLAGS) $(NIF_LDFLAGS) -o $@ $< - -$(ARDUINO_FW): - $(info Building arduino fw) - @$(shell echo \#define RAMPS_V14 > c_src/farmbot-arduino-firmware/src/Board.h) - @rm -rf $(ARDUINO_BUILD_DIR)/* - @rm -rf $(ARDUINO_CACHE_DIR)/* - @$(ARDUINO_BUILD) - @cp $(ARDUINO_BUILD_DIR)/src.ino.hex $@ - -$(FARMDUINO_FW): - $(info Building Farmduino v10 fw) - @$(shell echo \#define FARMDUINO_V10 > c_src/farmbot-arduino-firmware/src/Board.h) - @rm -rf $(ARDUINO_BUILD_DIR)/* - @rm -rf $(ARDUINO_CACHE_DIR)/* - @$(ARDUINO_BUILD) - @cp $(ARDUINO_BUILD_DIR)/src.ino.hex $@ - -$(FARMDUINO_V14_FW): - $(info Building Farmduino v14 fw) - $(shell echo \#define FARMDUINO_V14 > c_src/farmbot-arduino-firmware/src/Board.h) - @rm -rf $(ARDUINO_BUILD_DIR)/* - @rm -rf $(ARDUINO_CACHE_DIR)/* - @$(ARDUINO_BUILD) - @cp $(ARDUINO_BUILD_DIR)/src.ino.hex $@ - -$(BLINK_FW): - $(info Building Blink) - @$(BLINK_BUILD) - @cp $(ARDUINO_BUILD_DIR)/Blink.ino.hex $@ - -$(CLEAR_EEPROM_FW): - $(info Building clear eeprom utility) - @$(CLEAR_EEPROM_BUILD) - @cp $(ARDUINO_BUILD_DIR)/eeprom_clear.ino.hex $@ - -clean: - $(RM) $(ENV_STATE_FILE) - $(RM) $(NIF) - rm -rf $(ARDUINO_BUILD_DIR) $(ARDUINO_CACHE_DIR) - rm -rf priv/*.hex +fbos_clean_build_calendar_nif: + make -f c_src/build_calendar/Makefile clean ERL_EI_INCLUDE_DIR=$(ERL_EI_INCLUDE_DIR) ERL_EI_LIBDIR=$(ERL_EI_LIBDIR) diff --git a/c_src/build_calendar/Makefile b/c_src/build_calendar/Makefile new file mode 100644 index 00000000..0ad99e16 --- /dev/null +++ b/c_src/build_calendar/Makefile @@ -0,0 +1,28 @@ +ifeq ($(ERL_EI_INCLUDE_DIR),) +$(error ERL_EI_INCLUDE_DIR not set. Invoke via mix) +endif + +# Set Erlang-specific compile and linker flags +ERL_CFLAGS ?= -I$(ERL_EI_INCLUDE_DIR) +ERL_LDFLAGS ?= -L$(ERL_EI_LIBDIR) + +NIF_LDFLAGS += -fPIC -shared +NIF_CFLAGS ?= -fPIC -O2 -Wall + +NIF=priv/build_calendar.so + +ifeq ($(CROSSCOMPILE),) +ifeq ($(shell uname),Darwin) +NIF_LDFLAGS += -undefined dynamic_lookup +endif +endif + +.PHONY: all clean + +all: $(NIF) + +$(NIF): c_src/build_calendar/build_calendar.c + $(CC) $(ERL_CFLAGS) $(NIF_CFLAGS) $(ERL_LDFLAGS) $(NIF_LDFLAGS) -o $@ $< + +clean: + $(RM) $(NIF) diff --git a/c_src/build_calendar.c b/c_src/build_calendar/build_calendar.c similarity index 100% rename from c_src/build_calendar.c rename to c_src/build_calendar/build_calendar.c diff --git a/c_src/farmbot-arduino-firmware b/c_src/farmbot-arduino-firmware index 776f1d6b..100aa67d 160000 --- a/c_src/farmbot-arduino-firmware +++ b/c_src/farmbot-arduino-firmware @@ -1 +1 @@ -Subproject commit 776f1d6bbcc7597dc054d8cedf1d082e5c138441 +Subproject commit 100aa67d2f57ff1d6bbcb024c941d10ada73dbca diff --git a/mix.exs b/mix.exs index e1ce3121..ccb38996 100644 --- a/mix.exs +++ b/mix.exs @@ -84,8 +84,8 @@ defmodule Farmbot.Mixfile do case System.get_env("ERL_EI_INCLUDE_DIR") do nil -> %{ - "ERL_EI_INCLUDE_DIR" => "#{:code.root_dir()}/usr/include", - "ERL_EI_LIBDIR" => "#{:code.root_dir()}/usr/lib", + "ERL_EI_INCLUDE_DIR" => Path.join([:code.root_dir(), "usr", "include"]), + "ERL_EI_LIBDIR" => Path.join([:code.root_dir(), "usr", "lib"]), "MIX_TARGET" => @target }