1#
2# C library Makefile
3# 
4# Copyright (C) 2010, Broadcom Corporation. All Rights Reserved.
5# 
6# Permission to use, copy, modify, and/or distribute this software for any
7# purpose with or without fee is hereby granted, provided that the above
8# copyright notice and this permission notice appear in all copies.
9# 
10# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
13# SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
15# OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
16# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17#
18# $Id: Makefile,v 1.30 2009/08/27 03:14:48 Exp $
19#
20
21include $(TOP)/.config
22
23# Extra libraries
24lib-$(CONFIG_LIBCRYPT) += libcrypt
25lib-$(CONFIG_LIBDL) += libdl
26lib-$(CONFIG_LIBM) += libm
27lib-$(CONFIG_LIBNSL) += libnsl
28lib-$(CONFIG_LIBPTHREAD) += libpthread
29lib-$(CONFIG_LIBRESOLV) += libresolv
30lib-$(CONFIG_LIBUTIL) += libutil
31
32ifeq ($(CONFIG_UCLIBC),y)
33
34# uClibc names
35LINKER := ld-uClibc.so.0
36LIBC := libc.so.0
37MAP := uClibc.map
38
39else
40
41# GNU libc names
42LINKER := $(foreach lib,ld.so.* ld-linux.so.*,$(notdir $(wildcard $(LIBDIR)/$(lib))))
43LIBC := libc.so.6
44MAP := libc.map
45
46endif
47
48# Nothing to do until installation
49all:
50
51ifeq ($(CONFIG_LIBOPT),y)
52
53# Find all ELF binaries (including extra libraries)
54BINARIES := $(shell find $(TARGETDIR) -path $(TARGETDIR)/lib -prune -o -type f -print | file -f - | grep ELF | cut -d':' -f1)
55BINARIES += $(wildcard $(foreach lib,$(LINKER) $(lib-y),$(LIBDIR)/$(lib) $(LIBDIR)/$(lib).so.?))
56
57ifneq ($(wildcard $(LIBDIR)/optinfo),)
58# Try the toolchain directory first for precursors
59OPTINFO := $(LIBDIR)/optinfo
60else
61ifneq ($(wildcard $(LIBDIR)),)
62OPTINFO := $(LIBDIR)
63else
64# Fall back on platform directory
65OPTINFO := $(PLATFORM)
66endif
67endif
68ifeq ($(CONFIG_UCLIBC),y)
69
70# uClibc precursors
71OBJS := $(wildcard $(foreach file,libgcc-need.a libc.a interp.o,$(OPTINFO)/$(file)))
72
73ifeq ($(LINUX_VERSION),2_6)
74CUSTOM_UCLIBC := $(TOOLCHAIN)/lib/libc.a
75else
76CUSTOM_UCLIBC :=  mipsel-uclibc/libc.a
77endif
78
79ifeq ($(CONFIG_IPV6),y)
80OBJS := $(wildcard $(foreach file,libgcc-need.a interp.o,$(OPTINFO)/$(file))) $(CUSTOM_UCLIBC)
81endif # CONFIG_IPV6 = y
82$(LIBC):
83	cp $(TOOLCHAIN)/lib/libuClibc-0.9.29.so	libc.so.0
84
85# uClibc link parameters
86#ENTRY := __uClibc_init
87#LDFLAGS := -s -shared --warn-common --warn-once -z combreloc  -soname=$(LIBC) -init $(ENTRY)
88#LIBGCC := $(shell $(CC) -print-libgcc-file-name)
89
90#ifeq ($(CONFIG_IPV6),y)
91#$(MAP): $(CUSTOM_UCLIBC)
92#else
93#$(MAP): $(OPTINFO)/libc.a
94#endif
95#	$(NM) -o --defined-only --no-sort $< | cut -d' ' -f3 > $@
96
97# Find all unresolved symbols that uClibc could resolve
98#.symbols: $(MAP) $(BINARIES)
99#	rm -f $@
100#	for symbol in `$(NM) --dynamic -u --no-sort $(BINARIES) | sort -u` ; do \
101#		if grep -q "^$${symbol}$$" $(MAP) ; then \
102#			echo "-u $${symbol}" >> $@ ; \
103#		fi ; \
104#	done
105
106# Re-link uClibc
107#$(LIBC): .symbols $(OBJS)
108#	xargs -t $(LD) $(LDFLAGS) -o $@ $(OBJS) $(LIBGCC) < .symbols
109
110else   #<------------- don't care start:
111
112# GNU libc precursors
113OBJS := $(wildcard $(foreach file,soinit.os libc_pic.a sofini.os,$(OPTINFO)/$(file)))
114
115# GNU libc link parameters
116ENTRY := __libc_main
117CFLAGS := -shared -Wl,-O1 -Wl,-dynamic-linker=$(LINKER) -Wl,--version-script=$(MAP) -Wl,-soname=$(LIBC) -nostdlib -nostartfiles -e $(ENTRY)
118
119$(MAP): $(OPTINFO)/libc.map
120	cp $< $@
121
122# Find all unresolved symbols that GNU libc could resolve
123.symbols: $(MAP) $(BINARIES)
124	rm -f $@
125	for symbol in `$(NM) --dynamic -u --no-sort $(BINARIES) | sort -u` ; do \
126	    grep -q "$${symbol};" $(MAP) && echo "-u $${symbol}" >> $@ ; \
127	done
128
129# Re-link GNU libc
130$(LIBC): .symbols $(OBJS) $(LIBDIR)/$(LINKER)
131	xargs $(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBDIR)/$(LINKER) -lgcc < .symbols
132
133endif #<------------------- don't care end.
134
135# Install optimized C library
136install: $(LIBC)
137
138else
139
140# Install default C library
141install: $(LIBDIR)/$(LIBC)
142
143endif
144
145# Also install extra libraries
146install: $(wildcard $(foreach lib,$(LINKER) $(lib-y),$(LIBDIR)/$(lib) $(LIBDIR)/$(lib).so.?))
147	install -d $(TARGETDIR)/lib
148	install $^ $(TARGETDIR)/lib/
149	$(STRIP) $(TARGETDIR)/lib/*.so.*
150
151clean:
152	rm -f $(LIBC) $(MAP) .symbols
153