| # Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc. |
| # This file is part of the GNU C Library. |
| |
| # The GNU C Library 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. |
| |
| # The GNU C Library 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 the GNU C Library; see the file COPYING.LIB. If |
| # not, write to the Free Software Foundation, Inc., 675 Mass Ave, |
| # Cambridge, MA 02139, USA. |
| |
| # |
| # Master Makefile for the GNU C library |
| # |
| ifneq (,) |
| This makefile requires GNU Make. |
| endif |
| |
| |
| # This is the default target; it makes everything except the tests. |
| .PHONY: all |
| all: lib others |
| |
| define autoconf-it |
| @-rm -f $@.new |
| autoconf $(ACFLAGS) $< > $@.new |
| chmod a-w,a+x $@.new |
| mv -f $@.new $@ |
| test ! -d CVS || cvs commit -m'Regenerated: autoconf $(ACFLAGS) $<' $@ |
| endef |
| |
| configure: configure.in; $(autoconf-it) |
| %/configure: %/configure.in; $(autoconf-it) |
| |
| include Makeconfig |
| |
| ifndef avoid-generated |
| -include $(objpfx)sysd-dirs |
| define \n |
| |
| |
| endef |
| sysdep-subdirs := $(subst $(\n), ,$(sysdep-subdirs)) |
| endif |
| |
| # These are the subdirectories containing the library source. |
| subdirs = csu assert ctype db locale intl math setjmp signal stdlib \ |
| stdio-common $(stdio) malloc string time dirent grp pwd \ |
| posix io termios resource misc socket sysvipc gmon gnulib \ |
| $(wildcard crypt) manual $(sysdep-subdirs) elf |
| export subdirs := $(subdirs) # Benign, useless in GNU make before 3.63. |
| |
| # The mach and hurd subdirectories have many generated header files which |
| # much of the rest of the library depends on, so it is best to build them |
| # first (and mach before hurd, at that). The before-compile additions in |
| # sysdeps/{mach,hurd}/Makefile should make it reliably work for these files |
| # not to exist when making in other directories, but it will be slower that |
| # way with more somewhat expensive `make' invocations. |
| subdirs := $(filter mach,$(subdirs)) $(filter hurd,$(subdirs)) \ |
| $(filter-out mach hurd,$(subdirs)) |
| |
| # All initialization source files. |
| +subdir_inits := $(wildcard $(foreach dir,$(subdirs),$(dir)/init-$(dir).c)) |
| # All subdirectories containing initialization source files. |
| +init_subdirs := $(patsubst %/,%,$(dir $(+subdir_inits))) |
| |
| |
| # These are the targets that are made by making them in each subdirectory. |
| +subdir_targets := subdir_lib objects objs others subdir_mostlyclean \ |
| subdir_clean subdir_distclean subdir_realclean \ |
| tests subdir_lint.out \ |
| subdir_echo-headers subdir_echo-distinfo \ |
| subdir_install $(addprefix install-, \ |
| no-libc.a bin lib \ |
| data headers others) |
| |
| headers := errno.h sys/errno.h errnos.h limits.h values.h \ |
| features.h gnu-versions.h |
| aux = sysdep $(libc-init) version |
| |
| echo-headers: subdir_echo-headers |
| |
| # What to install. |
| install-others = $(includedir)/stubs.h |
| |
| ifeq (yes,$(gnu-ld)) |
| libc-init = set-init |
| else |
| libc-init = munch-init |
| $(objpfx)munch-init.c: munch.awk munch-tmpl.c $(+subdir_inits) |
| awk -f $< subdirs='$(+init_subdirs)' $(word 2,$^) > $@-t |
| mv -f $@-t $@ |
| generated := $(generated) munch-init.c |
| endif |
| |
| |
| include Makerules |
| |
| # Install from subdirectories too. |
| install: subdir_install |
| |
| # Build subdirectory lib objects. |
| lib-noranlib: subdir_lib |
| |
| ifeq (yes,$(build-shared)) |
| # Build the shared object from the PIC object library. |
| lib: $(common-objpfx)libc.so |
| endif |
| |
| $(objpfx)sysd-dirs: $(+sysdir_pfx)config.make |
| (echo define sysdep-subdirs; \ |
| for dir in $(sysdirs); do \ |
| if [ -r $(sysdep_dir)/$$dir/Subdirs ]; then \ |
| sed 's/#.*$$//' $(sysdep_dir)/$$dir/Subdirs; \ |
| else true; \ |
| fi; \ |
| done; \ |
| echo endef) > $@-tmp |
| mv -f $@-tmp $@ |
| |
| # Makerules creates a file `stub-$(subdir)' for each subdirectory, which |
| # contains `#define __stub_FUNCTION' for each function which is a stub. |
| # Here we paste all of these together into <stubs.h>. |
| |
| subdir-stubs := $(foreach dir,$(subdirs),$(common-objpfx)stub-$(dir)) |
| |
| # Since stubs.h is never needed when building the library, we simplify the |
| # hairy installation process by producing it in place only as the last part |
| # of the top-level `make install'. It depends on subdir_install, which |
| # iterates over all the subdirs; subdir_install in each subdir depends on |
| # the subdir's stubs file. Having more direct dependencies would result in |
| # extra iterations over the list for subdirs and many recursive makes. |
| $(includedir)/stubs.h: subdir_install |
| @rm -f $(objpfx)stubs.h |
| (echo '/* This file is automatically generated.';\ |
| echo ' It defines a symbol `__stub_FUNCTION'\'' for each function';\ |
| echo ' in the C library which is a stub, meaning it will fail';\ |
| echo ' every time called, usually setting errno to ENOSYS. */';\ |
| sort $(subdir-stubs)) > $(objpfx)stubs.h |
| $(INSTALL_DATA) $(objpfx)stubs.h $@ |
| rm -f $(objpfx)stubs.h |
| |
| # This makes the Info or DVI file of the documentation from the Texinfo source. |
| .PHONY: info dvi |
| info dvi: |
| $(MAKE) -C manual $@ |
| |
| # This makes all the subdirectory targets. |
| |
| # For each target, make it depend on DIR/target for each subdirectory DIR. |
| $(+subdir_targets): %: $(addsuffix /%,$(subdirs)) |
| |
| # Compute a list of all those targets. |
| all-subdirs-targets := $(foreach dir,$(subdirs),\ |
| $(addprefix $(dir)/,$(+subdir_targets))) |
| |
| # The action for each of those is to cd into the directory and make the |
| # target there. |
| $(all-subdirs-targets): |
| $(MAKE) -C $(@D) $(@F) |
| |
| .PHONY: $(+subdir_targets) $(all-subdirs-targets) |
| |
| # Targets to clean things up to various degrees. |
| |
| .PHONY: clean realclean distclean distclean-1 parent-clean parent-mostlyclean |
| |
| # Subroutines of all cleaning targets. |
| parent-mostlyclean: common-mostlyclean # common-mostlyclean is in Makerules. |
| -rm -f $(foreach o,$(object-suffixes),\ |
| $(common-objpfx)$(patsubst %,$(libtype$o),c)) \ |
| $(addprefix $(objpfx),$(install-lib)) |
| parent-clean: parent-mostlyclean common-clean |
| -rm -f $(addprefix $(common-objpfx),$(common-generated)) |
| -rm -f $(addprefix $(objpfx),sysd-Makefile sysd-dirs sysd-rules) |
| |
| clean: parent-clean |
| # This is done this way rather than having `subdir_clean' be a |
| # dependency of this target so that libc.a will be removed before the |
| # subdirectories are dealt with and so they won't try to remove object |
| # files from it when it's going to be removed anyway. |
| @$(MAKE) subdir_clean no_deps=t |
| mostlyclean: parent-mostlyclean |
| @$(MAKE) subdir_mostlyclean no_deps=t |
| |
| # The realclean target is just like distclean for the parent, but we want |
| # the subdirs to know the difference in case they care. |
| realclean distclean: parent-clean |
| # This is done this way rather than having `subdir_distclean' be a |
| # dependency of this target so that libc.a will be removed before the |
| # subdirectories are dealt with and so they won't try to remove object |
| # files from it when it's going to be removed anyway. |
| @$(MAKE) distclean-1 no_deps=t distclean-1=$@ avoid-generated=yes |
| |
| # Subroutine of distclean and realclean. |
| distclean-1: subdir_$(distclean-1) |
| -rm -f $(config-generated) |
| -rm -f $(addprefix $(objpfx),config.status config.cache config.log) |
| -rm -f $(addprefix $(objpfx),config.make config-name.h config.h) |
| ifdef objdir |
| -rm -f $(objpfx)Makefile |
| endif |
| -rm -f $(sysdep-$(distclean-1)) |
| |
| .PHONY: echo_subdirs |
| echo_subdirs:;@echo '$(subdirs)' |
| |
| .PHONY: echo-distinfo parent_echo-distinfo |
| echo-distinfo: parent_echo-distinfo subdir_echo-distinfo |
| parent_echo-distinfo: |
| @echo $(addprefix +header+,$(headers)) \ |
| $(addprefix +nodist+,$(generated)) |
| |
| # Make the distribution tarfile. |
| |
| distribute := README INSTALL NOTES COPYING.LIB COPYING NEWS \ |
| ChangeLog ChangeLog.[0-9] \ |
| Makefile Makeconfig Makerules Rules Make-dist MakeTAGS \ |
| extra-lib.mk o-iterator.mk \ |
| ansidecl.h mkinstalldirs move-if-change install-sh \ |
| configure configure.in aclocal.m4 config.sub config.guess\ |
| config.make.in config-name.in Makefile.in \ |
| munch-tmpl.c munch.awk sysdep.h set-hooks.h libc-symbols.h |
| |
| distribute := $(strip $(distribute)) |
| generated := $(generated) stubs.h |
| |
| README: README.template version.c ; # Make-dist should update README. |
| |
| define format-me |
| @rm -f $@ |
| makeinfo --no-validate --no-warn --no-headers $< -o $@ |
| -chmod a-w $@ |
| endef |
| INSTALL: manual/maint.texi; $(format-me) |
| NOTES: manual/creature.texi; $(format-me) |