
SHELL = env bash

all: 
	@if [ -d obj ]; then                                           \
	  $(MAKE) build_all;                                           \
	else                                                           \
	  echo "Call 'make setup' once for initial setup." ;           \
	  exit 1;                                                      \
	fi

clean:
	@$(RM) -r obj pre-built-images

setup:
	@+if [ -d obj ]; then                                                            \
	  echo "Snapshot has already been setup. Proceed with 'make clean' and call 'make setup' again.";    \
	else                                                                            \
	  export PATH=$$(pwd)/bin:$$PATH;                                               \
	  chmod +x ./bin/setup.d/*;                                                     \
	  for binary in bin/setup.d/*; do                                               \
	    ./$$binary config || exit 1;                                                \
	  done;                                                                         \
	  for binary in bin/setup.d/*; do                                               \
	    ./$$binary setup || exit 1;                                                 \
	  done;                                                                         \
	  echo ====================================================================;    \
	  echo ;                                                                        \
	  echo Your L4Re tree is set up now. Type 'make' to build the tree. This;       \
	  echo will take some time \(depending on the speed of your host system, of;    \
	  echo course\).;                                                               \
	  echo ;                                                                        \
	  echo Boot-images for ARM targets will be placed into obj/l4/arm-*/images.;    \
	  echo Boot-images for MIPS targets will be placed into obj/l4/mips32/images.;    \
	  echo Check obj/l4/.../conf/Makeconf.boot for path configuration during image builds.; \
	  echo ;                                                                        \
	fi

build_all: build_fiasco build_l4re build_l4linux

#.NOTPARALLEL: build_fiasco build_l4re build_l4linux build_images build_all

build_fiasco: $(addsuffix /fiasco,$(wildcard obj/fiasco/*))
build_l4re: $(addsuffix /l4defs.mk.inc,$(wildcard obj/l4/*))
build_l4linux: $(addsuffix /vmlinux,$(wildcard obj/l4linux/*))

$(addsuffix /fiasco,$(wildcard obj/fiasco/*)):
	$(MAKE) -C $(@D)

$(addsuffix /l4defs.mk.inc,$(wildcard obj/l4/*)):
	$(MAKE) -C $(@D)

obj/l4linux/amd64/vmlinux: obj/l4/amd64/l4defs.mk.inc
	$(MAKE) -C src/l4linux O=$(abspath $(@D)) x86_64-mp_vPCI_defconfig
	src/l4linux/scripts/config --file $(@D)/.config \
	                           --set-str L4_OBJ_TREE $(abspath obj/l4/amd64)
# temporary quick fix
	src/l4linux/scripts/config --file $(@D)/.config -e PCI -e L4_VPCI
	$(MAKE) -C $(@D) olddefconfig
	$(MAKE) -C $(@D)

obj/l4linux/ux/vmlinux: obj/l4/x86/l4defs.mk.inc
	$(MAKE) -C src/l4linux O=$(abspath $(@D)) x86_32-ux_defconfig
	src/l4linux/scripts/config --file $(@D)/.config \
	                           --set-str L4_OBJ_TREE $(abspath obj/l4/x86)
	$(MAKE) -C $(@D)

obj/l4linux/arm-mp/vmlinux: obj/l4/arm-v7/l4defs.mk.inc
	+. obj/.config && $(MAKE) -C src/l4linux L4ARCH=arm \
	                          CROSS_COMPILE=$$CROSS_COMPILE_ARM \
	                          O=$(abspath $(@D)) arm-mp_defconfig
	src/l4linux/scripts/config --file $(@D)/.config \
	                           --set-str L4_OBJ_TREE $(abspath obj/l4/arm-v7)
	+. obj/.config && $(MAKE) -C $(@D) CROSS_COMPILE=$$CROSS_COMPILE_ARM

obj/l4linux/arm-up/vmlinux: obj/l4/arm-v7/l4defs.mk.inc
	+. obj/.config && $(MAKE) -C src/l4linux L4ARCH=arm \
	                          CROSS_COMPILE=$$CROSS_COMPILE_ARM \
	                          O=$(abspath $(@D)) arm_defconfig
	src/l4linux/scripts/config --file $(@D)/.config \
	                           --set-str L4_OBJ_TREE $(abspath obj/l4/arm-v7)
	+. obj/.config && $(MAKE) -C $(@D) CROSS_COMPILE=$$CROSS_COMPILE_ARM

obj/l4linux/arm64/vmlinux: obj/l4/arm64/l4defs.mk.inc
	+. obj/.config && $(MAKE) -C src/l4linux L4ARCH=arm64 \
		                  CROSS_COMPILE=$$CROSS_COMPILE_ARM64 \
	                          O=$(abspath $(@D)) arm64_defconfig
	src/l4linux/scripts/config --file $(@D)/.config \
	                           --set-str L4_OBJ_TREE $(abspath obj/l4/arm64)
	+. obj/.config && $(MAKE) -C $(@D) CROSS_COMPILE=$$CROSS_COMPILE_ARM64


build_images: build_l4linux build_l4re build_fiasco
	@echo "=============== Building Images ==============================="
	@+set -e;                                                                \
	export PATH=$$(pwd)/bin:$$PATH;                                         \
	[ -e obj/.config ] && . obj/.config;                                    \
	cd obj/l4;                                                              \
	for d in *; do                                                          \
	  if [ -d "$$d" -a -e $$d/.imagebuilds ]; then                          \
	    cat $$d/.imagebuilds | while read args; do                          \
	      # Do EFI first, because the EFI build process also generates      \
	      # an ELF file which is PIE and linked to 0 despite of any target  \
	      # link address.                                                   \
	      if [ "$$d" = "amd64" ]; then                                      \
	        $(MAKE) -C $$d efiimage $$args;                                 \
	      fi;                                                               \
	      if [ "$$d" = "arm64" ]; then                                      \
	        case "$$args" in                                                \
	          *PT=arm_sbsa*) $(MAKE) -C $$d efiimage $$args;;               \
	        esac;                                                           \
	      fi;                                                               \
	      if [ "$$d" != "amd64" -a "$$d" != "x86" ]; then                   \
	        $(MAKE) -C $$d uimage $$args;                                   \
	      fi;                                                               \
	      $(MAKE) -C $$d elfimage $$args;                                   \
	      if [ "$$d" = "amd64" -o "$$d" = "x86" ]; then                     \
	        if [ -z "$(GRUB_INST_PATH)" ]; then                             \
	          echo "Need to specify GRUB_INST_PATH"; exit 1;                \
	        fi;                                                             \
	        PATH=$(GRUB_INST_PATH)/efi/bin:$$PATH $(MAKE) -C $$d grub2iso ISONAME_SUFFIX=.efi.iso $$args; \
	        PATH=$(GRUB_INST_PATH)/pc/bin:$$PATH  $(MAKE) -C $$d grub2iso ISONAME_SUFFIX=.pc.iso $$args; \
	      fi;                                                               \
	    done;                                                               \
	  fi;                                                                   \
	done	
	@echo "=============== Build done ===================================="

gen_prebuilt: copy_prebuilt pre-built-images/l4image

copy_prebuilt2: build_images
	@echo "Creating pre-built image directory"
	@set -e;                                             \
	@cd obj/l4;                                          \
	for arch in *; do                                    \
	  for i in $$arch/images/*; do \
	    if [ "$$arch" = "amd64" -o "$$arch" = "x86" ]; then \
	      mkdir -p ../../pre-built-images/$$arch; \
	      if [ -d $$i ]; then \
	        for f in $$i/*.elf; do \
	          cp $$f ../../pre-built-images/$$arch; \
	        done; \
	      fi; \
	    else \
	      if [ -d $$i ]; then \
		pt=$${i#$$arch/images/}; \
		mkdir -p ../../pre-built-images/$$arch/$$pt; \
		for f in $$i/*.elf $$i/*.uimage; do \
		  cp $$f ../../pre-built-images/$$arch/$$pt; \
		done; \
	      fi; \
	    fi; \
	  done; \
	done

copy_prebuilt: build_images
	@echo "Creating pre-built image directory"
	@set -e;                                             \
	cd obj/l4;                                           \
	for arch in *; do                                    \
	  mkdir -p ../../pre-built-images/$$arch;            \
	  for i in $$arch/images/l4re_*.elf             \
	           $$arch/images/l4re_*.efi             \
	           $$arch/images/l4re_*.uimage; do      \
	    [ -e $$i ] || continue;                          \
	    cp $$i ../../pre-built-images/$$arch;            \
	  done;                                              \
	done

pre-built-images/l4image:
	@echo Creating $@
	@src/l4/tool/bin/l4image --create-l4image-binary $@

help:
	@echo "Targets:"
	@echo "  all"
	@echo "  setup"
	@echo "  build_images"
	@echo "  gen_prebuilt"

.PHONY: setup all build_all clean help \
        build_images build_fiasco build_l4re build_l4linux
