OSDN Git Service

rholzmann writes in Bug 716:
[uclinux-h8/uClibc.git] / Rules.mak
index 7a0c487..12eb92d 100644 (file)
--- a/Rules.mak
+++ b/Rules.mak
@@ -1,22 +1,10 @@
 # Rules.make for uClibc
 #
 # Copyright (C) 2000 by Lineo, inc.
-# Copyright (C) 2000-2002 Erik Andersen <andersen@uclibc.org>
+# Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org>
 #
-# This program is free software; you can redistribute it and/or modify it under
-# the terms of the GNU Library General Public License as published by the Free
-# Software Foundation; either version 2 of the License, or (at your option) any
-# later version.
+# Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
 #
-# This program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more
-# details.
-#
-# You should have received a copy of the GNU Library General Public License
-# along with this program; if not, write to the Free Software Foundation, Inc.,
-# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
 
 #-----------------------------------------------------------
 # This file contains rules which are shared between multiple
@@ -48,18 +36,35 @@ STRIPTOOL  = $(CROSS)strip
 INSTALL    = install
 LN         = ln
 RM         = rm -f
+TAR        = tar
 
 STRIP_FLAGS ?= -x -R .note -R .comment
 
 # Select the compiler needed to build binaries for your development system
 HOSTCC     = gcc
-HOSTCFLAGS = -O2 -Wall
+BUILD_CFLAGS = -O2 -Wall
 
 
 #---------------------------------------------------------
 # Nothing beyond this point should ever be touched by mere
 # mortals.  Unless you hang out with the gods, you should
 # probably leave all this stuff alone.
+
+# Pull in the user's uClibc configuration
+ifeq ($(filter $(noconfig_targets),$(MAKECMDGOALS)),)
+-include $(top_builddir).config
+endif
+
+# Make certain these contain a final "/", but no "//"s.
+TARGET_ARCH:=$(shell grep -s '^TARGET_ARCH' $(top_builddir)/.config | sed -e 's/^TARGET_ARCH=//' -e 's/"//g')
+TARGET_ARCH:=$(strip $(subst ",, $(strip $(TARGET_ARCH))))
+RUNTIME_PREFIX:=$(strip $(subst //,/, $(subst ,/, $(subst ",, $(strip $(RUNTIME_PREFIX))))))
+DEVEL_PREFIX:=$(strip $(subst //,/, $(subst ,/, $(subst ",, $(strip $(DEVEL_PREFIX))))))
+KERNEL_SOURCE:=$(strip $(subst //,/, $(subst ,/, $(subst ",, $(strip $(KERNEL_SOURCE))))))
+export RUNTIME_PREFIX DEVEL_PREFIX KERNEL_SOURCE
+
+
+# Now config hard core
 MAJOR_VERSION := 0
 MINOR_VERSION := 9
 SUBLEVEL      := 28
@@ -68,9 +73,21 @@ VERSION       := $(MAJOR_VERSION).$(MINOR_VERSION).$(SUBLEVEL)
 LC_ALL := C
 export MAJOR_VERSION MINOR_VERSION SUBLEVEL VERSION LC_ALL
 
-SHARED_MAJORNAME:=libc.so.$(MAJOR_VERSION)
-UCLIBC_LDSO:=ld-uClibc.so.$(MAJOR_VERSION)
-NONSHARED_LIBNAME:=uclibc_nonshared.a
+LIBC := libc
+SHARED_MAJORNAME := $(LIBC).so.$(MAJOR_VERSION)
+UCLIBC_LDSO_NAME := ld-uClibc
+ifeq ($(TARGET_ARCH),x86_64)
+UCLIBC_LDSO_NAME := ld64-uClibc
+endif
+UCLIBC_LDSO := $(UCLIBC_LDSO_NAME).so.$(MAJOR_VERSION)
+NONSHARED_LIBNAME := uclibc_nonshared.a
+libc := $(top_builddir)lib/$(SHARED_MAJORNAME)
+interp := $(top_builddir)lib/interp.os
+ldso := $(top_builddir)lib/$(UCLIBC_LDSO)
+headers_dep := $(top_builddir)include/bits/sysnum.h
+
+#LIBS :=$(interp) -L$(top_builddir)lib -lc
+LIBS := $(interp) -L$(top_builddir)lib $(libc:.$(MAJOR_VERSION)=)
 
 # Make sure DESTDIR and PREFIX can be used to install
 # PREFIX is a uClibcism while DESTDIR is a common GNUism
@@ -78,9 +95,10 @@ ifndef PREFIX
 PREFIX = $(DESTDIR)
 endif
 
-# Pull in the user's uClibc configuration
-ifeq ($(filter $(noconfig_targets),$(MAKECMDGOALS)),)
--include $(TOPDIR).config
+ifneq ($(HAVE_SHARED),y)
+libc :=
+interp :=
+ldso :=
 endif
 
 ifndef CROSS
@@ -106,13 +124,6 @@ SECHO=-@false
 SHELL_SET_X=set +x
 endif
 
-# Make certain these contain a final "/", but no "//"s.
-TARGET_ARCH:=$(shell grep -s ^TARGET_ARCH $(TOPDIR)/.config | sed -e 's/^TARGET_ARCH=//' -e 's/"//g')
-RUNTIME_PREFIX:=$(strip $(subst //,/, $(subst ,/, $(subst ",, $(strip $(RUNTIME_PREFIX))))))
-DEVEL_PREFIX:=$(strip $(subst //,/, $(subst ,/, $(subst ",, $(strip $(DEVEL_PREFIX))))))
-KERNEL_SOURCE:=$(strip $(subst //,/, $(subst ,/, $(subst ",, $(strip $(KERNEL_SOURCE))))))
-export RUNTIME_PREFIX DEVEL_PREFIX KERNEL_SOURCE
-
 ARFLAGS:=cr
 
 OPTIMIZATION:=
@@ -120,7 +131,7 @@ PICFLAG:=-fPIC
 PIEFLAG_NAME:=-fPIE
 
 # Some nice CPU specific optimizations
-ifeq ($(strip $(TARGET_ARCH)),i386)
+ifeq ($(TARGET_ARCH),i386)
        OPTIMIZATION+=$(call check_gcc,-mpreferred-stack-boundary=2,)
        OPTIMIZATION+=$(call check_gcc,-falign-jumps=0 -falign-loops=0,-malign-jumps=0 -malign-loops=0)
        CPU_CFLAGS-$(CONFIG_386)+=-march=i386
@@ -141,14 +152,14 @@ ifeq ($(strip $(TARGET_ARCH)),i386)
        CPU_CFLAGS-$(CONFIG_NEHEMIAH)+=$(call check_gcc,-march=c3-2,-march=i686)
 endif
 
-ifeq ($(strip $(TARGET_ARCH)),sparc)
+ifeq ($(TARGET_ARCH),sparc)
        CPU_CFLAGS-$(CONFIG_SPARC_V7)+=-mcpu=v7
        CPU_CFLAGS-$(CONFIG_SPARC_V8)+=-mcpu=v8
        CPU_CFLAGS-$(CONFIG_SPARC_V9)+=-mcpu=v9
        CPU_CFLAGS-$(CONFIG_SPARC_V9B)+=$(call check_gcc,-mcpu=v9b,-mcpu=ultrasparc)
 endif
 
-ifeq ($(strip $(TARGET_ARCH)),arm)
+ifeq ($(TARGET_ARCH),arm)
        OPTIMIZATION+=-fstrict-aliasing
        CPU_LDFLAGS-$(ARCH_LITTLE_ENDIAN)+=-EL
        CPU_LDFLAGS-$(ARCH_BIG_ENDIAN)+=-EB
@@ -157,6 +168,7 @@ ifeq ($(strip $(TARGET_ARCH)),arm)
        CPU_CFLAGS-$(CONFIG_GENERIC_ARM)+=
        CPU_CFLAGS-$(CONFIG_ARM610)+=-mtune=arm610 -march=armv3
        CPU_CFLAGS-$(CONFIG_ARM710)+=-mtune=arm710 -march=armv3
+       CPU_CFLAGS-$(CONFIG_ARM7TDMI)+=-mtune=arm7tdmi -march=armv4
        CPU_CFLAGS-$(CONFIG_ARM720T)+=-mtune=arm7tdmi -march=armv4
        CPU_CFLAGS-$(CONFIG_ARM920T)+=-mtune=arm9tdmi -march=armv4
        CPU_CFLAGS-$(CONFIG_ARM922T)+=-mtune=arm9tdmi -march=armv4
@@ -168,7 +180,9 @@ ifeq ($(strip $(TARGET_ARCH)),arm)
        CPU_CFLAGS-$(CONFIG_ARM_XSCALE)+=-march=armv4 -Wa,-mcpu=xscale
 endif
 
-ifeq ($(strip $(TARGET_ARCH)),mips)
+ifeq ($(TARGET_ARCH),mips)
+       CPU_LDFLAGS-$(ARCH_LITTLE_ENDIAN)+=-EL
+       CPU_LDFLAGS-$(ARCH_BIG_ENDIAN)+=-EB
        CPU_CFLAGS-$(CONFIG_MIPS_ISA_1)+=-mips1
        CPU_CFLAGS-$(CONFIG_MIPS_ISA_2)+=-mips2 -mtune=mips2
        CPU_CFLAGS-$(CONFIG_MIPS_ISA_3)+=-mips3 -mtune=mips3
@@ -177,7 +191,12 @@ ifeq ($(strip $(TARGET_ARCH)),mips)
        CPU_CFLAGS-$(CONFIG_MIPS_ISA_MIPS64)+=-mips64 -mtune=mips32
 endif
 
-ifeq ($(strip $(TARGET_ARCH)),sh)
+ifeq ($(TARGET_ARCH),nios)
+       CPU_LDFLAGS-y+=-m32
+       CPU_CFLAGS-y+=-m32
+endif
+
+ifeq ($(TARGET_ARCH),sh)
        OPTIMIZATION+=-fstrict-aliasing
        OPTIMIZATION+= $(call check_gcc,-mprefergot,)
        CPU_LDFLAGS-$(ARCH_LITTLE_ENDIAN)+=-EL
@@ -195,7 +214,7 @@ else
 endif
 endif
 
-ifeq ($(strip $(TARGET_ARCH)),sh64)
+ifeq ($(TARGET_ARCH),sh64)
        OPTIMIZATION+=-fstrict-aliasing
        CPU_LDFLAGS-$(ARCH_LITTLE_ENDIAN):=-EL
        CPU_LDFLAGS-$(ARCH_BIG_ENDIAN):=-EB
@@ -204,21 +223,21 @@ ifeq ($(strip $(TARGET_ARCH)),sh64)
        CPU_CFLAGS-$(CONFIG_SH5)+=-m5-32media
 endif
 
-ifeq ($(strip $(TARGET_ARCH)),h8300)
+ifeq ($(TARGET_ARCH),h8300)
        CPU_LDFLAGS-$(CONFIG_H8300H)+= -ms8300h
        CPU_LDFLAGS-$(CONFIG_H8S)   += -ms8300s
-       CPU_CFLAGS-$(CONFIG_H8300H) += -mh -mint32 -fsigned-char
-       CPU_CFLAGS-$(CONFIG_H8S)    += -ms -mint32 -fsigned-char
+       CPU_CFLAGS-$(CONFIG_H8300H) += -mh -mint32
+       CPU_CFLAGS-$(CONFIG_H8S)    += -ms -mint32
 endif
 
-ifeq ($(strip $(TARGET_ARCH)),cris)
+ifeq ($(TARGET_ARCH),cris)
        CPU_LDFLAGS-$(CONFIG_CRIS)+=-mcrislinux
        CPU_CFLAGS-$(CONFIG_CRIS)+=-mlinux
        PICFLAG:=-fpic
        PIEFLAG_NAME:=-fpie
 endif
 
-ifeq ($(strip $(TARGET_ARCH)),powerpc)
+ifeq ($(TARGET_ARCH),powerpc)
 # PowerPC can hold 8192 entries in its GOT with -fpic which is more than
 # enough. Therefore use -fpic which will reduce code size and generates
 # faster code.
@@ -226,7 +245,13 @@ ifeq ($(strip $(TARGET_ARCH)),powerpc)
        PIEFLAG_NAME:=-fpie
 endif
 
-ifeq ($(strip $(TARGET_ARCH)),frv)
+ifeq ($(TARGET_ARCH),bfin)
+       # This should also work, but why bother ? ;)
+       #PICFLAG:=-fPIC -mid-shared-library
+       PICFLAG:=-fpic
+endif
+
+ifeq ($(TARGET_ARCH),frv)
        CPU_LDFLAGS-$(CONFIG_FRV)+=-melf32frvfd
        CPU_CFLAGS-$(CONFIG_FRV)+=-mfdpic
        # Using -pie causes the program to have an interpreter, which is
@@ -273,45 +298,75 @@ OPTIMIZATION+=$(call check_gcc,-funit-at-a-time,)
 
 # Add a bunch of extra pedantic annoyingly strict checks
 XWARNINGS=$(subst ",, $(strip $(WARNINGS))) -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing
+ifeq ($(EXTRA_WARNINGS),y)
+XWARNINGS+=-Wnested-externs -Wshadow -Wmissing-noreturn -Wmissing-format-attribute -Wformat=2
+XWARNINGS+=-Wmissing-prototypes -Wmissing-declarations
+# works only w/ gcc-3.4 and up, can't be checked for gcc-3.x w/ check_gcc()
+#XWARNINGS+=-Wdeclaration-after-statement
+endif
 XARCH_CFLAGS=$(subst ",, $(strip $(ARCH_CFLAGS)))
 CPU_CFLAGS=$(subst ",, $(strip $(CPU_CFLAGS-y)))
 
+SSP_DISABLE_FLAGS ?= $(call check_gcc,-fno-stack-protector,)
+ifeq ($(UCLIBC_BUILD_SSP),y)
+SSP_CFLAGS := $(call check_gcc,-fno-stack-protector-all,)
+SSP_CFLAGS += $(call check_gcc,-fstack-protector,)
+SSP_ALL_CFLAGS ?= $(call check_gcc,-fstack-protector-all,)
+else
+SSP_CFLAGS := $(SSP_DISABLE_FLAGS)
+endif
+
+# Some nice CFLAGS to work with
+CFLAGS := -include $(top_builddir)include/libc-symbols.h \
+       $(XWARNINGS) $(CPU_CFLAGS) $(SSP_CFLAGS) \
+       -fno-builtin -nostdinc -I$(top_builddir)include -I.
+
 LDADD_LIBFLOAT=
 ifeq ($(UCLIBC_HAS_SOFT_FLOAT),y)
-# Add -msoft-float to the CPU_FLAGS since ldso and libdl ignore CFLAGS.
 # If -msoft-float isn't supported, we want an error anyway.
 # Hmm... might need to revisit this for arm since it has 2 different
 # soft float encodings.
-    CPU_CFLAGS += -msoft-float
-ifeq ($(strip $(TARGET_ARCH)),arm)
+ifneq ($(TARGET_ARCH),nios)
+ifneq ($(TARGET_ARCH),nios2)
+CFLAGS += -msoft-float
+endif
+endif
+ifeq ($(TARGET_ARCH),arm)
 # No longer needed with current toolchains, but leave it here for now.
 # If anyone is actually still using gcc 2.95 (say), they can uncomment it.
 #    LDADD_LIBFLOAT=-lfloat
 endif
 endif
 
-SSP_DISABLE_FLAGS?=$(call check_gcc,-fno-stack-protector,)
-ifeq ($(UCLIBC_BUILD_SSP),y)
-SSP_CFLAGS:=$(call check_gcc,-fno-stack-protector-all,)
-SSP_CFLAGS+=$(call check_gcc,-fstack-protector,)
-SSP_ALL_CFLAGS?=$(call check_gcc,-fstack-protector-all,)
-else
-SSP_CFLAGS:=$(SSP_DISABLE_FLAGS)
+# Make sure "char" behavior is the same everywhere
+CFLAGS += -fsigned-char
+
+# We need this to be checked within libc-symbols.h
+ifneq ($(HAVE_SHARED),y)
+CFLAGS += -DSTATIC
 endif
 
-# Some nice CFLAGS to work with
-CFLAGS:=$(XWARNINGS) $(CPU_CFLAGS) $(SSP_CFLAGS) \
-       -fno-builtin -nostdinc -D_LIBC -I$(TOPDIR)include -I.
-LDFLAGS_NOSTRIP:=$(CPU_LDFLAGS-y) -shared --warn-common --warn-once -z combreloc -z defs
+# only i386 is known to work if compile.S gets -D__ASSEMBLER__
+#CFLAGS += $(call check_gcc,-std=c99,)
+
+LDFLAGS_NOSTRIP:=$(CPU_LDFLAGS-y) -shared --warn-common --warn-once -z combreloc
+
+ifeq ($(UCLIBC_BUILD_RELRO),y)
+LDFLAGS_NOSTRIP+=-z relro
+endif
 
+ifeq ($(UCLIBC_BUILD_NOW),y)
+LDFLAGS_NOSTRIP+=-z now
+endif
+
+LDFLAGS:=$(LDFLAGS_NOSTRIP) -z defs
 ifeq ($(DODEBUG),y)
     #CFLAGS += -g3
     CFLAGS += -O0 -g3
-    LDFLAGS := $(LDFLAGS_NOSTRIP)
     STRIPTOOL:= true -Since_we_are_debugging
 else
     CFLAGS += $(OPTIMIZATION) $(XARCH_CFLAGS)
-    LDFLAGS := $(LDFLAGS_NOSTRIP) -s
+    LDFLAGS += -s
 endif
 
 ifeq ($(DOMULTI),y)
@@ -334,18 +389,25 @@ ifeq ($(UCLIBC_HAS_THREADS),y)
 ifeq ($(UCLIBC_HAS_THREADS_NATIVE),y)
        PTNAME := nptl
 else
+ifeq ($(LINUXTHREADS_OLD),y)
+       PTNAME := linuxthreads.old
+else
        PTNAME := linuxthreads
 endif
-PTDIR := $(TOPDIR)libpthread/$(PTNAME)
+endif
+PTDIR := $(top_builddir)libpthread/$(PTNAME)
 # set up system dependencies include dirs (NOTE: order matters!)
 ifeq ($(UCLIBC_HAS_THREADS_NATIVE),y)
-PTINC:=        -I$(PTDIR)/compat                                       \
+PTINC:=        -I$(PTDIR)                                              \
+       -I$(PTDIR)/compat                                       \
        -I$(PTDIR)/sysdeps/unix/sysv/linux/$(TARGET_ARCH)       \
        -I$(PTDIR)/sysdeps/$(TARGET_ARCH)                       \
        -I$(PTDIR)/sysdeps/unix/sysv/linux                      \
        -I$(PTDIR)/sysdeps/pthread                              \
        -I$(PTDIR)/sysdeps/pthread/bits                         \
        -I$(PTDIR)/sysdeps/generic                              \
+       -I$(top_srcdir)ldso/ldso/$(TARGET_ARCH)                 \
+       -I$(top_srcdir)ldso/include                             \
        -include $(PTDIR)/compat/libc-symbols.h
 #
 # Test for TLS if NPTL support was selected.
@@ -365,18 +427,18 @@ gcc_tls_test_fail:
        @exit 1;
 endif
 else
-PTINC:=        -I$(PTDIR)/sysdeps/$(TARGET_ARCH)                       \
-       -I$(PTDIR)/sysdeps/pthread
+PTINC := \
+       -I$(PTDIR)/sysdeps/unix/sysv/linux/$(TARGET_ARCH) \
+       -I$(PTDIR)/sysdeps/$(TARGET_ARCH) \
+       -I$(PTDIR)/sysdeps/unix/sysv/linux \
+       -I$(PTDIR)/sysdeps/pthread \
+       -I$(PTDIR) \
+       -I$(top_builddir)libpthread
 endif
 CFLAGS+=$(PTINC)
-endif
-
-ifeq ($(UCLIBC_BUILD_RELRO),y)
-LDFLAGS+=-z relro
-endif
-
-ifeq ($(UCLIBC_BUILD_NOW),y)
-LDFLAGS+=-z now
+else
+       PTNAME := 
+       PTINC  := 
 endif
 
 # Sigh, some stupid versions of gcc can't seem to cope with '-iwithprefix include'
@@ -387,6 +449,12 @@ ifneq ($(DOASSERTS),y)
 CFLAGS+=-DNDEBUG
 endif
 
+# moved from ldso/{ldso,libdl}
+# BEWARE!!! At least mips* will die if -O0 is used!!!
+ifeq ($(TARGET_ARCH),mips)
+CFLAGS:=$(CFLAGS:-O0=-O1)
+endif
+
 # Keep the check_as from being needlessly executed
 ifndef ASFLAGS_NOEXEC
 ifeq ($(UCLIBC_BUILD_NOEXECSTACK),y)
@@ -401,6 +469,12 @@ LIBGCC_CFLAGS ?= $(CFLAGS) $(CPU_CFLAGS-y)
 LIBGCC:=$(shell $(CC) $(LIBGCC_CFLAGS) -print-libgcc-file-name)
 LIBGCC_DIR:=$(dir $(LIBGCC))
 
+# moved from libpthread/linuxthreads
+ifeq ($(UCLIBC_CTOR_DTOR),y)
+SHARED_START_FILES:=$(top_builddir)lib/crti.o $(LIBGCC_DIR)crtbeginS.o
+SHARED_END_FILES:=$(LIBGCC_DIR)crtendS.o $(top_builddir)lib/crtn.o
+endif
+
 ########################################
 #
 # uClinux shared lib support
@@ -413,5 +487,3 @@ ifeq ($(CONFIG_BINFMT_SHARED_FLAT),y)
   export LIBID FLTFLAGS
   SHARED_TARGET = lib/libc
 endif
-
-TARGET_ARCH:=$(strip $(subst ",, $(strip $(TARGET_ARCH))))