diff options
author | Waldemar Brodkorb <wbx@openadk.org> | 2015-12-13 17:18:40 +0100 |
---|---|---|
committer | Waldemar Brodkorb <wbx@openadk.org> | 2015-12-13 17:18:44 +0100 |
commit | a94d74d9c875b4a1c07945bf9af282221d0178b3 (patch) | |
tree | daa2be873d758ad77006696efde6e76982f24d20 | |
parent | 74663fdbbd1dc92dd91f6f88dbc4f972df12c404 (diff) |
rework prereq check
The new prereq check is completely implemented in
POSIX shell in scripts/prereq.sh.
It combines the old features from Makefile, scan-tools.sh,
scan-pkgs.sh, reloc.sh and some wrappers for tools.
The big benefit is to have all portability stuff in one place.
Furthermore we can compile GNU make and bash on the fly, for
systems lacking the required tools.
All changes on the host are detected on the fly, no make
prereq required anymore.
The build process is separated in following three phases:
1. small wrapper Makefile is used for BSD make or GNU make
2. prereq.sh is called, doing all checking, calling Makefile.adk
3. old logic in Makefile.adk or mk/build.mk is used
Tested successfully on Linux, MacOS X, Cygwin, FreeBSD, OpenBSD
and NetBSD.
An old depmaker bug was fixed, only optional host tools are compiled.
For example, even when a host provides xz, a local xz was compiled
in the past, because other packages had a build dependency on it.
Signed-off-by: Waldemar Brodkorb <wbx@openadk.org>
46 files changed, 1039 insertions, 969 deletions
diff --git a/.gitignore b/.gitignore index 2a5c6bb3b..f5fa5dac6 100644 --- a/.gitignore +++ b/.gitignore @@ -30,12 +30,11 @@ /toolchain_*/ /.ADK_HAVE_DOT_CONFIG /.tmpconfig.h -/.prereq_done /.config* /.busyboxcfg /.rebuild.* /.defconfig -/.adkinit +/.firstrun /.menu /all.config /target_*/ diff --git a/BSDmakefile b/BSDmakefile deleted file mode 100644 index ddf869106..000000000 --- a/BSDmakefile +++ /dev/null @@ -1,27 +0,0 @@ -# This file is part of the OpenADK project. OpenADK is copyrighted -# material, please see the LICENCE file in the top-level directory. - -ADK_TOPDIR= ${.CURDIR} -PWD= ${.CURDIR} - -.include "${.CURDIR}/Makefile.inc" - -.if defined(package) && !empty(package) -subdir:= package/${package} -. if !make(clean) -_subdir_dep:= ${ADK_TOPDIR}/.config -. endif -.endif - -.if defined(subdir) && !empty(subdir) -_subdir:= ${.TARGETS} -${.TARGETS}: _subdir - -_subdir: ${_subdir_dep} - cd ${.CURDIR}/${subdir} && ADK_TOPDIR=${.CURDIR} DEVELOPER=1 \ - ${GMAKE} ADK_VERBOSE=1 ${.MFLAGS} ${_subdir} - -. include "${.CURDIR}/prereq.mk" -.else -. include "${.CURDIR}/Makefile" -.endif @@ -10,7 +10,7 @@ config ADK_MODULES default y config ADK_HAVE_DOT_CONFIG - boolean + bool default y source "target/config/Config.in.appliances" @@ -44,7 +44,7 @@ menu "Package options" visible if !ADK_CHOOSE_APPLIANCE config ADK_LEAVE_ETC_ALONE - boolean "do not install anything into /etc" + bool "do not install anything into /etc" default n help Enabling this option will prevent the ADK from installing anything @@ -60,7 +60,7 @@ config ADK_LEAVE_ETC_ALONE on will almost certainly render the resulting system unusable. config ADK_INSTALL_PACKAGE_INIT_SCRIPTS - boolean "ship custom init-scripts along with packages" + bool "ship custom init-scripts along with packages" default y depends on !ADK_LEAVE_ETC_ALONE help @@ -72,7 +72,7 @@ config ADK_INSTALL_PACKAGE_INIT_SCRIPTS off will almost certainly render the resulting system unusable. config ADK_INSTALL_PACKAGE_NETWORK_SCRIPTS - boolean "ship custom network-scripts along with packages" + bool "ship custom network-scripts along with packages" default y depends on !ADK_LEAVE_ETC_ALONE help diff --git a/GNUmakefile b/GNUmakefile deleted file mode 100644 index 1cd73044e..000000000 --- a/GNUmakefile +++ /dev/null @@ -1,24 +0,0 @@ -# This file is part of the OpenADK project. OpenADK is copyrighted -# material, please see the LICENCE file in the top-level directory. - -ADK_TOPDIR:= $(shell pwd) -PWD:= ${ADK_TOPDIR} - -include Makefile.inc - -ifneq (${package},) -subdir:= package/${package} -_subdir_dep:= ${ADK_TOPDIR}/.config -endif - -ifneq (${subdir},) -${MAKECMDGOALS}: _subdir - -_subdir: ${_subdir_dep} - cd ${subdir} && ADK_TOPDIR=${ADK_TOPDIR} DEVELOPER=1 \ - make ADK_VERBOSE=1 ${MAKEFLAGS} ${MAKECMDGOALS} - -include prereq.mk -else -include Makefile -endif @@ -1,221 +1,8 @@ # This file is part of the OpenADK project. OpenADK is copyrighted # material, please see the LICENCE file in the top-level directory. -_UNLIMIT= __limit=$$(ulimit -dH 2>/dev/null); \ - test -n "$$__limit" && ulimit -Sd $$__limit; ulimit -n 1024; +# GNU make and BSD make compatible make file wrapper +MAKECMDGOALS+= ${.TARGETS} -all: .prereq_done checkreloc - @${_UNLIMIT} ${GMAKE_INV} all - -v: .prereq_done - @(echo; echo "Build started on $$(LC_ALL=C LANGUAGE=C date)"; \ - set -x; ${_UNLIMIT} ${GMAKE_FMK} ADK_VERBOSE=1 all) 2>&1 | tee -a make.log - -help: - @echo 'Configuration targets:' - @echo ' config - Update current config utilising a line-oriented program' - @echo ' menuconfig - Update current config utilising a menu based program' - @echo ' (default when .config does not exist)' - @echo ' oldconfig - Update current config utilising a provided .configs base' - @echo ' defconfig - New config with defaults' - @echo ' allmodconfig - New config selecting all symbols with m' - @echo ' allyesconfig - New config selecting all symbols with y' - @echo ' allnoconfig - New config where all options are answered with no' - @echo '' - @echo 'Help targets:' - @echo ' help - Print this help text' - @echo ' pkg-help - Print help about selectively compiling single packages' - @echo ' dev-help - Print help for developers / package maintainers' - @echo '' - @echo 'Common targets:' - @echo ' download - fetches all needed distfiles' - @echo ' kernelconfig - view the target kernel configuration' - @echo '' - @echo 'Cleaning targets:' - @echo ' clean - Remove firmware and build directories' - @echo ' cleandir - Same as "clean", but also remove all built toolchains' - @echo ' cleansystem - Same as "cleandir", but only remove active system' - @echo ' cleankernel - Remove kernel dir, useful if you changed any kernel patches' - @echo ' distclean - Same as "cleandir", but also remove downloaded' - @echo ' distfiles and .config' - @echo '' - @echo 'Other generic targets:' - @echo ' all - Build everything as specified in .config' - @echo ' (default if .config exists)' - @echo ' v - Same as "all" but with logging to make.log enabled' - -pkg-help: - @echo 'Package specific targets (use with "package=<pkg-name>" parameter):' - @echo ' fetch - Download the necessary distfile' - @echo ' extract - Same as "fetch", but also extract the distfile' - @echo ' patch - Same as "extract", but also patch the source' - @echo ' build - Same as "patch", but also build the binaries' - @echo ' fake - Same as "build", but also install the binaries' - @echo ' package - Same as "fake", but also create the package' - @echo ' clean - Deinstall and remove the build area' - @echo ' distclean - Same as "clean", but also remove the distfiles' - @echo '' - @echo 'Short package rebuilding guide:' - @echo ' run "make package=<pkgname> clean" to remove all generated binaries' - @echo ' run "make package=<pkgname> package" to build everything and create the package(s)' - @echo '' - @echo 'This does not automatically resolve package dependencies!' - -dev-help: - @echo 'Fast way of updating package patches:' - @echo ' run "make package=<pkgname> clean" to start with a good base' - @echo ' run "make package=<pkgname> patch" to fetch, unpack and patch the source' - @echo ' edit the package sources at build_dir/w-<pkgname>-*/<pkgname>-<version>' - @echo ' run "make package=<pkgname> update-patches" to regenerate patch files' - @echo '' - @echo 'All changed patches will be opened with your $$EDITOR,' - @echo 'so you can add a description and verify the modifications.' - @echo '' - @echo 'Adding a new package:' - @echo 'make PKG=foo VER=1.0 newpackage' - @echo 'Adding a new simple library package:' - @echo 'make PKG=foo VER=1.0 TYPE=lib newpackage' - @echo 'Adding a new simple program package:' - @echo 'make PKG=foo VER=1.0 TYPE=prog newpackage' - -clean: .prereq_done - -@rm -f nohup.out - @${GMAKE_INV} clean - -config: .prereq_done - @${GMAKE_INV} _config W= - -oldconfig: .prereq_done - @${GMAKE_INV} _config W=--oldconfig - -download: .prereq_done - @${GMAKE_INV} toolchain/download - @${GMAKE_INV} dep - @${GMAKE_INV} package/download - -cleankernel kernelclean: .prereq_done - -@${GMAKE_INV} cleankernel - -cleandir dirclean: .prereq_done - -@${GMAKE_INV} cleandir - @-rm -f make.log .prereq_done - -cleansystem: .prereq_done - -@${GMAKE_INV} cleansystem - @-rm -f make.log .prereq_done - -distclean cleandist: - -@${GMAKE_INV} distclean - @-rm -f make.log .prereq_done - -image: .prereq_done - @${GMAKE_INV} image - -targethelp: .prereq_done - @${GMAKE_INV} targethelp - -kernelconfig: .prereq_done - @${GMAKE_INV} kernelconfig - -newpackage: .prereq_done - @${GMAKE_INV} newpackage - -image_clean imageclean cleanimage: .prereq_done - @${GMAKE_INV} image_clean - -menuconfig: .prereq_done - @${GMAKE_INV} menuconfig - -defconfig: .prereq_done - @${GMAKE_INV} defconfig - -allnoconfig: .prereq_done - @${GMAKE_INV} KCONFIG_ALLCONFIG=all.config _config W=--allnoconfig - -allyesconfig: .prereq_done - @${GMAKE_INV} KCONFIG_ALLCONFIG=all.config _config W=--allyesconfig - -allmodconfig: .prereq_done - @${GMAKE_INV} KCONFIG_ALLCONFIG=all.config _config W=--allmodconfig - -package_index: .prereq_done - @${GMAKE_INV} package_index - -buildall: .prereq_done - @${GMAKE_INV} buildall - -check: .prereq_done - @${GMAKE_INV} check - -check-gcc: .prereq_done - @${GMAKE_INV} check-gcc - -check-g++: .prereq_done - @${GMAKE_INV} check-g++ - -menu: .prereq_done - @${GMAKE_INV} menu - -dep: .prereq_done - @${GMAKE_INV} dep - -world: .prereq_done - @${GMAKE_INV} world - -prereq: - @rm -f .prereq_done - @${GMAKE} .prereq_done - -prereq-noerror: - @rm -f .prereq_done - @${GMAKE} .prereq_done NO_ERROR=1 - -NO_ERROR=0 -.prereq_done: - @-rm -rf .prereq_done - @if ! bash --version 2>&1 | grep -F 'GNU bash' >/dev/null 2>&1; then \ - echo "GNU bash needs to be installed."; \ - exit 1; \ - fi - @echo "ADK_TOPDIR:=$$(readlink -nf . 2>/dev/null || pwd -P)" >prereq.mk - @echo "BASH:=$$(which bash)" >>prereq.mk - @if [ -z "$$(which gmake 2>/dev/null )" ]; then \ - echo "GMAKE:=$$(which make)" >>prereq.mk ;\ - else \ - echo "GMAKE:=$$(which gmake)" >>prereq.mk ;\ - fi - @echo "GNU_HOST_NAME:=$$(${CC} -dumpmachine)" >>prereq.mk - @echo "ARCH_FOR_BUILD:=$$(${CC} -dumpmachine | sed \ - -e 's/x86_64-linux-gnux32/x32/' \ - -e s'/-.*//' \ - -e 's/sparc.*/sparc/' \ - -e 's/armeb.*/armeb/g' \ - -e 's/arm.*/arm/g' \ - -e 's/m68k.*/m68k/' \ - -e 's/sh[234]/sh/' \ - -e 's/mips-.*/mips/' \ - -e 's/mipsel-.*/mipsel/' \ - -e 's/i[3-9]86/x86/' \ - )" >>prereq.mk - @echo 'HOST_CC:=${CC}' >>prereq.mk - @echo 'HOST_CXX:=${CXX}' >>prereq.mk - @echo 'LANGUAGE:=C' >>prereq.mk - @echo 'LC_ALL:=C' >>prereq.mk - @echo 'MAKE:=$${GMAKE}' >>prereq.mk - @echo "OStype:=$$(env uname)" >>prereq.mk - @echo "_PATH:=$$PATH" >>prereq.mk - @echo "PATH:=\$${ADK_TOPDIR}/scripts:/usr/sbin:$$PATH" >>prereq.mk - @echo "SHELL:=$$(which bash)" >>prereq.mk - @echo "GIT:=$$(which git 2>/dev/null)" >>prereq.mk - @env NO_ERROR=${NO_ERROR} BASH="$$(which bash)" \ - CC='${CC}' CPPFLAGS='${CPPFLAGS}' \ - bash scripts/scan-tools.sh - @echo '===> Prerequisites checked successfully.' - @touch .adkinit - @touch $@ - -checkreloc: - @bash scripts/reloc.sh - -.PHONY: prereq prereq-noerror checkreloc -# DO NOT DELETE +all v help targethelp kernelconfig image menuconfig download clean cleankernel cleansystem cleandir distclean hostclean hostpackage fetch package extract patch dep menu: + @./scripts/prereq.sh ${MAKECMDGOALS} diff --git a/Makefile.adk b/Makefile.adk new file mode 100644 index 000000000..b8fe31e88 --- /dev/null +++ b/Makefile.adk @@ -0,0 +1,179 @@ +# This file is part of the OpenADK project. OpenADK is copyrighted +# material, please see the LICENCE file in the top-level directory. + +ADK_TOPDIR:= $(shell pwd) +GMAKE_FMK= ${MAKE} -f $(PWD)/mk/build.mk +GMAKE_INV= ${GMAKE_FMK} --no-print-directory + +_UNLIMIT= __limit=$$(ulimit -dH 2>/dev/null); \ + test -n "$$__limit" && ulimit -Sd $$__limit; ulimit -n 1024; + +ifneq (${package},) +subdir:= package/${package} +_subdir_dep:= ${ADK_TOPDIR}/.config +endif + +ifneq (${subdir},) +${MAKECMDGOALS}: _subdir + +_subdir: ${_subdir_dep} + cd ${subdir} && ADK_TOPDIR=${ADK_TOPDIR} DEVELOPER=1 \ + $(MAKE) ADK_VERBOSE=1 ${MAKECMDGOALS} + +endif + +all: + @${_UNLIMIT} $(GMAKE_INV) world + +v: + @(echo; echo "Build started on $$(LC_ALL=C LANGUAGE=C date)"; \ + set -x; ${_UNLIMIT} ${GMAKE_FMK} ADK_VERBOSE=1 all) 2>&1 | tee -a make.log + +help: + @echo 'Configuration targets:' + @echo ' config - Update current config utilising a line-oriented program' + @echo ' menuconfig - Update current config utilising a menu based program' + @echo ' (default when .config does not exist)' + @echo ' oldconfig - Update current config utilising a provided .configs base' + @echo ' defconfig - New config with defaults' + @echo ' allmodconfig - New config selecting all symbols with m' + @echo ' allyesconfig - New config selecting all symbols with y' + @echo ' allnoconfig - New config where all options are answered with no' + @echo '' + @echo 'Help targets:' + @echo ' help - Print this help text' + @echo ' pkg-help - Print help about selectively compiling single packages' + @echo ' dev-help - Print help for developers / package maintainers' + @echo '' + @echo 'Common targets:' + @echo ' download - fetches all needed distfiles' + @echo ' kernelconfig - view the target kernel configuration' + @echo '' + @echo 'Cleaning targets:' + @echo ' clean - Remove firmware and build directories' + @echo ' cleandir - Same as "clean", but also remove all built toolchains' + @echo ' cleansystem - Same as "cleandir", but only remove active system' + @echo ' cleankernel - Remove kernel dir, useful if you changed any kernel patches' + @echo ' distclean - Same as "cleandir", but also remove downloaded' + @echo ' distfiles and .config' + @echo '' + @echo 'Other generic targets:' + @echo ' all - Build everything as specified in .config' + @echo ' (default if .config exists)' + @echo ' v - Same as "all" but with logging to make.log enabled' + +pkg-help: + @echo 'Package specific targets (use with "package=<pkg-name>" parameter):' + @echo ' fetch - Download the necessary distfile' + @echo ' extract - Same as "fetch", but also extract the distfile' + @echo ' patch - Same as "extract", but also patch the source' + @echo ' build - Same as "patch", but also build the binaries' + @echo ' fake - Same as "build", but also install the binaries' + @echo ' package - Same as "fake", but also create the package' + @echo ' clean - Deinstall and remove the build area' + @echo ' distclean - Same as "clean", but also remove the distfiles' + @echo '' + @echo 'Short package rebuilding guide:' + @echo ' run "make package=<pkgname> clean" to remove all generated binaries' + @echo ' run "make package=<pkgname> package" to build everything and create the package(s)' + @echo '' + @echo 'This does not automatically resolve package dependencies!' + +dev-help: + @echo 'Fast way of updating package patches:' + @echo ' run "make package=<pkgname> clean" to start with a good base' + @echo ' run "make package=<pkgname> patch" to fetch, unpack and patch the source' + @echo ' edit the package sources at build_dir/w-<pkgname>-*/<pkgname>-<version>' + @echo ' run "make package=<pkgname> update-patches" to regenerate patch files' + @echo '' + @echo 'All changed patches will be opened with your $$EDITOR,' + @echo 'so you can add a description and verify the modifications.' + @echo '' + @echo 'Adding a new package:' + @echo 'make PKG=foo VER=1.0 newpackage' + @echo 'Adding a new simple library package:' + @echo 'make PKG=foo VER=1.0 TYPE=lib newpackage' + @echo 'Adding a new simple program package:' + @echo 'make PKG=foo VER=1.0 TYPE=prog newpackage' + +clean: + @${GMAKE_INV} clean + +config: + @${GMAKE_INV} _config W= + +oldconfig: + @${GMAKE_INV} _config W=--oldconfig + +download: + @${GMAKE_INV} toolchain/download + @${GMAKE_INV} dep + @${GMAKE_INV} package/download + +cleankernel: + -@${GMAKE_INV} cleankernel + +cleandir: + -@${GMAKE_INV} cleandir + +cleansystem: + -@${GMAKE_INV} cleansystem + +distclean: + -${GMAKE_INV} distclean + +image: + @${GMAKE_INV} image + +targethelp: + @${GMAKE_INV} targethelp + +kernelconfig: + @${GMAKE_INV} kernelconfig + +newpackage: + @${GMAKE_INV} newpackage + +image_clean imageclean cleanimage: + @${GMAKE_INV} image_clean + +menuconfig: + @${GMAKE_INV} menuconfig + +defconfig: + @${GMAKE_INV} defconfig + +allnoconfig: + @${GMAKE_INV} KCONFIG_ALLCONFIG=all.config _config W=--allnoconfig + +allyesconfig: + @${GMAKE_INV} KCONFIG_ALLCONFIG=all.config _config W=--allyesconfig + +allmodconfig: + @${GMAKE_INV} KCONFIG_ALLCONFIG=all.config _config W=--allmodconfig + +package_index: + @${GMAKE_INV} package_index + +buildall: + @${GMAKE_INV} buildall + +check: + @${GMAKE_INV} check + +check-gcc: + @${GMAKE_INV} check-gcc + +check-g++: + @${GMAKE_INV} check-g++ + +menu: + @${GMAKE_INV} menu + +dep: + @${GMAKE_INV} dep + +world: + @${GMAKE_INV} world + +# DO NOT DELETE diff --git a/Makefile.inc b/Makefile.inc deleted file mode 100644 index 4cc06dfad..000000000 --- a/Makefile.inc +++ /dev/null @@ -1,4 +0,0 @@ -CC?= gcc -GMAKE?= env ${GMAKE_ENV} $(PWD)/scripts/make -GMAKE_FMK= ${GMAKE} -f $(PWD)/mk/build.mk -GMAKE_INV= ${GMAKE_FMK} --no-print-directory @@ -4,26 +4,25 @@ OpenADK - An embedded Linux construction kit This is a menu based buildsystem for your embedded Linux system. Before you can start you need to install some software: -- bash - gcc or clang - g++ or clang++ - binutils -- GNU make +- make - tar - gzip -- wget - perl +- curl or wget - c library headers - ncurses library and header -- zlib library and header There is a check for the required versions of these software in advance, though. -(to re-issue the checks, use "make prereq"). +Most of the needed software for the build process to succeed will +be compiled before the target build starts. Please use "make menuconfig" to choose your target architecture and embedded system and configure like you want to. -Simply running 'make' will build the firmware for your embedded system. The +Simply running 'make' will build the firmware for your embedded system. The buildsystem will download all sources, build the toolchain, the kernel and all applications. diff --git a/adk/config/Makefile b/adk/config/Makefile index 8481e3bff..48e10983b 100644 --- a/adk/config/Makefile +++ b/adk/config/Makefile @@ -69,19 +69,19 @@ MCONF_OBJS=$(patsubst %.c,%.o, $(MCONF_SRC)) SHARED_OBJS=$(patsubst %.c,%.o, $(SHARED_SRC)) conf: $(CONF_OBJS) $(SHARED_OBJS) - @$(HOST_CC) $(HOST_CFLAGS) $^ -o $@ + @$(HOST_CC) $(HOST_CFLAGS) $^ -o $@ 2>/dev/null mconf: $(MCONF_OBJS) $(SHARED_OBJS) - @$(HOST_CC) $(HOST_CFLAGS) $^ -o $@ $(LIBS) + @$(HOST_CC) $(HOST_CFLAGS) $^ -o $@ $(LIBS) 2>/dev/null $(CONF_OBJS): %.o : %.c $(SHARED_DEPS) - @$(HOST_CC) $(HOST_CFLAGS) -I. -c $< -o $@ + @$(HOST_CC) $(HOST_CFLAGS) -I. -c $< -o $@ 2>/dev/null $(MCONF_OBJS): %.o : %.c $(SHARED_DEPS) - @$(HOST_CC) $(HOST_CFLAGS) -I. -c $< -o $@ + @$(HOST_CC) $(HOST_CFLAGS) -I. -c $< -o $@ 2>/dev/null glob.o: glob.c $(SHARED_DEPS) - @$(HOST_CC) $(HOST_CFLAGS) -I. -c glob.c -o $@ + @$(HOST_CC) $(HOST_CFLAGS) -I. -c glob.c -o $@ 2>/dev/null lkc_defs.h: lkc_proto.h @sed < $< > $@ 's/P(\([^,]*\),.*/#define \1 (\*\1_p)/' diff --git a/adk/tools/depmaker.c b/adk/tools/depmaker.c index d5ef100a8..275fa4ed5 100644 --- a/adk/tools/depmaker.c +++ b/adk/tools/depmaker.c @@ -1,7 +1,7 @@ /* * depmaker - create package/Depends.mk for OpenADK buildsystem * - * Copyright (C) 2010-2014 Waldemar Brodkorb <wbx@openadk.org> + * Copyright (C) 2010-2015 Waldemar Brodkorb <wbx@openadk.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -67,8 +67,9 @@ static int check_symbol(char *symbol) { /*@null@*/ static char *parse_line(char *package, char *pkgvar, char *string, int checksym, int pprefix, int system, int *prefixp) { - char *key, *value, *dep, *key_sym, *pkgdeps; + char *key, *value, *dep, *key_sym, *pkgdeps, *depvar; char temp[MAXLINE]; + int i; string[strlen(string)-1] = '\0'; if ((key = strtok(string, ":=")) == NULL) { @@ -121,6 +122,51 @@ static char *parse_line(char *package, char *pkgvar, char *string, int checksym, value = strtok(NULL, "=\t"); dep = strtok(value, " "); while (dep != NULL) { + /* check only for optional host tools, if they are required to build */ + if (checksym == 2) { + if ((depvar = malloc(MAXLINE)) != NULL) + memset(depvar, 0, MAXLINE); + else { + perror("Can not allocate memory."); + exit(EXIT_FAILURE); + } + strncat(depvar, dep, strlen(dep)-5); + if ((strncmp(depvar, "bc", 2) == 0) || + (strncmp(depvar, "file", 4) == 0) || + (strncmp(depvar, "gawk", 4) == 0) || + (strncmp(depvar, "grep", 4) == 0) || + (strncmp(depvar, "patch", 5) == 0) || + (strncmp(depvar, "sed", 3) == 0) || + (strncmp(depvar, "xz", 2) == 0)) { + + /* transform to uppercase variable name */ + for (i=0; i<(int)strlen(depvar); i++) { + if (depvar[i] == '+') + depvar[i] = 'X'; + if (depvar[i] == '-') + depvar[i] = '_'; + depvar[i] = toupper(depvar[i]); + } + + /* extract symbol */ + if ((key_sym = malloc(MAXLINE)) != NULL) + memset(key_sym, 0, MAXLINE); + else { + perror("Can not allocate memory."); + exit(EXIT_FAILURE); + } + if (snprintf(key_sym, MAXLINE, "ADK_HOST_BUILD_%s", depvar) < 0) + perror("Can not create string variable."); + + if (check_symbol(key_sym) != 0) { + free(key_sym); + free(depvar); + return(NULL); + } + free(key_sym); + free(depvar); + } + } if (*prefixp == 0) { *prefixp = 1; if (snprintf(temp, MAXLINE, "%s-compile: %s-compile", package, dep) < 0) @@ -295,7 +341,7 @@ int main() { } else if (strncmp(buf, "HOST_BUILDDEP", 13) == 0) { asprintf(&string, "%s-host", pkgdirp->d_name); // check retval; string for NULL - tmp = parse_line(string, NULL, buf, 0, 0, 0, &hprefix); + tmp = parse_line(string, NULL, buf, 2, 0, 0, &hprefix); if (tmp && *tmp) { asprintf(&string, "%s%s", hpkgdeps ? hpkgdeps : "", diff --git a/mk/build.mk b/mk/build.mk index 3d0124cca..d7e32110c 100644 --- a/mk/build.mk +++ b/mk/build.mk @@ -1,9 +1,6 @@ # This file is part of the OpenADK project. OpenADK is copyrighted # material, please see the LICENCE file in the top-level directory. -ADK_TOPDIR=$(shell pwd) -export ADK_TOPDIR - CONFIG_CONFIG_IN = Config.in CONFIG = adk/config DEFCONFIG= ADK_DEBUG=n \ @@ -95,9 +92,7 @@ noconfig_targets:= menuconfig \ defconfig POSTCONFIG= -@\ - if [ -f .adkinit ];then rm .adkinit;\ - else \ - if [ -f .config.old ];then \ + if [ ! -f .firstrun ]; then \ $(ADK_TOPDIR)/adk/tools/pkgrebuild;\ rebuild=0; \ cleandir=0; \ @@ -133,22 +128,14 @@ POSTCONFIG= -@\ cleandir=1;\ rebuild=1;\ fi; \ - if [ "$$(grep ^ADK_TARGET_ARCH .config|md5sum)" != "$$(grep ^ADK_TARGET_ARCH .config.old|md5sum)" ];then \ - cleandir=1;\ - rebuild=1;\ - fi; \ - if [ "$$(grep ^ADK_TARGET_SYSTEM .config|md5sum)" != "$$(grep ^ADK_T |