oskit/oskit-20020317/GNUmakerules

224 lines
7.8 KiB
Plaintext
Executable File

#
# Copyright (c) 1996, 1998, 1999, 2000 University of Utah and the Flux Group.
# All rights reserved.
#
# This file is part of the Flux OSKit. The OSKit is free software, also known
# as "open source;" you can redistribute it and/or modify it under the terms
# of the GNU General Public License (GPL), version 2, as published by the Free
# Software Foundation (FSF). To explore alternate licensing terms, contact
# the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271.
#
# The OSKit 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 GPL for more details. You should have
# received a copy of the GPL along with the OSKit; see the file COPYING. If
# not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA.
#
# This makefile defines standard symbols and rules
# used by the makefiles in the various OS toolkit subdirectories.
# It is heavily dependent on GNU make running on something like Unix.
# Building things with different tools requires a different set of makefiles.
#
# OSKIT_SRCDIR must be set to the top-level directory of the OS toolkit.
# (The current directory is assumed to be the object directory.)
#
# SRCDIRS must be set to a list of dirs that contain code.
# These directories are added to the VPATH,
# to the -I line, and are searched for .c (and possibly .S) files.
# All .c files found will be compiled.
#
# MOSTLY_SRCDIRS can be set and is similar to SRCDIRS but not all .c files
# in these directories are compiled---only ones explicitly
# added to OBJFILES
#
# OBJDIR must be set to the top-level object directory
# (i.e. a series of `..'s indicating how deep we are at the moment).
#
# DEFINES can be set to a string of -D options (e.g. -DDEBUG).
# INCDIRS can be a list of system include directories
# to be searched by #include <>'s.
# LIBDIRS can be a list of library directories.
#
# OSKIT_CPPFLAGS can be set to other flags for the C preprocessor
# and anything that uses it.
# OSKIT_CFLAGS can be set to other flags for the C compiler.
# OSKIT_LDFLAGS can be set to other flags for the linker.
#
# The standard flags variables (CFLAGS, CPPFLAGS, etc.)
# are used by the rules but never defined,
# so you can supply them on the make command line
# (e.g. `make CFLAGS=-save-temps').
#
ifndef _oskit_makerules_
_oskit_makerules_ = yes
# This is just here in case someone happens to include this before the
# more specific GNUmakerules. Otherwise the first (default) rule ends
# up being the install rule. =(
default: all
# Include architecture-specific rules.
include $(OSKIT_SRCDIR)/GNUmakerules-$(HOST_ARCH)
# Where to get includes and libraries from.
INCDIRS += $(OBJDIR) $(OSKIT_SRCDIR)
LIBDIRS += $(OBJDIR)/lib
# Compilation flags.
# We prefix these with OSKIT_ rather than using the "normal" variables
# so that you can override the normal variables on the make command line
# in order to add options (e.g. 'make CFLAGS=-save-temps').
# The -I- flag divides the -I line:
# -I flags before -I- are searched for #include "file" only, not <file>
# -I flags after -I- are searched for all include files.
OSKIT_CPPFLAGS += -MD $(DEFINES) -I. $(addprefix -I,$(SRCDIRS)) \
$(addprefix -I,$(MOSTLY_SRCDIRS)) \
-I- $(addprefix -I,$(INCDIRS)) -nostdinc
OSKIT_CFLAGS += $(OSKIT_CPPFLAGS) -Wall $(OSKIT_FFLAGS)
OSKIT_LDFLAGS += $(addprefix -L,$(LIBDIRS))
# Add a `-g' if the debug option is set.
ifneq "$(filter debug, $(OSKIT_OPTIONS))" ""
OSKIT_CFLAGS += -O -g
else
OSKIT_CFLAGS += -O2 -g
endif
## If -s is passed to make, make things real quiet
ifeq (s,$(findstring s,$(MAKEFLAGS)))
OSKIT_QUIET_MAKE_INFORM=@echo
ARFLAGS=r ## drop the v from the default
else
OSKIT_QUIET_MAKE_INFORM=@true
endif
# Where to find source files.
# Using specific patterns instead of the catch-all VPATH variable
# avoids hitting miscellaneous wrong targets in other directories
# when configuring in the source directory.
vpath %.c $(SRCDIRS) $(MOSTLY_SRCDIRS)
vpath %.h $(SRCDIRS) $(MOSTLY_SRCDIRS)
vpath %.S $(SRCDIRS) $(MOSTLY_SRCDIRS)
vpath %.l $(SRCDIRS) $(MOSTLY_SRCDIRS)
vpath %.y $(SRCDIRS) $(MOSTLY_SRCDIRS)
vpath %.in $(SRCDIRS) $(MOSTLY_SRCDIRS)
vpath %.sym $(SRCDIRS) $(MOSTLY_SRCDIRS)
# First find a list of every file that might possibly be a source file,
# so we only have to scan the source directories once.
FILES := $(foreach DIR,$(SRCDIRS),$(wildcard $(DIR)/*))
# C source files
CFILES := $(filter %.c,$(FILES))
# This is to exclude files
CFILES := $(filter-out $(OSKIT_EXCLUDE),$(CFILES))
# How to compile them.
%.o: %.c
$(OSKIT_QUIET_MAKE_INFORM) "Compiling $<"
$(CC) -c -o $@ $(OSKIT_CFLAGS) $(CFLAGS) $<
# How to build profiled object files.
%.po: %.c
$(OSKIT_QUIET_MAKE_INFORM) "Compiling $<"
$(CC) -c -o $@ $(OSKIT_CFLAGS) -DGPROF -pg $(CFLAGS) $<
# How to generate symbol header files,
# containing #define's for numeric constants
# related to C structures on the target machine.
# These are currently used in two ways:
#
# * When cross-compiling, MIG is compiled to be executed on the host,
# but it needs to know the sizes of certain types on the target machine.
# So a symbol header file is created with the cross-compiler,
# and then used in compiling MIG for the host machine.
#
# * Assemblers don't know about C structures,
# so machine-specific assembly language code
# can use symbol header files instead.
%.symc: %.sym
$(OSKIT_QUIET_MAKE_INFORM) "Generating $@ from $<"
$(AWK) -f $(OSKIT_SRCDIR)/gensym.awk $< >$*.symc
%.symc.o: %.symc
$(OSKIT_QUIET_MAKE_INFORM) "Assembling $<"
$(CC) -S $(OSKIT_CFLAGS) $(CFLAGS) -x c -o $@ $<
%.h: %.symc.o
$(OSKIT_QUIET_MAKE_INFORM) "Generating $@ from $<"
sed <$< -e 's/^[^*].*$$//' | \
sed -e 's/^[*]/#define/' -e 's/mAgIc[^-0-9]*//' >$@
CLEAN_FILES += *.symc *.symc.o
# How to install files into their final resting places.
$(INSTALL_BINDIR)/%: %
$(OSKIT_QUIET_MAKE_INFORM) "Installing $<"
-mkdir -p $(INSTALL_BINDIR)
$(INSTALL) $< $@
$(INSTALL_LIBDIR)/%: %
$(OSKIT_QUIET_MAKE_INFORM) "Installing $<"
-mkdir -p $(INSTALL_LIBDIR)
$(INSTALL) $< $@
$(INSTALL_LIBDIR)/oskit/%: %
$(OSKIT_QUIET_MAKE_INFORM) "Installing $<"
-mkdir -p $(INSTALL_LIBDIR)/oskit
$(INSTALL) $< $@
# Always fully build everything before trying to install anything
install: all
# Get rid of a bunch of nasty built-in implicit rules,
# to avoid bogus circular dependencies and make things go faster.
# Use the `-r' command line option to make to get even better performance.
.SUFFIXES:
# The generated object files have the same prefix names as the source files,
# except they live in the current (object) directory.
OBJFILES += $(patsubst %.c,%.o,$(notdir $(CFILES)))
# This is to eliminate duplicate files,
# which might appear when files are being overridden.
OBJFILES := $(sort $(OBJFILES))
# If the profiling option is on, then build profiled versions of all
# of the object files.
ifneq "$(filter profiling, $(OSKIT_OPTIONS))" ""
POBJFILES = $(patsubst %.o, %.po, $(OBJFILES))
endif
# How to clean out the automatically built stuff in an object directory.
clean:
rm -rf *.[doa] *.po *.bak tags TAGS depend $(CLEAN_FILES)
distclean: clean
# How to update the dependency file in an object directory.
# This funny bit of magic (hopefully the most obscure thing here)
# basically replaces the `md' program in ODE.
# The `sed' line removes the dependencies being replaced,
# the `for' line tacks the new dependencies to the end of the file,
# and then the individual dependency files are deleted.
comma := ,
depend: $(wildcard *.d)
@if test -f depend; then sed $(patsubst %.d,-e '/^%\.o/$(comma)/^#/d',$^) <depend >depend.new; fi; true
@(for file in $^ /dev/null; do (cat $$file; echo '#'); done) >>depend.new
@mv -f depend.new depend
@if test "" != "$^"; then rm -f $^; fi; true
# Include the dependency graph (if it exists).
-include depend
endif