From c133c86f41a5be64876ad611debb189d5d8b479e Mon Sep 17 00:00:00 2001 From: nbd Date: Wed, 19 Jul 2006 13:25:09 +0000 Subject: [PATCH] add a simple prerequisite check git-svn-id: svn://svn.openwrt.org/openwrt/branches/buildroot-ng/openwrt@4168 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- Makefile | 13 +++++ include/prereq.mk | 118 ++++++++++++++++++++++++++++++++++++++++++++++ rules.mk | 1 + 3 files changed, 132 insertions(+) create mode 100644 include/prereq.mk diff --git a/Makefile b/Makefile index 5b966b752..25f60e1e5 100644 --- a/Makefile +++ b/Makefile @@ -81,11 +81,24 @@ toolchain/%: FORCE @[ -f .config ] || $(NO_TRACE_MAKE) menuconfig @$< -D .config Config.in &> /dev/null +.prereq: $(TOPDIR)/include/prereq.mk .pkginfo + @$(NO_TRACE_MAKE) -s -f $(TOPDIR)/include/prereq.mk prereq 2>/dev/null || { \ + echo "Prerequisite check failed. Use FORCE=1 to override."; \ + false; \ + } + @touch $@ + +prereq: .prereq FORCE + download: .config FORCE $(MAKE) toolchain/download $(MAKE) package/download $(MAKE) target/download +ifeq ($(FORCE),) +world: .prereq +endif + world: .config FORCE $(MAKE) toolchain/install $(MAKE) target/compile diff --git a/include/prereq.mk b/include/prereq.mk new file mode 100644 index 000000000..c51953b61 --- /dev/null +++ b/include/prereq.mk @@ -0,0 +1,118 @@ +# +# Copyright (C) 2006 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk +include $(INCLUDE_DIR)/verbose.mk + +$(TMP_DIR): + mkdir -p $@ + +prereq: + @echo + @if [ -f $(TMP_DIR)/.prereq-error ]; then \ + cat $(TMP_DIR)/.prereq-error; \ + echo; \ + rm -rf $(TMP_DIR); \ + false; \ + fi + @rm -rf $(TMP_DIR) + @mkdir -p $(TMP_DIR) + +define Require + ifeq ($$(CHECK_$(1)),) + prereq: prereq-$(1) + + prereq-$(1): $(TMP_DIR) FORCE + @echo -n "Checking '$(1)'... " + @if $(NO_TRACE_MAKE) -f $(INCLUDE_DIR)/prereq.mk check-$(1) >/dev/null 2>/dev/null; then \ + echo 'ok.'; \ + else \ + echo 'failed.'; \ + echo -e "$(strip $(2))" >> $(TMP_DIR)/.prereq-error; \ + fi + + check-$(1): FORCE + $(call Require/$(1)) + CHECK_$(1):=1 + endif +endef + + +define RequireCommand + define Require/$(1) + which $(1) + endef + + $$(eval $$(call Require,$(1),$(2))) +endef + +# Required for the toolchain +define Require/working-make + echo 'all: test' > $(TMP_DIR)/check.mk + echo 'e0 = $$$$(foreach s,foobar,$$$$(eval $$$$s:))' >> $(TMP_DIR)/check.mk + echo 'e1 = $$$$(foreach s,foobar, $$$$(eval $$$$s:))' >> $(TMP_DIR)/check.mk + echo 'test: $$$$(strip $$$$(e0)) $$$$(strip $$$$(e1))' >> $(TMP_DIR)/check.mk + $(NO_TRACE_MAKE) -f $(TMP_DIR)/check.mk +endef + +$(eval $(call Require,working-make, \ + Your make version is buggy. Please install GNU make v3.81 or later. \ +)) + +define Require/working-gcc + echo 'int main(int argc, char **argv) { return 0; }' | \ + gcc -x c -o $(TMP_DIR)/a.out - +endef + +$(eval $(call Require,working-gcc, \ + No working GNU C Compiler was found on your system. \ +)) + +define Require/working-g++ + echo 'int main(int argc, char **argv) { return 0; }' | \ + g++ -x c++ -o $(TMP_DIR)/a.out -lstdc++ - +endef + +$(eval $(call Require,working-g++, \ + No working GNU C++ Compiler was found on your system. \ +)) + +define Require/zlib + echo 'int main(int argc, char **argv) { gzdopen(0, "rb"); return 0; }' | \ + gcc -x c -o $(TMP_DIR)/a.out -lz - +endef + +$(eval $(call Require,zlib, \ + The development version of zlib was not found on your system. \ +)) + + +$(eval $(call RequireCommand,bison, \ + Please install GNU bison. \ +)) + +$(eval $(call RequireCommand,flex, \ + Please install flex. \ +)) + +$(eval $(call RequireCommand,python, \ + Please install python. \ +)) + +$(eval $(call RequireCommand,unzip, \ + Please install unzip. \ +)) + +$(eval $(call RequireCommand,bzip2, \ + Please install bzip2. \ +)) + +$(eval $(call RequireCommand,patch, \ + Please install patch. \ +)) + + diff --git a/rules.mk b/rules.mk index 533bdc35c..33e8354b8 100644 --- a/rules.mk +++ b/rules.mk @@ -28,6 +28,7 @@ BIN_DIR:=$(TOPDIR)/bin PACKAGE_DIR:=$(BIN_DIR)/packages IPKG_TARGET_DIR:=$(PACKAGE_DIR) BUILD_DIR:=$(TOPDIR)/build_$(ARCH) +TMP_DIR:=$(BUILD_DIR)/tmp STAMP_DIR:=$(BUILD_DIR)/stamp TARGET_DIR:=$(BUILD_DIR)/root IPKG_STATE_DIR:=$(TARGET_DIR)/usr/lib/ipkg