125 lines
3.5 KiB
Makefile
125 lines
3.5 KiB
Makefile
# step 4 is kicked off here but actually done by image.in/Makefile
|
|
ANSI_OK ?= 1;32
|
|
ANSI_FAIL ?= 1;31
|
|
|
|
MAX_LINES = 200
|
|
MAX_ERRORS = 5
|
|
GOTCHA := ^(((\*\* )?(E:|[Ee]rror|[Ww]arning).*)|(.* (FAILURE|FATAL|ERROR|conflicts|Conflicts:|Depends:) .*)|(.* (Stop|failed|not found)\.)|(not allowed))$$
|
|
|
|
ifeq (,$(MKIMAGE_PROFILES))
|
|
$(error this makefile is designed to be included in toplevel one)
|
|
endif
|
|
|
|
# try not to bog down the system, both CPU and I/O wise
|
|
ifneq (,$(NICE))
|
|
START := nice $(shell ionice -c3 echo "ionice -c3" 2>/dev/null)
|
|
endif
|
|
|
|
# in kilobytes (a kilometer is 1024 meters, you know)
|
|
LOWSPACE = 1024
|
|
|
|
# it's also nice to know how long and much it takes
|
|
START += time -f "%E %PCPU %Mk"
|
|
|
|
# e2k* builds always run natively, and without setarch
|
|
ifneq (,$(findstring e2k,$(ARCH)))
|
|
USE_QEMU := 0
|
|
else
|
|
USE_QEMU ?= 1
|
|
endif
|
|
|
|
ifeq ($(USE_QEMU),1)
|
|
|
|
# /usr/bin/{i586,x86_64} are setarch(8) symlinks but arm is not;
|
|
# armh (armv7l) doesn't have any but should cope with qemu-arm.static;
|
|
# also check whether non-x86 build is running native
|
|
ifeq (,$(wildcard $(subst :,/$(ARCH) ,$(PATH):)))
|
|
|
|
EARCH := $(subst armh,arm,$(ARCH))
|
|
|
|
# for mips*el, `uname -m` never has 'el' suffix, but
|
|
# qemu-user-static binaries always do.
|
|
UARCH := $(subst mipsel,mips,$(EARCH))
|
|
UARCH := $(subst mips64el,mips64,$(UARCH))
|
|
|
|
ifeq (,$(findstring $(UARCH),$(shell uname -m)))
|
|
export GLOBAL_HSH_USE_QEMU=$(EARCH)
|
|
endif
|
|
else
|
|
START += $(ARCH)
|
|
endif
|
|
endif
|
|
|
|
|
|
# to be passed into distcfg.mk; suggestions are welcome
|
|
ifneq (,$(filter-out $(DIRECT_TARGETS),$(MAKECMDGOALS)))
|
|
IMAGEDIR ?= $(shell \
|
|
if [ -d "$$HOME/out" -a -w "$$HOME/out" ]; then \
|
|
echo "$$HOME/out"; \
|
|
else \
|
|
dir="`dirname $(BUILDDIR)`/out"; \
|
|
mkdir -p "$$dir" && echo "$$dir" || echo "/tmp"; \
|
|
fi; \
|
|
)
|
|
endif
|
|
|
|
LOGDIR ?= $(wildcard $(IMAGEDIR))
|
|
|
|
make-aptbox: ; @:
|
|
ifneq (0,$(CHECK))
|
|
@mkdir -p $(BUILDDIR)/.work/pkgbox; \
|
|
mkdir -p $(BUILDDIR)/.work/.cache; \
|
|
mkdir -p $(BUILDDIR)/.work/.out; \
|
|
APTCONF=$(wildcard $(APTCONF)); \
|
|
mkaptbox --without-stuff --target=$(ARCH) $${APTCONF:+--apt-config=$$APTCONF} -- $(BUILDDIR)/.work/pkgbox
|
|
endif
|
|
|
|
# actual build starter
|
|
# NB: our output MUST go into stderr to escape POSTPROC
|
|
build-image: profile/populate
|
|
@{ \
|
|
if [ -n "$(CHECK)" ]; then \
|
|
echo "$(TIME) skipping actual image build (CHECK is set)"; \
|
|
exit; \
|
|
fi; \
|
|
if [ -z "$(QUIET)" ]; then \
|
|
echo -n "$(TIME) starting image build"; \
|
|
if [ -n "$(DEBUG)" ]; then \
|
|
echo ": tail -f $(BUILDLOG)" $(SHORTEN); \
|
|
else \
|
|
echo " (coffee time)"; \
|
|
fi; \
|
|
fi; \
|
|
if $(START) $(MAKE) -C $(BUILDDIR)/ $(LOG); then \
|
|
DURATION="(`tail -1 $(BUILDLOG) | cut -f1 -d.`)"; \
|
|
tail -n $(MAX_LINES) "$(BUILDLOG)" $(SHORTEN) \
|
|
| if [ -z "$(QUIET)" ]; then \
|
|
echo "$(TIME) done $$DURATION"; \
|
|
GREP_COLORS="mt=0$(ANSI_OK)" \
|
|
grep --color=auto '^\*\* image: .*$$' ||:; \
|
|
else \
|
|
echo -n "$(TIME) $$DURATION "; \
|
|
sed -rn 's/^\*\* image: (.*)$$/\1/p'; \
|
|
fi; \
|
|
RETVAL=0; \
|
|
else \
|
|
RETVAL=$$?; \
|
|
echo -n "$(TIME) failed, see log"; \
|
|
if [ -z "$(DEBUG)" -o -n "$(QUIET)" ]; then \
|
|
echo ": $(BUILDLOG)" $(SHORTEN); \
|
|
else \
|
|
echo " above"; \
|
|
fi; \
|
|
if [ -z "$(DEBUG)" ]; then \
|
|
echo "$(TIME) (you might want to rerun with DEBUG=1)"; \
|
|
fi; \
|
|
tail -n $(MAX_LINES) "$(BUILDLOG)" \
|
|
| GREP_COLORS="mt=0$(ANSI_FAIL)" \
|
|
grep -E --color=auto -m "$(MAX_ERRORS)" "$(GOTCHA)"; \
|
|
df -P $(BUILDDIR) | awk 'END { if ($$4 < $(LOWSPACE)) \
|
|
{ print "NB: low space on "$$6" ("$$5" used)"}}'; \
|
|
fi; \
|
|
if [ -n "$(BELL)" ]; then echo -ne '\a'; fi; \
|
|
exit $$RETVAL; \
|
|
} >&2
|