nanohub: isolate shared variant config in a separate file

Bug: 29635686
Change-Id: Iad753736ecea013ef5233d913b48140168f5443a
Signed-off-by: Alexey Polyudov <apolyudov@google.com>
diff --git a/firmware/app/app.mk b/firmware/app/app.mk
index 2ace2d2..c1cadc4 100644
--- a/firmware/app/app.mk
+++ b/firmware/app/app.mk
@@ -31,19 +31,37 @@
 PREFIX = $(CROSS_COMPILE)
 TOOLCHAIN_DIR = $(shell dirname `which $(CROSS_COMPILE)gcc`)/..
 
+# NANOHUB_DIR is relative to CWD (which is always APP Makefile dir)
+
 NANOAPP_POSTPROCESS := $(NANOHUB_DIR)/../util/nanoapp_postprocess/nanoapp_postprocess
 NANOAPP_SIGN := $(NANOHUB_DIR)/../util/nanoapp_sign/nanoapp_sign
 
-VARIANT ?= lunchbox
-PLATFORM ?= stm32
-CHIP ?= stm32f411
-CPU ?= cortexm4
+# TOP_RELPATH is ANDROID_TOP relative to NANOHUB_DIR
+TOP_RELPATH := ../../../..
+TOP_ABSPATH := $(realpath $(NANOHUB_DIR)/$(TOP_RELPATH))
 
+# for local variants there is always a path; for out-of-tree variants there may be
+# - a $(VARIANT) soft link under firmware/variant subdir, or
+# - VARIANT_PATH must be defined as ANDROID_TOP-relative variant path in APP Makefile
 VARIANT_PATH ?= device/google/contexthub/firmware/variant/$(VARIANT)
-VARIANT_PATH := $(NANOHUB_DIR)/../../../../$(VARIANT_PATH)
+
+# $(VARIANT)_conf.mk may defines VARIANT_PATH, PLATFORM, CHIP, CPU, VARIANT
+include $(TOP_ABSPATH)/device/google/contexthub/firmware/variant/$(VARIANT)/$(VARIANT)_conf.mk
+# VARIANT_PATH from conf.mk is ANDROID_TOP relative
+
+# change VARIANT_PATH to become CWD-relative
+VARIANT_PATH := $(NANOHUB_DIR)/$(TOP_RELPATH)/$(VARIANT_PATH)
 
 # all output goes here
-OUT ?= out/$(VARIANT)/app/$(BIN)
+ifndef OUT
+OUT:=out/nanohub/$(VARIANT)/app/$(BIN)
+else
+ifneq ($(filter $(TOP_ABSPATH)/out/target/product/%,$(OUT)),)
+# this looks like Android OUT env var; update it
+IMAGE_TARGET_OUT:=$(OUT)/vendor/firmware/$(BIN).napp
+OUT:=$(OUT)/nanohub/$(VARIANT)/app/$(BIN)
+endif
+endif
 
 ################################################################################
 #
@@ -174,13 +192,18 @@
 NANOHUB_KEY_PATH := $(NANOHUB_DIR)/os/platform/$(PLATFORM)/misc
 
 
-.PHONY: all
-all: $(OUT)/$(BIN).S $(OUT)/$(BIN).napp
+.PHONY: all clean sync
+all: $(OUT)/$(BIN).S $(OUT)/$(BIN).napp $(IMAGE_TARGET_OUT)
 
 $(OUT)/$(BIN).napp : $(OUT)/$(UNSIGNED_BIN) $(NANOAPP_SIGN)
 	@mkdir -p $(dir $@)
 	$(NANOAPP_SIGN) -e $(NANOHUB_KEY_PATH)/debug.privkey \
 		-m $(NANOHUB_KEY_PATH)/debug.pubkey -s $< $@
+ifdef IMAGE_TARGET_OUT
+$(IMAGE_TARGET_OUT): $(OUT)/$(BIN).napp
+	mkdir -p $(dir $@)
+	cp $< $(IMAGE_TARGET_OUT)
+endif
 
 ifeq ($(BIN_MODE),static)
 $(OUT)/$(UNSIGNED_BIN) : $(OUT)/$(BIN).elf $(NANOAPP_POSTPROCESS)
@@ -262,6 +285,8 @@
 
 # Clean targets ################################################################
 
-.PHONY: clean
 clean :
 	rm -rf $(OUT)
+
+sync:   $(OUT)/$(BIN).napp
+	adb push $< /vendor/firmware/$(BIN).napp
diff --git a/firmware/app/test0.app/Makefile b/firmware/app/test0.app/Makefile
index b5931d1..0747921 100644
--- a/firmware/app/test0.app/Makefile
+++ b/firmware/app/test0.app/Makefile
@@ -32,11 +32,10 @@
 # Device configuration #########################################################
 
 # select device variant for this app
-VARIANT_PATH = device/google/contexthub/firmware/variant/nucleo
-VARIANT = nucleo
+# if there is no path of the form $(NANOHUB_DIR)/variant/$(VARIANT), the
+# VARIANT_PATH variable must be set to ANDROID_TOP-relative valid path containing VARIANT subtree
 
-# setup variant parameters
-# PLATFORM, CPU, CHIP must match variant Makefile (located under VARIANT_PATH);
-# if not defined there, there is not need to specify them here either
+TARGET_PRODUCT ?= nucleo
+VARIANT := $(TARGET_PRODUCT)
 
 include $(NANOHUB_DIR)/app/app.mk
diff --git a/firmware/app/test1.app/Makefile b/firmware/app/test1.app/Makefile
index b21c4ba..b7e224e 100644
--- a/firmware/app/test1.app/Makefile
+++ b/firmware/app/test1.app/Makefile
@@ -34,11 +34,10 @@
 # Device configuration #########################################################
 
 # select device variant for this app
-VARIANT_PATH = device/google/contexthub/firmware/variant/nucleo
-VARIANT = nucleo
+# if there is no path of the form $(NANOHUB_DIR)/variant/$(VARIANT), the
+# VARIANT_PATH variable must be set to ANDROID_TOP-relative valid path containing VARIANT subtree
 
-# setup variant parameters
-# PLATFORM, CPU, CHIP must match variant Makefile (located under VARIANT_PATH);
-# if not defined there, there is not need to specify them here either
+TARGET_PRODUCT ?= nucleo
+VARIANT := $(TARGET_PRODUCT)
 
 include $(NANOHUB_DIR)/app/app.mk
diff --git a/firmware/variant/linux/Makefile b/firmware/variant/linux/Makefile
index 4dec406..9d87a8f 100644
--- a/firmware/variant/linux/Makefile
+++ b/firmware/variant/linux/Makefile
@@ -1,5 +1,5 @@
+include linux_conf.mk
+
 SRC_PATH=../..
-VARIANT_PATH=src/variant/linux
-VARIANT=linux
 
 include $(SRC_PATH)/src/variant/variant.mk
diff --git a/firmware/variant/linux/linux_conf.mk b/firmware/variant/linux/linux_conf.mk
new file mode 100644
index 0000000..5febed9
--- /dev/null
+++ b/firmware/variant/linux/linux_conf.mk
@@ -0,0 +1,10 @@
+# settings that apps and OS both want to know about variant
+
+VENDOR := google
+VARIANT := linux
+CPU := x86
+CHIP := x86
+PLATFORM := native
+
+# VARIANT_PATH is relative to ANDROID TOP
+VARIANT_PATH := device/google/contexthub/firmware/variant/$(VARIANT)
diff --git a/firmware/variant/lunchbox/Makefile b/firmware/variant/lunchbox/Makefile
index 3079098..8b63784 100644
--- a/firmware/variant/lunchbox/Makefile
+++ b/firmware/variant/lunchbox/Makefile
@@ -1,5 +1,5 @@
+include lunchbox_conf.mk
+
 SRC_PATH=../..
-VARIANT_PATH=src/variant/lunchbox
-VARIANT=lunchbox
 
 include $(SRC_PATH)/src/variant/variant.mk
diff --git a/firmware/variant/lunchbox/lunchbox_conf.mk b/firmware/variant/lunchbox/lunchbox_conf.mk
new file mode 100644
index 0000000..aac2014
--- /dev/null
+++ b/firmware/variant/lunchbox/lunchbox_conf.mk
@@ -0,0 +1,10 @@
+# settings that apps and OS both want to know about variant
+
+VENDOR := google
+VARIANT := lunchbox
+CPU := cortexm4
+CHIP := stm32f411
+PLATFORM := stm32
+
+# VARIANT_PATH is relative to ANDROID TOP
+VARIANT_PATH := device/google/contexthub/firmware/variant/$(VARIANT)
diff --git a/firmware/variant/nucleo/Makefile b/firmware/variant/nucleo/Makefile
index 872c73e..dcf074e 100644
--- a/firmware/variant/nucleo/Makefile
+++ b/firmware/variant/nucleo/Makefile
@@ -1,5 +1,5 @@
+include nucleo_conf.mk
+
 SRC_PATH=../..
-VARIANT_PATH=src/variant/nucleo
-VARIANT=nucleo
 
 include $(SRC_PATH)/src/variant/variant.mk
diff --git a/firmware/variant/nucleo/nucleo_conf.mk b/firmware/variant/nucleo/nucleo_conf.mk
new file mode 100644
index 0000000..33f7c98
--- /dev/null
+++ b/firmware/variant/nucleo/nucleo_conf.mk
@@ -0,0 +1,10 @@
+# settings that apps and OS both want to know about variant
+
+VENDOR := google
+VARIANT := nucleo
+CPU := cortexm4
+CHIP := stm32f411
+PLATFORM := stm32
+
+# VARIANT_PATH is relative to ANDROID TOP
+VARIANT_PATH := device/google/contexthub/firmware/variant/$(VARIANT)
diff --git a/firmware/variant/variant.mk b/firmware/variant/variant.mk
index 340f91c..2fd8e3d 100644
--- a/firmware/variant/variant.mk
+++ b/firmware/variant/variant.mk
@@ -1,7 +1,6 @@
 PLATFORM?=stm32
 CPU?=cortexm4
 CHIP?=stm32f411
-OUT?=out
 
 # SRC_PATH points to "firmware"; TOP_PATH is the abs path to top of andrlid tree
 TOP_RELPATH := ../../../..
@@ -9,14 +8,37 @@
 VARIANT_ABSPATH := $(TOP_ABSPATH)/$(VARIANT_PATH)
 VARIANT_PATH := $(TOP_RELPATH)/$(VARIANT_PATH)
 
+ifndef OUT
+OUT:=out/nanohub/$(VARIANT)
+MAKE_OUT=$(VARIANT_PATH)/$(OUT)
+else
+ifneq ($(filter $(TOP_ABSPATH)/out/target/product/%,$(OUT)),)
+# this looks like Android OUT env var; update it
+OUT:=$(OUT)/nanohub/$(VARIANT)
+MAKE_OUT:=$(OUT)
+IMAGE_TARGET_OUT:=vendor/firmware/nanohub.full.bin
+endif
+endif
+
+.PHONY: all clean sync
+
 all:
-	make -C $(SRC_PATH) -f firmware.mk VARIANT=$(VARIANT) VARIANT_PATH=$(VARIANT_PATH) OUT=$(VARIANT_PATH)/$(OUT) PLATFORM=$(PLATFORM) CPU=$(CPU) CHIP=$(CHIP) $(EXTRA_ARGS)
+	make -C $(SRC_PATH) -f firmware.mk VARIANT=$(VARIANT) VARIANT_PATH=$(VARIANT_PATH) OUT=$(MAKE_OUT) PLATFORM=$(PLATFORM) CPU=$(CPU) CHIP=$(CHIP) $(EXTRA_ARGS)
 ifdef IMAGE_OUT
 	cd $(VARIANT_ABSPATH) && cp $(OUT)/full.bin $(IMAGE_OUT)
 endif
+ifdef IMAGE_TARGET_OUT
+	cd $(VARIANT_ABSPATH) && mkdir -p $(dir $(TOP_ABSPATH)/$(IMAGE_TARGET_OUT)) && cp $(OUT)/full.bin $(TOP_ABSPATH)/$(IMAGE_TARGET_OUT)
+endif
 
 clean:
 	rm -rf $(OUT)
 ifdef IMAGE_OUT
-	rm $(IMAGE_OUT)
+	rm $(VARIANT_ABSPATH)/$(IMAGE_OUT)
 endif
+ifdef IMAGE_TARGET_OUT
+	rm $(TOP_ABSPATH)/$(IMAGE_TARGET_OUT)
+endif
+
+sync:
+	adb push $(OUT)/full.bin /vendor/firmware/nanohub.full.bin