# Rules.make for busybox
#
# Copyright (C) 1999-2005 by Erik Andersen <andersen@codepoet.org>
#
# Licensed under GPLv2, see the file LICENSE in this tarball for details.
#

# Pull in the user's busybox configuration
ifeq ($(filter $(noconfig_targets),$(MAKECMDGOALS)),)
-include $(top_builddir)/.config
endif

ifeq ($(MAKELEVEL),0)
ifeq ($(HAVE_DOT_CONFIG),y)
rules-mak-rules:=0
endif
endif

#--------------------------------------------------------
PROG      := busybox
MAJOR_VERSION   :=1
MINOR_VERSION   :=1
SUBLEVEL_VERSION:=1
EXTRAVERSION    :=-pre0
VERSION   :=$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBLEVEL_VERSION)$(EXTRAVERSION)
BUILDTIME := $(shell TZ=UTC date -u "+%Y.%m.%d-%H:%M%z")


#--------------------------------------------------------
# With a modern GNU make(1) (highly recommended, that's what all the
# developers use), all of the following configuration values can be
# overridden at the command line.  For example:
#   make CROSS=powerpc-linux- top_srcdir="$HOME/busybox" PREFIX=/mnt/app
#--------------------------------------------------------

# If you are running a cross compiler, you will want to set 'CROSS'
# to something more interesting...  Target architecture is determined
# by asking the CC compiler what arch it compiles things for, so unless
# your compiler is broken, you should not need to specify __TARGET_ARCH
CROSS           =$(subst ",, $(strip $(CROSS_COMPILER_PREFIX)))
#")
CC             = $(CROSS)gcc
AR             = $(CROSS)ar
AS             = $(CROSS)as
LD             = $(CROSS)ld
NM             = $(CROSS)nm
STRIP          = $(CROSS)strip
CPP            = $(CC) -E
SED           ?= sed
AWK           ?= awk


ifdef PACKAGE_BE_VERBOSE
PACKAGE_BE_VERBOSE := $(shell echo $(PACKAGE_BE_VERBOSE) | $(SED) "s/[[:alpha:]]*//g")
endif

# for make V=3 and above make $(shell) invocations verbose
ifeq ($(if $(strip $(PACKAGE_BE_VERBOSE)),$(shell test $(PACKAGE_BE_VERBOSE) -gt 2 ; echo $$?),1),0)
 SHELL+=-x
 MKDEP_ARGS:=-w
endif

# What OS are you compiling busybox for?  This allows you to include
# OS specific things, syscall overrides, etc.
TARGET_OS=linux

# Select the compiler needed to build binaries for your development system
HOSTCC    = gcc
HOSTCFLAGS= -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer

# Ensure consistent sort order, 'gcc -print-search-dirs' behavior, etc.
LC_ALL:= C

# If you want to add some simple compiler switches (like -march=i686),
# especially from the command line, use this instead of CFLAGS directly.
# For optimization overrides, it's better still to set OPTIMIZATIONS.
CFLAGS_EXTRA=$(subst ",, $(strip $(EXTRA_CFLAGS_OPTIONS)))
#")

# To compile vs some other alternative libc, you may need to use/adjust
# the following lines to meet your needs...
#
# If you are using Red Hat 6.x with the compatible RPMs (for developing under
# Red Hat 5.x and glibc 2.0) uncomment the following.  Be sure to read about
# using the compatible RPMs (compat-*) at http://www.redhat.com !
#LIBCDIR:=/usr/i386-glibc20-linux
#
# For other libraries, you are on your own.  But these may (or may not) help...
#LDFLAGS+=-nostdlib
#LIBRARIES:=$(LIBCDIR)/lib/libc.a -lgcc
#CROSS_CFLAGS+=-nostdinc -I$(LIBCDIR)/include -I$(GCCINCDIR) -funsigned-char
#GCCINCDIR:=$(shell gcc -print-search-dirs | sed -ne "s/install: \(.*\)/\1include/gp")

WARNINGS=-Wall -Wstrict-prototypes -Wshadow
CFLAGS+=-I$(top_builddir)/include -I$(top_srcdir)/include

ARFLAGS=cruP



# Get the CC MAJOR/MINOR version
# gcc centric. Perhaps fiddle with findstring gcc,$(CC) for the rest
CC_MAJOR:=$(shell printf "%02d" $(shell echo __GNUC__ | $(CC) -E -xc - | tail -n 1))
CC_MINOR:=$(shell printf "%02d" $(shell echo __GNUC_MINOR__ | $(CC) -E -xc - | tail -n 1))

# Note: spaces are significant here!
# Check if CC version is equal to given MAJOR,MINOR. Returns empty if false.
define cc_eq
$(shell [ $(CC_MAJOR) -eq $(1) -a $(CC_MINOR) -eq $(2) ] && echo y)
endef
# Check if CC version is greater or equal than given MAJOR,MINOR
define cc_ge
$(shell [ $(CC_MAJOR) -ge $(1) -a $(CC_MINOR) -ge $(2) ] && echo y)
endef
# Check if CC version is less or equal than given MAJOR,MINOR
define cc_le
$(shell [ $(CC_MAJOR) -le $(1) -a $(CC_MINOR) -le $(2) ] && echo y)
endef

# Workaround bugs in make-3.80 for eval in conditionals
define is_eq
$(shell [ $(1) = $(2) ] 2> /dev/null && echo y)
endef
define is_neq
$(shell [ $(1) != $(2) ] 2> /dev/null && echo y)
endef

#--------------------------------------------------------
export VERSION BUILDTIME HOSTCC HOSTCFLAGS CROSS CC AR AS LD NM STRIP CPP

# TARGET_ARCH and TARGET_MACH will be passed verbatim to CC with recent
# versions of make, so we use __TARGET_ARCH here.
# Current builtin rules looks like that:
# COMPILE.s = $(AS) $(ASFLAGS) $(TARGET_MACH)
# COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c

ifeq ($(strip $(__TARGET_ARCH)),)
__TARGET_ARCH:=$(shell $(CC) -dumpmachine | sed -e s'/-.*//' \
		-e 's/i.86/i386/' \
		-e 's/sparc.*/sparc/' \
		-e 's/arm.*/arm/g' \
		-e 's/m68k.*/m68k/' \
		-e 's/ppc/powerpc/g' \
		-e 's/v850.*/v850/g' \
		-e 's/sh[234]/sh/' \
		-e 's/mips-.*/mips/' \
		-e 's/mipsel-.*/mipsel/' \
		-e 's/cris.*/cris/' \
		)
endif

$(call check_gcc,CFLAGS,-funsigned-char,)
$(call check_gcc,CFLAGS,-mmax-stack-frame=256,)

#--------------------------------------------------------
# Arch specific compiler optimization stuff should go here.
# Unless you want to override the defaults, do not set anything
# for OPTIMIZATIONS...

# use '-Os' optimization if available, else use -O2
$(call check_gcc,OPTIMIZATIONS,-Os,-O2)

# gcc 2.95 exits with 0 for "unrecognized option"
$(if $(call is_eq,$(CONFIG_BUILD_AT_ONCE),y),\
  $(if $(call cc_ge,3,0),\
    $(call check_gcc,CFLAGS_COMBINE,--combine,)))

$(if $(call is_eq,$(CONFIG_BUILD_AT_ONCE),y),\
  $(call check_gcc,OPTIMIZATIONS,-funit-at-a-time,))

# http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25795
#$(if $(call is_eq,$(CONFIG_BUILD_AT_ONCE),y),\
#  $(call check_gcc,PROG_CFLAGS,-fwhole-program,))

$(call check_ld,LIB_LDFLAGS,--enable-new-dtags,)
#$(call check_ld,LIB_LDFLAGS,--reduce-memory-overheads,)
#$(call check_ld,LIB_LDFLAGS,--as-needed,)
#$(call check_ld,LIB_LDFLAGS,--warn-shared-textrel,)

$(call check_ld,PROG_LDFLAGS,--gc-sections,)

# Some nice architecture specific optimizations
ifeq ($(__TARGET_ARCH),arm)
    OPTIMIZATIONS+=-fstrict-aliasing
endif # arm

$(if $(call is_eq,$(__TARGET_ARCH),i386),\
  $(call check_gcc,OPTIMIZATIONS,-march=i386,))

# gcc-4.0 and older seem to benefit from these
$(if $(call cc_le,4,0),\
  $(call check_gcc,OPTIMIZATIONS,-mpreferred-stack-boundary=2,)\
  $(call check_gcc,OPTIMIZATIONS,-falign-functions=1 -falign-jumps=1 -falign-loops=1,\
		-malign-functions=0 -malign-jumps=0 -malign-loops=0))

# gcc-4.1 and beyond seem to benefit from these
# turn off flags which hurt -Os
$(if $(call cc_ge,4,1),\
  $(call check_gcc,OPTIMIZATIONS,-fno-tree-loop-optimize,)\
  $(call check_gcc,OPTIMIZATIONS,-fno-tree-dominator-opts,)\
  $(call check_gcc,OPTIMIZATIONS,-fno-strength-reduce,)\
\
  $(call check_gcc,OPTIMIZATIONS,-fno-branch-count-reg,))

$(call check_gcc,OPTIMIZATIONS,-fomit-frame-pointer,)

#
#--------------------------------------------------------
# If you're going to do a lot of builds with a non-vanilla configuration,
# it makes sense to adjust parameters above, so you can type "make"
# by itself, instead of following it by the same half-dozen overrides
# every time.  The stuff below, on the other hand, is probably less
# prone to casual user adjustment.
#

ifeq ($(CONFIG_LFS),y)
    # For large file summit support
    CFLAGS+=-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
endif
ifeq ($(CONFIG_DMALLOC),y)
    # For testing mem leaks with dmalloc
    CFLAGS+=-DDMALLOC
    LIBRARIES:=-ldmalloc
else
    ifeq ($(CONFIG_EFENCE),y)
	LIBRARIES:=-lefence
    endif
endif

$(if $(call is_eq,$(CONFIG_DEBUG),y),\
 $(call check_ld,LDFLAGS,--warn-common,),\
 $(call check_ld,LDFLAGS,--warn-common,)$(call check_ld,LDFLAGS,--sort-common,))
ifeq ($(CONFIG_DEBUG),y)
    CFLAGS  +=$(WARNINGS) -g -D_GNU_SOURCE
    STRIPCMD:=/bin/true -Not_stripping_since_we_are_debugging
else
    CFLAGS+=$(WARNINGS) $(OPTIMIZATIONS) -D_GNU_SOURCE -DNDEBUG
    STRIPCMD:=$(STRIP) -s --remove-section=.note --remove-section=.comment
endif
$(if $(call is_eq,$(CONFIG_STATIC),y),\
    $(call check_gcc,PROG_CFLAGS,-static,))

$(call check_gcc,CFLAGS_SHARED,-shared,)
LIB_CFLAGS+=$(CFLAGS_SHARED)

$(if $(call is_eq,$(CONFIG_BUILD_LIBBUSYBOX),y),\
    $(call check_gcc,CFLAGS_PIC,-fPIC,))

ifeq ($(CONFIG_SELINUX),y)
    LIBRARIES += -lselinux
endif

ifeq ($(strip $(PREFIX)),)
    PREFIX:=`pwd`/_install
endif

CFLAGS    += $(CROSS_CFLAGS)
ifdef BB_INIT_SCRIPT
    CFLAGS += -DINIT_SCRIPT='"$(BB_INIT_SCRIPT)"'
endif

# Put user-supplied flags at the end, where they
# have a chance of winning.
CFLAGS += $(CFLAGS_EXTRA)

#------------------------------------------------------------
# Installation options
ifeq ($(strip $(CONFIG_INSTALL_APPLET_HARDLINKS)),y)
INSTALL_OPTS=--hardlinks
endif
ifeq ($(strip $(CONFIG_INSTALL_APPLET_SYMLINKS)),y)
INSTALL_OPTS=--symlinks
endif
ifeq ($(strip $(CONFIG_INSTALL_APPLET_DONT)),y)
INSTALL_OPTS=
endif


#------------------------------------------------------------
# object extensions

# object potentially used in shared object
ifeq ($(strip $(CONFIG_BUILD_LIBBUSYBOX)),y)
# single-object extension
os:=.os
# multi-object extension
om:=.osm
else
os:=.o
om:=.om
endif

#------------------------------------------------------------
# Make the output nice and tight

# for make V=2 and above, do print directory
ifneq ($(shell test -n "$(strip $(PACKAGE_BE_VERBOSE))" && test $(PACKAGE_BE_VERBOSE) -gt 1 ; echo $$?),0)
  MAKEFLAGS += --no-print-directory
endif

export MAKEOVERRIDES
export MAKE_IS_SILENT=n
ifneq ($(findstring s,$(MAKEFLAGS)),)
export MAKE_IS_SILENT=y
DISP  := sil
Q     := @
else
ifneq ($(V)$(VERBOSE),)
DISP  := ver
Q     := 
else
DISP  := pur
Q     := @
endif
endif

define show_objs
  $(subst $(top_builddir)/,,$(subst ../,,$@))
endef
pur_disp_compile.c = @echo "  "CC $(show_objs) ;
pur_disp_compile.h = @echo "  "HOSTCC $(show_objs) ;
pur_disp_strip     = @echo "  "STRIP $(show_objs) ;
pur_disp_link      = @echo "  "LINK $(show_objs) ;
pur_disp_link.h    = @echo "  "HOSTLINK $(show_objs) ;
pur_disp_ar        = @echo "  "AR $(ARFLAGS) $(show_objs) ;
pur_disp_gen       = @echo "  "GEN $@ ;
pur_disp_doc       = @echo "  "DOC $(subst docs/,,$@) ;
pur_disp_bin       = @echo "  "BIN $(show_objs) ;
sil_disp_compile.c = @
sil_disp_compile.h = @
sil_disp_strip     = @
sil_disp_link      = @
sil_disp_link.h    = @
sil_disp_ar        = @
sil_disp_gen       = @
sil_disp_doc       = @
sil_disp_bin       = @
ver_disp_compile.c =
ver_disp_compile.h =
ver_disp_strip     =
ver_disp_link      =
ver_disp_link.h    =
ver_disp_ar        =
ver_disp_gen       =
ver_disp_doc       =
ver_disp_bin       =
disp_compile.c     = $($(DISP)_disp_compile.c)
disp_compile.h     = $($(DISP)_disp_compile.h)
disp_strip         = $($(DISP)_disp_strip)
disp_link          = $($(DISP)_disp_link)
disp_link.h        = $($(DISP)_disp_link.h)
disp_ar            = $($(DISP)_disp_ar)
disp_gen           = $($(DISP)_disp_gen)
disp_doc           = $($(DISP)_disp_doc)
disp_bin           = $($(DISP)_disp_bin)
# CFLAGS-dir        == $(CFLAGS-$(notdir $(@D)))
# CFLAGS-dir-file.o == $(CFLAGS-$(notdir $(@D))-$(notdir $(@F)))
# CFLAGS-dir-file.c == $(CFLAGS-$(notdir $(<D))-$(notdir $(<F)))
# all prerequesites == $(foreach fil,$^,$(CFLAGS-$(notdir $(patsubst %/$,%,$(dir $(fil))))-$(notdir $(fil))))
cmd_compile.c      = $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -I$(srcdir) -c -o $@ $< \
 $(foreach f,$^,$(CFLAGS-$(notdir $(patsubst %/$,%,$(dir $(f))))-$(notdir $(f)))) \
 $(CFLAGS-$(notdir $(@D))-$(notdir $(@F))) \
 $(CFLAGS-$(notdir $(@D)))
cmd_compile.m      = $(cmd_compile.c) -DL_$(patsubst %$(suffix $(notdir $@)),%,$(notdir $@))
cmd_compile.h      = $(HOSTCC) $(HOSTCFLAGS) -c -o $@ $<
cmd_strip          = $(STRIPCMD) $@
cmd_link           = $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -I$(srcdir) $(LDFLAGS)
cmd_link.h         = $(HOSTCC) $(HOSTCFLAGS) $(HOST_LDFLAGS) $^ -o $@
cmd_ar             = $(AR) $(ARFLAGS) $@ $^
compile.c          = $(disp_compile.c) $(cmd_compile.c)
compile.m          = $(disp_compile.c) $(cmd_compile.m)
compile.h          = $(disp_compile.h) $(cmd_compile.h)
do_strip           = $(disp_strip)     $(cmd_strip)
do_link            = $(disp_link)      $(cmd_link)
do_link.h          = $(disp_link.h)    $(cmd_link.h)
do_ar              = $(disp_ar)        $(cmd_ar)

ifdef rules-mak-rules
.SUFFIXES: .c .S .o .os .om .osm .oS .so .a .s .i .E

# generic rules
%.o:  %.c ; $(compile.c)
%.os: %.c ; $(compile.c) $(CFLAGS_PIC)
%.o:      ; $(compile.c)
%.os:     ; $(compile.c) $(CFLAGS_PIC)
%.om:     ; $(compile.m)
%.osm:    ; $(compile.m) $(CFLAGS_PIC)

endif # rules-mak-rules

.PHONY: dummy

