PKGDIR		?= ../..
L4DIR		?= $(PKGDIR)/../..

include $(L4DIR)/mk/Makeconf

SYSTEMS		= x86 arm amd64
TARGET		= libuc_c.a
SYSDEPS		:= libc/sysdeps/linux

ifneq ($(SYSTEM),)
UCLIBC_ARCH_x86   := i386
UCLIBC_ARCH_arm	  := arm
UCLIBC_ARCH_amd64 := x86_64
DIRS		:= libc/stdio libc/stdlib libc/stdlib/malloc libc/string \
		   libc/string/$(UCLIBC_ARCH_$(ARCH)) libc/string/generic \
		   libc/inet libc/misc libc/misc/assert libc/misc/ctype \
		   libc/misc/dirent libc/misc/internals libc/misc/locale \
		   libc/misc/time libc/pwd_grp libc/unistd libc/termios \
		   libc/signal $(SYSDEPS)/$(UCLIBC_ARCH_$(ARCH)) \
		   $(SYSDEPS)/common libm

SRC_C		:= $(foreach arch,all $(ARCH),\
		     $(foreach dir,$(DIRS),$(addprefix ARCH-$(arch)/$(dir)/,\
		       $(notdir $(wildcard ../ARCH-$(arch)/$(dir)/*.c)))))
SRC_S		:= $(foreach arch,all $(ARCH),\
		     $(foreach dir,$(DIRS),$(addprefix ARCH-$(arch)/$(dir)/,\
		       $(notdir $(wildcard ../ARCH-$(arch)/$(dir)/*.S)))))
IDL_PATH	=
PRIVATE_INCDIR	= ../ARCH-$(ARCH)/include ../ARCH-all/include \
		  $(L4DIR)/include/$(ARCH) $(L4DIR)/include
MODE		= host
LIBCINCDIR	= $(addprefix -I,$(GCCINCDIR))
CPPFLAGS	= -nostdinc -include \
		  $(PKGDIR)/lib/uclibc/ARCH-all/include/libc-symbols.h
CFLAGS		= -fno-builtin
# CFLAGS	+= -std=iso9899:199901
DEFINES		= -DNDEBUG -D_LIBC -DSTATIC
WARNINGS	= -Wall -Wstrict-prototypes

ifneq ($(L4API),)
DEFINES		+= -DL4_THREAD_SAFE
TARGET		= libuc_c_r.a
PRIVATE_INCDIR	= ../ARCH-$(ARCH)/include ../ARCH-all/include \
		  $(L4DIR)/include/$(ARCH)/$(L4API) \
		  $(L4DIR)/include/$(ARCH) $(L4DIR)/include
endif

endif

BUILD_ARCHS	:= all x86 arm amd64

FILES_all	:= $(PKGDIR)/lib/uclibc/contrib_files_all.lst
FILES_x86	:= $(PKGDIR)/lib/uclibc/contrib_files_x86.lst
FILES_arm	:= $(PKGDIR)/lib/uclibc/contrib_files_arm.lst
FILES_amd64     := $(PKGDIR)/lib/uclibc/contrib_files_amd64.lst
CONTRIB_DIR	:= $(PKGDIR)/lib/contrib/uclibc

.general.d: $(FILES_x86) $(FILE_arm) $(FILES_amd64) $(FILES_all)

ifeq ($(SYSTEM),)

INCDIRS		= $(addsuffix /include,$(addprefix ARCH-,$(BUILD_ARCHS)))

all:: $(INCDIRS)

install:: all
	$(VERBOSE)set -e; $(foreach d,$(INCDIRS), \
	  if [ -f $d/Makefile ]; then \
	    PWD=$(PWD)/$d $(MAKE) -C $d $@ $(MKFLAGS); \
	  fi;)

$(INCDIRS): $(addprefix ARCH-,$(addsuffix /links-done,$(BUILD_ARCHS)))
	$(VERBOSE)PWD=$(PWD)/$@ $(MAKE) -C $@ all

# ok, we have a list of files to check in FILES
# for each file do
# check if it exists, yes? go on
#   no? create an apropriate link with a relative path to the contrib dir

REBUILD_LINKS =                                                          \
  set -e; arch=$1;                                                       \
    cat contrib_files_$${arch}.lst | while read file flags;              \
    do                                                                   \
      path_file=`dirname $${file}`;                                      \
      path_ctrb=`dirname $(CONTRIB_DIR)/$${file}`;                       \
      if [ -n "$${flags}" ]; then                                        \
        dest="$${path_file}/$${flags}.c";                                \
      else                                                               \
        dest="$${file}";                                                 \
      fi;                                                                \
      if [ "$${path_file}" = "$(SYSDEPS)/i386/bits" -o                   \
           "$${path_file}" = "$(SYSDEPS)/arm/bits"  -o                   \
           "$${path_file}" = "$(SYSDEPS)/x86_64/bits"  -o                \
           "$${path_file}" = "$(SYSDEPS)/common/bits" ]; then            \
        if [ \( ! -e ARCH-$${arch}/include/bits/`basename $${dest}` \)   \
                  -a \( -e $(CONTRIB_DIR)/$${file} \) ]; then            \
          ln -s$(if $(VERBOSE),,v)                                       \
            `$(ABS2REL) ARCH-$${arch}/include/bits                       \
                        $${path_ctrb}`/`basename $${file}`               \
            ARCH-$${arch}/include/bits;                                  \
        fi;                                                              \
      elif [ "$${path_file}" = "$(SYSDEPS)/i386/sys" -o                  \
             "$${path_file}" = "$(SYSDEPS)/arm/sys"  -o                  \
             "$${path_file}" = "$(SYSDEPS)/x86_64/sys"  -o               \
             "$${path_file}" = "$(SYSDEPS)/common/sys" ]; then           \
        if [ \( ! -e ARCH-$${arch}/include/sys/`basename $${dest}` \)    \
                  -a \( -e $(CONTRIB_DIR)/$${file} \) ]; then            \
          ln -s$(if $(VERBOSE),,v)                                       \
            `$(ABS2REL) ARCH-$${arch}/include/sys                        \
                        $${path_ctrb}`/`basename $${file}`               \
            ARCH-$${arch}/include/sys;                                   \
        fi;                                                              \
      else                                                               \
        if [ \( ! -e ARCH-$${arch}/$${dest} \)                           \
            -a \( -e $(CONTRIB_DIR)/$${file} \) ] ; then                 \
          ln -s$(if $(VERBOSE),,v)                                       \
            `$(ABS2REL) ARCH-$${arch}/$${path_file}                      \
                        $${path_ctrb}`/`basename $${file}`               \
            ARCH-$${arch}/$${dest};                                      \
        fi;                                                              \
      fi;                                                                \
    done;

ARCH-%/links-done: contrib_files_%.lst
	@echo -n "  ... Checking and fixing contrib file links, cleaning .o [$*]"
	$(VERBOSE)find ARCH-$* -type l | xargs rm -f$(if $(VERBOSE),,v)
	$(VERBOSE)$(call REBUILD_LINKS,$*)
	@touch $@
	@echo " ... done!"

else

CONTRIB: $(addprefix ARCH-,$(addsuffix /links-done,$(BUILD_ARCHS)))

endif

cleanall::
	$(VERBOSE)find . -type l | xargs rm -f$(if $(VERBOSE),,v)
	$(VERBOSE)$(RM) $(PKGDIR)/lib/uclibc/ARCH-*/links-done
	$(VERBOSE)$(RM) $(PKGDIR)/lib/uclibc/ARCH-*/include/.general.d

# some special defines
O_AND_SO_OBJS	= $(SRC_C:.c=.o) $(SRC_C:.c=.s.o)
$(filter %__DO_UNLOCKED.o %__DO_UNLOCKED.s.o,$(O_AND_SO_OBJS)):\
	DEFINES += -D__DO_UNLOCKED
$(filter %__DO_LARGEFILE.o %__DO_LARGEFILE.s.o,$(O_AND_SO_OBJS)):\
	DEFINES += -D__DO_LARGEFILE
$(filter %__FN.o,$(SRC_C:.c=.o)):\
	DEFINES += -DL_$(patsubst %__FN.o,%,$(notdir $@))
$(filter %__FN.s.o,$(SRC_C:.c=.s.o)):\
	DEFINES += -DL_$(patsubst %__FN.s.o,%,$(notdir $@))

$(SRC_C_libm:.c=.o) $(SRC_C_libm:.c=.s.o):\
	DEFINES += -D_IEEE_LIBM -D_ISOC99_SOURCE -D_SVID_SOURCE

include $(L4DIR)/mk/lib.mk
