From 45e7d063935cba4eb4567b9aa95279e72d35d2a2 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Sat, 29 Jul 2006 11:30:06 +0000 Subject: [PATCH] add support for per-package prereq checks, run global prereq checks before (menu-)config SVN-Revision: 4318 --- openwrt/Makefile | 25 +++++--- openwrt/include/package.mk | 2 + openwrt/include/prereq-build.mk | 88 +++++++++++++++++++++++++++++ openwrt/include/prereq.mk | 84 +-------------------------- openwrt/package/Makefile | 9 ++- openwrt/package/base-files/Makefile | 4 +- 6 files changed, 119 insertions(+), 93 deletions(-) create mode 100644 openwrt/include/prereq-build.mk diff --git a/openwrt/Makefile b/openwrt/Makefile index e2e467cd8c..a23f478d7c 100644 --- a/openwrt/Makefile +++ b/openwrt/Makefile @@ -31,14 +31,17 @@ export OPENWRTVERSION all: world -.pkginfo: FORCE ifneq ($(shell ./scripts/timestamp.pl -p .pkginfo package Makefile),.pkginfo) +.pkginfo: FORCE +.config: FORCE +endif + +.pkginfo: @echo Collecting package info... @-for dir in package/*/; do \ echo Source-Makefile: $${dir}Makefile; \ $(NO_TRACE_MAKE) --no-print-dir DUMP=1 -C $$dir 2>&- || true; \ done > $@ -endif .config.in: .pkginfo @./scripts/gen_menuconfig.pl < $< > $@ || rm -f $@ @@ -77,18 +80,25 @@ target/%: .pkginfo FORCE toolchain/%: FORCE $(MAKE) -C toolchain $(patsubst toolchain/%,%,$@) -.config: ./scripts/config/conf FORCE +.config: ./scripts/config/conf @[ -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 || { \ +.prereq-build: $(TOPDIR)/include/prereq-build.mk + @$(NO_TRACE_MAKE) -s -f $(TOPDIR)/include/prereq-build.mk prereq 2>/dev/null || { \ echo "Prerequisite check failed. Use FORCE=1 to override."; \ false; \ } @touch $@ -prereq: .prereq FORCE +.prereq-packages: $(TOPDIR)/include/prereq.mk .pkginfo .config + @$(NO_TRACE_MAKE) -s -C package prereq 2>/dev/null || { \ + echo "Prerequisite check failed. Use FORCE=1 to override."; \ + false; \ + } + @touch $@ + +prereq: .prereq-build .prereq-packages FORCE download: .config FORCE $(MAKE) toolchain/download @@ -96,7 +106,8 @@ download: .config FORCE $(MAKE) target/download ifeq ($(FORCE),) -world: .prereq +.config ./scripts/config/conf ./scripts/config/mconf: .prereq-build +world: .prereq-packages endif world: .config FORCE diff --git a/openwrt/include/package.mk b/openwrt/include/package.mk index e0765f7bab..cd1a33c484 100644 --- a/openwrt/include/package.mk +++ b/openwrt/include/package.mk @@ -10,6 +10,8 @@ else all: compile endif +include $(INCLUDE_DIR)/prereq.mk + define Build/DefaultTargets ifeq ($(DUMP),) ifeq ($(CONFIG_AUTOREBUILD),y) diff --git a/openwrt/include/prereq-build.mk b/openwrt/include/prereq-build.mk new file mode 100644 index 0000000000..a6de9b270a --- /dev/null +++ b/openwrt/include/prereq-build.mk @@ -0,0 +1,88 @@ +# +# 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)/prereq.mk + +# 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 (gcc) 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 (g++) was found on your system. \ +)) + +define Require/ncurses + echo 'int main(int argc, char **argv) { initscr(); return 0; }' | \ + gcc -include ncurses.h -x c -o $(TMP_DIR)/a.out -lncurses - +endef + +$(eval $(call Require,ncurses, \ + No ncurses development files were not found on your system. \ +)) + + +define Require/zlib + echo 'int main(int argc, char **argv) { gzdopen(0, "rb"); return 0; }' | \ + gcc -include zlib.h -x c -o $(TMP_DIR)/a.out -lz - +endef + +$(eval $(call Require,zlib, \ + No zlib development files were 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. \ +)) + +$(eval $(call RequireCommand,perl, \ + Please install perl. \ +)) diff --git a/openwrt/include/prereq.mk b/openwrt/include/prereq.mk index e514855a67..c9b82d2947 100644 --- a/openwrt/include/prereq.mk +++ b/openwrt/include/prereq.mk @@ -5,14 +5,12 @@ # See /LICENSE for more information. # -include $(TOPDIR)/rules.mk - $(TMP_DIR): mkdir -p $@ prereq: - echo if [ -f $(TMP_DIR)/.prereq-error ]; then \ + echo; \ cat $(TMP_DIR)/.prereq-error; \ echo; \ rm -rf $(TMP_DIR); \ @@ -29,7 +27,7 @@ define Require 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 \ + if $(NO_TRACE_MAKE) -f $(firstword $(MAKEFILE_LIST)) check-$(1) >/dev/null 2>/dev/null; then \ echo 'ok.'; \ else \ echo 'failed.'; \ @@ -53,81 +51,3 @@ define RequireCommand $$(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 (gcc) 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 (g++) was found on your system. \ -)) - -define Require/ncurses - echo 'int main(int argc, char **argv) { initscr(); return 0; }' | \ - gcc -include ncurses.h -x c -o $(TMP_DIR)/a.out -lncurses - -endef - -$(eval $(call Require,ncurses, \ - No ncurses development files were not found on your system. \ -)) - - -define Require/zlib - echo 'int main(int argc, char **argv) { gzdopen(0, "rb"); return 0; }' | \ - gcc -include zlib.h -x c -o $(TMP_DIR)/a.out -lz - -endef - -$(eval $(call Require,zlib, \ - No zlib development files were 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. \ -)) - -$(eval $(call RequireCommand,perl, \ - Please install perl. \ -)) diff --git a/openwrt/package/Makefile b/openwrt/package/Makefile index 7a3af2e6f7..629ce88109 100644 --- a/openwrt/package/Makefile +++ b/openwrt/package/Makefile @@ -10,13 +10,17 @@ include $(TOPDIR)/rules.mk include $(TOPDIR)/.config include $(TOPDIR)/.pkgdeps -SOURCE_PACKAGES:=$(patsubst %,%-download,$(package-y) $(package-m)) +PREREQ_PACKAGES:=$(patsubst %,%-prereq,$(package-y) $(package-m)) +DOWNLOAD_PACKAGES:=$(patsubst %,%-download,$(package-y) $(package-m)) COMPILE_PACKAGES:=$(patsubst %,%-compile,$(package-y) $(package-m)) INSTALL_PACKAGES:=$(patsubst %,%-install,$(package-y)) $(STAMP_DIR) $(TARGET_DIR): mkdir -p $@ +%-prereq: $(STAMP_DIR) $(TARGET_DIR) + $(MAKE) -C $(patsubst %-prereq,%,$@) prereq MAKEFLAGS="$(BUILD_MAKEFLAGS)" + %-download: $(STAMP_DIR) $(TARGET_DIR) $(MAKE) -C $(patsubst %-download,%,$@) download MAKEFLAGS="$(BUILD_MAKEFLAGS)" @@ -41,7 +45,8 @@ $(TOPDIR)/.pkgdeps: $(TOPDIR)/.pkginfo all: compile clean: $(patsubst %,%-clean,$(package-) $(package-y) $(package-m)) -download: $(SOURCE_PACKAGES) +prereq: $(PREREQ_PACKAGES) +download: $(DOWNLOAD_PACKAGES) compile-targets: $(COMPILE_PACKAGES) compile: $(MAKE) -j$(CONFIG_JLEVEL) compile-targets diff --git a/openwrt/package/base-files/Makefile b/openwrt/package/base-files/Makefile index 01ea9674c5..e41e1fd798 100644 --- a/openwrt/package/base-files/Makefile +++ b/openwrt/package/base-files/Makefile @@ -22,8 +22,8 @@ include $(INCLUDE_DIR)/package.mk ifneq ($(DUMP),1) TARGET:=-$(BOARD)-$(KERNEL) -UCLIBC_VERSION:=${shell cat $(STAGING_DIR)/uclibc_version} -LIBGCC_VERSION:=${shell cat $(STAGING_DIR)/gcc_version} +UCLIBC_VERSION:=${shell cat $(STAGING_DIR)/uclibc_version 2>/dev/null} +LIBGCC_VERSION:=${shell cat $(STAGING_DIR)/gcc_version 2>/dev/null} else UCLIBC_VERSION:= LIBGCC_VERSION:=