Makefile: add target loop, serialise targets, and update settings file

This commit is contained in:
Tony Theodore 2013-05-24 00:22:15 +10:00
parent 50129207bb
commit 95e37fbe7e
1 changed files with 66 additions and 28 deletions

View File

@ -1,7 +1,7 @@
# This file is part of MXE.
# See index.html for further information.
TARGET := i686-pc-mingw32
MXE_TARGETS := i686-pc-mingw32
SOURCEFORGE_MIRROR := freefr.dl.sourceforge.net
PKG_MIRROR := s3.amazonaws.com/mxe-pkg
PKG_CDN := d1yihgixbnrglp.cloudfront.net
@ -35,8 +35,6 @@ TOP_DIR := $(patsubst %/,%,$(dir $(MAKEFILE)))
PKGS := $(shell $(SED) -n 's/^.* id="\([^"]*\)-package">.*$$/\1/p' '$(TOP_DIR)/index.html')
PATH := $(PREFIX)/bin:$(PATH)
CMAKE_TOOLCHAIN_FILE := $(PREFIX)/$(TARGET)/share/cmake/mxe-conf.cmake
# unexport any environment variables that might cause trouble
unexport AR CC CFLAGS C_INCLUDE_PATH CPATH CPLUS_INCLUDE_PATH CPP
unexport CPPFLAGS CROSS CXX CXXCPP CXXFLAGS EXEEXT EXTRA_CFLAGS
@ -68,7 +66,6 @@ ESCAPE_PKG = \
echo '$($(1)_FILE)' | perl -lpe 's/([^A-Za-z0-9])/sprintf("%%%02X", ord($$$$1))/seg'
DOWNLOAD_PKG_ARCHIVE = \
$(if $(value $(1)_URL), \
mkdir -p '$(PKG_DIR)' && \
$(if $($(1)_URL_2), \
( $(WGET) -T 30 -t 3 -O- '$($(1)_URL)' || \
@ -81,8 +78,7 @@ DOWNLOAD_PKG_ARCHIVE = \
$(if $($(1)_FIX_GZIP), \
| gzip -d | gzip -9n, \
) \
> '$(PKG_DIR)/$($(1)_FILE)' || rm -f '$(PKG_DIR)/$($(1)_FILE)', \
$(error URL not specified for package $(1)))
> '$(PKG_DIR)/$($(1)_FILE)' || rm -f '$(PKG_DIR)/$($(1)_FILE)'
ifeq ($(IGNORE_SETTINGS),yes)
$(info [ignore settings.mk])
@ -91,9 +87,12 @@ else ifeq ($(wildcard $(PWD)/settings.mk),$(PWD)/settings.mk)
else
$(info [create settings.mk])
$(shell { \
echo '#JOBS = $(JOBS)'; \
echo '#.DEFAULT my-pkgs:'; \
echo '#my-pkgs: boost curl file flac lzo pthreads vorbis wxwidgets'; \
echo '#JOBS := $(JOBS)'; \
echo '#MXE_TARGETS := i686-pc-mingw32 x86_64-w64-mingw32 i686-w64-mingw32'; \
echo '#SOURCEFORGE_MIRROR := downloads.sourceforge.net'; \
echo '#LOCAL_PKG_LIST := boost curl file flac lzo pthreads vorbis wxwidgets'; \
echo '#.DEFAULT local-pkg-list:'; \
echo '#local-pkg-list: $$(LOCAL_PKG_LIST)'; \
} >'$(PWD)/settings.mk')
endif
@ -149,21 +148,49 @@ include $(patsubst %,$(TOP_DIR)/src/%.mk,$(PKGS))
.PHONY: download
download: $(addprefix download-,$(PKGS))
define TARGET_DEPS
$(1)_DEPS := $(shell echo '$(MXE_TARGETS)' | \
$(SED) -n 's,.*$(1)\(.*\),\1,p' | \
awk '{print $$1}')
endef
$(foreach TARGET,$(MXE_TARGETS),$(eval $(call TARGET_DEPS,$(TARGET))))
TARGET_HEADER = \
$(strip with \
$(if $(value MAKECMDGOALS),\
$(words $(MAKECMDGOALS)) goal$(shell [ $(words $(MAKECMDGOALS)) == 1 ] || echo s) from command line,\
$(if $(value LOCAL_PKG_LIST),\
$(words $(LOCAL_PKG_LIST)) goal$(shell [ $(words $(LOCAL_PKG_LIST)) == 1 ] || echo s) from settings.mk,\
$(words $(PKGS)) goal$(shell [ $(words $(PKGS)) == 1 ] || echo s) from src/*.mk)))
define TARGET_RULE
.PHONY: $(1)
$(1): | $(if $(value $(1)_DEPS), \
$(if $(value MAKECMDGOALS),\
$(addprefix $(PREFIX)/$($(1)_DEPS)/installed/,$(MAKECMDGOALS)), \
$(if $(value LOCAL_PKG_LIST),\
$(addprefix $(PREFIX)/$($(1)_DEPS)/installed/,$(LOCAL_PKG_LIST)), \
$(addprefix $(PREFIX)/$($(1)_DEPS)/installed/,$(PKGS))))) \
$($(1)_DEPS)
@echo '[target] $(1) $(call TARGET_HEADER)'
endef
$(foreach TARGET,$(MXE_TARGETS),$(eval $(call TARGET_RULE,$(TARGET))))
define PKG_RULE
.PHONY: download-$(1)
download-$(1): $(addprefix download-,$($(1)_DEPS))
download-$(1):: $(addprefix download-,$($(1)_DEPS))
if ! $(call CHECK_PKG_ARCHIVE,$(1)); then \
$(call DOWNLOAD_PKG_ARCHIVE,$(1)); \
$(call CHECK_PKG_ARCHIVE,$(1)) || { echo 'Wrong checksum!'; exit 1; }; \
fi
.PHONY: $(1)
$(1): $(PREFIX)/installed/$(1)
$(PREFIX)/installed/$(1): $(TOP_DIR)/src/$(1).mk \
$(1): $(PREFIX)/$(3)/installed/$(1)
$(PREFIX)/$(3)/installed/$(1): $(TOP_DIR)/src/$(1).mk \
$(wildcard $(TOP_DIR)/src/$(1)-*.patch) \
$(wildcard $(TOP_DIR)/src/$(1)-test*) \
$(addprefix $(PREFIX)/installed/,$($(1)_DEPS)) \
| check-requirements
$(addprefix $(PREFIX)/$(3)/installed/,$($(1)_DEPS)) \
| check-requirements $(3)
@[ -d '$(LOG_DIR)/$(TIMESTAMP)' ] || mkdir -p '$(LOG_DIR)/$(TIMESTAMP)'
@if ! $(call CHECK_PKG_ARCHIVE,$(1)); then \
echo '[download] $(1)'; \
@ -180,12 +207,18 @@ $(PREFIX)/installed/$(1): $(TOP_DIR)/src/$(1).mk \
exit 1; \
fi; \
fi
$(if $(value $(1)_BUILD),
@echo '[build] $(1)'
,)
@touch '$(LOG_DIR)/$(TIMESTAMP)/$(1)'
@ln -sf '$(TIMESTAMP)/$(1)' '$(LOG_DIR)/$(1)'
@if ! (time $(MAKE) -f '$(MAKEFILE)' 'build-only-$(1)') &> '$(LOG_DIR)/$(TIMESTAMP)/$(1)'; then \
$(if $(or $(value $(1)_BUILD_$(3)),\
$(and $(value $(1)_BUILD),$(findstring undefined,$(origin $(1)_BUILD_$(3))))),
@echo '[build] $(1)',
$(if $(findstring undefined,$(origin $(1)_BUILD_$(3))),
@echo '[no-op] $(1)',
@echo '[exclude] $(1)'
)
)
@touch '$(LOG_DIR)/$(TIMESTAMP)/$(1)_$(3)'
@[ $(words $(MXE_TARGETS)) == 1 ] || ln -sf '$(TIMESTAMP)/$(1)_$(3)' '$(LOG_DIR)/$(1)_$(3)'
@ln -sf '$(TIMESTAMP)/$(1)_$(3)' '$(LOG_DIR)/$(1)'
@if ! (time $(MAKE) -f '$(MAKEFILE)' 'build-only-$(1)_$(3)') &> '$(LOG_DIR)/$(TIMESTAMP)/$(1)_$(3)'; then \
echo; \
echo 'Failed to build package $(1)!'; \
echo '------------------------------------------------------------'; \
@ -197,24 +230,29 @@ $(PREFIX)/installed/$(1): $(TOP_DIR)/src/$(1).mk \
fi
@echo '[done] $(1)'
.PHONY: build-only-$(1)
build-only-$(1): PKG = $(1)
build-only-$(1):
$(if $(value $(1)_BUILD),
.PHONY: build-only-$(1)_$(3)
build-only-$(1)_$(3): PKG = $(1)
build-only-$(1)_$(3): TARGET = $(3)
build-only-$(1)_$(3): CMAKE_TOOLCHAIN_FILE = $(PREFIX)/$(3)/share/cmake/mxe-conf.cmake
build-only-$(1)_$(3):
$(if $(or $(value $(1)_BUILD_$(3)),\
$(and $(value $(1)_BUILD),$(findstring undefined,$(origin $(1)_BUILD_$(3))))),
rm -rf '$(2)'
mkdir -p '$(2)'
cd '$(2)' && $(call UNPACK_PKG_ARCHIVE,$(1))
cd '$(2)/$($(1)_SUBDIR)'
$(foreach PKG_PATCH,$(sort $(wildcard $(TOP_DIR)/src/$(1)-*.patch)),
(cd '$(2)/$($(1)_SUBDIR)' && $(PATCH) -p1 -u) < $(PKG_PATCH))
$$(call $(1)_BUILD,$(2)/$($(1)_SUBDIR),$(TOP_DIR)/src/$(1)-test)
$$(call $(if $(value $(1)_BUILD_$(3)),$(1)_BUILD_$(3),$(1)_BUILD),$(2)/$($(1)_SUBDIR),$(TOP_DIR)/src/$(1)-test)
(du -k -d 0 '$(2)' 2>/dev/null || du -k --max-depth 0 '$(2)') | $(SED) -n 's/^\(\S*\).*/du: \1 KiB/p'
rm -rfv '$(2)'
,)
[ -d '$(PREFIX)/installed' ] || mkdir -p '$(PREFIX)/installed'
touch '$(PREFIX)/installed/$(1)'
[ -d '$(PREFIX)/$(3)/installed' ] || mkdir -p '$(PREFIX)/$(3)/installed'
touch '$(PREFIX)/$(3)/installed/$(1)'
endef
$(foreach PKG,$(PKGS),$(eval $(call PKG_RULE,$(PKG),$(call TMP_DIR,$(PKG)))))
$(foreach TARGET,$(MXE_TARGETS), \
$(foreach PKG,$(PKGS), \
$(eval $(call PKG_RULE,$(PKG),$(call TMP_DIR,$(PKG)),$(TARGET)))))
.PHONY: clean
clean: