]> rtime.felk.cvut.cz Git - l4.git/blobdiff - l4/mk/Makeconf
Update
[l4.git] / l4 / mk / Makeconf
index 6a3a4252c1047f33e2ae84dfacad27e7c677a8a4..47a9d831e21c0fcb6b57472cd7e97b7407706dba 100644 (file)
@@ -1,8 +1,6 @@
 # -*- Makefile -*-
 # vim:set ft=make:
 #
-# DROPS (Dresden Realtime OPerating System) Component
-#
 # Make configuration file
 #
 # This file is included by all Makefile-templates. This file defines macros
@@ -27,7 +25,7 @@
 ifeq ($(origin _L4DIR_MK_MAKECONF),undefined)
 _L4DIR_MK_MAKECONF=y
 
-MAKEFLAGS        += -R
+MAKEFLAGS        += --no-print-directory -Rr
 
 # the default target is all
 all::
@@ -35,53 +33,28 @@ all::
 # make .general.d dependent on the role-file
 $(if $(ROLE),$(OBJ_DIR)/.general.d: $(L4DIR)/mk/$(ROLE))
 
-SYSTEM_TARGET_arm     = arm-linux-
-SYSTEM_TARGET_ppc32   = powerpc-linux-
-SYSTEM_TARGET_sparc   = sparc-elf-
-SYSTEM_TARGET         = $(SYSTEM_TARGET_$(ARCH))
-
-CARCHFLAGS_amd64    = -mno-red-zone
-ASFLAGS_amd64       = -m64
-LDFLAGS_amd64      += -m elf_x86_64 -z max-page-size=0x1000 -z common-page-size=0x1000
-
-LD_EMULATION_CHOICE_amd64   = elf_x86_64
-LD_EMULATION_CHOICE_arm     = armelf armelf_linux_eabi
-LD_EMULATION_CHOICE_ppc32   = elf32ppc
-LD_EMULATION_CHOICE_x86     = elf_i386
-LD_EMULATION_CHOICE_sparc   = sparcleon
-
-OFORMAT_amd64     = elf64-x86-64
-OFORMAT_arm       = elf32-littlearm
-OFORMAT_ppc32     = elf32-powerpc
-OFORMAT_x86       = elf32-i386
-OFORMAT_sparc     = elf32-sparc
-OFORMAT           = $(OFORMAT_$(ARCH))
+-include $(wildcard $(L4DIR)/mk/arch/Makeconf.*)
+
+ifneq ($(SYSTEM_TARGET),) # Added late 2015
+  CROSS_COMPILE=$(SYSTEM_TARGET)
+  $(info The variable SYSTEM_TARGET has been deprecated in favor of CROSS_COMPILE.)
+endif
+
+CROSS_COMPILE    ?= $(CROSS_COMPILE_$(ARCH))
 
-BFD_ARCH_amd64    = i386
-BFD_ARCH_arm      = arm
-BFD_ARCH_ppc32    = powerpc
-BFD_ARCH_x86      = i386
-BFD_ARCH_sparc    = sparc
-BFD_ARCH          = $(BFD_ARCH_$(ARCH))
 
-L4_KIP_ADDR_amd64   ?= 0x6ffff000
-L4_KIP_ADDR_arm     ?= 0xaffff000
-L4_KIP_ADDR_ppc32   ?= 0xaffff000
-L4_KIP_ADDR_x86     ?= 0xaffff000
-L4_KIP_ADDR_sparc   ?= 0xaffff000
+OFORMAT           = $(OFORMAT_$(ARCH))
+BFD_ARCH          = $(BFD_ARCH_$(ARCH))
 L4_KIP_ADDR         ?= $(L4_KIP_ADDR_$(ARCH))
 
 L4_KIP_OFFS_SYS_INVOKE   = 0x800
 L4_KIP_OFFS_SYS_DEBUGGER = 0x900
-
-L4_STACK_ADDR_amd64     ?= 0x70000000
-L4_STACK_ADDR_arm       ?= 0xb0000000
-L4_STACK_ADDR_ppc32     ?= 0xb0000000
-L4_STACK_ADDR_x86       ?= 0xb0000000
-L4_STACK_ADDR_sparc     ?= 0xb0000000
 L4_STACK_ADDR           ?= $(L4_STACK_ADDR_$(ARCH))
 L4_STACK_SIZE           ?= $(if $(L4_STACK_SIZE_MAIN_THREAD),$(L4_STACK_SIZE_MAIN_THREAD),0x8000)
 
+CC_WHITELIST-gcc     := 4.6 4.7 4.8 4.9 5
+CC_WHITELIST-clang   := 3.5 3.6 3.7 4.9
+
 # This is quite bad: There is no other chance to disable the page-alignedment
 # of the linker. The linker aligns the first section at 0x100000 for AMD64!
 # We don't want this. Be careful for interactions with objcopy -S!
@@ -93,69 +66,27 @@ DEPEND_VERBOSE   = $(if $(CONFIG_DEPEND_VERBOSE),,@)
 DROPS_STDDIR     = $(patsubst "%",%,$(CONFIG_DROPS_STDDIR))
 DROPS_INSTDIR    = $(patsubst "%",%,$(CONFIG_DROPS_INSTDIR))
 RAM_SIZE_MB      = $(CONFIG_RAM_SIZE_MB)
-RAM_BASE         = $(CONFIG_RAM_BASE)
-ARM_PLATFORM_TYPE= $(patsubst "%",%,$(CONFIG_ARM_PLATFORM_TYPE))
-PPC_PLATFORM_TYPE= $(patsubst "%",%,$(CONFIG_PPC_PLATFORM_TYPE))
-SPARC_PLATFORM_TYPE= $(patsubst "%",%,$(CONFIG_SPARC_PLATFORM_TYPE))
+PLATFORM_TYPE    = $(patsubst "%",%,$(CONFIG_PLATFORM_TYPE))
 CPU              = $(patsubst "%",%,$(CONFIG_CPU))
 BUILD_ABI        = $(patsubst "%",%,$(CONFIG_BUILD_ABI))
 BUILD_ARCH       = $(patsubst "%",%,$(CONFIG_BUILD_ARCH))
-LABEL            = $(patsubst "%",%,$(CONFIG_LABEL))
-
-CARCHFLAGS_x86_586        = -march=i586
-CARCHFLAGS_x86_pentium    = -march=i586
-CARCHFLAGS_x86_pentiummmx = -march=pentium-mmx
-CARCHFLAGS_x86_pentiumpro = -march=pentiumpro
-CARCHFLAGS_x86_686        = -march=i686
-CARCHFLAGS_x86_pentium2   = -march=pentium2
-CARCHFLAGS_x86_pentium3   = -march=pentium3
-CARCHFLAGS_x86_pentiumm   = -march=pentium-m
-CARCHFLAGS_x86_pentium4   = -march=pentium4
-CARCHFLAGS_x86_prescott   = -march=prescott
-CARCHFLAGS_x86_nocona     = -march=nocona
-CARCHFLAGS_x86_core2      = -march=core2
-CARCHFLAGS_x86_K6         = -march=k6
-CARCHFLAGS_x86_K7         = -march=athlon
-CARCHFLAGS_x86_athlon4    = -march=athlon-4
-CARCHFLAGS_x86_K8         = -march=k8
-CARCHFLAGS_x86_opteron    = -march=opteron
-
-CARCHFLAGS_arm_armv4      = -march=armv4
-CARCHFLAGS_arm_armv4t     = -march=armv4t
-CARCHFLAGS_arm_armv5      = -march=armv5
-CARCHFLAGS_arm_armv5t     = -march=armv5t
-CARCHFLAGS_arm_armv5te    = -march=armv5te
-CARCHFLAGS_arm_armv6      = -march=armv6
-CARCHFLAGS_arm_armv6t2    = -march=armv6t2
-CARCHFLAGS_arm_armv6zk    = -march=armv6zk
-CARCHFLAGS_arm_armv7a     = -march=armv7-a
-CARCHFLAGS_arm_armv7r     = -march=armv7-r
-
-IDL_SYSTEMS    = x86-l4f
-
-CC_x86          = $(SYSTEM_TARGET)gcc -m32
-CC_amd64        = $(SYSTEM_TARGET)gcc -m64
-CC_arm          = $(SYSTEM_TARGET)gcc
-CC_ppc32        = $(SYSTEM_TARGET)gcc -m32
-CC_sparc        = $(SYSTEM_TARGET)gcc -m32
-CXX_x86         = $(SYSTEM_TARGET)g++ -m32
-CXX_amd64       = $(SYSTEM_TARGET)g++ -m64
-CXX_arm         = $(SYSTEM_TARGET)g++
-CXX_ppc32       = $(SYSTEM_TARGET)g++ -m32
-CXX_sparc       = $(SYSTEM_TARGET)g++ -m32
-
-SYSTEMS_ABI    := x86-l4f amd64-l4f arm-l4f ppc32-l4f sparc-l4f
-SYSTEMS_PLAIN  := x86     amd64     arm     ppc32     sparc
-
-AR             = $(SYSTEM_TARGET)ar
-AS             = $(SYSTEM_TARGET)as
-AWKP           = gawk --posix
-CC             = $(if $(USE_CCACHE),ccache) $(CC_$(BUILD_ARCH))
-CXX            = $(if $(USE_CCACHE),ccache) $(CXX_$(BUILD_ARCH))
-CP             = cp
+MAKECONFS_ADD    = $(patsubst "%,%,$(patsubst %",%,$(CONFIG_MAKECONFS_ADD))) #"
+
+CCXX_FLAGS        = $(CCXX_FLAGS_$(BUILD_ARCH))
+
+dv               = $(if $(filter-out default undefined,$(origin $(1))),$(1)-default,$(1))
+
+$(call dv,AR)   = $(CROSS_COMPILE)ar
+$(call dv,AS)   = $(CROSS_COMPILE)as
+AWKP           ?= gawk --posix
+CCACHE          ?= ccache
+$(call dv,CC)    = $(if $(USE_CCACHE),$(CCACHE) )$(CC_$(BUILD_ARCH))
+$(call dv,CXX)   = $(if $(USE_CCACHE),$(CCACHE) )$(CXX_$(BUILD_ARCH))
+$(call dv,FC)    = $(if $(USE_CCACHE),$(CCACHE) )$(FC_$(BUILD_ARCH))
+CP             ?= cp
 DICE_SRCDIR    ?= $(L4DIR)/../dice
 DICE_OBJDIR    ?= $(DICE_SRCDIR)
-DICE           = $(firstword $(wildcard $(DICE_OBJDIR)/src/dice \
+DICE           ?= $(firstword $(wildcard $(DICE_OBJDIR)/src/dice \
                                $(DROPS_STDDIR)/tool/bin/dice \
                                 $(shell which dice 2>/dev/null) ) \
                                 did_not_find_dice___please_install_dice )
@@ -164,7 +95,7 @@ DICE_CPP_NAME        = cpp0
 DICE_INCDIR    ?= $(DICE_SRCDIR)/include
 
 DOXYGEN                ?= doxygen
-ECHO           = echo
+ECHO           ?= echo
 ELF_PATCHER     = $(OBJ_BASE)/tool/elf-patcher/elf-patcher
 
 GENOFFSETS     = $(L4DIR)/tool/bin/genoffsets.pl
@@ -172,48 +103,64 @@ GOSH              = $(firstword $(wildcard $(L4DIR)/../tools/gosh/gosh \
                                $(DROPS_STDDIR)/tool/bin/gosh \
                                 $(shell which gosh 2>/dev/null) ) \
                                 did_not_find_gosh___please_install_gosh )
-HOST_CC                = gcc
-HOST_CXX       = g++
-INDENT         = indent -sob
+HOST_CC                ?= gcc
+HOST_CXX       ?= g++
+HOST_LD                ?= ld
 INSTALL                = install
-LD             = $(SYSTEM_TARGET)ld
+$(call dv,LD)   = $(CROSS_COMPILE)ld -m $(LD_EMULATION)
 LATEX          = latex
 PDFLATEX       = pdflatex
 GREP           = GREP_OPTIONS= grep
 LN             = ln
 MKDIR          = mkdir -p
 MKFLAGS                +=$(MKFLAGS_$@)
-NM             = $(SYSTEM_TARGET)nm
-OBJCOPY                = $(SYSTEM_TARGET)objcopy
+NM             ?= $(CROSS_COMPILE)nm
+OBJCOPY                ?= $(CROSS_COMPILE)objcopy
 PKG_CONFIG      = pkg-config
-PWDCMD         = sh -c pwd
-RANLIB         = $(SYSTEM_TARGET)ranlib
-RM             = rm -f
+PWDCMD         = pwd -P
+RANLIB         ?= $(CROSS_COMPILE)ranlib
+$(call dv,RM)   = rm -f
 SCRUB          = $(RM) $(wildcard *.old) $(wildcard *~) $(wildcard *.bak) \
-                        $(wildcard \#*\#)
+                       $(wildcard \#*\#)
 SED            = sed
 SHELL          = bash
-SIZE           = $(SYSTEM_TARGET)size
-STRIP          = $(SYSTEM_TARGET)strip
+SIZE           ?= $(CROSS_COMPILE)size
+STRIP          ?= $(CROSS_COMPILE)strip
 SVN            = svn
 TR             = tr
 GEN_DOPECODE   = $(L4DIR)/tool/gen_dopecode/gen_dopecode
 ABS2REL                = $(L4DIR)/tool/bin/abs2rel.sh
-# it's optional to be able to set it as environment variable
+# it is optional to be able to set it as environment variable
 FIASCOUX       ?= $(L4DIR)/../kernel/fiasco/build-ux/fiasco
 PAGER          ?= less
-DISASM_CMD      ?= $(SYSTEM_TARGET)objdump -lCSd $(1) | $(PAGER)
+DISASM_CMD      ?= $(CROSS_COMPILE)objdump -lCSd $(1) | $(PAGER)
 IMAGES_DIR      ?= $(OBJ_BASE)/images
 
-
 # functions that are handy
 absfilename_target_dir_needs_to_exist = $(foreach w,$(1),$(addsuffix /$(notdir $(w)),$(shell cd $(dir $(w)) 2>/dev/null&&$(PWDCMD))))
-absfilename     = $(shell $(L4DIR)/mk/rel2abs.sh $(1))
+absfilename     = $(shell PWD=$$($(PWDCMD)) $(L4DIR)/mk/rel2abs.sh $(1))
 findfile       = $(firstword $(wildcard $(addsuffix /$(1),$(2))) $(1)_NOT_FOUND)
 is_dir          = $(shell test -d '$(1)' && echo yes)
+define create_dir
+  $(if $(wildcard $(1)),,$(VERBOSE)$(INSTALL) -d $(1))
+endef
+
+# Move $(2) to $(1) if content of both files differ
+define move_if_changed
+  $(VERBOSE)if test ! -r "$(1)" || ! cmp -s $(1) $(2); then \
+    mv $(2) $(1); \
+  else \
+    rm $(2); \
+  fi
+endef
+
+ifneq ($(PT),)
+  PLATFORM_TYPE := $(PT)
+endif
 
 # include this one early to be able to set OBJ_BASE
 -include $(L4DIR)/Makeconf.local
+-include $(L4DIR)/conf/Makeconf.local
 
 ifeq ($(filter $(IGNORE_OBJDIR_TARGETS),$(MAKECMDGOALS)),)
 # output directory
@@ -240,7 +187,7 @@ ifeq ($(origin PKGDIR_ABS),undefined)
 PKGDIR_ABS     := $(call absfilename,$(PKGDIR))
 endif
 ifeq ($(origin SRC_DIR),undefined)
-SRC_DIR        := $(shell pwd)
+SRC_DIR        := $(shell $(PWDCMD))
 endif
 ifeq ($(origin SRC_BASE_ABS),undefined)
 SRC_BASE     ?= $(L4DIR)
@@ -303,17 +250,45 @@ endif
 # if we're working on a program that wants the RAM_BASE be considered in its
 # linking address, source a possible privately configured one
 ifneq ($(RELOC_PHYS),)
--include $(OBJ_BASE)/Makeconf.ram_base
-EXTRA_GENERAL_D_DEP += $(if $(wildcard $(OBJ_BASE)/Makeconf.ram_base),$(OBJ_BASE)/Makeconf.ram_base)
+INCLUDE_BOOT_CONFIG := required
 endif
 
-INCLUDE_MAKE_RULES += $(if $(LABEL),$(L4DIR)/Makeconf.$(LABEL))
+ifneq ($(INCLUDE_BOOT_CONFIG),)
+ PLATFORM_CONF_FILE := $(firstword $(wildcard $(L4DIR)/conf/platforms/$(PLATFORM_TYPE).conf $(L4DIR)/mk/platforms/$(PLATFORM_TYPE).conf))
+ ifneq ($(PLATFORM_TYPE),$(patsubst "%",%,$(CONFIG_PLATFORM_TYPE)))
+  include $(PLATFORM_CONF_FILE)
+ else
+  ifneq ($(CONFIG_PLATFORM_TYPE_custom),)
+   PLATFORM_RAM_BASE=$(CONFIG_PLATFORM_RAM_BASE)
+   PLATFORM_RAM_SIZE_MB=$(CONFIG_PLATFORM_RAM_SIZE_MB)
+   PLATFORM_UART_NR=$(CONFIG_PLATFORM_UART_NR)
+  else
+   ifeq ($(INCLUDE_BOOT_CONFIG),optional)
+    -include $(PLATFORM_CONF_FILE)
+   else
+    include $(PLATFORM_CONF_FILE)
+   endif
+  endif
+ endif
+ -include $(L4DIR)/conf/Makeconf.boot
+ -include $(OBJ_BASE)/conf/Makeconf.boot
+ -include $(OBJ_BASE)/Makeconf.ram_base
+ BID_RAM_BASE_DEP := $(if $(wildcard $(OBJ_BASE)/Makeconf.ram_base),$(OBJ_BASE)/Makeconf.ram_base)
+ ifeq ($(RAM_BASE),)
+  RAM_BASE := 0
+ endif
+ RAM_SIZE_MB := $(if $(RAM_SIZE_MB),$(RAM_SIZE_MB),$(PLATFORM_RAM_SIZE_MB))
+endif
+
+INCLUDE_MAKE_RULES += $(foreach m,$(MAKECONFS_ADD),$(SRC_DIR)/Makeconf.$(m))
 
-ifneq ($(strip $(wildcard $(INCLUDE_MAKE_RULES))),)
--include $(wildcard $(INCLUDE_MAKE_RULES))
+INCLUDE_MAKE_RULES_EXPANDED := $(foreach m,$(INCLUDE_MAKE_RULES),$(wildcard $(m)))
+ifneq ($(strip $(INCLUDE_MAKE_RULES_EXPANDED)),)
+-include $(INCLUDE_MAKE_RULES_EXPANDED)
 endif
 
 -include $(OBJ_BASE)/Makeconf.local
+-include $(OBJ_BASE)/conf/Makeconf.local
 ifneq ($(PKGDIR_ABS),)
 -include $(PKGDIR_ABS)/Makeconf.local
 endif
@@ -322,9 +297,6 @@ MAKECONFLOCAL ?= Makeconf.local
 -include $(MAKECONFLOCAL)
 
 DROPS_STDDIR   ?= /home/drops
-ifeq ($(STATICFILE),)
-STATICFILE     = $(OBJ_BASE)/pkg/STATIC $(L4DIR)/pkg/STATIC
-endif
 
 # a nasty workaround for make-3.79/make-3.80. The former needs an additional
 # $$ for $-quotation when calling a function.
@@ -339,11 +311,6 @@ PL_j := -j $(PL)
 export PL
 endif
 
-BID_INT_NOEXC=n
-ifeq ($(MODE_NOEXC),y)
-BID_INT_NOEXC=y
-endif
-
 include $(L4DIR)/mk/config.inc
 
 ifneq ($(CONFIG_HAVE_LDSO),)
@@ -376,39 +343,88 @@ ifeq ($(HOST_SYSTEM),darwin)
 endif
 MAKEDEP=$(LD_GENDEP_PREFIX) \
                GENDEP_TARGET=$(if $(2),$(2),$@) \
-               GENDEP_BINARY=$(1) $(if $(3),GENDEP_DEPFILE=$(3)) \
+               GENDEP_BINARY=$(firstword $(1)) $(if $(3),GENDEP_DEPFILE=$(3)) \
                $(if $(4),GENDEP_BINARY_ALT1=$(4))
 endif
 
+# We recognize the following Fortran file extensions.
+FORTRAN_FILE_EXTENSIONS = .f .F .f90 .F90 .f95 .F95
+
 # macros used here and in packages
-checkcc   = $(shell if $(CC) $(1) -o /dev/null -c -x c \
+checkcc   = $(shell if $(CC)  $(CCXX_FLAGS) $(1) -o /dev/null -c -x c \
                     /dev/null > /dev/null 2>&1; then echo "$(1)"; fi)
-checkcxx  = $(shell if $(CXX) $(1) -o /dev/null -c -x c++ \
+checkcxx  = $(shell if $(CXX) $(CCXX_FLAGS) $(1) -o /dev/null -c -x c++ \
                     /dev/null > /dev/null 2>&1; then echo "$(1)"; fi)
 
-# the gcc specific variables: version, base dir, include dir, gcc lib
+callcc    = LC_ALL=C $(CC)  $(CCXX_FLAGS)
+callcxx   = LC_ALL=C $(CXX) $(CCXX_FLAGS)
+callfc    = LC_ALL=C $(FC)  $(CCXX_FLAGS)
+
+define get_gccversion
+  v=$$($(callcc) -dumpversion); \
+  first=$${v%%.*}; \
+  if [ $$first -ge 5 ]; then \
+    echo $$first; \
+  else \
+    echo $$v | sed -e 's/\([^.]\+\.[^.]\+\).*/\1/'; \
+  fi
+endef
+
+get_cc_version_part = $(shell echo $(1) | $(callcc) -E -x c - | tail -1)
+
+# the gcc specific variables: version, base dir, include dir, gcc lib, ...
 # note: determining these variables is slow, and the values should
 #       be set in .config.all. However, this is the place were
 #       they are determined on a 'make config' in $(L4DIR)
-GCCVERSION_f   = $(shell $(CC) -dumpversion | sed -e 's/\(.*\)\..*/\1/')
-GCCMAJORVERSION_f=$(shell $(CC) -dumpversion | sed -e 's/\([^.]*\).*/\1/')
-GCCMINORVERSION_f=$(shell $(CC) -dumpversion | sed -e 's/[^.]*\.\([^.]*\).*/\1/')
-GCCSUBVERSION_f        = $(shell $(CC) -dumpversion | sed -e 's/.*\.\(.*\)/\1/')
-LDVERSION_f     = $(shell $(LD) -v | sed -e 's/.* \([0-9]\)\.\([^. ]*\).*/\1\2/')
-GCCSYSLIBDIRS_f = $(shell LC_ALL=C $(CC) -print-search-dirs | sed '/^libraries:/{s/^libraries: /-L/;s/:/ -L/g;q;};d')
-GCCDIR_f       = $(shell LC_ALL=C $(CC) -print-search-dirs|sed -ne 's+^install: \(.*[^/][^/]*\)/+\1+p' )
-GCCLIBDIR_f    = $(shell LC_ALL=C $(CC) -print-file-name=)
-GCCLIB_f       = $(shell $(CC) -print-libgcc-file-name)
-GCCLIB_EH_f    = $(filter /%,$(shell $(CC) -print-file-name=libgcc_eh.a))
+BID_COMPILER_TYPE_f = $(if $(findstring clang, $(shell $(callcc) --version)),clang,gcc)
+
+GCCVERSION_f_clang = 4.9
+GCCMAJORVERSION_f_clang = 4
+GCCMINORVERSION_f_clang = 9
+GCCPATCHLEVEL_f_clang   = 0
+
+GCCVERSION_f_gcc      =$(shell $(get_gccversion))
+GCCMAJORVERSION_f_gcc =$(call get_cc_version_part, __GNUC__)
+GCCMINORVERSION_f_gcc =$(call get_cc_version_part, __GNUC_MINOR__)
+GCCPATCHLEVEL_f_gcc   =$(call get_cc_version_part, __GNUC_PATCHLEVEL__)
+
+GCCVERSION_f     =$(GCCVERSION_f_$(BID_COMPILER_TYPE_f))
+GCCMAJORVERSION_f=$(GCCMAJORVERSION_f_$(BID_COMPILER_TYPE_f))
+GCCMINORVERSION_f=$(GCCMINORVERSION_f_$(BID_COMPILER_TYPE_f))
+GCCPATCHLEVEL_f  =$(GCCPATCHLEVEL_f_$(BID_COMPILER_TYPE_f))
+
+LDVERSION_f     = $(shell $(firstword $(LD)) -v | sed -e 's/.* \([0-9]\)\.\([^. ]*\).*/\1\2/')
+GCCSYSLIBDIRS_f = $(shell $(callcc) -print-search-dirs | sed '/^libraries:/{s/^libraries: =\?/-L/;s/:/ -L/g;q;};d')
+GCCDIR_f       = $(shell $(callcc) -print-search-dirs | sed -ne 's+^install: \(.*[^/][^/]*\)/+\1+p' )
+GCCLIB_file_f   = $(shell $(callcc) -print-file-name=$(1))
+GCCLIB_HOST_f  = $(shell $(callcc) -print-libgcc-file-name)
+GCCLIB_S_SO_f  = $(filter /%,$(shell $(callcc) -print-file-name=libgcc_s.so))
+GCCLIB_EH_f    = $(filter /%,$(shell $(callcc) -print-file-name=libgcc_eh.a))
 GCCINCDIR_f    = $(addprefix $(call GCCDIR_f),/include /include-fixed)
 GCCNOSTACKPROTOPT_f= $(call checkcc,-fno-stack-protector)
-
+GCCSTACKPROTOPT_f = $(call checkcc,-fstack-protector)
+GCCSTACKPROTALLOPT_f = $(call checkcc,-fstack-protector-all)
+GCCFORTRANAVAIL_f = $(shell echo | $(callfc) -dD -E - 2>&1 | grep -q __GNUC__ && echo y)
+GCC_HAS_ATOMICS_f = $(shell if echo '\#include <bits/c++config.h>' | \
+                              $(callcxx) -dD -E -x c++ - | \
+                              grep -q _GLIBCXX_ATOMIC_BUILTINS; then \
+                                echo y; fi)
+
+BID_NOSTDINC_clang ?= #-nostdlibinc
+BID_NOSTDINC_gcc   ?= -nostdinc
+BID_NOSTDINC       ?= $(BID_NOSTDINC_$(BID_COMPILER_TYPE))
+ifneq ($(strip $(GCCDIR)),)
 GCCINCDIR      = $(GCCDIR)/include $(GCCDIR)/include-fixed
-I_GCCINCDIR    = $(addprefix -I,$(GCCINCDIR))
+I_GCCINCDIR    = $(addprefix -isystem ,$(GCCINCDIR))
+endif
+
+GCCLIB          = $(OBJ_BASE)/lib/$(subst -,/,$(SYSTEM))/libgcc.a
+GCCLIB_SO       = $(OBJ_BASE)/lib/$(subst -,/,$(SYSTEM))/libgcc.$(if $(filter %l4f,$(SYSTEM)),so,a)
 
+PKGNAME_DIRNAME := $(notdir $(abspath $(if $(PKGDIR),$(PKGDIR),.)))
 ifneq ($(PKGDIR),)
   ifeq ($(origin PKGNAME),undefined)
-    PKGNAME := $(notdir $(shell cd $(PKGDIR);pwd))
+    PKGNAME := $(PKGNAME_DIRNAME)
   endif
 endif
 
@@ -424,19 +440,17 @@ ifeq ($(D),1)
 endif
 
 ifeq ($(CONFIG_RELEASE_MODE),y)
-DEFINES                += -DL4BID_RELEASE_MODE
+DEFINES                += -DL4BID_RELEASE_MODE -DNDEBUG
 endif
 
-ifeq ($(ARCH),arm)
-ifeq ($(RAM_BASE),)
-$(error RAM_BASE not given, needed for ARM architecture builds.)
-endif
-else #arch != arm
-  RAM_BASE     = 0x0
+ifneq ($(filter linux host,$(MODE)),)
+HOST_LINK        := 1
+HOST_LINK_HOST   := 1
 endif
 
-ifneq ($(filter linux l4linux host,$(MODE)),)
-HOST_LINK      := 1
+ifneq ($(filter l4linux,$(MODE)),)
+HOST_LINK        := 1
+HOST_LINK_TARGET := 1
 endif
 
 #
@@ -462,15 +476,7 @@ endif
 all:: $(OBJ_DIR)/Makefile
 
 $(OBJ_DIR)/Makefile: $(L4DIR)/mk/Makeconf
-       $(VERBOSE)install -d $(dir $@)
-       $(VERBOSE)echo '# automatically created -- modifications will be lost' > $@
-       $(VERBOSE)echo 'SRC := $(SRC_DIR)'                                    >> $@
-       $(VERBOSE)echo 'OBJ := $(OBJ_BASE)'                                   >> $@
-       $(VERBOSE)echo '.PHONY: x $$(MAKECMDGOALS)'                           >> $@
-       $(VERBOSE)echo 'x:'                                                   >> $@
-       $(VERBOSE)echo '        @PWD=$$(SRC) $$(MAKE) -C $$(SRC) O=$$(OBJ)'    >> $@
-       $(VERBOSE)echo '$$(MAKECMDGOALS):'                                    >> $@
-       $(VERBOSE)echo '        @PWD=$$(SRC) $$(MAKE) -C $$(SRC) O=$$(OBJ) $$@'>> $@
+       $(call build_obj_redir_Makefile,$@)
 
 else
 # we are within an OBJ-*/ dir, create dummy target
@@ -493,8 +499,8 @@ endif
 # if-readable magic .general.d is used on existance or non-existence.
 
 BID_DEPEND_GENERAL_D_COND = \
-       if [ -r $(1) ] ; then echo -e '$@: $(1)\n$(1):\n' >>$@ ; \
-         else echo '$$(if $$(wildcard $(1)), $@: FORCE)' >>$@; fi
+       if [ -r $(1) ] ; then echo -e '$@: $(strip $(1))\n$(strip $(1)):\n' >>$@ ; \
+         else echo '$$(if $$(wildcard $(strip $(1))), $@: FORCE)' >>$@; fi
 
 ifeq ($(SYSTEM),)
 GENERAL_D_LOC := $(OBJ_DIR)/.general.d
@@ -505,6 +511,7 @@ endif
 $(GENERAL_D_LOC): $(L4DIR)/mk/Makeconf $(EXTRA_GENERAL_D_DEP)
        @$(BUILD_MESSAGE)
        @install -d $(dir $@)
+       $(DEPEND_VERBOSE)$(RM) $(DEPS)
        $(DEPEND_VERBOSE)echo '$@: $(SRC_DIR)/Makefile ' > $@
        $(DEPEND_VERBOSE)$(call BID_DEPEND_GENERAL_D_COND,\
                $(OBJ_BASE)/.config.all)
@@ -512,6 +519,8 @@ $(GENERAL_D_LOC): $(L4DIR)/mk/Makeconf $(EXTRA_GENERAL_D_DEP)
                $(OBJ_BASE)/Makeconf.local)
        $(DEPEND_VERBOSE)$(call BID_DEPEND_GENERAL_D_COND,\
                $(L4DIR)/Makeconf.local)
+       $(DEPEND_VERBOSE)$(call BID_DEPEND_GENERAL_D_COND,\
+               $(L4DIR)/conf/Makeconf.local)
        $(DEPEND_VERBOSE)$(foreach m,$(wildcard $(INCLUDE_MAKE_RULES)),\
                $(call BID_DEPEND_GENERAL_D_COND,$(m)); )
        $(if $(PKGDIR_ABS),$(DEPEND_VERBOSE)$(call BID_DEPEND_GENERAL_D_COND,\
@@ -529,34 +538,39 @@ DEPS      += $(GENERAL_D_LOC)
 # coloring on color-capable terminals
 # enabled by setting CONFIG_BID_COLORED_PHASES to y
 ifeq ($(CONFIG_BID_COLORED_PHASES),y)
-ifeq ($(COLOR_TERMINAL),y)
-  EMPHSTART = '\033[34;1m'
-  EMPHSTOP  = '\033[0m'
-else
-  EMPHSTART =
-  EMPHSTOP  =
-endif
-endif
-
-AR_MESSAGE                 ?= echo -e "  ==> Archiving into $@"
-BUILD_MESSAGE              ?= echo -e "  ... Building $@"
-BUILT_MESSAGE              ?= echo -e $(EMPHSTART)'  ==> "$@" built'$(EMPHSTOP)
-COMP_MESSAGE               ?= echo -e "  ... Compiling $@"
-COMP_P_MESSAGE             ?= echo -e "  ... Compiling PIC $@"
-COMP_PR_MESSAGE            ?= echo -e "  ... Compiling PROFILE $@"
-GEN_MESSAGE                ?= echo -e "  ... Generating $@"
-LINK_MESSAGE               ?= echo -e "  ==> Linking $@"
-LINK_SHARED_MESSAGE        ?= echo -e "  ==> Linking to shared $@"
-LINK_PARTIAL_MESSAGE       ?= echo -e "  ==> Partial linking to $@"
-DEP_MESSAGE                ?= echo -e "  ... Building dependencies for $<"
-CLEAN_MESSAGE              ?= echo -e "  ... Removing created files"
-CLEANALL_MESSAGE           ?= echo -e "  ... Removing all created files"
-INSTALL_LINK_MESSAGE       ?= echo -e "  ==> Updating symlinks"
-INSTALL_DOC_MESSAGE        ?= echo -e "  ==> Installing $(<) documentation"
-INSTALL_DOC_LOCAL_MESSAGE  ?= echo -e "  ==> Installing $(<) documentation locally"
-INSTALL_MESSAGE            ?= echo -e "  ==> Installing $^"
-INSTALL_LOCAL_MESSAGE      ?= echo -e "  ==> Installing $(<) to local build-tree"
-UPDATE_HTML_MESSAGE        ?= echo -e "  ! You should remake your doc directory in $(1)"
+  ifneq ($(BID_COLORS_TESTED),y)
+    BID_COLORS_TESTED := y
+    BID_COLORS_SUPPORTED := $(shell tput colors 1>&2 2 > /dev/null; [ $$? -eq 0 ] && echo -n 'y' || echo -n 'n')
+    export BID_COLORS_TESTED
+    export BID_COLORS_SUPPORTED
+  endif
+  ifeq ($(BID_COLORS_SUPPORTED), y)
+    EMPHSTART = '\033[34;1m'
+    EMPHSTOP  = '\033[0m'
+  else
+    EMPHSTART =
+    EMPHSTOP  =
+  endif
+endif
+
+AR_MESSAGE                 ?= echo -e "  [$(PKGNAME_DIRNAME)] ==> Archiving into $@"
+BUILD_MESSAGE              ?= echo -e "  [$(PKGNAME_DIRNAME)] ... Building $(if $(filter $(GENERAL_D_LOC),$@),Dependencies,$@)"
+BUILT_MESSAGE              ?= echo -e $(EMPHSTART)'  [$(PKGNAME_DIRNAME)] ==> $@ built'$(EMPHSTOP)
+COMP_MESSAGE               ?= echo -e "  [$(PKGNAME_DIRNAME)] ... Compiling $@"
+COMP_P_MESSAGE             ?= echo -e "  [$(PKGNAME_DIRNAME)] ... Compiling PIC $@"
+COMP_PR_MESSAGE            ?= echo -e "  [$(PKGNAME_DIRNAME)] ... Compiling PROFILE $@"
+GEN_MESSAGE                ?= echo -e "  [$(PKGNAME_DIRNAME)] ... Generating $@"
+LINK_MESSAGE               ?= echo -e "  [$(PKGNAME_DIRNAME)] ==> Linking $@"
+LINK_SHARED_MESSAGE        ?= echo -e "  [$(PKGNAME_DIRNAME)] ==> Linking to shared $@"
+LINK_PARTIAL_MESSAGE       ?= echo -e "  [$(PKGNAME_DIRNAME)] ==> Partial linking to $@"
+DEP_MESSAGE                ?= echo -e "  [$(PKGNAME_DIRNAME)] ... Building dependencies for $<"
+CLEAN_MESSAGE              ?= echo -e "  [$(PKGNAME_DIRNAME)] ... Removing created files"
+CLEANALL_MESSAGE           ?= echo -e "  [$(PKGNAME_DIRNAME)] ... Removing all created files"
+INSTALL_LINK_MESSAGE       ?= echo -e "  [$(PKGNAME_DIRNAME)] ==> Updating symlinks"
+INSTALL_DOC_MESSAGE        ?= echo -e "  [$(PKGNAME_DIRNAME)] ==> Installing $(if $(1),$(1),$(<)) documentation"
+INSTALL_DOC_LOCAL_MESSAGE  ?= echo -e "  [$(PKGNAME_DIRNAME)] ==> Installing $(if $(1),$(1),$(<)) documentation locally"
+INSTALL_MESSAGE            ?= echo -e "  [$(PKGNAME_DIRNAME)] ==> Installing $(if $(1),$(1),$^)"
+INSTALL_LOCAL_MESSAGE      ?= echo -e "  [$(PKGNAME_DIRNAME)] ==> Installing $(if $(1),$(1),$(<)) to local build-tree"
 
 # allows an include $(DEPSVAR) at the end of the makefile
 # but prevents rebuilding them on a scrub, clean, cleanall and help
@@ -591,6 +605,7 @@ addfileheader:
 # 3: inc path (one only)
 # 4: libs
 # 5: requires_libs
+# 6: PC_CFLAGS
 generate_pcfile =                                                            \
        mkdir -p $(dir $(2))                                                 \
        ;echo -n                                                    > $(2)   \
@@ -598,11 +613,23 @@ generate_pcfile =                                                            \
        ;echo "Name: $(1)"                                         >> $(2)   \
        ;echo "Version: 0"                                         >> $(2)   \
        ;echo "Description: L4 library"                            >> $(2)   \
-       $(if $(3),;echo "Cflags: $(addprefix -I\$${incdir}/,$(3))" >> $(2))  \
-       $(if $(4),;echo "Libs: $(sort $(4))"                       >> $(2))  \
+       $(if $(3),;echo -n "Cflags: $(addprefix -I\$${incdir}/,$(3)) ">> $(2))\
+       $(if $(6),$(if $(3),,;echo -n "Cflags:" >> $(2)))                    \
+       $(if $(6),;echo " $(6)" >> $(2),;echo "" >> $(2))                    \
+       $(if $(4),;echo "Libs: $(4)"                               >> $(2))  \
        $(if $(5),;echo "Requires: $(5)"                           >> $(2))  \
        $(if $(BID_GEN_CONTROL),;echo "Provides: $(1)"             >> $(PKGDIR)/Control) \
        $(if $(BID_GEN_CONTROL),;echo "Requires: $(5)"             >> $(PKGDIR)/Control) ;
 
+define build_obj_redir_Makefile
+       $(VERBOSE)install -d $(dir $(1))
+       $(VERBOSE)echo '# automatically created -- modifications will be lost' > $(1)
+       $(VERBOSE)echo 'SRC := $(if $(2),$(2),$(SRC_DIR))'                    >> $(1)
+       $(VERBOSE)echo 'OBJ := $(OBJ_BASE)'                                   >> $(1)
+       $(VERBOSE)echo '.PHONY: $$(MAKECMDGOALS) do-all-make-goals'           >> $(1)
+       $(VERBOSE)echo 'do-all-make-goals:'                                   >> $(1)
+       $(VERBOSE)echo '        @PWD=$$(SRC) $$(MAKE) -C $$(SRC) O=$$(OBJ) $$(MAKECMDGOALS)'>> $(1)
+       $(VERBOSE)echo '$$(MAKECMDGOALS): do-all-make-goals'                  >> $(1)
+endef
 
 endif  # _L4DIR_MK_MAKECONF undefined