# -*- Makefile -*-
# Fiasco make configuration file
#
# created 1996/04/20 by hohmuth
# $Id: Makeconf,v 1.77 2006/04/21 13:17:52 us15 Exp $
#

CHECKCC         = $(shell if $(CC)  $(1) -S -o /dev/null -xc   /dev/null \
		    > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;)

CHECKCXX        = $(shell if $(CXX) $(1) -S -o /dev/null -xc++ /dev/null \
		    > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;)

eval_impl	= $(if $($(1)_IMPL),$($(1)_IMPL),$(1))

include globalconfig.out
# use patsubst here to prevent confusion of syntax highlighting editors :-)
CONFIG_XARCH	:= $(patsubst "%",%,$(CONFIG_XARCH))
CONFIG_ABI	:= $(patsubst "%",%,$(CONFIG_ABI))

SYSTEM		:= $(shell uname)
CC		:= $(patsubst "%",%,$(CONFIG_CC))
CXX		:= $(patsubst "%",%,$(CONFIG_CXX))
RM		:= rm -f
RM_R		:= rm -rf
CP		:= cp
AWKP		?= gawk --posix
OPT_CFLAGS	:= -O2
OPT_CXXFLAGS	:= -O2
NOOPT_CFLAGS	:= -Os
NOOPT_CXXFLAGS	:= -Os
ARFLAGS		:= crs
srcdir		?= .
L4DIR		?= $(srcdir)/../../..
tooldir		:= $(srcdir)/../tool
MOVE_IF_CHANGE	:= $(srcdir)/../tool/move-if-change
SHOWDEPS	:= $(srcdir)/../tool/showdeps
PREPROCESSDEPS	:= $(srcdir)/../tool/parsedeps
CIRCULAR	:= $(srcdir)/../tool/circular

ifeq ($(SYSTEM),FreeBSD)
  MD5SUM	:= /sbin/md5
else
  MD5SUM	:= md5sum
endif

# The name of this file can be overridden from the command line or in
# objdir/Makeconf.local.
MODULES_FILE	= Modules.$(CONFIG_XARCH)

PREPROCESS = \
  $(word 1, $(wildcard $(shell cd $(L4DIR)/tool/preprocess/src 2>/dev/null; \
                               pwd)/preprocess \
		       $(DROPS_STDDIR)/tool/bin/preprocess) preprocess)

ifeq ($(CONFIG_INLINE),y)
  PREPROCESS_FLAGS = -i -L -t
else
  PREPROCESS_FLAGS = -L -t
endif


# Include architecture-specific rules. These may overwrite anything above
include $(srcdir)/Makeconf.$(CONFIG_XARCH)

# Include user-specific rules. These may overwrite anything above
-include $(srcdir)/Makeconf.local
-include Makeconf.local


ifneq ($(CCXX_VERSION),)
  CCXX_SUFFIX		:= -$(CCXX_VERSION)
endif

CC			:= $(CCXX_WRAP) $(SYSTEM_TARGET)$(CC)$(CCXX_SUFFIX)
CXX			:= $(CCXX_WRAP) $(SYSTEM_TARGET)$(CXX)$(CCXX_SUFFIX)
AS			:= $(SYSTEM_TARGET)as
LD			:= $(SYSTEM_TARGET)ld
AR			:= $(SYSTEM_TARGET)ar
NM			:= $(SYSTEM_TARGET)nm
RANLIB			:= $(SYSTEM_TARGET)ranlib
SIZE			:= $(SYSTEM_TARGET)size
STRIP			:= $(SYSTEM_TARGET)strip
OBJCOPY			:= $(SYSTEM_TARGET)objcopy
OBJDUMP			:= $(SYSTEM_TARGET)objdump

CCVER_MAJOR		:= $(shell $(CXX) -dumpversion | cut -d . -f 1)
CCVER_MINOR		:= $(shell $(CXX) -dumpversion | cut -d . -f 2)
LIBGCC			:= $(shell $(CXX) -print-libgcc-file-name)

L4ALL_INCDIR     	?= $(addprefix -I, $(PRIVATE_INCDIR))
L4STD_INCDIR    	?= -nostdinc
L4STD_INCDIR_LAST	?= -I$(wildcard $(dir $(LIBGCC))/include \
			                $(dir $(LIBGCC))/../include)
KERNEL_LDFLAGS		+= -gc-sections
SHARED_FLAGS		+= -fno-defer-pop -freg-struct-return -g -Wall -W
SHARED_FLAGS		+= $(call CHECKCC,-Wformat=2,)
OPT_CXXFLAGS		+= $(call CHECKCXX,-fweb,)
OPT_CFLAGS		+= $(call CHECKCC,-fweb,)
OPT_SHARED_FLAGS	+= $(call CHECKCC,-frename-registers,)
OPT_SHARED_FLAGS	+= $(call CHECKCC,-fgcse-after-reload,)
CXXFLAGS		+= -fno-implement-inlines

# Configuration dependent compile flags
ifneq ($(CONFIG_PROFILE),y)
  SHARED_FLAGS		+= -ffunction-sections
endif
ifeq ($(CONFIG_NDEBUG),y)
  SHARED_FLAGS		+= -DNDEBUG
endif
ifeq ($(CONFIG_NO_FRAME_PTR),y)
  SHARED_FLAGS		+= -fomit-frame-pointer
endif
ifeq ($(CONFIG_GSTABS),y)
  SHARED_FLAGS		+= -gstabs+
endif
ifeq ($(CONFIG_PROFILE),y)
  PROF_FLAGS		+= -pg
endif
ifeq ($(CONFIG_UNREACHABLE_CODE),y)
  SHARED_FLAGS		+= $(call CHECKCC,-Wunreachable-code,)
endif

# Eagerly compute SHARED_FLAGS to avoid calling CHECKCC over and over again.
SHARED_FLAGS	:= $(SHARED_FLAGS)

# Standard compile flags
ASFLAGS		+= -DASSEMBLER
CFLAGS		+= $(SHARED_FLAGS)
CXXFLAGS	+= $(SHARED_FLAGS) -fno-rtti -fno-exceptions
OPT_CFLAGS	+= $(OPT_SHARED_FLAGS)
OPT_CXXFLAGS	+= $(OPT_SHARED_FLAGS)
NOOPT_CFLAGS	+= $(NOOPT_SHARED_FLAGS)
NOOPT_CXXFLAGS	+= $(NOOPT_SHARED_FLAGS)
CPPFLAGS	+= $(L4STD_INCDIR) $(L4ALL_INCDIR) $(L4STD_INCDIR_LAST)
CXXFLAGS	+= $(call CHECKCXX,-fno-threadsafe-statics,)
CXXFLAGS	+= $(call CHECKCXX,-Wno-non-virtual-dtor,)

ifeq ($(CONFIG_VERBOSE),n)
VERBOSE		= @
PREP_MESSAGE	?= @echo -e "  ... Preprocessing $*"
endif

# Output formatting, set VERBOSE := @ to prevent command lines 
VERBOSE		?=
AR_MESSAGE	?= @echo -e "  ==> Archiving into $@"
COMP_MESSAGE	?= @echo -e "  ... Making $@"
LINK_MESSAGE	?= @echo -e "  ==> Linking $@"
DEP_MESSAGE	?= @echo -e "  ... Building dependencies for $<"
PREP_MESSAGE    ?= @echo -e "  ... Preprocessing $(filter %.cpp,$^)"
CHKSUM_MESSAGE  ?= @echo -e "  ... Generating checksum for "
PATCH_MESSAGE   ?= @echo -e "  ... Writing checksum into "
STRIP_MESSAGE	?= @echo -e "  ... Stripping $@"
CLEAN_MESSAGE	?= @echo -e "Removing created files"
CLEANALL_MESSAGE?= @echo -e "Removing all created files"
INST_MESSAGE	?= @echo -e "Installing $(^F)"
OK_MESSAGE      ?= 

COMP_MESSAGE_NOOPT ?= $(COMP_MESSAGE)

ifneq ($(VERBOSE),)
MOVE_IF_CHANGE += -q
endif

SRC_ALL = $(SRC_S) $(SRC_CPP) $(SRC_C) $(SRC_CC)
ifeq ($(filter clean cleanall mrproper,$(MAKECMDGOALS)),)
DEPS	= $(foreach file,$(SRC_ALL), $(dir $(file)).$(notdir $(file)).d)
else
DEPS    = /dev/null
endif
