main.mk 2.9 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12
# steps to build an image:
# --- here
# 1. initialize new profile (BUILDDIR) as a copy of image.in/
# 2. configure distro
# 3. copy the needed bits from metaprofile to a new profile
# --- in BUILDDIR
# 4. build subprofiles and subsequently an image

# deal with one target at a time
IMAGE_TARGET := $(firstword $(MAKECMDGOALS))#	ve/generic.tar.gz
ifeq (./,$(dir $(IMAGE_TARGET)))#		convenience fallback
IMAGE_TARGET := distro/$(IMAGE_TARGET)#		for omitted "distro/"
13 14 15
IMAGE_GUESS  := 1
else
IMAGE_GUESS  :=
16 17 18 19 20 21
endif
IMAGE_CONF    := $(firstword $(subst ., ,$(IMAGE_TARGET)))# ve/generic
IMAGE_CLASS   := $(firstword $(subst /, ,$(IMAGE_TARGET)))# ve
IMAGE_FILE    := $(lastword  $(subst /, ,$(IMAGE_TARGET)))# generic.tar.gz
IMAGE_NAME    := $(firstword $(subst ., ,$(IMAGE_FILE)))#   generic
IMAGE_TYPE    := $(subst $(IMAGE_NAME).,,$(IMAGE_FILE))#    tar.gz
22
ifeq ($(IMAGE_NAME),$(IMAGE_TYPE)$(IMAGE_GUESS))
23
ifneq (help,$(IMAGE_CLASS))
24 25
$(warning no image type/extension specified, run make help?)
endif
26
endif
27 28 29 30 31 32 33 34

# readjustable
ifeq (1,$(NUM_TARGETS))
BUILDDIR_PREFIX ?= mkimage-profiles.build
else
BUILDDIR_PREFIX ?= mkimage-profiles.build/$(IMAGE_CONF).$(ARCH)
endif

35 36
export MKIMAGE_PROFILES := $(realpath $(dir $(lastword $(MAKEFILE_LIST))))

37 38 39 40
# preferences
-include $(HOME)/.mkimage/profiles.mk

# most of the actual work done elsewhere
Michael Shigorin's avatar
Michael Shigorin committed
41
include $(sort $(wildcard lib/*.mk))
42 43 44
include conf.d/*.mk
include features.in/*/config.mk

45 46 47 48 49 50
# ensure the outdir is created and globbable
ifdef IMAGEDIR
$(shell mkdir -p $(IMAGEDIR))
IMAGEDIR := $(wildcard $(IMAGEDIR))
endif

51 52 53 54 55 56 57 58 59 60 61
# conf.d/*.mk can expose parts conditionally (e.g. DEBUG-only bits)
targets = $(shell \
	  for i in conf.d/*.mk; do \
		make IMAGE_CLASS=$(1) -s -r -p -f $$i 2>/dev/null; \
	  done \
	  | sed -rn 's,^($(1)/[^.:]+):.*,\1,p' \
	  | sort -u)

DISTRO_TARGETS := $(call targets,distro)
VE_TARGETS := $(call targets,ve)
VM_TARGETS := $(call targets,vm)
62 63
DISTROS := $(call addsuffices,$(DISTRO_EXTS),$(DISTRO_TARGETS))
VES     := $(call addsuffices,$(VE_EXTS),$(VE_TARGETS))
64 65
VMS     := $(call addsuffices,$(VM_EXTS),$(VM_TARGETS))
IMAGES  := $(DISTROS) $(VES) $(VMS)
66

67
.PHONY: $(IMAGES) $(DISTRO_TARGETS) $(VE_TARGETS) $(VM_TARGETS)
68 69
.PHONY: debug everything help space

70 71 72
# grepping for localized error messages is not trivial
export LC_MESSAGES=C

73 74 75 76 77
### duplicate but still needed
everything:
	@n=1; sum=$(words $(DISTROS)); \
	for distro in $(DISTROS); do \
		echo "** building $$distro [$$n/$$sum]:"; \
78 79
		$(MAKE) -f main.mk --no-print-directory $$distro; \
		[ "$$n" -lt "$$sum" ] && echo; \
80 81 82 83 84 85 86 87 88 89 90 91
		n=$$(($$n+1)); \
	done

# config/with/ve/generic config/like/ve config/name/generic config/pack/tar.gz
$(IMAGES): debug \
	config/with/$(IMAGE_CONF) \
	config/like/$(IMAGE_CLASS) \
	config/name/$(IMAGE_NAME) \
	config/pack/$(IMAGE_TYPE) \
	build; @:

# convenience shortcut
92
$(DISTROS:distro/%=%): %: distro/%; @:
93

94
debug::
95 96 97 98 99
ifeq (2,$(DEBUG))
	@$(foreach v,\
		$(filter IMAGE_%,$(sort $(.VARIABLES))),\
		$(warning $v = $($v)))
endif